Wie am besten Geld überprüfen

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
  • Wie die Überschrift beschreibt. Wie überprüfe ich am Besten das Geld der Datenbank, mit dem Geld auf der Hand ?
    Und wie speicher ich am besten sofort das geld wenn geld einkommt wie zum Beispiel bei einem ' /cash ' CMD ?


    So damit kein Geldhacker ne Chance hat

    -Ted.

  • Ich versteh nicht wirklich was du jetzt genau haben willst?
    Verstehst du nicht wie du das Geld aus der db ausließt, oder willst du das Geld einfach nochmal in ne variable speichern um eventuellen "Hacks" vorzubeugen.


    Wenn das so ist, ist es bei einem bestehenden Script am einfachsten einfach GivePlayerMoney neu zu definieren. Natürlich kannst du auch ein neues "#define" machen.


    Wäre dann sowas in der Art, wenn du ganz einfach weiterhin giveplayermoney benutzen willst:

    Code
    native __GivePlayerMoney(playerid, money) = GivePlayerMoney;
    #define GivePlayerMoney(%0,%1) (SetPVarInt(%0, "geld", GetPVarInt(%0, "geld")+%1), __GivePlayerMoney(%0,%1))


    Natürlich musst du das dann für ResetPlayerMoney ergänzen, aber das sollte ja jetzt funktionieren ;)

  • Ich könnte die zu PVarInt's raten.
    Ich hab mein "Anti Money Hack System" so gemacht:


    Nach jedem Befehl wo der Spieler Geld bekommt / oder abgezogen wird,
    wird der Account Gespeichert.
    ---
    Dann habe ich bei OnPlayerConnect ganz einfach einen Timer erstellt,
    der das Geld aus der Datenbank ausliest, und es dem Spieler per SetPlayerMoney gibt.
    ---
    Da nachdem man sich mit z.b. Sobeit Geld gecheatet hat, es nicht gespeichert wird.
    Wird das Geld "reseted".


    Beispiel:


    Du hast 5000$
    Du Kaufst dir im Ammunation eine Weste -> 2000$ werden Abgezogen -> Spieler wird gespeichert.
    In der Datenbank stehen nun 3000$.


    Du versuchst dir jetzt Geld zu Cheaten (Der Timer läuft die ganze Zeit, sagen wir jede 1000 ms wird er "aufgerufen")
    Du gibst dir 1000$. Auf der Hand hast du nun 4000$, jedoch wird der Timer "Aktiviert" oder aufgerufen, und gibt die die 3000$ auf die Hand die in der datenbank stehen.
    Somit sollte das Money Cheaten unmöglich sein ;)


    MfG

  • zu PVars ? Zwischenspeichern ? Ich habe ne MySQL Datenbank r8 BlueG also zu Info :o

    -Ted.

  • In der Theorie dachte ich mir ich mah das so


    - Geld auf datenbank
    - Timer Überprüft Geld auf Datenbank + Geld auf Hand
    - Stimmt nicht überein = Kick/ban


    müsste ich 2 Timer laufen lassen ? eins das ständig geld speichert ? (nicht so schlau oder?)
    oder einfach jedes mal bei einer Geldübergabe das Geld speichern ? ist doch genau so fressend oder ?


    allerdings fällt es mir etwas schwerer es umzusetzen


    und ja, dini nicht so toll :D

    -Ted.

  • Das mit den PVars funktioniert trotzdem.
    Du musst halt trotzdem beim Speichern die PVar Variante in dein Speichersystem umwandeln.


    Ich hab das ganze so gemacht :)
    //Ganz oben
    new Money[MAX_PLAYERS];
    forward CheckMoney(playerid)


    public CheckMoney(playerid)
    {
    if(GetPlayerMoney(playerid) != Money[playerid])return SendClientMessage(playerid,farbe,"Du hast gecheatet!");
    return 1;
    }


    //OnPlayerConnect
    SetTimerEx("CheckMoney",1000*5,1,"i",playerid);//Alle 5 Sekunden wird der Timer aktualisiert.


    //Beim Laden des Spielers
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,MAX_PLAYER_NAME);
    Money[playerid] = mysql_int("Spieler","Geld", "Name", name);


    //beim Speichern
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,MAX_PLAYER_NAME);
    mysql_SetInt("Spieler", "Geld", Money[playerid], "Name", name);


    stock AGivePlayerMoney(playerid,amount)
    {
    GivePlayerMoney(playerid,amount);
    Money[playerid] += amount;
    return 1;
    }


    Anschließend könntest du in der Theorie AGivePlayerMoney benutezn um dem Spieler das Geld zu geben.
    Natürlich musst du das Laden und das Speichern anpassen.
    Je nach dem, wie du deine Daten speicherst und lädst :)



    mfg Pinguin - German Reallife Unlimited by SaN

  • Ehrlich gesagt is es totaler Schwachsinn, das Geld nach jeder Transaktion auf ne Datenbank zu schreiben. Dafür sind Variablen nunmal da.
    In meinem System, dass ich oben beschrieben habe, wird das geld einfach in die Obst gespeichert. Mit einem globalen Update Timer kannst du die beiden werte vergleichen und bei Ungleichheit das geld resetten, bzw den spieler kicken.


  • public OnPlayerUpdate(playerid)
    {
    if(GetPlayerMoney(playerid) < SpielerInfo[playerid][sGeld])
    {
    GivePlayerMoney(playerid,SpielerInfo[playerid][sGeld] - GetPlayerMoney(playerid));
    }
    if(GetPlayerMoney(playerid) > SpielerInfo[playerid][sGeld])
    {
    GivePlayerMoney(playerid,SpielerInfo[playerid][sGeld] - GetPlayerMoney(playerid));
    }
    return 1;
    }


    Einfach die Enumstrukturen ändern, und das Geld im Overlay passt sich immer den in der Variable an.


  • Bist du verrückt geworden? :D
    OnPlayerUpdate macht dir das gesammte Script kaputt xD
    Da ist es besser, wenn du dein System in einen Timer packst. (Der verbraucht weniger)
    Außerdem kannst du das Geld dann auch direkt resetten (ResetMoney etc) und ihm dann das Geld der Variable geben ;)

  • OnPlayerUpdate macht dir das gesammte Script kaputt xD

    Dann dürfte ja garkein GF Script nur ansatzweise Starten.
    Überdenke dein Aussage bitte nocheinmal.
    Ich nutze diesen einen Ausschnitt selbst in meinen Script und habe damit keine Probleme.

    ähm denk doch mal nach, OnPlayerUpdate is doch eig ein Timer, da OnPlayerUpdate sowieso ausgeführt wird, ist es eigendlich logischer es darein zu packen,


    als für jeden spieler nen timer zu machen.


    Man kann OnPlayerupdate für kleine Sachen verwenden,
    aber man sollte es nicht zubomben wie in einem GF.
    Schonender wird es erst bei einer größeren Spielermenge.


    Zitat

    Money[playerid] = mysql_int("Spieler","Geld", "Name", name);
    mysql_SetInt("Spieler", "Geld", Money[playerid], "Name", name);


    Deine MySql Speichermethode ist voll für den *****. Wenn mehrer Spieler Online sind, und diese im ganzen Script sitzt,
    werden dadurch noch mehr Resourcen verbraucht, weil das schon fast wie DINI fungiert.
    Für jedes UPDATE eine neue Abfrage.
    Dies mag für Anfänger ja ganz gut sein aber große Nutzen im Script hat dies nicht.
    Mann kann die P&N´s sowie die Tuningshops herrausfinden und somit das Geld dann abziehen lassen.


    mit freundlichem Gruß
    Timo S.

    2 Mal editiert, zuletzt von huGGy () aus folgendem Grund: Text

  • Ähm sorry huggy?
    Willst du mich eigentlich verarschen?
    Das ist doch genau das, was ich die ganze Zeit sage. Dass man das Geld in ner variable speichern sollte und nicht in MySQL, weils einfach zu viele Ressourcen verbraucht.
    Aber Nein, du kamst natürlich nichtmal lesen und sagst, dass meine Methode, gleich deiner Methode firm arsch is?

  • Das kann man so schon sagen,
    aber die Methode wie der Speichern lässt,
    geht genauso auf die Resourcen wie DINI.


    DINI ist nur so weil Pro DINI_SET / DINI_GET folgendes passiert.

    Dateiöffnen
    1Zeile Schreiben / Lesen
    Datei Schließen

    Danach geht es wieder von vorne los.


    Bei seiner MySql speicher Methode ist das so
    Schreiben

    1 Spalte aktualisieren ( 1 row )

    Lesen

    query abschicken
    ergebniss un variable schreiben
    querry schliesen

    Das kommt fast auf das selbe von des Resourcen.
    Da für 10 mal Laden diese Passage 10mal Ausgeführt wird was auch mit einmal gehen würde.


    Ich hoffe du versteht nun dass wenn man mit MySql falsch umgeht es genauso enden kann wie mit DINI.



    @Sry4pwn:
    Sorry habe den flaschen Teil Zitiert


    Zitat

    Das ist doch genau das, was ich die ganze Zeit sage. Dass man das Geld
    in ner variable speichern sollte und nicht in MySQL, weils einfach zu
    viele Ressourcen verbraucht.

    Das habe ich nie bestritten.
    Ich habe nur auf diesen Absatz etwas geantwortet.


    Zitat

    Richtig. Allerdings sind tuning und getrankeautomaten dann kostenlos.

    Das nam diese auch per Koordinaten feststellen kann und dann auch das Geld wieder geben kann.
    Getränkeautomaten kann man auch an der Animation erkennen.


    Ich verstehe deine Reaktion gerade nicht.




    mit freundlichem Gruß
    Timo S.

  • Wenn ich deine Methode Verwende, Worauf muss ich dann achten wenn ich zB Geld mit einem befehl gebe ?

    -Ted.

  • Bei meiner Methode musst du einfach die Variable + oder - setzen.
    Abfragen nicht mit GetPlayerMoney sondern mit SpielerInfo[playerid][sGeld].

    SpielerInfo[playerid][sGeld] += 5;
    SpielerInfo[playerid][sGeld] = SpielerInfo[playerid][sGeld] + 5;


    oder


    SpielerInfo[playerid][sGeld] -= 5;
    SpielerInfo[playerid][sGeld] = SpielerInfo[playerid][sGeld] - 5;


    Du musst die Variable nur auf dein Script anpassen ( ändern ) da du diese
    warscheinlich nicht hast.