anti cheat

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 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