SA-MP Forums

SA-MP Forums (https://forum.sa-mp.com/index.php)
-   Русский/Russian (https://forum.sa-mp.com/forumdisplay.php?f=32)
-   -   Атака сервера (https://forum.sa-mp.com/showthread.php?t=400823)

DANGER1979 02/12/2013 01:24 PM

Re: Атака сервера
 
Кол-во входов
public OnPlayerConnect(playerid)
{
if(IsPlayerNPC(playerid)) { return 1; }
numplayers ++;

не совпадает с кол-вом выходов
public OnPlayerDisconnect(playerid, reason)
{
if(IsPlayerNPC(playerid)) { return 1; }
numplayers --;

Как такое может быть? При чем кол-во numplayers ушло на -1206513.

White_116 02/12/2013 01:42 PM

Re: Атака сервера
 
Да. Читер отключается, но остаётся на сетевом уровне.
http://forum.sa-mp.com/showthread.php?t=470156
Поковыряй.

stabker 02/12/2013 04:20 PM

Re: Атака сервера
 
Если не желаете юзать ничего лишнего, то вот мой вариант фикса фейкового-дисконнекта.

pawn Code:
new AT_Timerid[MAX_PLAYERS];

public OnPlayerConnect(playerid)
{
    if(AT_Timerid[playerid]) //На практике это вряд ли произойдет, но для самоуспокоения добавил
    {
        KillTimer(AT_Timerid[playerid]);
        AT_Timerid[playerid] = 0;
    }
    //...
}

public OnPlayerDisconnect(playerid, reason)
{
    //...
    AT_Timerid[playerid] = SetTimerEx("AfterDisconnectTimer", 500, 0, "i", playerid);
}

forward AfterDisconnectTimer(const playerid);
public AfterDisconnectTimer(const playerid)
{
    FastKick(playerid); //Это у меня для вызова обычного моментального Kick. Оставил, т.к. советую обратить на это внимание, учитывая то, что почти у всех щас макрос на Kick()
    AT_Timerid[playerid] = 0;
}

Jon_De 02/12/2013 04:27 PM

Re: Атака сервера
 
Code:

OnPlayerDisconnect(...)
{
 // ваш код
  Kick(playerid);
  return 1;
}

не?

stabker 02/12/2013 04:29 PM

Re: Атака сервера
 
Quote:

Originally Posted by Jon_De (Post 2804354)
Code:

OnPlayerDisconnect(...)
{
 // ваш код
  Kick(playerid);
  return 1;
}

не?

http://forum.sa-mp.com/showthread.php?t=400823&page=11

Jon_De 02/12/2013 04:33 PM

Re: Атака сервера
 
Quote:

Originally Posted by stabker (Post 2804360)

краткий вариант так сказать.

new bool:connected[MAX_PLAYERS];

Code:

OnPlayerConnect(..)
{
  if(connected[playerid] == true)
  {
      BanEx(playerid, "Connect flood");
      return 1;
  }
  connected[playerid] = true;
  return 1;
}

OnPlayerDisconnect(...)
{
    if(connected[playerid] == false) return 1;
    connected[playerid] = false;
    // ваш код
    Kick(playerid);
    return 1;
}

правда есть чит который вызывает и Onplayerdisconnect И коннект и флудит этим, короче про защиту от хаков долго писать можно. то что выше - это капля в море

stabker 02/12/2013 04:37 PM

Re: Атака сервера
 
Ну, попробуйте так сделать, и посмотрите на реакцию инклудов типа foreach. Все "OnPlayerDisconnect", которые выше, все равно выполняться будут.

Jon_De 02/12/2013 04:37 PM

Re: Атака сервера
 
Quote:

Originally Posted by stabker (Post 2804374)
Ну, попробуйте так сделать, и посмотрите на реакцию инклудов типа foreach. Все "OnPlayerDisconnect" которые выше, все равно выполняться будут.

у меня так и сделано. всякие левые инклуды не использую
в конце концов, можно это в инклуд засунуть и поместить его выше остальных, не знаю точно как там всё делается, но коллбэки будут вызываться так как и было задумано

DANGER1979 02/12/2013 06:34 PM

Re: Атака сервера
 
В OnPlayerDisconnect нельзя выполнять Kick, т.к. ф-ия Kick вызовет множественное срабатывание OnPlayerDisconnect.

Jon_De 02/12/2013 06:52 PM

Re: Атака сервера
 
Quote:

Originally Posted by DANGER1979 (Post 2804519)
В OnPlayerDisconnect нельзя выполнять Kick, т.к. ф-ия Kick вызовет множественное срабатывание OnPlayerDisconnect.

Смотри последний мой код внимательно


All times are GMT. The time now is 12:33 AM.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.