Automaton scripten für Neulinge
Wie auch bei dem resource manager tutorial ist mir heir langweilig... also mache ich mal wieder nen Tutorial (wird ja auch langsam ma Zeit :D).
Automaton:
Den Automaton zieht ihr euch erstmal [Only registered and activated users can see links. Click Here To Register...].
Nun gibt es 2 möglichkeiten: entweder ihr benutzt ein komplett neues script oder ihr fügt etwas zur example.atmt hinzu. Ich werde zuerst erläutern wie man die Grundvorraussetzungen für ein eigenes Script erfüllt. Den rest könnt ihr dann auf example.atmt und auf euer eigenes script beziehen.
Kapitel 1 und 2 NUR wenn ihr ein komplet neues script erstellt.
Inhaltsverzeichnis:
1. Kapitel - So gehts los
2. Kapitel - Erste Abstimmungen
3. Kapitel - Variablen
4. Kapitel - if - Abfragen
5. Kapitel - Funktionen
6. Kapitel - Mein erstes Command
7. Kapitel - Interaktion mit dem Spiel
1. Kapitel - So gehts los:
Erstellt eine neue Datei (keinen ordner) und nennt sie meinscript.atmt.
Solltet ihr eine Frage bekommen ob ihr den Dateityp wirklich ändern wollt, dann seid ihr richtig. Andernfalls geht auf Extras -> Ordneroptionen -> Ansicht. Dort nehmt ihr den Haken bei "Erweiterungen bei bekannten Dateitypen ausblenden" weg. Nun ändert den namen der Datei nochmal und bestätigt bei der Frage ob ihr den Dateityp wirklich ändern wollt.
2. Kapitel - Erste Abstimmungen:
Als erstes legt ihr 2 arrays (eine für die funktionen und eine für die variablen) an (Müsst ihr nicht verstehen, einfach machen).
Die Prefixe die ihr benutzt werden bei euren Variablen benutzt, z.B. tomv.variable. "tomv" ist das prefix und "variable" der variablenname. Kein Problem wenn ihr nicht wisst was Variablen sind, wird noch erklärt. :p
3. Kapitel - Variablen:
Variablen kennen manche vielleicht schon aus dem Schulunterricht:
Es sind Buchstaben oder Wörter, denen ein bestimmter Wert zugeordnet wird, und der verändert werden sowie abgefragt werden kann.
Um das zu verdeutlichen:
Nun hat die Variable "testvariable" (die unser prefix haben muss) den wert 5.
Man kann Variablen auch miteinander verrechnet werden lassen.
Hier wird erst die Variable "faktor" auf 5 gesetzt, dann die Variable "faktor2" auf 6 gestzt und schließlich die Variable "produkt" aus "faktor" und "faktor2" multipliziert. Somit ist das ergebnis 5 * 6 = 30
Aufgabe:
Definiere 3 Variablen. Die ersten beiden sind die Summanten und die dritte Variable soll die Summe der beiden ersten sein.
Lösung:
Das ganze geht mit Plus (+), Minus(-), Mal(*) und geteilt(/).
4. Kapitel - if-Abfragen:
If - Abfragen sind neben den Variablen die wichtigsten Elemente des Programmierens. Ohne sie könnten all unsere Programme gar nicht existieren.
Es ist eigentlich simpel, denn sie folgen folgendem Schema:
Zum Beispiel:
Eine if-abfrage MUSS immer mit einem "end" enden.
Trifft die Bedingung zu, so wird der inhalt der if-Abfrage ausgefürt, andernfalls wird er übersprungen:
Wenn 1 = 1, dann wird die Variable "test" auf 2 gesetzt. Leicht oder?
Nun etwas komplexeres, da 1 ja logischerweise immer 1 ist...
Wenn "zahl" größer oder gleich 2 ist, dann wird "test" auf 2 gesetzt. Das geht auch mit 2 variablen.
Hier lernen wir gleich ziemlich viel mehr:
Das "nil" in der ersten if-Abfrage hat jede Variable als Wert, wenn man ihr noch keinen Wert zugewiesen hat. Mit dieser Abfrage gehe ich sicher, dass "zahl2" wenn sie noch keinen Wert hat, den Wert 0 bekommt.
Wir sehen außerdem, dass "zahl" am anfang auf 5 gesetzt wird. In der 2. if-Abfrage wird geschaut, ob "zahl" größer oder gleich "zahl2" ist, wenn das zutrifft, wird "zahl2" um 1 erhöht (variablenprefix.zahl2 = variablenprefix.zahl2 + 1). Somit merken so manche, dass die 2. if-Abfrage nur 6 mal hintereinaner ausgeführt werden kann (der gesamte code wird natürlich von alleine mehrmals ausgeführt) bis der inhalt der 2. in-abfrage übersprungen wird.
Aufgabe:
Warum ist das so?
Lösung:
Da "zahl2" in jedem Durchgang um eins erhöht wird, ist sie nach dem sechsten Durchgang auf 6 gesetzt worden. Somit ist "zahl" nicht mehr höher oder gleich "zahl2" und somit wird der inhalt nicht mehr ausgeführt.
Jetzt kommen wir zu dem "else" Befehl. Er ist ebenfalls wichtig in den if-Abfragen:
Wie du siehst, kann man Variablen auch einen text zuweisen, dieser wird jedoch in "" geschrieben, sonst gibt es fehler.
Nun jedoch zu "else". Vielleicht kannst du dir schon denken was es bedeutet:
Wenn in der if-Abfrage die bedingung nicht zutrifft und ein "else" in diesem schema vorhanden ist, so wird anstatt dem inhalt der if-Abfrage der inhalt des "else" ausgeführt. Das heißt:
Ist die if abfrage 6 mal durchgelaufen, wird beim 7. mal anstatt "zahl2" zu erhöhen, "durchgelaufen" auf "ja" gesetzt.
Es gibt auch den "else if" Befehl, der recht leicht ist.
Er bedeutet so viel wie "else", nur mit einer zusätzlichen bedingung:
z.b.:
Wenn 1 = 2 ist, wird "code 1" ausgeführt, ist 1 > 2, dann wird "code 2" ausgeführt. Ansonsten wird "code 3" ausgeführt.
Hier lernen wir den "or" befehl. Mit ihm können if-Abfragen an komplexität gewinnen: Er bedeutet so viel wie:
Der inhalt der if-Abfrage wird dann ausgeführt, wenn entweder die erste, oder die zweite oder auch beide bedingungen zutreffen.
Dies hier ist der "and" befehl. Er bedeutet:
Nur, wenn die erste UND die zweite Bedingung zutreffen, wird der inhalt der if-Abfrage ausgeführt
Für if-Abfragen gibt es folgende Operatoren:
< größer
> kleiner
== ist gleich (vorsicht, 2 gleichzeichen)
<= größer oder gleich
>= kleiner oder gleich
~= ist nicht gleich
Wenn du das alles verstanden hast, bist du schonmal weit genug für die basis des programmierens. :p
5. Kapitel - Funktionen:
Funktionen sind sozusagen die Essenz von automaton scripts. Befehle werden so definiert, dass die die funktionen ausführen, wir sind also schon ganz nah dran:
wie ihr seht ist der Name dieser funktion ("testfunktion") wieder hinter einem Prefix (diesmal das funktionenprefix). Die funktion wird wie eine if-abfrage durch ein "end" abgeschlossen. Das "( Arguments )" bedeutet, dass in dieser funktion hinter dem befehl ein wert angegeben werden kann (aber nicht muss), und das dieser Wert verwendet werden kann. Er wird als Variable "Arguments" ohne prefix benutzt. Das Prefix ist nicht vorhanden, da es eine funktionsinterne Variable ist. Auf das "(Device)" müssen wir nicht eingehen.
Nun erdenken wir uns mal einen Code:
Auf "return true" muss nicht weiter eingegangen werden, es reicht zu wissen, dass es die funktion abbricht, sprich wenn keine Werte hinter dem Command abgegeben wurden die funktion nicht ausführt.
Auf OutputF müssen wir auch nicht eingehen. Es zeigt, wenn es nach diesme Schema benutzt wird eine nachricht im Chat an. Diese Nachricht kann natürlich beliebig verändert werden. Hier: Wenn keine werte angegeben wurden, wird ausgegeben: "No argument given.".
Diese Funktion gibt aus: "The argument is bigger than 5.", wenn der Wert hinter dem command größer als 5 ist, ansonsten gibt die funktion aus: "The argument is lower than 5.".
NICHT VERGESSEN: das return true am ende hinmachen!
Ich denke damit ist für den Anfang alles über die funktionen klar.
6. Kapitel - Mein erstes Command:
Man benutzt:
Nun packen wir das mal um, so dass wir ein komplettes script mit unserem ersten command haben:
Jetzt das script laden und ingame das command "testcommand" probieren. Wenn ihr alles verstanden habt könnt ihr ja mal anfangen zu experimentieren. Ich werde morgen mit dem Tutorial weitermachen.
7. Kapitel - Interaktion mit dem Spiel:
Bis jetzt haben die Scripts ja noch nichts mit FlyFF zu tun und ich glaube kaum, dass ihr mit einem Bot für ein online mmorpg einfach nur Zahlenjonglieren wollt...
Also zeige ich euch hier, wie ihr werte aus dem Spiel herausnimmt und auch teilweise verändert:
Wir beschäftigen uns zuerst mit "GetPlayer ()" und "GetTarget ()". Ja, ihr seht richtig: in die Klammern kommt nichts, sie sind aber trotzdem vorhanden!
"GetPlayer ()" gibt uns unseren Chara aus und "GetTarget ()" gibt und unser Ziel aus, wenn wir kein Ziel haben, wird der wert "nil" ausgegeben.
Das verstehen wahrscheinlich nicht alle, deshalb werde ich das an einem kurzen Beispiel erläutern:
Dies schreibt unser Ziel in die Variable "ziel". Haben wir kein Ziel, so werden wir selber in die Variable "ziel" gebracht. Das hat einen hohen Nutzen: Darauf gründen autobuf und autoheal scripts!
UseSkill folgt dem Schema: UseSkill ( Spieler , SkillID ).
Demnach führt dieses Script den skill heal auf unser Ziel (oder wenn keins markiert ist auf uns selbst) aus.
__________________________________________________ ________
Update: Inhaltsverzeichnis hinzugefügt und im "else if" Abteil mehr erklärt.
Update 2: Kapitel "Interaktion mit dem Spiel" hinzugefügt.
Hoffe das hilft euch faulen säcken auf die sprünge :D
mfg Tom94
-sticky-
Wie auch bei dem resource manager tutorial ist mir heir langweilig... also mache ich mal wieder nen Tutorial (wird ja auch langsam ma Zeit :D).
Automaton:
Den Automaton zieht ihr euch erstmal [Only registered and activated users can see links. Click Here To Register...].
Nun gibt es 2 möglichkeiten: entweder ihr benutzt ein komplett neues script oder ihr fügt etwas zur example.atmt hinzu. Ich werde zuerst erläutern wie man die Grundvorraussetzungen für ein eigenes Script erfüllt. Den rest könnt ihr dann auf example.atmt und auf euer eigenes script beziehen.
Kapitel 1 und 2 NUR wenn ihr ein komplet neues script erstellt.
Inhaltsverzeichnis:
1. Kapitel - So gehts los
2. Kapitel - Erste Abstimmungen
3. Kapitel - Variablen
4. Kapitel - if - Abfragen
5. Kapitel - Funktionen
6. Kapitel - Mein erstes Command
7. Kapitel - Interaktion mit dem Spiel
1. Kapitel - So gehts los:
Erstellt eine neue Datei (keinen ordner) und nennt sie meinscript.atmt.
Solltet ihr eine Frage bekommen ob ihr den Dateityp wirklich ändern wollt, dann seid ihr richtig. Andernfalls geht auf Extras -> Ordneroptionen -> Ansicht. Dort nehmt ihr den Haken bei "Erweiterungen bei bekannten Dateitypen ausblenden" weg. Nun ändert den namen der Datei nochmal und bestätigt bei der Frage ob ihr den Dateityp wirklich ändern wollt.
2. Kapitel - Erste Abstimmungen:
Als erstes legt ihr 2 arrays (eine für die funktionen und eine für die variablen) an (Müsst ihr nicht verstehen, einfach machen).
Code:
local funktionenprefix = { }
local variablenprefix = { }
3. Kapitel - Variablen:
Variablen kennen manche vielleicht schon aus dem Schulunterricht:
Es sind Buchstaben oder Wörter, denen ein bestimmter Wert zugeordnet wird, und der verändert werden sowie abgefragt werden kann.
Um das zu verdeutlichen:
Code:
variablenprefix.testvariable = 5
Man kann Variablen auch miteinander verrechnet werden lassen.
Code:
variablenprefix.faktor = 5 variablenprefix.faktor2 = 6 variablenprefix.produkt = variablenprefix.faktor * variablenprefix.faktor2
Aufgabe:
Definiere 3 Variablen. Die ersten beiden sind die Summanten und die dritte Variable soll die Summe der beiden ersten sein.
Lösung:
Code:
variablenprefix.summant = 5 variablenprefix.summant2 = 6 variablenprefix.summe = variablenprefix.summant + variablenprefix.summant2
4. Kapitel - if-Abfragen:
If - Abfragen sind neben den Variablen die wichtigsten Elemente des Programmierens. Ohne sie könnten all unsere Programme gar nicht existieren.
Es ist eigentlich simpel, denn sie folgen folgendem Schema:
Code:
if (Bedingung) then -code- end
Code:
if (1 == 1) then -code- end
Trifft die Bedingung zu, so wird der inhalt der if-Abfrage ausgefürt, andernfalls wird er übersprungen:
Code:
if (1 == 1) then variablenprefix.test = 2 end
Nun etwas komplexeres, da 1 ja logischerweise immer 1 ist...
Code:
if (variablenprefix.zahl >= 2) then variablenprefix.test = 2 end
Code:
variablenprefix.zahl = 5 if (variablenprefix.zahl2 == nil) then variablenprefix.zahl2 = 0 end if (variablenprefix.zahl >= variablenprefix.zahl2) then variablenprefix.zahl2 = variablenprefix.zahl2 + 1 end
Das "nil" in der ersten if-Abfrage hat jede Variable als Wert, wenn man ihr noch keinen Wert zugewiesen hat. Mit dieser Abfrage gehe ich sicher, dass "zahl2" wenn sie noch keinen Wert hat, den Wert 0 bekommt.
Wir sehen außerdem, dass "zahl" am anfang auf 5 gesetzt wird. In der 2. if-Abfrage wird geschaut, ob "zahl" größer oder gleich "zahl2" ist, wenn das zutrifft, wird "zahl2" um 1 erhöht (variablenprefix.zahl2 = variablenprefix.zahl2 + 1). Somit merken so manche, dass die 2. if-Abfrage nur 6 mal hintereinaner ausgeführt werden kann (der gesamte code wird natürlich von alleine mehrmals ausgeführt) bis der inhalt der 2. in-abfrage übersprungen wird.
Aufgabe:
Warum ist das so?
Lösung:
Da "zahl2" in jedem Durchgang um eins erhöht wird, ist sie nach dem sechsten Durchgang auf 6 gesetzt worden. Somit ist "zahl" nicht mehr höher oder gleich "zahl2" und somit wird der inhalt nicht mehr ausgeführt.
Jetzt kommen wir zu dem "else" Befehl. Er ist ebenfalls wichtig in den if-Abfragen:
Code:
variablenprefix.zahl = 5 if (variablenprefix.zahl2 == nil) then variablenprefix.zahl2 = 0 end if (variablenprefix.zahl >= variablenprefix.zahl2) then variablenprefix.zahl2 = variablenprefix.zahl2 + 1 else variablenprefix.durchgelaufen = "ja" end
Nun jedoch zu "else". Vielleicht kannst du dir schon denken was es bedeutet:
Wenn in der if-Abfrage die bedingung nicht zutrifft und ein "else" in diesem schema vorhanden ist, so wird anstatt dem inhalt der if-Abfrage der inhalt des "else" ausgeführt. Das heißt:
Ist die if abfrage 6 mal durchgelaufen, wird beim 7. mal anstatt "zahl2" zu erhöhen, "durchgelaufen" auf "ja" gesetzt.
Es gibt auch den "else if" Befehl, der recht leicht ist.
Er bedeutet so viel wie "else", nur mit einer zusätzlichen bedingung:
z.b.:
Code:
if(1 == 2) then -code 1- else if(1 > 2) then -code 2- else -code 3- end
Code:
if (variablenprefix.zahl >= variablenprefix.zahl2) or (variablenprefix.zahl2 >= variablenprefix.zahl3) then -code- end
Der inhalt der if-Abfrage wird dann ausgeführt, wenn entweder die erste, oder die zweite oder auch beide bedingungen zutreffen.
Code:
if (variablenprefix.zahl >= variablenprefix.zahl2) and (variablenprefix.zahl2 >= variablenprefix.zahl3) then -code- end
Nur, wenn die erste UND die zweite Bedingung zutreffen, wird der inhalt der if-Abfrage ausgeführt
Für if-Abfragen gibt es folgende Operatoren:
< größer
> kleiner
== ist gleich (vorsicht, 2 gleichzeichen)
<= größer oder gleich
>= kleiner oder gleich
~= ist nicht gleich
Wenn du das alles verstanden hast, bist du schonmal weit genug für die basis des programmierens. :p
5. Kapitel - Funktionen:
Funktionen sind sozusagen die Essenz von automaton scripts. Befehle werden so definiert, dass die die funktionen ausführen, wir sind also schon ganz nah dran:
Code:
function funktionenprefix.testfunktion ( Arguments ) -code- end
Nun erdenken wir uns mal einen Code:
Code:
function funktionenprefix.testfunktion ( Arguments , Device )
if(Arguments == "") or (Arguments == nil) then
return true
end
end
Code:
function funktionenprefix.testfunktion ( Arguments , Device )
if(Arguments == "") or (Arguments == nil) then
OutputF ( Device, NAME_Log, "No argument given.", Arguments )
return true
end
end
Code:
function funktionenprefix.testfunktion ( Arguments , Device )
if(Arguments == "") or (Arguments == nil) then
OutputF ( Device, NAME_Log, "No argument given.", Arguments )
return true
else
if(Arguments > 5) then
OutputF ( Device, NAME_Log, "The argument is bigger than 5.", Arguments )
else
OutputF ( Device, NAME_Log, "The argument is lower than 5.", Arguments )
end
end
return true
end
NICHT VERGESSEN: das return true am ende hinmachen!
Ich denke damit ist für den Anfang alles über die funktionen klar.
6. Kapitel - Mein erstes Command:
Man benutzt:
Code:
Register ( funktionenprefix, "rubrik" ) AddCommand ( funktionenname, "Commandname", "Art der eingabe", "Beschreibung" )
Code:
local funktionenprefix = { }
local variablenprefix = { }
function funktionenprefix.testfunktion ( Arguments , Device )
if(Arguments == "") or (Arguments == nil) then
OutputF ( Device, NAME_Log, "No argument given.", Arguments )
return true
else
if(Arguments > 5) then
OutputF ( Device, NAME_Log, "The argument is bigger than 5.", Arguments )
else if(Arguments < 5) then
OutputF ( Device, NAME_Log, "The argument is lower than 5.",Arguments )
else
OutputF ( Device, NAME_Log, "The argument is 5.",Arguments )
end
end
return true
end
Register ( funktionenprefix, "commands" )
AddCommand ( funktionenprefix.testfunktion, "testcommand", "<ID>", "Checks if the number is bigger or smaller than 5." )
7. Kapitel - Interaktion mit dem Spiel:
Bis jetzt haben die Scripts ja noch nichts mit FlyFF zu tun und ich glaube kaum, dass ihr mit einem Bot für ein online mmorpg einfach nur Zahlenjonglieren wollt...
Also zeige ich euch hier, wie ihr werte aus dem Spiel herausnimmt und auch teilweise verändert:
Wir beschäftigen uns zuerst mit "GetPlayer ()" und "GetTarget ()". Ja, ihr seht richtig: in die Klammern kommt nichts, sie sind aber trotzdem vorhanden!
"GetPlayer ()" gibt uns unseren Chara aus und "GetTarget ()" gibt und unser Ziel aus, wenn wir kein Ziel haben, wird der wert "nil" ausgegeben.
Das verstehen wahrscheinlich nicht alle, deshalb werde ich das an einem kurzen Beispiel erläutern:
Code:
if(GetTarget () == nil) variablenprefix.ziel = GetPlayer () else variablenprefix.ziel = GetTarget () end
Code:
function funktionenprefix.heal ( Device )
if(GetTarget () == nil)
variablenprefix.ziel = GetPlayer ()
else
variablenprefix.ziel = GetTarget ()
end
UseSkill ( variablenprefix.ziel , 3 )
return true
end
Demnach führt dieses Script den skill heal auf unser Ziel (oder wenn keins markiert ist auf uns selbst) aus.
__________________________________________________ ________
Update: Inhaltsverzeichnis hinzugefügt und im "else if" Abteil mehr erklärt.
Update 2: Kapitel "Interaktion mit dem Spiel" hinzugefügt.
Hoffe das hilft euch faulen säcken auf die sprünge :D
mfg Tom94
-sticky-