110 lines
3.1 KiB
Lua
110 lines
3.1 KiB
Lua
local scene = entities.currentScene()
|
|
local controller = entities.controller()
|
|
|
|
local timer = Timer.new()
|
|
if not timer:running() then
|
|
timer:start();
|
|
end
|
|
|
|
local polarity = 1
|
|
local state = 0
|
|
local targetAlpha = 1
|
|
local alpha = 0
|
|
local target = Vector3f(0,0,0)
|
|
local transform = ent:getComponent("Transform")
|
|
local metadata = ent:getComponent("Metadata")
|
|
local speed = metadata["speed"] or 1.0
|
|
local normal = Vector3f(0,0,-1)
|
|
if metadata["normal"] ~= nil then
|
|
local sign = -1
|
|
if metadata["angle"] < 0 then sign = 1 end
|
|
normal = Vector3f( metadata["normal"][1] * sign, metadata["normal"][2] * sign, metadata["normal"][3] * sign ):normalize()
|
|
end
|
|
local starting = Quaternion(transform.orientation)
|
|
local ending = transform.orientation:multiply(Quaternion.axisAngle( Vector3f(0,1,0), metadata["angle"] ))
|
|
local soundEmitter = ent:loadChild("./sound.json",true)
|
|
local playSound = function( key, loop )
|
|
if not loop then loop = false end
|
|
local url = "/door/" .. key .. ".ogg"
|
|
soundEmitter:queueHook("sound:Emit.%UID%", {
|
|
filename = string.resolveURI(url, metadata["system"]["root"]),
|
|
spatial = true,
|
|
streamed = true,
|
|
volume = "sfx",
|
|
loop = loop
|
|
}, 0)
|
|
end
|
|
local stopSound = function( key )
|
|
local url = "/door/" .. key .. ".ogg"
|
|
soundEmitter:queueHook("sound:Stop.%UID%", {
|
|
filename = string.resolveURI(url, metadata["system"]["root"])
|
|
}, 0)
|
|
end
|
|
local playSoundscape = function( key )
|
|
local url = "/soundscape/" .. key .. ".ogg"
|
|
soundEmitter:queueHook("sound:Emit.%UID%", {
|
|
filename = string.resolveURI(url, metadata["system"]["root"]),
|
|
spatial = false,
|
|
volume = "sfx",
|
|
loop = true,
|
|
streamed = true
|
|
}, 0)
|
|
end
|
|
local stopSoundscape = function( key )
|
|
local url = "/soundscape/" .. key .. ".ogg"
|
|
soundEmitter:queueHook("sound:Stop.%UID%", {
|
|
filename = string.resolveURI(url, metadata["system"]["root"])
|
|
}, 0)
|
|
end
|
|
soundEmitter:getComponent("Transform"):setReference( transform )
|
|
-- on tick
|
|
ent:bind( "tick", function(self)
|
|
-- transform.orientation = starting:slerp( ending, math.cos(time.current() * speed) * 0.5 + 0.5 )
|
|
if state == 1 then
|
|
alpha = alpha + time.delta() * speed
|
|
|
|
if alpha > targetAlpha then
|
|
state = 2
|
|
alpha = targetAlpha
|
|
playSound("default_stop")
|
|
end
|
|
|
|
end
|
|
if state == 3 then
|
|
alpha = alpha - time.delta() * speed
|
|
|
|
if alpha < 0 then
|
|
state = 0
|
|
alpha = 0
|
|
playSound("default_stop")
|
|
end
|
|
end
|
|
|
|
if state > 0 then
|
|
transform.orientation = starting:slerp( ending, alpha * polarity )
|
|
end
|
|
end )
|
|
-- on use
|
|
ent:addHook( "entity:Use.%UID%", function( payload )
|
|
if state == 0 then
|
|
state = 1
|
|
playSound("default_move")
|
|
if payload.uid ~= nil then
|
|
local player = entities.get( payload.uid )
|
|
local pTransform = player:getComponent("Transform")
|
|
local delta = transform.position - pTransform.position
|
|
local side = normal:dot(delta)
|
|
if side > 0 then
|
|
polarity = 1
|
|
elseif side < 0 then
|
|
polarity = -1
|
|
end
|
|
end
|
|
io.print(ent:name())
|
|
end
|
|
if state == 2 then
|
|
state = 3
|
|
playSound("default_move")
|
|
end
|
|
io.print( state, json.encode( payload ) )
|
|
end ) |