SA-MP Forums Archive
Еще одно гениальное решение проблемы с выводом сообщения перед киком - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Еще одно гениальное решение проблемы с выводом сообщения перед киком (/showthread.php?tid=421626)



Еще одно "гениальное" решение проблемы с выводом сообщения перед киком - 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, то он не только обрубает игрока от сервера, но и посылает к черту всё тело подпрограммы, или все пакеты с данными которые были объявлены еще до использования функции кика. Не знаю на каком языке еще это объяснить.

Убедиться можно в этом, заюзав любую функцию выше функции кика. Она попросту не выполнится. Таймеры не исключение. Хоть и ситуация не много другая.

.
ни фига.

Не выполняется перед киком только текст в чат, текст в лог посылается нормально.