Scripting TippsAndTricks

From Iris2

Jump to: navigation, search

Contents

Helfende Links

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?!
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

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)

File:MobListe_Fadelines.jpg

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.")
Personal tools