Essentials core, repair, tpa, back, top, spawn, setspawn
This commit is contained in:
commit
28f0114b7b
15
ess/init.lua
Normal file
15
ess/init.lua
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
-- Register base module
|
||||
ess.register_module("ess", "Essential commands for server management")
|
||||
|
||||
-- Tools related commands
|
||||
dofile(modpath.."/tools.lua")
|
||||
|
||||
-- Teleportation related commands
|
||||
dofile(modpath.."/teleport.lua")
|
||||
dofile(modpath.."/warp.lua")
|
||||
|
||||
-- Player related commands
|
||||
dofile(modpath.."/player.lua")
|
3
ess/mod.conf
Normal file
3
ess/mod.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name=ess
|
||||
description=Essential commands for server management
|
||||
depends=ess_core
|
0
ess/player.lua
Normal file
0
ess/player.lua
Normal file
195
ess/teleport.lua
Normal file
195
ess/teleport.lua
Normal file
@ -0,0 +1,195 @@
|
||||
|
||||
local tpask = {
|
||||
requests = {},
|
||||
muted = {},
|
||||
timeout = 120,
|
||||
}
|
||||
|
||||
local function cmd_top(name)
|
||||
local curr_pos = minetest.get_player_by_name(name):getpos()
|
||||
curr_pos.y = math.ceil(curr_pos.y) + 0.5
|
||||
|
||||
while minetest.get_node(curr_pos).name ~= "ignore" do
|
||||
curr_pos.y = curr_pos.y + 1
|
||||
end
|
||||
|
||||
curr_pos.y = curr_pos.y - 0.5
|
||||
|
||||
while minetest.get_node(curr_pos).name == "air" do
|
||||
curr_pos.y = curr_pos.y - 1
|
||||
end
|
||||
curr_pos.y = curr_pos.y + 0.5
|
||||
|
||||
minetest.get_player_by_name(name):set_pos(curr_pos)
|
||||
return true, "Teleported to top."
|
||||
end
|
||||
|
||||
local function cmd_back(name)
|
||||
local pos = minetest.string_to_pos(ess.get_player_meta(name, "position"))
|
||||
if not pos then
|
||||
return false, "Could not return to previous position."
|
||||
end
|
||||
minetest.get_player_by_name(name):set_pos(pos)
|
||||
return true, "Teleported back."
|
||||
end
|
||||
|
||||
local function cmd_tpcommon(name,tname,direction)
|
||||
if name == tname then
|
||||
return false, "Cannot teleport to self."
|
||||
end
|
||||
|
||||
local target = minetest.get_player_by_name(tname)
|
||||
if not target then
|
||||
return false, "Could not find player."
|
||||
end
|
||||
|
||||
if tpask.requests[tname] and tpask.requests[tname].when > minetest.get_us_time() - tpask.timeout * 100000 then
|
||||
return false, "There are currently pending requests regarding this player. Please wait."
|
||||
end
|
||||
|
||||
if not tpask.muted[tname] then
|
||||
local message = "to teleport to you"
|
||||
|
||||
if direction == 2 then
|
||||
message = "you to teleport to them"
|
||||
end
|
||||
|
||||
minetest.chat_send_player(tname, name .. " has requested "..message..".")
|
||||
minetest.chat_send_player(tname, "Run /tpaccept to accept or /tpadeny to deny.")
|
||||
if tpask.timeout > 0 then
|
||||
minetest.chat_send_player(tname, "You have "..tpask.timeout.." seconds to respond.")
|
||||
end
|
||||
tpask.requests[tname] = {when = minetest.get_us_time()}
|
||||
if direction == 1 then
|
||||
tpask.requests[tname].who = name
|
||||
else
|
||||
tpask.requests[tname].to = name
|
||||
end
|
||||
end
|
||||
|
||||
return true, "Teleport request sent to " .. tname .. ".."
|
||||
end
|
||||
|
||||
local function cmd_tpask(name,tname)
|
||||
return cmd_tpcommon(name,tname,1)
|
||||
end
|
||||
|
||||
local function cmd_tpaskhere(name,tname)
|
||||
return cmd_tpcommon(name,tname,2)
|
||||
end
|
||||
|
||||
local function cmd_tpaconfirm(name)
|
||||
local reqs = tpask.requests[name]
|
||||
local me = minetest.get_player_by_name(name)
|
||||
if not reqs or (tpask.timeout > 0 and tpask.requests[name].when < minetest.get_us_time() - tpask.timeout * 100000) then
|
||||
return false, "You have no pending teleport requests."
|
||||
end
|
||||
|
||||
local who = reqs.to or reqs.who
|
||||
local whoplayer = minetest.get_player_by_name(who)
|
||||
if not whoplayer then
|
||||
tpask.requests[name] = nil
|
||||
return false, "You have no pending teleport requests."
|
||||
end
|
||||
|
||||
if reqs.to then
|
||||
minetest.chat_send_player(name, "Teleporting..")
|
||||
me:set_pos(whoplayer:get_pos())
|
||||
else
|
||||
minetest.chat_send_player(who, "Teleporting..")
|
||||
whoplayer:set_pos(me:get_pos())
|
||||
end
|
||||
|
||||
tpask.requests[name] = nil
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local function cmd_tpadeny(name)
|
||||
local reqs = tpask.requests[name]
|
||||
if not reqs or tpask.requests[name].when < minetest.get_us_time() - tpask.timeout * 1000 then
|
||||
return false, "You have no pending teleport requests."
|
||||
end
|
||||
|
||||
tpask.requests[name] = nil
|
||||
|
||||
return true, "Declined teleport request successfully. Use /tpmute to silence teleport requests."
|
||||
end
|
||||
|
||||
local function cmd_tpamute(name)
|
||||
if tpask.muted[name] then
|
||||
tpask.muted[name] = nil
|
||||
return true, "Unmuted teleport requests successfully."
|
||||
end
|
||||
|
||||
tpask.muted[name] = "*"
|
||||
return true, "Muted teleport requests successfully."
|
||||
end
|
||||
|
||||
-- Use builtin tele
|
||||
local cmd_teleport = minetest.registered_chatcommands["teleport"].func
|
||||
|
||||
local commands = {
|
||||
["tpask"] = {
|
||||
description = "Request to teleport to the specified player.",
|
||||
params = "<player>",
|
||||
aliases = {"tpa"},
|
||||
privs = {
|
||||
["ess.teleport.tpa"] = true,
|
||||
},
|
||||
save_player_pos = true,
|
||||
func = cmd_tpask,
|
||||
},
|
||||
["tpaskhere"] = {
|
||||
description = "Request to teleport the specified player to you.",
|
||||
params = "<player>",
|
||||
aliases = {"tpahere"},
|
||||
privs = {
|
||||
["ess.teleport.tpahere"] = true,
|
||||
},
|
||||
save_player_pos = true,
|
||||
func = cmd_tpaskhere,
|
||||
},
|
||||
["tpaccept"] = {
|
||||
description = "Accept a teleport request.",
|
||||
aliases = {"tpayes"},
|
||||
func = cmd_tpaconfirm,
|
||||
save_player_pos = true,
|
||||
},
|
||||
["tpdeny"] = {
|
||||
description = "Reject a teleport request.",
|
||||
aliases = {"tpno"},
|
||||
func = cmd_tpadeny,
|
||||
},
|
||||
["tpmute"] = {
|
||||
description = "Silence/unsilence teleport requests.",
|
||||
func = cmd_tpamute,
|
||||
},
|
||||
["back"] = {
|
||||
description = "Teleports you to your location prior to tp/spawn/warp.",
|
||||
aliases = {"return"},
|
||||
privs = true,
|
||||
save_player_pos = true,
|
||||
func = cmd_back,
|
||||
},
|
||||
["top"] = {
|
||||
description = "Teleport to the highest node at your current position.",
|
||||
privs = true,
|
||||
save_player_pos = true,
|
||||
func = cmd_top,
|
||||
},
|
||||
["teleport"] = {
|
||||
description = "Teleport to position or player",
|
||||
aliases = {"tp", "tele", "tp2p"},
|
||||
params = "<X>,<Y>,<Z> | <to_name> | (<name> <X>,<Y>,<Z>) | (<name> <to_name>)",
|
||||
privs = {
|
||||
["teleport"] = true,
|
||||
["ess.teleport"] = true,
|
||||
},
|
||||
override = true,
|
||||
save_player_pos = true,
|
||||
func = cmd_teleport,
|
||||
}
|
||||
}
|
||||
|
||||
ess.autoregister(commands, "teleport")
|
73
ess/tools.lua
Normal file
73
ess/tools.lua
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
-- Repair command
|
||||
local function cmd_repair(name, params, splitparams)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local commit = 0
|
||||
|
||||
if splitparams[1] == name and splitparams[2] == "all" then
|
||||
splitparams[1] = "all"
|
||||
end
|
||||
|
||||
if splitparams[1] == "all" then
|
||||
if not ess.priv_match(name, "ess.tools.repairall") then
|
||||
return ess.reject_permission()
|
||||
end
|
||||
-- Repair all tools
|
||||
commit = 2
|
||||
elseif splitparams[2] == "all" and minetest.get_player_by_name(splitparams[1]) then
|
||||
if not ess.priv_match(name, "ess.tools.repairall.other") then
|
||||
return ess.reject_permission()
|
||||
end
|
||||
player = minetest.get_player_by_name(splitparams[1])
|
||||
-- Repair all of a player's tools
|
||||
commit = 2
|
||||
elseif splitparams[1] ~= name and minetest.get_player_by_name(splitparams[1]) then
|
||||
if not ess.priv_match(name, "ess.tools.repair.other") then
|
||||
return ess.reject_permission()
|
||||
end
|
||||
player = minetest.get_player_by_name(splitparams[1])
|
||||
-- Repair a player's held tool
|
||||
commit = 1
|
||||
else
|
||||
-- Repair my own tool
|
||||
commit = 1
|
||||
end
|
||||
|
||||
if commit == 1 and player then
|
||||
local held = player:get_wielded_item()
|
||||
if held:get_wear() > 0 then
|
||||
held:set_wear(0)
|
||||
end
|
||||
player:set_wielded_item(held)
|
||||
return true, "Successfully repaired the held tool!"
|
||||
elseif commit == 2 and player then
|
||||
local inv = player:get_inventory()
|
||||
local list = inv:get_list("main")
|
||||
for _,stack in pairs(list) do
|
||||
if stack:get_wear() > 0 then
|
||||
stack:set_wear(0)
|
||||
end
|
||||
end
|
||||
inv:set_list("main", list)
|
||||
return true, "Successfully repaired all tools!"
|
||||
end
|
||||
|
||||
return false,"Invalid parameters."
|
||||
end
|
||||
|
||||
local commands = {
|
||||
["repair"] = {
|
||||
description = "Repair currently held tool.",
|
||||
aliases = {"fix"},
|
||||
privs = {
|
||||
["ess.tools.repair"] = true,
|
||||
["ess.tools.repair.other"] = true,
|
||||
["ess.tools.repairall"] = true,
|
||||
["ess.tools.repairall.other"] = true,
|
||||
},
|
||||
params = "[<playername>] [all]",
|
||||
func = cmd_repair
|
||||
}
|
||||
}
|
||||
|
||||
ess.autoregister(commands, "tools")
|
3
ess/warp.lua
Normal file
3
ess/warp.lua
Normal file
@ -0,0 +1,3 @@
|
||||
local commands = {}
|
||||
|
||||
ess.autoregister(commands, "warp")
|
5
ess_chat/init.lua
Normal file
5
ess_chat/init.lua
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
-- Register base module
|
||||
ess.register_module("ess_chat", "Chat overhaul library")
|
3
ess_chat/mod.conf
Normal file
3
ess_chat/mod.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name=ess_chat
|
||||
description=Chat overhaul library
|
||||
depends=ess_core
|
354
ess_core/init.lua
Normal file
354
ess_core/init.lua
Normal file
@ -0,0 +1,354 @@
|
||||
-- IcyEssentials Core Registration Framework
|
||||
|
||||
local storage = minetest.get_mod_storage()
|
||||
|
||||
ess = {
|
||||
commands = {},
|
||||
privileges = {},
|
||||
modules = {},
|
||||
player_meta = {},
|
||||
world_meta = nil,
|
||||
}
|
||||
|
||||
---------------------
|
||||
-- PLAYER METADATA --
|
||||
---------------------
|
||||
|
||||
-- Load player metadata
|
||||
local function playerdata_load(name)
|
||||
local decoded = minetest.deserialize(storage:get_string(name))
|
||||
if not decoded then
|
||||
ess.player_meta[name] = {}
|
||||
return {}
|
||||
end
|
||||
|
||||
ess.player_meta[name] = decoded
|
||||
return decoded
|
||||
end
|
||||
|
||||
-- Save player metadata
|
||||
local function playerdata_save(name)
|
||||
if not ess.player_meta[name] then return end
|
||||
local encoded = minetest.serialize(ess.player_meta[name])
|
||||
storage:set_string(name, encoded)
|
||||
end
|
||||
|
||||
-- Set a player metadata value
|
||||
function ess.set_player_meta(player, flag, value)
|
||||
if not ess.player_meta[player] then
|
||||
playerdata_load(player)
|
||||
end
|
||||
ess.player_meta[player][flag] = value
|
||||
playerdata_save(player)
|
||||
end
|
||||
|
||||
-- Get a player's metadata value
|
||||
function ess.get_player_meta(player, flag)
|
||||
if not ess.player_meta[player] then
|
||||
playerdata_load(player)
|
||||
end
|
||||
return ess.player_meta[player][flag]
|
||||
end
|
||||
|
||||
--------------------
|
||||
-- WORLD METADATA --
|
||||
--------------------
|
||||
|
||||
-- Load player metadata
|
||||
local function worlddata_load()
|
||||
local decoded = minetest.deserialize(storage:get_string("_data"))
|
||||
if not decoded then
|
||||
ess.world_meta = {}
|
||||
return {}
|
||||
end
|
||||
|
||||
ess.world_meta = decoded
|
||||
return decoded
|
||||
end
|
||||
|
||||
-- Save player metadata
|
||||
local function worlddata_save()
|
||||
if not ess.world_meta then return end
|
||||
local encoded = minetest.serialize(ess.world_meta)
|
||||
storage:set_string("_data", encoded)
|
||||
end
|
||||
|
||||
-- Set a player metadata value
|
||||
function ess.set_world_meta(player, flag, value)
|
||||
if not ess.world_meta then worlddata_load() end
|
||||
ess.world_meta[flag] = value
|
||||
worlddata_save()
|
||||
end
|
||||
|
||||
-- Get a player's metadata value
|
||||
function ess.get_world_meta(flag)
|
||||
if not ess.world_meta then worlddata_load() end
|
||||
return ess.world_meta[flag]
|
||||
end
|
||||
|
||||
-------------
|
||||
-- UTILITY --
|
||||
-------------
|
||||
|
||||
-- Just return a (TODO: translated) string that rejects permission
|
||||
function ess.reject_permission()
|
||||
return false, "You don't have permission to run this command."
|
||||
end
|
||||
|
||||
-- Match a single privilege
|
||||
function ess.priv_match(name, priv)
|
||||
return minetest.check_player_privs(name, {[priv] = true})
|
||||
end
|
||||
|
||||
-- Save a player's position for use with /back
|
||||
local function save_player_pos(player, commit)
|
||||
local pobj = minetest.get_player_by_name(player)
|
||||
if not pobj then return end
|
||||
|
||||
local pos = pobj:get_pos()
|
||||
if commit then
|
||||
ess.set_player_meta(player, "position", minetest.pos_to_string(commit))
|
||||
end
|
||||
|
||||
return pos
|
||||
end
|
||||
|
||||
----------------
|
||||
-- PRIVILEGES --
|
||||
----------------
|
||||
|
||||
local function handle_command_privileges(privileges, description, default)
|
||||
local perms = {}
|
||||
for perm in pairs(privileges) do
|
||||
local parts = string.split(perm, ".")
|
||||
if ess.modules[parts[1]] and not ess.privileges[perm] then
|
||||
minetest.register_privilege(perm, {
|
||||
description = description,
|
||||
give_to_singleplayer = default,
|
||||
})
|
||||
ess.privileges[perm] = true
|
||||
end
|
||||
perms[perm] = true
|
||||
|
||||
if #parts > 1 then
|
||||
for i,p in ipairs(parts) do
|
||||
if i == 1 then
|
||||
local a = p .. ".all"
|
||||
if not ess.privileges[a] then
|
||||
minetest.register_privilege(a, {
|
||||
description = "icyess all commands in module " .. p,
|
||||
give_to_singleplayer = false,
|
||||
give_to_admin = false
|
||||
})
|
||||
ess.privileges[a] = true
|
||||
end
|
||||
perms[a] = true
|
||||
elseif i == 2 then
|
||||
local a = parts[1] .. "." .. p .. ".all"
|
||||
if not ess.privileges[a] then
|
||||
minetest.register_privilege(a, {
|
||||
description = "icyess all commands in module " .. p .. " category "..p,
|
||||
give_to_singleplayer = false,
|
||||
give_to_admin = false
|
||||
})
|
||||
ess.privileges[a] = true
|
||||
end
|
||||
perms[a] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
perms["ess.all"] = true
|
||||
return perms
|
||||
end
|
||||
|
||||
------------------
|
||||
-- CHATCOMMANDS --
|
||||
------------------
|
||||
|
||||
local function register_chatcommand(command, def)
|
||||
if def.privs then
|
||||
def.privs = handle_command_privileges(def.privs, def.description, def.default == true)
|
||||
end
|
||||
|
||||
local function fn (name, params)
|
||||
local privileges_met = false
|
||||
|
||||
-- Check for any of the privileges
|
||||
if def.privs then
|
||||
for priv in pairs(def.privs) do
|
||||
if ess.priv_match(name, priv) then
|
||||
privileges_met = true
|
||||
break
|
||||
end
|
||||
end
|
||||
else
|
||||
privileges_met = true
|
||||
end
|
||||
|
||||
if not privileges_met then
|
||||
return ess.reject_permission()
|
||||
end
|
||||
|
||||
-- If this command is a teleport, save the player position
|
||||
local player_pos
|
||||
if def.save_player_pos then
|
||||
player_pos = save_player_pos(name)
|
||||
end
|
||||
|
||||
local splitparams = string.split(params, " ")
|
||||
|
||||
-- Run the chat command function
|
||||
local ret,mesg = def.func(name, params, splitparams)
|
||||
|
||||
-- If we saved player position and the command succeeded, commit the last position save
|
||||
if ret and player_pos then
|
||||
save_player_pos(name, player_pos)
|
||||
end
|
||||
|
||||
return ret,mesg
|
||||
end
|
||||
|
||||
-- Clean-up the command definition
|
||||
local pd = table.copy(def)
|
||||
pd.privs = {}
|
||||
pd.module = nil
|
||||
pd.category = nil
|
||||
pd.default = nil
|
||||
pd.override = nil
|
||||
pd.override_aliases = nil
|
||||
pd.save_player_pos = nil
|
||||
pd.func = fn
|
||||
|
||||
-- If this command is overriding, check if a command like this already exists and override it
|
||||
if def.override and minetest.registered_chatcommands[command] then
|
||||
minetest.override_chatcommand(command, pd)
|
||||
else
|
||||
minetest.register_chatcommand(command, pd)
|
||||
end
|
||||
end
|
||||
|
||||
--[[
|
||||
IcyEss Module registration
|
||||
Registers a module.
|
||||
]]
|
||||
function ess.register_module(modname, description)
|
||||
ess.modules[modname] = { mod = minetest.get_current_modname(), description = description }
|
||||
return {
|
||||
register_chatcommand = function (root, cmddef)
|
||||
cmddef.module = modname
|
||||
return ess.register_chatcommand(root, cmddef)
|
||||
end
|
||||
}
|
||||
end
|
||||
|
||||
--[[
|
||||
IcyEss Command registration
|
||||
{
|
||||
-- Command aliases (optional)
|
||||
-- All of these will be registered as separate commands with the same
|
||||
-- privileges and execute function
|
||||
aliases = {},
|
||||
|
||||
-- Optional module name, such as "ess-chat" or "protect".
|
||||
-- This will be used in privilege generation and grouping.
|
||||
module = "ess",
|
||||
|
||||
-- Optional command category, such as "time" or "item".
|
||||
-- This will be used in privilege generation and grouping.
|
||||
category = "item",
|
||||
|
||||
-- Command privileges (optional)
|
||||
-- Set to true to generate privilege based on the command name
|
||||
privs = true,
|
||||
|
||||
-- Set privileges a table in order to optionally require one of these privileges
|
||||
-- If the privilege starts with the module name, they will automatically be
|
||||
-- registered, if they don't already exist.
|
||||
privs = {
|
||||
"ess.item.repair" = true,
|
||||
"ess.item.repair.other" = true,
|
||||
},
|
||||
|
||||
-- Command execution (required)
|
||||
func = function (name, params),
|
||||
|
||||
-- If command like this exists, do we override it?
|
||||
override = false,
|
||||
|
||||
-- If aliases exist, do we override them?
|
||||
override_aliases = false,
|
||||
|
||||
-- If this command is given to singleplayer
|
||||
default = false,
|
||||
|
||||
-- If this command modifies player's position in some way,
|
||||
-- save their current position before running the command
|
||||
save_player_pos = false
|
||||
}
|
||||
]]
|
||||
function ess.register_chatcommand(root, cmddef)
|
||||
assert(type(cmddef) == "table", "command definition is not a table")
|
||||
assert(cmddef.description ~= nil, "command is missing a description")
|
||||
assert(cmddef.func ~= nil, "command definition is missing a function")
|
||||
assert(type(cmddef.func) == "function", "command definition is missing a function")
|
||||
|
||||
if ess.commands[root] and not cmddef.override then return end
|
||||
if not cmddef.privs and cmddef.privileges then
|
||||
cmddef.privs = table.copy(cmddef.privileges)
|
||||
cmddef.privileges = nil
|
||||
end
|
||||
|
||||
local privs = cmddef.privs
|
||||
if not privs then privs = {} end
|
||||
|
||||
-- Set default module
|
||||
if not cmddef.module then
|
||||
cmddef.module = "ess"
|
||||
end
|
||||
|
||||
-- Generate privilege
|
||||
if privs == true then
|
||||
local a = ""
|
||||
if cmddef.module then
|
||||
a = a .. cmddef.module .. "."
|
||||
end
|
||||
|
||||
if cmddef.category then
|
||||
a = a .. cmddef.category .. "."
|
||||
end
|
||||
|
||||
privs = {[a .. root] = true}
|
||||
end
|
||||
|
||||
-- No privileges required
|
||||
local plen = 0
|
||||
for _ in pairs(privs) do
|
||||
plen = plen + 1
|
||||
end
|
||||
if plen == 0 then
|
||||
privs = nil
|
||||
end
|
||||
|
||||
cmddef.privs = privs
|
||||
ess.commands[root] = cmddef
|
||||
register_chatcommand(root, cmddef)
|
||||
|
||||
if not cmddef.aliases or #cmddef.aliases == 0 then return end
|
||||
local aliasdef = table.copy(cmddef)
|
||||
aliasdef.func = cmddef.func
|
||||
aliasdef.override = cmddef.override_aliases == true
|
||||
aliasdef.override_aliases = nil
|
||||
aliasdef.description = cmddef.description .. " (alias to "..root..")"
|
||||
|
||||
for _,a in pairs(cmddef.aliases) do
|
||||
register_chatcommand(a,aliasdef)
|
||||
end
|
||||
end
|
||||
|
||||
function ess.autoregister(list, category)
|
||||
for cmd,def in pairs(list) do
|
||||
def.category = category
|
||||
ess.register_chatcommand(cmd, def)
|
||||
end
|
||||
end
|
2
ess_core/mod.conf
Normal file
2
ess_core/mod.conf
Normal file
@ -0,0 +1,2 @@
|
||||
name=ess_core
|
||||
description=Command registration framework with better privileges
|
42
ess_spawn/init.lua
Normal file
42
ess_spawn/init.lua
Normal file
@ -0,0 +1,42 @@
|
||||
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
-- Register base module
|
||||
local spawn = ess.register_module("spawn", "Spawnpoint management")
|
||||
|
||||
spawn.register_chatcommand("spawn", {
|
||||
description = "Teleport to spawnpoint.",
|
||||
privs = {
|
||||
spawn = true,
|
||||
["spawn.all"] = true,
|
||||
},
|
||||
save_player_pos = true,
|
||||
override = true,
|
||||
func = function (name)
|
||||
local spawnpoint = minetest.setting_get_pos("static_spawnpoint")
|
||||
if not spawnpoint then
|
||||
return false, "There is no defined spawnpoint for this world."
|
||||
end
|
||||
minetest.get_player_by_name(name):set_pos(spawnpoint)
|
||||
return true, "Teleported to spawn."
|
||||
end
|
||||
})
|
||||
|
||||
spawn.register_chatcommand("setspawn", {
|
||||
description = "Set a spawnpoint for the world.",
|
||||
privs = {
|
||||
["spawn.set"] = true,
|
||||
["spawn.all"] = true,
|
||||
},
|
||||
override = true,
|
||||
func = function (name)
|
||||
if minetest.is_singleplayer() then
|
||||
return false, "There is no point in setting a spawnpoint for a singleplayer world! Use /sethome instead."
|
||||
end
|
||||
local pos = minetest.get_player_by_name(name):get_pos(spawnpoint)
|
||||
local str = minetest.pos_to_string(pos)
|
||||
minetest.settings:set("static_spawnpoint", str)
|
||||
minetest.settings:save()
|
||||
return true, "Set the world's spawn point to " .. str
|
||||
end
|
||||
})
|
3
ess_spawn/mod.conf
Normal file
3
ess_spawn/mod.conf
Normal file
@ -0,0 +1,3 @@
|
||||
name=ess_spawn
|
||||
description=Spawnpoint management
|
||||
depends=ess_core
|
2
modpack.conf
Normal file
2
modpack.conf
Normal file
@ -0,0 +1,2 @@
|
||||
name=icyessentials
|
||||
description=IcyEssentials is a collection of essential commands for server administation and moderation.
|
Loading…
Reference in New Issue
Block a user