death_timer/init.lua

155 lines
4.1 KiB
Lua

local death_timer = {}
local players = {}
local timeout = tonumber(minetest.settings:get("death_timer.timeout")) or 8
local cloaking_mod = minetest.global_exists("cloaking")
function death_timer.show(player, name)
if not cloaking_mod then
local p = players[name]
if p and p.properties then
local player = minetest.get_player_by_name(name)
if player then
local props = p.properties
player:set_properties({
visual_size = props.visual_size,
["selectionbox"] = props["selectionbox"],
})
end
p.properties = nil
players[name] = p
end
elseif minetest.get_player_by_name(name) then
cloaking.unhide_player(name)
end
end
function death_timer.hide(player, name)
if not cloaking_mod then
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},
})
else
cloaking.hide_player(name)
end
end
function death_timer.create_deathholder(player, name)
local obj = players[name].obj
if not obj then
obj = minetest.add_entity({x = 0, y = 0, z = 0}, "death_timer:death")
end
if player then
player:set_attach(obj, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
obj:get_luaentity().owner = name
obj:set_pos(player:get_pos())
players[name].obj = obj
end
end
function death_timer.formspec(name, text)
local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
"label[5.15,1.35;Wait" ..
"]button_exit[4,3;3,0.5;death_button;" .. text .."]"
minetest.show_formspec(name, "death_timer:death_screen", formspec)
end
minetest.register_entity("death_timer:death", {
is_visible = false,
on_step = function(self, dtime)
self.timer= self.timer + dtime
if self.timer >= 10 then
self.timer = 0
if not (self.owner and minetest.get_player_by_name(self.owner)) then
self.object:remove()
end
end
end,
on_activate = function(self, staticdata)
self.timer = 0
self.object:set_armor_groups({immortal = 1, ignore = 1, do_not_delete = 1})
end
})
function death_timer.create_loop(player, name)
if not players[name].loop then
players[name].loop = true
death_timer.loop(player, name)
end
end
function death_timer.loop(player, name)
local p = players[name]
if not p.time or p.time < 1 then
death_timer.show(player, name)
death_timer.formspec(name, "Play")
local obj = p.obj
if obj then
obj:set_detach()
obj:remove()
obj = nil
end
if p.interact then
local privs = minetest.get_player_privs(name)
privs.interact = p.interact
minetest.set_player_privs(name, privs)
end
players[name] = nil
elseif p then
p.time = p.time - 1
death_timer.formspec(name, p.time)
minetest.after(1, death_timer.loop, player, name)
end
end
minetest.register_on_prejoinplayer(function(name, ip)
local p = players[name]
if p and p.time and p.time > 0 then
return "You have to wait out the death ban for " .. p.time .. " seconds."
end
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
if players[name] and players[name].obj then
players[name].obj:set_detach()
players[name].obj:remove()
players[name].obj = nil
end
end)
minetest.register_on_dieplayer(function(player)
local name = player:get_player_name()
local p = players[name]
local privs = minetest.get_player_privs(name)
if not p then
p = {time = timeout}
else
p.time = timeout
end
p.interact = privs.interact
players[name] = p
death_timer.hide(player, name)
privs.interact = nil
minetest.set_player_privs(name, privs)
end)
minetest.register_on_mods_loaded(function()
minetest.register_on_respawnplayer(function(player)
local name = player:get_player_name()
if player:get_hp() < 1 or not players[name] then
return
end
minetest.after(0, function(name)
local player = minetest.get_player_by_name(name)
death_timer.create_deathholder(player, name)
minetest.after(1, death_timer.create_loop, player, name)
end, name)
end)
end)
minetest.register_on_player_hpchange(function(player, hp_change, reason)
local p = players[player:get_player_name()]
if p and p.time and p.time > 1 then
return 100
end
return hp_change
end, true)