[Hilfe] Dini beispiel speichern [easy]

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
  • Hy leute,


    kann mir einfach einer erklären wie ich dini speichere? Habe mir schon vieles durchgelesen usw.
    und brauchen jetzt ein Harmloses beispiel angenommen Geld speichern.


    Wie muss man das jetzt machen? ( Ohne Register/Login System )


    Danke

    < Beatboxen ist leicht > Beatboxen & Singen/Rappen ist schwerer >

  • Eigentlich ganz einfach:


    Wenn noch nicht getan, Dini oben im Script inkludieren

    Code
    #include <dini>


    Danach kannst du alle Funktionen aus dini.inc verwenden. Es gibt für jeden Datentyp (Int,Float,String) zwei Funktionen, eine zum Speichern eines Wertes und eine zum Laden eines Wertes. Die Funktionen brauchen den Dateinamen (z.B. "Userfiles/Spieler.txt"), den Namen der Zeile in der der Wert gespeichert werden soll (z.B. "Geld") und eventl. den Wert den sie entsprechend speichern sollen.
    Wenn du z.B. mit

    Code
    dini_IntSet("Userfiles/Spieler.txt","Geld",GetPlayerMoney(playerid));


    den Wert 150 in der Zeile "Geld" in der Datei "Spieler.txt" gesetzt hast, kannst du diesen mit

    Code
    new geld=dini_Int("Userfiles/Spieler.txt","Geld");


    wieder abrufen.


    Die wichtigsten Funktionen aus Dini:

    Code
    dini_Set(Dateiname[],Zeile[],Wert[]) //String
    dini_IntSet(Dateiname[],Zeile[],Wert) //Integer
    dini_FloatSet(Dateiname[],Zeile[],Wert) //Float
    
    
    dini_Get(Dateiname[],Zeile[])
    dini_Int(Dateiname[],Zeile[])
    dini_Float(Dateiname[],Zeile[])
  • Also wie ich das jetzt so ungefär verstanden habe :


    1. Ich muss dini speichern also bei Onplayerdisconnect
    2. Ich muss es wieder laden also onplayerconnect
    3. Das mit 150 verstehe ich nicht hab doch kein bock für jeden spieler dann 150 einzuschreiben :S


    Also das hier zum speichern bei Onplayerdisconnect


    dini_IntSet("Userfiles/Spieler.txt","Geld",GetPlayerMoney(playerid));


    und das hier bei Onplayerconnect


    new geld=dini_Int("Userfiles/Spieler.txt","Geld");

    < Beatboxen ist leicht > Beatboxen & Singen/Rappen ist schwerer >

  • Nein. Das da oben waren nur Beispiele, so einfach wird das nicht funktionieren.
    Für 150 musst du natürlich das aktuelle Geld des Spielers einsetzen und am besten änderst du auch den Dateipfad, wenn du die Daten für alle Spieler in einer Datei in einer Zeile speicherst wird sich wahrscheinlich irgendwann jemand beschweren...


    Am wahrscheinlich "einfachsten" ist es für denen Spieler eine eigene Datei zu erstellen, obwohl es auch in einer einzelnen Datei gehen würde.


    Wichtig ist außerdem, Spielern die noch keine eigene Datei haben erstmal eine zu erstellen.



    public OnPlayerConnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"Users/%s.txt",name);
    if(dini_Exists(file))
    SetPlayerMoney(playerid,dini_Int(fs,"Geld"));
    else
    dini_Create(fs);
    return 1;
    }


    public OnPlayerDisconnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"Users/%s.txt",name);
    dini_IntSet(file,"Geld",GetPlayerMoney(playerid));
    return 1;
    }


    Der Code sollte verständlich sein, wenn er zu kompakt ist frag einfach nach.

  • Ok..


    also


    1. ich bekomme undefined "fs" als error und das SetPlayerMoney = Ist das nicht schon in der dini include definiert (sauer Setplayermoney) ??
    2. Und wenn ich dann für jeden eine Datei .txt erstellt habe kann ich es so machen wie ich es oben geschrieben habe oder muss ich noch was beachten ??


    Achja...... Danke das du mir Hilft :)

    < Beatboxen ist leicht > Beatboxen & Singen/Rappen ist schwerer >

  • Ahh, das mit dem fs Error war mein Fehler, bin dran gewöhnt diese Strings fs zu nennen. Außerdem hab ich mich noch in OnPlayerConnect vertan, es gibt kein SetPlayerMoney, habe ich mir scheinbar eingebildet...


    So ist es richtig:

    public OnPlayerConnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"/Users/%s.txt",name);
    if(dini_Exists(file))
    GivePlayerMoney(playerid,dini_Int(file,"Geld"));
    else
    dini_Create(file);
    return 1;
    }


    public OnPlayerDisconnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"/Users/%s.txt",name);
    dini_IntSet(file,"Geld",GetPlayerMoney(playerid));
    return 1;
    }


    Du musst keine Dateien manuell erstellen, das macht das Script selbst, schau dir den Code unter OnPlayerConnect nochmal genauer an, vorallem den Teil mit dini_Create() ;)

    Einmal editiert, zuletzt von Anthrax ()

  • Also nur das hier eingeben :



    public OnPlayerConnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"Users/%s.txt",name);
    if(dini_Exists(file))
    GivePlayerMoney(playerid,dini_Int(file,"Geld"));
    else
    dini_Create(file);
    return 1;
    }


    public OnPlayerDisconnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"Users/%s.txt",name);
    dini_IntSet(file,"Geld",GetPlayerMoney(playerid));
    return 1;
    }


    Falls ja wird es trotzdem nicht erstellt :S im Scriptfile Ordner...
    Sorry wegen die Dummen fragen aber ich will es unbedingt lernen "ist sehr wichtig"!


    dini_Create(file); = erstellt eine Neue datei...<- macht es aber nicht :(

    < Beatboxen ist leicht > Beatboxen & Singen/Rappen ist schwerer >

  • Du hast den Ordner aber erstellt? Also Scriptfiles/Users?


    Hast du jetzt deine eigenen Callbacks einfach mit den beiden die ich gepostet habe ersetzt?
    In meinen ist aber sowieso noch ein kleiner Fehler, werd' wohl langsam müde: Vor die Dateinamen (die ja mit Ordnern beginnen) sollte noch ein "/", also
    public OnPlayerConnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"/Users/%s.txt",name);
    if(dini_Exists(file))
    GivePlayerMoney(playerid,dini_Int(file,"Geld"));
    else
    dini_Create(file);
    return 1;
    }


    public OnPlayerDisconnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"/Users/%s.txt",name);
    dini_IntSet(file,"Geld",GetPlayerMoney(playerid));
    return 1;
    }.

  • Was passiert denn? Einfach garnichts? Startet der Server, crasht er wenn jemand connected, usw...
    Wie gehst du genau vor?

  • Nein, also wir wollten ja das es erstmal eine datei für denn spieler im Scriptfile ordner erstellt oder? (%s.txt)


    Und das geht nicht. Die Datei wird nicht erstellt. Der Server funktioniert 1A und so ..

    < Beatboxen ist leicht > Beatboxen & Singen/Rappen ist schwerer >

  • Das heißt wenn du als Spieler connectest wird keine Datei erstellt? Das ist seltsam, jetzt muss ich es wohl selbst mal testen, moment...

  • Okay... sorry dass das so lange gedauert hat, musste noch 0.3 auf meine Root installieren.
    Für mich funktioniert der Code oben perfekt, der Fehler scheint bei dir zu liegen. Wenn du willst kannst du mir einen größeren Teil deines Scripts schicken/posten, am besten die kompletten OnPlayerConnect und OnPlayerDisconnect Callbacks... ;)

  • So gehts auch, aber so speicherst du direkt in Scriptfiles und nicht in Scriptfiles/Users ;)


    Das %s ist eine Art Platzhalter im String.
    format fügt in diesem Fall einige Variablen in den String ein, setzt also in unserem Fall mehrere Strings zusammen, nämlich "/Users/", den Spielernamen und ".txt".


    Für mehr Informationen dazu: http://wiki.sa-mp.com/wiki/Format

  • Jo gut das ham a jetzt schon bleibt nur noch das es speichert wie gehts nun weiter????? Achja könnte ich auch noch pBank dazu einfügen? ( <- weiß nicht genau wie das beispiel ausschauen würde )


    Danke :)

    < Beatboxen ist leicht > Beatboxen & Singen/Rappen ist schwerer >

  • Du kannst den Code oben eigentlich für alle weiteren Werte die du speichern willst kopieren, musst halt nur eventuell die Funktionen auf den jeweiligen Datentyp abändern. Speichern und Laden tut das da oben.

  • Ist es so nicht richtig??


    public OnPlayerConnect(playerid)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"%s.txt",name);
    if(dini_Exists(file)) // Die datei ist im Ordner vorhanden

    {
    GivePlayerMoney(playerid,dini_Int(file,"Geld"));
    PlayerInfo[playerid][pBank] = dini_Int(file,"Bank");
    }

    else

    {
    dini_Create(file); // Die datei gibt es nicht und wird deswegen jetzt erstellt
    GivePlayerMoney(playerid,dini_Int(file,"Geld"));
    PlayerInfo[playerid][pBank] = dini_Int(file,"Bank");
    }

    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    new name[MAX_PLAYER_NAME]; GetPlayerName(playerid,name,sizeof(name));
    new file[64]; format(file,sizeof(file),"%s.txt",name);
    dini_IntSet(file,"Geld",GetPlayerMoney(playerid));
    dini_IntSet(file,"Bank",PlayerInfo[playerid][pBank]);



    return 1;
    }


    Speichert aber nicht und die liste die erstellt wurde bleibt leer...

    < Beatboxen ist leicht > Beatboxen & Singen/Rappen ist schwerer >

  • Inwiefern leer?
    Soweit ich das jetzt sehe sollte das da oben funktionieren, du solltest aber wenn die Datei nicht erstellt wird

    GivePlayerMoney(playerid,dini_Int(file,"Geld"));
    PlayerInfo[playerid][pBank] = dini_Int(file,"Bank");

    weglassen, da es die Einträge "Geld" und "Bank" ja noch garnicht gibt, sie werden wenn eine neue Datei erstellt wurde erst beim ersten Ausloggen mit den Set Funktionen erstellt.