engine/bin/data/entities/scripts/trigger.lua

66 lines
1.7 KiB
Lua

local ent = ent
local scene = entities.currentScene()
local metadata = ent:getComponent("Metadata")
local metadataValve = metadata["valve"] or {}
local physicsBody = ent:getComponent("PhysicsBody")
local timer = Timer.new()
if not timer:running() then
timer:start()
end
local classname = metadataValve["classname"] or "trigger_multiple"
local wait = tonumber(metadataValve["wait"]) or 0.2
local isActive = true
if classname == "trigger_once" then
wait = -1
end
local touching = {}
local nextTriggerTime = 0
ent:bind( "tick", function(self)
if not isActive or not physicsBody:initialized() then return end
local currentCollisions = {}
local collisionEvents = physicsBody:getCollisionEvents()
for i, event in ipairs(collisionEvents) do
local other = nil
if event.a:getObject():uid() == ent:uid() then
other = event.b
elseif event.b:getObject():uid() == ent:uid() then
other = event.a
end
if other then
local uid = other:getObject():uid()
currentCollisions[uid] = true
if not touching[uid] then
touching[uid] = true
ent:queueHook("io:FireOutput.%UID%", { output = "OnStartTouch" }, 0)
if wait == -1 or timer:elapsed() >= nextTriggerTime then
ent:queueHook("io:FireOutput.%UID%", { output = "OnTrigger" }, 0)
if wait == -1 then
isActive = false
--entities.destroy(ent)
return
else
nextTriggerTime = timer:elapsed() + wait
end
end
end
end
end
for uid, _ in pairs(touching) do
if not currentCollisions[uid] then
touching[uid] = nil
ent:queueHook("io:FireOutput.%UID%", { output = "OnEndTouch" }, 0)
end
end
end )