respawning.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. local limbo = status_effects.StatusEffect({name = "limbo"})
  2. --storage stuff
  3. ------------------------------------------------------------------------
  4. local storage = minetest.get_mod_storage()
  5. --dust
  6. local dead_player_inventories = {}
  7. local function restore_inventory(playername, player)
  8. local inv = player:get_inventory()
  9. for k, v in pairs(dead_player_inventories[playername])
  10. do
  11. inv:set_list(k, v)
  12. end
  13. inv:set_list("hand", {ItemStack("wieldhand")})
  14. dead_player_inventories[playername] = nil
  15. end
  16. limbo.register_on_save(function(playername)
  17. local player = minetest.get_player_by_name(playername)
  18. restore_inventory(playername, player)
  19. end)
  20. local function set_normal_physics(player)
  21. player:set_physics_override(
  22. {
  23. speed = 1,
  24. jump = 1,
  25. gravity = 1,
  26. sneak = true,
  27. sneak_glitch = false,
  28. new_move = true,
  29. })
  30. end
  31. limbo.register_on_elapsed(function(playername)
  32. local player = minetest.get_player_by_name(playername)
  33. assert(player, "Something happened")
  34. restore_inventory(playername, player)
  35. set_normal_physics(player)
  36. end)
  37. local function backup_inventory(playername, player)
  38. if dead_player_inventories[playername]
  39. then
  40. return
  41. end
  42. local inv = player:get_inventory()
  43. local lists = inv:get_lists()
  44. dead_player_inventories[playername] = lists
  45. end
  46. local function set_limbo_inventory(player)
  47. local inv = player:get_inventory()
  48. inv:set_list("hand", {ItemStack("limbo_respawning:ghost_hand")})
  49. inv:set_list("main", {})
  50. inv:set_list("craft", {})
  51. inv:set_list("craftpreview", {})
  52. inv:set_list("craftresult", {})
  53. end
  54. local function set_limbo_movement(player)
  55. player:set_physics_override(
  56. {
  57. speed = 0.2,
  58. jump = 0.2,
  59. gravity = 0,
  60. sneak = false,
  61. sneak_glitch = false,
  62. })
  63. end
  64. limbo.register_on_given(function(playername, time)
  65. local player = minetest.get_player_by_name(playername)
  66. assert(player, "This shouldn't fail but it might")
  67. backup_inventory(playername, player)
  68. set_limbo_inventory(player)
  69. set_limbo_movement(player)
  70. end)
  71. minetest.register_on_player_hpchange(
  72. function(player, hp_change, reason)
  73. local name = player:get_player_name()
  74. if limbo.player_has(name)
  75. then
  76. return 0
  77. end
  78. return hp_change
  79. end, true)
  80. minetest.register_on_respawnplayer(function(player)
  81. local name = player:get_player_name()
  82. limbo.give_to(name, 4)
  83. return true
  84. end)
  85. --api functions
  86. ------------------------------------------------------------------------
  87. function limbo_respawning.get_living_players()
  88. local players = minetest.get_connected_players()
  89. local counter = 0
  90. local ret = {}
  91. for i, p in ipairs(players)
  92. do
  93. local name = p:get_player_name()
  94. local hp = p:get_hp()
  95. if not (limbo.player_has(name) or hp <= 0)
  96. then
  97. counter = counter + 1
  98. ret[counter] = p
  99. end
  100. end
  101. return ret, counter
  102. end
  103. function limbo_respawning.get_dead_players()
  104. local players = minetest.get_connected_players()
  105. local counter = 0
  106. local ret = {}
  107. for i, p in ipairs(players)
  108. do
  109. local name = p:get_player_name()
  110. local hp = p:get_hp()
  111. if limbo.player_has(name) or hp <= 0
  112. then
  113. counter = counter + 1
  114. ret[counter] = p
  115. end
  116. end
  117. return ret, counter
  118. end
  119. function limbo_respawning.return_from_limbo(player)
  120. local name = player:get_player_name()
  121. limbo.revoke(name)
  122. end
  123. --registering on_respawn callbacks
  124. --registered function is called with playername as argument
  125. local on_respawn = {}
  126. function limbo_respawning.register_on_respawn(func)
  127. table.insert(on_respawn, func)
  128. end
  129. limbo.register_on_elapsed(function(pname)
  130. for i, f in ipairs(on_respawn)
  131. do
  132. f(pname)
  133. end
  134. end)