death_timer/init.lua
2019-05-27 19:01:37 -05:00

182 lines
5.1 KiB
Lua

local storage = minetest.get_mod_storage()
local players
local player_objs = {}
local death_timer = {}
local timeout = 5
local initial_timeout = 5
local timeout_reduce_loop = 3600
local timeout_reduce_rate = 1
players = minetest.deserialize(storage:get_string("players"))
if not players then
players = {}
storage:set_string("players", minetest.serialize(players))
end
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
local p = players[name]
if p and p.time > 1 then
if player and player_objs[name] then
local pos = player:get_pos()
player:set_attach(player_objs[name], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player_objs[name]:set_pos(pos)
elseif player and not player_objs[name] then
local pos = player:get_pos()
player_objs[name] = minetest.add_entity(pos, "death_timer:death")
player:set_attach(player_objs[name], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player_objs[name]:set_pos(pos)
end
player:set_properties({
visual_size = {x = 0, y = 0},
["selectionbox"] = {0, 0, 0, 0, 0, 0},
})
death_timer.loop(name)
end
end)
minetest.register_entity("death_timer:death", {
initial_properties = {
is_visible = false
},
on_activate = function(staticdata, dtime_s)
end
})
function death_timer.reduce_loop()
for k, v in pairs(players) do
if players[k].longtime > 0 then
players[k].longtime = players[k].longtime - timeout_reduce_rate
if players[k].longtime < 0 then
minetest.after(0, function(k) players[k] = nil end, k)
end
else
minetest.after(0, function(k) players[k] = nil end, k)
end
end
minetest.after(1, function() storage:set_string("players", minetest.serialize(players)) end)
minetest.after(timeout_reduce_loop, death_timer.reduce_loop)
end
function death_timer.loop(name)
local p = players[name]
p.time = p.time - 1
if p.time < 1 then
local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
"label[4.85,1.35;Wait" ..
"]button_exit[4,3;3,0.5;death_button;Play" .."]"
minetest.show_formspec(name, "death_timer:death_screen", formspec)
minetest.after(0, function(players, name)
local p = minetest.get_player_by_name(name)
if p then
p:set_detach()
player_objs[name]:remove()
player_objs[name] = nil
end
end, players, name)
if p.interact ~= nil then
local privs = minetest.get_player_privs(name)
privs.interact = p.interact
p.interact = nil
minetest.set_player_privs(name, privs)
end
if p.properties then
local player = minetest.get_player_by_name(name)
player:set_properties(p.properties)
p.properties = nil
end
p.time = nil
p.pos = nil
players[name] = p
storage:set_string("players", minetest.serialize(players))
else
local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
"label[4.85,1.35;Wait" ..
"]button[4,3;3,0.5;death_button;" .. p.time .."]"
minetest.show_formspec(name, "death_timer:death_screen", formspec)
minetest.after(1, death_timer.loop, name)
end
end
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if player_objs[name] then
player:set_detach()
player_objs[name]:remove()
player_objs[name] = nil
end
end)
minetest.register_on_dieplayer(function(player)
local name = player:get_player_name()
local privs = minetest.get_player_privs(name)
local pos = player:get_pos()
if not players[name] then
players[name] = {}
players[name].longtime = initial_timeout
end
players[name].pos = pos
players[name].interact = privs.interact
players[name].time = players[name].longtime + timeout
players[name].longtime = players[name].time
if not players[name].properties then
players[name].properties = player:get_properties()
end
player:set_properties({
visual_size = {x = 0, y = 0},
["selectionbox"] = {0, 0, 0, 0, 0, 0},
})
privs.interact = false
minetest.set_player_privs(name, privs)
storage:set_string("players", minetest.serialize(players))
end)
minetest.register_on_respawnplayer(function(player)
local name = player:get_player_name()
minetest.after(0, function(name)
local player = minetest.get_player_by_name(name)
if player and player_objs[name] then
pos = player:get_pos()
player:set_attach(player_objs[name], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player_objs[name]:set_pos(pos)
elseif player and not player_objs[name] then
pos = player:get_pos()
player_objs[name] = minetest.add_entity(pos, "death_timer:death")
player:set_attach(player_objs[name], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player_objs[name]:set_pos(pos)
end
end, name)
local formspec
if players[name] and players[name].time then
formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
"label[4.85,1.35;Wait" ..
"]button[4,3;3,0.5;death_button;" .. players[name].time .."]"
else
formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
"label[4.85,1.35;Wait" ..
"]button_exit[4,3;3,0.5;death_button;Play" .."]"
end
minetest.after(1, minetest.show_formspec, name, "death_timer:death_screen", formspec)
minetest.after(2, death_timer.loop, name)
end)
minetest.after(timeout_reduce_loop, death_timer.reduce_loop)