Aaron Suen 00aa460942 Some damage buffs.
- Player hp_max is 8 now, so most injuries will block
  a whole slot each time.
- Player can be reduced to 1 slot, not 2.  The 2 slots
  was from back in the day when players needed to go
  to the surface to heal faster, to help them get up
  there.  Now the 1 slot is only needed in case the
  player is trapped in fire or something.
- Damage effects now don't stop playing just because
  the player has reached maximum injury, and healing
  is also delayed by continued injury.
2020-02-19 19:48:51 -05:00

65 lines
1.9 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs
= minetest, nodecore, pairs
-- LUALOCALS > ---------------------------------------------------------
minetest.register_on_player_hpchange(function(player, hp)
local orig = player:get_hp()
if player:get_armor_groups().immortal then
return orig
end
if hp < 0 then
player:get_meta():set_float("hurttime", nodecore.gametime)
if nodecore.player_visible(player) then
minetest.after(0, function()
local now = player:get_hp()
if now >= orig then return end
nodecore.sound_play_except("player_damage", {
pos = player:get_pos(),
gain = 0.5
}, player)
end)
end
end
if hp + orig <= 0 then
hp = 2 - orig
player:get_meta():set_float("dhp", -2)
local pname = player:get_player_name()
minetest.after(0, function()
player = minetest.get_player_by_name(pname)
if player then return nodecore.addphealth(player, 0) end
end)
end
return hp
end,
true
)
minetest.register_on_dieplayer(function(player)
player:set_hp(1)
player:get_meta():set_float("dhp", -1)
end)
local full = {}
local function heal(player, dtime)
local hpmax = player:get_properties().hp_max
if player:get_hp() <= 0 then return end
if player:get_breath() <= 0 then return end
local pname = player:get_player_name()
if full[pname] and player:get_hp() >= hpmax then return end
full[pname] = nil
local hurt = player:get_meta():get_float("hurttime")
if hurt >= nodecore.gametime - 4 then return end
nodecore.addphealth(player, dtime * 2)
if nodecore.getphealth(player) >= hpmax then full[pname] = true end
end
minetest.register_globalstep(function(dtime)
for _, player in pairs(minetest.get_connected_players()) do
heal(player, dtime)
end
end)
minetest.register_on_joinplayer(function(player)
player:set_properties({hp_max = 8})
end)