Skriptsektion



Für viele wird das Programmieren eventuell Neuland sein, für andere dagegen nur ein Unterschied in der Syntax zu anderen bereits bekannten Sprachen. Die Skriptsprache lua ist wie gesagt keine reine Programmiersprache, sondern versucht durch eine Vereinfachung der Syntax und der verwendeten Sprachelemente den Einstieg für den Benutzer zu vereinfachen. Um die Sprache anzuwenden benötigt man das Wissen über den Gebrauch der verschiedenen Sprachelemente. Wir wollen die Wichtigsten kurz aufzeigen und dazu erklären was sie ausdrücken.

  1. Variablen
  2. Operatoren
  3. Zuweisungen
  4. Vergleiche
  5. Funktionen
    1. Parameter
    2. Rückgabewerte
  6. Entscheidungsfragen
  7. Schleifen
  8. Zählschleifen
  9. Objekte

Variablen

In den meisten Programmen kommt man nicht ohne Variablen aus. Auch in lua sind diese daher enthalten. Variablen sind im Grunde Synonyme für Informationen. Die Informationen nkönnen dabei vielseitig sein. So ist es möglich einer Variablen einen Text zu zuweisen, oder eine Zahl. Ebenfalls kann eine Variable eine Tabelle darstellen, in der verschiedene Angaben eines Typs enthalten sind. Der Typ ist in lua aufgrund der Vereinfachung der Sprachelemente nicht explizit anzugeben. Der Typ wird somit eigenständig erkannt, ohne das man sich darum kümmern muss. Trotzdem sollte man wissen welche Typen es gibt:
  • Boolean
    Ein Typ zur Beschreibung eines Zustandes. Zustände können nur Wahr oder Falsch sein. Der Wert der Variablen ist entweder true(Wahr) oder false(Falsch).
    Beispiel:
    VariablenName = true;
  • String
    Ein Typ zur Beschreibung von Text. Texte sind Ansammlungen von Zeichen. Der gesamte Text wird dabei von Hochkommatas eingeschlossen. Jedes Zeichen im Text ist als Char-Typ anzusehen.
    Beispiel:
    VariablenName = “Dies ist ein String”;
  • Tabelle
    Dieser Typ kann mehrere Felder mit Informationen besitzen. Die Informationen werden entweder durch Numerierung oder durch den Namen des gewünschten Feldes angesprochen. Die Variable wird zum Ansprechen eines Feldes mit dem Namen der Variablen gefolgt von der Feldnummer oder dem Feldnamen(als String), welche sich in eckigen Klammern befinden, geschrieben.



    Der Index der Tabelle beginnt immer bei 1!
    Beispiel Deklaration:
    VariablenName = { 2, 4, 8, 16 };
    VariablenName = { Feld1 = “String eins”, Feld2 = “String zwei” };
    Beispiel Verwendung:
    VarablenName[1];
    VariablenNameFeld1;
  • Zahl
    Ein Typ zur Beschreibung einer Zahl. Die Zahl kann eine ganze Zahl sein oder auch eine reele Zahl. Ist der Wert negativ, wird vor die Zahl das Minuszeichen angehangen. Kommatas sind als Trennungszeichen nicht zulässig. Es muss immer ein Punktzeichen als Trennungszeichen verwendet werden!
    Beispiel:
    VariablenName = -2.456;
Letztlich ist das Wissen über die verschiedenen Typen nur zweitrangig, da der Typ nicht explizit angegeben werden muss. Für die API-Funktionen ist es dagegen wichtig zu wissen was man der Funktion mitgeben soll und was die Funktion zurückgibt.
Wie die Variablen behandelt werden hängt vor allem davon ab, wie sie deklariert werden. Es gibt zwei unterschiedliche Arten von Variablen:
  • globale Variablen
    Diese Variablen gelten überall im Spiel und können auch von anderen Skripten verwendet werden. Meist sollten globale Variablen nur in Ausnahmefällen verwendet werden, um nicht Variablen des Spiels zu überschreiben/überlagern.
    Für die Deklariation einer globalen Variable wird einzig der Name verwendet.
    VariablenName = Wert;
  • lokale Variablen
    Diese Variablen gelten nur in der Skript-Ebene in der sie deklariert werden. Lokale Variablen können globale Variablen überlagern, ohne die globalen Variablen in ihrem Inhalt zu verändern.
    Lokale Variablen werden durch das Wort local vor dem Variablennamen gekennzeichnet.
    local VariablenName = Wert;
Es ist fast immer von Vorteil lokale Variablen zu verwenden, da diese den Speicher nach Verlassen der Skript-Ebene wieder freigeben und damit Ressourcen sparen. Die Skript-Ebene bezeichnet eine Verschachtelung von Anweisungen. Eine Funktion liegt eine Skript-Ebene höher als die Datei selbst in der die Funktion definiert wurde. Will man zB eine Variable für alle Funktionen der Datei verfügbar machen, sollte man diese als lokale Variable am Kopf der Datei deklarieren. Will man dagegen die Variable nur in einer Funktion verwenden, sollte diese als lokale Variable am Anfang der Funktion deklariert werden.
Lokale Variablen können sich ebenfalls überlagern, hier gilt die Regel: Die verwendete Variable ist die zuletzt deklarierte Variable.
VariablenName = Wert1; – globale Variable mit Wert1
function FunktionX()
local VariablenName = Wert2 – lokale Variable “VariablenName” überlagert die globale Variable mit Wert2 (nicht überschrieben!)
if a == b then
local VariablenName2 = WertX; – lokale Variable nur bis “else” gültig
else
VariablenName2 = WertY; – “VariableName2″ unbekannt und wird, aufgrunder Zuweisung, zu einer globalen Variablen; bei einem Vergleich würde ein Fehler erzeugt werden
end
end
– ab hier ist wieder die globale Variable “VariablenName” gültig


Operatoren

Operatoren sind besondere Zeichen(-Kombinationen), die bestimmte Aufgaben erfüllen sollen. Operatoren werden immer zwischen zwei Operanden gestellt mit Ausnahme des ” -” (für negative Zahlen) und dem ” not
Zum besseren Verständnis haben wir die Operatoren nach ihren Aufgabenbereichen unterteilt.

Rechenoperatoren
Es gibt insgesamt vier Rechenoperatoren. Diese lauten wie folgt:
  • +
    Additionsoperator, um zwei Zahlen miteinander zu addieren.
    a + b = c;
  • -
    Subtraktionsoperator, um zwei Zahlen miteinander zu subtrahieren.
    x – y = z;
  • *
    Multiplikationsoperator, um zwei Zahlen miteinander zu multiplizieren.
    n * m = k;
  • /
    Divisionsoperator, um zwei Zahlen miteinander zu dividieren.
    i / j = s;


Vergleichsoperatoren
Auch in lua ist es möglich Werte miteinander zu vergleichen. Dabei werden die folgenden Vergleiche zur Verfügung gestellt:
  • <
    Der linke Wert muss kleiner sein als der rechte Wert.
  • >
    der linke Wert muss größer sein als der rechte Wert.
  • =
    Der linke Wert muss kleiner sein oder dem rechten Wert entsprechen.
  • =
    Der linke Wert muss größer sein oder dem rechten Wert entsprechen.
  • ==
    Der linke Wert muss dem rechten Wert entsprechen.
  • ~=
    Der linke Wert darf nicht dem rechten Wert entsprechen.

Entspricht der Vergleich nicht dem angegebenen Operator fällt das Ergebnis negativ aus (falsch). Ist der Vergleich zutreffend, wird dagegen ein positives Ergebnis zurückgegben (richtig).

logische Operatoren
Logische Operatoren dienen dazu Operanden zu verknüpfen oder deren Aussage zu negieren. Folgende logische Operanden sind möglich
  • and
    Der linke und der rechte Wert werden miteinander Verbunden. Beide Operanden müssen im Ergebnis wahr sein um ein positives (richtig) Endergebnis zu erhalten.
    k and m Ergebnis ist wahr, wenn k und m wahr sind
  • or
    Der linke und der rechte Wert werden miteinander Verbunden. Nur einer der beiden Operanden muss wahr sein um ein positives (richtig) Endergebnis zu erhalten.
    x or y Ergebnis ist wahr, wenn x oder y wahr ist
  • not
    Negiert das Ergebnis, welches nach dem Operator eingesetzt wird.
    not ( a = b) Ergebnis ist wahr, wenn a nicht kleiner gleich b ist


Stringoperatoren
Auch für Strings gibt es einen Operator. Der Operator ” ..” ermöglicht es, den Strings miteinander oder Werte an Strings zu knüpfen. Zahlenwerte werden durch den Operator automatisch in einen String umgewandelt.
“Dies ist der “..x..”-te Versuch”; Ergebnis wenn x dem Wert 13 entspricht: “Dies ist der 13-te Versuch”


Zuweisungen

Um Variablen zu füllen ist es notwendig ihnen Werte zuzuweisen. Eine Zuweisung wird durch das Zeichen = durchgeführt.
VariablenName = Wert;

Will man einem Tabellenfeld einen Wert zuweisen muss das Tabellenfeld angesprochen werden.
VariablenName[i] = Wert; – Tabellenfeld mit Indexnummer angesprochen

Vergleiche

Will man einen Wert mit einem anderen Wert vergleichen, so muss die Zeichenfolge ” ==” verwendet werden. Es ist sehr wichtig darauf zu achten, das man auf die Syntax bei einem Vergleich einhält und nicht ausversehen eine Zuweisung macht. Dies führt in den meisten Faeml;llen zu Fehlern im Skript, welche möglicherweise nicht im Spiel gemeldet werden.
Wert1 == Wert2

Es ist meistens eher sinnvoll Variablen auf übereinstimmende Werte zu prüfen oder Variablen auf vordefinierte Werte.
VariablenName == Wert
VariablenName1 == VariablenName2

Es wird in beiden Beispielen der Inhalt der Variablen verglichen, nicht der Name der Variablen.
Will man das genaue Gegenteil, untersuchen ob der eine Wert eben nicht dem anderen entspricht kann die Zeichenfolge ” ~=” verwendet werden. Dies bedeutet in der Umgangssprache ungleich. Entspricht der eine Wert nicht dem Anderen, so wird die Bedingung erfüllt.
VariablenName ~= Wert;

Funktionen

Um Skripte zu schreiben bedarf es Funktionen. Um Funktionen zu definieren reicht es aus das Wort function mit dem Funktionsnamen, gefolgt von zwei Klammern ( und ), aufzuschreiben. Die Funktion muss immer durch das Wort end beendet werden. Alles zwischen dem Anfang und dem Ende der Funktion wird als auszuführender Kode interpretiert.
function FunktionsName() – Funktionskopf
– Inhalt der Funktion
end – Ende der Funktion


Parameter
Man kann einer Funktion auch Parameter anhängen die beim Aufruf der Funktion übergeben werden sollen. Die Angabe eines Parameters wird durch den Parameternamen zwischen den Klammern im Funktionskopf erreicht. Jeder Parameter wird als lokale Variable in der Funktion behandelt. Aufgrund der fehlenden Angabe des Parametertyps, sollte mit dem Aufrufer vorab geklärt werden welche Art von Parameter die Funktion erwartet.
Im Folgenden sieht eine Funktion mit N Parametern so aus:
function FunktionsName(ParameterName1, ParameterName2, … ParameterNameN) – Funktionskopf mit N Parametern
– Inhalt der Funktion
end – Ende der Funktion


Rückgabewerte
Es ist ebenfalls möglich, daß die Funktion Werte an den Aufrufer zurückgibt. Hierfür ist das Wort return zu verwenden. Das Wort leitet eine umgehende Beendigung der Funktion ein. Soll die Funktion Werte zurückgeben, dann hängt man an das Wort die VariablenNamen oder die Werte an, getrennt durch Kommatas.
function FunktionsName() – Funktionskopf mit N Parametern
– Inhalt der Funktion
return “Dies ist das Ende”, VariablenName; – 2 Rückgabewerte liefern
end – Ende der Funktion


Kommen wir nun zum Inhalt von Funktionen. Neben dem Aufruf von anderen Funktionen sind auch die Möglichkeiten gegeben, bestimmte Abläufe zu erzeugen.

Entscheidungsfragen

Will man Variablen miteinander Vergleichen oder einen festen Wert mit einer Variablen, so ist es meist von Vorteil eine Entscheidungsfrage zu stellen. Zu diesem Zweck ist die if-then-else Abfrage zu gebrauchen. Diese Abfrage entscheidet aufgrund der vorgegebenen Bedingung, ob der gewünschte Fall zutrifft oder nicht.
if Bedingung then Anweisung else optionale Anweisung end

Die Bedingung ist fast immer ein Vergleich. Die Anweisung ist eine Skript-Ebene höher als die Abfrage selbst. Lokale Variablen, die im Abschnitt Anweisung deklariert werden, sind nicht für den Abschnitt der optionalen Anweisung zugänglich.
Die Entscheidungsfrage kann erweitert werden, indem auf die else-Entscheidung eine weitere if-then-Abfrage gesetzt wird.
if Bedingung1 then
Anweisung
elseif Bedingung2 then Optionale Anweisung 1
….
elseif BedingungN then
optionale Anweisung N-1
else
optionale Anweisung N
end

Es ist ebenfalls möglich die Bedingungen innerhalb eines Bedingungsblockes zu verknüpfen. Folgende Verknüpfungsmöglichkeiten gibt es
  • and
    Verknüpft eine vorhergehende und eine nachfolgende Bedingung zu einer. Es müssen beide Bedingungen zutreffen um die Gesamtbedingung zu erfüllen.
  • or
    Verknüpft eine vorhergehende und eine nachfolgende Bedingung zu einer. Es ist ausreichend wenn eine der beiden Bedingungen zutrifft um die Gesamtbedingung zu erfüllen.
Das Verknüpfen von Bedingungen kann beliebig fortgeführt werden. Sollte man allerdings die beiden Verknüpfungsarten miteinander kombinieren, so muss man darauf achten, daß die Bedingungen in sich selbst stimmig sind. zB ist es sinnvoll zwei Bedingungen mit einer and-Verknüpfung zu verbinden welche widerum mit einer or-Verknüpfung eine Dritte Bedingung verbunden sind. In diesem Fall sollte mit Klammern gearbeitet werden um die Prioritäten zwischen den Verknüpfungen zu klären.
if Bedingung1 and Bedingung2 or Bedingung3 then — unklar was zuerst geprüft werden soll

end

if (Bedingung1 and Bedingung2) or Bedingung3 then — Bedingung 1 und 2 muss zutreffen oder Bedingung 3

end

if Bedingung1 and (Bedingung2 or Bedingung3) then — Bedingung 1 und 2 muss zutreffen oder Bedingung 1 und 3

end

Zu guter Letzt muss noch erwähnt werden das die Bedingung auch negiert werden kann. Setzt man das Wort not vor die Bedingung, wird das Ergebnis der Bedingung negiert und erst danach die Entscheidung getroffen.
if not VariablenName == Wert then … end

Schleifen

Ab und An kann es durchaus passieren, daß man mehrere Durchgänge lang das gleiche machen will, mit nur ein wenig veränderten Werten. Zu diesem Zweck sind Schleifen sehr nützlich. Sie erlauben es den selben Code immer wieder zu durchlaufen, bis eine definierte Bedingung den Abbruch der Schleife erzwingt.
Es gibt zwei Schleifenarten die man verwenden kann:
  • while-do
    Die Schleife prüft immer zu Beginn, ob die Schleife abgebrochen werden soll oder nicht. Daher kann es auch sein, das es keinen einzigen Schleifendurchlauf gibt.
    while Bedingung do Anweisung end
  • repeat-until
    Die Schleife prüft immer am Ende, ob die Schleife abgebrochen werden soll oder nicht. Diese Schleife läft mindestens einmal durch.
    repeat Anweisung until Bedingung
Will man einen Schleifendurchlauf überspringen so kann man die Anweisung continue; verwenden. Die aktuelle Anweisung wird dann abgebrochen und zum nächsten Schleifendurchlauf gesprungen.
Will man dagegen vorzeitig die Schleife verlassen, so verwendet man die Anweisung break;. Die Schleife wird vollständig verlassen.

Zählschleifen

Hat man eine feste Vorstellung von den Durchläufen die man benötigt um die Aufgabe zu erfüllen, so ist eine Zählschleife meist die erste Wahl.
Zählschleifen fangen an einem angegebenen Startwert an und durchlaufen die Aufgaben so oft, bis das ebenfalls angebene Maximum erreicht wurde. Es ist möglich die Schrittweite des Zählens anzugeben. Normalerweise wird immer in Einerschritten gezählt, aber dies kann man durch eine optionale Angabe verändern.
for i=1,16 do – Schleife von 1 bis 16, was 16 Durchläufen entspricht– Ausführung end

for i=16,5,-1 do – Schleife von 16 bis 5 herunterzählen, entspricht 12 Durchläufen– Ausführung end

for i=1,16,2 do – Schleife von 1 bis 16 in Zweierschritten, entspricht 8 Durchläufen– Ausführung end

Wie bei den anderen Schleifen ist es auch hier möglich den aktuellen Schleifendurchlauf abzubrechen und zum nächsten zu springen ( continue;) oder die Schleife vollständig zu verlassen ( break;).

Objekte

Objekte sind komplexe Variablen, welche Eigenschaften und Funktionen besitzen können. Objekte sind für den AddOn-Programmierer in WoW fast ausschließlich XML-Elemente. Diese besitzen Eigenschaften die zur Laufzeit geändert werden können, meistens durch Funktionen des Elementes.
Ein besonderes Objekt stellt die Variable this dar. Diese Variable entspricht immer dem aktuell zu Grunde liegenden Objekt. Das bedeutet, daß innerhalb einer Funktion, die durch ein XML-Element aufgerufen wird, this dem XML-Element entspricht.
Welche Funktionen des Objektes this man aufrufen kann, hängt vom XML-Element ab und sollte für den Programmierer erkenntlich sein, denn sonst kann es zu Fehlern kommen, weil die Funktion nicht bekannt ist.
Tipp: Tabellen können ebenfalls als Objekte angesehen werden

zurück zur AddOn-Materie
zurück zur Übersicht der Skript-Sektion
Warlords of Draenor Teaser
WoD Vorbestellung
Hearthstone Teaser
Heroes of the Storm-Teaser
Umfrage

Seid ihr heiß auf Warlords of Draenor?

Ergebnis anzeigen »

Loading ... Loading ...
 
... die drei "Lost Vikings" Baleog, Erik und Olaf auch einen Gastauftritt in Blizzards "World of Warcraft" haben, wo sie in der Instanz Uldaman als NPCs erscheinen?
AEONIUM
mySigs
mySigs.de
Facebook
Interessantes und Ungewöhnliches rund um World of Warcraft