Anticheat Bug

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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.

  • Es ist nun ein Beispiel, das selbe ist auch bei Waffen, Geld etc der Fall, wobei dies nicht so häufig geschieht...


    Ich habe gerade ein Anti-godmode gescriptet, welches noch nicht ganz funktioniert. um es zu testen haben wir uns abgeschossen und regelmäßig Leben gesetzt. Dabei waren so viele Fehlentscheidungen vom Script dabei, dass ich nun einfach euch Fragen möchte.


    Gerne poste ich Hier auch das Komplette anticheat :D



    Ich weiß auch nicht ob es sinnvoller ist, jedem Spieler beim connecten einen timer zu geben der für jeden Spieler individuell alles überprüft, oder ob ich den allgemeinen timer lassen soll, der alle Spieler durchgeht.
    Wir haben einen Leistungsstarken root, aber ob das sinn macht..

  • Ich habe mal den Code herausgeschnitten:


    Spoiler anzeigen
    enum cheatinfo
    {
    bool:active, //Antticheat für Spieler aktiv oder nicht
    pLag,
    pCheat,
    bool:GetMoney, //Money
    pMoney,
    bool:GetHealth, //Leben
    Float:pHealth,
    bool:GetArmour, //Rüstung
    Float:pArmour,
    bool:GetWeapon, //Waffen
    pWeapon[13],
    pAmmo[13],
    }
    new pAntiCheat[MAX_PLAYERS][cheatinfo];

    Spoiler anzeigen
    forward CheatCheck();
    forward Lag(playerid);
    forward Cheat(playerid, cGrund[]);
    forward ResetAntiCheat(playerid);
    forward SetAntiCheat(playerid);

    Spoiler anzeigen
    public OnGameModeInit()
    {
    SetTimer("CheatCheck", 773, 1);
    }

    Spoiler anzeigen
    public Lag(playerid)
    {
    pAntiCheat[playerid][pLag]++;
    if(pAntiCheat[playerid][pLag] >= Max_Lag)
    {
    new str[125];
    format(str,sizeof(str),"[Server] %s wurde vom Server gekickt, Grund: Lag", pName[playerid]);
    SendClientMessageToAll(0xFF6347FF,str);
    SendClientMessage(playerid, COLOR_ERROR,"Sie wurden vom Server gekickt, Grund: Lag");
    Kick(playerid);
    }
    return 1;
    }

    Spoiler anzeigen
    public Cheat(playerid, cGrund[])
    {
    pAntiCheat[playerid][pCheat]++;
    SendCheatWarn(playerid, cGrund);

    Spoiler anzeigen
    if(pAntiCheat[playerid][pCheat] >= Max_Cheat)
    {
    new str[125];
    format(str,sizeof(str),"[Server] %s wurde vom System gebannt, Grund: %s", pName[playerid], cGrund);
    SendClientMessageToAll(0xFF6347FF,str);
    Spieler[playerid][ban] = true;
    format(Spieler[playerid][bangrund],100,"%s",cGrund);
    Kick(playerid);
    }
    return 1;
    }

    Spoiler anzeigen
    public ResetAntiCheat(playerid)
    {
    pAntiCheat[playerid][active] = false;
    pAntiCheat[playerid][pLag] = 0;
    pAntiCheat[playerid][pCheat] = 0;
    pAntiCheat[playerid][GetMoney] = false;
    pAntiCheat[playerid][pMoney] = 0;
    pAntiCheat[playerid][GetHealth] = false;
    pAntiCheat[playerid][pHealth] = 0.0;
    pAntiCheat[playerid][GetArmour] = false;
    pAntiCheat[playerid][pArmour] = 0.0;
    pAntiCheat[playerid][GetWeapon] = false;
    for(new w = 0; w < 13; w++)
    {
    pAntiCheat[playerid][pWeapon][w] = 0;
    pAntiCheat[playerid][pAmmo][w] = 0;
    }
    return 1;
    }

    Spoiler anzeigen
    public SetAntiCheat(playerid)
    {
    pAntiCheat[playerid][GetHealth] = true;
    pAntiCheat[playerid][GetArmour] = true;
    pAntiCheat[playerid][GetMoney] = true;
    pAntiCheat[playerid][GetWeapon] = true;
    pAntiCheat[playerid][pLag] = 0;
    pAntiCheat[playerid][pCheat] = 0;
    pAntiCheat[playerid][pHealth] = 250.0;
    pAntiCheat[playerid][pArmour] = 250.0;
    pAntiCheat[playerid][pMoney] = GetPlayerMoney(playerid);
    for(new w = 0; w < 13; w++)
    {
    new weap[2];
    GetPlayerWeaponData(playerid, w, weap[0], weap[1]);
    pAntiCheat[playerid][pWeapon][w] = weap[0];
    pAntiCheat[playerid][pAmmo][w] = weap[1];
    }

    Spoiler anzeigen
    pAntiCheat[playerid][active] = true;
    }

    Spoiler anzeigen
    public OnPlayerDisconnect(playerid, reason)
    {
    ResetAntiCheat(playerid);
    return 1;
    }

    Spoiler anzeigen
    public OnPlayerSpawn(playerid)
    {
    SetAntiCheat(playerid);
    return 1;
    }

    Spoiler anzeigen
    public CheatCheck()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || !LoggedIn[i] || IsPlayerNPC(i)) continue;
    if(!pAntiCheat[i][active]) continue;

    Spoiler anzeigen
    //Anti-Money:
    if(pAntiCheat[i][pMoney] > GetPlayerMoney(i)) pAntiCheat[i][pMoney] = GetPlayerMoney(i);

    Spoiler anzeigen
    if(GetPlayerMoney(i) > pAntiCheat[i][pMoney])
    {
    if(pAntiCheat[i][GetMoney])
    {
    pAntiCheat[i][pMoney] = GetPlayerMoney(i);
    Lag(i);
    }
    else
    {
    ResetPlayerMoney(i);
    GivePlayerMoney(i, pAntiCheat[i][pMoney]);
    Cheat(i, "Geld-Cheat");
    }
    }
    else pAntiCheat[i][pMoney] = GetPlayerMoney(i);
    pAntiCheat[i][GetMoney] = false;

    Spoiler anzeigen
    //Anti-Leben:
    if(!aDuty[i]) //falls man Admin onDuty ist
    {
    new Float:cHP;
    GetPlayerHealth(i, cHP);
    if(cHP > 200.0) //man kann maximal 200.0 haben vom script aus
    {
    pAntiCheat[i][pCheat] = Max_Cheat-1;
    Cheat(i, "Leben-Cheat");
    continue;
    }
    else if(cHP > pAntiCheat[i][pHealth])
    {
    if(pAntiCheat[i][GetHealth])
    {
    pAntiCheat[i][pHealth] = cHP;
    Lag(i);
    }
    else
    {
    SetPlayerHealth(i, pAntiCheat[i][pHealth]);
    Cheat(i, "Leben-Cheat");
    }
    }
    else pAntiCheat[i][pHealth] = cHP;
    }
    pAntiCheat[i][GetHealth] = false;

    Spoiler anzeigen
    //Anti-Armour:
    new Float:cAHP;
    GetPlayerArmour(i, cAHP);
    if(cAHP > 200.0)
    {
    pAntiCheat[i][pCheat] = Max_Cheat-1;
    Cheat(i, "Armour-Cheat");
    continue;
    }
    else if(cAHP > pAntiCheat[i][pArmour])
    {
    if(pAntiCheat[i][GetArmour])
    {
    pAntiCheat[i][pArmour] = cAHP;
    Lag(i);
    }
    else
    {
    SetPlayerArmour(i, pAntiCheat[i][pArmour]);
    Cheat(i, "Armour-Cheat");
    }
    }
    else pAntiCheat[i][pArmour] = cAHP;
    pAntiCheat[i][GetArmour] = false;

    Spoiler anzeigen
    //Anti Weapon:
    for(new w = 0; w < 13; w++)
    {
    new pcweap[2];
    GetPlayerWeaponData(i, w, pcweap[0], pcweap[1]);
    if(pcweap[0] <= 0 || pcweap[1] <= 0)
    {
    pAntiCheat[i][pWeapon][w] = 0;
    pAntiCheat[i][pAmmo][w] = 0;
    continue;
    }
    if(pcweap[0] == 46)
    {
    pAntiCheat[i][pWeapon][w] = 46;
    pAntiCheat[i][pAmmo][w] = 1;
    continue;
    }

    Spoiler anzeigen
    if(pcweap[0] != pAntiCheat[i][pWeapon][w])
    {
    if(pAntiCheat[i][GetWeapon])
    {
    pAntiCheat[i][pWeapon][w] = pcweap[0];
    pAntiCheat[i][pAmmo][w] = pcweap[1];
    Lag(i);
    }
    else
    {
    pAntiCheat[i][GetWeapon] = true;
    DeletePlayerWeapon(i,pcweap[0]);
    Cheat(i, "Waffencheat");
    }
    }
    else
    {
    if(pcweap[1] < pAntiCheat[i][pAmmo][w]) pAntiCheat[i][pAmmo][w] = pcweap[1];
    else if(pcweap[1] > pAntiCheat[i][pAmmo][w])
    {
    if(pAntiCheat[i][GetWeapon])
    {
    pAntiCheat[i][pWeapon][w] = pcweap[0];
    pAntiCheat[i][pAmmo][w] = pcweap[1];
    Lag(i);
    }
    else
    {
    pAntiCheat[i][GetWeapon] = true;
    DeletePlayerWeapon(i,pcweap[0]);
    Cheat(i, "Waffencheat");
    }
    }
    }
    }
    pAntiCheat[i][GetWeapon] = false;
    }
    }

    Spoiler anzeigen
    stock j_GivePlayerWeapon(playerid, weaponid, ammo)
    {
    pAntiCheat[playerid][GetWeapon] = true;
    GivePlayerWeapon(playerid, weaponid, ammo);
    pAntiCheat[playerid][pWeapon][GetSlot(weaponid)] = weaponid;
    pAntiCheat[playerid][pAmmo][GetSlot(weaponid)] += ammo;
    return 1;
    }

    Spoiler anzeigen
    stock j_ResetPlayerWeapons(playerid)
    {
    pAntiCheat[playerid][GetWeapon] = true;
    ResetPlayerWeapons(playerid);
    for(new i = 0; i < 13; i++)
    {
    pAntiCheat[playerid][pWeapon][i] = 0;
    pAntiCheat[playerid][pAmmo][i] = 0;
    }
    return 1;
    }

    Spoiler anzeigen
    stock GetSlot(weaponx)
    {
    new slot;
    if(weaponx == 0 || weaponx == 1) slot = 0;
    else if(weaponx > 8 && weaponx < 10) slot = 1;
    else if(weaponx > 9 && weaponx < 16) slot = 10;
    else if(weaponx > 15 && weaponx < 20) slot = 8;
    else if(weaponx > 21 && weaponx < 25) slot = 2;
    else if(weaponx > 24 && weaponx < 28) slot = 3;
    else if(weaponx == 28 || weaponx == 29 || weaponx == 32) slot = 4;
    else if(weaponx == 30 || weaponx == 31) slot = 5;
    else if(weaponx == 33 || weaponx == 34) slot = 6;
    else if(weaponx > 34 || weaponx < 39) slot = 7;
    else slot = -1;
    return slot;
    }

    Spoiler anzeigen
    stock j_SetPlayerHealth(playerid, Float:hp)
    {
    pAntiCheat[playerid][GetHealth] = true;
    SetPlayerHealth(playerid, hp);
    pAntiCheat[playerid][pHealth] = hp;
    return 1;
    }

    Spoiler anzeigen
    stock j_SetPlayerArmour(playerid, Float:ahp)
    {
    pAntiCheat[playerid][GetArmour] = true;
    SetPlayerArmour(playerid, ahp);
    pAntiCheat[playerid][pArmour] = ahp;
    return 1;
    }

    Spoiler anzeigen
    stock j_GivePlayerMoney(playerid, amount, bool:mal100 = true)
    {
    pAntiCheat[playerid][GetMoney] = true;
    if(mal100)
    {
    GivePlayerMoney(playerid,amount*100);
    pAntiCheat[playerid][pMoney]+=amount*100;
    }
    else
    {
    GivePlayerMoney(playerid,amount);
    pAntiCheat[playerid][pMoney]+=amount;
    }
    return 1;
    }