Anti-Moneyhack geht nicht

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 ein kleines Anti-Moneyhack gebaut :D
    Aber es zieht einem manchmal beim oder kurz nach dem Login einfach das Geld von der Hand ab.
    Könnt ihr mir helfen?
    Wäre nett. Danke im vorraus


    MFG Moritz


    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(sInfo[playerid][eingeloggt] == 0)continue;
    if(sInfo[i][pGeld]==GetPlayerMoney(i))continue;
    if(sInfo[i][pGeld]>GetPlayerMoney(i))
    {
    sInfo[i][pGeld] = GetPlayerMoney(i);
    continue;
    }
    if(sInfo[i][pGeld]<GetPlayerMoney(i))
    {
    new string1[128];
    new echtgeld,stringgeld,betrag;
    echtgeld = GetPlayerMoney(i);
    stringgeld = sInfo[i][pGeld];
    betrag = echtgeld - stringgeld;
    new name[50];
    SetPlayerMoney(i,sInfo[i][pGeld]);
    GetPlayerName(i,name,sizeof(name));
    format(string1,sizeof(string1),"** ADMINSYTEM: %s ist unter Moneyhack verdacht. Betrag: $%i",name,betrag);
    sendToAdmin(2,string1);
    }
    }

    Mit freundlichen Grüßen!
    MoritzF


  • Hier bitte. :)


    Ich hoffe mir kann jemand helfen :)


    public Abfragen(playerid)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    //if(sInfo[playerid][eingeloggt] == 0)continue;
    if(sInfo[i][pGeld]==GetPlayerMoney(i))continue;
    if (sInfo[i][pGeld] >= GetPlayerMoney(i))
    {
    sInfo[i][pGeld] = GetPlayerMoney(i);
    continue;
    }
    else if (sInfo[i][pGeld] < GetPlayerMoney(i))
    {
    new string1[128];
    new echtgeld,stringgeld,betrag;
    echtgeld = GetPlayerMoney(i);
    stringgeld = sInfo[i][pGeld];
    betrag = echtgeld - stringgeld;
    new name[50];
    SetPlayerMoney(i,sInfo[i][pGeld]);
    GetPlayerName(i,name,sizeof(name));
    format(string1,sizeof(string1),"** ADMINSYTEM: %s ist unter Moneyhack verdacht. Betrag: $%i",name,betrag);
    sendToAdmin(2,string1);
    }
    }
    return 1;
    }

    Mit freundlichen Grüßen!
    MoritzF


    Einmal editiert, zuletzt von MoritzF ()

  • Versuchs mal so
    public Abfragen(playerid)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(sInfo[playerid][eingeloggt] == 1)continue;
    if(sInfo[i][pGeld]==GetPlayerMoney(i))continue;
    if (sInfo[i][pGeld] >= GetPlayerMoney(i))
    {
    sInfo[i][pGeld] = GetPlayerMoney(i);
    continue;
    }
    else if(sInfo[i][pGeld] <= GetPlayerMoney(i))
    {
    new string1[128];
    new echtgeld,stringgeld,betrag;
    echtgeld = GetPlayerMoney(i);
    stringgeld = sInfo[i][pGeld];
    betrag = echtgeld - stringgeld;
    new name[50];
    SetPlayerMoney(i,sInfo[i][pGeld]);
    GetPlayerName(i,name,sizeof(name));
    format(string1,sizeof(string1),"** ADMINSYTEM: %s ist unter Moneyhack verdacht. Betrag: $%i",name,betrag);
    sendToAdmin(2,string1);
    }
    }
    return 1;
    }

  • Nicht gleich übertreiben^^ (ban, kick)
    Wenn das Geld nicht mehr übereinstimmt updatest du dem Client seine anzeige einfach.
    Es muss auch kein Cheater sein da das PNS und Kasino dem Client Geld abzieht der Server davon aber nichts weiß.


    Außerdem würde ich dir vorschlagen foreach zu benutzen da er da von Grund auf nur die Spieler durchgeht die online sind: http://forum.sa-mp.com/showthread.php?t=481877



    Einmal pro sekunde checken lassen und fertig =)



    public Abfragen()
    {
    foreach (new i : Player)
    {
    if(sInfo[i][eingeloggt] == 0) continue;
    if(sInfo[i][pGeld] == GetPlayerMoney(i)) continue;
    else
    {
    new string1[128], name[25], betrag;
    betrag = GetPlayerMoney(i) - sInfo[i][pGeld];
    SetPlayerMoney(i,sInfo[i][pGeld]);
    GetPlayerName(i,name,sizeof(name));
    format(string1,sizeof(string1),"** ADMINSYTEM: %s ist unter Moneyhack verdacht. Betrag: $%i",name,betrag);
    sendToAdmin(2,string1);
    }
    }
    return 1;
    }


    stock SetPlayerMoney(playerid, money)
    {
    ResetPlayerMoney(playerid);
    return GivePlayerMoney(playerid,money);
    }

  • BTW. Soweit ist Moneyhack eigentlich nicht möglich.
    Solange dein Geld Serverseitig läuft.
    Sprunkautomaten geben auch Money, da würde ich aufpassen das es nicht zu Bugs führt.

    Sprunk Automaten geben Geld?
    Meinst du nicht eher Sprunk automaten 'ziehen' Geld ab?
    Man soll ja auch abfragen ob GetPlayerMoney größer ist und nicht kleiner.
    Sonst wäre ja irgendwie kein Sinn dahinter.

  • Das Problem ist hier ganz einfach zu erklären, das wird auch sicher nicht nur beim Login vorkommen, sondern auch irgendwann während dem normalen spielen.
    Warum?


    Das liegt an der Latenz zwischen Server und Client.


    Wenn SetPlayerMoney und GetPlayerMoney ziemlich zeitgleich aufgerufen werden (das kann ja bei einem Timer durchaus vorkommen, dass er zeitgleich (fast) mit dem Login ausgeführt wird), dann kann es dazu führen, dass ein falscher Wert zurückgegeben wird, je nach dem ob du Geld abgezogen oder hinzugefügt hast ein zu großer oder zu kleiner Wert. Das ist je nach Latenz zwischen Server und Client unterschiedlich. Außerdem kann es vorkommen, dass eine Spieler nicht mehr synchronisiert wird, dann wird das Geld bei ihm nicht mehr aktualisiert, das hat denselben Effekt, wie wenn ich mit einem Variablen-Hack hin gehe, und die Geld-Variable einfriere, jedoch ist es ein simples Verbindungsproblem, das zig tausend mal vorkommt. Gut, das nur am Rande.


    Wie kannst du verhindern, dass das Problem mit der Latenz zu Fehlern führt?
    Du zählst eine Spielervariable hoch, wenn das Geld nicht stimmt. Wenn die Spielervariable auf 3 ist (zum Beispiel du hast einen 1-Sekunden-Timer), dann wäre das Geld 3 Sekunden lang falsch (so groß ist kaum eine Latenz), dann hat der Spieler das Geld mit unfairen Mitteln bekommen. Wenn es nach dem zweiten mal zum Beispiel wieder übereinstimmt, dann lag es an der Latenz, und du setzt die Spielervariable einfach wieder auf 0.


    Generell würde ich auch nicht prüfen, ob der Spieler zu wenig Geld hat, weil es ja relativ egal ist, wenn der Spieler sich Geld weg-hackt, aber das bleibt dir überlassen.