spawnpoint/init.lua

265 lines
6.1 KiB
Lua
Raw Normal View History

2017-03-08 12:33:22 -08:00
-- spawnpoint/init.lua
2017-03-08 12:34:22 -08:00
spawnpoint = {}
local path = minetest.get_worldpath().."/spawnpoint.conf"
-- [function] Log
function spawnpoint.log(content, log_type)
2017-06-30 10:27:17 -07:00
if not content then return false end
if log_type == nil then log_type = "action" end
minetest.log(log_type, "[SpawnPoint] "..content)
2017-03-08 12:34:22 -08:00
end
----------------------
----- GLOBALSTEP -----
----------------------
local moved = {}
local huds = {}
local pos = {}
minetest.register_globalstep(function(dtime)
2017-06-30 10:27:17 -07:00
for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name()
if pos[name] and spawnpoint.do_not_move then
if not moved[name] and not vector.equals(pos[name], player:getpos()) then
moved[name] = true
player:hud_remove(huds[name])
minetest.chat_send_player(name, "Teleportation interrupted! (Player moved)")
end
end
end
end)
----------------------
-- HELPER FUNCTIONS --
----------------------
-- [function] Load
function spawnpoint.load()
2017-06-30 10:27:17 -07:00
local res = io.open(path, "r")
if res then
res = res:read("*all"):split("\n", true)
spawnpoint.time = tonumber(res[1]) or 3
spawnpoint.do_not_move = not not res[2] or true
if res[3] then
spawnpoint.pos = minetest.string_to_pos(res[3])
end
else
spawnpoint.time = 3
spawnpoint.do_not_move = true
end
end
-- [function] Save
function spawnpoint.save()
2017-06-30 10:27:17 -07:00
local str = tostring(spawnpoint.time)..
"\n"..tostring(spawnpoint.do_not_move) or ""
2017-06-30 10:27:17 -07:00
if spawnpoint.pos then
str = str.."\n"..minetest.pos_to_string(spawnpoint.pos)
end
2017-06-30 10:27:17 -07:00
io.open(path, "w"):write(str)
end
-- [function] Set
function spawnpoint.set(pos)
2017-06-30 10:27:17 -07:00
if type(pos) == "string" then
pos = minetest.string_to_pos(pos)
end
2017-06-30 10:27:17 -07:00
if type(pos) == "table" then
2017-06-30 10:39:11 -07:00
spawnpoint.pos = pos
2017-06-30 10:27:17 -07:00
end
end
-- [function] Bring
function spawnpoint.bring(player)
2017-06-30 10:27:17 -07:00
if type(player) == "string" then
player = minetest.get_player_by_name(player)
end
if player and spawnpoint.pos then
local pos = spawnpoint.pos
player:setpos({x=pos.x, y=pos.y+0.5, z=pos.z})
end
end
2017-03-08 20:51:37 -08:00
-- [function] Begin Countdown
function spawnpoint.begin(player, time)
2017-06-30 10:27:17 -07:00
if not time then
time = spawnpoint.time
end
if type(player) == string then
player = minetest.get_player_by_name(player)
end
local name = player:get_player_name()
if player and time and time ~= 0 then
local move = "Do not move!"
if spawnpoint.do_not_move ~= true then
move = ""
end
local seconds = "s"
if time < 2 then
seconds = ""
end
-- Send to chat
minetest.chat_send_player(name, "Teleportation will be complete in "..time..
" second"..seconds..". "..move)
-- Add initial HUD
huds[name] = player:hud_add({
hud_elem_type = "text",
text = "Teleportation Progress: "..time.." seconds remaining!",
position = {x = 0.5, y = 0.5},
number = 0xFFFFFF,
})
local hud = huds[name]
pos[name] = player:getpos()
moved[name] = false
-- Register update callbacks
for i = 1, time do
if i == time then
minetest.after(i, function()
if not moved[name] then
player:hud_remove(hud)
spawnpoint.bring(player)
-- Send to chat
minetest.chat_send_player(name, "Teleportation successful!")
-- Prevent further callbacks from globalstep
moved[name] = true
end
end)
else
minetest.after(i, function()
if not moved[name] then
player:hud_change(hud, "text", "Teleportation Progress: "..time - i.." seconds remaining!")
end
end)
end
end
elseif player then
minetest.chat_send_player(name, "Teleporting to spawn")
spawnpoint.bring(player)
end
2017-03-08 20:51:37 -08:00
end
-------------------
---- CALLBACKS ----
-------------------
spawnpoint.load()
-- [register] On Shutdown
minetest.register_on_shutdown(spawnpoint.save)
-- [register] On Respawn Player
minetest.register_on_respawnplayer(function(player)
2017-06-30 10:27:17 -07:00
spawnpoint.bring(player)
end)
2017-03-08 12:55:34 -08:00
-- [register] On New Player
minetest.register_on_newplayer(function(player)
2017-06-30 10:27:17 -07:00
spawnpoint.bring(player)
2017-03-08 12:55:34 -08:00
end)
2017-03-08 14:01:17 -08:00
-- [register priv] Spawn
minetest.register_privilege("spawn", "Ability to teleport to spawn at will with /spawn")
-- [register cmd] Set spawn
minetest.register_chatcommand("setspawn", {
2017-06-30 10:27:17 -07:00
description = "Set spawn",
privs = {server=true},
func = function(name, param)
local pos = minetest.get_player_by_name(name):getpos()
if param then
local ppos = minetest.string_to_pos(param)
if type(ppos) == "table" then
pos = ppos
end
end
2017-06-30 10:39:11 -07:00
pos = vector.round(pos)
2017-06-30 10:27:17 -07:00
spawnpoint.set(pos)
return true, "Set spawnpoint to "..minetest.pos_to_string(pos)
end,
2017-03-08 14:01:17 -08:00
})
-- [register cmd] Teleport to spawn
minetest.register_chatcommand("spawn", {
2017-06-30 10:27:17 -07:00
description = "Teleport to spawn",
privs = {spawn=true},
func = function(name, param)
local player = minetest.get_player_by_name(name)
if param ~= "" then
local pplayer = minetest.get_player_by_name(param)
if pplayer and minetest.check_player_privs(pplayer, {bring=true}) then
player = pplayer
else
return false, "Cannot teleport another player to spawn without bring privilege"
end
end
if not spawnpoint.pos then
return false, "No spawnpoint set!"
end
spawnpoint.begin(player)
end,
2017-03-08 14:01:17 -08:00
})
-- [register cmd] Manage spawnpoint
minetest.register_chatcommand("spawnpoint", {
2017-06-30 10:27:17 -07:00
description = "Get/Set SpawnPoint information",
func = function(name, param)
if not param or param == "" then
local pos = "Not set!"
if spawnpoint.pos then
pos = minetest.pos_to_string(spawnpoint.pos)
end
return true, "SpawnPoint Position: "..pos
elseif minetest.check_player_privs(minetest.get_player_by_name(name), {server=true}) then
local p = param:split(" ")
if p[1] == "time" then
local num = tonumber(p[2])
if not num then
return true, "SpawnPoint->time: "..spawnpoint.time
elseif num == spawnpoint.time then
return false, "Time already set to "..p[2].."!"
else
spawnpoint.time = num
return true, "Set time to "..tostring(num)
end
elseif p[1] == "do_not_move" then
local move = minetest.is_yes(p[2])
minetest.log("action", dump(p[2])..", "..dump(move))
if move == nil then
return true, "SpawnPoint->do_not_move: "..tostring(spawnpoint.do_not_move)
else
spawnpoint.do_not_move = move
return true, "Set do_not_move to "..tostring(move)
end
end
end
end,
})