[FRAGE]Anti-Moneyhack funktioniert 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
  • hi leute;


    ich habe versucht einen Anti-Moneyhack zu schreiben, aber wenn ich den server öffne, kommen tausende warnungen, das dieser spieler angeblich einen Moneyhack benutzt hat. Das aber nicht stimmt.
    hier der code

    public OnPlayerUpate(playerid)
    {
    new i;
    new geld, hackername[MAX_PLAYER_NAME], string2[128];
    for(i=0;i<MAX_PLAYERS;i++)
    {
    GetPlayerName(i, hackername, sizeof(hackername));
    geld = GetPlayerMoney(i);
    if(geld + 100000)
    {
    format(string2, sizeof(string2), "[AdmWarnung] %s benutzt möglicherweise einen Moneycheat!", hackername);
    SendAdminMessage(COLOR_RED2, string2);
    print(string2);
    }
    }
    return 1;
    }


    was habe ich falsch gemacht??
    mfg xXganzereuroXx

  • Erstmal On Player update ist schlecht weil das viel zu oft wiederholt wird und dein Server nur unnötig auslastet.


    Dann hast du hier eine Abfrage


    if(geld + 100000)


    Diese sagt aber nicht eindeutig mit was sie verglichen werden muss.
    Du kannst z.B. eine Variable mit dem Alten und ein mit dem neuen geld machen
    wäre dann die Abfrage so


    if(neugeld + 100000 > altgeld)

  • jeztz hab ich's so, und es funtzt immer noch nicht
    forward Moneyhack();
    public Moneyhack()
    {
    new i;
    new neugeld, hackername[MAX_PLAYER_NAME], string2[128];
    for(i=0;i<MAX_PLAYERS;i++)
    {
    GetPlayerName(i, hackername, sizeof(hackername));
    neugeld = GetPlayerMoney(i);
    new altgeld = GetPlayerMoney(i);
    if(neugeld + 100000 > altgeld)
    {
    format(string2, sizeof(string2), "[AdmWarnung] %s benutzt möglicherweise einen Moneycheat!", hackername);
    SendAdminMessage(COLOR_RED2, string2);
    print(string2);
    }
    }
    return 1;
    }

  • Wenn du das so machst wird das niemals klappen, da neugeld und altgeld genau den gleichen Wert enthält. Also wird neugeld + 100000 auch IMMER größer als altgeld sein. Somit würde dieser Antimoneyhack immer melden, dass der Spieler cheatet. Am besten du entstellst am Anfang des Scripts eine Geld Variable für jeden Spieler, mit welcher du dann jede Geldtransaktion in deinem Script durchführst. Dann kannst du auch ganz einfach überprüfen ob jemand Geld ercheatet, indem du einfach überprüfst ob der GetPlayerMoney(playerid) einen höheren Wert als deine Geldvariable enthält.

  • Naja wenn du einen ganz neuen Gamemode hast, brauchst du eine GeldVariable also:
    new money[MAX_PLAYERS];
    Immer wenn sich dein Geld ändern soll benutzt du nicht GivePlayerMoney(playerid) sondern einfach:
    money[playerid] =+ / =- Betrag ; // Betrag ist der Preis o.Ä.
    Dann brauchst du eine public-Function die jede Sekunde aufgerufen wird per Timer.
    Die funktion muss jeden Spieler in einer Schleife durchgehen und dann einfach überprüfen ob GetPlayerMoney(i) höher oder niedriger ist als money. Dann musst du einfach über GivePlayerMoney den Betrag des Geldes in GTA auf den von money[playerid] bringen.
    Ich schreib dir jetzt mit Absicht nicht die fertige Funktion, weil nur so kannst du es wirklich lernen. Du hast die Idee, und jetzt musst du diese nur noch umsetzen.

  • kleine sache nebenbei...
    wenn du for(i=0;i<MAX_PLAYERS;i++)
    {

    bei on player update reinmachst du überprüft er das für alle möglichen slots belegt oder nicht belegt...
    du hast bei onplayerupdate schon playerid im header drinnen und das wird bei jedem spieler ausgeführt. also wird for(i=0;i<MAX_PLAYERS;i++)
    {

    überflüssig und du kannst einfach playerid reinschreiben

  • hier mein Anti Geld Cheat aussen Kopf geschrieben



    new pCash[MAX_PLAYERS];


    stock GivePlayerCash(playerid, Amount)
    {
    pCash[playerid] += Amount;
    GivePlayerMoney(playerid, Amount);
    return true;
    }


    stock ResetPlayerCash(playerid)
    {
    pCash[playerid] = 0;
    ResetPlayerMoney(playerid);
    return true;
    }


    stock SetPlayerCash(playerid, Amount)
    {
    ResetPlayerCash(playerid);
    GivePlayerCash(playerid, Amount);
    return true;
    }


    stock GetPlayerCash(playerid)return pCash[playerid];


    stock CheckAntiHack(playerid)
    {
    if(GetPlayerCash(playerid) != GetPlayerMoney(playerid))
    {
    new str[128],pName[24];
    new Gecheatet = GetPlayerMoney(playerid) - GetPlayerCash(playerid);
    GetPlayerName(playerid, pName, 24);
    format(str, 128, "%s versuchte gerade %d$ zu cheaten", Gecheatet);
    SendAdminMessage(Farbe, str);//Farbe mit deiner austauschen
    SetPlayerCash(playerid, pCash[playerid]);
    }
    }


    unter OnPlayerUpdate



    public OnplayerUpdate(playerid)
    {


    CheckAntiHack(playerid);


    return true;
    }

    RFT

  • ich habs jz mal so gemacht, und es funktioniert nicht(keine errors oder warnings)


    forward Moneyhack();
    public Moneyhack()
    {
    new i;
    new hackername[MAX_PLAYER_NAME], string2[128];
    for(i=0;i<MAX_PLAYERS;i++)
    {
    if(GetPlayerMoney(i) > cashmoney[i] && cashmoney[i] - GetPlayerMoney(i) > 100000)
    {
    GetPlayerName(i, hackername, sizeof(hackername));
    //if(cashmoney =+ / =- 100000)


    format(string2, sizeof(string2), "[AdmWarnung] %s benutzt möglicherweise einen Moneycheat!", hackername);
    SendAdminMessage(COLOR_RED2, string2);
    print(string2);


    }
    cashmoney[i] = GetPlayerMoney(i);
    }
    return 1;
    }