|TUTORIAL| Arbeiten mit SetPVarInt.

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
  • Hallo Community,
    da in ICQ dessöfteren immer wieder angefragt wird, wie man denn mit SetPVarInt und GetPVarInt arbeitet, habe ich mich dazu entschlossen, dass kurz zu erklären. Im Prinzip ist diese Funktion so einfach wie SendClientMessage.
    SetPVarInt ist die ressourcenschonendere Variante, ausserdem finde ich sie besser.


    Das Include ,,a_players´´ wird benötigt.
    Parameter und Erklärung:
    SetPVarInt(playerid, varname, int_value); // playerid ist die SpielerID, für welche der Wert gesetzt werden soll. varname ist einfach nur der Name der anzulegenden Variable. int_value ist der Wert der Variable, sie darf in diesem Falle nur aus Zahlen bestehen, weder Komma noch irgendetwas anderes.
    GetPVarInt(playerid, varname); // Wie immer ist "playerid" die SpielerID, von dem das Ganze geholt werden soll. varname wieder einmal der Variablenname der auch bei SetPVarInt gesetzt wurde, ein Beispiel für GetPVarInt unter den Beispielen. GetPVarInt gibt einfach den entsprechenden Wert zurück, wo ihr in einlest ist eure Sache.


    Filterscripts und GameModes:
    Diese neue Art von Variable kann von jedem Script abgerufen, geändert und gelöscht werden, welche auf dem Server aktiv sind, desshalb solltet ihr aufpassen, dass ihr nicht in einem Filterscript, welches ihr auf eurem Server verwendet, nicht den selben Namen wie in dem GameMode nehmen.

    Beispiele:
    if(strcmp(cmdtext, "/aktiv", true) == 0) { SendClientMessage(playerid, FARBE, "Der Status ,,Aktiv´´ wurde auf 1 gesetzt."); SetPVarInt(playerid, "Aktiv", 1); return 1; }


    if(strcmp(cmdtext, "/inaktiv", true) == 0) { SendClientMessage(playerid, FARBE, "Der Status ,,Aktiv´´ wurde auf 0 gesetzt."); SetPVarInt(playerid, "Aktiv", 0); return 1; }


    if(strcmp(cmdtext, "/status", true) == 0)
    {
    if(GetPVarInt(playerid, "Aktiv") == 1) { return SendClientMessage(playerid, FARBE, "Der Status ,,Aktiv´´ ist 1."); }
    if(GetPVarInt(playerid, "Aktiv") == 0) { return SendClientMessage(playerid, FARBE, "Der Status ,,Aktiv´´ ist 0."); }
    return 1;
    }



    new VAR;
    VAR = GetPVarInt(playerid, "Aktiv"); // In die Variable Var wird jetzt also mit Hilfe der Funktion GetPVarInt der Wert, welcher mit SetPVarInt gesetzt wurde, in die Variable eingelesen. Sinnlos aber egal.


    Es gibt also GetPVarInt und SetPVarInt. Mit Hilfe von GetPVarInt wird der Wert ermittelt, mit SetPVarInt wird der Wert gesetzt. Unter OnPlayerDisConnect bitte noch jeweils folgendes hinzufügen:
     DeletePVar(playerid, "Aktiv"); // Löscht die Variable des Spieler wieder, so dass der neue Spieler wieder eine neue hat.
    Sollte eine Variable noch nicht gesetzt sein, du sie aber trotzdem abrufen willst, wirst du die Antwort 0 erhalten.




    Mit freundlichen Grüßen,
    Flip

    6 Mal editiert, zuletzt von Flip ()

  • Warum nur auf Int beschränken?
    Tutorial finde ich schlecht, da die Funktion nicht erklärt wird, sondern nur ein Beispiel gegeben wird.
    Falls du mir widersprechen möchtest, und sagst, dass das:


    Zitat

    Mit Hilfe von GetPVarInt wird der Wert ermittelt, mit SetPVarInt wird der Wert gesetzt.

    eine Erklärung sein soll, dann gute Nacht.
    Ich kann echt nicht verstehen, wer so ein Tutorial freischaltet.

  • Ein Moderator scheinbar, aber du hast schon Recht, ein Tutorial ist das echt nicht, ich geh da noch einmal drüber.

  • Also ich finde da fehlen noch eine Menge Sachen... Ich schreib einfach mal was dazu^^


    SetPVarInt(playerid, varname[], int_value);
    Setzt dem Spieler eine Variable (varname) einen Wert (int_value). Beispiel: SetPVarInt(playerid, "Kills", 2);


    GetPVarInt(playerid, varname[]);
    Spuckt den Werte der Variable varname aus. Beispiel: new kills = GetPVarInt(playerid, "Kills"); format(string,sizeof(string),"Deine Kills: %d", kills);


    SetPVarString(playerid, varname[], string_value[]);
    Setzt dem Spieler eine Variable in Form einer Zeichenkette. Beispiel SetPVarString(playerid, "Partner", "Carl_Johnson");


    GetPVarString(playerid, varname[], string_return[], len);
    Setzt eine Zeichenkette (string_return) auf den Wert der zuvor definierten Zeichenkette. len bezeichenet die Länge der Zeichenkette. Beispiel: new name[16]; GetPVarString(playerid, "MeinName", name, 16); printf("%s",name);


    SetPVarFloat(playerid, varname[], Float:float_value);
    Das selbe wie bei dem Integer, nur ist es ein Float.


    Float:GetPVarFloat(playerid, varname[]);
    Das selbe wie bei dem Integer, nur ist es ein Float.


    DeletePVar(playerid, varname[]);
    Löscht die PVar, das heißt der Wert wird auf 0 gesetzt.



    - Man sollte noch erwähnen, dass PVars, die z.B. im Gamemode gesetzt werden auch im Filterscript ausgelesen werden können und umgekehrt.

  • Ja 8D., Kritik kann ja nicht schaden. Gefällt es dir jetzt besser? :pinch:

  • Stimmt schon was du sagst, allerdings habe ich mich auf Int beschränkt, dass sagt auch der Titel aus.
    Das mit dem Auslesen aus Filterscripts und GameMode werde ich dann noch hinzufügen. Spitze für AntiCheatSysteme ;)




    @ 8D, ja, ich vergess so etwas gerne mal, typisch ich :D

  • Du kannst auch noch anmerken, dass GetPVarInt/float/string keinen fehler / crash ausgibt, wenn die variable noch nicht für den spieler existiert / gesetzt worden ist, sondern der wert dann = 0 ist.
    Im Allgemeinen solltest du noch erwähnen, dass GetPVarInt/float/string die bessere Alternative zu spielerbezogenen Arrays ist.

  • I-wie ist das voll blöd grad..
    Ich will die Dinger (PVars) speichern, damit ich Resorucen spare..
    Hier, ein bsp, wie ich es habe (sehr stark abgespeckt) :
    forward SavePlayer(playerid);
    forward LoadPlayer(playerid);
    public SavePlayer(playerid)
    {
    dini_IntSet(Dateiname, "Test^^", GetPVarInt(playerid, "Test^^"));
    //noch mehr undsoo :D
    return 1;
    }
    public LoadPlayer(playerid)
    {
    SetPVarInt(playerid, "Test^^", dini_Int(Dateiname, "Test^^"));
    return 1;
    }


    OnPlayerDisconnect(parameter)
    {
    SavePlayer(playerid);
    return 1;
    }


    OnGameModeExit(parameter)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    SavePlayer(i);
    }
    return 1;
    }


    (Beim Login) :
    LoadPlayer(playerid);


    Aber i-wie, kommt da immer in der Datei nur:
    Test^^=0
    raus, weil die Variablen ja immer auf null gesetzt werden :(
    Wie kann ich das verhindern, oder zumindest richtig speichern lassen, wenn der Spieler Disconnected?..
    MfG
    Maxx

  • Mögliche Ursachen:

    • Das Sonderzeichen "^^"
    • Keine Ziffern ( Int ).
  • Ja, das oben gezeigte ist ja nur ein Test..
    So sieht es wirklich aus:
    dini_IntSet(pDatei(playerid), "AdminLevel", GetPVarInt(playerid, "AdminLevel"));
    SetPVarInt(playerid, "AdminLevel", dini_Int(pDatei(playerid), "AdminLevel"));


    Nur als beispiel.
    Kein Sonderzeichen und ein Integer ;)
    MfG
    Maxx

  • Ich denke mal, dass du das in einem Login/Register System hast.
    Von Hause aus ist diese Variable 0, du musst ihr erst einen Wert mit Hilfe von SetPVarInt zuweisen. Oder hast du das bereits?

  • Ja, klar..
    Hier wieder ein Auszug:
    Im Dilog, wenn man Määnlich (als Geschlecht) anklickt:
    SetPVarInt(playerid, "Geschlecht", 1);
    Geschelcht wird wie AdminLevel gespeichert, nur mit dem VarName "Geschlecht" ;)
    MfG
    Maxx

  • Das ganze muss funktionieren, ansonsten hast du entweder die Variable bereits verwendet, oder du hast nichts numerisches drinne.
    Ähnlich wie bei Punkt vor Strich. Set vor Get.

  • Es funktioniert aber nicht ;D
    Es ist numerisch, und wir vorher (natürlich) gesetzt..
    Im Laufenden Script wird alles vernünfitg gesetzt..
    Nur das "akutalisieren" endet in 0..
    Darum dachte ich, hat das mit dem Disconnect zu tuen..
    Weil da alles auf 0 gesetzt wird, und dann erst gespeichert wird..
    Aber wie soll man das umgehen?..


    MfG
    Maxx

  • Also ich versteh das jetzt so:



    Prüf mal falls der Wert eine Variable ist, dass auch diese numerisch ist. Ansonsten probiere mal beim OnPlayerDisconnect alles erneut auf den neusten Stand zu bringen, und dann den Rest auf 0 setzen. Aber nach jedem anderem Vorgang.
    Falls das auch nicht geht, müsste ich mal etwas länger nachdenken. Wie kommst du eigentlich auf die Idee, OnGameModeExit einen Parameter zu schenken? :D

  • public OnPlayerSpawn(playerid)
    {
    SetPVarInt(playerid,"AdminLevel",dini_Int(pDatei,"AdminLevel"));
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    dini_IntSet(pDatei,"AdminLevel",GetPVarInt(playerid,"AdminLevel"));
    return 1;
    }


    So könnte es aussehen.

  • Das Problem liegt glaube ich bei LoadPlayer, du setzt beim Laden, versteh ich nicht :D