forked from mtcontrib/3d_armor
Make armor stands 'blast-proof', fixes #55
This commit is contained in:
parent
72cffbae17
commit
5421ce46da
@ -16,27 +16,28 @@ local armor_stand_formspec = "size[8,7]" ..
|
|||||||
|
|
||||||
local elements = {"head", "torso", "legs", "feet"}
|
local elements = {"head", "torso", "legs", "feet"}
|
||||||
|
|
||||||
local function update_entity(pos)
|
local function get_stand_object(pos)
|
||||||
local object = nil
|
local object = nil
|
||||||
local node = minetest.get_node(pos)
|
local objects = minetest.get_objects_inside_radius(pos, 0.5) or {}
|
||||||
local objects = minetest.get_objects_inside_radius(pos, 1) or {}
|
|
||||||
pos = vector.round(pos)
|
|
||||||
for _, obj in pairs(objects) do
|
for _, obj in pairs(objects) do
|
||||||
local p = vector.round(obj:getpos())
|
local ent = obj:get_luaentity()
|
||||||
if vector.equals(p, pos) then
|
if ent then
|
||||||
local ent = obj:get_luaentity()
|
if ent.name == "3d_armor_stand:armor_entity" then
|
||||||
if ent then
|
-- Remove duplicates
|
||||||
if ent.name == "3d_armor_stand:armor_entity" then
|
if object then
|
||||||
-- Remove duplicates
|
obj:remove()
|
||||||
if object then
|
else
|
||||||
obj:remove()
|
object = obj
|
||||||
else
|
|
||||||
object = obj
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return object
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_entity(pos)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
local object = get_stand_object(pos)
|
||||||
if object then
|
if object then
|
||||||
if not string.find(node.name, "3d_armor_stand:") then
|
if not string.find(node.name, "3d_armor_stand:") then
|
||||||
object:remove()
|
object:remove()
|
||||||
@ -136,6 +137,15 @@ minetest.register_node("3d_armor_stand:armor_stand", {
|
|||||||
after_destruct = function(pos)
|
after_destruct = function(pos)
|
||||||
update_entity(pos)
|
update_entity(pos)
|
||||||
end,
|
end,
|
||||||
|
on_blast = function(pos)
|
||||||
|
local object = get_stand_object(pos)
|
||||||
|
if object then
|
||||||
|
object:remove()
|
||||||
|
end
|
||||||
|
minetest.after(1, function(pos)
|
||||||
|
update_entity(pos)
|
||||||
|
end, pos)
|
||||||
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
local function has_locked_armor_stand_privilege(meta, player)
|
local function has_locked_armor_stand_privilege(meta, player)
|
||||||
@ -202,26 +212,9 @@ minetest.register_entity("3d_armor_stand:armor_entity", {
|
|||||||
visual_size = {x=1, y=1},
|
visual_size = {x=1, y=1},
|
||||||
collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1},
|
collisionbox = {-0.1,-0.4,-0.1, 0.1,1.3,0.1},
|
||||||
textures = {"3d_armor_trans.png"},
|
textures = {"3d_armor_trans.png"},
|
||||||
timer = 0,
|
|
||||||
pos = nil,
|
|
||||||
on_activate = function(self)
|
on_activate = function(self)
|
||||||
self.pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
update_entity(self.pos)
|
update_entity(pos)
|
||||||
end,
|
|
||||||
on_step = function(self, dtime)
|
|
||||||
self.timer = self.timer + dtime
|
|
||||||
if self.timer > 4 then
|
|
||||||
self.timer = 0
|
|
||||||
if self.pos then
|
|
||||||
self.object:setpos(self.pos)
|
|
||||||
self.object:setvelocity({x=0, y=0, z=0})
|
|
||||||
local node = minetest.get_node(self.pos)
|
|
||||||
if string.find(node.name, "3d_armor_stand:") then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
self.object:remove()
|
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user