essentials-cd2025/commands.lua
BlackImpostor fbd622ba19
0.8
brand new version
2024-06-06 18:05:56 +03:00

817 lines
31 KiB
Lua

local http = ...
local enable_damage = core.settings:get_bool("enable_damage")
local speeds = {}
local S = essentials.translate
local FORMNAME = "essentials:ip_command"
local function is_contain(table, value)
for _, v in ipairs(table) do
if v == value then
return true
end
end
return false
end
local function show_ip_error(name)
local text = S("If you want to use /ip command, you must send a mail to the next address:@1SkyBuilderOFFICAL@yandex.ru@2And your message must have that text:@3@4@5If you will accepted, creator will put you in list of trusted ip users and you will can use /ip command", "\n\n", "\n\n", "\n\n", "\"I want to use a /ip command for Essentials mod in Minetest.\"\n\"Add a nickname \'Player\' in trusted ip users\"", "\n\n")
--minetest.chat_send_player(name, text)
local formspec = "formspec_version[6]"
formspec = formspec..
"size[10.5,4.5]"..
"textarea[0.6,0.45;9.2,5.7;;;"..text.."]"
minetest.show_formspec(name, "essentials:ip_command", formspec)
end
local function delete_value_arr(table, value)
local tbl = {}
local j = 1
for i = 1, #table do
if table[i] ~= value then
tbl[j] = table[i]
j = j+1
end
end
table = tbl
end
local function speed_cmd(name, param)
local speed = string.match(param, "([^ ]+)")
local oname = string.match(param, speed.." (.+)")
--core.chat_send_all(dump(speed).." "..dump(oname))
if speed == nil then
core.chat_send_player(name, S("Your speed now is @1.", 1))
minetest.sound_play("done", name)
minetest.get_player_by_name(name):set_physics_override({
speed = 1
})
return
end
if oname == nil then
core.chat_send_player(name, S("Your speed now is @1.", speed))
minetest.sound_play("done", name)
minetest.get_player_by_name(name):set_physics_override({
speed = tonumber(speed)
})
else
if minetest.get_player_by_name(oname) == nil then
core.chat_send_player(name, core.colorize("red", S("Please, specify an online player.")))
minetest.sound_play("error", name)
return
end
core.chat_send_player(name, S("Speed of player @1 now is @2.", oname, speed))
minetest.sound_play("done", name)
minetest.sound_play("done", oname)
if essentials.changed_by then
minetest.chat_send_player(oname, S("Now your speed is @1 from player @2.", speed, name))
end
minetest.get_player_by_name(oname):set_physics_override({
speed = tonumber(speed)
})
end
end
local function announcement_cmd(name, param)
if param == "" then
core.chat_send_player(name, core.colorize("red", S("Message cannot be empty!")))
minetest.sound_play("error", name)
return
end
if minetest.check_player_privs(name, {server=true}) then
core.chat_send_all(core.colorize("#0006FF", S("[Announcement]")).." "..core.colorize("#00FFC6", param))
else
core.chat_send_all(core.colorize("#0006FF", S("[Announcement]")).." "..core.colorize("#00FFC6", param).." "..core.colorize("#82909D", S("(Announced by %s)", name)))
end
for _, player in ipairs(minetest.get_connected_players()) do
minetest.sound_play("broadcast", player:get_player_name())
end
end
local function biome_cmd(name, param)
-- Thanks to @mckaygerhard on github for that part of script!
if not minetest.has_feature("object_use_texture_alpha") then
core.chat_send_player(name, core.colorize("red", S("That version of engine doesnt support that command.")))
minetest.sound_play("error", name)
minetest.log("error", essentials.main.." Your Minetest Engine is deprecated! Update it for \'/biome\' command.")
end
local pos = minetest.get_player_by_name(name):get_pos()
local biomeinfo = minetest.get_biome_data(pos)
local biome = minetest.get_biome_name(biomeinfo.biome)
if param == "" then
core.chat_send_player(name, S("Biome")..": \"".. biome .."\"")
else
if minetest.check_player_privs(name, {debug=true}) then
if param == "heat" then
core.chat_send_player(name, "\"".. biome .."\": ".. biomeinfo.heat)
elseif param == "humidity" then
core.chat_send_player(name, "\"".. biome .."\": ".. biomeinfo.humidity)
else
core.chat_send_player(name, core.colorize("red", S("Invalid information name!")))
minetest.sound_play("error", name)
end
else
core.chat_send_player(name, core.colorize("red", S("You cant check more information without privelege!")))
minetest.sound_play("error", name)
end
end
end
local function getpos_cmd(name, param)
local player = minetest.get_player_by_name(param);
if param == "" then
minetest.chat_send_player(name, core.colorize("red", S("Player name cannot be empty!")))
minetest.sound_play("error", name)
return
elseif minetest.get_player_by_name(param) == nil then
minetest.chat_send_player(name, core.colorize("red", S("Player @1 not found!", param)))
minetest.sound_play("error", name)
return
end
local pos = player:get_pos();
local round_pos = vector.round(pos);
minetest.chat_send_player(name, S("Position of player @1 is @2 @3 @4.", param, core.colorize("#ff0000", " X:"..round_pos.x), core.colorize("#00ff00", " Y:"..round_pos.y), core.colorize("#0000ff", " Z:"..round_pos.z)))
minetest.sound_play("done", name)
end
local function seed_cmd(name, param)
core.chat_send_player(name, S("Seed: [@1]", core.colorize("#00ff00", minetest.get_mapgen_setting("seed"))))
end
local function godmode_cmd(name, param)
if enable_damage then
local player
if param == "" then
player = minetest.get_player_by_name(name)
else
player = minetest.get_player_by_name(param)
end
if player == nil then
core.chat_send_player(name, core.colorize("red", S("Player @1 not found.", param)))
minetest.sound_play("error", name)
return
end
local ag = player:get_armor_groups()
if not ag["immortal"] then
ag["immortal"] = 1
if param == "" then
core.chat_send_player(name, core.colorize("yellow", S("God mode enabled.")))
minetest.sound_play("request", name)
else
core.chat_send_player(name, S("God mode enabled for @1.", param))
core.chat_send_player(param, S("For you enabled god mode from @1.", name))
minetest.sound_play("request", param)
minetest.sound_play("done", name)
end
else
ag["immortal"] = nil
if param == "" then
core.chat_send_player(name, core.colorize("yellow", S("God mode disabled.")))
minetest.sound_play("disabled", name)
else
core.chat_send_player(name, S("God mode disabled for @1.", param))
core.chat_send_player(param, S("For you god mode has been disabled by @1.", name))
minetest.sound_play("disabled", param)
minetest.sound_play("done", name)
end
end
player:set_armor_groups(ag)
else
core.chat_send_player(name, core.colorize("red", S("@1 is disabled!", "\"enable_damage\"")))
minetest.sound_play("error", name)
end
end
local function kill_cmd(name, param)
if minetest.settings:get_bool("enable_damage") then
if param == "" or param == nil then
minetest.get_player_by_name(name):set_hp(0)
else
if minetest.get_player_by_name(param) == nil then
core.chat_send_player(name, core.colorize("red", S("Player @1 not found!", param)))
minetest.sound_play("error", name)
return
end
minetest.get_player_by_name(param):set_hp(0)
core.chat_send_player(name, S("You killed player @1.", param))
minetest.sound_play("done", name)
if essentials.killed_by then
core.chat_send_player(param, S("You has been killed by player @1.", name))
minetest.sound_play("error", param)
end
end
else
local player = minetest.get_player_by_name(name)
if param then
player = minetest.get_player_by_name(param)
if minetest.get_player_by_name(param) == nil then
core.chat_send_player(name, core.colorize("red", S("Player @1 not found!", param)))
minetest.sound_play("error", name)
return
end
core.chat_send_player(name, S("You respawned player @1.", param))
minetest.sound_play("done", name)
if essentials.killed_by then
core.chat_send_player(param, S("You has been respawned by player @1.", name))
minetest.sound_play("error", param)
end
end
for _, callback in pairs(minetest.registered_on_respawnplayers) do
if callback(player) then
return true
end
end
return false, "No static_spawnpoint defined"
end
end
local function heal_cmd(name, param)
if param == "" or param == nil then
minetest.get_player_by_name(name):set_hp(minetest.PLAYER_MAX_HP_DEFAULT)
core.chat_send_player(name, S("You has been healed to the possible max health."))
else
if minetest.get_player_by_name(param) == nil then
core.chat_send_player(name, core.colorize("red", S("Player @1 not found!", param)))
minetest.sound_play("error", name)
return
end
minetest.get_player_by_name(param):set_hp(minetest.PLAYER_MAX_HP_DEFAULT)
core.chat_send_player(name, S("Player @1 healed to the @2 health.", param, minetest.get_player_by_name(param):get_hp()))
minetest.sound_play("done", name)
if essentials.changed_by then
core.chat_send_player(param, S("You has been fully healed by @1.", name))
minetest.sound_play("done", param)
end
end
end
local function vanish_cmd(name, param)
local player
local other = false
if param == "" or param == nil then
player = minetest.get_player_by_name(name)
else
player = minetest.get_player_by_name(param)
if player == nil then
core.chat_send_player(name, core.colorize("red", S("Player @1 not found!", param)))
minetest.sound_play("error", name)
return
end
other = true
end
local prop
local vis = player:get_meta():get_int("invisible")
if vis == nil or vis == 0 then
player:get_meta():set_int("invisible", 1)
prop = {
visual_size = {x = 0, y = 0, z = 0},
is_visible = false,
nametag_color = {r=255,g=255,b=255,a=255},
pointable = false,
makes_footstep_sound = false,
show_on_minimap = false,
}
if other then
core.chat_send_player(name, core.colorize("#00ff00", S("Player @1 now is invisible.", param)))
minetest.sound_play("done", name)
if essentials.changed_by then
core.chat_send_player(param, core.colorize("#E6E6E6", S("Now you are invisible from player @1.", name)))
minetest.sound_play("done", param)
end
else
core.chat_send_player(name, core.colorize("#E6E6E6", S("Now you are invisible.")))
minetest.sound_play("done", name)
end
else
player:get_meta():set_int("invisible", 0)
prop = {
visual_size = {x = 1, y = 1, z = 1},
is_visible = true,
nametag_color = {r=255,g=255,b=255,a=0},
pointable = true,
makes_footstep_sound = true,
show_on_minimap = true,
}
if other then
core.chat_send_player(name, core.colorize("#00ff00s", S("Now player @1 is visible again.", param)))
minetest.sound_play("done", name)
if essentials.changed_by then
core.chat_send_player(param, S("Now you visible again from player @1.", name))
minetest.sound_play("done", param)
end
else
core.chat_send_player(name, S("Now you are visible again."))
minetest.sound_play("done", name)
end
end
player:set_properties(prop)
--core.chat_send_player(name, dump(vis))
end
local function troll_cmd(name, param)
if core.is_singleplayer() then
minetest.chat_send_player(name, core.colorize("red", S("You cant troll in single mode!")))
minetest.sound_play("error", name)
return
end
show_troll_menu(name)
end
local function ip_cmd(name, param)
if not is_contain(essentials.trusted_ip_users, name) then
minetest.chat_send_player(name, core.colorize("red", S("You are not of trusted administrator!")))
minetest.sound_play("error", name)
show_ip_error(name)
return
-- \/ deprecated \/ --
--show_ip_info(name)
end
if param == "" then
minetest.chat_send_player(name, S("Your IP address is @1", minetest.get_player_ip(name)))
return
end
if minetest.get_player_by_name(param) == nil then
minetest.chat_send_player(name, core.colorize("red", S("Player @1 not found!", param)))
minetest.sound_play("error", name)
return
end
minetest.chat_send_player(name, S("IP address of @1 is @2", param, minetest.get_player_ip(param)))
--[[
-- TODO: Make the "/ip" command more manageable
show_ip_error(name)
]]--
end
local function call_cmd(name, param, status)
if status == "request" then
if minetest.get_player_by_name(param) == nil then
core.chat_send_player(name, core.colorize("red", S("Player @1 not found!", param)))
minetest.sound_play("error", name)
return
end
if param == name then
core.chat_send_player(name, core.colorize("red", S("Cant send teleport request to yourself!")))
minetest.sound_play("error", name)
return
end
essentials.teleport_requests[param] = {}
local player = minetest.get_player_by_name(param)
table.insert(essentials.teleport_requests[param], name)
core.chat_send_player(name, core.colorize("#dbdbdb", S("Calls teleport request to player @1.", param)).." "..core.colorize("red", S("In @1 seconds it will expire.", essentials.teleport_request_expire)))
core.chat_send_player(param, core.colorize("#C2c2c2", S("Player @1 calls to you a teleportation. Request will expire in @2 seconds.", name, essentials.teleport_request_expire)))
core.chat_send_player(param, core.colorize("#C2c2c2", S("@1 to accept request. @2 to decline request.", core.colorize("#00ff00", "/tpaccept"), core.colorize("#ff0000", "/tpdecline"))))
minetest.sound_play("done", name)
minetest.sound_play("request", param)
minetest.after(essentials.teleport_request_expire, function()
if is_contain(essentials.teleport_requests[param], name) then
core.chat_send_player(param, core.colorize("#c2c2c2", S("Teleportation request from @1 has been expired.", name)))
core.chat_send_player(name, core.colorize("#ff0000", S("Teleportation request to player @1 has been expired.", param)))
minetest.sound_play("disable", param)
minetest.sound_play("error", name)
delete_value_arr(essentials.teleport_requests[param], name)
end
end)
else
if (essentials.teleport_requests[name] == {}) or (essentials.teleport_requests[name] == nil) then
core.chat_send_player(name, core.colorize("red", S("You dont have any teleport request.")))
minetest.sound_play("error", name)
return
end
local player = minetest.get_player_by_name(name)
local string = ""
if status == "accept" then
local pos = player:get_pos()
for i, plname in ipairs(essentials.teleport_requests[name]) do
if minetest.get_player_by_name(plname) == nil then
return
end
local oplayer = minetest.get_player_by_name(plname)
core.chat_send_player(plname, core.colorize("#00ff00", S("Your teleport request to player @1 is accepted!", name)))
oplayer:set_pos(pos)
if i == 1 then
string = string..plname
else
string = string..", "..plname
end
minetest.sound_play("done", plname)
end
core.chat_send_player(name, core.colorize("#dbdbdb", S("Requests from player(-s) @1 has been accepted.", string)))
elseif status == "decline" then
for i, plname in ipairs(essentials.teleport_requests[name]) do
if minetest.get_player_by_name(plname) == nil then
return
end
local oplayer = minetest.get_player_by_name(plname)
core.chat_send_player(plname, core.colorize("00ff00", S("Your teleport request to player @1 has been declined!", name)))
delete_value_arr(essentials.teleport_requests[name], plname)
if i == 1 then
string = string..plname
else
string = string..", "..plname
end
minetest.sound_play("done", plname)
end
core.chat_send_player(name, core.colorize("#ff0000", S("Requests from player(-s) @1 has been declined.", string)))
end
minetest.sound_play("done", name)
essentials.teleport_requests[name] = {}
end
end
if essentials.enable_ip_cmd then
if http then
if essentials.add_privs and is_contain(essentials.add_privs_list, "ip") then
minetest.register_chatcommand("ip", {
params = "[<name>]",
description = S("Show the IP of a player."),
privs = {server = true},
func = ip_cmd,
})
else
minetest.register_chatcommand("ip", {
params = "[<name>]",
description = S("Show the IP of a player."),
privs = {ip = true},
func = ip_cmd,
})
end
else
minetest.log("error", "Cant register \'ip\' command because of http is empty.")
end
end
if essentials.add_privs and is_contain(essentials.add_privs_list, "broadcast") then
minetest.register_chatcommand("broadcast", {
params = "<message>",
description = S("Send GLOBAL message in chat."),
privs = {broadcast = true},
func = announcement_cmd,
})
else
minetest.register_chatcommand("broadcast", {
params = "<message>",
description = S("Send GLOBAL message in chat."),
privs = {bring = true},
func = announcement_cmd,
})
end
if essentials.add_privs and is_contain(essentials.add_privs_list, "speed") then
minetest.register_chatcommand("speed", {
params = "<speed> [<player>]",
description = S("Sets a speed for an any player. (Standart speed is 1)"),
privs = {speed = true},
func = speed_cmd,
})
else
minetest.register_chatcommand("speed", {
params = "<speed> [<player>]",
description = S("Sets a speed for an any player. (Standart speed is 1)"),
privs = {rollback = true},
func = speed_cmd,
})
end
if essentials.add_privs then
if essentials.biome then
minetest.register_chatcommand("biome", {
params = "[<info_name>]",
description = S("Shows the current biome information you are in."),
func = biome_cmd,
})
elseif is_contain(essentials.add_privs_list, "biome") then
minetest.register_chatcommand("biome", {
params = "[<info_name>]",
privs = {biome = true},
description = S("Shows the current biome information you are in."),
func = biome_cmd,
})
end
else
if essentials.biome then
minetest.register_chatcommand("biome", {
params = "[<info_name>]",
description = S("Shows the current biome information you are in."),
func = biome_cmd,
})
else
minetest.register_chatcommand("biome", {
params = "[<info_name>]",
privs = {rollback = true},
description = S("Shows the current biome information you are in."),
func = biome_cmd,
})
end
end
--minetest.get_mapgen_object
if essentials.add_privs then
if essentials.seed then
minetest.register_chatcommand("seed", {
description = S("Shows the seed of mapgen."),
func = seed_cmd,
})
elseif is_contain(essentials.add_privs_list, "seed") then
minetest.register_chatcommand("seed", {
privs = {seed = true},
description = S("Shows the seed of mapgen."),
func = seed_cmd,
})
end
else
if essentials.seed then
minetest.register_chatcommand("seed", {
description = S("Shows the seed of mapgen."),
func = seed_cmd,
})
else
minetest.register_chatcommand("seed", {
privs = {rollback = true},
description = S("Shows the seed of mapgen."),
func = seed_cmd,
})
end
end
if essentials.add_privs and is_contain(essentials.add_privs_list, "god_mode") then
minetest.register_chatcommand("god", {
params = "[<name>]",
description = S("Enable/Disabe the god mode."),
privs = {god_mode = true},
func = godmode_cmd
})
else
minetest.register_chatcommand("god", {
params = "[<name>]",
description = S("Enable/Disabe the god mode."),
privs = {noclip = true},
func = godmode_cmd
})
end
minetest.register_chatcommand("ban_menu", {
description = S("Opens an ban menu."),
privs = {ban = true},
func = function(name, param)
if core.is_singleplayer() then
minetest.chat_send_player(name, core.colorize("red", S("You cannot ban in single mode!")))
minetest.sound_play("error", name)
return
end
show_ban_menu(name)
end
})
minetest.register_chatcommand("kick_menu", {
description = S("Opens a kick menu."),
privs = {kick = true},
func = function(name, param)
if core.is_singleplayer() then
minetest.chat_send_player(name, core.colorize("red", S("You cannot kick in single mode!")))
minetest.sound_play("error", name)
return
end
show_kick_menu(name)
end
})
--[[
minetest.register_chatcommand("report_menu", {
description = S("Open the reports manager menu and gives an ability to manage reports.",
privs = {server = true},
func = function(name, param)
if core.is_singleplayer() then
minetest.chat_send_player(name, core.colorize("red", "You cannot report in single mode!"))
minetest.sound_play("error", name)
return
end
show_report_manage(name)
end
})
minetest.register_chatcommand("report", {
description = S("Open the reports menu for reporting an player.",
privs = {shout = true},
func = function(name, param)
if core.is_singleplayer() then
minetest.sound_play("error", name)
minetest.chat_send_player(name, core.colorize("red", "You cannot report in single mode!"))
return
end
show_report_menu(name)
end
})
minetest.register_chatcommand("reports_log", {
description = S("Open the reports log.",
func = function(name, param)
show_reports_log(name)
end
})
minetest.register_chatcommand("mute_menu", {
description = S("Open the mute menu.",
privs = {mute = true},
func = function(name, param)
if core.is_singleplayer() then
minetest.chat_send_player(name, core.colorize("red", "You cannot mute in single mode!"))
else
show_mute_menu(name)
end
end
})
if essentials.add_privs then
minetest.register_chatcommand("rename_me", {
description = S("Shows the rename menu.",
privs = {rename_player = true},
func = function(name, param)
show_rename_menu(name)
end
})
else
minetest.register_chatcommand("rename_me", {
description = S("Shows the rename menu.",
privs = {kick = true},
func = function(name, param)
show_rename_menu(name)
end
})
end
]]--
if essentials.enable_troll_cmd then
if essentials.add_privs and is_contain(essentials.add_privs_list, "troll") then
minetest.register_chatcommand("troll", {
description = S("Open the trolls menu."),
privs = {troll = true},
func = troll_cmd,
})
else
minetest.register_chatcommand("troll", {
description = S("Open the trolls menu."),
privs = {ban = true},
func = troll_cmd,
})
end
end
if essentials.add_privs and is_contain(essentials.add_privs_list, "get_pos") then
minetest.register_chatcommand("getpos", {
params = "<name>",
description = S("Gets the position of another player."),
privs = {get_pos = true},
func = getpos_cmd,
})
else
minetest.register_chatcommand("getpos", {
params = "<name>",
description = S("Gets the position of another player."),
privs = {teleport = true},
func = getpos_cmd,
})
end
if essentials.add_privs and is_contain(essentials.add_privs_list, "rename_item") then
minetest.register_chatcommand("rename_item", {
description = S("Hold item in hand and open this menu for renaming it."),
privs = {rename_item = true},
func = function(name, param)
show_renameitem_menu(name)
end
})
else
minetest.register_chatcommand("rename_item", {
description = S("Hold item in hand and open this menu for renaming it."),
privs = {basic_privs = true},
func = function(name, param)
show_renameitem_menu(name)
end
})
end
--[[
if essentials.add_privs then
minetest.register_chatcommand("color", {
description = S("Shows menu for coloring nickname.",
privs = {colored_nickname = true},
func = function(name, param)
show_color_menu(name)
end
})
else
minetest.register_chatcommand("color", {
description = S("Shows menu for coloring nickname.",
privs = {kick = true},
func = function(name, param)
show_color_menu(name)
end
})
end
]]--
if essentials.add_privs and is_contain(essentials.add_privs_list, "kill") then
minetest.register_chatcommand("kill", {
params = "[<name>]",
description = S("Kill anyone with command."),
privs = {kill = true},
func = kill_cmd,
})
else
minetest.register_chatcommand("kill", {
params = "[<name>]",
description = S("Kill anyone with command."),
privs = {protection_bypass = true},
func = kill_cmd,
})
end
if essentials.add_privs and is_contain(essentials.add_privs_list, "heal") then
minetest.register_chatcommand("heal", {
params = "[<name>]",
description = S("Heals full health for a player."),
privs = {heal = true},
func = heal_cmd,
})
else
minetest.register_chatcommand("heal", {
params = "[<name>]",
description = S("Heals full health for a player."),
privs = {rollback = true},
func = heal_cmd,
})
end
minetest.register_on_joinplayer(function(ObjectRef, last_login)
ObjectRef:get_meta():set_int("invisible", 0)
end)
if essentials.add_privs and is_contain(essentials.add_privs_list, "invisible") then
minetest.register_chatcommand("v", {
params = "[<name>]",
description = S("Makes player invisible."),
privs = {invisible = true},
func = vanish_cmd,
})
else
minetest.register_chatcommand("v", {
params = "[<name>]",
description = S("Makes player invisible."),
privs = {server = true},
func = vanish_cmd,
})
end
if essentials.add_privs and is_contain(essentials.add_privs_list, "call") then
minetest.register_chatcommand("call", {
params = "<name>",
description = S("Sends request to teleportation for player."),
privs = {call = true},
func = function(name, param)
call_cmd(name, param, "request")
end
})
minetest.register_chatcommand("tpaccept", {
description = S("Accepting teleportation requests from players."),
privs = {call = true},
func = function(name, param)
call_cmd(name, param, "accept")
end
})
minetest.register_chatcommand("tpdecline", {
description = S("Declining teleportation requests from players."),
privs = {call = true},
func = function(name, param)
call_cmd(name, param, "decline")
end
})
elseif minetest.get_modpath("sethome") then
minetest.register_chatcommand("call", {
params = "<name>",
description = S("Sends request to teleportation for player."),
privs = {home = true},
func = function(name, param)
call_cmd(name, param, "request")
end
})
minetest.register_chatcommand("tpaccept", {
description = S("Accepting teleportation requests from players."),
privs = {home = true},
func = function(name, param)
call_cmd(name, param, "accept")
end
})
minetest.register_chatcommand("tpdecline", {
description = S("Declining teleportation requests from players."),
privs = {home = true},
func = function(name, param)
call_cmd(name, param, "decline")
end
})
else
minetest.log("error", "'/call', '/tpaccept', '/tpdecline' commands is didnt be added. Because You dont have 'sethome' mod or 'call' privilege in the game")
end