123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- local limbo = status_effects.StatusEffect({name = "limbo"})
- --storage stuff
- ------------------------------------------------------------------------
- local storage = minetest.get_mod_storage()
- --dust
- local dead_player_inventories = {}
- local function restore_inventory(playername, player)
- local inv = player:get_inventory()
- for k, v in pairs(dead_player_inventories[playername])
- do
- inv:set_list(k, v)
- end
- inv:set_list("hand", {ItemStack("wieldhand")})
- dead_player_inventories[playername] = nil
- end
- limbo.register_on_save(function(playername)
- local player = minetest.get_player_by_name(playername)
- restore_inventory(playername, player)
- end)
- local function set_normal_physics(player)
- player:set_physics_override(
- {
- speed = 1,
- jump = 1,
- gravity = 1,
- sneak = true,
- sneak_glitch = false,
- new_move = true,
- })
- end
- limbo.register_on_elapsed(function(playername)
- local player = minetest.get_player_by_name(playername)
- assert(player, "Something happened")
- restore_inventory(playername, player)
- set_normal_physics(player)
- end)
- local function backup_inventory(playername, player)
- if dead_player_inventories[playername]
- then
- return
- end
- local inv = player:get_inventory()
- local lists = inv:get_lists()
- dead_player_inventories[playername] = lists
- end
- local function set_limbo_inventory(player)
- local inv = player:get_inventory()
- inv:set_list("hand", {ItemStack("limbo_respawning:ghost_hand")})
- inv:set_list("main", {})
- inv:set_list("craft", {})
- inv:set_list("craftpreview", {})
- inv:set_list("craftresult", {})
- end
- local function set_limbo_movement(player)
- player:set_physics_override(
- {
- speed = 0.2,
- jump = 0.2,
- gravity = 0,
- sneak = false,
- sneak_glitch = false,
- })
- end
- limbo.register_on_given(function(playername, time)
- local player = minetest.get_player_by_name(playername)
- assert(player, "This shouldn't fail but it might")
- backup_inventory(playername, player)
- set_limbo_inventory(player)
- set_limbo_movement(player)
- end)
- minetest.register_on_player_hpchange(
- function(player, hp_change, reason)
- local name = player:get_player_name()
- if limbo.player_has(name)
- then
- return 0
- end
- return hp_change
- end, true)
- minetest.register_on_respawnplayer(function(player)
- local name = player:get_player_name()
- limbo.give_to(name, 4)
- return true
- end)
- --api functions
- ------------------------------------------------------------------------
- function limbo_respawning.get_living_players()
- local players = minetest.get_connected_players()
- local counter = 0
- local ret = {}
- for i, p in ipairs(players)
- do
- local name = p:get_player_name()
- local hp = p:get_hp()
- if not (limbo.player_has(name) or hp <= 0)
- then
- counter = counter + 1
- ret[counter] = p
- end
- end
- return ret, counter
- end
- function limbo_respawning.get_dead_players()
- local players = minetest.get_connected_players()
- local counter = 0
- local ret = {}
- for i, p in ipairs(players)
- do
- local name = p:get_player_name()
- local hp = p:get_hp()
- if limbo.player_has(name) or hp <= 0
- then
- counter = counter + 1
- ret[counter] = p
- end
- end
- return ret, counter
- end
- function limbo_respawning.return_from_limbo(player)
- local name = player:get_player_name()
- limbo.revoke(name)
- end
- --registering on_respawn callbacks
- --registered function is called with playername as argument
- local on_respawn = {}
- function limbo_respawning.register_on_respawn(func)
- table.insert(on_respawn, func)
- end
- limbo.register_on_elapsed(function(pname)
- for i, f in ipairs(on_respawn)
- do
- f(pname)
- end
- end)
|