EasyUO

Aus UO-Sigena Wiki
Wechseln zu: Navigation, Suche


Anmerkungen[Bearbeiten]

Erstmal die wichtigsten Dinge vorweg! Ich möchte an dieser Stelle darauf hinweisen, dass jeder User für seine Scripts selber verantwortlich ist! Wenn diese Scripte euren Rechner zum Abstürzen bringen, Hardware beschädigen, oder euren Account löschen ist das eure Schuld! Denn alles was von meiner Seite hier hinein kommt, funktioniert erstens (jedenfalls bei mir ;) ) und zweitens sollte jedes Script vor der Nutzung durch euch nochmals kontrolliert werden!


Guter Programmierstil[Bearbeiten]

Bevor es hier so richtig zur Sache geht, möchte ich noch eine Lanze für den "guten Programmierstil" brechen. Viele Scripter schreiben ihre Schöpfungen einfach ohne jegliche Gliederung und Kommentierung hinunter. Damit macht ihr euch nur selber das Leben schwer! Zum Einen werde ich bestimmt keine Lust haben in einem solchen Wirrwar nach Fehlern zu suchen (falls ihr mich fragen wollt) und zum Anderen (viel Wichtigeren) könnt ihr nach hmm sagen wir mal nem halben Jahr das Script selber nicht mehr vernünftig lesen. Und wisst nicht was ihr damals da eigentlich programmiert habt.

Ich will euch einmal ein kleines Beispiel geben wie so etwas in etwa aussehen sollte:

; **********
; __hiding.txt
; EasyUO-Version: 1.50
; **********

; sollte IMMER am anfang stehen, wird benötigt um z.b. event macro ausführen zu können
InitEvents
; variable ob hiding trainiert wird (1) oder nicht (0)
set %training 1

; ********** MAIN

For %run_a 1 2
{
  ; wenn kein training
  If %training = 0
  {
    ; wenn gehidet
    If #CharStatus = H
    {
      Event SysMessage Gehidet!!!!!
      Sound
      Halt
    }
  }
  ; setze schleifenvariable auf startwert
  Set %run_a 1
  ; skill hiding ausführen
  Event Macro 13 21
  ; warte 10 sekunden (wait 20 = wait 1s)
  Wait 200
}
; beende programm
Halt
; **********

Dieses Script trainiert Hiding, oder wenn man die Variable "%training" auf 0 setzt (manuell) dann wird der Skill Hiding so lange ausgeführt bis der Char erfolgreich gehidet ist.

Alle Zeilen mit einem ";" vorne dran sind Kommentarzeilen und werde von EasyUO nicht beachtet, damit erklärt man sich nur warum was in welcher Art und Weise passiert. Ausserdem ist nach jedem "{" um zwei Leerzeichen eingerückt worden damit man If-Anweisungen und Schleifen (in dem Falle eine "For-Schleife") besser sehen kann. Ich persönlich schreibe in die ersten beiden Zeilen immer noch gerne wie das Script heisst und mit welcher Easy-UO-Version ich es geschrieben habe.


Befehlsübersicht[Bearbeiten]

Hier erscheint in Folge eine deutsche Beschreibung aller Befehle jeweils inclusive einier Beispiel-Scripte. Wer mit dabei helfen möchte ist wie auch sonst Herzlich Willkommen!

Bis dahin jedoch müsst ihr euch mit der englischen Dokumentation auf EasyUO.com begnügen, aber auch da findet man alle Befehle erklärt und sogar das ein oder andere Beispiel.

Erste Schritte[Bearbeiten]

Hello World![Bearbeiten]

Wie in jedem guten Tutorial für eine Programmier/Script-Sprache steht auch hier als erster Schritt in die Programmierwelt das sog. "Hello World"-Programm. In einem solchen Script geht es hauptsächlich darum, dem Anwender zu zeigen wie er das Script startet, was alles vorhanden sein MUSS und um ein kleines Erfolgserlebnis in Form einer Ausgabe auf dem Bildschirm.

So, nun aber los. Um mit EasyUO arbeiten zu können muss Ultima Online laufen und ein Char eingeloggt sein und natürlich muss das Programm EasyUO gestartet worden sein. Dann kann man entweder bereits geschriebenes Programm laden, oder aber wie wir jetzt ein neues schreiben:

; **********
; lässt den char etwas (hier hello world) sprechen
Msg Hello World $
; beendet das programm
Halt
; **********

Schauen wir uns das Script etwas genauer an. Die beiden Zeilen

; **********

dienen der Gliederung und können nach belieben weggelassen oder an andere Stellen gesetzt werden. Sie sind jedoch bei der Strukturierung von Scripten recht hilfreich.

Kommen wir zur Zeile

Msg Hello World $

Hier wird der Befehl Msg (für Message verwendet). Dieser bewirkt, dass der nachfolgende Text unten links ins das Fenster geschrieben wird und nach drücken der Enter-Taste als Sprache des Chars ausgegeben wird. Um nicht immer noch die Enter-Taste drücken zu müssen, wird am Ende der Zeile noch ein $ angehängt, das dieselbe Aufgabe übernimmt.

Man kann also z.B. auch:

Msg Hello
Msg World
Msg $

schreiben. Das ist vor allem praktisch wenn die Ausgabe von bestimmten Bedingungen abhängt, aber dazu später.

Am wichtigsten ist die Zeile

Halt

Damit stoppen wir die Ausführung des Scriptes. Halt sollte mindestens einmal am Ende eines jeden Scriptes vorkommen und kann natürlich auch zusätzlich noch mittendrin stehen. Wenn in diesem Script das Halt nicht stehen würde, hätten wir eine ununterbrochene Ausführung des Msg-Befehls und der Char würde pausenlos "Hello World" sagen.


Bewegen des Chars[Bearbeiten]

Da Ultima Online ja nicht nur aus Gesprächen besteht ist es manchmal sehr hilfreich die Spielfigur von einem Punkt automatisch zum nächsten gehen zu lassen. Z.B. wenn man Holz hackt oder nach Erz gräbt. Hierfür gibt es den Befehl Move:

;  **********
; addiert jeweils 2 zur x-position und y-position des chars
Set %x #CharPosX + 2
Set %y #CharPosY + 2
; lässt den char an die neuen coord laufen
Move %x %y 0
; gibt eine meldung aus
Msg Bin 2 Schritte gelaufen $
; stoppt das programm
Halt
; **********

So, hier haben wir gleich 2 neue Befehle. Der erste wäre Set. Damit kann man - leicht zu erraten - den Wert einer Variablen setzen. Bei EasyUO unterscheiden wir dabei zwischen Standart-, System-, Namespace- und Persistentvariablen. Diese seien hier kurz erklärt.

Variablen[Bearbeiten]

Persistentvariablen[Bearbeiten]

Persistentvariablen haben vorangestellt ein "*" und danach eine beliebige Zeichenkette als Variablennamen. Sie werden in der Registry gespeichert und stehen somit mehreren EasyUO-Instanzen zur Verfügung. Damit kann ein Script nachprüfen wie weit ein anderes Script ist.


Namespacevariablen[Bearbeiten]

Bei Namespacevariablen hängt die Sichtbarkeit von den jeweiligen Einstellungen ab. So können "lokale" Namespacev. nur vom eigenen Script gelesen/geschrieben werden während "globale" Namespacev. von allen Scripten innerhalb einer Instanz von EasyUO gelesen/geschrieben werden können. Mittels des Kommandos nameSpace ändert man die Einstellung einer solchen Varialbe. Doch dazu später mehr.


Systemvariablen[Bearbeiten]

Systemvariablen haben fest vorgegebene Namen denen ein "#" vorangestellt ist. Ein Beispiel von oben wären die #CharPosX. Sie sind nicht case-sensitiv, d.h. es ist egal ob gross oder klein geschrieben. Nicht alle aber einige Systemvariablen können verändert werden. Durch die Systemvariablen bekommt EasyUO die Daten von Ultima Online, also z.B. den Standpunkt oder die ID einer Person oder eines Gegenstandes, etc.


Standartvariablen[Bearbeiten]

Standartvariablen werden wie ihr Name schon sagt standartgemäss bei EasyUO verwendet. Sie haben ein "%" vorangestellt gefolgt vom eigentlichen Variablennamen. ACHTUNG! Standartvariablen sind case-sensitiv, d.h. %VAR ist nicht gleich %var.


Variablen setzen[Bearbeiten]

Nun haben wir hier die beiden Zeilen:

Set %x #CharPosX + 2
Set %y #CharPosY + 2

Passenderweise sind da auch gleich die beiden häufigsten Variablentypen innerhalb von EasyUO vorhanden. #CharPosX und #CharPosY beinhalten die Koordinaten des Chars in der Welt. Diese haben den gleichen Wert wie auch die Koordinaten bei UO-AutoMap und haben ihren Nullpunkt in der nordwestlichsten Ecke Sigenas. Je weiter Richtung Osten man geht, desto grösser wird #CharPosX und je weiter man Richtung Süden geht, desto grösser wird #CharPosY. Nun setzen wir die Standartvariable %x mit dem Wert von #CharPosX + 2. D.h. wenn #CharPosX gerade 2000 ist, dann ist %x nach dieser Zeile 2002. Analog dazu verhält es sich mit %y Da wir beide Variablen um den selben Wert erhöht haben, muss sich der Punkt den %x und %y darstellen genau unterhalb (also südöstlich) vom Char befinden.

Die Zeile:

Move %x %y 0

führt nun die eigentliche Bewegung aus. Vom Standort aus versucht EasyUO die bestmögliche Route zu finden um den Punkt geg. durch %x und %y zu erreichen. Hier gibt es eine integrierte Wegsuche, die bei kleineren Hindernissen ausreicht aber natürlich nicht ganze Gebirge umgehen kann.

Bei Move gibt der erste Wert die X- und der zweite Wert die Y-Koordinate an. Dahinter kommt immer noch eine Zahl die angibt wie genau man an den jeweiligen Punkt heran soll. 0 heisst hier also, der Char soll genau auf den Punkt laufen währen die Zeile:

Move %x %y 1

bedeutet hätte, dass der Char im Abstand von einem Kästchen zum Ziel schon stehen bleiben kann. Das ist z.B. bei Bäumen ganz praktikabel, da man ja nie auf deren Feld kann, aber durchaus aus mehreren Richtungen zum Baum gelangen kann, je nachdem welche Hindernisse im Weg sind. Wenn dieser Wert nicht gesetzt wird, ist sein Defaultwert 2.

Während der Ausführung des Move-Befehls, wartet das gesammte Script bis der Char an der Stelle angekommen ist. Damit (falls der Char sich festgefressen hat) diese Wartezeit auch abgebrochen werden kann, hat Move auch einen Timeout. Standartgemäss ist dieser 3 Sekunden. Ich hätte also auch schreiben können:

Move %x %y 0 3s


Jetzt wird im Script, ähnlich zum "Hello-World"-Script noch ein Text ausgegeben und das Script beendet.


Variablen innerhalb von Textausgaben[Bearbeiten]

Manchmal will man nicht nur einen fertigen Text ausgeben sondern auch den Inhalt einer Variablen. Dies geht ganz einfach:

Set %zahl 20
Msg %zahl Enten sind vorbeigelaufen $

oder aber:

Set %zahl 20
Set %farbe rote
Msg %zahl %farbe Enten sind vorbeigelaufen $

Kontrollstukturen[Bearbeiten]

If-Abfragen[Bearbeiten]

If kann man übersetzen mit "wenn" und genauso wird es auch in gängigen Programmier- wie Scriptsprachen verwendet. Hier ein kleines Beispiel:

; **********
Set %i 1
; setze %rest gleich %i modulo 2 (= rest aus (%i durch 2))
Set %rest %i % 2
; wenn der rest = 0 dann %i gerade
If %rest = 0
  Msg %i ist gerade. $
Else
  Msg %i ist ungerade $
Halt
; **********

Je nachdem welchen Wert wir für %i eintragen wird entweder die erste oder die zweite Message ausgegeben. Wenn mehr als nur eine Zeile als bedingte Anweisung ausgeführt werden sollen dann muss dieser Anweisungsblock in geschweifte Klammern gesetzt werden:

; **********
Set %i 1
; setze %rest gleich %i modulo 2 (= rest aus (%i durch 2))
Set %rest %i % 2
; wenn der rest = 0 dann %i gerade
If %rest = 0
{
  Msg %i
  Msg ist
  Msg gerade.
  Msg $
}
Else
{
  Msg %i
  Msg ist
  Msg UNgerade.
  Msg $
}
Halt
; **********

Der Else-Teil kann auch weggelassen werden:

; **********
Set %i 2
; setze %rest gleich %i modulo 2 (= rest aus (%i durch 2))
Set %rest %i % 2
; wenn der rest = 0 dann %i gerade
If %rest = 0
{
  Msg %i
  Msg ist
  Msg gerade.
  Msg $
}
Halt
; **********

oder

; **********
Set %i 1
; setze %rest gleich %i modulo 2 (= rest aus (%i durch 2))
Set %rest %i % 2
; wenn der rest = 0 dann %i gerade
If %rest = 0
  Msg %i ist gerade. $
Halt
; **********

Beispielscripte[Bearbeiten]