Add code for wiper animation
This commit is contained in:
parent
2174a86ae7
commit
7bdebf2506
107
script.lua
107
script.lua
@ -644,6 +644,113 @@ end
|
||||
|
||||
|
||||
|
||||
-- }}}
|
||||
|
||||
-- Wipers {{{
|
||||
do
|
||||
local wiper_state="STOPPED" -- valid states are "STOPPED", "STARTING", "STARTED", "STOPPING"
|
||||
local wiper_wipe=animations[MODEL_NAME].wiper_wipe
|
||||
local wiper_target_state=false
|
||||
local wiper_deploy=animations[MODEL_NAME].wiper_deploy
|
||||
local wiper=model.Head_Accessory.Wiper
|
||||
assert(type(wiper_wipe)=="Animation")
|
||||
assert(type(wiper_deploy)=="Animation")
|
||||
assert(type(wiper)=="ModelPart")
|
||||
|
||||
wiper_wipe:setPriority(1)
|
||||
wiper_deploy:setPriority(0)
|
||||
wiper:setVisible(false)
|
||||
|
||||
---Check if a HOLD type animation is currently held
|
||||
---@param animation Animation Check if an animation is waiting at the end of a hold
|
||||
local function hold_ended(animation)
|
||||
local anim_time=animation:getTime()
|
||||
local anim_length=animation:getLength()
|
||||
|
||||
return animation:getLoop()=="HOLD" and
|
||||
(anim_time==anim_length or anim_time==0)
|
||||
end
|
||||
|
||||
---Finish and hold an animation on the last frame
|
||||
---@return boolean Whether or not the animation has reached the end of the hold
|
||||
function stop_and_wait(animation)
|
||||
if hold_ended(animation) then
|
||||
return true
|
||||
end
|
||||
animation:setLoop("HOLD")
|
||||
return false
|
||||
end
|
||||
|
||||
-- steps to stop:
|
||||
-- stop wiping animation
|
||||
-- (set to hold, wait for time)
|
||||
-- start retract animation (wiper_deploy, speed: -1)
|
||||
-- wait for end
|
||||
-- finalize state, hide part
|
||||
--
|
||||
-- steps to start:
|
||||
-- show part
|
||||
-- start animation (wiper_deploy, speed: 1)
|
||||
-- wait for end
|
||||
-- start wipe animation, loop
|
||||
local wiper_run_deploy_switch={
|
||||
STOPPED=function(state)
|
||||
if state then
|
||||
wiper_state="STARTING"
|
||||
wiper_deploy:setSpeed(1):stop():play()
|
||||
wiper:setVisible(true)
|
||||
end
|
||||
end,
|
||||
STARTING=function(state)
|
||||
if wiper_deploy:getTime()==wiper_deploy:getLength() then
|
||||
wiper_deploy:stop()
|
||||
wiper_wipe:play():setLoop("LOOP")
|
||||
wiper_state="STARTED"
|
||||
end
|
||||
end,
|
||||
STARTED=function(state)
|
||||
if not state then
|
||||
wiper_state="STOPPING"
|
||||
stop_and_wait(wiper_wipe)
|
||||
end
|
||||
end,
|
||||
STOPPING=function(state)
|
||||
-- stop process has concluded
|
||||
if wiper_deploy:getPlayState() == "PLAYING" and wiper_deploy:getTime()==0 then
|
||||
wiper_state="STOPPED"
|
||||
wiper:setVisible(false)
|
||||
wiper_deploy:stop()
|
||||
elseif stop_and_wait(wiper_wipe) then
|
||||
wiper_wipe:stop()
|
||||
wiper_deploy:setSpeed(-1):play()
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
--- Run deploy action
|
||||
---@param state boolean Should the wiper be deployed?
|
||||
local function wiper_run_deploy(state)
|
||||
wiper_run_deploy_switch[wiper_state](state)
|
||||
end
|
||||
|
||||
local function wiper_sync_state()
|
||||
wiper_run_deploy(wiper_target_state)
|
||||
end
|
||||
--- Set wiper state. Ignores subsequent calls
|
||||
---@param state boolean true to start wiper, false to stop wiper
|
||||
function set_wiper(state)
|
||||
if state ~= wiper_target_state then
|
||||
wiper_target_state=state
|
||||
end
|
||||
end
|
||||
|
||||
function wiper_tick()
|
||||
set_wiper(player:isInRain())
|
||||
wiper_sync_state()
|
||||
end
|
||||
|
||||
events.TICK:register(wiper_tick, "wiper")
|
||||
end
|
||||
-- }}}
|
||||
|
||||
-- initialize values -- {{{
|
||||
|
Loading…
x
Reference in New Issue
Block a user