Scripting TippsAndTricks
From Iris2
Contents |
Helfende Links
- Lua-Users Wiki
- http://lua-users.org/wiki/LuaDirectory (unter "Code Structure / Programming Paradigms")
- ein paar String-Beispiele
- ein paar Tables Beispiele - Fast alles in Iris2 ist in Tables verpackt
- Macros
- die Datei lib.macros.lua - zu finden in <Iris-Installations-Pfad>/lua/lib.macrolist.lua
- Iris API - eine ausführliche Ansicht ist zu finden unter Classes -> Class Members
Wo anfangen?
Der Editor
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".
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
SetMacro("u", function() dofile(gHomeIrisPath .. "meineMacros/macro1.lua") end)
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.
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.
Also schreiben wir uns ein simples "Hello World!"
AddFadeLines("Hello World!")
Drückt jetzt in Iris2 die Taste "u" und was passiert?!
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
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)
Nützliche Funktionen
Eine Funktion, um Felder, die man braucht zu finden:
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
Aufruf-Beispiel:
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.
Auswertung (Diese XML ist gekürzt):
<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>
Verwendung des Ergebnisses:
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.")

