mirror of
https://github.com/minetest-mods/areas.git
synced 2024-08-20 18:24:05 +02:00
Shorten lines
This commit is contained in:
parent
3d866330bf
commit
7b0ff512f7
147
chatcommands.lua
147
chatcommands.lua
@ -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,10 +40,11 @@ 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
|
||||||
@ -60,16 +63,11 @@ minetest.register_chatcommand("set_owner", {
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not areas:player_exists(ownername) then
|
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
|
return
|
||||||
end
|
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..
|
minetest.log("action", "/set_owner invoked, Owner="..ownername..
|
||||||
" AreaName="..areaname..
|
" AreaName="..areaname..
|
||||||
" StartPos="..minetest.pos_to_string(pos1)..
|
" StartPos="..minetest.pos_to_string(pos1)..
|
||||||
@ -78,21 +76,22 @@ minetest.register_chatcommand("set_owner", {
|
|||||||
areas:add(ownername, areaname, pos1, pos2, nil)
|
areas:add(ownername, areaname, pos1, pos2, nil)
|
||||||
areas:save()
|
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")
|
minetest.chat_send_player(name, "Area protected")
|
||||||
else
|
|
||||||
minetest.chat_send_player(name, 'Invalid usage, see /help set_owner')
|
|
||||||
end
|
|
||||||
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")
|
||||||
@ -110,7 +109,8 @@ minetest.register_chatcommand("add_owner", {
|
|||||||
end
|
end
|
||||||
|
|
||||||
if not areas:player_exists(ownername) then
|
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
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -119,22 +119,22 @@ minetest.register_chatcommand("add_owner", {
|
|||||||
" StartPos = "..pos1.x..","..pos1.y..","..pos1.z..
|
" StartPos = "..pos1.x..","..pos1.y..","..pos1.z..
|
||||||
" EndPos = " ..pos2.x..","..pos2.y..","..pos2.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)
|
pid = tonumber(pid)
|
||||||
if (not areas:isAreaOwner(pid, name)) or
|
if (not areas:isAreaOwner(pid, name)) or
|
||||||
(not areas:isSubarea(pos1, pos2, pid)) then
|
(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
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
areas:add(ownername, areaname, pos1, pos2, pid)
|
areas:add(ownername, areaname, pos1, pos2, pid)
|
||||||
areas:save()
|
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,
|
||||||
minetest.chat_send_player(name, "You granted "..ownername.." a concession successfully!")
|
"You have been gtanted control over an area."
|
||||||
else
|
.." Type /list_areas to show your areas.")
|
||||||
minetest.chat_send_player(name, 'Invalid usage, see /help add_owner')
|
minetest.chat_send_player(name, "Area protected.")
|
||||||
end
|
|
||||||
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,7 +196,11 @@ 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
|
||||||
|
minetest.chat_send_player(name,
|
||||||
|
"A regular expression is required.")
|
||||||
|
return
|
||||||
|
end
|
||||||
local found = false
|
local found = false
|
||||||
for _, area in pairs(areas.areas) do
|
for _, area in pairs(areas.areas) do
|
||||||
if areas:isAreaOwner(area.id, name) and
|
if areas:isAreaOwner(area.id, name) and
|
||||||
@ -198,26 +212,26 @@ minetest.register_chatcommand("find_areas", {
|
|||||||
if not found then
|
if not found then
|
||||||
minetest.chat_send_player(name, "No matches found")
|
minetest.chat_send_player(name, "No matches found")
|
||||||
end
|
end
|
||||||
else
|
|
||||||
minetest.chat_send_player(name, "Regular expression required")
|
|
||||||
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})
|
||||||
|
|
||||||
|
43
internal.lua
43
internal.lua
@ -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
|
||||||
|
return false
|
||||||
|
end
|
||||||
p1, p2 = area.pos1, area.pos2
|
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
|
if (pos1.x >= p1.x and pos1.x <= p2.x) and
|
||||||
(pos1.y >= p1.y and pos1.y <= p2.y) and (pos2.y >= p1.y and pos2.y <= p2.y) and
|
(pos2.x >= p1.x and pos2.x <= p2.x) and
|
||||||
(pos1.z >= p1.z and pos1.z <= p2.z) and (pos2.z >= p1.z and pos2.z <= p2.z) then
|
(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
|
return true
|
||||||
end
|
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.." "..
|
||||||
|
10
legacy.lua
10
legacy.lua
@ -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
112
pos.lua
@ -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]
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user