00aa460942
- 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.
65 lines
1.9 KiB
Lua
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)
|