Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local LASTSTAND_DURATION = 5
- local LASTSTAND_RES_HEALTH = 4
- local LASTSTAND_BROADCAST_RADIUS = 50
- local LASTSTAND_HEALTH_THRESHOLD = 10 -- normal value is 1, but 10 is for easier for debug
- local dying_players = {}
- function setPlayerFree(player)
- player:set_physics_override({speed = 1, jump = 1})
- dying_players[player:get_player_name()] = nil
- end
- --minetest.register_on_dieplayer(function(player)
- minetest.register_on_player_hpchange(function(player, hp_change)
- local player_name = player:get_player_name()
- if dying_players[player_name] ~= nil or player:get_hp() + hp_change > LASTSTAND_HEALTH_THRESHOLD then -- TOTO add && not minetest.is_singleplayer()
- return false
- end
- local node = minetest.registered_nodes[minetest.get_node(player:getpos()).name]
- if node.groups.lava ~= nil or player:get_breath() == 0 then
- return false
- end
- minetest.debug("putting " .. player_name .. " in dying players. hp: " .. player:get_hp() .. ", hp_change: " .. hp_change)
- dying_players[player_name] = LASTSTAND_DURATION
- player:set_hp(1) -- try to prevent death but result in double fault error
- player:set_physics_override({speed = 0, jump = 0})
- --mobs.invis[player_name] = true -- if mobs redo is loaded
- minetest.show_formspec(player_name, "laststand:form",
- "size[4,3]" ..
- "label[0,0;Dying in, " .. LASTSTAND_DURATION .. " seconds]" ..
- "button_exit[1,2;2,1;resurect;Resurect]")
- local players = minetest.get_objects_inside_radius(player:getpos(), LASTSTAND_BROADCAST_RADIUS)
- for _,obj in ipairs(players) do
- if obj:is_player() then -- TODO add && obj:get_player_name() != player:get_player_name()
- minetest.chat_send_player(obj:get_player_name(), player:get_player_name() .. " is dying, he needs help")
- end
- end
- --player:set_hp(LASTSTAND_RES_HEALTH)
- --return true
- end)
- minetest.register_globalstep(function(dtime)
- for name, timer in pairs(dying_players) do
- dying_players[name] = dying_players[name] - dtime
- if dying_players[name] <= 0 then
- minetest.debug("deleting " .. name .. " in dying players")
- local player = minetest.get_player_by_name(name)
- player:set_hp(0) -- kill player to launch death process
- setPlayerFree(player)
- end
- end
- end)
- minetest.register_on_dieplayer(function(player)
- if dying_players[player_name] ~= nil then
- setPlayerFree(player)
- end
- end)
- minetest.register_on_player_receive_fields(function(player, formname, fields)
- local player_name = player:get_player_name()
- if formname ~= "laststand:form" or dying_players[player_name] == nil then
- return false
- end
- minetest.debug("resurrecting " .. player_name .. " by his choice")
- player:set_hp(0) -- kill player to launch death process
- setPlayerFree(player)
- return true
- end)
- --minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
- -- player:set_hp(LASTSTAND_RES_HEALTH)
- -- setPlayerFree(player)
- --end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement