Make removing of arrow entities also work with mobs, remove arrows on respawn

This commit is contained in:
NO11 2022-01-02 11:06:29 +00:00
parent 7b46225176
commit 7cc7fb1331

View file

@ -73,7 +73,7 @@ local ARROW_ENTITY={
_stuckin=nil, --Position of node in which arow is stuck. _stuckin=nil, --Position of node in which arow is stuck.
_shooter=nil, -- ObjectRef of player or mob who shot it _shooter=nil, -- ObjectRef of player or mob who shot it
_is_arrow = true, _is_arrow = true,
_in_player = false,
_viscosity=0, -- Viscosity of node the arrow is currently in _viscosity=0, -- Viscosity of node the arrow is currently in
_deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession _deflection_cooloff=0, -- Cooloff timer after an arrow deflection, to prevent many deflections in quick succession
} }
@ -439,6 +439,7 @@ function ARROW_ENTITY.get_staticdata(self)
is_critical = self._is_critical, is_critical = self._is_critical,
stuck = self._stuck, stuck = self._stuck,
stuckin = self._stuckin, stuckin = self._stuckin,
stuckin_player = self._in_player,
} }
if self._stuck then if self._stuck then
-- If _stucktimer is missing for some reason, assume the maximum -- If _stucktimer is missing for some reason, assume the maximum
@ -453,21 +454,10 @@ function ARROW_ENTITY.get_staticdata(self)
return minetest.serialize(out) return minetest.serialize(out)
end end
local function remove_arrow_on_joinplayer(staticdata, self)
if not staticdata.activated then
staticdata.activated = true
else
self.object:remove()
end
end
function ARROW_ENTITY.on_activate(self, staticdata, dtime_s) function ARROW_ENTITY.on_activate(self, staticdata, dtime_s)
self._time_in_air = 1.0 self._time_in_air = 1.0
self._in_player = false
local data = minetest.deserialize(staticdata) local data = minetest.deserialize(staticdata)
if data then if data then
remove_arrow_on_joinplayer(data, self)
self._stuck = data.stuck self._stuck = data.stuck
if data.stuck then if data.stuck then
if data.stuckstarttime then if data.stuckstarttime then
@ -498,10 +488,23 @@ function ARROW_ENTITY.on_activate(self, staticdata, dtime_s)
self._shooter = shooter self._shooter = shooter
end end
end end
if data.stuckin_player then
self.object:remove()
end
end end
self.object:set_armor_groups({ immortal = 1 }) self.object:set_armor_groups({ immortal = 1 })
end end
minetest.register_on_respawnplayer(function(player)
for _, obj in pairs(player:get_children()) do
local ent = obj:get_luaentity()
if ent and ent.name and string.find(ent.name, "mcl_bows:arrow_entity") then
obj:remove()
end
end
end)
minetest.register_entity("mcl_bows:arrow_entity", ARROW_ENTITY) minetest.register_entity("mcl_bows:arrow_entity", ARROW_ENTITY)
if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then