[Tut] Automaton scripten für Neulinge

09/24/2008 21:44 Tom94#1
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).

Code:
local funktionenprefix = { }
local variablenprefix = { }
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:

Code:
variablenprefix.testvariable = 5
Nun hat die Variable "testvariable" (die unser prefix haben muss) den wert 5.
Man kann Variablen auch miteinander verrechnet werden lassen.

Code:
variablenprefix.faktor = 5
variablenprefix.faktor2 = 6
variablenprefix.produkt = variablenprefix.faktor * variablenprefix.faktor2
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:
Code:
variablenprefix.summant = 5
variablenprefix.summant2 = 6
variablenprefix.summe = variablenprefix.summant + variablenprefix.summant2
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:

Code:
if (Bedingung) then
  -code-
end
Zum Beispiel:
Code:
if (1 == 1) then
  -code-
end
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:

Code:
if (1 == 1) then
  variablenprefix.test = 2
end
Wenn 1 = 1, dann wird die Variable "test" auf 2 gesetzt. Leicht oder?
Nun etwas komplexeres, da 1 ja logischerweise immer 1 ist...

Code:
if (variablenprefix.zahl >= 2) then
  variablenprefix.test = 2
end
Wenn "zahl" größer oder gleich 2 ist, dann wird "test" auf 2 gesetzt. Das geht auch mit 2 variablen.

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
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:

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
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.:
Code:
if(1 == 2) then
  -code 1-
else if(1 > 2) then
  -code 2-
else
  -code 3-
end
Wenn 1 = 2 ist, wird "code 1" ausgeführt, ist 1 > 2, dann wird "code 2" ausgeführt. Ansonsten wird "code 3" ausgeführt.

Code:
if (variablenprefix.zahl >= variablenprefix.zahl2) or (variablenprefix.zahl2 >=  variablenprefix.zahl3) then
  -code-
end
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.

Code:
if (variablenprefix.zahl >= variablenprefix.zahl2) and (variablenprefix.zahl2 >=  variablenprefix.zahl3) then
  -code-
end
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:

Code:
function funktionenprefix.testfunktion ( Arguments )
  -code-
end
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:

Code:
function funktionenprefix.testfunktion ( Arguments , Device )
  if(Arguments == "") or (Arguments == nil) then
    return true
  end
end
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.

Code:
function funktionenprefix.testfunktion ( Arguments , Device )
  if(Arguments == "") or (Arguments == nil) then
    OutputF ( Device, NAME_Log, "No argument given.", Arguments )
    return true
  end
end
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.".

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
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:
Code:
Register ( funktionenprefix, "rubrik" )
AddCommand ( funktionenname, "Commandname", "Art der eingabe", "Beschreibung" )
Nun packen wir das mal um, so dass wir ein komplettes script mit unserem ersten command haben:

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." )
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:

Code:
if(GetTarget () == nil)
  variablenprefix.ziel = GetPlayer ()
else
  variablenprefix.ziel = GetTarget ()
end
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!

Code:
function funktionenprefix.heal ( Device )
  if(GetTarget () == nil)
    variablenprefix.ziel = GetPlayer ()
  else
    variablenprefix.ziel = GetTarget ()
  end
UseSkill ( variablenprefix.ziel , 3 )
return true
end
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-
09/24/2008 21:46 Gianotti#2
ich könnte dir jetzt geld dafür geben das ist so eine gute anleitung:D:D:D:D:D


dankeeee jetzt kann ich endlich mein vollauotmatisch-buff script machen^^
09/24/2008 21:49 Tom94#3
also mit buffen is noch nxi drinne aber das kommt noch :D
09/24/2008 21:54 Gianotti#4
Quote:
Originally Posted by Tom94 View Post
also mit buffen is noch nxi drinne aber das kommt noch :D
ich versuch erstma das was dort drin steht dann versuch ich mehr aber ich dank dir nochma für das tut:D:D
09/25/2008 11:13 Aibatt#5
musst dir nix bei denken tom gianotti is immer son dickschädel wie ich xDDDD
09/25/2008 12:20 Alisami#6
Gutes Tutorial ;) Respekt :D
09/25/2008 14:25 Gianotti#7
Quote:
Originally Posted by Aibatt View Post
musst dir nix bei denken tom gianotti is immer son dickschädel wie ich xDDDD
xD das stimmt
09/26/2008 13:09 Gianotti#8
sry für doppelpost aber ich hab jetzt mein blade script fertig



also das macht sowas:alle merc and blade buffs
dann stag

nach 5min stog

wieder buffen und wieder stag

ist zwar noch net viel aber es geht^^


nur dann stagt er ewig weiter wie kann ich es einstellen dass er wieder von vorn beginnt
09/26/2008 15:44 Blanas#9
Definitiv geleecht.
09/26/2008 16:37 Mark-#10
1. es gibt doch den edit button xDD und 2.
Quote:
Originally Posted by Blanas View Post
Definitiv geleecht.
das interessiert hier keinen ob das deine meinung ist ich kenne gianotti einigermaßen und er is eig net der typ der leeched und es dann als seines verbreitet
und 3. das tut is sehr gut bekommst n thanks dafür^^
09/26/2008 16:53 Tom94#11
Quote:
Originally Posted by Blanas View Post
Definitiv geleecht.
Hast du das auf mein Tut oder auf Gianotti bezogen? Wenn auf mein Tut, dann vergleich bitte die Post daten und sag mir den link, so dass ich mich beschweren kann. ;)

Andernfalls würde ich davon abraten solche Beiträge zu schreiben, denn Gianotti hat ja nichtmal was public gestellt.

@Gianotti
Wenn du ein problem hjast, könntest du mir dann bitte das script geben, so dass ichs mir anguggen kann? :D
09/27/2008 22:49 FreeCoder#12
Abend ihr seid ja alle Automaten experten. Tom ne frage ich habe vesucht bei deinem "attack all" script die schleife so zu änder das er nicht nur einmal angreift aber
weiss nicht genau wo ich die richtige stelle ist xD. Kannst du mir mal helfen schade das es nicht auf C++ ist.
09/28/2008 09:26 Tom94#13
joa c++ wäre auf jeden fall leichter. hab ja selber nie ein lua tutorial von vorne gesehen sondern nur alles draus geschlossen xP
wegen der schleife:
möchtest du dass er ein monster öfters angreift oder einfach den zyklus wiederholt?
09/28/2008 10:15 FreeCoder#14
ich möchte die Stelle wieerhollen lassen wo er dem Automaton sagt greif die Monster an dann würde ich das so ändern das die voraussetzung immer erfühlt ist und somit er immer weiter angreift ^^.
09/28/2008 12:50 Tom94#15
schau ma in meinem automatons script thread. da is das command continous drin (startattackall und stopattackall) ;)