PDA

Просмотр полной версии : [Вопрос] /kick



Straik32423
25.06.2015, 01:03
Всем привет! На сколько я знаю, я не один столкнулся с такой проблемой. Дело в том, что я добавил команду /kick (ZCMD), в ней всем выводится строка о кике игрока, кроме самого игрока. У того, кого кикнули, нет этой надписи, просто: "Server closed the conection". Так вот, я где-то слышал, что для того, чтобы это исправить нужен таймер, но на сколько я знаю, таймеры нагружают сервер. Итак вопрос: возможно ли исправить это БЕЗ использования таймера?


CMD:kick(playerid, params[])
{
if(pInfo[playerid][pLogged] == false) return SCM(playerid, COLOR_RED, "[Server]: Вы не авторизованы!");
if(pInfo[playerid][pAdmin] < 1) return SCM(playerid, COLOR_RED, "Вам недоступна дання команда!");
if(sscanf(params,"us",params[0],params[1])) return SCM(playerid, COLOR_WHITE, "Используйте: {E81B05}/kick [ID] [Причина]");
new string[145];
format(string, sizeof(string), "Администратор %s кикнул игрока %s. Причина: %s", pNick(playerid),pNick(params[0]),params[1]);
SendClientMessageToAll(COLOR_ADMIN, string);
Kick(params[0]);
return true;
}

$continue$
25.06.2015, 01:30
Поиском по форуму нужно уметь пользоваться.


forward KickPublic(playerid);
public KickPublic(playerid) return Kick(playerid);

#define Kick(%0) SetTimerEx("KickPublic", 100, false, "i", %0)

Автор: DeimoS
Так же могу предложить свой вариант, с перехватом нативной функции Kick:


forward OnPlayerKick(const playerid);
public OnPlayerKick(const playerid)
return Kick(playerid);

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

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

Внимание мой вариант, нужно вставить в начало мода (Что бы функция kick не где не вызывалась, до перехвата)
А, да - на счет таймеров, сам таймер не нагружает скрипт/мод, нагружает что в теле таймера.

Straik32423
25.06.2015, 01:35
Поиском по форуму нужно уметь пользоваться.


forward KickPublic(playerid);
public KickPublic(playerid) return Kick(playerid);

#define Kick(%0) SetTimerEx("KickPublic", 100, false, "i", %0)

Автор: DeimoS
Так же могу предложить свой вариант, с перехватом нативной функции Kick:


forward OnPlayerKick(const playerid);
public OnPlayerKick(const playerid)
return Kick(playerid);

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

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

Внимание мой вариант, нужно вставить в начало мода (Что бы функция kick не где не вызывалась, до перехвата)
А, да - на счет таймеров, сам таймер не нагружает скрипт/мод, нагружает что в теле таймера.

По-поводу поиска по форуму, я же сказал, что мне известна функция с таймером, поэтому я просил без. Но, спасибо за объяснение насчет таймеров.

$continue$
25.06.2015, 01:51
По-поводу поиска по форуму, я же сказал, что мне известна функция с таймером, поэтому я просил без. Но, спасибо за объяснение насчет таймеров.

А как Вы хотите без таймера?
В чем проблема то не пойму?
В официальной документаций SA-MP, тоже используется таймер! (http://wiki.sa-mp.com/wiki/Kick)
А так же написано:
As of SA-MP 0.3x, any action taken directly before Kick() (such as sending a message with SendClientMessage) will not reach the player. A timer must be used to delay the kick.

_____________________________________________________
Хотя нет, есть велосипед с PVarоми, но все равно сверять время придется через таймер.

Sp1ke
25.06.2015, 02:19
Без таймера вывод диалога/текста невозможен во время кика.

- - - Добавлено - - -


таймеры нагружают сервер.
}[/PHP]
Таймер на кик нисколько не нагрузит сервер, так что можно использовать смело.

Straik32423
25.06.2015, 02:36
Таймер на кик нисколько не нагрузит сервер, так что можно использовать смело.
С этого следовало начинать :)

- - - Добавлено - - -


А как Вы хотите без таймера?
В чем проблема то не пойму?
В официальной документаций SA-MP, тоже используется таймер! (http://wiki.sa-mp.com/wiki/Kick)
А так же написано:
As of SA-MP 0.3x, any action taken directly before Kick() (such as sending a message with SendClientMessage) will not reach the player. A timer must be used to delay the kick.

_____________________________________________________
Хотя нет, есть велосипед с PVarоми, но все равно сверять время придется через таймер.

Во-первых, пожалуйста, не называй меня на "Вы", я чувствую себя старым. Во-вторых смотри, что я написал:

Итак вопрос: возможно ли исправить это БЕЗ использования таймера?
Я спросил, возможно ли это, мне было достаточно ответа: "Нет". Но, все равно спасибо.

Sp1ke
25.06.2015, 02:39
С этого следовало начинать :)

- - - Добавлено - - -



Во-первых, пожалуйста, не называй меня на "Вы", я чувствую себя старым. Во-вторых смотри, что я написал:

Я спросил, возможно ли это, мне было достаточно ответа: "Нет". Но, все равно спасибо.

Тогда четкий ответ - нет! На портале есть инклуд вроде бы, который фиксит кик и бан, поищи.

$continue$
25.06.2015, 02:44
Тогда четкий ответ - нет! На портале есть инклуд вроде бы, который фиксит кик и бан, поищи.

Да там такой же алгоритм.
Внимание: Использовать обязательно до вызова нативных функций!
Для кика:


forward OnPlayerKick(const playerid);
public OnPlayerKick(const playerid)
return Kick(playerid);

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

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

Для бана:


forward OnPlayerBan(const playerid);
public OnPlayerBan(const playerid)
return Ban(playerid);

stock fix_BanPlayer(const playerid)
return SetTimerEx("OnPlayerBan", 1000, false, "d", playerid);

#if defined _ALS_Ban
#undef Ban
#else
#define _ALS_Ban
#endif
#define Ban fix_BanPlayer