Merge pull request 'anvil damage mechanism' (#1387) from anvil-entity-damage into master

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/1387
This commit is contained in:
AFCMS 2021-03-26 17:36:17 +00:00
commit 50bdf03189

View file

@ -1,5 +1,8 @@
local S = minetest.get_translator("mcl_falling_nodes") local S = minetest.get_translator("mcl_falling_nodes")
local dmes = minetest.get_modpath("mcl_death_messages") ~= nil local dmes = minetest.get_modpath("mcl_death_messages") ~= nil
local has_mcl_armor = minetest.get_modpath("mcl_armor")
local his_creative_enabled = minetest.is_creative_enabled
local get_falling_depth = function(self) local get_falling_depth = function(self)
if not self._startpos then if not self._startpos then
@ -13,9 +16,8 @@ local deal_falling_damage = function(self, dtime)
if minetest.get_item_group(self.node.name, "falling_node_damage") == 0 then if minetest.get_item_group(self.node.name, "falling_node_damage") == 0 then
return return
end end
-- Cause damage to any player it hits. -- Cause damage to any entity it hits.
-- Algorithm based on MC anvils. -- Algorithm based on MC anvils.
-- TODO: Support smashing other objects, too.
local pos = self.object:get_pos() local pos = self.object:get_pos()
if not self._startpos then if not self._startpos then
-- Fallback -- Fallback
@ -23,30 +25,39 @@ local deal_falling_damage = function(self, dtime)
end end
local objs = minetest.get_objects_inside_radius(pos, 1) local objs = minetest.get_objects_inside_radius(pos, 1)
for _,v in ipairs(objs) do for _,v in ipairs(objs) do
local hp = v:get_hp() if v:is_player() then
if v:is_player() and hp ~= 0 then local hp = v:get_hp()
if not self._hit_players then
self._hit_players = {}
end
local name = v:get_player_name() local name = v:get_player_name()
local hit = false if hp ~= 0 then
for _,v in ipairs(self._hit_players) do if not self._hit_players then
if name == v then self._hit_players = {}
hit = true
end end
end local hit = false
if not hit then for _,v in ipairs(self._hit_players) do
table.insert(self._hit_players, name) if name == v then
local way = self._startpos.y - pos.y hit = true
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 end
if v:is_player() then end
-- TODO: Reduce damage if wearing a helmet 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
-- Reduce damage if wearing a helmet
local inv = v:get_inventory()
local helmet = inv:get_stack("armor", 2)
if has_mcl_armor and not helmet:is_empty() then
hp = hp/4*3
if not his_creative_enabled(name) then
helmet:add_wear(65535/helmet:get_definition().groups.mcl_armor_uses) --TODO: be sure damage is exactly like mc (informations are missing in the mc wiki)
inv:set_stack("armor", 2, helmet)
end
end
local msg local msg
if minetest.get_item_group(self.node.name, "anvil") ~= 0 then if minetest.get_item_group(self.node.name, "anvil") ~= 0 then
msg = S("@1 was smashed by a falling anvil.", v:get_player_name()) msg = S("@1 was smashed by a falling anvil.", v:get_player_name())
@ -56,8 +67,35 @@ local deal_falling_damage = function(self, dtime)
if dmes then if dmes then
mcl_death_messages.player_damage(v, msg) mcl_death_messages.player_damage(v, msg)
end end
v:set_hp(hp, { type = "punch", from = "mod" })
end
end
end
else
local hp = v:get_luaentity().health
if hp and hp ~= 0 then
if not self._hit_mobs then
self._hit_mobs = {}
end
local hit = false
for _,mob in ipairs(self._hit_mobs) do
if v == mob then
hit = true
end
end
--TODO: reduce damage for mobs then they will be able to wear armor
if not hit then
table.insert(self._hit_mobs, v)
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
v:get_luaentity().health = hp
end end
v:set_hp(hp, { type = "punch", from = "mod" })
end end
end end
end end