mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-26 12:31:05 +01:00
Integrate falling nodes damage
This commit is contained in:
parent
c9b4ddb923
commit
69485f8505
1 changed files with 27 additions and 75 deletions
|
@ -2,8 +2,6 @@ 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 has_mcl_armor = minetest.get_modpath("mcl_armor")
|
||||||
|
|
||||||
local is_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
|
||||||
-- Fallback
|
-- Fallback
|
||||||
|
@ -23,80 +21,34 @@ local deal_falling_damage = function(self, dtime)
|
||||||
-- Fallback
|
-- Fallback
|
||||||
self._startpos = pos
|
self._startpos = pos
|
||||||
end
|
end
|
||||||
local objs = minetest.get_objects_inside_radius(pos, 1)
|
self._hit = self._hit or {}
|
||||||
for _,v in ipairs(objs) do
|
for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
|
||||||
if v:is_player() then
|
if mcl_util.get_hp(obj) > 0 and not self._hit[obj] then
|
||||||
local hp = v:get_hp()
|
self._hit[obj] = true
|
||||||
local name = v:get_player_name()
|
local way = self._startpos.y - pos.y
|
||||||
if hp ~= 0 then
|
local damage = (way - 1) * 2
|
||||||
if not self._hit_players then
|
damage = math.min(40, math.max(0, damage))
|
||||||
self._hit_players = {}
|
if damage >= 1 then
|
||||||
end
|
-- Reduce damage if wearing a helmet
|
||||||
local hit = false
|
local inv = mcl_util.get_inventory(obj)
|
||||||
for _,v in ipairs(self._hit_players) do
|
if inv then
|
||||||
if name == v then
|
local helmet = inv:get_stack("armor", 2)
|
||||||
hit = true
|
if minetest.get_item_group(helmet:get_name(), "combat_armor") > 0 then
|
||||||
|
damage = damage / 4 * 3
|
||||||
|
mcl_util.use_item_durability(helmet, 1)
|
||||||
|
inv:set_stack("armor", 2, helmet)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not hit then
|
local deathmsg, dmg_type
|
||||||
table.insert(self._hit_players, name)
|
if minetest.get_item_group(self.node.name, "anvil") ~= 0 then
|
||||||
local way = self._startpos.y - pos.y
|
deathmsg, dmg_type = "@1 was smashed by a falling anvil.", "anvil"
|
||||||
local damage = (way - 1) * 2
|
else
|
||||||
damage = math.min(40, math.max(0, damage))
|
deathmsg, dmg_type = "@1 was smashed by a falling block.", "falling_node"
|
||||||
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 is_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
|
|
||||||
if minetest.get_item_group(self.node.name, "anvil") ~= 0 then
|
|
||||||
msg = S("@1 was smashed by a falling anvil.", v:get_player_name())
|
|
||||||
else
|
|
||||||
msg = S("@1 was smashed by a falling block.", v:get_player_name())
|
|
||||||
end
|
|
||||||
if dmes then
|
|
||||||
mcl_death_messages.player_damage(v, msg)
|
|
||||||
end
|
|
||||||
v:set_hp(hp, { type = "punch", from = "mod" })
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
if obj:is_player() then
|
||||||
else
|
mcl_death_messages.player_damage(obj, S(deathmsg, obj:get_player_name()))
|
||||||
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
|
end
|
||||||
|
mcl_util.deal_damage(obj, damage, {type = dmg_type})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -166,7 +118,7 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
|
|
||||||
on_activate = function(self, staticdata)
|
on_activate = function(self, staticdata)
|
||||||
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 then
|
if ds then
|
||||||
self._startpos = ds._startpos
|
self._startpos = ds._startpos
|
||||||
|
@ -200,7 +152,7 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
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}
|
||||||
local n2 = minetest.get_node(np)
|
local n2 = minetest.get_node(np)
|
||||||
if n2.name == "mcl_portals:portal_end" then
|
if n2.name == "mcl_portals:portal_end" then
|
||||||
-- TODO: Teleport falling node.
|
-- TODO: Teleport falling node.
|
||||||
self.object:remove()
|
self.object:remove()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -239,7 +191,7 @@ minetest.register_entity(":__builtin:falling_node", {
|
||||||
end
|
end
|
||||||
local nd = minetest.registered_nodes[n2.name]
|
local nd = minetest.registered_nodes[n2.name]
|
||||||
if n2.name == "mcl_portals:portal_end" then
|
if n2.name == "mcl_portals:portal_end" then
|
||||||
-- TODO: Teleport falling node.
|
-- TODO: Teleport falling node.
|
||||||
|
|
||||||
elseif (nd and nd.buildable_to == true) or minetest.get_item_group(self.node.name, "crush_after_fall") ~= 0 then
|
elseif (nd and nd.buildable_to == true) or minetest.get_item_group(self.node.name, "crush_after_fall") ~= 0 then
|
||||||
-- Replace destination node if it's buildable to
|
-- Replace destination node if it's buildable to
|
||||||
|
|
Loading…
Reference in a new issue