Wiederauftauchende Munition in TEN
In der TR4 Engine konnte man bei Munition wie z.B. Shotgun_Ammo1_Item den OCB 128 eintragen. Hatte man die Munition verschossen, tauchte sie genau an der Stelle wieder auf, an der man sie aufgehoben hat, z.B. "Shotgun_Ammo1" Munition.
OCB 128 funktioniert in der TEN Engine nicht mehr, deswegen haben David, Kubsy und ich eine Lua Funktion geschrieben, die denselben Effekt hat.
Vorteil:
Da die Lage der Munition auch durch die Raumnummer bestimmt wird, in der sie platziert wird, kann in anderen Raumen davor ruhig noch liegengebliebene Munition vorhanden sein.
1 Lua Funktion
local i = 0
local increase = false
LevelFuncs.ReappearingAmmo = function()
if GetItemCount(ObjID.SHOTGUN_AMMO1_ITEM) == 0 then
if GetMoveableByName("Shotgun_ammo1_restore" .. i) == nil then
local nullmesh = GetMoveableByName("nullmesh_object")
local nullmeshposition = nullmesh:GetPosition()
local item = Moveable(TEN.Objects.ObjID.SHOTGUN_AMMO1_ITEM, -- object id
"Shotgun_ammo1_restore" .. i, -- name
nullmeshposition,
Rotation(0, 0, 0), nullmesh:GetRoomNumber())
increase = true
end
else
if increase then
i = i + 1
increase = false
end
end
end
AddCallback(TEN.Logic.CallbackPoint.POSTCONTROLPHASE, LevelFuncs.ReappearingAmmo)
Display More
Die Definierung der beiden Variablen "i" und "increase" schreibt ihr am besten an den Anfang in euer Lua Level Datei. (Achtung!!! Nicht in irgendeine .ON Funktion sondern außerhalb.)
Die LevelFuncs. Funktion könnt ihr ganz normal in eure Lua Level Datei schreiben. Durch "AddCallback" müsst ihr sie auch nicht in .OnControlPhase schreiben. Sie wird auch so ständig überprüft.
Hier im Beispiel tauch die "Shotgun_Ammo1" Munition immer wieder auf. Möchtet ihr andere Munition haben, die der Spieler aufsammelt, müsst ihr die Namen entsprechend ändern in z.B. "TEN.Objects.ObjID.REVOLVER_AMMO_ITEM".
if GetItemCount(TEN.Objects.ObjID.REVOLVER_AMMO_ITEM) == 0 then
local item = Moveable(TEN.Objects.ObjID.REVOLVER_AMMO_ITEM, -- object id
Im Raum selber setzt man ein "Nullmesh Objekt". Dieses dient als Platzhalter für die Stelle, an der die Muniton erscheint und dann immer wieder auftauchen soll, wenn der Spieler die entsprechende Muntion verschossen hat. Den Lua Namen für das Nullmesh Objekt tragen wir in unserem Script entsprechend ein.
local nullmesh = GetMoveableByName("nullmesh_object")
Hier hat das Nullmesh Objekt "Smoke_Emitter_White" den Lua Namen "nullmesh_object".
2 Kurze Erklärung der Lua Funktion
Immer wenn die entsprechende Munition den Wert "0" hat, und der erste Lua Name einer Munition eine "0" im Namen hat, erzeuge in dem Raum und an der Stelle, an der sich das Nullmesh Objekt mit dem Namen "nullmesh_object" befindet, ein "Shotgun_Ammo1_Item" mit dem Lua Namen "Shotgun_ammo1_restore1".
Ist das "Shotgun_Ammo1_Item" verschossen, also wieder auf "0" erzeuge ein weiteres mit dem fortlaufenden Namen "Shotgun_ammo1_restore2" in dem Raum und an der Stelle mit dem Nullmesh Objekt usw. Ist dieses verschossen, erzeuge eins mit dem Lua Namen "Shotgun_ammo1_restore3" usw.
Möchtet ihr eine weitere Munition hinzufügen, müsst ihr den Funktionsnamen und die Variabeln in dem Script alle ändern und entsprechend anpassen z.b. "i" nach "i2" und "increase" nach "increase2" usw.
Siehe Beispiel
local i = 0
local increase = false
local i2 = 0
local increase2 = false
LevelFuncs.ReappearingAmmo = function()
if GetItemCount(ObjID.SHOTGUN_AMMO1_ITEM) == 0 then
if GetMoveableByName("Shotgun_ammo1_restore" .. i) == nil then
local nullmesh = GetMoveableByName("nullmesh_object")
local nullmeshposition = nullmesh:GetPosition()
local item = Moveable(TEN.Objects.ObjID.SHOTGUN_AMMO1_ITEM, -- object id
"Shotgun_ammo1_restore" .. i, -- name
nullmeshposition,
Rotation(0, 0, 0), nullmesh:GetRoomNumber())
increase = true
end
else
if increase then
i = i + 1
increase = false
end
end
end
AddCallback(TEN.Logic.CallbackPoint.POSTCONTROLPHASE, LevelFuncs.ReappearingAmmo)
LevelFuncs.ReappearingAmmo2 = function()
if GetItemCount(ObjID.SHOTGUN_AMMO2_ITEM) == 0 then
if GetMoveableByName("Shotgun_ammo2_restore" .. i2) == nil then
local nullmesh2 = GetMoveableByName("nullmesh_object2")
local nullmeshposition2 = nullmesh2:GetPosition()
local item2 = Moveable(TEN.Objects.ObjID.SHOTGUN_AMMO2_ITEM, -- object id
"Shotgun_ammo2_restore" .. i2, -- name
nullmeshposition2,
Rotation(0, 0, 0), nullmesh2:GetRoomNumber())
increase2 = true
end
else
if increase2 then
i2 = i2 + 1
increase2 = false
end
end
end
AddCallback(TEN.Logic.CallbackPoint.POSTCONTROLPHASE, LevelFuncs.ReappearingAmmo2)
Display More
Hier im Beispiel wurde auftauchende Muntion für die "Shotgun_Ammo1" und "Shotgun_Ammo2" definiert. Natürlich braucht ihr dann auch ein zweites Nullmesh Objekt für die "Shotgun_Ammo2_Item" mit einem anderen Lua Namen. Das "Shotgun_Ammo2_Item" taucht dann an der Stelle auf, an der sich das zweite "Nullmesh Objekt" befindet.
Die Variablen für die beiden Arten der Munition schreiben wir am Besten wieder ganz an den Anfang unsere Level Lua Datei.
Erweiterte Variante von DavidDM:
LevelFuncs.__Createobject = function()
ReappearingObject('SHOTGUN_AMMO1_ITEM', 'Room 0')
ReappearingObject('SHOTGUN_AMMO2_ITEM')
end
local indexObject = {}
local increaseIndexObject = {}
function ReappearingObject(slot, checkRoom)
checkRoom = checkRoom or nil
if indexObject[slot] == nil then indexObject[slot] = 0 end
if increaseIndexObject[slot] == nil then increaseIndexObject[slot] = false end
local pickupName = slot .. "_restore" .. indexObject[slot]
local CheckObjectsInRoom = true
local objectsCounter = 0
if checkRoom ~= nil then
local objects = GetMoveablesBySlot(ObjID[slot])
for _, object in pairs(objects) do
objectsCounter = (object:GetRoom():GetName() == checkRoom and object:GetName() ~= '') and
objectsCounter + 1 or objectsCounter
end
CheckObjectsInRoom = (objectsCounter < 1) and true or false
end
if GetItemCount(ObjID[slot]) == 0 and CheckObjectsInRoom then
if GetMoveableByName(pickupName) == nil then
local item = Moveable(TEN.Objects.ObjID[slot], -- object id
pickupName, -- name
GetMoveableByName(slot .. "_nullmesh_object"):GetPosition(),
Rotation(0, 0, 0),
GetMoveableByName(slot .. "_nullmesh_object"):GetRoomNumber())
increaseIndexObject[slot] = true
end
else
if increaseIndexObject[slot] then
indexObject[slot] = indexObject[slot] + 1
increaseIndexObject[slot] = false
end
end
end
AddCallback(TEN.Logic.CallbackPoint.POSTCONTROLPHASE, LevelFuncs.__Createobject)
Display More