13.08.2013, 10:41
exclide1, а что за "фейк дисконнект" вообще? Подробнее об этом можно?
Это функция все в том же PizDoS-боте "bypass protection". Вы как бы покидаете сервер (идет OnPlayerDisconnect), но на самом деле остаетесь на нем. Подробнее этого пока не могу, только начал изучать RakSAMP.
|
public OnPlayerDisconnect(playerid, reason)
{
//...
Kick(playerid);
return 1;
}
И привет рекурсия.
pawn Код:
|
public OnPlayerDisconnect(playerid)
{
static DisconnectState[MAX_PLAYERS char];
if(!DisconnectState{playerid}) Kick(playerid), DisconnectState{playerid} = 1;
else DisconnectState{playerid} = 0;
}
Network Active: 1 Network State: 8 Messages in Send buffer: 0 Messages sent: 59687 Bytes sent: 2770820 Acks sent: 388 Acks in send buffer: 0 Messages waiting for ack: 0 Messages resent: 94 Bytes resent: 2051 Packetloss: 0.1% Messages received: 51833 Bytes received: 1458804 Acks received: 0 Duplicate acks received: 90 Inst. KBits per second: 47.0 KBits per second sent: 167.9 KBits per second received: 168.9
new gTimer;
public OnFilterScriptInit()
{
gTimer = SetTimer("GetNetworkStatsTimer", 1000, 1);
print(" antipizdos v0.2 By: DANGER1979");
print("_____________________________________________");
print(" ");
return true;
}
public OnFilterScriptExit()
{
KillTimer(gTimer); gTimer = -1;
return 1;
}
forward GetNetworkStatsTimer();
public GetNetworkStatsTimer()
{
new stats[500]; new pip[16]; new playername[MAX_PLAYER_NAME];
for(new i; i<MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) continue;
if(IsPlayerNPC(i)) continue;
//if(!IsPlayerConnected(i)) return Kick(i);
//new stats[418+1];
GetPlayerNetworkStats(i, stats, sizeof(stats));
new MSB = strval(findParam(stats, "Messages in Send buffer: "));
if(MSB > 10000) {
GetPlayerName(i, playername, sizeof(playername));
GetPlayerIp(i, pip, sizeof(pip));
printf("antipizdos: kick %s[%d][ip:%s]. Messages in Send buffer: %d", playername, i, pip, MSB);
Kick(i);
}
new AS = strval(findParam(stats, "Acks sent: "));
if(AS > 3000) {
GetPlayerName(i, playername, sizeof(playername));
GetPlayerIp(i, pip, sizeof(pip));
printf("antipizdos: kick %s[%d][ip:%s]. Acks sent: %d", playername, i, pip, AS);
Kick(i);
}
}
return 1;
}
public OnGameModeInit()
{
SetTimer("AntiDOS", 950, true);
}
new m_per_sec[MAX_PLAYERS];
forward AntiDOS();
public AntiDOS()
{
new str[268];
new mes;
new find;
for(new i=0;i<MAX_PLAYERS;i++)
{
if(IsPlayerConnected(i))
{
GetPlayerNetworkStats(i, str, 268);
find = strfind(str, "Messages received:", false, 205);
if(find != -1)
{
mes = strval(str[find+18]);
if((mes - m_per_sec[i]) >= 500)
{
SetTimerEx("testDos", 200, false, "%d%d", i, (mes - m_per_sec[i]));//Во время выхода игрока с сервера, таймер может сработать, тогда значение подпрыгнет примерно до 115000, это не допустимо
}
m_per_sec[i] = mes;
}
}
}
return true;
}
forward testDos(playerid, messages);
public testDos(playerid, messages)
{
if(IsPlayerConnected(playerid))
{
//Ban(playerid);
}
return false;
}
public OnPlayerConnect(playerid)
{
m_per_sec[playerid] = 2147483647;
}
По-моему, лучше отлавливать 'Messages received', и получать разность каждую секунду.
Acks sent постепенно достигнет значения в 3000, и тогда будет плохо. А 'Messages received', на мой взгляд, самый надежный. |
#include <a_samp>
new NET_Bytes[MAX_PLAYERS];
new NET_Warning[MAX_PLAYERS char];
new NET_Timer=-1;
public OnFilterScriptInit()
{
NET_Timer=SetTimer("NET", 955, 1);
return 1;
}
public OnFilterScriptExit()
{
KillTimer(NET_Timer);
NET_Timer=-1;
return 1;
}
public OnPlayerConnect(playerid)
{
NET_Warning{playerid}=0;
NET_Bytes[playerid]=0;
return 1;
}
forward NET();//В секундный таймер
public NET()
{
new pack[1024],pa[12];
for(new playerid=MAX_PLAYERS;playerid--;)if(IsPlayerConnected(playerid))
{
GetPlayerNetworkStats(playerid,pack,sizeof(pack));
new packet=strfind(pack,"Bytes received:")+16;
strmid(pa,pack,packet,packet+12);
packet=strval(pa);
if((packet-NET_Bytes[playerid]) > 3000)//3000 изменить на ваше желаемое.
{
++NET_Warning{playerid};
if(NET_Warning{playerid} == 2)
{
Kick(playerid);
print("Paket");
}
}
else NET_Warning{playerid}=0;
NET_Bytes[playerid]=packet;
}
}
for(new playerid=MAX_PLAYERS;playerid--;)if(IsPlayerConnected(playerid)) |
++NET_Warning{playerid}; |