Guten Tag
Ich habe mir schon viele Anticheats angeguckt und viele selber gescriptet, habe jedoch immer wieder diese Probleme, das "nicht-cheaten" als cheat erkannt wird (auch bei bereits fertigen und "getesteten" includes und filterscripts hier im Forum.
Cheaten wird zu 100% erkannt, jedoch wird viel zu oft ein Cheat im normalem Spielverlauf erkannt.
Nehmen wir ein Beispiel, ein simples Anti-hp cheat:
Ich nehme eine kontrollvariable:
new Float:acHP[MAX_PLAYERS];
ich habe das natürlich alles schön in Enums gepackt, sollte aber für ein kleines Beispiel so reichen..
Wenn der Spieler nun conncten, deaktiviere ich erstmal den Anticheat bis er spawnt und setze sobald er erfolgeich gespawnt ist sämtliche Werte und aktiviere ihn dann:
public OnPlayerSpawn(...)
{
GetPlayerHealth(playerid, acHP);
AntiCheatAktivieren;
}
Nun bevor der Anticheat aktiviert wird, setze ich den Wert auf das Leben des Spielers. Nun wird der aktiviert und überprüft alle 750ms alle spieler die auf dem server sind:
public timervon750ms()
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(nicht aufm server oder anticheat deaktiviert) continue;
new Float:checkHP;
GetPlayerHealth(i, checkHP);
if(checkHP > acHP[i]) //Hier wäre das ein Cheat-detect
else acHP[i] = checkHP //hier wird dann das leben auf das abgefragte leben gesetzt, da es ja gleich oder tiefer ist (wenn er mal wo runtergefallen ist)
}
}
Wenn ich nun das Leben im script setze mache ich das mit einer eigenen funktion:
stock EigeneFunktion(playerid, Float:HP)
{
SetPlayerHealth(playerid, HP);
acHP[playerid] = HP;
}
So sieht man es überall gelöst. Ich bin einen kleinen Schritt weitergegangen und habe mir überlegt, 2 Variabeln zu benutzen. die Eine ist ein boolean und sagt mir: der Spieler wird nun Leben bekommen oder nicht. die andere sagt mir, wie vorher, wieviel leben er maximal haben dürfte.
ich frage also ab ob dieser nun mehr leben hat als er darf und wenn ja kontrolliere ich nochmal die 2. Variabel die mir sagt: oh er bekommt gerade leben und gebe ihm ein Lag-Warn oder sie sagt mir: ne der bekommt kein Leben und gebe ihm ein Cheat warn und setze die Variabel nach jeder Überprüfung auf false.
ich dachte mir, dadurch werden einige Fehler korrigiert, da es eventuell sein kann das der timer sehr ungünstig ist und die überprüfung stattfindet wärend er leben bekommt. dies soll mit der 2. variabeln verhindert werden..
Meine Frage ist nun: Wieso erkennt er sehr oft einen Cheat, obwohl es kein Cheat ist, gerne gebe ich auch mein Orignal Code, falls ihr den braucht.