forked from minetest-mods/areas
Shorten lines
This commit is contained in:
parent
3d866330bf
commit
7b0ff512f7
285
chatcommands.lua
285
chatcommands.lua
|
@ -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,103 +40,101 @@ 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(.+)$')
|
||||
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')
|
||||
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", "/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})
|
||||
|
||||
|
||||
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")
|
||||
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')
|
||||
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)
|
||||
|
||||
-- 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})
|
||||
|
||||
|
||||
|
@ -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,38 +196,42 @@ minetest.register_chatcommand("find_areas", {
|
|||
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
|
||||
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
|
||||
areas:toString(area):find(param) then
|
||||
minetest.chat_send_player(name, areas:toString(area))
|
||||
found = true
|
||||
end
|
||||
if not found then
|
||||
minetest.chat_send_player(name, "No matches found")
|
||||
end
|
||||
else
|
||||
minetest.chat_send_player(name, "Regular expression required")
|
||||
end
|
||||
if not found then
|
||||
minetest.chat_send_player(name, "No matches found")
|
||||
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})
|
||||
|
||||
|
|
47
internal.lua
47
internal.lua
|
@ -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,15 +59,18 @@ 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
|
||||
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
|
||||
return true
|
||||
end
|
||||
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
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- 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.
|
||||
-- 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.." "..
|
||||
|
|
10
legacy.lua
10
legacy.lua
|
@ -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
112
pos.lua
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user