areas/chatcommands.lua

334 lines
8.8 KiB
Lua
Raw Normal View History

2013-09-03 01:16:14 +02:00
minetest.register_chatcommand("protect", {
params = "<AreaName>",
description = "Protect your own area",
privs = {[areas.self_protection_privilege]=true},
func = function(name, param)
2013-11-08 21:11:11 +01:00
if param == "" then
minetest.chat_send_player(name, 'Invalid usage, see /help protect')
return
end
local pos1, pos2 = areas:getPos1(name), areas:getPos2(name)
if pos1 and pos2 then
2013-11-08 21:11:11 +01:00
pos1, pos2 = areas:sortPos(pos1, pos2)
else
minetest.chat_send_player(name, 'You need to select an area first')
return
end
2013-09-03 01:16:14 +02:00
2013-11-08 21:11:11 +01:00
minetest.log("action", "/protect invoked, owner="..name..
" areaname="..param..
" startpos="..minetest.pos_to_string(pos1)..
" endpos=" ..minetest.pos_to_string(pos2))
2013-09-03 01:16:14 +02:00
2013-11-08 21:11:11 +01:00
local canAdd, errMsg = areas:canPlayerAddArea(pos1, pos2, name)
if not canAdd then
minetest.chat_send_player(name,
"You can't protect that area: "
..errMsg)
return
2013-09-03 01:16:14 +02:00
end
2013-11-08 21:11:11 +01:00
local id = areas:add(name, param, pos1, pos2, nil)
2013-11-08 21:11:11 +01:00
areas:save()
minetest.chat_send_player(name, "Area protected. ID: "..id)
2013-09-03 01:16:14 +02:00
end})
minetest.register_chatcommand("set_owner", {
params = "<PlayerName> <AreaName>",
2013-09-03 07:33:08 +02:00
description = "Protect an area beetween two positions and give"
.." a player access to it without setting the parent of the"
.." area to any existing area",
2013-09-03 01:16:14 +02:00
privs = {areas=true},
func = function(name, param)
2013-11-15 01:15:26 +01:00
local found, _, ownername, areaname = param:find('^([^ ]+) (.+)$')
2013-09-03 01:16:14 +02:00
2013-09-03 07:33:08 +02:00
if not found then
minetest.chat_send_player(name, "Incorrect usage, see /help set_owner")
return
end
2013-09-03 01:16:14 +02:00
local pos1, pos2 = areas:getPos1(name), areas:getPos2(name)
if pos1 and pos2 then
2013-09-03 07:33:08 +02:00
pos1, pos2 = areas:sortPos(pos1, pos2)
2013-09-03 01:16:14 +02:00
else
2013-11-08 21:11:11 +01:00
minetest.chat_send_player(name, "You need to select an area first")
2013-09-03 07:33:08 +02:00
return
2013-09-03 01:16:14 +02:00
end
2013-09-03 07:33:08 +02:00
if not areas:player_exists(ownername) then
2013-11-08 21:11:11 +01:00
minetest.chat_send_player(name, "The player \""
..ownername.."\" does not exist")
2013-09-03 07:33:08 +02:00
return
end
minetest.log("action", name.." runs /set_owner. Owner = "..ownername..
" AreaName = "..areaname..
" StartPos = "..minetest.pos_to_string(pos1)..
" EndPos = " ..minetest.pos_to_string(pos2))
2013-09-03 07:33:08 +02:00
local id = areas:add(ownername, areaname, pos1, pos2, nil)
2013-09-03 07:33:08 +02:00
areas:save()
minetest.chat_send_player(ownername,
"You have been granted control over area #"..
id..". Type /list_areas to show your areas.")
minetest.chat_send_player(name, "Area protected. ID: "..id)
2013-09-03 01:16:14 +02:00
end})
minetest.register_chatcommand("add_owner", {
params = "<ParentID> <Player> <AreaName>",
2013-09-03 07:33:08 +02:00
description = "Give a player access to a sub-area beetween two"
.." positions that have already been protected,"
.." Use set_owner if you don't want the parent to be set.",
2013-09-03 01:16:14 +02:00
privs = {},
func = function(name, param)
2013-09-03 07:33:08 +02:00
local found, _, pid, ownername, areaname
2013-11-15 01:15:26 +01:00
= param:find('^(%d+) ([^ ]+) (.+)$')
2013-09-03 01:16:14 +02:00
2013-09-03 07:33:08 +02:00
if not found then
2013-11-17 18:40:25 +01:00
minetest.chat_send_player(name, "Incorrect usage, see /help add_owner")
2013-09-03 07:33:08 +02:00
return
end
2013-09-03 01:16:14 +02:00
local pos1, pos2 = areas:getPos1(name), areas:getPos2(name)
if pos1 and pos2 then
2013-09-03 07:33:08 +02:00
pos1, pos2 = areas:sortPos(pos1, pos2)
else
minetest.chat_send_player(name, 'You need to select an area first')
return
end
2013-09-03 01:16:14 +02:00
2013-09-03 07:33:08 +02:00
if not areas:player_exists(ownername) then
minetest.chat_send_player(name, 'The player "'
..ownername..'" does not exist')
return
end
2013-09-03 01:16:14 +02:00
2013-11-08 21:11:11 +01:00
minetest.log("action", name.." runs /add_owner. Owner = "..ownername..
2013-09-03 07:33:08 +02:00
" AreaName = "..areaname.." ParentID = "..pid..
" StartPos = "..pos1.x..","..pos1.y..","..pos1.z..
" EndPos = " ..pos2.x..","..pos2.y..","..pos2.z)
-- Check if this new area is inside an area owned by the player
pid = tonumber(pid)
if (not areas:isAreaOwner(pid, name)) or
(not areas:isSubarea(pos1, pos2, pid)) then
minetest.chat_send_player(name,
"You can't protect that area")
return
2013-09-03 01:16:14 +02:00
end
2013-09-03 07:33:08 +02:00
local id = areas:add(ownername, areaname, pos1, pos2, pid)
2013-09-03 07:33:08 +02:00
areas:save()
2013-11-08 21:11:11 +01:00
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(ownername,
"You have been granted control over area #"..
id..". Type /list_areas to show your areas.")
minetest.chat_send_player(name, "Area protected. ID: "..id)
2013-09-03 01:16:14 +02:00
end})
minetest.register_chatcommand("rename_area", {
params = "<ID> <newName>",
description = "Rename a area that you own",
privs = {},
func = function(name, param)
2013-11-15 01:15:26 +01:00
local found, _, id, newName = param:find("^(%d+) (.+)$")
2013-11-08 21:11:11 +01:00
if not found then
minetest.chat_send_player(name,
"Invalid usage, see /help rename_area")
return
end
id = tonumber(id)
if not id then
2013-11-08 21:11:11 +01:00
minetest.chat_send_player(name, "That area doesn't exist.")
return
end
if not areas:isAreaOwner(id, name) then
minetest.chat_send_player(name, "You don't own that area.")
return
end
areas.areas[id].name = newName
2013-11-08 21:11:11 +01:00
areas:save()
minetest.chat_send_player(name, "Area renamed.")
2013-09-03 01:16:14 +02:00
end})
minetest.register_chatcommand("find_areas", {
params = "<regexp>",
description = "Find areas using a Lua regular expression",
privs = {},
func = function(name, param)
2013-09-03 07:33:08 +02:00
if param == "" then
minetest.chat_send_player(name,
"A regular expression is required.")
return
end
-- Check expression for validity
local function testRegExp()
("Test [1]: Player (0,0,0) (0,0,0)"):find(param)
end
if not pcall(testRegExp) then
minetest.chat_send_player(name,
"Invalid regular expression.")
return
end
2013-09-03 07:33:08 +02:00
local found = false
for id, area in pairs(areas.areas) do
if areas:isAreaOwner(id, name) and
areas:toString(id):find(param) then
minetest.chat_send_player(name, areas:toString(id))
2013-09-03 07:33:08 +02:00
found = true
2013-09-03 01:16:14 +02:00
end
2013-09-03 07:33:08 +02:00
end
if not found then
minetest.chat_send_player(name, "No matches found")
2013-09-03 01:16:14 +02:00
end
end})
minetest.register_chatcommand("list_areas", {
params = "",
2013-09-03 07:33:08 +02:00
description = "List your areas, or all areas if you are an admin.",
2013-09-03 01:16:14 +02:00
privs = {},
func = function(name, param)
2013-11-08 21:11:11 +01:00
local admin = minetest.check_player_privs(name, {areas=true})
2013-09-03 01:16:14 +02:00
if admin then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name,
"Showing all areas.")
2013-09-03 01:16:14 +02:00
else
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name,
"Showing your areas.")
2013-09-03 01:16:14 +02:00
end
for id, area in pairs(areas.areas) do
if admin or areas:isAreaOwner(id, name) then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name,
areas:toString(id))
2013-09-03 01:16:14 +02:00
end
end
end})
minetest.register_chatcommand("recursive_remove_areas", {
params = "<id>",
description = "Recursively remove areas using an id",
privs = {},
func = function(name, param)
local id = tonumber(param)
if not id then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name,
"Invalid usage, see"
.." /help recursive_remove_areas")
2013-09-03 01:16:14 +02:00
return
end
if not areas:isAreaOwner(id, name) then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name, "Area "..id
.." does not exist or is"
.." not owned by you.")
2013-09-03 01:16:14 +02:00
return
end
areas:remove(id, true)
areas:save()
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name, "Removed area "..id
.." and it's sub areas.")
2013-09-03 01:16:14 +02:00
end})
minetest.register_chatcommand("remove_area", {
params = "<id>",
description = "Remove an area using an id",
privs = {},
func = function(name, param)
local id = tonumber(param)
if not id then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name,
"Invalid usage, see /help remove_area")
2013-09-03 01:16:14 +02:00
return
end
if not areas:isAreaOwner(id, name) then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name, "Area "..id
.." does not exist or"
.." is not owned by you")
2013-09-03 01:16:14 +02:00
return
end
areas:remove(id)
areas:save()
2013-09-03 01:16:14 +02:00
minetest.chat_send_player(name, 'Removed area '..id)
end})
minetest.register_chatcommand("change_owner", {
2013-09-03 07:33:08 +02:00
params = "<id> <NewOwner>",
description = "Change the owner of an area using its id",
2013-09-03 01:16:14 +02:00
privs = {},
func = function(name, param)
2013-09-03 07:33:08 +02:00
local found, _, id, new_owner =
2013-11-15 01:15:26 +01:00
param:find('^(%d+) ([^ ]+)$')
2013-09-03 01:16:14 +02:00
if not found then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name,
"Invalid usage,"
.." see /help change_area_owner")
2013-09-03 01:16:14 +02:00
return
end
if not areas:player_exists(new_owner) then
2013-09-03 07:33:08 +02:00
minetest.chat_send_player(name, 'The player "'
..new_owner..'" does not exist')
2013-09-03 01:16:14 +02:00
return
end
id = tonumber(id)
2013-09-03 07:33:08 +02:00
if not areas:isAreaOwner(id, name) then
minetest.chat_send_player(name,
"Area "..id.." does not exist"
.." or is not owned by you.")
return
2013-09-03 01:16:14 +02:00
end
areas.areas[id].owner = new_owner
2013-09-03 07:33:08 +02:00
areas:save()
minetest.chat_send_player(name, 'Owner changed.')
minetest.chat_send_player(new_owner,
name..'" has given you control over an area.')
2013-09-03 01:16:14 +02:00
end})
minetest.register_chatcommand("area_open", {
params = "<id>",
description = "Toggle an area open (anyone can interact) or not",
privs = {},
func = function(name, param)
local id = tonumber(param)
if not id then
minetest.chat_send_player(name,
"Invalid usage, see /help area_open")
return
end
if not areas:isAreaOwner(id, name) then
minetest.chat_send_player(name,
"Area "..id.." does not exist"
.." or is not owned by you.")
return
end
local open = not areas.areas[id].open
-- Save false as nil to avoid inflating the DB.
areas.areas[id].open = open or nil
areas:save()
minetest.chat_send_player(name, "Area "..(open and "opened" or "closed")..".")
end})