forked from Mineclonia/Mineclonia
Move falling anvil handling to other mod
This commit is contained in:
parent
eef6c44e4a
commit
d713cd193c
|
@ -1,3 +1,43 @@
|
||||||
|
local on_anvil_step = function(self, dtime)
|
||||||
|
local pos = self.object:get_pos()
|
||||||
|
if not self._startpos then
|
||||||
|
self._startpos = pos
|
||||||
|
end
|
||||||
|
local objs = minetest.get_objects_inside_radius(pos, 1)
|
||||||
|
for _,v in ipairs(objs) do
|
||||||
|
local hp = v:get_hp()
|
||||||
|
if v:is_player() and hp ~= 0 then
|
||||||
|
if not self._hit_players then
|
||||||
|
self._hit_players = {}
|
||||||
|
end
|
||||||
|
local name = v:get_player_name()
|
||||||
|
local hit = false
|
||||||
|
for _,v in ipairs(self._hit_players) do
|
||||||
|
if name == v then
|
||||||
|
hit = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not hit then
|
||||||
|
table.insert(self._hit_players, name)
|
||||||
|
local way = self._startpos.y - pos.y
|
||||||
|
local damage = (way - 1) * 2
|
||||||
|
damage = math.min(40, math.max(0, damage))
|
||||||
|
if damage >= 1 then
|
||||||
|
hp = hp - damage
|
||||||
|
if hp < 0 then
|
||||||
|
hp = 0
|
||||||
|
end
|
||||||
|
if v:is_player() then
|
||||||
|
mcl_death_messages.player_damage(v, string.format("%s was smashed by a falling anvil.", v:get_player_name()))
|
||||||
|
mcl_hunger.exhaust(v:get_player_name(), mcl_hunger.EXHAUST_DAMAGE)
|
||||||
|
end
|
||||||
|
v:set_hp(hp)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_entity(":__builtin:falling_node", {
|
minetest.register_entity(":__builtin:falling_node", {
|
||||||
initial_properties = {
|
initial_properties = {
|
||||||
visual = "wielditem",
|
visual = "wielditem",
|
||||||
|
@ -34,6 +74,8 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
local ds = {
|
local ds = {
|
||||||
node = self.node,
|
node = self.node,
|
||||||
meta = self.meta,
|
meta = self.meta,
|
||||||
|
_startpos = self._startpos,
|
||||||
|
_hit_players = self._hit_players,
|
||||||
}
|
}
|
||||||
return minetest.serialize(ds)
|
return minetest.serialize(ds)
|
||||||
end,
|
end,
|
||||||
|
@ -42,10 +84,14 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
self.object:set_armor_groups({immortal = 1})
|
self.object:set_armor_groups({immortal = 1})
|
||||||
|
|
||||||
local ds = minetest.deserialize(staticdata)
|
local ds = minetest.deserialize(staticdata)
|
||||||
if ds and ds.node then
|
if ds then
|
||||||
|
self._startpos = ds._startpos
|
||||||
|
self._hit_players = ds._hit_players
|
||||||
|
if ds.node then
|
||||||
self:set_node(ds.node, ds.meta)
|
self:set_node(ds.node, ds.meta)
|
||||||
elseif ds then
|
else
|
||||||
self:set_node(ds)
|
self:set_node(ds)
|
||||||
|
end
|
||||||
elseif staticdata ~= "" then
|
elseif staticdata ~= "" then
|
||||||
self:set_node({name = staticdata})
|
self:set_node({name = staticdata})
|
||||||
end
|
end
|
||||||
|
@ -58,7 +104,7 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
self.object:setacceleration({x = 0, y = -10, z = 0})
|
self.object:setacceleration({x = 0, y = -10, z = 0})
|
||||||
end
|
end
|
||||||
-- Turn to actual node when colliding with ground, or continue to move
|
-- Turn to actual node when colliding with ground, or continue to move
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:get_pos()
|
||||||
|
|
||||||
-- Portal check
|
-- Portal check
|
||||||
local np = {x = pos.x, y = pos.y + 0.3, z = pos.z}
|
local np = {x = pos.x, y = pos.y + 0.3, z = pos.z}
|
||||||
|
@ -129,7 +175,7 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
local vel = self.object:getvelocity()
|
local vel = self.object:getvelocity()
|
||||||
-- Fix position if entity does not move
|
-- Fix position if entity does not move
|
||||||
if vector.equals(vel, {x = 0, y = 0, z = 0}) then
|
if vector.equals(vel, {x = 0, y = 0, z = 0}) then
|
||||||
local npos = vector.round(self.object:getpos())
|
local npos = vector.round(self.object:get_pos())
|
||||||
local npos2 = table.copy(npos)
|
local npos2 = table.copy(npos)
|
||||||
npos2.y = npos2.y - 2
|
npos2.y = npos2.y - 2
|
||||||
local lownode = minetest.get_node(npos2)
|
local lownode = minetest.get_node(npos2)
|
||||||
|
@ -147,8 +193,12 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
-- Normal position fix (expected case)
|
-- Normal position fix (expected case)
|
||||||
self.object:setpos(npos)
|
self.object:set_pos(npos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if minetest.get_item_group(self.node, "anvil") ~= 0 then
|
||||||
|
on_anvil_step(self, dtime)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
-- Hurt players hit by an anvil
|
|
||||||
|
|
||||||
local falling_node = minetest.registered_entities["__builtin:falling_node"]
|
|
||||||
local on_step_old = falling_node.on_step
|
|
||||||
local on_step_add = function(self, dtime)
|
|
||||||
if minetest.get_item_group(self.node.name, "anvil") == 0 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local kill
|
|
||||||
local pos = self.object:getpos()
|
|
||||||
if not self._startpos then
|
|
||||||
self._startpos = pos
|
|
||||||
end
|
|
||||||
local objs = minetest.get_objects_inside_radius(pos, 1)
|
|
||||||
for _,v in ipairs(objs) do
|
|
||||||
local hp = v:get_hp()
|
|
||||||
if v:is_player() and hp ~= 0 then
|
|
||||||
if not self.hit_players then
|
|
||||||
self.hit_players = {}
|
|
||||||
end
|
|
||||||
local name = v:get_player_name()
|
|
||||||
local hit = false
|
|
||||||
for _,v in ipairs(self.hit_players) do
|
|
||||||
if name == v then
|
|
||||||
hit = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not hit then
|
|
||||||
table.insert(self.hit_players, name)
|
|
||||||
local way = self._startpos.y - pos.y
|
|
||||||
local damage = (way - 1) * 2
|
|
||||||
damage = math.min(40, math.max(0, damage))
|
|
||||||
if damage >= 1 then
|
|
||||||
hp = hp - damage
|
|
||||||
if hp < 0 then
|
|
||||||
hp = 0
|
|
||||||
end
|
|
||||||
if v:is_player() then
|
|
||||||
mcl_death_messages.player_damage(v, string.format("%s was smashed by a falling anvil.", v:get_player_name()))
|
|
||||||
mcl_hunger.exhaust(v:get_player_name(), mcl_hunger.EXHAUST_DAMAGE)
|
|
||||||
end
|
|
||||||
v:set_hp(hp)
|
|
||||||
if hp == 0 then
|
|
||||||
kill = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if kill then
|
|
||||||
local pos = self.object:getpos()
|
|
||||||
local pos = {x = pos.x, y = pos.y + 0.3, z = pos.z}
|
|
||||||
if minetest.registered_nodes[self.node.name] then
|
|
||||||
minetest.add_node(pos, self.node)
|
|
||||||
end
|
|
||||||
self.object:remove()
|
|
||||||
core.check_for_falling(pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local on_step_table = {on_step_old, on_step_add}
|
|
||||||
local on_step_new = table.copy(on_step_table)
|
|
||||||
falling_node.on_step = function(self, dtime)
|
|
||||||
for _,v in ipairs(on_step_new) do
|
|
||||||
v(self, dtime)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -430,5 +430,3 @@ if minetest.get_modpath("doc") then
|
||||||
doc.add_entry_alias("nodes", "mcl_anvils:anvil", "nodes", "mcl_anvils:anvil_damage_1")
|
doc.add_entry_alias("nodes", "mcl_anvils:anvil", "nodes", "mcl_anvils:anvil_damage_1")
|
||||||
doc.add_entry_alias("nodes", "mcl_anvils:anvil", "nodes", "mcl_anvils:anvil_damage_2")
|
doc.add_entry_alias("nodes", "mcl_anvils:anvil", "nodes", "mcl_anvils:anvil_damage_2")
|
||||||
end
|
end
|
||||||
|
|
||||||
dofile(minetest.get_modpath(minetest.get_current_modname()).."/falling_anvil.lua")
|
|
||||||
|
|
Loading…
Reference in New Issue