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_DEBUG = false
- local dying_players = {}
- local saved_players = {}
- function showPlayerCountdown(player_name)
- if dying_players[player_name] ~= nil and dying_players[player_name] > 0 then
- minetest.chat_send_player(player_name, "wait for someone to resurrect you, dying in " .. dying_players[player_name] .. " seconds")
- minetest.after(1, showPlayerCountdown, player_name)
- end
- end
- function getBonesInventoryBack(player)
- local bones_pos = saved_players[player:get_player_name()]
- local node = minetest.get_node(bones_pos)
- minetest.chat_send_player(player:get_player_name(), "node name" .. node.name)
- if node.name == "bones:bones" then
- --minetest.node_dig(bones_pos, node, player)
- saved_players[player:get_player_name()] = nil
- local bones_inv = minetest.get_inventory({type="node", pos=bones_pos})
- local player_inv = player:get_inventory()
- player_inv:set_list("main", bones_inv:get_list("main"))
- --minetest.remove_node(bones_pos)
- minetest.set_node(bones_pos, {name="air"})
- end
- end
- -- DEBUG
- minetest.register_on_joinplayer(function(player)
- if LASTSTAND_DEBUG then
- player:set_hp(1)
- end
- end)
- minetest.register_on_leaveplayer(function(player)
- local player_name = player:get_player_name()
- dying_players[player_name] = nil
- saved_players[player_name] = nil
- end)
- minetest.register_on_dieplayer(function(player)
- local player_name = player:get_player_name()
- if dying_players[player_name] ~= nil 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
- dying_players[player_name] = LASTSTAND_DURATION
- if LASTSTAND_DEBUG then
- saved_players[player_name] = player:getpos()
- end
- local players = minetest.get_objects_inside_radius(player:getpos(), LASTSTAND_BROADCAST_RADIUS)
- for _,obj in ipairs(players) do
- if obj:is_player() and obj:get_player_name() ~= player_name then
- minetest.chat_send_player(obj:get_player_name(), player_name .. " is dying, he needs help")
- end
- end
- showPlayerCountdown(player_name)
- return true
- end)
- minetest.register_on_respawnplayer(function(player)
- local player_name = player:get_player_name()
- dying_players[player_name] = nil
- if saved_players[player_name] ~= nil then
- player:set_hp(LASTSTAND_RES_HEALTH)
- minetest.after(1, getBonesInventoryBack, player)
- return true
- end
- if LASTSTAND_DEBUG then
- player:set_hp(1)
- end
- return false
- 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.chat_send_player(name, "you died and can't be resurrected anymore")
- dying_players[name] = nil
- end
- end
- end)
- minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
- local player_name = player:get_player_name()
- if dying_players[player_name] ~= nil then
- minetest.chat_send_player(player_name, hitter:get_player_name() .. " helped you, click on resurrect")
- saved_players[player_name] = player:getpos()
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement