View source
From Iris2
for
Scripting TippsAndTricks
Jump to:
navigation
,
search
== Helfende Links == * [http://lua-users.org/wiki Lua-Users Wiki] ** http://lua-users.org/wiki/LuaDirectory (unter "Code Structure / Programming Paradigms") ** [http://lua-users.org/wiki/StringRecipes ein paar String-Beispiele] *** [http://lua-users.org/wiki/StringLibraryTutorial die "API" der Strings] ** [http://lua-users.org/wiki/TablesTutorial ein paar Tables Beispiele] - Fast alles in Iris2 ist in Tables verpackt *** [http://lua-users.org/wiki/TableLibraryTutorial die "API" der Tables] * [[Macros]] ** [http://zwischenwelt.org/trac/iris/browser/trunk/lua/lib.macrolist.lua die Datei lib.macros.lua] - zu finden in <nowiki><Iris-Installations-Pfad>/lua/lib.macrolist.lua</nowiki> ** [http://zwischenwelt.org/~hagish/irisdocs/trunk/doc/api_lua/html/ Iris API] - eine ausführliche Ansicht ist zu finden unter Classes -> Class Members == Wo anfangen? == === Der Editor === * Windows: [http://notepad-plus.sourceforge.net/de/site.htm Notepad++] * Linux: [http://projects.gnome.org/gedit/ Gedit] === Skript anlegen === Um in Iris2 zu Skripten müsst ihr Iris2 mindestens einmal gestartet und wieder beendet haben. '''Anmerkung: im weiteren gehe ich davon aus, dass ihr noch keine Dateien im Iris-Verzeichnis manipuliert/verändert habt''' Das Hauptverzeichnis, wo ihr eure Sachen speichert ist unter * Windows: <Benutzer-Ordner>/.iris/ ''[Bitte um vollständige Pfadangaben ergänzen]'' * Linux: /home/<benutzer>/.iris/ '''bzw''' ~/.iris/ Dort legt ihr einen Ordner an und nennt ihn Beispielsweise "meineMacros".<br /> Dort legen wir unser erstes Script "macro1.lua" an. In dem Hauptverzeichnis findet ihr aber noch andere Ordner, öffnet jetzt den Ordner "config" und dort die lua-Datei "mymacros". Schreibt dort an eine beliebige Stelle die Zeile <pre>SetMacro("u", function() dofile(gHomeIrisPath .. "meineMacros/macro1.lua") end)</pre> Erläuterung: *'''SetMacor''' ist eine Funktion, die einen Tastendruck mit einer Lua-Funktion verknüpft, wird die Taste gedrückt, wird Automatisch die verknüpfte Funktion aufgerufen *'''"u"''' ist der Tastenname (weitere findet ihr unter [[Macros#keynames]]) *'''function() [...] end''' Erstellt eine Anonyme Funktion (diese Funktion kann nicht von außen aufgerufen werden) *'''dofile([...])''' Führt die angegebene Datei aus *'''gHomeIrisPath .. "meineMacros/macro1.lua"''' der Dateipfad, der ausgeführt werden soll Geschafft, jetzt können wir in der macro1.lua Datei Funktionen schreiben die mittels eines Drucks auf "u" aufgerufen werden.<br /> Zudem müssen wir so nicht Iris neu starten, damit die änderungen an unserem Script übernommen werden (solltet ihr Beispielsweise versuchen mymacros.lua zu verändern, während Iris2 läuft, wird eure Änderung erst übernommen, wenn ihr Iris2 neu startet) === "Hello Word!" === Nachdem wir nun die Datei macro.lua angelegt haben, wollen wir auch das etwas passiert.<br /> Also schreiben wir uns ein simples "Hello World!" <pre>AddFadeLines("Hello World!")</pre> Drückt jetzt in Iris2 die Taste "u" und was passiert?!<br /> [[File:HelloWorld_Fade.jpg]] Für weitere Experimente mit dem Text könnt ihr euch die Helfenden Links oben angucken. Im nächsten schritt werden wir gleich durchstarten, lua möchte ich an dieser Stelle nämlich nicht erklären. === Player, NPCs und Mobs in der umgebung === <pre>job.create(function() -- einen Job erstellen, damit Iris2 nicht unterbrochen wird (eine Art threading) local mobListe = MacroCmd_ListMobilesInRange(function () return true end, 10) -- Holt alle Mobiles im Umkreis von 5 (tiles?) (installPfad/lua/lib.macrolist.lua) -- anstelle der function() return true end könnt ihr eine Filter-Funktion schreiben: -- function(p) if p.name == "Holle" then return true else return false end; end <-- dies gibt nur Mobiles mit Namen "Holle" zurück for k, v in pairs(mobListe) do -- geht die Mobiles-liste durch -- in k wird (in diesem Fall) eine fortlaufende Zahl gespeichert -- in v wird das "mobile" Objekt gespeichert AddFadeLines(v.name) -- Namen des Mobiles ausgeben end -- lua kennt kein "next", alles wird mit end beendet. end)</pre> [[File:MobListe_Fadelines.jpg]] == Nützliche Funktionen == Eine Funktion, um Felder, die man braucht zu finden: <pre>function saveTableAsXML(table, pfad, maxTiefe) if table == nil then return end -- Die Tabelle muss übergeben werden if pfad == nil then return end -- Ein Pfad muss angegeben werden if maxTiefe == nil then maxTiefe = 4 end -- Die Maximale Tiefe, wie weit "untertabellen" durchforstet werden function printTable(data,key,keytype, tiefe) -- Unterfunktion, übernommen aus irgend einer Iris2-Datei if (tiefe == nil) then tiefe = 0 end local t = type(data) local node = {name=t} if (keytype == "string") then keytype = nil end -- default if (key) then node.attr = {key=key,keytype=keytype} end if t == "nil" then return elseif t == "boolean" then XMLNodeAddChild(node,tostring(data)) elseif t == "number" then XMLNodeAddChild(node,tostring(data)) elseif t == "string" then XMLNodeAddChild(node,tostring(data)) elseif t == "table" and tiefe <= 5 then for k,v in pairs(data) do XMLNodeAddChild(node,printTable(v,tostring(k),type(k), tiefe + 1)) end else XMLNodeAddChild(node,tostring(data)) end return node end LuaXML_SaveFile(pfad,printTable(table)) -- Speichert die entgültige Tabelle end</pre> Aufruf-Beispiel: <pre>local mobListe = MacroCmd_ListMobilesInRange(function () return true end, 10) saveTableAsXML(mobListe, "/home/octavian/Desktop/mobListe.xml") -- Dies speichert eine Liste mit allen Informationen der Mobiles im umkreis.</pre> Auswertung (Diese XML ist gekürzt): <pre><table> <table key="8" keytype="number"> <boolean key="flag_female">true</boolean> <table key="stats"> <number key="str">125</number> <number key="race">1</number> <number key="int">30</number> <number key="gold">0</number> <number key="dex">18</number> <number key="curWeight">106</number> </table> <string key="name">NameDesPlayers</string> <function key="DisplayTextOverHead">function: 0xa045500</function> <number key="serial">369381</number> <boolean key="bIsGhost">false</boolean> </table> </table></pre> Verwendung des Ergebnisses: <pre>local mobListe = MacroCmd_ListMobilesInRange(function () return true end, 10) AddFadeLines(tostring(mobListe[8].flag_female)) --> true AddFadeLines(mobListe[8]["name"]) --> NameDesPlayers AddFadeLines(tostring(mobListe[8].stats.gold)) --> 0 :( mobListe[8]:DisplayTextOverHead("Text wird über dem Kopf des Mobiles angezeigt.") </pre>
Return to
Scripting TippsAndTricks
.
Views
Page
Discussion
View source
History
Personal tools
Log in
main
Main Page
Screenshots
download
Install Guide
Forum
FAQ
Macros
Credits
dev
Developer Blog
A Guide for Artists
Development
Item Model List
Iris-Testshard
Bugreports
SvnLog
API C++
API Lua
wiki
Recent changes
Random page
Help
Search
Toolbox
What links here
Related changes
Special pages