Geld Bug

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
  • Abend liebe Community,


    Ich arbeite momentan nun an meinen eigenen Geldsystem und habe dort leider ein paar Bugs!


    Ich möchte das das Geld, sofern der Spieler keins Besitzt wie bei den Spielfertigen Geld 00000,00 ist! Allerdings sieht es bei mir so aus:
    //Die Centbeträge sind richtig! Nur VOR dem Komma fehlen noch 4x 0 .


    Und so sieht es aus wenn ich mir 6 mal eine Beliebige Summe Geld gegeben habe(Das ist ab dem 6 mal so und wird dann nicht besser! Davor geht es fast ausser das mit den "0" :(
    //Hier sieht man das die Cent Beträge 690 sind!? Und vor der 253 müssten noch 2x 0 sein....


    Hier mal der Code des Geld Systems(Momentan habe ich es so damit ich die Übersicht habe):



    public GeldUpdate(playerid)
    {
    new Geldstring[25];
    new Eurogeld = sInfo[playerid][Euro];
    new Centgeld = sInfo[playerid][Cent];
    //Das was hier mit den // Makiert ist ist das wo Abgefragt wird was passieren soll wenn %d viel Cent vorhanden sind die dann z.B. im Spieler Account zustande kommen könnten da es nur + gerechnet wird! Ich will aber das z.B. 70 + 70= //1,40 und nicht 140
    /* if(Centgeld == 100)
    {
    Centgeld = 0;
    Eurogeld += 1;
    }
    if(Centgeld > 100 && Centgeld < 200)
    {
    Centgeld -= 100;
    Eurogeld += 1;
    }
    if(Centgeld > 200 && Centgeld < 300)
    {
    Centgeld -= 200;
    Eurogeld += 2;
    }
    */
    if(Eurogeld == 0 && Centgeld == 0)
    {
    format(Geldstring,25," 00000,00");
    }
    if(Eurogeld == 0 && Centgeld <= 9)
    {
    format(Geldstring,25," 00000,0%d",Centgeld);
    }
    if(Eurogeld == 0 && Centgeld >= 10)
    {
    format(Geldstring,25," 00000,%d",Centgeld);
    }
    if(Eurogeld <= 9 && Centgeld <= 9)
    {
    format(Geldstring,25," 0000%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99 && Centgeld <= 9)
    {
    format(Geldstring,25," 000%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 999 && Centgeld <= 9)
    {
    format(Geldstring,25," 00%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 9999 && Centgeld <= 9)
    {
    format(Geldstring,25," 0%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99999 && Centgeld <= 9)
    {
    format(Geldstring,25," %d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 9 && Centgeld >= 10)
    {
    format(Geldstring,25," 0000%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99 && Centgeld >= 10)
    {
    format(Geldstring,25," 000%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 999 && Centgeld >= 10)
    {
    format(Geldstring,25," 00%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 9999 && Centgeld >= 10)
    {
    format(Geldstring,25," 0%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99999 && Centgeld >= 10)
    {
    format(Geldstring,25," %d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 9 && Centgeld <= 9)
    {
    format(Geldstring,25," 0000%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99 && Centgeld <= 9)
    {
    format(Geldstring,25," 000%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 999 && Centgeld <= 9)
    {
    format(Geldstring,25," 00%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 9999 && Centgeld <= 9)
    {
    format(Geldstring,25," 0%d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99999 && Centgeld <= 9)
    {
    format(Geldstring,25," %d,0%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 9 && Centgeld >= 10)
    {
    format(Geldstring,25," 0000%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99 && Centgeld >= 10)
    {
    format(Geldstring,25," 000%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 999 && Centgeld >= 10)
    {
    format(Geldstring,25," 00%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 9999 && Centgeld >= 10)
    {
    format(Geldstring,25," 0%d,%d",Eurogeld,Centgeld);
    }
    if(Eurogeld <= 99999 && Centgeld >= 10)
    {
    format(Geldstring,25," %d,%d",Eurogeld,Centgeld);
    }
    TextDrawSetString(Textdraw12,Geldstring);
    return 1;
    }


    Mein Geldgebe Befehl sieht so aus:

    stock GebeGeld(playerid,Eurobetrag,Centbetrag)
    {
    if(Eurobetrag >= 0)
    {
    sInfo[playerid][Euro] += Eurobetrag;
    sInfo[playerid][Cent] += Centbetrag;
    }
    if(Eurobetrag < 0)
    {
    sInfo[playerid][Euro] -= Eurobetrag;
    sInfo[playerid][Cent] -= Centbetrag;
    }
    GeldUpdate(playerid);
    return 1;
    }


    Und in mein SpielerSpeichern stock sieht das so aus:

    if(sInfo[playerid][Cent] == 100)
    {
    sInfo[playerid][Cent] = 0;
    sInfo[playerid][Euro] += 1;
    }
    if(sInfo[playerid][Cent] > 100 && sInfo[playerid][Cent] < 200)
    {
    sInfo[playerid][Cent] -= 100;
    sInfo[playerid][Euro] += 1;
    }
    if(sInfo[playerid][Cent] > 200 && sInfo[playerid][Cent] < 300)
    {
    sInfo[playerid][Cent] -= 200;
    sInfo[playerid][Euro] += 2;
    }


    Ich hoffe das mir einer von euch Weiterhelfen kann!



    Mit freundlichen Grüßen
    LogispireMode

  • Klingt irgendwie Logisch(Vom sehen her xD) aber ich verstehe es nicht :(


    Zitat

    Bei Cent anstatt == 100 >= 100 warum ??


    Spieler hat 99 cent bekommt 2 dan ist es über 100

    Naja wenn ich geld gebe durch irgendwas, dann ist vllt. 120 Cent oder so vorhanden und dann lasse ich - 100 rechnen sodass er nur noch 20 cent hat und 1 euro mehr^^

  • Klingt irgendwie Logisch(Vom sehen her xD) aber ich verstehe es nicht :(


    Naja wenn ich geld gebe durch irgendwas, dann ist vllt. 120 Cent oder so vorhanden und dann lasse ich - 100 rechnen sodass er nur noch 20 cent hat und 1 euro mehr^^


    ich hatte dir es doch in der pn geraten das mit floats zu machen :D warum hast du das nicht gemacht das wäre so simpel gewesen



    new Float:Geld;
    ocmd:geld(playerid,params[])
    {
    new Float:fMyFloat,string2[30];
    if(sscanf(params,"f",fMyFloat))return SendClientMessage(playerid,-1,"Benutzung: /geld [betrag]");
    format(string2,64,"%.2f",fMyFloat);
    printf("%s",string2);
    new Float:fMyFloat2 = floatstr(string2);
    printf("%f",fMyFloat2);
    Geld += fMyFloat2;
    return 1;
    }
    ocmd:show(playerid)
    {
    new string[64];
    format(string,64,"Den Geld ist %05.2f",Geld);
    SendClientMessage(playerid,-1,string);
    return 1;
    }


    ein kleines bespiel kannst ja mal testen


    //edit
    das mit dem Format-Operator für Ausgaben ist sehr simpel es werden dabei so gesehen plätze frei gehalten bei %03d werden drei plätze freigehalten
    also steht im textdraw 000 solltest du %06d verwenden enthält deine ausgabe 6 Nullen so fern wie der wert der variabel auch 0 ist daher
    000000 . Sagen wir der Wert der Variabel hat den wert 125 so wird dies so angegeben 000125. Hat die Variabel den Wert von 12 999 111
    so wird dies so dargestellt 12999111 die nullen sind nicht mehr sichtbar da sie den platz freigehalten haben für einen wert reduziert sich der wert auf
    99 111 so wird es so dargestellt 099111 also wie man sehen kann sind 6 Werte schon "vorgegeben", welche jeweils gefüllt werden. Nun verstanden?

    Einmal editiert, zuletzt von IPrototypeI ()

  • ich hatte dir es doch in der pn geraten das mit floats zu machen :D warum hast du das nicht gemacht das wäre so simpel gewesen


    hahaha Simpel vllt. für einen wie dich nur das sah so kompliziert aus... XD


    PS: Habs mal rein gehauen und es geht, iin der console schreibt er einmal 70.0 und danach 70.00000 und wenn ich show mache dann halt 00000.70^^ ich werde es mir aber mal morgen in ruhe angucken und gegebenenfalls übers WE da ich da weg bin und zeit habe^^ wenn ich wieder oder immernoch ein problem habe sag ich bescheid^^

  • ich hatte dir es doch in der pn geraten das mit floats zu machen :D warum hast du das nicht gemacht das wäre so simpel gewesen


    hahaha Simpel vllt. für einen wie dich nur das sah so kompliziert aus... XD


    PS: Habs mal rein gehauen und es geht, iin der console schreibt er einmal 70.0 und danach 70.00000 und wenn ich show mache dann halt 00000.70^^ ich werde es mir aber mal morgen in ruhe angucken und gegebenenfalls übers WE da ich da weg bin und zeit habe^^ wenn ich wieder oder immernoch ein problem habe sag ich bescheid^^


    Also ich check jetzt nicht wirklich wo da der fehler sein sollte



    also es geht ohne probleme nur mogelt er ein bissle beim unkonvertieren vom string zur float.
    das er aus 11.00
    10.99 macht
    aber der grund wieso ich es zum string konvertiere ist das ich das typische format habe mit zwei dezimalen.
    weil so kannst du so viele zahlen wie du willst hinter dem koma eingeben es wird dennoch nur die zwei dezimale genommen.

  • @IPrototypeI


    So ich bin nun wieder Zuhause und habe Internet Zugriff :D , es Funktioniert auch alles so wie es eig. soll aber 4 Sachen stören mich noch:
    1. Kp wieso aber ich bekomme es,glaube ich, nicht richtig gespeichert weshalb das Geld auch nicht richtig Geladen wird!
    2. Das mit den Runden nervt ein bisschen, sollte nicht passieren^^ Ich habe auch irgendwo im Wiki schon gelesen das man Auf und Abrunden kann, aber ich würde es lieber mit den zwei angegebenen stellen nach dem komma also die cent so behalten wie sie eingegeben werden sprich 35 bleibt 35 und nicht 34 ^^


    3. Wenn ich diese Floats in eine SCM packe habe ich ein riesen problem xD da steht dann z.B. NICHT : Gehalt: 759,38 € sondern: Gehalt: 000759,370009 €


    Wie kann ich diese probleme lösen? Weisst du da zufälliger weise als Script Profi weiter? :D


    4. Wo müsste ich die Abfrage rein hauen ob der spieler nun 99.999,99 € auf der hand hat den bei 100k wird das textdraw nach unter verschoben was nicht sein soll, ich habs gerade beim geld gebe befehl und ein return 0; wenn es schon 99k und 99 cent sind....


    Ich stehe gerade auf mein Stein und komme nicht wirklich drauf....



    Mit freundlichen Grüßen
    LogispireMode


  • ich hoffe du weisst das dies floats sind daher bringt es nix wenn die tabellen einstellung entweder falsch sind , wenn du MySQL benutzt oder bei dini oder osnst einem filesystem das als integer speicherst.


    Mir ist auch aufgefallen das das ganze nur ab und zu(selten) macht mit dem .999... nach dem Koma.


    Zum dritten Thema ich habs dir schon zwei mal erklärt , da wird dir wohl selbst die lösung einfallen(wenn nicht dann denk ehrlich mal daran damit aufzuhören)
    %05.2f | %05d | %.2f


    und zu deiner vierten frage kannst du das nochmal erklären ich kan mir darunter nix vorstellen was du genau meinst.
    screens würden vllt helfen als auch eine bessere erklärung

  • naja ich speicher mit dini (Ja ich weiss musst mir nichts sagen:: GIBT BESSERE^^)


    -.- ich hab irgendwie ein hänger aber egal....



    Naja:


    Wenn der Spieler Geld auf der Hand hat und das <= 99999,99 ist, wird alles richtig angezeigt und ich habe kein problem.
    aber sobald der spieler 100k hat wird die box vom textdraw nach unten gezogen weil da kein platz mehr ist....


    wie diese abfrage aussehen muss weiss ich aber ich weiss gerade nicht wo... ich werde es aber noch mal weiter probieren und mal gucken ob es klappt^^


    PS: Mir ist aufgefallen, ich kann garkein geld abziehen^^ also -float.... geht nicht ;( (hab mich auch noch nie wirklich mit floats beschäftigt da ich diese eig. nie brauche .....)