Üdv!
Sok szerver tulajdonosnak problémája akadt egy új hackel, amellyel külsûlegesen mesterséges játékosokat lehet felküldeni, ezeket a játékosokat a TAB is jelzi. DaVe már elõttem próbálkozott ellene védelemmel, de MIND a gl_npcs-bõl levõ és a többi is egytõl-egyig hibás volt. A maxips nevû scriptbe már a SA:MP fejlesztõi ezt megoldották, mivel ezek a npc-k mind 1 ip címrõl származnak, ez a funkció bannolja azokat a játékosokat, akik ugyanarról az ip címrõl vannak! Egy kicsit módosítottam a for cikluson Zsolesszka ciklusos megoldásával, így a ciklus nem terheli annyira a processzort. Nálam a szerverembe ez így bent is van, a sima támadó NPC-ket mind beengedi és a sima játékosokat is, csak a kártékony BOT-okat bannolja, mivel megvan a hack le is tudtam tesztelni!
#define MAX_CONNECTIONS_FROM_IP 3
stock GetNumberOfPlayersOnThisIP(test_ip[])
{
new against_ip[32+1];
new x = -1; // Javítva 0 playerid érték is vizsgálatra kerüljön.
new ip_count = 0;
for(; x++ < MAX_PLAYERS ;) {
if(IsPlayerConnected(x)) {
GetPlayerIp(x,against_ip,32);
if(!strcmp(against_ip,test_ip)) ip_count++;
}
}
return ip_count;
}
public OnPlayerConnect(playerid)
{
new connecting_ip[32+1];
GetPlayerIp(playerid,connecting_ip,32);
new num_players_on_ip = GetNumberOfPlayersOnThisIP(connecting_ip);
if(num_players_on_ip > MAX_CONNECTIONS_FROM_IP)
{
printf(\"MAXIPs: Connecting player(%d) exceeded %d IP connections from %s.\", playerid, MAX_CONNECTIONS_FROM_IP, connecting_ip);
BanEx(playerid, \"BOT attack!\");
return 1;
}
return 0;
}
A visszatérési értékek nem viccbõl vannak, figyeljetek ezekre, mert másik fórumon egy scripter azok nélkül tette be és csodálkozott ,hogy mi a hiba.
Még egyszer elmondom: Ez a funkció benne van a szerverembe, a támadó npc-ket és a sima játékosokat mind beengedi, csak a kártékony npc-ket bannolja, TESZTELVE mivel megvan a BOT felküldõ hack és kipróbáltam, télleg bannolja! :) Aki nem hiszi kipróbálhatja: 91.82.85.203:7804, nyugodtan küldjön fel npc-t úgy is bannolja!
Ne felejtsétek el a script elején definiálni a max. azonos IP-k számát.
#define MAX_CONNECTIONS_FROM_IP 3
Jó lett, a csatlakoz-spamelõ botok ellen.
Ha csak 1-et küldök fel, akkor nem dobja ki.
Amúgy az egy bot ellen is lehet védekezni:
Csatlakozásnál kötelezõ regisztráció, a bot nyilván nem tud regisztrálni, egy 1 perces korlátot adsz utána kick, ha többször visszajön reg nélkül az nyilván bot->ban.
Még egyszerûbb ha nem is regisztrációt mutatsz neki, hanem egy hasonló dialogot:
(Generált betûk)
Írd be ezt: wgrwrg[/quote]
Ha nem írja be akkor nyilván bot/külföldi.
Én még kiegészíteném ezt azzal, hogy azt a további két botot kickelje:
#include <a_samp>
#define MAX_CONNECTIONS_FROM_IP 3
stock GetNumberOfPlayersOnThisIP(test_ip[])
{
new against_ip[32+1];
new x = -1; // Javítva 0 playerid érték is vizsgálatra kerüljön.
new ip_count = 0;
for(; x++ < MAX_PLAYERS ;) {
if(IsPlayerConnected(x)) {
GetPlayerIp(x,against_ip,32);
if(!strcmp(against_ip,test_ip)) ip_count++;
}
}
return ip_count;
}
public OnPlayerConnect(playerid)
{
new connecting_ip[32+1];
GetPlayerIp(playerid,connecting_ip,32);
new num_players_on_ip = GetNumberOfPlayersOnThisIP(connecting_ip);
if(num_players_on_ip > MAX_CONNECTIONS_FROM_IP)
{
printf(\"MAXIPs: Connecting player(%d) exceeded %d IP connections from %s.\", playerid, MAX_CONNECTIONS_FROM_IP, connecting_ip);
BanEx(playerid, \"BOT attack!\");
new against_ip[32+1],test_ip[32+1];
GetPlayerIp(playerid,test_ip,32);
new x = -1; // Javítva 0 playerid érték is vizsgálatra kerüljön.
for(; x++ < MAX_PLAYERS ;)
{
if(IsPlayerConnected(x))
{
GetPlayerIp(x,against_ip,32);
if(!strcmp(against_ip,test_ip)) Kick(x);
}
}
return 1;
}
return 0;
}