Implement stuck arrow timeout properly

This commit is contained in:
Wuzzy 2018-05-09 17:31:04 +02:00
parent f6c5117bf7
commit 1bef0775ce

@ -292,9 +292,15 @@ ARROW_ENTITY.get_staticdata = function(self)
startpos = self._startpos, startpos = self._startpos,
damage = self._damage, damage = self._damage,
stuck = self._stuck, stuck = self._stuck,
stucktimer = self._stucktimer,
stuckin = self._stuckin, stuckin = self._stuckin,
} }
if self._stuck then
-- If _stucktimer is missing for some reason, assume the maximum
if not self._stucktimer then
self._stucktimer = ARROW_TIMEOUT
end
out.stuckstarttime = minetest.get_gametime() - self._stucktimer
end
if self._shooter and self._shooter:is_player() then if self._shooter and self._shooter:is_player() then
out.shootername = self._shooter:get_player_name() out.shootername = self._shooter:get_player_name()
end end
@ -304,16 +310,28 @@ end
ARROW_ENTITY.on_activate = function(self, staticdata, dtime_s) ARROW_ENTITY.on_activate = function(self, staticdata, dtime_s)
local data = minetest.deserialize(staticdata) local data = minetest.deserialize(staticdata)
if data then if data then
self._stuck = data.stuck
if data.stuck then
if data.stuckstarttime then
-- First, check if the stuck arrow is aleady past its life timer.
-- If yes, delete it.
self._stucktimer = minetest.get_gametime() - data.stuckstarttime
if self._stucktimer > ARROW_TIMEOUT then
self.object:remove()
return
end
end
-- Perform a stuck recheck on the next step.
self._stuckrechecktimer = STUCK_RECHECK_TIME
self._stuckin = data.stuckin
end
-- Get the remaining arrow state
self._lastpos = data.lastpos self._lastpos = data.lastpos
self._startpos = data.startpos self._startpos = data.startpos
self._damage = data.damage self._damage = data.damage
self._stuck = data.stuck
if self._stuck then
-- Perform a stuck recheck on the next step
self._stuckrechecktimer = STUCK_RECHECK_TIME
end
self._stucktimer = data.stucktimer
self._stuckin = data.stuckin
if data.shootername then if data.shootername then
local shooter = minetest.get_player_by_name(data.shootername) local shooter = minetest.get_player_by_name(data.shootername)
if shooter and shooter:is_player() then if shooter and shooter:is_player() then