Immer noch Anti Money Hack Probleme

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
  • Hey,
    habe leider immer noch Probleme beim Anti Money Hack. Er funktioniert, aber ich werde auch manchmal wenn ich meine alternative Geldgebefunktion benutze gebannt. Mir ist es nur aufgefallen wenn ich Geld verliere also mir quasi einen negativen Betrag gebe. Das kann ich mir garnicht verstehen weil ich eigentlich nur gebannt werden dürfte, wenn ich mehr Geld habe als der Server sagt. Hier meine Funktionen:
    public GivePlayerMoneyEx(playerid,ammount)
    {
    SetPVarInt(playerid, "money", GetPVarInt(playerid,"money") + ammount);
    GivePlayerMoney(playerid, ammount);
    return 1;
    }
    public AntiCheat()
    {
    for(new playerid; playerid<MAX_PLAYERS; playerid++)
    {
    if(IsPlayerConnected(playerid))
    {
    if(GetPlayerMoney(playerid) > GetPVarInt(playerid, "money") )
    {
    ResetPlayerMoney(playerid);
    new mbformat[128];
    format(mbformat,sizeof(mbformat),"Anti Cheat has banned %s due to Money Hack",getPlayerName(playerid));
    SendClientMessageToAll(COLOR_RED,mbformat);
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Money Hack",90,tbanIP);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);


    }
    if(PlayerSpawned[playerid] == 1 && sInfo[playerid][alevel] == 0)
    {
    new wep = GetPlayerWeapon(playerid);
    if(wep==1||wep==2||wep==3||wep==4||wep==5||wep==6||wep==7||wep==8||wep==9||wep==10||wep==11||wep==12||wep==13||wep==14||wep==15||wep==16||wep==17||wep==18||wep==22||wep==23||wep==24||wep==25||wep==26||wep==27||wep==28||wep==29||wep==30||wep==31||wep==32||wep==33||wep==34||wep==35||wep==36||wep==37||wep==38||wep==39||wep==40||wep==41||wep==42||wep==43||wep==44||wep==45)
    {
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Weapon Hack",90,tbanIP);
    new cheat[250];
    format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to weapon hack.",getPlayerName(playerid));
    SendClientMessage(playerid,COLOR_RED,cheat);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
    }
    new Float:Armour;
    GetPlayerArmour(playerid, Armour);
    if(Armour > 0)
    {
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Armour Hack",90,tbanIP);
    new cheat[250];
    format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to armour hack.",getPlayerName(playerid));
    SendClientMessage(playerid,COLOR_RED,cheat);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
    }
    if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
    {
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Jetpack Hack",90,tbanIP);
    new cheat[250];
    format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to jetpack hack.",getPlayerName(playerid));
    SendClientMessage(playerid,COLOR_RED,cheat);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
    }
    if(IsPlayerInAnyVehicle(playerid))
    {
    new speed = floatround(GetVehicleSpeedEx(GetPlayerVehicleID(playerid),0));
    if(speed>= 206){
    new SpeedWarnString[250];
    format(SpeedWarnString,sizeof(SpeedWarnString),"[SPEED WARNING]%s(%i) is going over 205MPH. Speed: %i MPH. Spectate him !",getPlayerName(playerid),playerid,speed);
    SendAdminMessage(COLOR_RED,SpeedWarnString);
    }
    }
    }
    }
    }
    }
    Und unter OnGameModeInit:
    SetTimer("AntiCheat", 1000, true);
    PS: Ich habe zur Sicherheit mal den ganzen Anti Cheat mit dazu gepackt.

  • Am Script scheint das nicht zu liegen. Ich rate dir, lass dir das mal loggen. Speicher dir in den server_log die beiden Werte wenn jemand gebannt wird, und jedes mal wenn sich sein Geld über die Funktion ändert.
    Ich tippe darauf, dass einfach das Paket nicht (rechtzeitig) beim Spieler ankommt. (Schonmal was von Desynchronisation gehört? Ich schätze nicht, das kennt hier kaum einer.)


    public GivePlayerMoneyEx(playerid,ammount)
    {
    printf("[Geldverkehr] playerid: %d amount: %d - pVar: %d Get: %d", playerid, amount, GetPVarInt(playerid,"money"), GetPlayerMoney(playerid));
    SetPVarInt(playerid, "money", GetPVarInt(playerid,"money") + ammount);
    GivePlayerMoney(playerid, ammount);
    return 1;
    }


    Und beim Ban vor: ResetPlayerMoney(playerid);
    printf("[Ban] playerid: %d - pVar: %d Get: %d", playerid, GetPVarInt(playerid,"money"), GetPlayerMoney(playerid));



    Ich kann mir gut vorstellen, dass zum Zeitpunkt des Bans das Geld noch nicht den Wert zurückgibt, den es eigentlich hat. (Je nach Ping)


    Lass dir das mal ausgeben und wenn so ein falscher Ban vorkommt, dann schau dir den Log an. Gegebenenfalls poste ihn hier.

  • Code
    [16:58:35] [Geldverkehr] playerid: 0   amount: -500   -  pVar: 149967755     Get: 149967755
    [16:58:36] [Ban] playerid: 0    -  pVar: 149967255     Get: 149967755
    [16:58:36] [Geldverkehr] playerid: 0   amount: -500   -  pVar: 149967255     Get: 0
    [16:58:36] [part] Oskaar has left the server (0:2)


    Ich habe jetzt mal zur Sicherheit eine Zeile über dem Ban mit kopiert. Also es sieht so aus als hättest du Recht, aber wieso passiert das nur auf meinem Server ? Ich benutze nicht viele Timer es laggt nicht und mein Ping ist auch gut.
    *edit*Kann es nicht auch einen anderen Grund haben ? Wie gesagt mir ist das Problem bisher nur aufgefallen, wenn mir Geld abgezogen wurde. Und das macht doch gar keinen Sinn, weil der Anti Cheat ja nur reagieren sollte wenn mein Geld mehr ist.

    Einmal editiert, zuletzt von Oskaar1994 ()

  • Das passiert auf allen Servern, sofern sie es nicht verhindern. Ich kenn zahllose Fehler die dadurch entstehen können.


    Um das (einigermaßen) zu verhindern, lasse eine Variable hochzählen für den Spieler, wenn eine Gelddifferenz erkannt wird (da wo er jetzt bannt). Erst wenn die auf 3 oder 5 steht, dann wird der Spieler gebannt.



    Pseudocode:
    pVar != GetPlayerMoney => AnderepVar ++ ~~~> AnderepVar > 5 => Ban
    else => AnderepVar = 0


    Prinzip verstanden?

  • Nein habe ich leider noch nicht ganz verstanden. Könntest du mir ein Beispiel anhand meines Codes machen ?

  • :|


    public AntiCheat()
    {
    for(new playerid; playerid<MAX_PLAYERS; playerid++)
    {
    if(IsPlayerConnected(playerid))
    {
    if(GetPlayerMoney(playerid) > GetPVarInt(playerid, "money") )
    {
    SetPVarInt(playerid, "moneyhack", GetPVarInt(playerid,"moneyhack") + 1);
    if(GetPVarInt(playerid,"moneyhack") > 5)
    {
    SetPVarInt(playerid, "moneyhack", 0);
    ResetPlayerMoney(playerid);
    new mbformat[128];
    format(mbformat,sizeof(mbformat),"Anti Cheat has banned %s due to Money Hack",getPlayerName(playerid));
    SendClientMessageToAll(COLOR_RED,mbformat);
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Money Hack",90,tbanIP);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
    }
    }
    else SetPVarInt(playerid, "moneyhack", 0);
    if(PlayerSpawned[playerid] == 1 && sInfo[playerid][alevel] == 0)
    {
    new wep = GetPlayerWeapon(playerid);
    if(wep==1||wep==2||wep==3||wep==4||wep==5||wep==6||wep==7||wep==8||wep==9||wep==10||wep==11||wep==12||wep==13||wep==14||wep==15||wep==16||wep==17||wep==18||wep==22||wep==23||wep==24||wep==25||wep==26||wep==27||wep==28||wep==29||wep==30||wep==31||wep==32||wep==33||wep==34||wep==35||wep==36||wep==37||wep==38||wep==39||wep==40||wep==41||wep==42||wep==43||wep==44||wep==45)
    {
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Weapon Hack",90,tbanIP);
    new cheat[250];
    format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to weapon hack.",getPlayerName(playerid));
    SendClientMessage(playerid,COLOR_RED,cheat);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
    }
    new Float:Armour;
    GetPlayerArmour(playerid, Armour);
    if(Armour > 0)
    {
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Armour Hack",90,tbanIP);
    new cheat[250];
    format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to armour hack.",getPlayerName(playerid));
    SendClientMessage(playerid,COLOR_RED,cheat);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
    }
    if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK)
    {
    new tbanIP[50];
    GetPlayerIp(playerid,tbanIP,sizeof(tbanIP));
    TimeBan("Anti Cheat",getPlayerName(playerid),"Jetpack Hack",90,tbanIP);
    new cheat[250];
    format(cheat,sizeof(cheat),"{FF9900}Anti Cheat {FFFFFF}has banned {FF9900}%s {FFFFFF}due to jetpack hack.",getPlayerName(playerid));
    SendClientMessage(playerid,COLOR_RED,cheat);
    banTimer[playerid] = SetTimerEx("KickIT",500,0,"%i",playerid);
    }
    if(IsPlayerInAnyVehicle(playerid))
    {
    new speed = floatround(GetVehicleSpeedEx(GetPlayerVehicleID(playerid),0));
    if(speed>= 206)
    {
    new SpeedWarnString[250];
    format(SpeedWarnString,sizeof(SpeedWarnString),"[SPEED WARNING]%s(%i) is going over 205MPH. Speed: %i MPH. Spectate him !",getPlayerName(playerid),playerid,speed);
    SendAdminMessage(COLOR_RED,SpeedWarnString);
    }
    }
    }
    }
    }
    }

    Hab auch gleich mal die Einrückung richtig gemacht. 8o


    Dann sollte dieser Fehler eigentlich nicht wieder vorkommen.

  • Erstmal schonmal danke, aber das würde ja bedeuten erst wenn er 5 mal Geld gehackt hat wird er gebannt oder verstehe ich da was falsch ?


    Nein, der Timer wird nur 5x aufgerufen, um sicherzugehen, ob er das Geld wirklich gehackt hat.