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 2026
    2. Osterkalender 2025
    3. Osterkalender 2024
    4. Osterkalender 2023
    5. Osterkalender 2022
    6. Osterkalender 2021
    7. Osterkalender 2020
    8. Osterkalender 2019
    9. Osterkalender 2018
    10. Osterkalender 2017
    11. 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 Soft Kollision für Statics setzen

  • l.m.
  • September 27, 2022 at 3:34 PM
  • November 21, 2022 at 1:32 PM
  • 3,962 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.

  • Für manche Items ist die harte Kollision sinnvoll, wie für Türen, oder Pushables.

    Wenn wir aber bedenken dass Lara auch vor Bäumen oder Pflanzen wie vor eine Wand rennt, sieht das schon wieder anders aus.

    In TEN haben die Items alle standardmäßig die "Harte" Kollision.

    Nun ändern wir das für Objekte ab, die eine "softe" Kollision haben sollen.


    Ab TEN 1.0.3 können wir mit GetStaticsBySlot() alle Objekte eines Slots auswählen und benötigen daher nicht mehr alle Objekte einzeln.

    Dazu kopiert ihr diese Funktion in euer Level Lua Script:

    Code
    function SetStaticsSoftCollision()
        local staticSlots = {
            0,2,4,5,6,7,11,12
        }
    
        for index, staticSlot in pairs(staticSlots) do
            local statics = GetStaticsBySlot(staticSlot)
            for index, static in pairs(statics) do
                static:SetSolid(false)
            end
        end
    end
    Display More

    Erklärung:

    Ihr sucht also erstmal alle Slot ID's der Statics raus, die eine Soft Collision haben sollen und speichert dies in einem Table (in diesem Fall "staticSlots") ab.

    Code
    local staticSlots = {
        0,2,4,5,6,7,11,12
    }

    Dann werden alle Static ID Slots in einem Schleifendurchgang iteriert und während jeden Schleifendurchgangs werden alle Static des aktuell in der Schleife befindlichen Slots in einer neuen Variable "Statics" gespeichert ->

    Code
    local statics = GetStaticsBySlot(staticSlot)

    Ein weiterer Schleifendurchgang setzt dann für alle Statics des aktuellen Slots die Soft Collision:

    Code
    for index, static in pairs(statics) do
        static:SetSolid(false)
    end

    Dann muss die Funktion noch getriggert werden. Ihr könnt das dann entweder über einen Volume Trigger machen, oder (in dem Fall vielleicht die sinnvollere Alternative)

    dies über einen Level Event triggern - in dem Fall ergibt es Sinn dies hier zu triggern:

    Code
    LevelFuncs.OnStart = function() 
        SetStaticsSoftCollision()
    end

    Dies führt dazu, dass eure Funktion

    Code
    SetStaticsSoftCollision()

    dann einmal zu Anfang nach dem Start des Level ausgeführt wird.

    Wollt ihr die Funktion aber trotzdem lieber via Volume Trigger ausführen, muss die Funktion als "LevelFuncs" definiert werden:

    Code
    LevelFuncs.SetStaticsSoftCollision = function(triggerer) 
        ...
    end

    Das wars.

    Alle Slots (in meinem Fall sind das 0,2,4,5,6,7,11,12) haben dann nach dem Level Start eine "Soft Collision".


    Vor der Version 1.0.3 mussten wir alle Namen der Objekte manuell heraussuchen:

    Dazu benötigen wir den "Namen" der Objekte. Finden könnt ihr das im TE.

    Dazu markiert ihr das betreffende Objekt und in der ersten Zeile im schwarzen Kasten steht der Name in eckigen Klammern [].

    In meinem Fall ist das "static_mesh_399":

    Ihr könnt den Namen auch anpassen, damit das Script später lesbarer ist. Zum Beispiel "Baum 1" oder sowas in der Art.

    Das geht mit Rechtsklick auf das Objekt und "Rename Object".

    Nun kopiert ihr den Namen.

    Solltet ihr mehrere ändern wollen, so kopiert ihr auch die anderen Namen. Ich habe noch 2 weitere: "static_mesh_433" und "static_mesh_398".

    Im Level Lua Script setzt ihr bei der "OnStart" Function eine neue Funktion - wir nennen diese "SetStaticsSoftCollision" :

    Code
    LevelFuncs.OnStart = function() 
        SetStaticsSoftCollision()
    end

    Damit wird SetStaticsSoftCollision nach dem Start des Levels aufgerufen.

    Die Neue Funktion könnt ihr dann nach dem Ende eures Scriptes setzen.

    Bei einem leeren Script ist das normalerweise diese Zeile:

    Code
    LevelFuncs.OnEnd= function() end

    Die Funktion "SetStaticsSoftCollision" bekommt folgenden Inhalt:

    Code
    function SetStaticsSoftCollision()
    
        local SoftCollisionStatics = {
            "static_mesh_433", 
            "static_mesh_399", 
            "static_mesh_398"
        }
    
        for index, value in ipairs(SoftCollisionStatics) do
            local static = GetStaticByName(value)
            static:SetSolid(false)
        end
    end
    Display More

    Was macht die Funktion?

    Code
    local SoftCollisionStatics = {
        "static_mesh_433", 
        "static_mesh_399", 
        "static_mesh_398"
    }

    Erstellt einen lokalen "Table" (eine Gruppe von Werten) mit dem Namen "SoftCollisionStatics".

    Die Werte werden kommasepariert hinzugefügt.

    Code
    for index, value in ipairs(SoftCollisionStatics) do
        local static = GetStaticByName(value)
        static:SetSolid(false)
    end

    Hier wird mit einer "Schleife" bzw. Loop gearbeitet. Es ist eine spezielle Schleife, denn diese wird NUR SO OFT ausgeführt, wie es Werte in dem Table "SoftCollisionStatics" gibt.

    Ich hätte auch eine "normale" for oder while Schleife nehmen können, aber da hätte ich eine Anzahl an Schleifen Durchgängen angeben müssen. Somit müsste ich bei Anpassungen (hinzufügen oder entfernen von Objekten im Table "SoftCollisionStatics" auch immer die Schleife abändern. Als Tipp: Wenn ein Table durchgegangen werden soll (wie in diesem Fall) - nutzt immer die spezielle For Schleife.

    Tables haben immer einen Index und ein Value. Sofern man kein "assoziatives" Table erstellt, sondern wie in unserem Fall ein einfaches durchnummeriertes Table Object, ist der Index immer fortlaufend eine Ziffer und das Value das dazugehörige "Element" (den Namen den wir vergeben haben, also )

    Im index wird der "key" des Items des Table des aktuellen Durchgangs gespeichert (Index 1 - 3) - und im value eben das "Value" - in unserem Fall "static_mesh_433", "static_mesh_399", "static_mesh_398"

    Innerhalb der Schleife wird nun über GetStaticByName(value) ein Static Object mit dem Namen geholt (welche in "value") steht und in der lokalen Variable "static" gespeichert.

    Mit static:SetSolid(false) wird die "soft" Kollision gesetzt.

    Und das wars. Alle Objekte die im Table definiert werden, bekommen nun eine "soft" Kollision.

    Eventuell gibt es ja irgendwann mal die Möglichkeit Statics oder Moveable über den Slot (anstelle über den Namen) zu holen.

    Dann bräuchte man sich keinen Table erstellen. Aber solange es das nicht gibt, muss man es so machen.

    Hier noch das gesamte Script:

    Code
    ---- FILE: \Jungle_Feaver.lua
    
    LevelFuncs.OnLoad = function() end
    LevelFuncs.OnSave = function() end
    LevelFuncs.OnStart = function() 
        SetStaticsSoftCollision()
    end
    LevelFuncs.OnControlPhase = function() end
    LevelFuncs.OnEnd = function() end
    
    function SetStaticsSoftCollision()
    
        local SoftCollisionStatics = {
            "static_mesh_433", 
            "static_mesh_399", 
            "static_mesh_398"
        }
    
        for index, value in ipairs(SoftCollisionStatics) do
            local static = GetStaticByName(value)
            static:SetSolid(false)
        end
    end
    Display More
    • Static
    • Collision
    • Lua Scripting

Share

  • Previous entry Secrets - LUA
  • Next entry Staubpartikel ParticleEmitter - Tutorial / Generator
  • Changelog
  • PDF

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