Alle Moveables/Statics eines Slots auswählen - LUA
Mit der LUA Funktion "GetMoveableByName" oder "GetStaticByName" können wir ein einzelnes Moveable oder Static Objekt in eine Variable setzen und dann dieser eine LUA Funktion zuordnen. Möchen wir aber dass eine LUA Funktion bei allen Moveables wie z.B. bei dem Gegner "Baddy2" oder einem "Static Objekt in Slot 28" Anwendung findet, ist dies mit dem Auswählen des Namens nicht möglich, da dieser bei jedem Objekt unterschiedlich ist.
Seit Version 1.0.3 gibt es nun die Möglichkeit, alle Moveables oder Statics anhand des Slotnamens auszuwählen.
1 GetMoveablesBySlot(slot)
Mit diesem LUA Befehl, den wir in eine Funktion setzen, können wir alle Moveables eines bestimmten Slots auswählen, z.B. den Gegner Baddy2.
Hier setzen wir in die Variable "moveables" eine Tabelle mit allen "BADDY2", die wir im Level platziert haben.
Anmerkung:
Den Slotnamen können wir z.B. im WadTool nachsehen oder hier: Slot Namen
Zwingend erforderlich ist, dass wir den Präfix "TEN.Objects.ObjID." verwenden. Nur "GetMoveableBySlot(BADDY2)" funktioniert also nicht.
In der Variable "moveables" befindet sich nun quasi eine Tabelle mit allen "Baddy2", die sich in unserem Level befinden. Möchten wir diese nun z.B. alle gleichzeitig explodieren lassen, könnten wir nun jeden "Baddy2" aus dieser Tabelle mit dem jeweiligen Index einzeln aufführen, indem wir es in eine "LevelFuncs." schreiben. Das sähe dann so aus:
LevelFuncs.Explode_All_Baddy2_manually = function ()
local moveables = GetMoveablesBySlot(TEN.Objects.ObjID.BADDY2)
moveables[1]:Explode()
moveables[2]:Explode()
moveables[3]:Explode()
moveables[4]:Explode()
end
usw.
In dem oben genannten Beispiel werden die ersten vier "Baddy2" zur Explosion gebracht. Was aber wenn wir nun hundert "Baddy2" haben? Dann müssten wir dies 100mal schreiben. Sehr aufwendig! Deswegen kann man das Ganze mit einer Schleife (Loop) abkürzen. Das Ganze sieht dann in einer "LevelFuncs." Funktion folgendermaßen aus:
LevelFuncs.Explode_All_Baddy2 = function ()
local moveables = GetMoveablesBySlot(TEN.Objects.ObjID.BADDY2)
for index, moveable in pairs(moveables) do
moveable:Explode()
end
end
Hier wird in einer Schleife in "moveable" der Indexwert gesetzt (angefangen von 1 bis ......) und diesem einem "Baddy2" aus der Tabelle "moveables" zugeordnet. In dieser Tabelle befinden sich alle im Level platzierten" Baddy2". Dieser soll dann hier im Beispiel explodieren.
Es wird also z.B. der Wert 1 dem "Baddy2" z.B. "baddy2_1" zugeordnet und durch "moveable: Explode()" explodiert dieser. Dann wird sofern vorhanden der Wert "2" dem nächsten "Baddy2" z.B. "baddy2_2" zugeordnet und dieser explodiert wieder. Das geht so lange weiter, bis alle "Baddy2" aus der Tabelle abgearbeitet wurden, also bis alle "Baddy2", die sich im Level befinden, explodiert sind.
Wer sich noch genauer mit Schleifen, Tabellen und Arrays und dem Befehl "in pairs" beschäftigen möchte, kann dies in Kubsys Tutorial über Lua Basics nachlesen.
Wie wir diese Funktion nun in einen Volume Trigger setzen, kann man hier nachlesen.
Anmerkung:
"GetMoveablesBySlot" lässt sich nicht im Node Editor aufrufen, man muss diese also in eine Funktion in der Lua Level Datei schreiben.
2 GetStaticsBySlot(slot)
Mit diesem LUA Befehl, den wir in eine Funktion setzen, können wir alle Statics eines bestimmten Slots auswählen, z.B. den Slot 28.
Hier setzen wir in die Variable "statics" eine Tabelle mit allen "Statics im Slot28", die wir im Level platziert haben.
Anmerkung:
Die Slot Zahl können wir z.B. im WadTool nachsehen.
Hier ist kein Präfix notwendig, sondern es reicht die Slot Zahl.
In der Variable "statics" befindet sich nun quasi eine Tabelle mit allen "Statics in Slot 28", die sich in unserem Level befinden. Möchten wir diese nun z.B. alle gleichzeitig umfärbenn, könnten wir nun jedes "Static im Slot 28" aus dieser Tabelle mit dem jeweiligen Index einzeln aufführen, indem wir es in eine "LevelFuncs." schreiben. Das sähe dann so aus:
LevelFuncs.Color_All_Statics28_manually = function ()
local statics = GetStaticsBySlot(28)
statics[1]:SetColor(Color(0,255,0))
statics[2]:SetColor(Color(0,255,0))
statics[3]:SetColor(Color(0,255,0))
statics[4]:SetColor(Color(0,255,0))
end
usw.
In dem oben genannten Beispiel werden die ersten vier "Statics im Slot 28" in Grün umgefärbt. Was aber wenn wir nun hundert "Statics im Slot 28" haben? Dann müssten wir dies 100mal schreiben. Sehr aufwendig! Deswegen kann man das Ganze mit einer Schleife (Loop) abkürzen. Das Ganze sieht dann in einer "LevelFuncs." Funktion folgendermaßen aus:
LevelFuncs.Color_All_Statics28 = function ()
local statics = GetStaticsBySlot(28)
for index, static in pairs(statics) do
static:SetColor(Color(0,255,0))
end
end
Hier wird in einer Schleife in "statics" der Indexwert gesetzt (angefangen von 1 bis ......) und diesem einem "Static in Slot 28" aus der Tabelle "statics" zugeordnet. In dieser Tabelle befinden sich alle im Level platzierten "Statics im Slot 28". Dieser soll dann hier im Beispiel grün färben.
Es wird also z.B. der Wert 1 dem"Static in Slot 28" z.B. "static_mesh_1" zugeordnet und durch "static:SetColor(Color(0,255,0))" wird dieser grün gefärbt.. Dann wird sofern vorhanden der Wert "2" dem nächsten "Static in Slot 28" z.B. "static_mesh_2" zugeordnet und dieser wird ebenfalls grün gefärbt. Das geht so lange weiter, bis alle "Statics in Slot 28" aus der Tabelle abgearbeitet wurden, also bis alle "Statics in Slot 28", die sich im Level befinden, grün gefärbt sind.
Wer sich noch genauer mit Schleifen, Tabellen und Arrays und dem Befehl "in pairs" beschäftigen möchte, kann dies in Kubsys Tutorial über Lua Basics nachlesen.
Wie wir diese Funktion nun in einen Volume Trigger setzen, kann man hier nachlesen.
Anmerkung:
"GetStaticsBySlot" lässt sich nicht im Node Editor aufrufen, man muss diese also in eine Funktion in der Lua Level Datei schreiben.