1. TRLevel
  2. Forum
    1. Unresolved Threads
    2. Articles
  3. Members
    1. Recent Activities
    2. Users Online
    3. Team
    4. Trophy
    5. Search Members
  4. Tutorials
  5. Levels
  6. Downloads
  7. Adventskalender
    1. Kalender 2025
    2. Kalender 2024
    3. Kalender 2023
    4. Kalender 2022
    5. Kalender 2021
    6. Kalender 2020
    7. Kalender 2019
    8. Kalender 2018
    9. Kalender 2017
  8. Osterkalender
    1. Osterkalender 2025
    2. Osterkalender 2024
    3. Osterkalender 2023
    4. Osterkalender 2022
    5. Osterkalender 2021
    6. Osterkalender 2020
    7. Osterkalender 2019
    8. Osterkalender 2018
    9. Osterkalender 2017
    10. Osterkalender 2016
  9. Mediathek
    1. Albums
    2. Video channels
  • Login
  • Register
  • Search
Tutorials
  • Everywhere
  • Articles
  • Pages
  • Forum
  • Tutorials
  • Files
  • Images
  • Videos
  • More Options
  1. TRLevel.de
  2. Lexicon

Lua Scripting Wiederauftauchende Munition in TEN - LUA

  • Jörg
  • May 23, 2023 at 11:05 AM
  • July 8, 2023 at 3:28 PM
  • 2,039 times viewed

WICHTIG

Diese Tutorials sind beim schreiben immer mit der aktuellsten TEN/TE Version erstellt worden.
Leider kann sich von Version zu Version des Tomb Editor oder der Tomb Engine immer etwas am Code ändern. Daher können manche Teile der Tutorials veraltet sein, bzw. nicht mehr funtkionieren.
Wenn euch hier etwas auffällt, teilt uns dies BITTE mit. Damit man sich das Tutorial ansehen und überarbeiten kann. Dazu bitte einfach ein Thema im "TRLevel Forum" eröffnen.

  • 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

    Code
    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".

    Code
    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

    Code
    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:

    Code
    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
    • Ammo
    • Reappearing
    • OCB 128

Share

  • Previous entry Weitere Level Einstellungen LUA
  • Changelog
  • PDF

Table of Contents

  • 1 Lua Funktion
  • 2 Kurze Erklärung der Lua Funktion

Categories

  1. Archiv 8
    1. Tomb Editor_Alt 2
    2. TRNG_Alt 4
  2. Bauen 239
    1. Tomb Editor (TE) 107
      1. Tipps und Tricks 19
      2. SoundTool 5
      3. TombIDE 6
      4. WadTool 11
      5. NodeEditor 2
    2. Tomb Engine (TEN) 72
      1. Tipps und Tricks 17
      2. Lua Scripting 35
    3. TRNG Engine 194
      1. Scripting 4
      2. NG Center 20
      3. Allgemein 7
      4. Neue TRNG Script Befehle 66
      5. Neue TRNG Trigger 66
      6. Neue TRNG OCB Werte 9
      7. TRNG Plugins 6
      8. Tipps und Tricks 5
      9. TRNG Engine Praktische Beispiele 8
    4. NGLE (Next Generation Level Editor) 12
    5. Tomb Raider Level Editor 86
      1. Licht 4
      2. Geometrie 8
      3. Levelbau 110
      4. Tipps und Tricks 12
      5. Script 3
      6. Sounds 2
      7. Texturen 2
      8. OCB 4
      9. Sonstiges 3
      10. Dxtre3D 1
  3. Tools 21
    1. Metasequoia 5
      1. Metasequoia 3.x 2
      2. Metasequoia 4.x 3
    2. StrPix und WADMerger 4
      1. StrPix 2
      2. WADMerger 2
    3. FLEP 9
    4. Tools 2
    5. TREP 7
      1. Flipeffect Editor 1
      2. Custom Patches 2
    6. TRViewer 1
    7. Blender 0
  4. Allgemeine Tipps und Tricks 3
  5. Level Editor Lexikon 107
    1. Tomb Editor 1
    2. Tools 3
      1. TREP/FLEP 3
      2. WADMerger 0
      3. Strpix 0
    3. NGLE/LE 97
    4. Allgemein 6
      1. WAD Slots 5
    5. NGEngine 0
  1. Privacy Policy
  2. Contact
  3. Legal Notice
Lexicon 7.1.17, developed by www.viecode.com
Powered by WoltLab Suite™ 6.1.18
TRLevel.de in the WSC-Connect App on Google Play
TRLevel.de in the WSC-Connect App on the App Store
Download