Guten Tag.
Ich habe mal ein Anti health und anti armour cheat versucht zu scripten.
Immer wenn die HP im script geändert wird, wird nicht nur die aktuelle hp, sondern auch die differenz zwischen alte und neue hp serverside gespeichert.
in einem sekundentimer wird nun überprüft ob das aktuelle geld mit dem wert, der serverside gespeichert wird übereinstimmt. wenn die hp höher ist, wird übeprüft ob er kurz vorher etwas gegessen hat, per sich gehealt hat oder ob die gecheatete hp mit der differenz übereinstimmt. Wenn mindestens eines der 3 sachen erkannt wird, wird es als Lag erkannt. ansonsten wird es als cheat erkannt. wenn die aktuelle hp geringer als der Wert ist, wird die aktuelle hp serverside gespeichert.
Das selbe gilt auch fürs anti Armour script.
Nun kommen sehr öft Fehlmeldungen bzw. Fehlbans. Es kann aber nicht sein das das immer Lags sind. auch wird die differenz zwsichen den beiden HP´s nicht berücksichtigt.
Ich habe es mit S0beit getestet, und er hat es 100% erkannt. Jedoch wenn man durch cmd´s gehealt wird, wird es nicht immer als legal erkannt, oftmals kommen meldungen bei den Admins rein. da ich die differenz speichern lasse, zwischen alte und neue hp, müsste selbst wenns lags wären, ein Lagkick geben, was es jedoch nicht tut.
Beispiel:
Aktuelle HP: 70
Neue HP : 100
Differenz: 30
Es wird die HP um 30 erhöht und serverside gespeichert, wenn der spieler nun laggt, könnte es trotzdem zu einer meldung kommen, jedoch hat man noch die differnz, die ja mit der gecheateten HP übereinstimmen müsste, was sie jedoch nicht tut.
Hier mal das Script:
new Float:Healthcheck[MAX_PLAYERS]; // hier wird die aktuelle "richtige" hp gespeichert
new Float:healdif[MAX_PLAYERS]; //differenz zwischen alte und neue hp
new Float:Armourcheck[MAX_PLAYERS];
new Float:armdif[MAX_PLAYERS];
new gegessen[MAX_PLAYERS]; // ob er gerade was gegessen hat
new cheater[MAX_PLAYERS]; // wenn die einen wert von 5 oder höher hat, wird er gebannt
new lagger[MAX_PLAYERS];// wenn die einen wert von 5 oder höher hat, wird er gekickt wegen Lag
new Bangrund[MAX_PLAYERS][50]; //hier wird der bangrund gespeichert
new cheatresettimer[MAX_PLAYERS]; //der timer, der jede minute ein Lagwarn und ein Cheatwarn entfernt
//ein command womit man gehealt wird:
public OnPlayerCommandText(playerid,cmdtext[])
{
if(strcmp(cmdtext, "/essen", true)==0)
{
if((IsPlayerInRangeOfPoint(playerid,10.0,369.3123,-6.0172,1001.8516)) || (IsPlayerInRangeOfPoint(playerid,10.0,376.6667,-67.5152,1001.5078)) || (IsPlayerInRangeOfPoint(playerid,10.0,379.3838,-190.5127,1000.6328)) || (IsPlayerInRangeOfPoint(playerid,10.0,375.7635,-118.9136,1001.4995)))
{
if(GetPlayerMoney(playerid) >= 25)
{
new Float:hp;
GetPlayerHealth(playerid,hp);
gegessen[playerid] = 1; //hier hat er gerade was gegessen
if(hp < 80.0)
{
p_SetPlayerHealth(playerid,hp+20.0); //hier wird sie serverside gespeichert, siehe stock
}
else
{
p_SetPlayerHealth(playerid,100.0);
}
p_GivePlayerMoney(playerid,-25); //das selbe wird auch mit dem geld gemacht
SendClientMessage(playerid,0x00DD00FF,"Du hast für $25 etwas gegessen!");
}
else
{
SendClientMessage(playerid,0xDD0000FF,"Du hast nicht genug Geld, Essen kostet $25!");
}
}
}
return 1;
}
stock p_GivePlayerMoney(playerid,money)
{
moneydif[playerid] = money; //differenz
GivePlayerMoney(playerid,money); //geld wird gegeben
Moneycheck[playerid]+= money; // serverside gespeichert
return 1;
}
stock p_ResetPlayerMoney(playerid)
{
moneydif[playerid] = GetPlayerMoney(playerid);
ResetPlayerMoney(playerid),
Moneycheck[playerid] = 0;
return 1;
}
stock p_SetPlayerHealth(playerid,Float:health)
{
new Float:hp;
GetPlayerHealth(playerid,hp);
healdif[playerid] = health-hp; //differenz
SetPlayerHealth(playerid,health); //hp wird gesettet
Healthcheck[playerid] = health; //serverside gespeichert
return 1;
}
stock p_SetPlayerArmour(playerid,Float:armour)
{
new Float:arm;
GetPlayerArmour(playerid,arm);
armdif[playerid] = armour-arm; // differenz wird errechnet, neue armour - alte armour
SetPlayerArmour(playerid,armour); //armour wird gesettet
Armourcheck[playerid] = armour; //armour wird serverside gespeichert
return 1;
}
[pwn]//public der jede sekunde checkt:
public check()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
if(anticheat == 1)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(i,name,sizeof(name));
//geldcheat:
new pgeld, cheatmoney;
pgeld = GetPlayerMoney(i);
cheatmoney = pgeld-Moneycheck[i];
if(cheatmoney >= 1) // über 1 gibt nen warn
{
new str[125];
format(str,sizeof(str),"[System] %s(%d) hat sich $%d aus dem Nichts gezaubert!",name,i,cheatmoney);
p_ResetPlayerMoney(i);
p_GivePlayerMoney(i,Moneycheck[i]);
if(cheatmoney == 25 && gegessen[i] == 1 || moneydif[i] == cheatmoney) // wird überprüft ob er gelaggt hat
{
lagger[i]++;
}
else
{
cheater[i]++;
}
KillTimer(cheatresettimer[i]);
Bangrund[i] = "Geldcheat";
cheatresettimer[i] = SetTimerEx("cheatreset",60000,0,"i",i);
for(new j = 0; j < MAX_PLAYERS; j++)
{
if(Spieler[j][Admin] >= 2)
{
SendClientMessage(j,0xFFFF00FF,str);
}
}
}
if(cheatmoney >= 10000) //über 10k sofort ban
{
new str[125];
GetPlayerName(i,name,sizeof(name));
format(str,sizeof(str),"[System] %s(%d) hat sich $%d aus dem Nichts gezaubert!",name,i,cheatmoney);
p_ResetPlayerMoney(i);
p_GivePlayerMoney(i,Moneycheck[i]);
cheater[i] = 5;
KillTimer(cheatresettimer[i]);
Bangrund[i] = "Geldcheat";
for(new j = 0; j < MAX_PLAYERS; j++)
{
if(Spieler[j][Admin] >= 2)
{
SendClientMessage(j,0xFFFF00FF,str);
}
}
}
if(cheatmoney < 0) //falls er weniger geld hat wirds aktuallisiert
{
Moneycheck[i] = pgeld;
}
//Healthhack
new Float:hp,Float:cheathp;
GetPlayerHealth(i,hp);
cheathp = hp-Healthcheck[i];
if(cheathp >= 1)
{
new str[125];
format(str,sizeof(str),"[System] %s(%d) hat sich %0.2f HP aus dem Nichts gezaubert!",name,i,cheathp);
p_SetPlayerHealth(i,Healthcheck[i]);
if(cheathp <= 20 && gegessen[i] == 1 || healdif[i] == cheathp)
{
lagger[i]++;
}
else
{
cheater[i]++;
}
KillTimer(cheatresettimer[i]);
Bangrund[i] = "Healthhack";
cheatresettimer[i] = SetTimerEx("cheatreset",60000,0,"i",i);
for(new j = 0; j < MAX_PLAYERS; j++)
{
if(Spieler[j][Admin] >= 2)
{
SendClientMessage(j,0xFFFF00FF,str);
}
}
}
if(cheathp < 0)
{
Healthcheck[i] = hp;
}
//Armourhack:
new Float:arm,Float:cheatarmour;
GetPlayerArmour(i,arm);
cheatarmour = arm-Armourcheck[i];
if(cheatarmour >= 1)
{
new str[125];
format(str,sizeof(str),"[System] %s(%d) hat sich %0.2f Armour aus dem Nichts gezaubert!",name,i,cheatarmour);
p_SetPlayerArmour(i,Armourcheck[i]);
if(IsPlayerInRangeOfPoint(i,3.0,1512.5111,-1478.7697,9.5000) || armdif[i] == cheatarmour)
{
lagger[i]++;
}
else
{
cheater[i]++;
}
KillTimer(cheatresettimer[i]);
Bangrund[i] = "Armourhack";
cheatresettimer[i] = SetTimerEx("cheatreset",60000,0,"i",i);
for(new j = 0; j < MAX_PLAYERS; j++)
{
if(Spieler[j][Admin] >= 2)
{
SendClientMessage(j,0xFFFF00FF,str);
}
}
}
if(cheatarmour < 0)
{
Armourcheck[i] = arm;
}
if(cheater[i] >= 5)
{
new bstr[125];
format(bstr,sizeof(bstr),"%s wurde vom System gebannt, Grund: %s.",name,Bangrund[i]);
SendClientMessageToAll(0xFF6347FF,bstr);
Spieler[i][ban] = 1;
Spieler[i][bangrund] = Bangrund[i];
Kick(i);
}
if(lagger[i] >= 5)
{
new kstr[125];
format(kstr,sizeof(kstr),"%s wurde vom System gekickt, Grund: Lag.",name);
SendClientMessageToAll(0xFF6347FF,kstr);
Kick(i);
}
}
}
if(gegessen[i] != 0) //falls er was gegessen hat wird die variable wieder zurückgesetzt
{
gegessen[i] = 0;
}
if(healdif[i] != 0) //die healdif wird wieder resettet
{
healdif[i] = 0;
}
if(anticheat == 0) //falls das anticheat system abgeschaltet ist, wird cheat und lag warn resettet
{
cheater[i] = 0;
lagger[i] = 0;
}
}
return 1;
}
public cheatreset(playerid)
{
if(cheater[playerid] > 0)
{
cheater[playerid]--;
}
if(lagger[playerid] > 0)
{
lagger[playerid]--;
}
if(cheater[playerid] > 0 || lagger[playerid] > 0)
{
cheatresettimer[playerid] = SetTimerEx("cheatreset",60000,0,"i",playerid);
}
return 1;
}
ich hoffe ihr könnt mir helfen.
Mfg
Simon