diff --git a/chatcommands.lua b/chatcommands.lua index e533602..dc929f9 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -5,35 +5,31 @@ minetest.register_chatcommand("protect", { privs = {[areas.self_protection_privilege]=true}, func = function(name, param) if param == "" then - minetest.chat_send_player(name, 'Invalid usage, see /help protect') - return + return false, "Invalid usage, see /help protect." end local pos1, pos2 = areas:getPos1(name), areas:getPos2(name) if pos1 and pos2 then pos1, pos2 = areas:sortPos(pos1, pos2) else - minetest.chat_send_player(name, 'You need to select an area first') - return + return false, "You need to select an area first." end minetest.log("action", "/protect invoked, owner="..name.. - " areaname="..param.. - " startpos="..minetest.pos_to_string(pos1).. - " endpos=" ..minetest.pos_to_string(pos2)) + " AreaName="..param.. + " StartPos="..minetest.pos_to_string(pos1).. + " EndPos=" ..minetest.pos_to_string(pos2)) 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 + return false, "You can't protect that area: "..errMsg end local id = areas:add(name, param, pos1, pos2, nil) areas:save() - minetest.chat_send_player(name, "Area protected. ID: "..id) -end}) + return true, "Area protected. ID: "..id + end +}) minetest.register_chatcommand("set_owner", { @@ -43,40 +39,38 @@ minetest.register_chatcommand("set_owner", { .." area to any existing area", privs = {areas=true}, func = function(name, param) - local found, _, ownername, areaname = param:find('^([^ ]+) (.+)$') + local ownerName, areaName = param:match('^(%S+)%s(.+)$') - if not found then - minetest.chat_send_player(name, "Incorrect usage, see /help set_owner") - return + if not ownerName then + return false, "Incorrect usage, see /help set_owner." end local pos1, pos2 = areas:getPos1(name), areas:getPos2(name) if pos1 and pos2 then pos1, pos2 = areas:sortPos(pos1, pos2) else - minetest.chat_send_player(name, "You need to select an area first") - return + return false, "You need to select an area first." end - if not areas:player_exists(ownername) then - minetest.chat_send_player(name, "The player \"" - ..ownername.."\" does not exist") - return + if not areas:player_exists(ownerName) then + return false, "The player \"" + ..ownerName.."\" does not exist." end - minetest.log("action", name.." runs /set_owner. Owner = "..ownername.. - " AreaName = "..areaname.. + minetest.log("action", name.." runs /set_owner. Owner = "..ownerName.. + " AreaName = "..areaName.. " StartPos = "..minetest.pos_to_string(pos1).. " EndPos = " ..minetest.pos_to_string(pos2)) - local id = areas:add(ownername, areaname, pos1, pos2, nil) + local id = areas:add(ownerName, areaName, pos1, pos2, nil) areas:save() - minetest.chat_send_player(ownername, + 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) -end}) + return true, "Area protected. ID: "..id + end +}) minetest.register_chatcommand("add_owner", { @@ -84,10 +78,9 @@ minetest.register_chatcommand("add_owner", { 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.", - privs = {}, func = function(name, param) - local found, _, pid, ownername, areaname - = param:find('^(%d+) ([^ ]+) (.+)$') + local pid, ownerName, areaName + = param:match('^(%d+) ([^ ]+) (.+)$') if not found then minetest.chat_send_player(name, "Incorrect usage, see /help add_owner") @@ -98,18 +91,15 @@ minetest.register_chatcommand("add_owner", { if pos1 and pos2 then pos1, pos2 = areas:sortPos(pos1, pos2) else - minetest.chat_send_player(name, 'You need to select an area first') - return + return false, "You need to select an area first." end - if not areas:player_exists(ownername) then - minetest.chat_send_player(name, 'The player "' - ..ownername..'" does not exist') - return + if not areas:player_exists(ownerName) then + return false, "The player \""..ownerName.."\" does not exist." end - minetest.log("action", name.." runs /add_owner. Owner = "..ownername.. - " AreaName = "..areaname.." ParentID = "..pid.. + minetest.log("action", name.." runs /add_owner. Owner = "..ownerName.. + " AreaName = "..areaName.." ParentID = "..pid.. " StartPos = "..pos1.x..","..pos1.y..","..pos1.z.. " EndPos = " ..pos2.x..","..pos2.y..","..pos2.z) @@ -117,59 +107,51 @@ minetest.register_chatcommand("add_owner", { 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 + return false, "You can't protect that area." end - local id = areas:add(ownername, areaname, pos1, pos2, pid) + local id = areas:add(ownerName, areaName, pos1, pos2, pid) areas:save() - minetest.chat_send_player(ownername, + 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) -end}) + return true, "Area protected. ID: "..id + end +}) minetest.register_chatcommand("rename_area", { params = " ", description = "Rename a area that you own", - privs = {}, func = function(name, param) - local found, _, id, newName = param:find("^(%d+) (.+)$") + local id, newName = param:match("^(%d+)%s(.+)$") if not found then - minetest.chat_send_player(name, - "Invalid usage, see /help rename_area") - return + return false, "Invalid usage, see /help rename_area." end id = tonumber(id) if not id then - minetest.chat_send_player(name, "That area doesn't exist.") - return + return false, "That area doesn't exist." end if not areas:isAreaOwner(id, name) then - minetest.chat_send_player(name, "You don't own that area.") - return + return true, "You don't own that area." end areas.areas[id].name = newName areas:save() - minetest.chat_send_player(name, "Area renamed.") -end}) + return true, "Area renamed." + end +}) minetest.register_chatcommand("find_areas", { params = "", description = "Find areas using a Lua regular expression", - privs = {}, func = function(name, param) if param == "" then - minetest.chat_send_player(name, - "A regular expression is required.") - return + return false, "A regular expression is required." end -- Check expression for validity @@ -177,157 +159,136 @@ minetest.register_chatcommand("find_areas", { ("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 + return false, "Invalid regular expression." end - local found = false + local matches = {} 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)) - found = true + table.insert(matches, areas:toString(id)) end end - if not found then - minetest.chat_send_player(name, "No matches found") + if #matches > 1 then + return true, table.concat(matches, "\n") + else + return true, "No matches found." end -end}) + end +}) minetest.register_chatcommand("list_areas", { - params = "", description = "List your areas, or all areas if you are an admin.", - privs = {}, func = function(name, param) local admin = minetest.check_player_privs(name, {areas=true}) - if admin then - minetest.chat_send_player(name, - "Showing all areas.") - else - minetest.chat_send_player(name, - "Showing your areas.") - end + local areaStrings = {} for id, area in pairs(areas.areas) do if admin or areas:isAreaOwner(id, name) then - minetest.chat_send_player(name, - areas:toString(id)) + table.insert(areaStrings, areas:toString(id)) end end -end}) + if #areaStrings == 0 then + return true, "No visible areas." + end + return true, table.concat(areaStrings, "\n") + end +}) minetest.register_chatcommand("recursive_remove_areas", { params = "", description = "Recursively remove areas using an id", - privs = {}, func = function(name, param) local id = tonumber(param) if not id then - minetest.chat_send_player(name, - "Invalid usage, see" - .." /help recursive_remove_areas") - return + return false, "Invalid usage, see" + .." /help recursive_remove_areas" 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 + return false, "Area "..id.." does not exist or is" + .." not owned by you." end areas:remove(id, true) areas:save() - minetest.chat_send_player(name, "Removed area "..id - .." and it's sub areas.") -end}) + return true, "Removed area "..id.." and it's sub areas." + end +}) minetest.register_chatcommand("remove_area", { params = "", description = "Remove an area using an id", - privs = {}, func = function(name, param) local id = tonumber(param) if not id then - minetest.chat_send_player(name, - "Invalid usage, see /help remove_area") - return + return false, "Invalid usage, see /help remove_area" 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 + return false, "Area "..id.." does not exist or" + .." is not owned by you." end areas:remove(id) areas:save() - minetest.chat_send_player(name, 'Removed area '..id) -end}) + return true, "Removed area "..id + end +}) minetest.register_chatcommand("change_owner", { - params = " ", - description = "Change the owner of an area using its id", - privs = {}, + params = " ", + description = "Change the owner of an area using it's ID", func = function(name, param) - local found, _, id, new_owner = - param:find('^(%d+) ([^ ]+)$') + local id, newOwner = param:match("^(%d+)%s(%S+)$") - if not found then - minetest.chat_send_player(name, - "Invalid usage," - .." see /help change_area_owner") - return + if not id then + return false, "Invalid usage, see" + .." /help change_owner." end - if not areas:player_exists(new_owner) then - minetest.chat_send_player(name, 'The player "' - ..new_owner..'" does not exist') - return + if not areas:player_exists(newOwner) then + return false, "The player \""..newOwner + .."\" does not exist." end id = tonumber(id) if not areas:isAreaOwner(id, name) then - minetest.chat_send_player(name, - "Area "..id.." does not exist" - .." or is not owned by you.") - return + return false, "Area "..id.." does not exist" + .." or is not owned by you." end - areas.areas[id].owner = new_owner + areas.areas[id].owner = newOwner areas:save() - minetest.chat_send_player(name, 'Owner changed.') - minetest.chat_send_player(new_owner, - name..'" has given you control over an area.') -end}) + minetest.chat_send_player(newOwner, + ("%s has given you control over the area %q (ID %d).") + :format(name, areas[id].name, id)) + return true, "Owner changed." + end +}) + minetest.register_chatcommand("area_open", { - params = "", - description = "Toggle an area open (anyone can interact) or not", - privs = {}, + params = "", + description = "Toggle an area open (anyone can interact) or closed", func = function(name, param) local id = tonumber(param) if not id then - minetest.chat_send_player(name, - "Invalid usage, see /help area_open") - return + return false, "Invalid usage, see /help area_open." 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 + return false, "Area "..id.." does not exist" + .." or is not owned by you." 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}) + return true, ("Area %s."):format(open and "opened" or "closed") + end +}) diff --git a/pos.lua b/pos.lua index 018ee72..3dbf07c 100644 --- a/pos.lua +++ b/pos.lua @@ -12,26 +12,20 @@ areas.pos1 = {} areas.pos2 = {} minetest.register_chatcommand("select_area", { - params = "", + params = "", description = "Select a area by id.", - privs = {}, func = function(name, param) local id = tonumber(param) if not id then - minetest.chat_send_player(name, - "Invalid usage, see /help select_area.") - return + return false, "Invalid usage, see /help select_area." end if not areas.areas[id] then - minetest.chat_send_player(name, - "The area "..id.." does not exist.") - return + return false, "The area "..id.." does not exist." end areas:setPos1(name, areas.areas[id].pos1) areas:setPos2(name, areas.areas[id].pos2) - minetest.chat_send_player(name, - "Area "..id.." selected.") + return true, "Area "..id.." selected." end, }) @@ -47,24 +41,19 @@ minetest.register_chatcommand("area_pos1", { if found then pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} elseif param == "" then - player = minetest.get_player_by_name(name) + local player = minetest.get_player_by_name(name) if player then pos = player:getpos() else - minetest.chat_send_player(name, - "Unable to get position") - return + return false, "Unable to get position." end else - minetest.chat_send_player(name, - "Invalid usage, see /help area_pos1") - return + return false, "Invalid usage, see /help area_pos1." end pos = vector.round(pos) areas:setPos1(name, pos) - minetest.chat_send_player(name, - "Area position 1 set to " - ..minetest.pos_to_string(pos)) + return true, "Area position 1 set to " + ..minetest.pos_to_string(pos) end, }) @@ -72,7 +61,6 @@ minetest.register_chatcommand("area_pos2", { params = "[X Y Z|X,Y,Z]", description = "Set area protection region position 2 to your" .." location or the one specified", - privs = {}, func = function(name, param) local pos = nil local found, _, x, y, z = param:find( @@ -80,24 +68,19 @@ minetest.register_chatcommand("area_pos2", { if found then pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} elseif param == "" then - player = minetest.get_player_by_name(name) + local player = minetest.get_player_by_name(name) if player then pos = player:getpos() else - minetest.chat_send_player(name, - "Unable to get position") - return + return false, "Unable to get position." end else - minetest.chat_send_player(name, - "Invalid usage, see /help area_pos2") - return + return false, "Invalid usage, see /help area_pos2." end pos = vector.round(pos) areas:setPos2(name, pos) - minetest.chat_send_player(name, - "Area position 2 set to " - ..minetest.pos_to_string(pos)) + return true, "Area position 2 set to " + ..minetest.pos_to_string(pos) end, }) @@ -106,38 +89,31 @@ minetest.register_chatcommand("area_pos", { params = "set/set1/set2/get", description = "Set area protection region, position 1, or position 2" .." by punching nodes, or display the region", - privs = {}, func = function(name, param) if param == "set" then -- Set both area positions areas.set_pos[name] = "pos1" - minetest.chat_send_player(name, - "Select positions by punching two nodes") + return true, "Select positions by punching two nodes." elseif param == "set1" then -- Set area position 1 areas.set_pos[name] = "pos1only" - minetest.chat_send_player(name, - "Select position 1 by punching a node") + return true, "Select position 1 by punching a node." elseif param == "set2" then -- Set area position 2 areas.set_pos[name] = "pos2" - minetest.chat_send_player(name, - "Select position 2 by punching a node") + return true, "Select position 2 by punching a node." elseif param == "get" then -- Display current area positions - if areas.pos1[name] ~= nil then - minetest.chat_send_player(name, "Position 1: " - ..minetest.pos_to_string(areas.pos1[name])) + local pos1str, pos2str = "Position 1: ", "Position 2: " + if areas.pos1[name] then + pos1str = pos1str..minetest.pos_to_string(areas.pos1[name]) else - minetest.chat_send_player(name, - "Position 1 not set") + pos1str = pos1str.."" end - if areas.pos2[name] ~= nil then - minetest.chat_send_player(name, "Position 2: " - ..minetest.pos_to_string(areas.pos2[name])) + if areas.pos2[name] then + pos2str = pos2str..minetest.pos_to_string(areas.pos2[name]) else - minetest.chat_send_player(name, - "Position 2 not set") + pos2str = pos2str.."" end + return true, pos1str.."\n"..pos2str else - minetest.chat_send_player(name, - "Unknown subcommand: "..param) + return false, "Unknown subcommand: "..param end end, })