Shorten lines

This commit is contained in:
ShadowNinja 2013-09-03 01:33:08 -04:00
parent 3d866330bf
commit 7b0ff512f7
5 changed files with 261 additions and 199 deletions

View File

@ -22,7 +22,9 @@ minetest.register_chatcommand("protect", {
local canAdd, errMsg = areas:canPlayerAddArea(pos1, pos2, name) local canAdd, errMsg = areas:canPlayerAddArea(pos1, pos2, name)
if not canAdd then if not canAdd then
minetest.chat_send_player(name, "You can't protect that area: "..errMsg) minetest.chat_send_player(name,
"You can't protect that area: "
..errMsg)
return return
end end
@ -38,103 +40,101 @@ end})
minetest.register_chatcommand("set_owner", { minetest.register_chatcommand("set_owner", {
params = "<PlayerName> <AreaName>", params = "<PlayerName> <AreaName>",
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", 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}, privs = {areas=true},
func = function(name, param) func = function(name, param)
if param and param ~= "" then local found, _, ownername, areaname = param:find('^([^%s]+)%s(.+)$')
local found, _, ownername, areaname = param:find('^([^%s]+)%s(.+)$')
if not found then if not found then
minetest.chat_send_player(name, "Incorrect usage, see /help set_owner") minetest.chat_send_player(name, "Incorrect usage, see /help set_owner")
return 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
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", "/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,
"You have been granted control over an area."
.." Type /list_areas to show your areas.")
minetest.chat_send_player(name, "Area protected")
end}) end})
minetest.register_chatcommand("add_owner", { minetest.register_chatcommand("add_owner", {
params = "<ParentID> <Player> <AreaName>", params = "<ParentID> <Player> <AreaName>",
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", 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 = {}, privs = {},
func = function(name, param) func = function(name, param)
if param and param ~= "" then local found, _, pid, ownername, areaname
local found, _, pid, ownername, areaname = param:find('^(%d+)%s([^%s]+)%s(.+)$') = param:find('^(%d+)%s([^%s]+)%s(.+)$')
if not found then if not found then
minetest.chat_send_player(name, "Incorrect usage, see /help set_owner") minetest.chat_send_player(name, "Incorrect usage, see /help set_owner")
return 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
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)
-- 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
end
areas:add(ownername, areaname, pos1, pos2, pid)
areas:save()
minetest.chat_send_player(ownername,
"You have been gtanted control over an area."
.." Type /list_areas to show your areas.")
minetest.chat_send_player(name, "Area protected.")
end}) end})
@ -146,19 +146,20 @@ minetest.register_chatcommand("rename_area", {
local found, _, id, newName = param:find("^(%d+)%s(.+)$") local found, _, id, newName = param:find("^(%d+)%s(.+)$")
if not found then if not found then
minetest.chat_send_player(name, "Invalid usage, see /help rename_area") minetest.chat_send_player(name,
"Invalid usage, see /help rename_area")
return return
end end
index = areas:getIndexById(tonumber(id)) index = areas:getIndexById(tonumber(id))
if not index then if not index then
minetest.chat_send_player(name, "That area doesn't exist") minetest.chat_send_player(name, "That area doesn't exist.")
return return
end end
if not areas:isAreaOwner(id, name) then if not areas:isAreaOwner(id, name) then
minetest.chat_send_player(name, "You don't own that area") minetest.chat_send_player(name, "You don't own that area.")
return return
end end
@ -169,14 +170,23 @@ end})
minetest.register_chatcommand("list_owners", { minetest.register_chatcommand("list_owners", {
params = "", params = "",
description = "list the players that can edit the area you are in", description = "List the owners of your position",
privs = {}, privs = {},
func = function(name, param) func = function(name, param)
local owners = areas:getNodeOwners(vector.round(minetest.get_player_by_name(name):getpos())) local player = minetest.get_player_by_name(name)
if not player then
minetest.chat_send_player(name,
"Unable to find your position.")
return
end
local pos = vector.round(player:getpos())
local owners = areas:getNodeOwners(pos)
if #owners > 0 then if #owners > 0 then
minetest.chat_send_player(name, "Owners: "..table.concat(owners, ", ")) minetest.chat_send_player(name,
"Owners: "..table.concat(owners, ", "))
else else
minetest.chat_send_player(name, "Your position is unowned") minetest.chat_send_player(name,
"Your position is unowned.")
end end
end}) end})
@ -186,38 +196,42 @@ minetest.register_chatcommand("find_areas", {
description = "Find areas using a Lua regular expression", description = "Find areas using a Lua regular expression",
privs = {}, privs = {},
func = function(name, param) func = function(name, param)
if param and param ~= "" then if param == "" then
local found = false minetest.chat_send_player(name,
for _, area in pairs(areas.areas) do "A regular expression is required.")
if areas:isAreaOwner(area.id, name) and return
areas:toString(area):find(param) then end
minetest.chat_send_player(name, areas:toString(area)) local found = false
found = true for _, area in pairs(areas.areas) do
end 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 end
minetest.chat_send_player(name, "No matches found") if not found then
end minetest.chat_send_player(name, "No matches found")
else
minetest.chat_send_player(name, "Regular expression required")
end end
end}) end})
minetest.register_chatcommand("list_areas", { minetest.register_chatcommand("list_areas", {
params = "", params = "",
description = "list the areas you own, or all areas if you have privileges", description = "List your areas, or all areas if you are an admin.",
privs = {}, privs = {},
func = function(name, param) func = function(name, param)
admin = minetest.check_player_privs(name, {areas=true}) admin = minetest.check_player_privs(name, {areas=true})
if admin then if admin then
minetest.chat_send_player(name, "Showing all owner entries.") minetest.chat_send_player(name,
"Showing all areas.")
else else
minetest.chat_send_player(name, "Showing your owner entries (You can only modify these).") minetest.chat_send_player(name,
"Showing your areas.")
end end
for _, area in pairs(areas.areas) do for _, area in pairs(areas.areas) do
if admin or area.owner == name then if admin or area.owner == name then
minetest.chat_send_player(name, areas:toString(area)) minetest.chat_send_player(name,
areas:toString(area))
end end
end end
end}) end})
@ -230,8 +244,9 @@ minetest.register_chatcommand("recursive_remove_areas", {
func = function(name, param) func = function(name, param)
local id = tonumber(param) local id = tonumber(param)
if not id then if not id then
minetest.chat_send_player(name, 'Invalid usage, see /help recursive_remove_areas') minetest.chat_send_player(name,
minetest.chat_send_player(name, 'Use /list_areas to see entries') "Invalid usage, see"
.." /help recursive_remove_areas")
return return
end end
@ -240,10 +255,13 @@ minetest.register_chatcommand("recursive_remove_areas", {
areas:sort() areas:sort()
areas:save() areas:save()
else else
minetest.chat_send_player(name, "Area "..id.." does not exist or is not owned by you") minetest.chat_send_player(name, "Area "..id
.." does not exist or is"
.." not owned by you.")
return return
end end
minetest.chat_send_player(name, 'Removed area '..id..'and sub areas') minetest.chat_send_player(name, "Removed area "..id
.." and it's sub areas.")
end}) end})
@ -254,8 +272,8 @@ minetest.register_chatcommand("remove_area", {
func = function(name, param) func = function(name, param)
local id = tonumber(param) local id = tonumber(param)
if not id then if not id then
minetest.chat_send_player(name, 'Invalid usage, see /help remove_area') minetest.chat_send_player(name,
minetest.chat_send_player(name, 'Use /list_areas to see entries') "Invalid usage, see /help remove_area")
return return
end end
@ -264,7 +282,9 @@ minetest.register_chatcommand("remove_area", {
areas:sort() areas:sort()
areas:save() areas:save()
else else
minetest.chat_send_player(name, "Area "..id.." does not exist or is not owned by you") minetest.chat_send_player(name, "Area "..id
.." does not exist or"
.." is not owned by you")
return return
end end
minetest.chat_send_player(name, 'Removed area '..id) minetest.chat_send_player(name, 'Removed area '..id)
@ -272,31 +292,38 @@ end})
minetest.register_chatcommand("change_owner", { minetest.register_chatcommand("change_owner", {
params = "<id> <newplayer>", params = "<id> <NewOwner>",
description = "change the owner of an area using its id", description = "Change the owner of an area using its id",
privs = {}, privs = {},
func = function(name, param) func = function(name, param)
local found, _, id, new_owner = param:find('^(%d+)%s+([^%s]+)$') local found, _, id, new_owner =
param:find('^(%d+)%s+([^%s]+)$')
if not found then if not found then
minetest.chat_send_player(name, 'Invalid usage, see /help change_area_owner') minetest.chat_send_player(name,
minetest.chat_send_player(name, 'Use /list_areas to see entries') "Invalid usage,"
.." see /help change_area_owner")
return return
end end
if not areas:player_exists(new_owner) then if not areas:player_exists(new_owner) then
minetest.chat_send_player(name, 'The player "'..new_owner..'" does not exist') minetest.chat_send_player(name, 'The player "'
..new_owner..'" does not exist')
return return
end end
id = tonumber(id) id = tonumber(id)
if areas:isAreaOwner(id, name) then if not areas:isAreaOwner(id, name) then
areas.areas[areas:getIndexById(id)].owner = new_owner minetest.chat_send_player(name,
areas:save() "Area "..id.." does not exist"
minetest.chat_send_player(name, 'Owner changed succesfully') .." or is not owned by you.")
minetest.chat_send_player(new_owner, name..'" has granted you a concession!') return
else
minetest.chat_send_player(new_owner, "Area "..id.." does not exist or is not owned by you")
end end
local index = areas:getImdexById(id)
areas.areas[index].owner = new_owner
areas:save()
minetest.chat_send_player(name, 'Owner changed.')
minetest.chat_send_player(new_owner,
name..'" has given you control over an area.')
end}) end})

View File

@ -45,7 +45,8 @@ function areas:remove(id, recurse)
local parent = self:getAreaById(id).parent local parent = self:getAreaById(id).parent
local children = self:getChildren(id) local children = self:getChildren(id)
for _, child in pairs(children) do for _, child in pairs(children) do
-- The subarea parent will be niled out if the removed area does not have a parent -- The subarea parent will be niled out if the
-- removed area does not have a parent
areas.areas[self:getIndexById(child)].parent = parent areas.areas[self:getIndexById(child)].parent = parent
end end
@ -58,15 +59,18 @@ end
-- Checks if a area between two points is entirely contained by another area -- Checks if a area between two points is entirely contained by another area
function areas:isSubarea(pos1, pos2, id) function areas:isSubarea(pos1, pos2, id)
local area = areas:getAreaById(id) local area = areas:getAreaById(id)
if area then if not area then
p1, p2 = area.pos1, area.pos2 return false
if (pos1.x >= p1.x and pos1.x <= p2.x) and (pos2.x >= p1.x and pos2.x <= p2.x) and end
(pos1.y >= p1.y and pos1.y <= p2.y) and (pos2.y >= p1.y and pos2.y <= p2.y) and p1, p2 = area.pos1, area.pos2
(pos1.z >= p1.z and pos1.z <= p2.z) and (pos2.z >= p1.z and pos2.z <= p2.z) then if (pos1.x >= p1.x and pos1.x <= p2.x) and
return true (pos2.x >= p1.x and pos2.x <= p2.x) and
end (pos1.y >= p1.y and pos1.y <= p2.y) and
(pos2.y >= p1.y and pos2.y <= p2.y) and
(pos1.z >= p1.z and pos1.z <= p2.z) and
(pos2.z >= p1.z and pos2.z <= p2.z) then
return true
end end
return false
end end
-- Returns a table (list) of children of an area given it's identifier -- Returns a table (list) of children of an area given it's identifier
@ -83,17 +87,20 @@ end
-- Checks if the user has sufficient privileges. -- Checks if the user has sufficient privileges.
-- If the player is not a administrator it also checks -- If the player is not a administrator it also checks
-- if the area intersects other areas that they do not own. -- if the area intersects other areas that they do not own.
-- Also checks the size of the area and if the user already has more than max_areas. -- Also checks the size of the area and if the user already
-- has more than max_areas.
function areas:canPlayerAddArea(pos1, pos2, name) function areas:canPlayerAddArea(pos1, pos2, name)
--[[
if minetest.check_player_privs(name, {areas=true}) then if minetest.check_player_privs(name, {areas=true}) then
return true return true
end--]] end
-- Check self protection privilege, if it is enabled, and if the area is too big. -- Check self protection privilege, if it is enabled,
-- and if the area is too big.
if (not self.self_protection) or if (not self.self_protection) or
(not minetest.check_player_privs(name, {[areas.self_protection_privilege]=true})) then (not minetest.check_player_privs(name,
return false, "Self protection is disabled or you do not have the necessary privilege." {[areas.self_protection_privilege]=true})) then
return false, "Self protection is disabled or you do not have"
.." the necessary privilege."
end end
if (pos2.x - pos1.x) > self.self_protection_max_size.x or if (pos2.x - pos1.x) > self.self_protection_max_size.x or
@ -111,7 +118,9 @@ function areas:canPlayerAddArea(pos1, pos2, name)
end end
end end
if count > self.self_protection_max_areas then if count > self.self_protection_max_areas then
return false, "You have reached the maximum amount of areas that you are allowed to protect." return false, "You have reached the maximum amount"
.." of areas that you are allowed to"
.." protect."
end end
end end
@ -122,7 +131,8 @@ function areas:canPlayerAddArea(pos1, pos2, name)
(area.pos1.z <= pos2.z and area.pos2.z >= pos1.z) then (area.pos1.z <= pos2.z and area.pos2.z >= pos1.z) then
--Found an area intersecting with the suplied area --Found an area intersecting with the suplied area
if area.owner ~= name then if area.owner ~= name then
return false, "The area intersects with a area that you do not own." return false, "The area intersects with an"
.." area that you do not own."
end end
end end
end end
@ -130,7 +140,8 @@ function areas:canPlayerAddArea(pos1, pos2, name)
return true, "" return true, ""
end end
-- Given a area returns a string in the format "name [id]: owner (x1, y1, z1) (x2, y2, z2) -> children" -- Given a area returns a string in the format:
-- "name [id]: owner (x1, y1, z1) (x2, y2, z2) -> children"
function areas:toString(area) function areas:toString(area)
local message = area.name.. local message = area.name..
" ["..area.id.."]: "..area.owner.." ".. " ["..area.id.."]: "..area.owner.." "..

View File

@ -3,12 +3,11 @@
minetest.register_chatcommand("legacy_load_areas", { minetest.register_chatcommand("legacy_load_areas", {
params = "", params = "",
description = "Loads, converts, and saves the areas from a legacy save file.", description = "Loads, converts, and saves the areas from"
privs = {areas=true, server=true}, .." a legacy node_ownership save file.",
privs = {areas=true, server=true, privs=true},
func = function(name, param) func = function(name, param)
minetest.chat_send_player(name, "Converting areas...") minetest.chat_send_player(name, "Converting areas...")
local startTime = os.clock()
err = areas:legacy_load() err = areas:legacy_load()
if err then if err then
minetest.chat_send_player(name, "Error loading legacy file: "..err) minetest.chat_send_player(name, "Error loading legacy file: "..err)
@ -36,8 +35,7 @@ minetest.register_chatcommand("legacy_load_areas", {
minetest.chat_send_player(name, "Table format updated.") minetest.chat_send_player(name, "Table format updated.")
areas:save() areas:save()
minetest.chat_send_player(name, "Converted areas saved.") minetest.chat_send_player(name, "Converted areas saved. Done.")
minetest.chat_send_player(name, "Finished in "..tostring(os.clock() - startTime).."s.")
end}) end})
-- The old load function from node_ownership (with minor modifications) -- The old load function from node_ownership (with minor modifications)

112
pos.lua
View File

@ -1,7 +1,8 @@
-- I could depend on WorldEdit for this, but you need to have the 'worldedit' -- I could depend on WorldEdit for this, but you need to have the 'worldedit'
-- permission to use those commands and you don't have /area_pos{1,2} [x y z|x,y,z] -- permission to use those commands and you don't have
-- Since this is mostly copied from WorldEdit it is licensed under the AGPL. -- /area_pos{1,2} [x y z|x,y,z]. Since this is mostly copied from WorldEdit
-- it is licensed under the AGPL.
areas.marker1 = {} areas.marker1 = {}
areas.marker2 = {} areas.marker2 = {}
@ -16,27 +17,32 @@ minetest.register_chatcommand("select_area", {
func = function(name, param) func = function(name, param)
local id = tonumber(param) local id = tonumber(param)
if not id then if not id then
minetest.chat_send_player(name, "Invalid usage, see /help select_area.") minetest.chat_send_player(name,
"Invalid usage, see /help select_area.")
end end
for k, area in pairs(areas.areas) do for k, area in pairs(areas.areas) do
if area.id == id then if area.id == id then
areas:setPos1(name, area.pos1) areas:setPos1(name, area.pos1)
areas:setPos2(name, area.pos2) areas:setPos2(name, area.pos2)
minetest.chat_send_player(name, "Area "..tostring(id).." selected.") minetest.chat_send_player(name,
"Area "..id.." selected.")
return return
end end
end end
minetest.chat_send_player(name, "The area "..tostring(id).." does not exist.") minetest.chat_send_player(name,
"The area "..id.." does not exist.")
end}) end})
minetest.register_chatcommand("area_pos1", { minetest.register_chatcommand("area_pos1", {
params = "[X Y Z|X,Y,Z]", params = "[X Y Z|X,Y,Z]",
description = "Set area protection region position 1 to the player's location or the one specified", description = "Set area protection region position 1 to your"
.." location or the one specified",
privs = {}, privs = {},
func = function(name, param) func = function(name, param)
local pos = {} local pos = {}
local found, _, x, y, z = param:find("^(-?%d+)[%s%,]+(-?%d+)[%s%,]+(-?%d+)$") local found, _, x, y, z = param:find(
"^(-?%d+)[%s%,]+(-?%d+)[%s%,]+(-?%d+)$")
if found then if found then
pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)}
elseif param == "" then elseif param == "" then
@ -44,25 +50,31 @@ minetest.register_chatcommand("area_pos1", {
if player then if player then
pos = player:getpos() pos = player:getpos()
else else
minetest.chat_send_player(name, "Unable to get position") minetest.chat_send_player(name,
"Unable to get position")
return return
end end
else else
minetest.chat_send_player(name, "Invalid usage, see /help no_pos1") minetest.chat_send_player(name,
"Invalid usage, see /help area_pos1")
end end
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) pos = vector.round(pos)
areas:setPos1(name, pos) areas:setPos1(name, pos)
minetest.chat_send_player(name, "Area position 1 set to " .. minetest.pos_to_string(pos)) minetest.chat_send_player(name,
"Area position 1 set to "
..minetest.pos_to_string(pos))
end, end,
}) })
minetest.register_chatcommand("area_pos2", { minetest.register_chatcommand("area_pos2", {
params = "[X Y Z|X,Y,Z]", params = "[X Y Z|X,Y,Z]",
description = "Set area protection region position 2 to the player's location or the one specified", description = "Set area protection region position 2 to your"
.." location or the one specified",
privs = {}, privs = {},
func = function(name, param) func = function(name, param)
local pos = {} local pos = {}
local found, _, x, y, z = param:find("^(-?%d+)[%s%,]+(-?%d+)[%s%,]+(-?%d+)$") local found, _, x, y, z = param:find(
"^(-?%d+)[%s%,]+(-?%d+)[%s%,]+(-?%d+)$")
if found then if found then
pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)}
elseif param == "" then elseif param == "" then
@ -70,46 +82,59 @@ minetest.register_chatcommand("area_pos2", {
if player then if player then
pos = player:getpos() pos = player:getpos()
else else
minetest.chat_send_player(name, "Unable to get position") minetest.chat_send_player(name,
"Unable to get position")
return return
end end
else else
minetest.chat_send_player(name, "Invalid usage, see /help no_pos2") minetest.chat_send_player(name,
"Invalid usage, see /help area_pos2")
end end
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) pos = vector.round(pos)
areas:setPos2(name, pos) areas:setPos2(name, pos)
minetest.chat_send_player(name, "Area position 2 set to " .. minetest.pos_to_string(pos)) minetest.chat_send_player(name,
"Area position 2 set to "
..minetest.pos_to_string(pos))
end, end,
}) })
minetest.register_chatcommand("area_pos", { minetest.register_chatcommand("area_pos", {
params = "set/set1/set2/get", params = "set/set1/set2/get",
description = "Set area protection region, position 1, or position 2 by punching nodes, or display the region", description = "Set area protection region, position 1, or position 2"
.." by punching nodes, or display the region",
privs = {}, privs = {},
func = function(name, param) func = function(name, param)
if param == "set" then -- Set both area positions if param == "set" then -- Set both area positions
areas.set_pos[name] = "pos1" areas.set_pos[name] = "pos1"
minetest.chat_send_player(name, "Select positions by punching two nodes") minetest.chat_send_player(name,
"Select positions by punching two nodes")
elseif param == "set1" then -- Set area position 1 elseif param == "set1" then -- Set area position 1
areas.set_pos[name] = "pos1only" areas.set_pos[name] = "pos1only"
minetest.chat_send_player(name, "Select position 1 by punching a node") minetest.chat_send_player(name,
"Select position 1 by punching a node")
elseif param == "set2" then -- Set area position 2 elseif param == "set2" then -- Set area position 2
areas.set_pos[name] = "pos2" areas.set_pos[name] = "pos2"
minetest.chat_send_player(name, "Select position 2 by punching a node") minetest.chat_send_player(name,
"Select position 2 by punching a node")
elseif param == "get" then -- Display current area positions elseif param == "get" then -- Display current area positions
if areas.pos1[name] ~= nil then if areas.pos1[name] ~= nil then
minetest.chat_send_player(name, "Position 1: " .. minetest.pos_to_string(areas.pos1[name])) minetest.chat_send_player(name, "Position 1: "
..minetest.pos_to_string(areas.pos1[name]))
else else
minetest.chat_send_player(name, "Position 1 not set") minetest.chat_send_player(name,
"Position 1 not set")
end end
if areas.pos2[name] ~= nil then if areas.pos2[name] ~= nil then
minetest.chat_send_player(name, "Position 2: " .. minetest.pos_to_string(areas.pos2[name])) minetest.chat_send_player(name, "Position 2: "
..minetest.pos_to_string(areas.pos2[name]))
else else
minetest.chat_send_player(name, "Position 2 not set") minetest.chat_send_player(name,
"Position 2 not set")
end end
else else
minetest.chat_send_player(name, "Unknown subcommand: " .. param) minetest.chat_send_player(name,
"Unknown subcommand: "..param)
end end
end, end,
}) })
@ -135,22 +160,29 @@ end
minetest.register_on_punchnode(function(pos, node, puncher) minetest.register_on_punchnode(function(pos, node, puncher)
local name = puncher:get_player_name() local name = puncher:get_player_name()
if name ~= "" and areas.set_pos[name] ~= nil then --currently setting position -- Currently setting position
if areas.set_pos[name] == "pos1" then --setting position 1 if name ~= "" and areas.set_pos[name] then
if areas.set_pos[name] == "pos1" then
areas.pos1[name] = pos areas.pos1[name] = pos
areas.markPos1(name) areas.markPos1(name)
areas.set_pos[name] = "pos2" --set position 2 on the next invocation areas.set_pos[name] = "pos2"
minetest.chat_send_player(name, "Position 1 set to " .. minetest.pos_to_string(pos)) minetest.chat_send_player(name,
elseif areas.set_pos[name] == "pos1only" then --setting position 1 only "Position 1 set to "
..minetest.pos_to_string(pos))
elseif areas.set_pos[name] == "pos1only" then
areas.pos1[name] = pos areas.pos1[name] = pos
areas.markPos1(name) areas.markPos1(name)
areas.set_pos[name] = nil --finished setting positions areas.set_pos[name] = nil
minetest.chat_send_player(name, "Position 1 set to " .. minetest.pos_to_string(pos)) minetest.chat_send_player(name,
elseif areas.set_pos[name] == "pos2" then --setting position 2 "Position 1 set to "
..minetest.pos_to_string(pos))
elseif areas.set_pos[name] == "pos2" then
areas.pos2[name] = pos areas.pos2[name] = pos
areas.markPos2(name) areas.markPos2(name)
areas.set_pos[name] = nil --finished setting positions areas.set_pos[name] = nil
minetest.chat_send_player(name, "Position 2 set to " .. minetest.pos_to_string(pos)) minetest.chat_send_player(name,
"Position 2 set to "
..minetest.pos_to_string(pos))
end end
end end
end) end)
@ -171,14 +203,6 @@ function areas:sortPos(pos1, pos2)
return pos1, pos2 return pos1, pos2
end end
-- Rounds a position to the nearest integer
function areas:roundPos(pos)
pos.x = math.floor(pos.x+0.5)
pos.y = math.floor(pos.y+0.5)
pos.z = math.floor(pos.z+0.5)
return pos
end
-- Marks area position 1 -- Marks area position 1
areas.markPos1 = function(name) areas.markPos1 = function(name)
local pos = areas.pos1[name] local pos = areas.pos1[name]

View File

@ -11,13 +11,15 @@ end
areas.filename = areas.filename =
minetest.setting_get("areas.filename") or worldpath.."/areas.dat" minetest.setting_get("areas.filename") or worldpath.."/areas.dat"
-- Allow players with a privilege create their own areas within the max_size and number -- Allow players with a privilege create their own areas
-- within the max_size and number
areas.self_protection = areas.self_protection =
setting_getbool_default("areas.self_protection", false) setting_getbool_default("areas.self_protection", false)
areas.self_protection_privilege = areas.self_protection_privilege =
minetest.setting_get("areas.self_protection_privilege") or "interact" minetest.setting_get("areas.self_protection_privilege") or "interact"
areas.self_protection_max_size = areas.self_protection_max_size =
minetest.setting_get_pos("areas.self_protection_max_size") or {x=50, y=100, z=50} minetest.setting_get_pos("areas.self_protection_max_size") or
{x=50, y=100, z=50}
areas.self_protection_max_areas = areas.self_protection_max_areas =
tonumber(minetest.setting_get("areas.self_protection_max_areas")) or 3 tonumber(minetest.setting_get("areas.self_protection_max_areas")) or 3