Еще одно гениальное решение проблемы с выводом сообщения перед киком
#1

Не знаю каким хреном, но если использовать 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.
Reply
#2

Если чел будет в AFK его не кикнет!
Reply
#3

Кикнет. Но после того как он выйдет из него, разумеется.
В любом случае, все это можно доработать своим ходом, трудности не вижу, чао.
Reply
#4

хочешь сказать, при коннекте такая фигня сработает? А при выборе класса/скина? А при флуд-атаке?
Reply
#5

если стоит bool зачем использовать 0/1 ? а так идея хорошая, надо будет как-нибудь попробовать

Quote:
Originally Posted by Fireline
Посмотреть сообщение
хочешь сказать, при коннекте такая фигня сработает? А при выборе класса/скина? А при флуд-атаке?
можно в общий таймер поставить (по 1000мс) если такой имеется
Reply
#6

Quote:
Originally Posted by Fireline
Посмотреть сообщение
хочешь сказать, при коннекте такая фигня сработает? А при выборе класса/скина? А при флуд-атаке?
Сработает, в любом случае.


Quote:
Originally Posted by Mance
Посмотреть сообщение
если стоит bool зачем использовать 0/1 ? а так идея хорошая, надо будет как-нибудь попробовать
Привычка.

Вместо насилия OnPlayerUpdate, можно заюзать глобальный таймер, уже готовый или новый.
Главное, что принцип алгоритма один и тот же. Задаем в переменную сервера значение, и проверяем его.
Reply
#7

Quote:
Originally Posted by NameNone
Посмотреть сообщение
Сработает, в любом случае.



Привычка.

Вместо насилия OnPlayerUpdate, можно заюзать глобальный таймер, уже готовый или новый.
Главное, что принцип алгоритма один и тот же. Задаем в переменную сервера значение, и проверяем его.
OnPlayerUpdate вызывается при получении пакета от игрока, поэтому использовать надо его, иначе смысл от этого решения? При использовании глобального таймера кик может произойти и через 5 мс, и через 800.
Reply
#8

Что тут гениального? У вас завышена самооценка... Набросал более грамотное решение:
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).
Reply
#9

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).
Никчемная ересь.
Reply
#10

Quote:
Originally Posted by NameNone
Посмотреть сообщение
Не знаю каким хреном, но если использовать Kick, то он не только обрубает игрока от сервера, но и посылает к черту всё тело подпрограммы, или все пакеты с данными которые были объявлены еще до использования функции кика. Не знаю на каком языке еще это объяснить.

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

.
ни фига.

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


Forum Jump:


Users browsing this thread: 2 Guest(s)