Еще одно "гениальное" решение проблемы с выводом сообщения перед киком -
NameNone - 10.03.2013
Не знаю каким хреном, но если использовать Kick, то он не только обрубает игрока от сервера, но и посылает к черту всё тело подпрограммы, или все пакеты с данными которые были объявлены еще до использования функции кика. Не знаю на каком языке еще это объяснить.
Убедиться можно в этом, заюзав любую функцию выше функции кика. Она попросту не выполнится. Таймеры не исключение. Хоть и ситуация не много другая.
Способ черт возьми, просто сама гениальность, нам необходимо объявить переменную, что то вроде:
PHP код:
new bool:KickStat[MAX_PLAYERS]
Затем залить в
public OnPlayerUpdate что то вроде этого:
PHP код:
if(KickStat[playerid] != 0)
{
KickStat[playerid] = 0;
Kick(playerid);
return 1;
}
В место, где необходимо кикнуть игрока, добавить:
PHP код:
KickStat[playerid] = 1;

[15:01:30] Вы были отключены от сервера.
[15:01:30] Server closed the connection.
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
cm666 - 10.03.2013
Если чел будет в AFK его не кикнет!
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
NameNone - 10.03.2013
Кикнет. Но после того как он выйдет из него, разумеется.
В любом случае, все это можно доработать своим ходом, трудности не вижу, чао.
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
Fireline - 10.03.2013
хочешь сказать, при коннекте такая фигня сработает? А при выборе класса/скина? А при флуд-атаке?
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
Mance - 10.03.2013
если стоит bool зачем использовать 0/1

? а так идея хорошая, надо будет как-нибудь попробовать
Quote:
Originally Posted by Fireline
хочешь сказать, при коннекте такая фигня сработает? А при выборе класса/скина? А при флуд-атаке? 
|
можно в общий таймер поставить (по 1000мс) если такой имеется
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
NameNone - 10.03.2013
Quote:
Originally Posted by Fireline
хочешь сказать, при коннекте такая фигня сработает? А при выборе класса/скина? А при флуд-атаке? 
|
Сработает, в любом случае.
Quote:
Originally Posted by Mance
если стоит bool зачем использовать 0/1  ? а так идея хорошая, надо будет как-нибудь попробовать
|
Привычка.
Вместо насилия OnPlayerUpdate, можно заюзать глобальный таймер, уже готовый или новый.
Главное, что принцип алгоритма один и тот же. Задаем в переменную сервера значение, и проверяем его.
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
Alexander_Petrov - 10.03.2013
Quote:
Originally Posted by NameNone
Сработает, в любом случае.
Привычка.
Вместо насилия OnPlayerUpdate, можно заюзать глобальный таймер, уже готовый или новый.
Главное, что принцип алгоритма один и тот же. Задаем в переменную сервера значение, и проверяем его.
|
OnPlayerUpdate вызывается при получении пакета от игрока, поэтому использовать надо его, иначе смысл от этого решения? При использовании глобального таймера кик может произойти и через 5 мс, и через 800.
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
AirKite - 10.03.2013
Что тут гениального? У вас завышена самооценка... Набросал более грамотное решение:
pawn Код:
new PlayerKickState[MAX_PLAYERS];
stock KickTimeout(playerid, timeout = 5000) {
if(PlayerKickState[playerid] == 0) {
PlayerKickState[playerid] = SetTimerEx("KickTimeoutTimer", timeout, false, "i", playerid);
}
}
KickTimeoutCheck(playerid) {
if(PlayerKickState[playerid]) {
KillTimer(PlayerKickState[playerid]);
PlayerKickState[playerid] = 0;
return 1;
}
return 0;
}
forward KickTimeoutTimer(playerid);
public KickTimeoutTimer(playerid) {
PlayerKickState[playerid] = 0;
Kick(playerid);
}
// Callback's
public OnplayerDisconnect(playerid, reason) {
KickTimeoutCheck(playerid);
return 1;
}
public OnPlayerUpdate(playerid) {
if(KickTimeoutCheck(playerid)) {
Kick(playerid);
}
return 1;
}
Юзаете KickTimeout(playerid); или KickTimeout(playerid, время_таймаута); т.е. для тех кто в танке:
KickTimeout(playerid, 20000); кикнет игрока моментально, после доставки всех нужных сообщений и т.д. но с таймаутом в 20 секунд (например если игрок в ESC).
Re: Еще одно гениальное решение проблемы с выводом сообщения перед киком -
NameNone - 10.03.2013
Quote:
Originally Posted by Alexander_Petrov
OnPlayerUpdate вызывается при получении пакета от игрока, поэтому использовать надо его, иначе смысл от этого решения? При использовании глобального таймера кик может произойти и через 5 мс, и через 800.
|
При использовании OnPlayerUpdate, кик происходит не сразу, а с отрывом в минимум 50-200 мс, максимум не более секунды. Попробуй сам.
Минус его использования в том, что он прекращает срабатывать когда игрок сворачивает игру.
Поэтому рациональнее подружиться с глобальным таймером и опробывать его, в действии.
Quote:
Originally Posted by AirKite
Что тут гениального? У вас завышена самооценка... Набросал более грамотное решение:
pawn Код:
new PlayerKickState[MAX_PLAYERS];
stock KickTimeout(playerid, timeout = 5000) { if(PlayerKickState[playerid] == 0) { PlayerKickState[playerid] = SetTimerEx("KickTimeoutTimer", timeout, false, "i", playerid); } }
KickTimeoutCheck(playerid) { if(PlayerKickState[playerid]) { KillTimer(PlayerKickState[playerid]); PlayerKickState[playerid] = 0; return 1; } return 0; }
forward KickTimeoutTimer(playerid); public KickTimeoutTimer(playerid) { PlayerKickState[playerid] = 0; Kick(playerid); }
// Callback's public OnplayerDisconnect(playerid, reason) { KickTimeoutCheck(playerid); return 1; }
public OnPlayerUpdate(playerid) { if(KickTimeoutCheck(playerid)) { Kick(playerid); } return 1; }
Юзаете KickTimeout(playerid); или KickTimeout(playerid, время_таймаута); т.е. для тех кто в танке:
KickTimeout(playerid, 20000); кикнет игрока моментально, после доставки всех нужных сообщений и т.д. но с таймаутом в 20 секунд (например если игрок в ESC).
|
Никчемная ересь.
Re: Еще одно "гениальное" решение проблемы с выводом сообщения перед киком -
DANGER1979 - 10.03.2013
Quote:
Originally Posted by NameNone
Не знаю каким хреном, но если использовать Kick, то он не только обрубает игрока от сервера, но и посылает к черту всё тело подпрограммы, или все пакеты с данными которые были объявлены еще до использования функции кика. Не знаю на каком языке еще это объяснить.
Убедиться можно в этом, заюзав любую функцию выше функции кика. Она попросту не выполнится. Таймеры не исключение. Хоть и ситуация не много другая.
.
|
ни фига.
Не выполняется перед киком только текст в чат, текст в лог посылается нормально.