• Level: Fortgeschrittene
  • Tools: Texteditor
  • Zeitaufwand: ca. 20 min

Es ist möglich, Daten welche man im Spiel ändert oder erstellt, zu speichern und sie bei der nächsten Spielesizung wieder zu laden. Allerdings sollte diese Möglichkeit nur im geringem Maße, am Besten nur für spezielle Optionen oder ähnliches, verwendet werden.
Es gibt mehrere Wege, wie man Daten speichert und sie wieder lädt. Im ersten Abschnitt werden wir den etwas simpleren Weg beschreiten. Der andere Weg wird noch nachgereicht sobald er fertig ist.
Das folgende Wissen wurde aus dem Perl-AddOn entnommen

  1. Grundlagen
  2. Die globale Variable
  3. Die Standardvariablen
  4. Die toc-Datei
  5. Funktionen zur Verwaltung
  6. Ereignisse zum Laden der Daten


Grundlagen

Zum Speichern und Laden von Daten über eine Sitzung hinaus, benötigt man mehrere Dinge:

  • eine globale Variable zum Speichern der Daten
  • Standardvariablen, zum einfacheren Zugriff während des Spielens
  • einen Eintrag in die toc-Datei
  • Funktionen, welche die Verwaltung der Daten übernehmen
  • ein Frame, welches auf bestimmte Ereignisse reagiert


Die globale Variable

Das Wichtigste ist die globale Variable. Der Name muss Eindeutig sein und darf nicht andere Variablen in der WoW API überschreiben. Es ist daher angebracht einen Namen zu wählen, der auf seine Funktion hinweist und trotzdem Einzigartig ist. Es ist in den meisten Fällen Ratsam zum Beispiel die Namen des Addon sowie einem Anhang zu verwenden.
Bsp.:

MeinAddOn_Options = {};

Ist der Name gefunden, deklariert man die Variable am Besten ganz oben in der .lua-Datei des AddOns. Die Variable stellt eine Tabelle dar und muss daher mittels der geschweiften Klammern gekennzeichnet werden (siehe Beispiel oben). Das wars auch schon zum Anfang. Das Füllen der Tabelle kommt später.

Die Standardvariablen

Verwendet man die Werte auch während des Spielens, sollte man grunsätzlich nur lokale Variablen verwenden, die nur innerhalb des AddOns gültig sind, dort allerdings global für alle Funktionen der Datei zugänglich am Anfang der Datei. Um die Variable lokal zu erstellen hängt man einfach vor den Namen der Variablen das Wort ” local“.
Die Standardvariablen sollten ebenfalls mit Standardwerten initialisiert werden. Dies ist nötig um zum einen beim ersten Laden des AddOns definierte Werte zu haben und zum anderen, um zu verhindern das bei einem fehlerhaften Laden der Daten undefinierte Zustände vorliegen.
Bsp.:

local MeinAddon_Lock = 0;
local MeinAddon_ShowPet = 0;

Die Standardwerte sollten so eingestellt werden, wie es zu Beginn des AddOns am günstigsten erscheint. Soll der Wert zum Beispiel dazu verwendet werden um das AddOn sichtbar zu machen oder zu verstecken ist es in manchen Fällen besser es zuerst zu zeigen und in manchen Fällen eher nicht.
Es ist auch möglich ganze Tabellen als Standardvariablen zu verwenden. Es sollte allerdings strikt das System: “So viel wie nötig aber so wenig wie möglich”, eingehalten werden.
Zu guter letzt sollten zwei Variablen eingebaut werden deren zweck später noch erklärt wird.

  1. local VariablesLoaded = nil;
  2. local Initialized = nil;

Die toc-Datei

Um die globale Variable zu speichern, muss man WoW auch mitteilen, dass es diese Variable beim Beenden der Sitzung speichern soll. Dies geschieht durch den Aufruf von ## SavedVariables gefolgt von dem Namen der Variablen. Im Zusammenhang mit dem obigen Beispiel erscheint diese Zeile in der .toc-Datei
Bsp.:

## SavedVariables: MeinAddon_Options,

Die Zeile wird durch ein Kommata Abgeschlossen(es ist nicht bekannt ob das notwendig ist oder nicht). Will man mehrere Variablen speichern, müssen diese immer durch Kommatas voneinander getrennt werden.
Damit haben wir schonmal erreicht, dass die globale Variable gespeichert wird, wenn WoW beendet wird, und geladen, wenn WoW(spezifischer Charakter) startet.

Funktionen zur Verwaltung

Nachdem das Grundgerüst steht, muss die Verwaltung implementiert werden, welche entscheidet was geladen und was gespeichert wird. Zu diesem Zweck ist es hilfreich drei Funktionen zu erstellen.

  • Funktion zum Initialisieren
  • Funktion zum Laden
  • Funktion zum Speichern

Eigentlich sollte die Funktion zum Laden und Initialisieren die Gleiche sein, allerdings ist es manchmal hilfreich das Laden der Daten in eine Unterfunktion zu setzen.

Diese Funktion ist dazu da, zu entscheiden, ob die Standardwerte oder die Daten der globalen Variablen verwendet werden sollen. Die Daten der globalen Variablen sind allerdings erst gültig, wenn das Ereignis “VARIABLES_LOADED” empfangen wurde. Ausserdem will man verhindern, daß die Funktion nicht unnötig oft aufgerufen wird. Daher ist es Ratsam eine kleine Überprüfung am Anfang der Funktion einzubauen, welche entscheidet, ob die Funktion ausgeführt werden soll oder nicht.

  1. if(Initialized or (not VariablesLoaded)) then
  2. return;
  3. end

Am Ende der Funktion wird die Variable Initialized auf 1 gesetzt.

Initialized = 1;

Durch dieses Vorgehen wird die Funktion nur einmalig ausgeführt und auch nur dann, wenn die Daten zum Charakter vollständig geladen wurden und somit unsere globale Variable auch Daten enthält.
Der eigentlich Hauptteil der Funktion geschieht dazwischen. Es wird geprüft, ob die globale Variable Daten enthält und entsprechend des Ergebnisses entschieden, welche Daten geladen werden sollen.

  1. if(type(MeinAddon_Options[UnitName("player")]) == "table") then
  2. - globale Daten sind gültig - Laden
  3. else
  4. - Standardwerte verwenden
  5. end

Die Verwendung von UnitName(“player”) als Parameter der globalen Variablen dient dem Zweck, die Daten Charakterabhängig zu machen. Es soll dadurch verhindert werden, das die eingestellten Werte für jeden, der vom Spieler erzeugten Charaktere, die gleichen Werte gelten. Dieses Vorgehen kann auch soweit verbessert werden, dass der Realm des Charakters zusätzlich als Parameter verwendet wird um zu verhindern, dass die Werte für Charaktere gleichen Namens auf unterschiedlichen Realms gelten.
Ist die globale Variable leer, werden die Standardwerte verwendet. In diesem Fall ist es angebracht die globale Variable gleich mit den Standardwerten zu beschreiben, da sonst ein diskrepanz zwischen lokal verwendeten Daten und den global gespeicherten Werten besteht.
Zusammenfassend sollte die Funktion zur Initialisierung in etwas wie folgt aussehen:

  1. function MeinAddon_Initialize()
  2. if(Initialized or (not VariablesLoaded)) then
  3. return;
  4. end
  5. if(type(MeinAddon_Options[UnitName("player")]) == "table") then
  6. - globale Daten sind gültig - Laden
  7. else
  8. - Standardwerte verwenden
  9. end
  10. Initialized = 1;
  11. end

Daten laden

Das Laden der Daten aus der globalen Variablen ist zwar relativ simpel, sollte allerdings aus verschiedenen Gesichtspunkten am Besten in einer eigenen Funktion geschehen.
Enthält die globale Variable Daten, heißt das noch lange nicht, daß jedes einzelne Datum gültig ist. Zu diesem Zweck ist eine spezifische Überprüfung jedes Parameters angebracht.
Achtung! Dieses Vorgehen ist nur dann zu empfehlen, wenn das Datum keinen nil Wert enthält. Für diesen Fall reicht es aus, die lokale Variable einfach mit dem Wert des globalen Datums zu belegen.
Es werden für das Beispiel die bereits verwendeten Variablen verwendet.

  1. function MeinAddon_LoadData()
  2. if(MeinAddon_Options[UnitName("player")]lock_option ~= nil) then
  3. MeinAddon_Lock = MeinAddon_Options[UnitName("player")]lock_option;
  4. end
  5. MeinAddon_ShowPet = MeinAddon_Options[UnitName("player")]pet_option;
  6. - Tabellenfeld kann auch nil enthalten daher direkte Zuweisung -
  7. end

Die Namen der Tabellenfelder innerhalb der globalen Variable sind frei wählbar. Die globale Variable ist bereits einzigartig, daher muss nur darauf geachtet werden, daß die Namen der Felder nicht mehrfach auftreten, da man sonst immer das selbe Tabellenfeld anspricht.
Sind keine globalen Daten verfügbar, werden die Standardwerte verwendet, welche beim Laden durch die globalen Daten überschrieben werden. In diesem Fall sollte am Besten die globale Variable mit den Standardwerten beschrieben werden. Dies geschieht zum Beispiel in der Funktion zum Speichern der Daten.

Daten speichern

Daten zu speichern ist noch einfacher als sie zu laden. Es werden einfach die gewünschten Tabellenfelder angesprochen und mit dem entsprechenden Datum gefüllt.

  1. function MeinAddon_SaveData()
  2. MeinAddon_Options[UnitName("player")]lock_option = MeinAddon_Lock;
  3. MeinAddon_Options[UnitName("player")]pet_option = MeinAddon_ShowPet;
  4. end

Ist das Feld innerhalb der Tabelle noch nicht vorhanden, wird es automatisch angelegt und der dazugehörige Wert gespeichert. Das macht alles lua selbst.
Die Daten, welche von WoW gespeichert werden, sind die Daten, die zuletzt in der globalen Variablen liegen wenn das Spiel beendet wird. Werden Daten geändert während des Spielens, sollten diese am Besten sofort in der globalen Variablen gespeichert werden, um einen Datenverlust zu verhindern.

Ereignisse zum Laden der Daten

Nachdem alle wichtigen Funktionen und Variablen deklariert wurden, muss das System auch zum Laufen gebracht werden. Hierfür wird ein Frame benötigt (egal ob sichtbar oder nicht, irgendeines im Grunde genommen) und ihm das Ereignis “VARIABLES_LOADED” sowie “PLAYER_ENTERING_WORLD” zugewiesen werden.

  1. this:RegisterEvent("PLAYER_ENTERING_WORLD");
  2. this:RegisterEvent("VARIABLES_LOADED");

Weiterhin muss eine Funktion erstellt werden, die sich um die Behandlung der Ereignisse kümmert. Zu diesem Zweck ist dem Frame das Script-Element …. anzuhängen mit dem Namen der Funktion, die ausgeführt werden soll.

  1. Scripts
  2. OnEventMeinAddon_OnEvent();/OnEvent
  3. /Scripts

Die Funktion, welche die Ereignisse behandelt muss dann folgenden Inhalt besitzen (Beispiel mit Funktionsrumpf).

  1. function MeinAddon_OnEvent()
  2. if(event == "VARIABLES_LOADED") then
  3. VariablesLoaded = 1; - Daten vollständig geladen
  4. else
  5. MeinAddon_Initialize(); - Initialisiere die Daten
  6. end
  7. end

Der Inhalt der Funktion sollte für sich sprechen. Tritt das Ereignis “VARIABLES_LOADED” ein bedeutet dies, daß die globalen Daten ab diesem Zeitpunkt vorhanden sind und verwendet werden können. Das eigentliche Laden wird aber erst ausgeführt, wenn der Spieler die Welt betritt.

Das war im Grunde genommen alles. Jetzt sollte man Daten zu einem Charakter speichern und laden können. Alles automatisch wie man will. Das verändern der Daten innerhalb von WoW muss natürlich noch eingebaut werden, aber das ist jedem selbst überlassen was und wie er er es macht.

zurück zur HowTo-Übersicht
zurück zur Übersicht der Skript-Sektion