PDA

Просмотр полной версии : [Include] Исправление функций Kick(), Ban()и BanEx()



Desulaid
14.11.2015, 23:05
У меня как обычно едет крыша и я вновь решил переписать эту библиотеку лишь по одной весомой, как мне кажется, причине. Зачем создавать новые функции с аналогичными возможностями, если достаточно написать 3 новые функции за место 3 обновленных и 3 аналогичных прежним. Правда, это противоречит моим прежним (http://pro-pawn.ru/showthread.php?12832-fix_k2bex-inc&p=65467&viewfull=1#post65467) убеждениям. Но человек меняется!


Исправление функций Kick(), Ban()и BanEx()

Описание
Данная библиотека включает в себя три новые функции, работающие аналогично их прототипам, но с одним небольшим отличием - им можно устанавливать время, через которое будет происходит действие. Все просто.

Скачать
Библиотека распространяется под лицензией ZLib.

Скачать с сайта dropbox.com (https://www.dropbox.com/s/8yqy2d5zrffrh5u/u_kickfix.rar?dl=0).

Использование
Для начала подключите библиотеку:

#include "u_fixkick"

В библиотеке есть константа, значение которой является значением по-умолчанию, если функциям не установить дополнительный аргумент (он опциональный). Для установки своего значение вы должны перед подключением объявить свою константу DEFAULT_TIME_INTERVAL.
Объявление константы MAX_REASON_TEXT отвечает за длину строки, используемой в PlayerBanEx().


#define DEFAULT_TIME_INTERVAL 200

#include "u_fixkick


Функции

Функции


PlayerKick(playerid, time);
PlayerBan(playerid, time);
PlayerBanEx(playerid, reason[], time);

ничем не отличаются в использовании от их аналогов. Аргумент time отвечает за время, через которое будет вызвана функция.

Совет
Не ставьте врем меньше 200 и больше 1000.


Копирование статьи разрешено только с личного разрешения автора.

L0ndl3m
15.11.2015, 15:11
Таких "решений" задач уже куча и на портале их тоже немало, я думаю подключать для этого инклуд совершенно не нужно, ИМХО.

Daniel_Cortez
15.11.2015, 16:29
Мое решение - это затормозить функцию на доли секунды (0,2 секунды), чтобы функции, стоящие перед исправленной функцией успели проскочить.
Другие решения работают точно так же. Я даже хотел выложить год назад свой инклуд для таких целей с кучей всяких настроек, но к тому времени было уже дофига похожих работ, особенно на sa-mp.com.



В интернете есть множество решений, которые есть не более чем большой костыль.
А раз твоё решение работает точно так же, как и остальные, то это просто ещё один "большой костыль" среди кучи других.

Btw, инклуд тестировался при одновременном бане нескольких игроков (с разными причинами)? Я про функцию BanEx.

Desulaid
15.11.2015, 19:17
Я видел не много решений на это "обновление", но все, которые я видел были примерно такими:


// "Основа new.pwn (MySQL R5)"
stock KickFix(playerid, color, message[], bool:toall=false)
{
if(toall == true) SendToAll(color, message);
else SendMe(playerid, color, message);
SetTimerEx("KickPublic", 200, 0, "d", playerid);
return 1;
}

forward KickPublic(playerid);
public KickPublic(playerid)
{
Kick(playerid);
}


По мне, дак это муторно и сложно (скорее лень все аргументы заполнять =р) - большой костыль. Потом я увидел другое решение:


@_kick(playerid);
@_kick(playerid) return Kick(playerid);

#define Kick(%0) SetTimerEx("@_kick",500,false,"i",%0)

Опять же не совсем практично. Так как, если нам понадобится перехватить функцию Kick, у нас будут ошибки. Мне мне вам говорить почему они будут, все есть в уроке (http://pro-pawn.ru/showthread.php?10447-%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%B2%D0%B0%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D1%8C-1-%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B).

На счет теста, я не думаю, что функция требует выделения двухмерного массива:

наврят ли функция будет вызвана для разных игроков точь-в-точь в плоть до доли секунд, и эта разница, я думаю сыграет в лучшую сторону.
саму по себе функцию я редко видел в модах. Обычно, сервера ограничиваются функциями Kick(), Ban() + сохранение результата куда-либо для дальнейшей загрузки.


А тест провести надо бы :)

$continue$
15.11.2015, 19:34
forward OnPlayerKick(const id_player);
public OnPlayerKick(const id_player)
return Kick(id_player);

stock fix_KickPlayer(const id_player)
return SetTimerEx("OnPlayerKick", 1000, false, "i", id_player);

#if defined _ALS_Kick
#undef Kick
#else
#define _ALS_Kick
#endif
#define Kick fix_KickPlayer

Desulaid
15.11.2015, 21:18
forward OnPlayerKick(const id_player);
public OnPlayerKick(const id_player)
return Kick(id_player);

stock fix_KickPlayer(const id_player)
return SetTimerEx("OnPlayerKick", 1000, false, "i", id_player);

#if defined _ALS_Kick
#undef Kick
#else
#define _ALS_Kick
#endif
#define Kick fix_KickPlayer


Константа? Ты серьезно?

Daniel_Cortez
15.11.2015, 21:19
На счет теста, я не думаю, что функция требует выделения двухмерного массива:

наврят ли функция будет вызвана для разных игроков точь-в-точь в плоть до доли секунд, и эта разница, я думаю сыграет в лучшую сторону.
саму по себе функцию я редко видел в модах. Обычно, сервера ограничиваются функциями Kick(), Ban() + сохранение результата куда-либо для дальнейшей загрузки.

1. Баг есть баг и его редкость - не оправдание. Равно, как и отсутствие более адекватных реализаций.
2. Совсем не обязательно хранить данные в двухмерном массиве.

Desulaid
15.11.2015, 21:22
1. Баг есть баг и его редкость - не оправдание. Равно, как и отсутствие более адекватных реализаций.
2. Совсем не обязательно хранить данные в двухмерном массиве.

То есть при кике сразу обнулить массив?

Daniel_Cortez
16.11.2015, 16:52
То есть при кике сразу обнулить массив?
И тогда, если следущего игрока забанить с разницей < 0.2 секунды, он будет забанен с пустой строкой вместо причины. По сути та же самая перезапись.
Ок, наверное я не совсем удачно выразился в прошлый раз. Не нужно использовать вообще никакие массивы (http://wiki.sa-mp.com/wiki/SetPVarString).

[ForD]
16.11.2015, 17:22
Я в общем пропустил наверное что-то но в последних версиях эти костыли не нужны?

Роуди.
16.11.2015, 18:03
;65537']Я в общем пропустил наверное что-то но в последних версиях эти костыли не нужны?

В 0.3.7 стандартно перед киком сообщения не выводятся

Desulaid
16.11.2015, 18:39
И тогда, если следущего игрока забанить с разницей < 0.2 секунды, он будет забанен с пустой строкой вместо причины. По сути та же самая перезапись.
Ок, наверное я не совсем удачно выразился в прошлый раз. Не нужно использовать вообще никакие массивы (http://wiki.sa-mp.com/wiki/SetPVarString).

Я тестил с одновременным баном 3-х игроков, у каждого была своя причина и ничего не перепуталось. Мы логи сравнили.

Daniel_Cortez
16.11.2015, 19:18
Я тестил с одновременным баном 3-х игроков, у каждого была своя причина и ничего не перепуталось. Мы логи сравнили.
После того, как ты заменил одномерный массив на двухмерный - да, но с одномерным не сработало бы. К тому же, в таких случаях обычно используют динамически выделяемую память, а не резервируют на всё время область размером в (сколько-сколько?) 140 Кб, которую будут использовать только ради редких банов для нескольких игроков.

Desulaid
16.11.2015, 21:20
После того, как ты заменил одномерный массив на двухмерный - да, но с одномерным не сработало бы. К тому же, в таких случаях обычно используют динамически выделяемую память, а не резервируют на всё время область размером в (сколько-сколько?) 140 Кб, которую будут использовать только ради редких банов для нескольких игроков.

Я не знаю, каким образом в павн можно выделять динамическую память ((

Витёк
17.11.2015, 19:34
:bad:фигня

Daniel_Cortez
17.11.2015, 21:28
:bad:фигня
ProTip: Аргументируйте, если не хотите казаться пустословом.

Desulaid
18.11.2015, 02:08
:bad:фигня

Ну да, ведь это не сравнится с твоей "системой вируса" и трансляцией с YouTube на TextDraws ((9

https://pp.vk.me/c628522/v628522894/214e3/yWr9cxK22fM.jpg

Desulaid
12.03.2016, 18:30
Обновил тему, решил код оставить в шапке темы, так как не нашел топового файлового хостинга :(

newbie01
12.03.2016, 20:44
Обновил тему, решил код оставить в шапке темы, так как не нашел топового файлового хостинга :(

mega.nz или ge.tt

$continue$
12.03.2016, 22:41
Ты мал (https://gist.github.com/) и глуп. (http://pastebin.com/) (Там продолжение, конечно есть)