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 1.4 Lara mit Objekten kollidieren lassen und verletzen

  • l.m.
  • October 18, 2024 at 4:08 PM
  • October 31, 2024 at 8:55 PM
  • 1,252 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.

  • Möchte man dass Lara bei einer Berührung mit einem bestimmten Moveable Slot verletzt wird kann man dieses Script benutzen.

    Man muss nur die Slot ID des Moveables angeben (siehe WadTool) -> in meinen Fall ist es die ID 1208:

    Dann kann man mit dem Ändern der Variable healthpointsLostPerFrame festlegen wieviel Schaden Lara pro Berührung (je Frame) verlieren soll.

    In unserem Fall soll Lara Schaden erhalten wenn sie ein Objekt vom Typ ANIMATING9 (ID 1208) berührt.

    Ändert bitte den Inhalt von

    Code
    local moveableSlots = {
        1208 --'ANIMATING9'
    }

    auf euren Slot ab, weitere Slots könnt ihr so hinzufügen:

    Code
    local moveableSlots = {
        1208, --'ANIMATING9'
        1209 --'ANIMATING10'
    }

    Weiterhin könnt ihr euren Schaden den ihr pro Berührung (je Frame) Lara schadet hiermit anpassen:

    local healthpointsLostPerFrame = 5

    Die 5 sagt aus, dass Lara pro Berührung 5 HP verliert (bzw. jeden Frame).

    Hier ist das vollständige Script, baut es in eure Level.lua ein:

    1 Script

    Code
    LevelFuncs.OnStart = function() 
    	SetCollideWithItems()
    end
    
    LevelFuncs.__Collided = function(obj1, obj2)
    	local healthpointsLostPerFrame = 5
    	
    	if obj2:GetObjectID() ~= ObjID.LARA then
    		return
    	end
    	
    	PlaySound(31,obj2:GetPosition())
    	EmitBlood((obj2:GetJointPosition(math.random(0,14))),20)
    	obj2:SetHP(obj2:GetHP() - healthpointsLostPerFrame)
    end
    
    function SetCollideWithItems()
        local moveableSlots = {
            1208 --'ANIMATING9'
        }
        for index, moveableSlot in pairs(moveableSlots) do
            local moveables = GetMoveablesBySlot(moveableSlot)
            for index, moveable in pairs(moveables) do
                moveable:SetOnCollidedWithObject(LevelFuncs.__Collided)
            end
        end
    end
    Display More

    2 Erklärung

    In der OnStart  Funktion definieren wir dass die Funktion SetCollideWithItems beim Start des Level getriggert wird.
    In dieser Funktion legen wir die Moveable Slots fest:

    Code
    local moveableSlots = {
       1208 --'ANIMATING9'
    }

    Möchte man mehrere Slots benutzen so kann man den Table einfach ergänzen:

    Code
    local moveableSlots = {
        1208, --'ANIMATING9'
        1209 --'ANIMATING10'
    }

    Danach werden über die For Schleifen alle Objekte der angegeben Slots geholt und die Funktion wird für jedes einzelne Objekt aufgerufen:
    moveable:SetOnCollidedWithObject(LevelFuncs.__Collided)

    Was macht diese Funktion? Sie ist etwas schwerer zu verstehen.
    Die Funktion setzt für jedes einzelne "moveable" eine sogenannte "Callback Funktion" wenn dieses Objekt mit einem anderem Objekt kollidiert.

    Callback Funktionen sind wie "Events" die gesetzt werden. Jedes mal wenn im Spiel etwas passiert (in dem Fall, "moveable" kollidiert mit einem anderen Objekt) wird die Callback Funktion (in dem Fall LevelFuncs.__Collided) aufgerufen.
    Diese Callback Funktion erwartet immer zwei Parameter obj1, obj2:

    Code
    LevelFuncs.__Collided = function(obj1, obj2)
        ...
    end

    obj1 enthält das Objekt was ihr übergeben habt - in dem Fall das ANIMATING9 und obj2 enthält das "andere" Objekt - und das kann im Verlauf also im Spiel, immer ein anderes sein. Zb. Ein Gegner, oder Lara, oder oder oder.

    obj1 ist daher IMMER fest definiert (das Objekt was ihr vor der Funktion SetOnCollidedWithObject definiert, in unserem Fall die Variable "moveable" welches eben ein Objekt des Slots 1208 enthält (ANIMATING9)

    obj2 enthält das Objekt, welches gerade im Spiel mit dem obj1 kollidiert ist, und kann daher je Aufruf ein anderes Objekt enthalten.

    Und genau deswegen fragen wir auch ab, ob es NICHT unsere Lara ist, denn wenn nicht, soll nix mehr passieren:

    Code
    if obj2:GetObjectID() ~= ObjID.LARA then
       return
    end

    Wenn es Lara ist, wird der Code weiter ausgeführt und es wird ein Sound (LARA_INJURY) abgespielt, es wird Blut imitiert und die HP wird von Lara (in dem Fall obj2) abgezogen:

    Code
    PlaySound(31,obj2:GetPosition())
    EmitBlood((obj2:GetJointPosition(math.random(0,14))),20)
    obj2:SetHP(obj2:GetHP() - healthpointsLostPerFrame)

    Umbennung der Variablen oder Funktionsnamen
    Die Variablen obj1 und obj2 können auch gerne umbenannt werden, das ist gar kein Problem! Die Callback Funktion __Collided erwartet nur genau 2 Parameter, wie diese heißen, ist komplett euch überlassen! Das bedeutet: Statt obj1 und obj2 könnt ihr auch a und b, oder CollideObjectReceiver und CollideObjectWith nehmen, oder sonst Namen die euch einfallen. Euer Phantasie sind da keine Grenzen gesetzt.
    Apropos - ihr könnt die Callback Funktion natürlich auch nach belieben umbenennen, ihr müsst diese nur an beiden Stellen ändern. In der Funktionsdefinition LevelFuncs.__Collided = function(obj1, obj2) und im Funktionsaufruf moveable:SetOnCollidedWithObject(LevelFuncs.__Collided)

    Das wars im Prinzip. Viel Spaß beim Ausprobieren!

    Ihr könnt natürlich auch andere lustige Dinge in der Callback Funktion ausprobieren.

    Wie zb. das Explodieren von dem Objekt welches Lara berührt. (oder oder oder..., probiert einfach was aus)

    Das würde zb. so gehen:

    Code
    LevelFuncs.__Collided = function(obj1, obj2)
        obj1:Explode()
        ...
    end

    Nützliche Sound Infos:
    Möchtet ihr nicht, dass der Sound mit der ID 31 immer jeden Frame neu abgespielt wird, (was sich tatsächlich falsch anhört) könnt ihr dazu folgende Einstellung im SoundTool vornehmen:

    Mode "One shot wait": Dadurch überprüft die Engine, ob der Ton bereits in einem 1-Square-Radius abgespielt wird. Wenn ja, wird er nicht erneut abgespielt.
    Achtet auch darauf dass die "Chance" in den Sound Settings im SoundTool einen Einfluss hat wie oft der Ton abgespielt wird. (Wenn die Chance nicht bei 100 liegt, wird der Sound bei einer kurzen Berührung evtl. nicht abgespielt!)


    Es gibt noch andere Modes:

    Mode "One shot rewound":
    Bedeutet, dass der aktuell abgespielte Ton beim Starten des neuen Tons gestoppt wird, wenn er bereits in einem Radius von 1 Quadrat abgespielt wird

    Mode "Loop":
    Im Loop-Modus wird die Wiedergabe so lange fortgesetzt, bis der Ton nicht mehr ausgelöst wird (d. h. wenn er bei jedem Frame ausgelöst wird, wird er wiederholt, anstatt erneut ausgelöst zu werden damit es keine Ohrenschmerzen gibt :P).
    Auf diese Weise kann man einen sich wiederholenden Ton erzeugen, während sich Objekte berühren. Dies kann beispielsweise bei Elektrizitätsgeräuschen praktisch sein.

Share

  • Previous entry Lara Gesundheit und Tod - LUA
  • Next entry LensFlare Objekt & LensFlare Script
  • Changelog
  • PDF

Table of Contents

  • 1 Script
  • 2 Erklärung

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.16
TRLevel.de in the WSC-Connect App on Google Play
TRLevel.de in the WSC-Connect App on the App Store
Download