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)
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
end
@ -38,10 +40,11 @@ end})
minetest.register_chatcommand("set_owner", {
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},
func = function(name, param)
if param and param ~= "" then
local found, _, ownername, areaname = param:find('^([^%s]+)%s(.+)$')
if not found then
@ -60,16 +63,11 @@ minetest.register_chatcommand("set_owner", {
end
if not areas:player_exists(ownername) then
minetest.chat_send_player(name, 'The player "'..ownername..'" does not exist')
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)..
@ -78,21 +76,22 @@ minetest.register_chatcommand("set_owner", {
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(ownername,
"You have been granted control over an area."
.." Type /list_areas to show your areas.")
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 = "<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 = {},
func = function(name, param)
if param and param ~= "" then
local found, _, pid, ownername, areaname = param:find('^(%d+)%s([^%s]+)%s(.+)$')
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")
@ -110,7 +109,8 @@ minetest.register_chatcommand("add_owner", {
end
if not areas:player_exists(ownername) then
minetest.chat_send_player(name, 'The player "'..ownername..'" does not exist')
minetest.chat_send_player(name, 'The player "'
..ownername..'" does not exist')
return
end
@ -119,22 +119,22 @@ minetest.register_chatcommand("add_owner", {
" 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
-- 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")
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
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})
@ -146,19 +146,20 @@ minetest.register_chatcommand("rename_area", {
local found, _, id, newName = param:find("^(%d+)%s(.+)$")
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
end
index = areas:getIndexById(tonumber(id))
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
end
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
end
@ -169,14 +170,23 @@ end})
minetest.register_chatcommand("list_owners", {
params = "",
description = "list the players that can edit the area you are in",
description = "List the owners of your position",
privs = {},
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
minetest.chat_send_player(name, "Owners: "..table.concat(owners, ", "))
minetest.chat_send_player(name,
"Owners: "..table.concat(owners, ", "))
else
minetest.chat_send_player(name, "Your position is unowned")
minetest.chat_send_player(name,
"Your position is unowned.")
end
end})
@ -186,7 +196,11 @@ minetest.register_chatcommand("find_areas", {
description = "Find areas using a Lua regular expression",
privs = {},
func = function(name, param)
if param and param ~= "" then
if param == "" then
minetest.chat_send_player(name,
"A regular expression is required.")
return
end
local found = false
for _, area in pairs(areas.areas) do
if areas:isAreaOwner(area.id, name) and
@ -198,26 +212,26 @@ minetest.register_chatcommand("find_areas", {
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",
description = "List your areas, or all areas if you are an admin.",
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.")
minetest.chat_send_player(name,
"Showing all areas.")
else
minetest.chat_send_player(name, "Showing your owner entries (You can only modify these).")
minetest.chat_send_player(name,
"Showing your areas.")
end
for _, area in pairs(areas.areas) do
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})
@ -230,8 +244,9 @@ minetest.register_chatcommand("recursive_remove_areas", {
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')
minetest.chat_send_player(name,
"Invalid usage, see"
.." /help recursive_remove_areas")
return
end
@ -240,10 +255,13 @@ minetest.register_chatcommand("recursive_remove_areas", {
areas:sort()
areas:save()
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
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})
@ -254,8 +272,8 @@ minetest.register_chatcommand("remove_area", {
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')
minetest.chat_send_player(name,
"Invalid usage, see /help remove_area")
return
end
@ -264,7 +282,9 @@ minetest.register_chatcommand("remove_area", {
areas:sort()
areas:save()
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
end
minetest.chat_send_player(name, 'Removed area '..id)
@ -272,31 +292,38 @@ end})
minetest.register_chatcommand("change_owner", {
params = "<id> <newplayer>",
description = "change the owner of an area using its id",
params = "<id> <NewOwner>",
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]+)$')
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')
minetest.chat_send_player(name,
"Invalid usage,"
.." see /help change_area_owner")
return
end
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
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")
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 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})

View File

@ -45,7 +45,8 @@ function areas:remove(id, recurse)
local parent = self:getAreaById(id).parent
local children = self:getChildren(id)
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
end
@ -58,16 +59,19 @@ end
-- Checks if a area between two points is entirely contained by another area
function areas:isSubarea(pos1, pos2, id)
local area = areas:getAreaById(id)
if area then
if not area then
return false
end
p1, p2 = area.pos1, area.pos2
if (pos1.x >= p1.x and pos1.x <= p2.x) and (pos2.x >= p1.x and pos2.x <= p2.x) and
(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
if (pos1.x >= p1.x and pos1.x <= p2.x) and
(pos2.x >= p1.x and pos2.x <= p2.x) and
(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
-- Returns a table (list) of children of an area given it's identifier
function areas:getChildren(id)
@ -83,17 +87,20 @@ end
-- Checks if the user has sufficient privileges.
-- If the player is not a administrator it also checks
-- 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)
--[[
if minetest.check_player_privs(name, {areas=true}) then
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
(not minetest.check_player_privs(name, {[areas.self_protection_privilege]=true})) then
return false, "Self protection is disabled or you do not have the necessary privilege."
(not minetest.check_player_privs(name,
{[areas.self_protection_privilege]=true})) then
return false, "Self protection is disabled or you do not have"
.." the necessary privilege."
end
if (pos2.x - pos1.x) > self.self_protection_max_size.x or
@ -111,7 +118,9 @@ function areas:canPlayerAddArea(pos1, pos2, name)
end
end
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
@ -122,7 +131,8 @@ function areas:canPlayerAddArea(pos1, pos2, name)
(area.pos1.z <= pos2.z and area.pos2.z >= pos1.z) then
--Found an area intersecting with the suplied area
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
@ -130,7 +140,8 @@ function areas:canPlayerAddArea(pos1, pos2, name)
return true, ""
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)
local message = area.name..
" ["..area.id.."]: "..area.owner.." "..

View File

@ -3,12 +3,11 @@
minetest.register_chatcommand("legacy_load_areas", {
params = "",
description = "Loads, converts, and saves the areas from a legacy save file.",
privs = {areas=true, server=true},
description = "Loads, converts, and saves the areas from"
.." a legacy node_ownership save file.",
privs = {areas=true, server=true, privs=true},
func = function(name, param)
minetest.chat_send_player(name, "Converting areas...")
local startTime = os.clock()
err = areas:legacy_load()
if err then
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.")
areas:save()
minetest.chat_send_player(name, "Converted areas saved.")
minetest.chat_send_player(name, "Finished in "..tostring(os.clock() - startTime).."s.")
minetest.chat_send_player(name, "Converted areas saved. Done.")
end})
-- 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'
-- permission to use those commands and you don't have /area_pos{1,2} [x y z|x,y,z]
-- Since this is mostly copied from WorldEdit it is licensed under the AGPL.
-- permission to use those commands and you don't have
-- /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.marker2 = {}
@ -16,27 +17,32 @@ minetest.register_chatcommand("select_area", {
func = function(name, param)
local id = tonumber(param)
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
for k, area in pairs(areas.areas) do
if area.id == id then
areas:setPos1(name, area.pos1)
areas:setPos2(name, area.pos2)
minetest.chat_send_player(name, "Area "..tostring(id).." selected.")
minetest.chat_send_player(name,
"Area "..id.." selected.")
return
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})
minetest.register_chatcommand("area_pos1", {
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 = {},
func = function(name, param)
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
pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)}
elseif param == "" then
@ -44,25 +50,31 @@ minetest.register_chatcommand("area_pos1", {
if player then
pos = player:getpos()
else
minetest.chat_send_player(name, "Unable to get position")
minetest.chat_send_player(name,
"Unable to get position")
return
end
else
minetest.chat_send_player(name, "Invalid usage, see /help no_pos1")
minetest.chat_send_player(name,
"Invalid usage, see /help area_pos1")
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)
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,
})
minetest.register_chatcommand("area_pos2", {
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 = {},
func = function(name, param)
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
pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)}
elseif param == "" then
@ -70,46 +82,59 @@ minetest.register_chatcommand("area_pos2", {
if player then
pos = player:getpos()
else
minetest.chat_send_player(name, "Unable to get position")
minetest.chat_send_player(name,
"Unable to get position")
return
end
else
minetest.chat_send_player(name, "Invalid usage, see /help no_pos2")
minetest.chat_send_player(name,
"Invalid usage, see /help area_pos2")
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)
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,
})
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",
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")
minetest.chat_send_player(name,
"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")
minetest.chat_send_player(name,
"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")
minetest.chat_send_player(name,
"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]))
minetest.chat_send_player(name, "Position 1: "
..minetest.pos_to_string(areas.pos1[name]))
else
minetest.chat_send_player(name, "Position 1 not set")
minetest.chat_send_player(name,
"Position 1 not set")
end
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
minetest.chat_send_player(name, "Position 2 not set")
minetest.chat_send_player(name,
"Position 2 not set")
end
else
minetest.chat_send_player(name, "Unknown subcommand: " .. param)
minetest.chat_send_player(name,
"Unknown subcommand: "..param)
end
end,
})
@ -135,22 +160,29 @@ end
minetest.register_on_punchnode(function(pos, node, puncher)
local name = puncher:get_player_name()
if name ~= "" and areas.set_pos[name] ~= nil then --currently setting position
if areas.set_pos[name] == "pos1" then --setting position 1
-- Currently setting position
if name ~= "" and areas.set_pos[name] then
if areas.set_pos[name] == "pos1" then
areas.pos1[name] = pos
areas.markPos1(name)
areas.set_pos[name] = "pos2" --set position 2 on the next invocation
minetest.chat_send_player(name, "Position 1 set to " .. minetest.pos_to_string(pos))
elseif areas.set_pos[name] == "pos1only" then --setting position 1 only
areas.set_pos[name] = "pos2"
minetest.chat_send_player(name,
"Position 1 set to "
..minetest.pos_to_string(pos))
elseif areas.set_pos[name] == "pos1only" then
areas.pos1[name] = pos
areas.markPos1(name)
areas.set_pos[name] = nil --finished setting positions
minetest.chat_send_player(name, "Position 1 set to " .. minetest.pos_to_string(pos))
elseif areas.set_pos[name] == "pos2" then --setting position 2
areas.set_pos[name] = nil
minetest.chat_send_player(name,
"Position 1 set to "
..minetest.pos_to_string(pos))
elseif areas.set_pos[name] == "pos2" then
areas.pos2[name] = pos
areas.markPos2(name)
areas.set_pos[name] = nil --finished setting positions
minetest.chat_send_player(name, "Position 2 set to " .. minetest.pos_to_string(pos))
areas.set_pos[name] = nil
minetest.chat_send_player(name,
"Position 2 set to "
..minetest.pos_to_string(pos))
end
end
end)
@ -171,14 +203,6 @@ function areas:sortPos(pos1, pos2)
return pos1, pos2
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
areas.markPos1 = function(name)
local pos = areas.pos1[name]

View File

@ -11,13 +11,15 @@ end
areas.filename =
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 =
setting_getbool_default("areas.self_protection", false)
areas.self_protection_privilege =
minetest.setting_get("areas.self_protection_privilege") or "interact"
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 =
tonumber(minetest.setting_get("areas.self_protection_max_areas")) or 3