Vorwort:
Dieses Tutorial bezieht sich auf die neue Version von SAMP. Diese findet ihr hier: 0.3a R7.
Warum sollte ich pVars nutzen?
Es war immer üblich, für jeden Spieler der auf den Server joint ein neues Array oder enum anzulegen,
in dem man seine Statistiken (Flags) festhalten kann.
Diese Arrays hängt von MAX_PLAYERS ab, welches ursprünglich 100 Elemente groß war.
Nun ist es auf 500 definiert worden und erstellt somit nun noch größere Arrays.
Genau genommen ist es eine Verschwendung des Speichers und dauert zu lange, solche riesigen Variablen abzufragen,
besonders wenn wie in vielen GameModes (zum Beispiel Godfather) sehr viele erstellt worden sind.
Daher hat das SAMP-Dev. Team eine interne Flag-Speicherung erstellt, welche erstens viel schneller als ein Array abgefragt wird
und zweitens unnötigen Speicher verbrauch verhindert.
Hier sind weitere Vorteile gegenüber den Arrays:
- pVars können frei über den kompletten Server verteilt werden. Egal ob sie in einem FilterScript oder einem GameMode gesetzt wurden.
- Wenn der Spieler den Server betritt oder verlässt, werden seine pVars automatisch auf 0 gesetzt. Dies erspart Funktionen wie ResetStats, welches dem Spieler ein schnelleres und sanfteres betreten des Servers ermöglicht
- Lange und komplexe SpielerInfo - Strukturen über enum sind nicht mehr notwendig.
- Sichert Speicher von erstellten Arrays, welche wahrscheinlich niemals verwendet werden würden. Nicht jeder Server hat 500 Spieler und nutzt somit den kompletten Array aus.
- pVars können leicht aufgzählt und ausgegeben / in eine Liste gespeichert werden. Dies erleichtert sowohl das Debuggen als auch die SpielerInfo (Account - Speicherung).
- Auch wenn ein pVar nicht erstellt worden ist, wird es dennoch den Standardwert 0 ausgeben.
- PVars können über sehr große Strings mit dynamisch zugewiesenen Speicher erstellt werden. Das heißt, man benötigt keine riesigen Strings mehr zu erstellen, sondern kann diesen langen Text in eine pVar speichern.
Funktionen:
SetPVarInt(playerid, varname[], int_value);
Setzt dem Spieler eine Variable (Integer) ("varname") auf einen Wert ("int_value").
GetPVarInt(playerid, varname[]);
Gibt den Wert der Variable ("varname") wieder.
SetPVarString(playerid, varname[], string_value[]);
Setzt dem Spieler eine Variable (String) ("varname") auf einen Wert ("string_value").
GetPVarString(playerid, varname[], string_return[], len);
// Gebrauch
new string[128];
GetPVarString(playerid, "varname", string, 128);
printf("%s", string);
Gibt den Wert der Variable ("varname") wieder. Dieser wird in string_return[] angegebenem String gespeichert. In "len" muss die Länge dieses Strings angegeben werden.
SetPVarFloat(playerid, varname[], Float:float_value);
Setzt dem Spieler eine Variable (Float) ("varname") auf einen Wert ("float_value").
Float:GetPVarFloat(playerid, varname[]);
Gibt den Wert der Variable ("varname") wieder. Wichtig ist hierbei zu beachten, dass sie als Float wiedergegeben wird.
DeletePVar(playerid, varname[]);
Löscht eine Variable ("varname") und setzt diese automatisch auf 0.
Gebrauch:
Die pVars kann man auf folgende Weise verwenden:
if(GetPVarInt(playerid, "Online") != 1) {
SetPVarInt(playerid, "Online", 1);
}
Außerdem kann man auch ganz einfach TextDraws in pVars speichern, ohne auch für sie ein extra Array anzulegen:
SetPVarInt(playerid, "Text", _:TextDrawCreate(0.0,0.0,"Text"));
new _:Text= GetPVarInt(playerid, "Text");
TextDrawUseBox(Text:Text,1);
TextDrawBoxColor(Text:Text,0x00000033);
TextDrawTextSize(Text:Text,217.0,60.0);
TextDrawAlignment(Text:Text,0);
TextDrawBackgroundColor(Text:Text,0x000000ff);
TextDrawFont(Text:Text,2);
TextDrawLetterSize(Text:Text,0.2,1.2);
TextDrawColor(Text:Text,0xffffffff);
TextDrawSetOutline(Text:Text,1);
TextDrawSetProportional(Text:Text,1);
TextDrawSetShadow(Text:Text,1);
// und später dann:
TextDrawSetString(Text:GetPVarInt(playerid, "Text"), string);
TextDrawShowForPlayer(playerid, Text:GetPVarInt(playerid, "Text"));