Advertisement
Guest User

secondechance_minetest

a guest
Oct 4th, 2016
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.27 KB | None | 0 0
  1. local LASTSTAND_DURATION = 5
  2. local LASTSTAND_RES_HEALTH = 4
  3. local LASTSTAND_BROADCAST_RADIUS = 50
  4. local LASTSTAND_HEALTH_THRESHOLD = 10 -- normal value is 1, but 10 is for easier for debug
  5.  
  6. local dying_players = {}
  7.  
  8. function setPlayerFree(player)
  9.     player:set_physics_override({speed = 1, jump = 1})
  10.     dying_players[player:get_player_name()] = nil
  11. end
  12.  
  13.  
  14. --minetest.register_on_dieplayer(function(player)
  15. minetest.register_on_player_hpchange(function(player, hp_change)
  16.     local player_name = player:get_player_name()
  17.                                
  18.     if dying_players[player_name] ~= nil or player:get_hp() + hp_change > LASTSTAND_HEALTH_THRESHOLD then -- TOTO add && not minetest.is_singleplayer()
  19.         return false
  20.     end
  21.                                
  22.     local node = minetest.registered_nodes[minetest.get_node(player:getpos()).name]
  23.     if node.groups.lava ~= nil or player:get_breath() == 0 then
  24.         return false
  25.     end
  26.    
  27.     minetest.debug("putting " .. player_name .. " in dying players. hp: " .. player:get_hp() .. ", hp_change: " .. hp_change)
  28.     dying_players[player_name] = LASTSTAND_DURATION
  29.     player:set_hp(1) -- try to prevent death but result in double fault error
  30.     player:set_physics_override({speed = 0, jump = 0})
  31.    
  32.     --mobs.invis[player_name] = true -- if mobs redo is loaded
  33.                        
  34.     minetest.show_formspec(player_name, "laststand:form",
  35.         "size[4,3]" ..
  36.         "label[0,0;Dying in, " .. LASTSTAND_DURATION .. " seconds]" ..
  37.         "button_exit[1,2;2,1;resurect;Resurect]")
  38.    
  39.     local players = minetest.get_objects_inside_radius(player:getpos(), LASTSTAND_BROADCAST_RADIUS)
  40.     for _,obj in ipairs(players) do
  41.         if obj:is_player() then -- TODO add && obj:get_player_name() != player:get_player_name()
  42.             minetest.chat_send_player(obj:get_player_name(), player:get_player_name() .. " is dying, he needs help")
  43.         end
  44.     end
  45.  
  46.     --player:set_hp(LASTSTAND_RES_HEALTH)
  47.     --return true
  48. end)
  49.  
  50.  
  51. minetest.register_globalstep(function(dtime)
  52.     for name, timer in pairs(dying_players) do
  53.         dying_players[name] = dying_players[name] - dtime
  54.         if dying_players[name] <= 0 then
  55.             minetest.debug("deleting " .. name .. " in dying players")
  56.             local player = minetest.get_player_by_name(name)
  57.             player:set_hp(0) -- kill player to launch death process
  58.             setPlayerFree(player)
  59.         end
  60.     end
  61.    
  62. end)
  63.                                
  64. minetest.register_on_dieplayer(function(player)
  65.     if dying_players[player_name] ~= nil then
  66.         setPlayerFree(player)
  67.     end
  68. end)
  69.                                
  70. minetest.register_on_player_receive_fields(function(player, formname, fields)
  71.     local player_name = player:get_player_name()
  72.     if formname ~= "laststand:form" or dying_players[player_name] == nil then
  73.         return false
  74.     end
  75.    
  76.     minetest.debug("resurrecting " .. player_name .. " by his choice")
  77.     player:set_hp(0) -- kill player to launch death process
  78.     setPlayerFree(player)
  79.     return true
  80. end)
  81.  
  82. --minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
  83. --    player:set_hp(LASTSTAND_RES_HEALTH)
  84. --    setPlayerFree(player)
  85. --end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement