minetest.register_chatcommand("protect", { params = "", description = "Protect your own area", privs = {[areas.self_protection_privilege]=true}, func = function(name, param) if param ~= "" then local pos1, pos2 = {}, {} if areas:getPos1(name) and areas:getPos2(name) then pos1 = areas:getPos1(name) pos2 = areas:getPos2(name) pos1, pos2 = areas:sortPos(pos1, pos2) else minetest.chat_send_player(name, 'You need to select an area first') return end minetest.log("action", "/protect invoked, owner="..name.. " 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 end areas:add(name, param, pos1, pos2, nil) areas:save() minetest.chat_send_player(name, "Area protected") else minetest.chat_send_player(name, 'Invalid usage, see /help protect') end end}) minetest.register_chatcommand("set_owner", { params = " ", 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", privs = {areas=true}, func = function(name, param) if param and param ~= "" then local found, _, ownername, areaname = param:find('^([^%s]+)%s(.+)$') if not found then minetest.chat_send_player(name, "Incorrect usage, see /help set_owner") return end local pos1, pos2 = {}, {} if areas:getPos1(name) and areas:getPos2(name) then pos1 = areas:getPos1(name) pos2 = areas:getPos2(name) pos1, pos2 = areas:sortPos(pos1, pos2) else minetest.chat_send_player(name, 'You need to select an area first') return end if not areas:player_exists(ownername) then minetest.chat_send_player(name, 'The player "'..ownername..'" does not exist') return end --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 --end minetest.log("action", "/set_owner invoked, Owner="..ownername.. " AreaName="..areaname.. " StartPos="..minetest.pos_to_string(pos1).. " EndPos=" ..minetest.pos_to_string(pos2)) areas:add(ownername, areaname, pos1, pos2, nil) areas:save() minetest.chat_send_player(ownername, "A concession has been granted to you! Type /list_areas to show your concessions.") minetest.chat_send_player(name, "Area protected") else minetest.chat_send_player(name, 'Invalid usage, see /help set_owner') end end}) minetest.register_chatcommand("add_owner", { params = " ", 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) if param and param ~= "" then local found, _, pid, ownername, areaname = param:find('^(%d+)%s([^%s]+)%s(.+)$') if not found then minetest.chat_send_player(name, "Incorrect usage, see /help set_owner") return end local pos1, pos2 = {}, {} if areas:getPos1(name) and areas:getPos2(name) then pos1 = areas:getPos1(name) pos2 = areas:getPos2(name) pos1, pos2 = areas:sortPos(pos1, pos2) else minetest.chat_send_player(name, 'You need to select an area first') return end if not areas:player_exists(ownername) then minetest.chat_send_player(name, 'The player "'..ownername..'" does not exist') return end minetest.log("action", "add_owner invoked, Owner = "..ownername.. " AreaName = "..areaname.." ParentID = "..pid.. " StartPos = "..pos1.x..","..pos1.y..","..pos1.z.. " EndPos = " ..pos2.x..","..pos2.y..","..pos2.z) --Look to see if this new area is inside an area owned by the player using this function 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 end areas:add(ownername, areaname, pos1, pos2, pid) areas:save() minetest.chat_send_player(ownername, "A concession has been granted to you! Type /list_areas to show your concessions.") minetest.chat_send_player(name, "You granted "..ownername.." a concession successfully!") else minetest.chat_send_player(name, 'Invalid usage, see /help add_owner') end 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+)%s(.+)$") if not found then minetest.chat_send_player(name, "Invalid usage, see /help rename_area") return end index = areas:getIndexById(tonumber(id)) if not index then 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[index].name = newName areas:save() end}) minetest.register_chatcommand("list_owners", { params = "", description = "list the players that can edit the area you are in", privs = {}, func = function(name, param) local owners = areas:getNodeOwners(vector.round(minetest.get_player_by_name(name):getpos())) if #owners > 0 then minetest.chat_send_player(name, "Owners: "..table.concat(owners, ", ")) else minetest.chat_send_player(name, "Your position is unowned") end end}) minetest.register_chatcommand("find_areas", { params = "", description = "Find areas using a Lua regular expression", privs = {}, func = function(name, param) if param and param ~= "" then local found = false for _, area in pairs(areas.areas) do if areas:isAreaOwner(area.id, name) and areas:toString(area):find(param) then minetest.chat_send_player(name, areas:toString(area)) found = true end end if not found then minetest.chat_send_player(name, "No matches found") end else minetest.chat_send_player(name, "Regular expression required") end end}) minetest.register_chatcommand("list_areas", { params = "", description = "list the areas you own, or all areas if you have privileges", privs = {}, func = function(name, param) admin = minetest.check_player_privs(name, {areas=true}) if admin then minetest.chat_send_player(name, "Showing all owner entries.") else minetest.chat_send_player(name, "Showing your owner entries (You can only modify these).") end for _, area in pairs(areas.areas) do if admin or area.owner == name then minetest.chat_send_player(name, areas:toString(area)) end end 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') minetest.chat_send_player(name, 'Use /list_areas to see entries') return end if areas:isAreaOwner(id, name) then areas:remove(id, true) areas:sort() areas:save() else minetest.chat_send_player(name, "Area "..id.." does not exist or is not owned by you") return end minetest.chat_send_player(name, 'Removed area '..id..'and 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') minetest.chat_send_player(name, 'Use /list_areas to see entries') return end if areas:isAreaOwner(id, name) then areas:remove(id, false) areas:sort() areas:save() else minetest.chat_send_player(name, "Area "..id.." does not exist or is not owned by you") return end minetest.chat_send_player(name, 'Removed area '..id) end}) minetest.register_chatcommand("change_owner", { params = " ", description = "change the owner of an area using its id", privs = {}, func = function(name, param) local found, _, id, new_owner = param:find('^(%d+)%s+([^%s]+)$') if not found then minetest.chat_send_player(name, 'Invalid usage, see /help change_area_owner') minetest.chat_send_player(name, 'Use /list_areas to see entries') return end if not areas:player_exists(new_owner) then minetest.chat_send_player(name, 'The player "'..new_owner..'" does not exist') return end id = tonumber(id) if areas:isAreaOwner(id, name) then areas.areas[areas:getIndexById(id)].owner = new_owner areas:save() minetest.chat_send_player(name, 'Owner changed succesfully') minetest.chat_send_player(new_owner, name..'" has granted you a concession!') else minetest.chat_send_player(new_owner, "Area "..id.." does not exist or is not owned by you") end end})