Spieler Variabeln (PVar's)

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
  • Guten Tag, nun möchte ich euch gerne Spieler Variablen erklären da diese einfach Vielfältiger sind als die Standart Variablen die gleich meistens für alle 500Spieler gesetzt werden. (Beispiel: new Tacho[MAX_PLAYERS];) dies kann man leicht ändern und ist auch Code sparender und leichter handhablicher ganz einfach zu verstehen. Das nützliche bei PVars ist einfach das ihr in eurem Gamemode z.B Godfather SetPVarInt(playerid,"Adminlevel",PlayerInfo[playerid][pAdmin]); und dann könnt ihr in euren Filterscripts per GetPVar(playerid,"Adminlevel".. abrufen welches Admin Level der Spieler hat ohne erneut ein Enumerator zu erstellen und aus einer Datei auszulesen um den Enumerator zu füllen.

    Zitat

    ♣ Benötigt ♣
    - Leichte Grundkentnisse
    - Benutzungsmöglichkeit für PVar's

    So es gibt nun 3Schritte die ich erklären werde, einmal das erstellen einer PlayerVariable, das Abfragen einer PlayerVariable und das Löschen einer PlayerVarible. Ich nehme mal das Beispiel wo in den PVar's sobald ein Spieler sich einloggt gespeichert wird wann er sich eingeloggt hat (HH:MM:SS), wo er sich eingeloggt hat (Float:X,Float:Y,Float:Z) und welche ID er hat (nur ein Beispiel deswegen etwas Sinnloses).




    1.) Erstellen einer PVar Int, String und Float (Player Variable)
    Erstmal erstellen wir unter OnPlayerConnect (Sobald ein Spieler connectet) eine PVar die auf 0 steht diese Steht für die Player ID. Ganz einfach nutzen wir dafür SetPVarInt nach diesem Muster:
    SetPVarInt(playerid,"SpielerID",playerid);//SpielerID ist der PVar Name und playerid die Spielerid die von SA:MP aus definiert ist.
    Nun ist eine Variable erstellt worden inder die Spieler ID des Spieler's gespeichert ist nun wollen wir noch die Position speichern, da eine Position ein Float (Zahl.Zahl z.B 1234.5234) ist und nicht nur eine Zahl wie 2 oder 61234 brauchen wir etwas anderes als SetPVarInt. Wir benutzen dafür SetPVarFloat dies ist genau so leicht zu benutzen nur sind halt Floats in der Variable Speicherbar! Dies machen wir alles unter OnPlayerConnect nach diesem Schema:
    new Float:pX,Float:pY,Float:pZ;//Erstellt drei neue Werte die mit Floats ausgetauscht werden können
    GetPlayerPos(playerid,pX,pY,pZ); ;//Erfragt die Spieler Position und definiert sie als pX, pY und pZ...
    SetPVarFloat(playerid,"EinloggPositionX",pX);//Speichert in eine PVar den Spieler Einlogg Float der X Achsen Korrdinate..
    SetPVarFloat(playerid,"EinloggPositionY",pY);//Speichert in eine PVar den Spieler Einlogg Float der Y Achsen Korrdinate..
    SetPVarFloat(playerid,"EinloggPositionZ",pZ);//Speichert in eine PVar den Spieler Einlogg Float der Z Achsen Korrdinate..
    Nun wird die Spieler Position in die drei PVar's einzelnd gespeichert. Nun brauchen wir nur noch die Einloggzeit des Spielers, dafür nehmen wir am besten mehrere Zahlen XX:XX:XX in einer Reihe aber es ist kein Float da es keine dezimalzahlen sind sondern ein String der aus mehreren Werten besteht, dies ist auch möglich per 3 verschiedene PVar's mit SetPVarInt doch hier ist SetPVarString nützlicher beim einloggen würde das ganze so aussehen, alles wieder unter OnPlayerConnect:
    new Textstring[8],Stunde,Minuten,Sekunden;//Erstellt einen Stringwert mit der max. Zeichen Anazhahl 8 sowie drei Werte für die Zeit die umgetauscht werden können...
    gettime(Stunde,Minuten,Sekunden);//Fragt die Zeit ab und ersetzt die drei Werte die davor erstellt werden mit der jetzigen Zeit...
    format(Textstring,sizeof(Textstring),"Connected: %d:%d:%d",Stunde,Minuten,Sekunden);//Erstellt ein String (mehrer Werte in einem Satz leicht ausgedrückt) und speichert ihn in den Wert Textstring ab.
    SetPVarString(playerid,"EinloggZeit",Textstring);//Speichert den String von Textstring in die Spieler Variable ein und der Variablen Name ist nun EinloggZeit





    2.) Abfragen einer PVar Int, String und Float (Player Variable)
    So nun wollen wir die Spieler Variablen abfragen zum Beispiel per Befehl. Dafür benutzen wir je GetPVarInt/String oder Float um die Werte zu ermitteln und dies alles in einem Befehl (CMD) unter OnPlayerCommandText:


    if(strcmp(cmdtext, "/pvarinfo", true) == 0)//Falls der Spieler /pvarinfo eingibt...
    {
    new Textstring[64];//Erstellt einen neuen Wert mit max. Zeicheninhalt von 64
    format(Textstring, sizeof(Textstring), "Spieler ID: %d | Einlogguhrzeit: %s | Startposition: %f,%f,%f",GetPVarInt(playerid,"SpielerID"),GetPVarString(playerid,"EinloggZeit"),GetPVarFloat(playerid,"EinloggPositionX"),GetPVarFloat(playerid,"EinloggPositionY"),GetPVarFloat(playerid,"EinloggPositionZ"));
    );//Ersetzt den Wert Textstring mit den PVar Werten..
    SendClientMessage(playerid,0x33CCFFAA,Textstring);//Sendet dem Spieler den Textdrawstring in Hell Blau...
    return 1;//Beendet die Funktion, falsch der Befehl falsch eingegeben wird erscheint "SERVER: Unknown Command"..
    }
    Nun wird dem Spieler z.B folgender Satz gesendet:
    Spieler ID: 12 | Einlogguhrzeit: 21:49:52 | Startposition: 1231.1231, 1234.0974, 5232,5296
    damit haben wir die ersten beiden Funktionen die man lernen sollte, nun das löschen.





    3.) Löschen einer PVar Int, String und Float (Player Variable)
    Falls ihr eine PVar nichtmehr benutzen wollt da ihr sie nur eine Minute oder so benötigt könnt ihr die PVar's mit DeletePVar löschen, hierbei gibt es keinen unterschied der Funktion egal ob ihr Int, String oder Float PVar löschen wollt alles heißt einfach nur DeletePVar um unsere Beispiel Variablen zu löschen würde es also so aussehen:
    DeletePVar(playerid,"SpielerID");
    DeletePVar(playerid,"EinloggZeit");
    DeletePVar(playerid,"EinloggPositionX");
    DeletePVar(playerid,"EinloggPositionY");
    DeletePVar(playerid,"EinloggPositionZ");
    Dies wars auch schon, PVar's sind halt nur eine kleine aber feine Geschichte ich hoffe es hat wenigstens ein paar Usern hier geholfen, bei Fragen/Problemen stehe ich gerne per PN bereit für dieses Tutorial oder direkt im Thread.


    ZKX;)


    \°\Edit: Punkte verbessert sowie Abstand Editiert für bessere Übersicht.
    \°°\Edit: Beschrieben wofür ein PVar überhaupt hilfreich ist. (Sorry das es so spät kommt)

    Why do programmers always mix up Halloween and Christmas?
    Oct 31 == Dec 25

    2 Mal editiert, zuletzt von TPO ()

  • Wie kann ich mit diesen angaben einen Wer vergleichen ? Wenn ich z.B. die Einloggzeit bei "100" einen PayDay bekommt wie soll das dann funktionieren ?



    if(GetPVarString(playerid,"EinloggZeit") == 100) { /* Funktion XYZ */ }

    Oder geht es anders ? Bitte um eure Hilfe.


    MfG,


    Robert

  • Steam, das ist doch eine unnötige Lösung..


    if(GetPVarString(playerid,"EinloggZeit") == 100) { /* Funktion XYZ */ }
    Genau so würde es funktionieren, du musst aber auch jede Minute per Timer die PVar einen höher setzen..

    Why do programmers always mix up Halloween and Christmas?
    Oct 31 == Dec 25

  • Nicht unbedingt. Normale Variablen belasten den Arbeitsspeichern und PVars die CPU.
    Der Vorteil bei PVars ist noch, das diese dynamisch sind und damit auch eine Kommunikation von Filterscript und Gamemode möglich ist.


    Nicht jeder, der sich für super hält, ist ein Superheld. :love:
    ------------------------------------------------------------------------------------------------

  • Ich hab an diser Stelle noch einen kleinen Tipp, wie man sich Fehler ersparen kann.


    Normalerweise schreibt man ja

    SetPVarInt(playerid,"diesertextalsname",wert);


    Da aber durch einen Fehler im String kein vernünftiger Wert gewährleistet ist, können so recht schnell Fehler entstehen.
    Ich bevorzuge diese Methode:


    #define DISERTEXTALSNAME_KEY "diesertextalsname"
    SetPVarInt(playerid,DIESERTEXTALSNAME_KEY,wert);


    Sollte man nun einen rechtschreibfehler gemacht haben bei SetPVarInt usw. , dann weist der Compilter einen direkt darauf hin, da für ihn der fehlerhafte Key nicht existiert.