From 7cb8787bebdad6b1077f7046eddeacc9da0d2136 Mon Sep 17 00:00:00 2001 From: Dorian Wouters Date: Sun, 4 Sep 2016 03:05:52 +0200 Subject: [PATCH 01/32] Use get_auth_handler().get_auth() instead of auth_table minetest.auth_table is an implementation detail of the default auth handler. No guarantee is made that it even exists and using this table directly is incompatible with custom auth handlers. Instead, use the proper auth handler API. --- internal.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal.lua b/internal.lua index 05a31cd..bf7e92c 100644 --- a/internal.lua +++ b/internal.lua @@ -1,6 +1,6 @@ function areas:player_exists(name) - return minetest.auth_table[name] ~= nil + return minetest.get_auth_handler().get_auth(name) ~= nil end -- Save the areas table to a file From 23f81f6278af2269bb11f41ec424936b05c2655f Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sun, 4 Dec 2016 04:12:14 +0000 Subject: [PATCH 02/32] Add mod.conf --- mod.conf | 1 + 1 file changed, 1 insertion(+) create mode 100644 mod.conf diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..0ca8ec1 --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name = areas From 6080ff065ea89e899f356ba723ea2467b6d32ccb Mon Sep 17 00:00:00 2001 From: "Tai @ Flex" Date: Sat, 26 Nov 2016 07:20:23 +0000 Subject: [PATCH 03/32] Add API for adding areas to HUD --- api.lua | 16 ++++++++++++++++ api.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ hud.lua | 10 ++++++++++ 3 files changed, 71 insertions(+) create mode 100644 api.md diff --git a/api.lua b/api.lua index e8b9c7a..730e96d 100644 --- a/api.lua +++ b/api.lua @@ -1,7 +1,23 @@ +local hudHandlers = {} + +--- Adds a function as a HUD handler, it will be able to add items to the Areas HUD element. +function areas:registerHudHandler(handler) + table.insert(hudHandlers, handler) +end + + +function areas:getExternalHudEntries(pos) + local areas = {} + for _, func in pairs(hudHandlers) do + func(pos, areas) + end + return areas +end --- Returns a list of areas that include the provided position. function areas:getAreasAtPos(pos) local res = {} + if self.store then local a = self.store:get_areas_for_pos(pos, false, true) for store_id, store_area in pairs(a) do diff --git a/api.md b/api.md new file mode 100644 index 0000000..c74b4c7 --- /dev/null +++ b/api.md @@ -0,0 +1,45 @@ +Areas mod API +=== + +API list +--- + + * `areas.registerHudHandler(handler)` - Registers a handler to add items to the Areas HUD. See [HUD](#hud). + + +HUD +--- + +If you are making a protection mod or a similar mod that adds invisible regions +to the world, and you would like then to show up in the areas HUD element, you +can register a callback to show your areas. + +HUD handler specification: + + * `handler(pos, list)` + * `pos` - The position to check. + * `list` - The list of area HUD elements, this should be modified in-place. + +The area list item is a table containing a list of tables with the following fields: + + * `id` - An identifier for the area. This should be a unique string in the format `mod:id`. + * `name` - The name of the area. + * `owner` - The player name of the region owner, if any. + +All of the fields are optional but at least one of them must be set. + +### Example + + local function areas_hud_handler(pos, areas) + local val = find_my_protection(pos) + + if val then + table.insert(areas, { + id = "mod:"..val.id, + name = val.name, + owner = val.owner, + }) + end + end + + areas:registerHudHandler(areas_hud_handler) diff --git a/hud.lua b/hud.lua index 4908b92..0b7931f 100644 --- a/hud.lua +++ b/hud.lua @@ -7,11 +7,21 @@ minetest.register_globalstep(function(dtime) local name = player:get_player_name() local pos = vector.round(player:getpos()) local areaStrings = {} + for id, area in pairs(areas:getAreasAtPos(pos)) do table.insert(areaStrings, ("%s [%u] (%s%s)") :format(area.name, id, area.owner, area.open and ":open" or "")) end + + for i, area in pairs(areas:getExternalHudEntries(pos)) do + local str = "" + if area.name then str = area.name .. " " end + if area.id then str = str.."["..area.id.."] " end + if area.owner then str = str.."("..area.owner..")" end + table.insert(areaStrings, str) + end + local areaString = "Areas:" if #areaStrings > 0 then areaString = areaString.."\n".. From d3d43d951154fb2b9e30186f7a1e52bd05ae6d80 Mon Sep 17 00:00:00 2001 From: Jordan Irwin Date: Sat, 6 May 2017 10:41:45 -0700 Subject: [PATCH 04/32] Reference 'settings.lua' instead of 'config.lua' (#21) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bd6a54d..f7c07c6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Configuration If you wish to specify configuration options, such as whether players are allowed to protect their own areas with the `protect` command (disabled by -default), you should check config.lua and set the appropriate settings in your +default), you should check settings.lua and set the appropriate settings in your server's configuration file (probably `minetest.conf`). From 289d0e623c1d383f26cbc57c94ce9a8a184bf525 Mon Sep 17 00:00:00 2001 From: AntumDeluge Date: Sat, 13 May 2017 01:59:30 -0700 Subject: [PATCH 05/32] Update usage of settings API --- init.lua | 2 +- settings.lua | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/init.lua b/init.lua index 2c10cdd..d1b7ebe 100644 --- a/init.lua +++ b/init.lua @@ -32,7 +32,7 @@ if not minetest.registered_privileges[areas.config.self_protection_privilege] th }) end -if minetest.setting_getbool("log_mod") then +if minetest.settings:get_bool("log_mod") then local diffTime = os.clock() - areas.startTime minetest.log("action", "areas loaded in "..diffTime.."s.") end diff --git a/settings.lua b/settings.lua index 140a655..ffb5355 100644 --- a/settings.lua +++ b/settings.lua @@ -6,13 +6,13 @@ local function setting(tp, name, default) local full_name = "areas."..name local value if tp == "boolean" then - value = minetest.setting_getbool(full_name) + value = minetest.settings:get_bool(full_name) elseif tp == "string" then - value = minetest.setting_get(full_name) + value = minetest.settings:get(full_name) elseif tp == "position" then value = minetest.setting_get_pos(full_name) elseif tp == "number" then - value = tonumber(minetest.setting_get(full_name)) + value = tonumber(minetest.settings:get(full_name)) else error("Invalid setting type!") end From 2637876555f12e75eff78db91d0ad9a87024f522 Mon Sep 17 00:00:00 2001 From: sofar Date: Mon, 1 Apr 2019 20:24:59 -0700 Subject: [PATCH 06/32] Fix pos big (#1) * fix pos being to big * improve * make the change instead in hud.lua --- hud.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hud.lua b/hud.lua index 0b7931f..cd70781 100644 --- a/hud.lua +++ b/hud.lua @@ -6,6 +6,9 @@ minetest.register_globalstep(function(dtime) for _, player in pairs(minetest.get_connected_players()) do local name = player:get_player_name() local pos = vector.round(player:getpos()) + pos = vector.apply(pos, function(p) + return math.max(math.min(p, 2147483), -2147483) + end) local areaStrings = {} for id, area in pairs(areas:getAreasAtPos(pos)) do From 09c030352f073b18dbcb3b5538470c470345f93a Mon Sep 17 00:00:00 2001 From: red-001 Date: Sun, 4 Feb 2018 16:30:41 +0000 Subject: [PATCH 07/32] Use the new `minetest.safe_file_write` API if possible when saving database. --- internal.lua | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/internal.lua b/internal.lua index bf7e92c..e106398 100644 --- a/internal.lua +++ b/internal.lua @@ -3,6 +3,18 @@ function areas:player_exists(name) return minetest.get_auth_handler().get_auth(name) ~= nil end +local safe_file_write = minetest.safe_file_write +if safe_file_write == nil then + function safe_file_write(path, content) + local file, err = io.open(path, "w") + if err then + return err + end + file:write(content) + file:close() + end +end + -- Save the areas table to a file function areas:save() local datastr = minetest.serialize(self.areas) @@ -10,12 +22,7 @@ function areas:save() minetest.log("error", "[areas] Failed to serialize area data!") return end - local file, err = io.open(self.config.filename, "w") - if err then - return err - end - file:write(datastr) - file:close() + return safe_file_write(self.config.filename, datastr) end -- Load the areas table from the save file From 1bbb997c7a170b701159bc97bc6c6f16d896ec54 Mon Sep 17 00:00:00 2001 From: sofar Date: Mon, 1 Apr 2019 20:28:50 -0700 Subject: [PATCH 08/32] Add callbacks for area operations --- api.lua | 19 ++++++++++++++++++- api.md | 5 ++++- internal.lua | 15 ++++++++++++++- settings.lua | 1 - 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/api.lua b/api.lua index 730e96d..8103b84 100644 --- a/api.lua +++ b/api.lua @@ -1,5 +1,23 @@ local hudHandlers = {} + +areas.registered_on_adds = {} +areas.registered_on_removes = {} +areas.registered_on_moves = {} + +function areas:registerOnAdd(func) + table.insert(areas.registered_on_adds, func) +end + +function areas:registerOnRemove(func) + table.insert(areas.registered_on_removes, func) +end + +function areas:registerOnMove(func) + table.insert(areas.registered_on_moves, func) +end + + --- Adds a function as a HUD handler, it will be able to add items to the Areas HUD element. function areas:registerHudHandler(handler) table.insert(hudHandlers, handler) @@ -141,4 +159,3 @@ function areas:canInteractInArea(pos1, pos2, name, allow_open) -- intersecting areas and they are all owned by the player. return true end - diff --git a/api.md b/api.md index c74b4c7..e243a8a 100644 --- a/api.md +++ b/api.md @@ -4,7 +4,10 @@ Areas mod API API list --- - * `areas.registerHudHandler(handler)` - Registers a handler to add items to the Areas HUD. See [HUD](#hud). + * `areas:registerHudHandler(handler)` - Registers a handler to add items to the Areas HUD. See [HUD](#hud). + * `areas:registerOnAdd(func(id, area))` + * `areas:registerOnRemove(func(id))` + * `areas:registerOnMove(func(id, area, pos1, pos2))` HUD diff --git a/internal.lua b/internal.lua index e106398..27f85ed 100644 --- a/internal.lua +++ b/internal.lua @@ -93,6 +93,11 @@ function areas:add(owner, name, pos1, pos2, parent) owner = owner, parent = parent } + + for i=1, #areas.registered_on_adds do + areas.registered_on_adds[i](id, self.areas[id]) + end + -- Add to AreaStore if self.store then local sid = self.store:insert_area(pos1, pos2, tostring(id)) @@ -125,6 +130,10 @@ function areas:remove(id, recurse) end end + for i=1, #areas.registered_on_removes do + areas.registered_on_removes[i](id) + end + -- Remove main entry self.areas[id] = nil @@ -140,6 +149,11 @@ function areas:move(id, area, pos1, pos2) area.pos1 = pos1 area.pos2 = pos2 + + for i=1, #areas.registered_on_moves do + areas.registered_on_moves[i](id, area, pos1, pos2) + end + if self.store then self.store:remove_area(areas.store_ids[id]) local sid = self.store:insert_area(pos1, pos2, tostring(id)) @@ -289,4 +303,3 @@ function areas:isAreaOwner(id, name) end return false end - diff --git a/settings.lua b/settings.lua index ffb5355..22cba53 100644 --- a/settings.lua +++ b/settings.lua @@ -40,4 +40,3 @@ setting("number", "self_protection_max_areas_high", 32) -- legacy_table (owner_defs) compatibility. Untested and has known issues. setting("boolean", "legacy_table", false) - From 7b51f84404fd5cd2c33032b05e623268ee6e43c8 Mon Sep 17 00:00:00 2001 From: Tai Kedzierski Date: Mon, 1 Apr 2019 21:21:31 -0700 Subject: [PATCH 09/32] Limit recalculations. Setting based - limit area recalculation and allow tuning of the interval. --- hud.lua | 9 +++++++++ settings.lua | 3 +++ 2 files changed, 12 insertions(+) diff --git a/hud.lua b/hud.lua index cd70781..b29152d 100644 --- a/hud.lua +++ b/hud.lua @@ -1,8 +1,17 @@ -- This is inspired by the landrush mod by Bremaweb areas.hud = {} +areas.hud.refresh = 0 minetest.register_globalstep(function(dtime) + + areas.hud.refresh = areas.hud.refresh + dtime + if areas.hud.refresh > areas.config["tick"] then + areas.hud.refresh = 0 + else + return + end + for _, player in pairs(minetest.get_connected_players()) do local name = player:get_player_name() local pos = vector.round(player:getpos()) diff --git a/settings.lua b/settings.lua index 22cba53..feaa687 100644 --- a/settings.lua +++ b/settings.lua @@ -40,3 +40,6 @@ setting("number", "self_protection_max_areas_high", 32) -- legacy_table (owner_defs) compatibility. Untested and has known issues. setting("boolean", "legacy_table", false) + +-- configure the refresh delay for the name displays in the HUD +setting("number", "tick", 0.5) From a303abe51b19151752842029efbb926e4a7711c5 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 1 Apr 2019 21:22:31 -0700 Subject: [PATCH 10/32] Add template .luacheckrc --- .luacheckrc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .luacheckrc diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..15eed66 --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,15 @@ +unused_args = false +allow_defined_top = true + +read_globals = { + "DIR_DELIM", + "minetest", "core", + "dump", + "vector", "nodeupdate", + "VoxelManip", "VoxelArea", + "PseudoRandom", "ItemStack", + "intllib", + "default", + table = { fields = { "copy", "getn" } } +} + From 630bdefd98db9f39b20fc38b6dbcc89e9bafd002 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Mon, 1 Apr 2019 21:28:03 -0700 Subject: [PATCH 11/32] Don't allow areas to cross outside mapgen world limits. Limit any area to within [-31000,31000]. --- pos.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pos.lua b/pos.lua index 8d3e6fe..59eae94 100644 --- a/pos.lua +++ b/pos.lua @@ -129,13 +129,17 @@ function areas:getPos(playerName) return areas:sortPos(pos1, pos2) end +local function posLimit(pos) + return math.max(math.min(p, 31000), -31000) +end + function areas:setPos1(playerName, pos) - areas.pos1[playerName] = pos + areas.pos1[playerName] = posLimit(pos) areas.markPos1(playerName) end function areas:setPos2(playerName, pos) - areas.pos2[playerName] = pos + areas.pos2[playerName] = posLimit(pos) areas.markPos2(playerName) end From 9508a004d0da9edbb2267e90d305dcb17687230d Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 2 Apr 2019 17:47:51 -0400 Subject: [PATCH 12/32] fix posLimit(pos) to process and return a position table --- pos.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pos.lua b/pos.lua index 59eae94..e97e4fc 100644 --- a/pos.lua +++ b/pos.lua @@ -130,7 +130,11 @@ function areas:getPos(playerName) end local function posLimit(pos) - return math.max(math.min(p, 31000), -31000) + return { + x = math.max(math.min(pos.x, 31000), -31000) + y = math.max(math.min(pos.y, 31000), -31000) + z = math.max(math.min(pos.z, 31000), -31000) + } end function areas:setPos1(playerName, pos) From f70600db30e94687470042a44e7f1127853ac3e3 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Tue, 2 Apr 2019 18:16:33 -0400 Subject: [PATCH 13/32] oops, commas would be nice. --- pos.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pos.lua b/pos.lua index e97e4fc..f969aaa 100644 --- a/pos.lua +++ b/pos.lua @@ -131,8 +131,8 @@ end local function posLimit(pos) return { - x = math.max(math.min(pos.x, 31000), -31000) - y = math.max(math.min(pos.y, 31000), -31000) + x = math.max(math.min(pos.x, 31000), -31000), + y = math.max(math.min(pos.y, 31000), -31000), z = math.max(math.min(pos.z, 31000), -31000) } end From 024424ee8b4a1b535f32528863a2f347c0a357a0 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 3 Apr 2019 10:17:47 -0700 Subject: [PATCH 14/32] Also limit chatcommand area_pos[12] positions. --- pos.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pos.lua b/pos.lua index f969aaa..72bda48 100644 --- a/pos.lua +++ b/pos.lua @@ -50,7 +50,7 @@ minetest.register_chatcommand("area_pos1", { else return false, "Invalid usage, see /help area_pos1." end - pos = vector.round(pos) + pos = posLimit(vector.round(pos)) areas:setPos1(name, pos) return true, "Area position 1 set to " ..minetest.pos_to_string(pos) @@ -77,7 +77,7 @@ minetest.register_chatcommand("area_pos2", { else return false, "Invalid usage, see /help area_pos2." end - pos = vector.round(pos) + pos = posLimit(vector.round(pos)) areas:setPos2(name, pos) return true, "Area position 2 set to " ..minetest.pos_to_string(pos) From 6e2b9a0a51aaf1fbda83a8ec460dcff9378eb9c7 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 3 Apr 2019 10:24:02 -0700 Subject: [PATCH 15/32] Needs to be defined earlier. --- .luacheckrc | 6 +++++- chatcommands.lua | 6 +++--- legacy.lua | 3 ++- pos.lua | 16 ++++++++-------- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index 15eed66..c0ea991 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -3,13 +3,17 @@ allow_defined_top = true read_globals = { "DIR_DELIM", - "minetest", "core", + "core", "dump", "vector", "nodeupdate", "VoxelManip", "VoxelArea", "PseudoRandom", "ItemStack", + "AreaStore", "intllib", "default", table = { fields = { "copy", "getn" } } } +globals = { + "minetest" +} diff --git a/chatcommands.lua b/chatcommands.lua index 6079e93..ddff850 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -60,7 +60,7 @@ minetest.register_chatcommand("set_owner", { local id = areas:add(ownerName, areaName, pos1, pos2, nil) areas:save() - + minetest.chat_send_player(ownerName, "You have been granted control over area #".. id..". Type /list_areas to show your areas.") @@ -383,10 +383,10 @@ minetest.register_chatcommand("area_info", { table.insert(lines, ("%s spanning up to %dx%dx%d.") :format(str, size.x, size.y, size.z)) end - local function priv_limit_info(priv, max_count, max_size) + local function priv_limit_info(lpriv, lmax_count, lmax_size) size_info(("Players with the %q privilege".. " can protect up to %d areas"):format( - priv, max_count), max_size) + lpriv, lmax_count), lmax_size) end if self_prot then if privs.areas then diff --git a/legacy.lua b/legacy.lua index 83b3d27..876b88d 100644 --- a/legacy.lua +++ b/legacy.lua @@ -10,7 +10,7 @@ minetest.register_chatcommand("legacy_load_areas", { minetest.chat_send_player(name, "Converting areas...") local version = tonumber(param) if version == 0 then - err = areas:node_ownership_load() + local err = areas:node_ownership_load() if err then minetest.chat_send_player(name, "Error loading legacy file: "..err) return @@ -48,6 +48,7 @@ minetest.register_chatcommand("legacy_load_areas", { function areas:node_ownership_load() local filename = minetest.get_worldpath().."/owners.tbl" + local tables, err tables, err = loadfile(filename) if err then return err diff --git a/pos.lua b/pos.lua index 72bda48..976e31a 100644 --- a/pos.lua +++ b/pos.lua @@ -11,6 +11,14 @@ areas.set_pos = {} areas.pos1 = {} areas.pos2 = {} +local function posLimit(pos) + return { + x = math.max(math.min(pos.x, 31000), -31000), + y = math.max(math.min(pos.y, 31000), -31000), + z = math.max(math.min(pos.z, 31000), -31000) + } +end + minetest.register_chatcommand("select_area", { params = "", description = "Select a area by id.", @@ -129,14 +137,6 @@ function areas:getPos(playerName) return areas:sortPos(pos1, pos2) end -local function posLimit(pos) - return { - x = math.max(math.min(pos.x, 31000), -31000), - y = math.max(math.min(pos.y, 31000), -31000), - z = math.max(math.min(pos.z, 31000), -31000) - } -end - function areas:setPos1(playerName, pos) areas.pos1[playerName] = posLimit(pos) areas.markPos1(playerName) From cfd4bb2423899c3003b072907d2e57b55d35108f Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 3 Apr 2019 10:26:20 -0700 Subject: [PATCH 16/32] Last of the luacheck cleanups. --- pos.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pos.lua b/pos.lua index 976e31a..be0ef20 100644 --- a/pos.lua +++ b/pos.lua @@ -43,7 +43,7 @@ minetest.register_chatcommand("area_pos1", { .." location or the one specified", privs = {}, func = function(name, param) - local pos = nil + local pos local found, _, x, y, z = param:find( "^(-?%d+)[, ](-?%d+)[, ](-?%d+)$") if found then @@ -70,7 +70,7 @@ minetest.register_chatcommand("area_pos2", { description = "Set area protection region position 2 to your" .." location or the one specified", func = function(name, param) - local pos = nil + local pos local found, _, x, y, z = param:find( "^(-?%d+)[, ](-?%d+)[, ](-?%d+)$") if found then From 6218e5884d74646d074f84901abf379d96da5ec7 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Wed, 3 Apr 2019 11:10:59 -0700 Subject: [PATCH 17/32] Limit areas to -30992,30992 due to MABLOCK_SIZE=16 Internally, when allocating an AreaStore, the limits are required to be within the last full block, and so, you cannot create one "on" the edge, as it will trigger an exception. When limited to the last full mapblock, it all works fine. --- pos.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pos.lua b/pos.lua index be0ef20..36a6b78 100644 --- a/pos.lua +++ b/pos.lua @@ -11,11 +11,13 @@ areas.set_pos = {} areas.pos1 = {} areas.pos2 = {} +local LIMIT = 30992 -- this is due to MAPBLOCK_SIZE=16! + local function posLimit(pos) return { - x = math.max(math.min(pos.x, 31000), -31000), - y = math.max(math.min(pos.y, 31000), -31000), - z = math.max(math.min(pos.z, 31000), -31000) + x = math.max(math.min(pos.x, LIMIT), -LIMIT), + y = math.max(math.min(pos.y, LIMIT), -LIMIT), + z = math.max(math.min(pos.z, LIMIT), -LIMIT) } end From 5527dc894525cf7405da201d5c734f7f848d20d6 Mon Sep 17 00:00:00 2001 From: Panquesito7 <51391473+Panquesito7@users.noreply.github.com> Date: Wed, 10 Jul 2019 13:26:42 -0500 Subject: [PATCH 18/32] Replace deprecated functions with newer ones (#36) This commit replaces a few deprecated calls to getpos with get_pos --- hud.lua | 2 +- init.lua | 2 +- pos.lua | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/hud.lua b/hud.lua index b29152d..24f5414 100644 --- a/hud.lua +++ b/hud.lua @@ -14,7 +14,7 @@ minetest.register_globalstep(function(dtime) for _, player in pairs(minetest.get_connected_players()) do local name = player:get_player_name() - local pos = vector.round(player:getpos()) + local pos = vector.round(player:get_pos()) pos = vector.apply(pos, function(p) return math.max(math.min(p, 2147483), -2147483) end) diff --git a/init.lua b/init.lua index d1b7ebe..8179b28 100644 --- a/init.lua +++ b/init.lua @@ -32,7 +32,7 @@ if not minetest.registered_privileges[areas.config.self_protection_privilege] th }) end -if minetest.settings:get_bool("log_mod") then +if minetest.settings:get_bool("log_mods") then local diffTime = os.clock() - areas.startTime minetest.log("action", "areas loaded in "..diffTime.."s.") end diff --git a/pos.lua b/pos.lua index 36a6b78..323d55d 100644 --- a/pos.lua +++ b/pos.lua @@ -53,7 +53,7 @@ minetest.register_chatcommand("area_pos1", { elseif param == "" then local player = minetest.get_player_by_name(name) if player then - pos = player:getpos() + pos = player:get_pos() else return false, "Unable to get position." end @@ -80,7 +80,7 @@ minetest.register_chatcommand("area_pos2", { elseif param == "" then local player = minetest.get_player_by_name(name) if player then - pos = player:getpos() + pos = player:get_pos() else return false, "Unable to get position." end From 95c1165e28e46d9884dc4bc77e41047b70279f28 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Thu, 11 Jul 2019 20:02:32 +0200 Subject: [PATCH 19/32] Add and parse from settingtypes.txt. Update readme --- README.md | 48 ++++++++++++++++++++++++++++-------------------- settings.lua | 45 +++++++++++++++++++++++---------------------- settingtypes.txt | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 42 deletions(-) create mode 100644 settingtypes.txt diff --git a/README.md b/README.md index f7c07c6..5db5bad 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,29 @@ -Areas mod for Minetest 0.4.8+ -============================= +Areas mod for Minetest +====================== + +Dependencies +------------ + +Minetest 5.0.0+ is recommended, but 0.4.16+ should work as well. Configuration ------------- -If you wish to specify configuration options, such as whether players are -allowed to protect their own areas with the `protect` command (disabled by -default), you should check settings.lua and set the appropriate settings in your -server's configuration file (probably `minetest.conf`). +Open the tab `Settings -> All Settings -> Mods -> areas` to get a list of all +possible settings. + +For server owners: Check `settingtypes.txt` and modify your `minetest.conf` +according to the wanted setting changes. + Tutorial -------- -To protect an area you must first set the corner positions of the area. -In order to set the corner positions you can run: +1) Specify the corner positions of the area you would like to protect. +Use one of the following commands: + * `/area_pos set` and punch the two corner nodes to set them. * `/area_pos set1/set2` and punch only the first or second corner node to set them one at a time. @@ -23,25 +31,25 @@ In order to set the corner positions you can run: * `/area_pos1/2 X Y Z` to set one of the positions to the specified coordinates. -Once you have set the border positions you can protect the area by running one -of the following commands: +2) Protect the selected area by running one of the following commands: + * `/set_owner ` -- If you have the `areas` privilege. * `/protect ` -- If you have the `areas` privilege or the server administrator has enabled area self-protection. -The area name is used only for informational purposes (so that you know what -an area is for). It is not used for any other purpose. +The area name is used only for informational purposes and has no functional +importance. + For example: `/set_owner SomePlayer Mese city` -Now that you own an area you may want to add sub-owners to it. You can do this -with the `add_owner` command. Anyone with an area can use the `add_owner` -command on their areas. Before using the `add_owner` command you have to -select the corners of the sub-area as you did for `set_owner`. If your markers -are still around your original area and you want to grant access to your -entire area you will not have to re-set them. You can also use `select_area` to -place the markers at the corners of an existing area if you've reset your +3) You now own an area. You may now add sub-owners to it if you want to (see command `/add_owner`). Before using the `/add_owner` command you have to +select the corners of the sub-area as you did in step 1. + +If your markers are still around your original area and you want to grant +access to your entire area you will not have to re-set them. Use `/select_area` to place the markers at the corners of an existing area if you've reset your markers and want to grant access to a full area. -The `add_owner` command expects three arguments: + +The `/add_owner` command expects three arguments: 1. The ID number of the parent area (the area that you want to add a sub-area to). 2. The name of the player that will own the sub-area. diff --git a/settings.lua b/settings.lua index feaa687..22af52c 100644 --- a/settings.lua +++ b/settings.lua @@ -2,44 +2,45 @@ local world_path = minetest.get_worldpath() areas.config = {} -local function setting(tp, name, default) - local full_name = "areas."..name +local function setting(name, tp, default) + local full_name = "areas." .. name local value - if tp == "boolean" then + if tp == "bool" then value = minetest.settings:get_bool(full_name) + default = value == nil and minetest.is_yes(default) elseif tp == "string" then value = minetest.settings:get(full_name) - elseif tp == "position" then + elseif tp == "v3f" then value = minetest.setting_get_pos(full_name) - elseif tp == "number" then + default = value == nil and minetest.string_to_pos(default) + elseif tp == "float" or tp == "int" then value = tonumber(minetest.settings:get(full_name)) + local v, other = default:match("^(%S+) (.+)") + default = value == nil and tonumber(other and v or default) else - error("Invalid setting type!") + error("Cannot parse setting type " .. tp) end + if value == nil then value = default + assert(default ~= nil, "Cannot parse default for " .. full_name) end + --print("add", name, default, value) areas.config[name] = value end +local file = io.open(areas.modpath .. "/settingtypes.txt", "r") +for line in file:lines() do + local name, tp, value = line:match("^areas%.(%S+) %(.*%) (%S+) (.*)") + if value then + setting(name, tp, value) + end +end +file:close() + -------------- -- Settings -- -------------- -setting("string", "filename", world_path.."/areas.dat") +setting("filename", "string", world_path.."/areas.dat") --- Allow players with a privilege create their own areas --- within the maximum size and number. -setting("boolean", "self_protection", false) -setting("string", "self_protection_privilege", "interact") -setting("position", "self_protection_max_size", {x=64, y=128, z=64}) -setting("number", "self_protection_max_areas", 4) --- For players with the areas_high_limit privilege. -setting("position", "self_protection_max_size_high", {x=512, y=512, z=512}) -setting("number", "self_protection_max_areas_high", 32) - --- legacy_table (owner_defs) compatibility. Untested and has known issues. -setting("boolean", "legacy_table", false) - --- configure the refresh delay for the name displays in the HUD -setting("number", "tick", 0.5) diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..6316523 --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,38 @@ +# This file is parsed in "settings.lua". Check regex first. + +# Static paths do not work well with settings +#areas.filename (Configuration file path) string (world_path)/areas.dat + +# Allow players with a privilege create their own areas using /protect +# within the specified size and amount limits. +areas.self_protection (Self protection) bool false + +# Self protection: Privilege required to protect an area +areas.self_protection_privilege (Self protection: Required privs) string interact + +# Refresh delay for the name displays in the HUD in seconds +areas.tick (HUD update delay) float 0.5 0 100 + +# Enable the legacy owner_defs metatable mode. Untested and possibly unstable +areas.legacy_table (Legacy owner_defs metatable) bool false + +[Self protection (normal)] + +# Self protection (normal): Maximal size of the protectable area +# Only enter positive whole numbers for the coordinate values or you'll mess up stuff. +areas.self_protection_max_size (Maximal area size) v3f (64, 128, 64) + +# Self protection (normal): Maximal amount of protected areas per player +areas.self_protection_max_areas (Maximal area count) int 4 + +[Self protection (high)] + +# Self protection (normal): Maximal size of the protectable area +# This setting applies for plyaers with the privilege 'areas_high_limit' +areas.self_protection_max_size_high (Maximal area size) v3f (512, 512, 512) + +# Self protection (normal): Maximal amount of protected areas per player +# Only enter positive whole numbers for the coordinate values or you'll mess up stuff. +# This setting applies for plyaers with the privilege 'areas_high_limit' +areas.self_protection_max_areas_high (Maximal area count) float 32 + From aca830fd2298980758e09908087a9f5f74dff93f Mon Sep 17 00:00:00 2001 From: Alden Peeters Date: Sat, 21 Sep 2019 09:33:42 -0400 Subject: [PATCH 20/32] Add support for playerfactions mod (#37) Add faction indicator to HUD --- api.lua | 8 ++++++-- chatcommands.lua | 24 ++++++++++++++++++++++++ hud.lua | 8 ++++++-- init.lua | 2 ++ mod.conf | 1 + 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/api.lua b/api.lua index 8103b84..40a9841 100644 --- a/api.lua +++ b/api.lua @@ -94,9 +94,13 @@ function areas:canInteract(pos, name) for _, area in pairs(self:getAreasAtPos(pos)) do if area.owner == name or area.open then return true - else - owned = true + elseif areas.factions_available and area.faction_open then + local faction_name = factions.get_player_faction(area.owner) + if faction_name ~= nil and faction_name == factions.get_player_faction(name) then + return true + end end + owned = true end return not owned end diff --git a/chatcommands.lua b/chatcommands.lua index ddff850..faffb03 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -286,6 +286,30 @@ minetest.register_chatcommand("area_open", { }) +if areas.factions_available then + minetest.register_chatcommand("area_faction_open", { + params = "", + description = "Toggle an area open/closed for members in your faction.", + func = function(name, param) + local id = tonumber(param) + if not id then + return false, "Invalid usage, see /help area_faction_open." + end + + if not areas:isAreaOwner(id, name) then + return false, "Area "..id.." does not exist" + .." or is not owned by you." + end + local open = not areas.areas[id].faction_open + -- Save false as nil to avoid inflating the DB. + areas.areas[id].faction_open = open or nil + areas:save() + return true, ("Area %s for faction members."):format(open and "opened" or "closed") + end + }) +end + + minetest.register_chatcommand("move_area", { params = "", description = "Move (or resize) an area to the current positions.", diff --git a/hud.lua b/hud.lua index 24f5414..ffe764e 100644 --- a/hud.lua +++ b/hud.lua @@ -21,9 +21,13 @@ minetest.register_globalstep(function(dtime) local areaStrings = {} for id, area in pairs(areas:getAreasAtPos(pos)) do - table.insert(areaStrings, ("%s [%u] (%s%s)") + local faction_info = area.faction_open and areas.factions_available and + factions.get_player_faction(area.owner) + area.faction_open = faction_info + table.insert(areaStrings, ("%s [%u] (%s%s%s)") :format(area.name, id, area.owner, - area.open and ":open" or "")) + area.open and ":open" or "", + faction_info and ":"..faction_info or "")) end for i, area in pairs(areas:getExternalHudEntries(pos)) do diff --git a/init.lua b/init.lua index 8179b28..53d4eb6 100644 --- a/init.lua +++ b/init.lua @@ -4,6 +4,8 @@ areas = {} +areas.factions_available = minetest.global_exists("factions") + areas.adminPrivs = {areas=true} areas.startTime = os.clock() diff --git a/mod.conf b/mod.conf index 0ca8ec1..e694301 100644 --- a/mod.conf +++ b/mod.conf @@ -1 +1,2 @@ name = areas +optional_depends = playerfactions From feae9967dcedd4b49170ef6c91b28b25c9ca076f Mon Sep 17 00:00:00 2001 From: sys4 Date: Sat, 28 Dec 2019 02:43:12 +0100 Subject: [PATCH 21/32] Ajoute certaines modifications venant de MFF + ajustement HUD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Aires openfarming * Privilège megabuilder * HUD légèrement modifié pour laisser de la place à celui de factions --- api.lua | 27 +++++++++++++++++++++++++++ chatcommands.lua | 22 ++++++++++++++++++++++ hud.lua | 4 ++-- internal.lua | 48 ++++++++++++++++++++++++++---------------------- 4 files changed, 77 insertions(+), 24 deletions(-) diff --git a/api.lua b/api.lua index 40a9841..3df4eb2 100644 --- a/api.lua +++ b/api.lua @@ -1,5 +1,14 @@ local hudHandlers = {} +---plants to place in openfarming +local plants = { + ["farming:blueberries"]="air", ["farming:carrot"]="air", ["farming:coffee_beans"]="air", + ["farming:corn"]="air", ["farming:cucumber"]="air", ["farming:melon_slice"]="air", + ["farming:potato"]="air", ["farming:pumpkin_slice"]="air", ["farming:raspberries"]="air", + ["farming:rhubarb"]="air", ["farming:tomato"]="air", ["farming:seed_cotton"]="air", + ["farming:seed_wheat"]="air",["default:papyrus"]="air", ["farming:trellis"]="air", + ["farming:grapes"]="farming:trellis", ["farming:beanpole"]="air", ["farming:beans"]="farming:beanpole", +} areas.registered_on_adds = {} areas.registered_on_removes = {} @@ -94,6 +103,24 @@ function areas:canInteract(pos, name) for _, area in pairs(self:getAreasAtPos(pos)) do if area.owner == name or area.open then return true + elseif area.openfarming then + -- if area is openfarming + local node = minetest.get_node(pos).name + if not minetest.registered_nodes[node] then return false end + local player = minetest.get_player_by_name(name) + if not player then return false end + local wstack = player:get_wielded_item():get_name() + if wstack == "" then wstack = "hand" end + + --on_dig + if minetest.get_item_group(node, "plant") == 1 and (wstack == "hand" or minetest.registered_tools[wstack]) then + return true + end + + --on_place + if plants[wstack] ~= nil and plants[wstack] == node then + return true + end elseif areas.factions_available and area.faction_open then local faction_name = factions.get_player_faction(area.owner) if faction_name ~= nil and faction_name == factions.get_player_faction(name) then diff --git a/chatcommands.lua b/chatcommands.lua index faffb03..17910c3 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -286,6 +286,28 @@ minetest.register_chatcommand("area_open", { }) +minetest.register_chatcommand( + "area_openfarming", { + params = "", + description = "Toggle an area as open farming (anyone can harvest and plant) or closed", + func = function(name, param) + local id = tonumber(param) + if not id then + return false, "Invalid usage, see /help area_openfarming." + end + + if not areas:isAreaOwner(id, name) then + return false, "Area "..id.." does not exist" + .." or is not owned by you." + end + local open = not areas.areas[id].openfarming + -- Save false as nil to avoid inflating the DB. + areas.areas[id].openfarming = open or nil + areas:save() + return true, ("Area %s to farming."):format(open and "opened" or "closed") + end +}) + if areas.factions_available then minetest.register_chatcommand("area_faction_open", { params = "", diff --git a/hud.lua b/hud.lua index ffe764e..5a76ac7 100644 --- a/hud.lua +++ b/hud.lua @@ -26,7 +26,7 @@ minetest.register_globalstep(function(dtime) area.faction_open = faction_info table.insert(areaStrings, ("%s [%u] (%s%s%s)") :format(area.name, id, area.owner, - area.open and ":open" or "", + area.open and ":open" or area.openfarming and ":openfarming" or "", faction_info and ":"..faction_info or "")) end @@ -52,7 +52,7 @@ minetest.register_globalstep(function(dtime) name = "Areas", number = 0xFFFFFF, position = {x=0, y=1}, - offset = {x=8, y=-8}, + offset = {x=8, y=-24}, text = areaString, scale = {x=200, y=60}, alignment = {x=1, y=-1}, diff --git a/internal.lua b/internal.lua index 27f85ed..0717c22 100644 --- a/internal.lua +++ b/internal.lua @@ -1,3 +1,5 @@ +-- Mega_builder privilege +minetest.register_privilege("megabuilder", "Can protect an infinite amount of areas.") function areas:player_exists(name) return minetest.get_auth_handler().get_auth(name) ~= nil @@ -216,39 +218,41 @@ function areas:canPlayerAddArea(pos1, pos2, name) .." the necessary privilege." end - local max_size = privs.areas_high_limit and + -- MFF: megabuilders skip checks on size and number of areas + if not privs.megabuilder then + local max_size = privs.areas_high_limit and self.config.self_protection_max_size_high or self.config.self_protection_max_size - if + if (pos2.x - pos1.x) > max_size.x or (pos2.y - pos1.y) > max_size.y or - (pos2.z - pos1.z) > max_size.z then - return false, "Area is too big." - end - - -- Check number of areas the user has and make sure it not above the max - local count = 0 - for _, area in pairs(self.areas) do - if area.owner == name then - count = count + 1 + (pos2.z - pos1.z) > max_size.z then + return false, "Area is too big." end - end - local max_areas = privs.areas_high_limit and + + -- Check number of areas the user has and make sure it not above the max + local count = 0 + for _, area in pairs(self.areas) do + if area.owner == name then + count = count + 1 + end + end + local max_areas = privs.areas_high_limit and self.config.self_protection_max_areas_high or self.config.self_protection_max_areas - if count >= max_areas then - return false, "You have reached the maximum amount of" + if count >= max_areas then + return false, "You have reached the maximum amount of" .." areas that you are allowed to protect." - end + end - -- Check intersecting areas - local can, id = self:canInteractInArea(pos1, pos2, name) - if not can then - local area = self.areas[id] - return false, ("The area intersects with %s [%u] (%s).") + -- Check intersecting areas + local can, id = self:canInteractInArea(pos1, pos2, name) + if not can then + local area = self.areas[id] + return false, ("The area intersects with %s [%u] (%s).") :format(area.name, id, area.owner) + end end - return true end From 57f20bb25f5d70becc38c8e2b7b23015a3f8c9b3 Mon Sep 17 00:00:00 2001 From: sys4 Date: Sat, 28 Dec 2019 15:07:13 +0100 Subject: [PATCH 22/32] =?UTF-8?q?Ajoute=20infos=20privil=C3=A8ge=20"megabu?= =?UTF-8?q?ilder"=20dans=20la=20commande=20/area=5Finfo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatcommands.lua | 9 ++++++--- init.lua | 6 +++++- internal.lua | 3 --- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 17910c3..190a024 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -403,7 +403,9 @@ minetest.register_chatcommand("area_info", { elseif has_high_limit then table.insert(lines, "You have extended area protection".. - " limits (\"areas_high_limit\" privilege).") + " limits (\"areas_high_limit\" privilege).") + elseif privs.megabuilder then + table.insert(lines, "You are a megabuilder (\"megabuilder\" privilege).") end -- Area count @@ -415,7 +417,7 @@ minetest.register_chatcommand("area_info", { end local count_line = ("You have %d area%s"):format( area_num, area_num == 1 and "" or "s") - if privs.areas then + if privs.areas or privs.megabuilder then count_line = count_line.. " and have no area protection limits." elseif can_prot then @@ -440,6 +442,8 @@ minetest.register_chatcommand("area_info", { limit, size_limit) priv_limit_info("areas_high_limit", limit_high, size_limit_high) + elseif privs.megabuilder then + table.insert(lines, "You can protect areas unlimited in size and number.") elseif has_prot_priv then size_info("You can protect areas", max_size) end @@ -448,4 +452,3 @@ minetest.register_chatcommand("area_info", { return true, table.concat(lines, "\n") end, }) - diff --git a/init.lua b/init.lua index 53d4eb6..cd741c7 100644 --- a/init.lua +++ b/init.lua @@ -25,7 +25,11 @@ minetest.register_privilege("areas", { description = "Can administer areas." }) minetest.register_privilege("areas_high_limit", { - description = "Can can more, bigger areas." + description = "Can do more bigger areas." +}) +-- Mega_builder privilege -- MFF +minetest.register_privilege("megabuilder", { + description = "Can protect an infinite amount of areas." }) if not minetest.registered_privileges[areas.config.self_protection_privilege] then diff --git a/internal.lua b/internal.lua index 0717c22..718744c 100644 --- a/internal.lua +++ b/internal.lua @@ -1,6 +1,3 @@ --- Mega_builder privilege -minetest.register_privilege("megabuilder", "Can protect an infinite amount of areas.") - function areas:player_exists(name) return minetest.get_auth_handler().get_auth(name) ~= nil end From 26d6f5648547a065722fd1c04c3f64abcf67b1f5 Mon Sep 17 00:00:00 2001 From: sys4 Date: Sat, 28 Dec 2019 15:26:21 +0100 Subject: [PATCH 23/32] =?UTF-8?q?Ajoute=20description=20privil=C3=A8ge=20\?= =?UTF-8?q?"megabuilder\"=20pour=20admins=20d'areas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatcommands.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/chatcommands.lua b/chatcommands.lua index 190a024..c98b499 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -442,6 +442,7 @@ minetest.register_chatcommand("area_info", { limit, size_limit) priv_limit_info("areas_high_limit", limit_high, size_limit_high) + table.insert(lines, "Players with the \"megabuilder\" privilege can protect unlimited areas in size and number.") elseif privs.megabuilder then table.insert(lines, "You can protect areas unlimited in size and number.") elseif has_prot_priv then From 54c504fa0dd9cce61a9b7653e414f0226604dfd9 Mon Sep 17 00:00:00 2001 From: sys4 Date: Mon, 30 Dec 2019 01:02:36 +0100 Subject: [PATCH 24/32] [areas] Remet le HUD comme avant la modif du feae996 --- hud.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hud.lua b/hud.lua index 5a76ac7..3c16a4f 100644 --- a/hud.lua +++ b/hud.lua @@ -52,7 +52,7 @@ minetest.register_globalstep(function(dtime) name = "Areas", number = 0xFFFFFF, position = {x=0, y=1}, - offset = {x=8, y=-24}, + offset = {x=8, y=-8}, text = areaString, scale = {x=200, y=60}, alignment = {x=1, y=-1}, From 4179917eb49a1a07a0469c51eea0f5e62fb009c9 Mon Sep 17 00:00:00 2001 From: Louis Royer <55180044+louisroyer@users.noreply.github.com> Date: Sun, 8 Mar 2020 22:15:00 +0100 Subject: [PATCH 25/32] Add translation support --- .luacheckrc | 1 - chatcommands.lua | 242 +++++++++++++++++++++++--------------------- hud.lua | 6 +- interact.lua | 3 +- internal.lua | 15 +-- legacy.lua | 23 +++-- locale/template.txt | 137 +++++++++++++++++++++++++ pos.lua | 66 ++++++------ 8 files changed, 324 insertions(+), 169 deletions(-) create mode 100644 locale/template.txt diff --git a/.luacheckrc b/.luacheckrc index c0ea991..fc9c148 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -9,7 +9,6 @@ read_globals = { "VoxelManip", "VoxelArea", "PseudoRandom", "ItemStack", "AreaStore", - "intllib", "default", table = { fields = { "copy", "getn" } } } diff --git a/chatcommands.lua b/chatcommands.lua index faffb03..fd63d81 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -1,15 +1,16 @@ +local S = minetest.get_translator("areas") minetest.register_chatcommand("protect", { - params = "", - description = "Protect your own area", + params = S(""), + description = S("Protect your own area"), privs = {[areas.config.self_protection_privilege]=true}, func = function(name, param) if param == "" then - return false, "Invalid usage, see /help protect." + return false, S("Invalid usage, see /help @1.", "protect") end local pos1, pos2 = areas:getPos(name) if not (pos1 and pos2) then - return false, "You need to select an area first." + return false, S("You need to select an area first.") end minetest.log("action", "/protect invoked, owner="..name.. @@ -19,38 +20,37 @@ minetest.register_chatcommand("protect", { local canAdd, errMsg = areas:canPlayerAddArea(pos1, pos2, name) if not canAdd then - return false, "You can't protect that area: "..errMsg + return false, S("You can't protect that area: @1", errMsg) end local id = areas:add(name, param, pos1, pos2, nil) areas:save() - return true, "Area protected. ID: "..id + return true, S("Area protected. ID: @1", id) end }) minetest.register_chatcommand("set_owner", { - params = " ", - description = "Protect an area beetween two positions and give" + params = S("").." "..S(""), + description = S("Protect an area beetween two positions and give" .." a player access to it without setting the parent of the" - .." area to any existing area", + .." area to any existing area"), privs = areas.adminPrivs, func = function(name, param) local ownerName, areaName = param:match('^(%S+)%s(.+)$') if not ownerName then - return false, "Incorrect usage, see /help set_owner." + return false, S("Invalid usage, see /help @1.", "set_owner") end local pos1, pos2 = areas:getPos(name) if not (pos1 and pos2) then - return false, "You need to select an area first." + return false, S("You need to select an area first.") end if not areas:player_exists(ownerName) then - return false, "The player \"" - ..ownerName.."\" does not exist." + return false, S("The player \"@1\" does not exist.", ownerName) end minetest.log("action", name.." runs /set_owner. Owner = "..ownerName.. @@ -62,34 +62,34 @@ minetest.register_chatcommand("set_owner", { areas:save() minetest.chat_send_player(ownerName, - "You have been granted control over area #".. - id..". Type /list_areas to show your areas.") - return true, "Area protected. ID: "..id + S("You have been granted control over area #@1. ".. + "Type /list_areas to show your areas.", id)) + return true, S("Area protected. ID: @1", id) end }) minetest.register_chatcommand("add_owner", { - params = " ", - description = "Give a player access to a sub-area beetween two" + params = S("").." "..S("").." "..S(""), + description = S("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.", + .." Use set_owner if you don't want the parent to be set."), func = function(name, param) local pid, ownerName, areaName = param:match('^(%d+) ([^ ]+) (.+)$') if not pid then - minetest.chat_send_player(name, "Incorrect usage, see /help add_owner") + minetest.chat_send_player(name, S("Invalid usage, see /help @1.", "add_owner")) return end local pos1, pos2 = areas:getPos(name) if not (pos1 and pos2) then - return false, "You need to select an area first." + return false, S("You need to select an area first.") end if not areas:player_exists(ownerName) then - return false, "The player \""..ownerName.."\" does not exist." + return false, S("The player \"@1\" does not exist.", ownerName) end minetest.log("action", name.." runs /add_owner. Owner = "..ownerName.. @@ -101,52 +101,52 @@ minetest.register_chatcommand("add_owner", { pid = tonumber(pid) if (not areas:isAreaOwner(pid, name)) or (not areas:isSubarea(pos1, pos2, pid)) then - return false, "You can't protect that area." + return false, S("You can't protect that area.") end local id = areas:add(ownerName, areaName, pos1, pos2, pid) areas:save() minetest.chat_send_player(ownerName, - "You have been granted control over area #".. - id..". Type /list_areas to show your areas.") - return true, "Area protected. ID: "..id + S("You have been granted control over area #@1. ".. + "Type /list_areas to show your areas.", id)) + return true, S("Area protected. ID: @1", id) end }) minetest.register_chatcommand("rename_area", { - params = " ", - description = "Rename a area that you own", + params = S("").." "..S(""), + description = S("Rename a area that you own"), func = function(name, param) local id, newName = param:match("^(%d+)%s(.+)$") if not id then - return false, "Invalid usage, see /help rename_area." + return false, S("Invalid usage, see /help @1.", "rename_area") end id = tonumber(id) if not id then - return false, "That area doesn't exist." + return false, S("That area doesn't exist.") end if not areas:isAreaOwner(id, name) then - return true, "You don't own that area." + return true, S("You don't own that area.") end areas.areas[id].name = newName areas:save() - return true, "Area renamed." + return true, S("Area renamed.") end }) minetest.register_chatcommand("find_areas", { - params = "", - description = "Find areas using a Lua regular expression", + params = S(""), + description = S("Find areas using a Lua regular expression"), privs = areas.adminPrivs, func = function(name, param) if param == "" then - return false, "A regular expression is required." + return false, S("A regular expression is required.") end -- Check expression for validity @@ -154,7 +154,7 @@ minetest.register_chatcommand("find_areas", { ("Test [1]: Player (0,0,0) (0,0,0)"):find(param) end if not pcall(testRegExp) then - return false, "Invalid regular expression." + return false, S("Invalid regular expression.") end local matches = {} @@ -167,14 +167,14 @@ minetest.register_chatcommand("find_areas", { if #matches > 0 then return true, table.concat(matches, "\n") else - return true, "No matches found." + return true, S("No matches found.") end end }) minetest.register_chatcommand("list_areas", { - description = "List your areas, or all areas if you are an admin.", + description = S("List your areas, or all areas if you are an admin."), func = function(name, param) local admin = minetest.check_player_privs(name, areas.adminPrivs) local areaStrings = {} @@ -184,7 +184,7 @@ minetest.register_chatcommand("list_areas", { end end if #areaStrings == 0 then - return true, "No visible areas." + return true, S("No visible areas.") end return true, table.concat(areaStrings, "\n") end @@ -192,154 +192,154 @@ minetest.register_chatcommand("list_areas", { minetest.register_chatcommand("recursive_remove_areas", { - params = "", - description = "Recursively remove areas using an id", + params = S(""), + description = S("Recursively remove areas using an id"), func = function(name, param) local id = tonumber(param) if not id then - return false, "Invalid usage, see" - .." /help recursive_remove_areas" + return false, S("Invalid usage, see" + .." /help @1.", "recursive_remove_areas") end if not areas:isAreaOwner(id, name) then - return false, "Area "..id.." does not exist or is" - .." not owned by you." + return false, S("Area @1 does not exist or is" + .." not owned by you.", id) end areas:remove(id, true) areas:save() - return true, "Removed area "..id.." and it's sub areas." + return true, S("Removed area @1 and it's sub areas.", id) end }) minetest.register_chatcommand("remove_area", { - params = "", - description = "Remove an area using an id", + params = S(""), + description = S("Remove an area using an id"), func = function(name, param) local id = tonumber(param) if not id then - return false, "Invalid usage, see /help remove_area" + return false, S("Invalid usage, see /help @1.", "remove_area") end if not areas:isAreaOwner(id, name) then - return false, "Area "..id.." does not exist or" - .." is not owned by you." + return false, S("Area @1 does not exist or" + .." is not owned by you.", id) end areas:remove(id) areas:save() - return true, "Removed area "..id + return true, S("Removed area @1", id) end }) minetest.register_chatcommand("change_owner", { - params = " ", - description = "Change the owner of an area using it's ID", + params = S("").." "..S(""), + description = S("Change the owner of an area using it's ID"), func = function(name, param) local id, newOwner = param:match("^(%d+)%s(%S+)$") if not id then - return false, "Invalid usage, see" - .." /help change_owner." + return false, S("Invalid usage, see" + .." /help @1.", "change_owner") end if not areas:player_exists(newOwner) then - return false, "The player \""..newOwner - .."\" does not exist." + return false, S("The player \"@1\" does not exist.", newOwner) end id = tonumber(id) if not areas:isAreaOwner(id, name) then - return false, "Area "..id.." does not exist" - .." or is not owned by you." + return false, S("Area @1 does not exist" + .." or is not owned by you.", id) end areas.areas[id].owner = newOwner areas:save() minetest.chat_send_player(newOwner, - ("%s has given you control over the area %q (ID %d).") - :format(name, areas.areas[id].name, id)) - return true, "Owner changed." + S("@1 has given you control over the area \"@2\" (ID @3).", + name, areas.areas[id].name, id)) + return true, S("Owner changed.") end }) minetest.register_chatcommand("area_open", { - params = "", - description = "Toggle an area open (anyone can interact) or closed", + params = S(""), + description = S("Toggle an area open (anyone can interact) or closed"), func = function(name, param) local id = tonumber(param) if not id then - return false, "Invalid usage, see /help area_open." + return false, S("Invalid usage, see /help @1.", "area_open") end if not areas:isAreaOwner(id, name) then - return false, "Area "..id.." does not exist" - .." or is not owned by you." + return false, S("Area @1 does not exist" + .." or is not owned by you.", id) end local open = not areas.areas[id].open -- Save false as nil to avoid inflating the DB. areas.areas[id].open = open or nil areas:save() - return true, ("Area %s."):format(open and "opened" or "closed") + return true, open and S("Area opened.") or S("Area closed.") end }) if areas.factions_available then minetest.register_chatcommand("area_faction_open", { - params = "", - description = "Toggle an area open/closed for members in your faction.", + params = S(""), + description = S("Toggle an area open/closed for members in your faction."), func = function(name, param) local id = tonumber(param) if not id then - return false, "Invalid usage, see /help area_faction_open." + return false, S("Invalid usage, see /help @1.", "area_faction_open") end if not areas:isAreaOwner(id, name) then - return false, "Area "..id.." does not exist" - .." or is not owned by you." + return false, S("Area @1 does not exist" + .." or is not owned by you.", id) end local open = not areas.areas[id].faction_open -- Save false as nil to avoid inflating the DB. areas.areas[id].faction_open = open or nil areas:save() - return true, ("Area %s for faction members."):format(open and "opened" or "closed") + return true, open and S("Area opened for faction members.") + or S("Area closed for faction members.") end }) end minetest.register_chatcommand("move_area", { - params = "", - description = "Move (or resize) an area to the current positions.", + params = S(""), + description = S("Move (or resize) an area to the current positions."), privs = areas.adminPrivs, func = function(name, param) local id = tonumber(param) if not id then - return false, "Invalid usage, see /help move_area." + return false, S("Invalid usage, see /help @1.", "move_area") end local area = areas.areas[id] if not area then - return false, "Area does not exist." + return false, S("Area does not exist.") end local pos1, pos2 = areas:getPos(name) if not pos1 then - return false, "You need to select an area first." + return false, S("You need to select an area first.") end areas:move(id, area, pos1, pos2) areas:save() - return true, "Area successfully moved." + return true, S("Area successfully moved.") end, }) minetest.register_chatcommand("area_info", { - description = "Get information about area configuration and usage.", + description = S("Get information about area configuration and usage."), func = function(name, param) local lines = {} local privs = minetest.get_player_privs(name) @@ -362,26 +362,33 @@ minetest.register_chatcommand("area_info", { size_limit_high or size_limit -- Privilege information - local self_prot_line = ("Self protection is %sabled"):format( - self_prot and "en" or "dis") - if self_prot and prot_priv then - self_prot_line = self_prot_line.. - (" %s have the neccessary privilege (%q).") - :format( - has_prot_priv and "and you" or - "but you don't", - prot_priv) - else - self_prot_line = self_prot_line.."." - end + local self_prot_line = (self_prot and prot_priv) and + (has_prot_priv and + (self_prot and + S("Self protection is enabled and you have the ".. + "necessary privilege (\"@1\").", prot_priv) or + S("Self protection is disabled and you have the ".. + "necessary privilege (\"@1\").", prot_priv) + ) or + (self_prot and + S("Self protection is enabled but you don't have the ".. + "necessary privilege (\"@1\").", prot_priv) or + S("Self protection is disabled but you don't have the ".. + "necessary privilege (\"@1\").", prot_priv) + ) + ) or + (self_prot and + S("Self protection is enabled.") or + S("Self protection is disabled.") + ) table.insert(lines, self_prot_line) if privs.areas then - table.insert(lines, "You are an area".. - " administrator (\"areas\" privilege).") + table.insert(lines, S("You are an area".. + " administrator (\"areas\" privilege).")) elseif has_high_limit then table.insert(lines, - "You have extended area protection".. - " limits (\"areas_high_limit\" privilege).") + S("You have extended area protection".. + " limits (\"areas_high_limit\" privilege).")) end -- Area count @@ -391,26 +398,35 @@ minetest.register_chatcommand("area_info", { area_num = area_num + 1 end end - local count_line = ("You have %d area%s"):format( - area_num, area_num == 1 and "" or "s") - if privs.areas then - count_line = count_line.. - " and have no area protection limits." - elseif can_prot then - count_line = count_line..(", out of a maximum of %d.") - :format(max_count) - end + local count_line = privs.areas and + ((area_num <= 1) and + S("You have @1 area and have no area ".. + "protection limits.", area_num) or + S("You have @1 areas and have no area ".. + "protection limits.", area_num) + ) or + (can_prot and ( + (area_num <= 1) and + S("You have @1 area, out of a ".. + "maximum of @2.", area_num, max_count) or + S("You have @1 areas, out of a ".. + "maximum of @2.", area_num, max_count) + ) or + (area_num <= 1) and + S("You have @1 area.", area_num) or + S("You have @1 areas.", area_num) + ) table.insert(lines, count_line) -- Area size limits local function size_info(str, size) - table.insert(lines, ("%s spanning up to %dx%dx%d.") - :format(str, size.x, size.y, size.z)) + table.insert(lines, S("@1 spanning up to @2x@3x@4.", + str, size.x, size.y, size.z)) end local function priv_limit_info(lpriv, lmax_count, lmax_size) - size_info(("Players with the %q privilege".. - " can protect up to %d areas"):format( - lpriv, lmax_count), lmax_size) + size_info(S("Players with the \"@1\" privilege".. + " can protect up to @2 areas", lpriv, lmax_count), + lmax_size) end if self_prot then if privs.areas then @@ -419,7 +435,7 @@ minetest.register_chatcommand("area_info", { priv_limit_info("areas_high_limit", limit_high, size_limit_high) elseif has_prot_priv then - size_info("You can protect areas", max_size) + size_info(S("You can protect areas"), max_size) end end diff --git a/hud.lua b/hud.lua index ffe764e..9d13b80 100644 --- a/hud.lua +++ b/hud.lua @@ -1,5 +1,5 @@ -- This is inspired by the landrush mod by Bremaweb - +local S = minetest.get_translator("areas") areas.hud = {} areas.hud.refresh = 0 @@ -26,7 +26,7 @@ minetest.register_globalstep(function(dtime) area.faction_open = faction_info table.insert(areaStrings, ("%s [%u] (%s%s%s)") :format(area.name, id, area.owner, - area.open and ":open" or "", + area.open and S(":open") or "", faction_info and ":"..faction_info or "")) end @@ -38,7 +38,7 @@ minetest.register_globalstep(function(dtime) table.insert(areaStrings, str) end - local areaString = "Areas:" + local areaString = S("Areas:") if #areaStrings > 0 then areaString = areaString.."\n".. table.concat(areaStrings, "\n") diff --git a/interact.lua b/interact.lua index 2e54800..4e575fb 100644 --- a/interact.lua +++ b/interact.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("areas") local old_is_protected = minetest.is_protected function minetest.is_protected(pos, name) @@ -11,7 +12,7 @@ minetest.register_on_protection_violation(function(pos, name) if not areas:canInteract(pos, name) then local owners = areas:getNodeOwners(pos) minetest.chat_send_player(name, - ("%s is protected by %s."):format( + S("@1 is protected by @2.", minetest.pos_to_string(pos), table.concat(owners, ", "))) end diff --git a/internal.lua b/internal.lua index 27f85ed..a7979e5 100644 --- a/internal.lua +++ b/internal.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator("areas") function areas:player_exists(name) return minetest.get_auth_handler().get_auth(name) ~= nil @@ -212,8 +213,8 @@ function areas:canPlayerAddArea(pos1, pos2, name) -- and if the area is too big. if not self.config.self_protection or not privs[areas.config.self_protection_privilege] then - return false, "Self protection is disabled or you do not have" - .." the necessary privilege." + return false, S("Self protection is disabled or you do not have" + .." the necessary privilege.") end local max_size = privs.areas_high_limit and @@ -223,7 +224,7 @@ function areas:canPlayerAddArea(pos1, pos2, name) (pos2.x - pos1.x) > max_size.x or (pos2.y - pos1.y) > max_size.y or (pos2.z - pos1.z) > max_size.z then - return false, "Area is too big." + return false, S("Area is too big.") end -- Check number of areas the user has and make sure it not above the max @@ -237,16 +238,16 @@ function areas:canPlayerAddArea(pos1, pos2, name) self.config.self_protection_max_areas_high or self.config.self_protection_max_areas if count >= max_areas then - return false, "You have reached the maximum amount of" - .." areas that you are allowed to protect." + return false, S("You have reached the maximum amount of" + .." areas that you are allowed to protect.") end -- Check intersecting areas local can, id = self:canInteractInArea(pos1, pos2, name) if not can then local area = self.areas[id] - return false, ("The area intersects with %s [%u] (%s).") - :format(area.name, id, area.owner) + return false, S("The area intersects with @1 [@2] (@3).", + area.name, id, area.owner) end return true diff --git a/legacy.lua b/legacy.lua index 876b88d..c68afb2 100644 --- a/legacy.lua +++ b/legacy.lua @@ -1,25 +1,26 @@ -- This file contains functions to convert from -- the old areas format and other compatability code. +local S = minetest.get_translator("areas") minetest.register_chatcommand("legacy_load_areas", { - params = "", - description = "Loads, converts, and saves the areas from" - .." a legacy save file.", + params = S(""), + description = S("Loads, converts, and saves the areas from" + .." a legacy save file."), privs = {areas=true, server=true}, func = function(name, param) - minetest.chat_send_player(name, "Converting areas...") + minetest.chat_send_player(name, S("Converting areas…")) local version = tonumber(param) if version == 0 then local err = areas:node_ownership_load() if err then - minetest.chat_send_player(name, "Error loading legacy file: "..err) + minetest.chat_send_player(name, S("Error loading legacy file: @1", err)) return end else - minetest.chat_send_player(name, "Invalid version number. (0 allowed)") + minetest.chat_send_player(name, S("Invalid version number. (0 allowed)")) return end - minetest.chat_send_player(name, "Legacy file loaded.") + minetest.chat_send_player(name, S("Legacy file loaded.")) for k, area in pairs(areas.areas) do -- New position format @@ -34,15 +35,15 @@ minetest.register_chatcommand("legacy_load_areas", { areas:sortPos(area.pos1, area.pos2) -- Add name - area.name = "unnamed" + area.name = S("unnamed") -- Remove ID area.id = nil end - minetest.chat_send_player(name, "Table format updated.") + minetest.chat_send_player(name, S("Table format updated.")) areas:save() - minetest.chat_send_player(name, "Converted areas saved. Done.") + minetest.chat_send_player(name, S("Converted areas saved. Done.")) end }) @@ -130,7 +131,7 @@ if areas.config.legacy_table then {x=a.x2, y=a.y2, z=a.z2} a.x1, a.y1, a.z1, a.x2, a.y2, a.z2 = nil, nil, nil, nil, nil, nil - a.name = a.name or "unnamed" + a.name = a.name or S("unnamed") a.id = nil return rawset(areas.areas, key, a) end diff --git a/locale/template.txt b/locale/template.txt new file mode 100644 index 0000000..db223bd --- /dev/null +++ b/locale/template.txt @@ -0,0 +1,137 @@ +# textdomain: areas + + +### chatcommands.lua ### + += += += += += += +@1 has given you control over the area "@2" (ID @3).= +@1 spanning up to @2x@3x@4.= +A regular expression is required.= +Area @1 does not exist or is not owned by you.= +Area closed for faction members.= +Area closed.= +Area does not exist.= +Area opened for faction members.= +Area opened.= +Area protected. ID: @1= +Area renamed.= +Area successfully moved.= +Change the owner of an area using it's ID= +Find areas using a Lua regular expression= +Get information about area configuration and usage.= + +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.= + +Invalid regular expression.= +List your areas, or all areas if you are an admin.= +Move (or resize) an area to the current positions.= +No matches found.= +No visible areas.= +Owner changed.= +Players with the "@1" privilege can protect up to @2 areas= + +Protect an area beetween two positions and give a player access to it without setting the parent of the area to any existing area= + +Protect your own area= +Recursively remove areas using an id= +Remove an area using an id= +Removed area @1= +Removed area @1 and it's sub areas.= +Rename a area that you own= + +Self protection is disabled and you have the necessary privilege ("@1").= + +Self protection is disabled but you don't have the necessary privilege ("@1").= + +Self protection is disabled.= + +Self protection is enabled and you have the necessary privilege ("@1").= + +Self protection is enabled but you don't have the necessary privilege ("@1").= + +Self protection is enabled.= +That area doesn't exist.= +The player "@1" does not exist.= +Toggle an area open (anyone can interact) or closed= +Toggle an area open/closed for members in your faction.= +You are an area administrator ("areas" privilege).= +You can protect areas= +You can't protect that area.= +You can't protect that area: @1= +You don't own that area.= +You have @1 area and have no area protection limits.= +You have @1 area, out of a maximum of @2.= +You have @1 area.= +You have @1 areas and have no area protection limits.= +You have @1 areas, out of a maximum of @2.= +You have @1 areas.= + +You have been granted control over area #@1. Type /list_areas to show your areas.= + +You have extended area protection limits ("areas_high_limit" privilege).= + +You need to select an area first.= + +### chatcommands.lua ### +### pos.lua ### + += +Invalid usage, see /help @1.= + +### hud.lua ### + +:open= +Areas:= + +### interact.lua ### + +@1 is protected by @2.= + +### internal.lua ### + +Area is too big.= + +Self protection is disabled or you do not have the necessary privilege.= + +The area intersects with @1 [@2] (@3).= + +You have reached the maximum amount of areas that you are allowed to protect.= + + +### legacy.lua ### + += +Converted areas saved. Done.= +Converting areas…= +Error loading legacy file: @1= +Invalid version number. (0 allowed)= +Legacy file loaded.= + +Loads, converts, and saves the areas from a legacy save file.= + +Table format updated.= +unnamed= + +### pos.lua ### + += +Area @1 selected.= +Area position @1 set to @2= +Position @1 set to @2= +Position @1: = +Select a area by id.= +Select position @1 by punching a node.= +Select positions by punching two nodes.= + +Set area protection region position @1 to your location or the one specified= + +Set area protection region, position 1, or position 2 by punching nodes, or display the region= + +The area @1 does not exist.= +Unable to get position.= +Unknown subcommand: @1= diff --git a/pos.lua b/pos.lua index 323d55d..6cb641d 100644 --- a/pos.lua +++ b/pos.lua @@ -1,4 +1,4 @@ - +local S = minetest.get_translator("areas") -- 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]. @@ -22,27 +22,27 @@ local function posLimit(pos) end minetest.register_chatcommand("select_area", { - params = "", - description = "Select a area by id.", + params = S(""), + description = S("Select a area by id."), func = function(name, param) local id = tonumber(param) if not id then - return false, "Invalid usage, see /help select_area." + return false, S("Invalid usage, see /help @1.", "select_area") end if not areas.areas[id] then - return false, "The area "..id.." does not exist." + return false, S("The area @1 does not exist.", id) end areas:setPos1(name, areas.areas[id].pos1) areas:setPos2(name, areas.areas[id].pos2) - return true, "Area "..id.." selected." + return true, S("Area @1 selected.", id) end, }) minetest.register_chatcommand("area_pos1", { params = "[X Y Z|X,Y,Z]", - description = "Set area protection region position 1 to your" - .." location or the one specified", + description = S("Set area protection region position @1 to your" + .." location or the one specified", "1"), privs = {}, func = function(name, param) local pos @@ -55,22 +55,22 @@ minetest.register_chatcommand("area_pos1", { if player then pos = player:get_pos() else - return false, "Unable to get position." + return false, S("Unable to get position.") end else - return false, "Invalid usage, see /help area_pos1." + return false, S("Invalid usage, see /help @1.", "area_pos1") end pos = posLimit(vector.round(pos)) areas:setPos1(name, pos) - return true, "Area position 1 set to " - ..minetest.pos_to_string(pos) + return true, S("Area position @1 set to @2", "1", + 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 your" - .." location or the one specified", + description = S("Set area protection region position @1 to your" + .." location or the one specified", "2"), func = function(name, param) local pos local found, _, x, y, z = param:find( @@ -82,48 +82,48 @@ minetest.register_chatcommand("area_pos2", { if player then pos = player:get_pos() else - return false, "Unable to get position." + return false, S("Unable to get position.") end else - return false, "Invalid usage, see /help area_pos2." + return false, S("Invalid usage, see /help @1.", "area_pos2") end pos = posLimit(vector.round(pos)) areas:setPos2(name, pos) - return true, "Area position 2 set to " - ..minetest.pos_to_string(pos) + return true, S("Area position @1 set to @2", "2", + 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 = S("Set area protection region, position 1, or position 2" + .." by punching nodes, or display the region"), func = function(name, param) if param == "set" then -- Set both area positions areas.set_pos[name] = "pos1" - return true, "Select positions by punching two nodes." + return true, S("Select positions by punching two nodes.") elseif param == "set1" then -- Set area position 1 areas.set_pos[name] = "pos1only" - return true, "Select position 1 by punching a node." + return true, S("Select position @1 by punching a node.", "1") elseif param == "set2" then -- Set area position 2 areas.set_pos[name] = "pos2" - return true, "Select position 2 by punching a node." + return true, S("Select position @1 by punching a node.", "2") elseif param == "get" then -- Display current area positions - local pos1str, pos2str = "Position 1: ", "Position 2: " + local pos1str, pos2str = S("Position @1: ", "1"), S("Position @1: ", "2") if areas.pos1[name] then pos1str = pos1str..minetest.pos_to_string(areas.pos1[name]) else - pos1str = pos1str.."" + pos1str = pos1str..S("") end if areas.pos2[name] then pos2str = pos2str..minetest.pos_to_string(areas.pos2[name]) else - pos2str = pos2str.."" + pos2str = pos2str..S("") end return true, pos1str.."\n"..pos2str else - return false, "Unknown subcommand: "..param + return false, S("Unknown subcommand: @1", param) end end, }) @@ -159,22 +159,22 @@ minetest.register_on_punchnode(function(pos, node, puncher) areas.markPos1(name) areas.set_pos[name] = "pos2" minetest.chat_send_player(name, - "Position 1 set to " - ..minetest.pos_to_string(pos)) + S("Position @1 set to @2", "1", + minetest.pos_to_string(pos))) elseif areas.set_pos[name] == "pos1only" then areas.pos1[name] = pos areas.markPos1(name) areas.set_pos[name] = nil minetest.chat_send_player(name, - "Position 1 set to " - ..minetest.pos_to_string(pos)) + S("Position @1 set to @2", "1", + minetest.pos_to_string(pos))) elseif areas.set_pos[name] == "pos2" then areas.pos2[name] = pos areas.markPos2(name) areas.set_pos[name] = nil minetest.chat_send_player(name, - "Position 2 set to " - ..minetest.pos_to_string(pos)) + S("Position @1 set to @2", "2", + minetest.pos_to_string(pos))) end end end) From 2f4eddd324868da1bfc78b0409d53b17bb87fb18 Mon Sep 17 00:00:00 2001 From: Louis Royer <55180044+louisroyer@users.noreply.github.com> Date: Sun, 8 Mar 2020 23:18:56 +0100 Subject: [PATCH 26/32] Add french translation --- locale/areas.fr.tr | 137 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 locale/areas.fr.tr diff --git a/locale/areas.fr.tr b/locale/areas.fr.tr new file mode 100644 index 0000000..53238e4 --- /dev/null +++ b/locale/areas.fr.tr @@ -0,0 +1,137 @@ +# textdomain: areas + + +### chatcommands.lua ### + += += += += += += +@1 has given you control over the area "@2" (ID @3).=@1 vous a donné le contrôle de la zone "@2" (ID @3). +@1 spanning up to @2x@3x@4.=@1 s’étendant jusqu’à @2x@3x@4. +A regular expression is required.=Une expression régulière est requise. +Area @1 does not exist or is not owned by you.=La zone @1 n’existe pas ou ne vous appartient pas. +Area closed for faction members.=Zone fermée aux membres de la faction. +Area closed.=Zone fermée. +Area does not exist.=La zone n’existe pas. +Area opened for faction members.=Zone ouverte aux membres de la faction. +Area opened.=Zone ouverte. +Area protected. ID: @1=Zone protégée. ID : @1 +Area renamed.=Zone renommée. +Area successfully moved.=Zone déplacée avec succès. +Change the owner of an area using it's ID=Change le propriétaire d’une zone en utilisant son ID. +Find areas using a Lua regular expression=Trouve les zones en utilisant une expression régulière Lua. +Get information about area configuration and usage.=Obtient des informations sur la configuration des zones et l’utilisation des zones. + +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.=Donne au joueur accès aux sous-zones entre deux positions qui ont déjà été protégées ; utilisez set_owner si vous ne voulez pas que la zone pricipale soit définie. + +Invalid regular expression.=Expression régulière invalide. +List your areas, or all areas if you are an admin.=Liste vos zones, ou toutes les zones si vous êtes administrateur. +Move (or resize) an area to the current positions.=Déplace (ou redimensionne) une zone aux positions actuelles. +No matches found.=Aucun résultat. +No visible areas.=Pas de zone visible. +Owner changed.=Propriétaire changé. +Players with the "@1" privilege can protect up to @2 areas=Les joueurs avec le privilège "@1" peuvent protéger jusqu’à @2 zones + +Protect an area beetween two positions and give a player access to it without setting the parent of the area to any existing area=Protège une zone entre deux positions et donne à un joueur accès à cette zone sans définir la zone principale de cette zone ni aucune zone existante. + +Protect your own area=Protège votre zone. +Recursively remove areas using an id=Supprime les zones récursivement en utilisant un ID. +Remove an area using an id=Supprime une zone en utilisant son ID. +Removed area @1=Zone @1 supprimée. +Removed area @1 and it's sub areas.=Zone @1 et ses sous-zones supprimées. +Rename a area that you own=Renomme une zone qui vous appartient. + +Self protection is disabled and you have the necessary privilege ("@1").=L’autoprotection est désactivée et vous avez le privilège nécessaire ("@1"). + +Self protection is disabled but you don't have the necessary privilege ("@1").=L’autoprotection est désactivée mais vous n’avez pas le privilège nécessaire ("@1"). + +Self protection is disabled.=L’autoprotection est désactivée. + +Self protection is enabled and you have the necessary privilege ("@1").=L’autoprotection est activée et vous avez le privilège nécessaire ("@1"). + +Self protection is enabled but you don't have the necessary privilege ("@1").=L’autoprotection est activée mais vous n’avez pas le privilège nécessaire ("@1"). + +Self protection is enabled.=L’autoprotection est activée. +That area doesn't exist.=La zone n’existe pas. +The player "@1" does not exist.=Le joueur "@1" n’existe pas. +Toggle an area open (anyone can interact) or closed=Bascule entre zone ouverte (tout le monde peut intéragir) ou fermée. +Toggle an area open/closed for members in your faction.=Bascule entre zone ouverte/fermée pour les membres de votre faction. +You are an area administrator ("areas" privilege).=Vous êtes un administrateur de zone (privilège "areas"). +You can protect areas=Vous pouvez protéger des zones. +You can't protect that area.=Vous ne pouvez pas protéger cette zone. +You can't protect that area: @1=Vous ne pouvez pas protéger cette zone : @1. +You don't own that area.=Vous ne possédez pas cette zone. +You have @1 area and have no area protection limits.=Vous avez @1 zone et n’avez pas de limite de protection de zones. +You have @1 area, out of a maximum of @2.=Vous avez @1 zone sur un maximum de @2. +You have @1 area.=Vous avez @1 zone. +You have @1 areas and have no area protection limits.=Vous avez @1 zones et n’avez pas de limite de protection de zones. +You have @1 areas, out of a maximum of @2.=Vous avez @1 zones sur un maximum de @2. +You have @1 areas.=Vous avez @1 zones. + +You have been granted control over area #@1. Type /list_areas to show your areas.=Vous avez reçu l’autorisation de contrôler la zone #@1. + +You have extended area protection limits ("areas_high_limit" privilege).=Votre limite de protection de zones est étendue (privilège "areas_high_limit"). + +You need to select an area first.=Vous devez sélectionner une zone d’abord. + +### chatcommands.lua ### +### pos.lua ### + += +Invalid usage, see /help @1.=Utilisation incorrecte, voir /help @1. + +### hud.lua ### + +:open= : ouverte +Areas:=Zones : + +### interact.lua ### + +@1 is protected by @2.=@1 est protégée par @2. + +### internal.lua ### + +Area is too big.=La zone est trop grande. + +Self protection is disabled or you do not have the necessary privilege.=L’autoprotection est désactivée ou vous n’avez pas le privilège nécessaire. + +The area intersects with @1 [@2] (@3).=La zone a une intersection avec @1 [@2] (@3). + +You have reached the maximum amount of areas that you are allowed to protect.=Vous avez atteint le nombre maximum de zones que vous êtes autorisé à protéger. + + +### legacy.lua ### + += +Converted areas saved. Done.=Zones converties sauvegardées. Fait. +Converting areas…=Conversion des zones… +Error loading legacy file: @1=Erreur lors du chargement du fichier : @1 +Invalid version number. (0 allowed)=Numéro de version invalide. (0 autorisé) +Legacy file loaded.=Fichier obsolète chargé. + +Loads, converts, and saves the areas from a legacy save file.=Charge, fait la conversion et sauvegarde les zones depuis un fichier de sauvegarde obsolète. + +Table format updated.=Format de tableau mis à jour. +unnamed=Non nommé + +### pos.lua ### + += +Area @1 selected.=Zone @1 sélectionnée. +Area position @1 set to @2=Position @1 de la zone définie à @2. +Position @1 set to @2=Position @1 définie à @2. +Position @1: =Position @1 : +Select a area by id.=Sélectionnez une zone par son ID. +Select position @1 by punching a node.=Sélectionnez une position en frappant un bloc. +Select positions by punching two nodes.=Sélectionnez une position en frappant deux blocs. + +Set area protection region position @1 to your location or the one specified=Définit la position @1 de la région de protection de zone à votre position ou à celle spécifiée. + +Set area protection region, position 1, or position 2 by punching nodes, or display the region=Définit la région de protection de zone, la position 1, ou la position 2 en frappant des blocs, ou en affichant la région. + +The area @1 does not exist.=La zone @1 n’existe pas. +Unable to get position.=Impossible d’obtenir la position. +Unknown subcommand: @1=Sous-commande inconnue : @1 From 448fe3ebf18af48f8ef69738c2801c724d08bf10 Mon Sep 17 00:00:00 2001 From: Louis Royer <55180044+louisroyer@users.noreply.github.com> Date: Sun, 15 Mar 2020 21:04:12 +0100 Subject: [PATCH 27/32] Rework on messages displayed Co-authored-by: SmallJoker --- chatcommands.lua | 66 +++++++++++++++------------------------------ locale/areas.fr.tr | 32 +++++++--------------- locale/template.txt | 32 +++++++--------------- pos.lua | 2 +- 4 files changed, 42 insertions(+), 90 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index fd63d81..9152e39 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -33,7 +33,7 @@ minetest.register_chatcommand("protect", { minetest.register_chatcommand("set_owner", { params = S("").." "..S(""), - description = S("Protect an area beetween two positions and give" + description = S("Protect an area between two positions and give" .." a player access to it without setting the parent of the" .." area to any existing area"), privs = areas.adminPrivs, @@ -117,7 +117,7 @@ minetest.register_chatcommand("add_owner", { minetest.register_chatcommand("rename_area", { params = S("").." "..S(""), - description = S("Rename a area that you own"), + description = S("Rename an area that you own"), func = function(name, param) local id, newName = param:match("^(%d+)%s(.+)$") if not id then @@ -141,7 +141,7 @@ minetest.register_chatcommand("rename_area", { minetest.register_chatcommand("find_areas", { - params = S(""), + params = "", description = S("Find areas using a Lua regular expression"), privs = areas.adminPrivs, func = function(name, param) @@ -193,7 +193,7 @@ minetest.register_chatcommand("list_areas", { minetest.register_chatcommand("recursive_remove_areas", { params = S(""), - description = S("Recursively remove areas using an id"), + description = S("Recursively remove areas using an ID"), func = function(name, param) local id = tonumber(param) if not id then @@ -215,7 +215,7 @@ minetest.register_chatcommand("recursive_remove_areas", { minetest.register_chatcommand("remove_area", { params = S(""), - description = S("Remove an area using an id"), + description = S("Remove an area using an ID"), func = function(name, param) local id = tonumber(param) if not id then @@ -236,7 +236,7 @@ minetest.register_chatcommand("remove_area", { minetest.register_chatcommand("change_owner", { params = S("").." "..S(""), - description = S("Change the owner of an area using it's ID"), + description = S("Change the owner of an area using its ID"), func = function(name, param) local id, newOwner = param:match("^(%d+)%s(%S+)$") if not id then @@ -361,27 +361,15 @@ minetest.register_chatcommand("area_info", { local max_size = has_high_limit and size_limit_high or size_limit - -- Privilege information - local self_prot_line = (self_prot and prot_priv) and - (has_prot_priv and - (self_prot and - S("Self protection is enabled and you have the ".. - "necessary privilege (\"@1\").", prot_priv) or - S("Self protection is disabled and you have the ".. - "necessary privilege (\"@1\").", prot_priv) - ) or - (self_prot and - S("Self protection is enabled but you don't have the ".. - "necessary privilege (\"@1\").", prot_priv) or - S("Self protection is disabled but you don't have the ".. - "necessary privilege (\"@1\").", prot_priv) - ) - ) or - (self_prot and - S("Self protection is enabled.") or - S("Self protection is disabled.") - ) + -- Self protection information + local self_prot_line = self_prot and S("Self protection is enabled.") or + S("Self protection is disabled.") table.insert(lines, self_prot_line) + -- Privilege information + local priv_line = has_prot_priv and + S("You have the necessary privilege (\"@1\").", prot_priv) or + S("You don't have the necessary privilege (\"@1\").", prot_priv) + table.insert(lines, priv_line) if privs.areas then table.insert(lines, S("You are an area".. " administrator (\"areas\" privilege).")) @@ -398,25 +386,13 @@ minetest.register_chatcommand("area_info", { area_num = area_num + 1 end end - local count_line = privs.areas and - ((area_num <= 1) and - S("You have @1 area and have no area ".. - "protection limits.", area_num) or - S("You have @1 areas and have no area ".. - "protection limits.", area_num) - ) or - (can_prot and ( - (area_num <= 1) and - S("You have @1 area, out of a ".. - "maximum of @2.", area_num, max_count) or - S("You have @1 areas, out of a ".. - "maximum of @2.", area_num, max_count) - ) or - (area_num <= 1) and - S("You have @1 area.", area_num) or - S("You have @1 areas.", area_num) - ) - table.insert(lines, count_line) + table.insert(lines, S("You have @1 areas.", area_num)) + + -- Area limit + local area_limit_line = privs.areas and + S("Limit: no area count limit") or + S("Limit: @1 areas", max_count) + table.insert(lines, area_limit_line) -- Area size limits local function size_info(str, size) diff --git a/locale/areas.fr.tr b/locale/areas.fr.tr index 53238e4..52b08a9 100644 --- a/locale/areas.fr.tr +++ b/locale/areas.fr.tr @@ -8,7 +8,6 @@ = = = -= @1 has given you control over the area "@2" (ID @3).=@1 vous a donné le contrôle de la zone "@2" (ID @3). @1 spanning up to @2x@3x@4.=@1 s’étendant jusqu’à @2x@3x@4. A regular expression is required.=Une expression régulière est requise. @@ -21,13 +20,15 @@ Area opened.=Zone ouverte. Area protected. ID: @1=Zone protégée. ID : @1 Area renamed.=Zone renommée. Area successfully moved.=Zone déplacée avec succès. -Change the owner of an area using it's ID=Change le propriétaire d’une zone en utilisant son ID. +Change the owner of an area using its ID=Change le propriétaire d’une zone en utilisant son ID. Find areas using a Lua regular expression=Trouve les zones en utilisant une expression régulière Lua. Get information about area configuration and usage.=Obtient des informations sur la configuration des zones et l’utilisation des zones. 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.=Donne au joueur accès aux sous-zones entre deux positions qui ont déjà été protégées ; utilisez set_owner si vous ne voulez pas que la zone pricipale soit définie. Invalid regular expression.=Expression régulière invalide. +Limit: @1 areas=Limite: @1 zones. +Limit: no area count limit=Limite: pas de limite de nombre de zones. List your areas, or all areas if you are an admin.=Liste vos zones, ou toutes les zones si vous êtes administrateur. Move (or resize) an area to the current positions.=Déplace (ou redimensionne) une zone aux positions actuelles. No matches found.=Aucun résultat. @@ -35,25 +36,15 @@ No visible areas.=Pas de zone visible. Owner changed.=Propriétaire changé. Players with the "@1" privilege can protect up to @2 areas=Les joueurs avec le privilège "@1" peuvent protéger jusqu’à @2 zones -Protect an area beetween two positions and give a player access to it without setting the parent of the area to any existing area=Protège une zone entre deux positions et donne à un joueur accès à cette zone sans définir la zone principale de cette zone ni aucune zone existante. +Protect an area between two positions and give a player access to it without setting the parent of the area to any existing area=Protège une zone entre deux positions et donne à un joueur accès à cette zone sans définir la zone principale de cette zone ni aucune zone existante. Protect your own area=Protège votre zone. -Recursively remove areas using an id=Supprime les zones récursivement en utilisant un ID. -Remove an area using an id=Supprime une zone en utilisant son ID. +Recursively remove areas using an ID=Supprime les zones récursivement en utilisant un ID. +Remove an area using an ID=Supprime une zone en utilisant son ID. Removed area @1=Zone @1 supprimée. Removed area @1 and it's sub areas.=Zone @1 et ses sous-zones supprimées. -Rename a area that you own=Renomme une zone qui vous appartient. - -Self protection is disabled and you have the necessary privilege ("@1").=L’autoprotection est désactivée et vous avez le privilège nécessaire ("@1"). - -Self protection is disabled but you don't have the necessary privilege ("@1").=L’autoprotection est désactivée mais vous n’avez pas le privilège nécessaire ("@1"). - +Rename an area that you own=Renomme une zone qui vous appartient. Self protection is disabled.=L’autoprotection est désactivée. - -Self protection is enabled and you have the necessary privilege ("@1").=L’autoprotection est activée et vous avez le privilège nécessaire ("@1"). - -Self protection is enabled but you don't have the necessary privilege ("@1").=L’autoprotection est activée mais vous n’avez pas le privilège nécessaire ("@1"). - Self protection is enabled.=L’autoprotection est activée. That area doesn't exist.=La zone n’existe pas. The player "@1" does not exist.=Le joueur "@1" n’existe pas. @@ -63,18 +54,15 @@ You are an area administrator ("areas" privilege).=Vous êtes un administrateur You can protect areas=Vous pouvez protéger des zones. You can't protect that area.=Vous ne pouvez pas protéger cette zone. You can't protect that area: @1=Vous ne pouvez pas protéger cette zone : @1. +You don't have the necessary privilege ("@1").=Vous n’avez pas le privilège nécessaire ("@1"). You don't own that area.=Vous ne possédez pas cette zone. -You have @1 area and have no area protection limits.=Vous avez @1 zone et n’avez pas de limite de protection de zones. -You have @1 area, out of a maximum of @2.=Vous avez @1 zone sur un maximum de @2. -You have @1 area.=Vous avez @1 zone. -You have @1 areas and have no area protection limits.=Vous avez @1 zones et n’avez pas de limite de protection de zones. -You have @1 areas, out of a maximum of @2.=Vous avez @1 zones sur un maximum de @2. You have @1 areas.=Vous avez @1 zones. You have been granted control over area #@1. Type /list_areas to show your areas.=Vous avez reçu l’autorisation de contrôler la zone #@1. You have extended area protection limits ("areas_high_limit" privilege).=Votre limite de protection de zones est étendue (privilège "areas_high_limit"). +You have the necessary privilege ("@1").=Vous avez le privilège nécessaire ("@1"). You need to select an area first.=Vous devez sélectionner une zone d’abord. ### chatcommands.lua ### @@ -124,7 +112,7 @@ Area @1 selected.=Zone @1 sélectionnée. Area position @1 set to @2=Position @1 de la zone définie à @2. Position @1 set to @2=Position @1 définie à @2. Position @1: =Position @1 : -Select a area by id.=Sélectionnez une zone par son ID. +Select an area by ID.=Sélectionnez une zone par son ID. Select position @1 by punching a node.=Sélectionnez une position en frappant un bloc. Select positions by punching two nodes.=Sélectionnez une position en frappant deux blocs. diff --git a/locale/template.txt b/locale/template.txt index db223bd..ba62e97 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -8,7 +8,6 @@ = = = -= @1 has given you control over the area "@2" (ID @3).= @1 spanning up to @2x@3x@4.= A regular expression is required.= @@ -21,13 +20,15 @@ Area opened.= Area protected. ID: @1= Area renamed.= Area successfully moved.= -Change the owner of an area using it's ID= +Change the owner of an area using its ID= Find areas using a Lua regular expression= Get information about area configuration and usage.= 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.= Invalid regular expression.= +Limit: @1 areas= +Limit: no area count limit= List your areas, or all areas if you are an admin.= Move (or resize) an area to the current positions.= No matches found.= @@ -35,25 +36,15 @@ No visible areas.= Owner changed.= Players with the "@1" privilege can protect up to @2 areas= -Protect an area beetween two positions and give a player access to it without setting the parent of the area to any existing area= +Protect an area between two positions and give a player access to it without setting the parent of the area to any existing area= Protect your own area= -Recursively remove areas using an id= -Remove an area using an id= +Recursively remove areas using an ID= +Remove an area using an ID= Removed area @1= Removed area @1 and it's sub areas.= -Rename a area that you own= - -Self protection is disabled and you have the necessary privilege ("@1").= - -Self protection is disabled but you don't have the necessary privilege ("@1").= - +Rename an area that you own= Self protection is disabled.= - -Self protection is enabled and you have the necessary privilege ("@1").= - -Self protection is enabled but you don't have the necessary privilege ("@1").= - Self protection is enabled.= That area doesn't exist.= The player "@1" does not exist.= @@ -63,18 +54,15 @@ You are an area administrator ("areas" privilege).= You can protect areas= You can't protect that area.= You can't protect that area: @1= +You don't have the necessary privilege ("@1").= You don't own that area.= -You have @1 area and have no area protection limits.= -You have @1 area, out of a maximum of @2.= -You have @1 area.= -You have @1 areas and have no area protection limits.= -You have @1 areas, out of a maximum of @2.= You have @1 areas.= You have been granted control over area #@1. Type /list_areas to show your areas.= You have extended area protection limits ("areas_high_limit" privilege).= +You have the necessary privilege ("@1").= You need to select an area first.= ### chatcommands.lua ### @@ -124,7 +112,7 @@ Area @1 selected.= Area position @1 set to @2= Position @1 set to @2= Position @1: = -Select a area by id.= +Select an area by ID.= Select position @1 by punching a node.= Select positions by punching two nodes.= diff --git a/pos.lua b/pos.lua index 6cb641d..5ca92f6 100644 --- a/pos.lua +++ b/pos.lua @@ -23,7 +23,7 @@ end minetest.register_chatcommand("select_area", { params = S(""), - description = S("Select a area by id."), + description = S("Select an area by ID."), func = function(name, param) local id = tonumber(param) if not id then From 800a93f5ee89991e17a5d6c3384ca8ea2216f241 Mon Sep 17 00:00:00 2001 From: MoNTE48 Date: Sun, 22 Mar 2020 21:25:05 +0100 Subject: [PATCH 28/32] Minor cleanup --- README.md | 1 - api.lua | 5 +---- chatcommands.lua | 8 +++----- hud.lua | 2 -- init.lua | 3 +-- interact.lua | 1 - internal.lua | 3 +-- legacy.lua | 1 - locale/areas.fr.tr | 2 +- pos.lua | 2 +- settings.lua | 1 - settingtypes.txt | 1 - 12 files changed, 8 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 5db5bad..f86494f 100644 --- a/README.md +++ b/README.md @@ -109,4 +109,3 @@ Copyright (C) 2013 ShadowNinja Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt - diff --git a/api.lua b/api.lua index 40a9841..e9543d6 100644 --- a/api.lua +++ b/api.lua @@ -1,6 +1,5 @@ local hudHandlers = {} - areas.registered_on_adds = {} areas.registered_on_removes = {} areas.registered_on_moves = {} @@ -17,13 +16,11 @@ function areas:registerOnMove(func) table.insert(areas.registered_on_moves, func) end - --- Adds a function as a HUD handler, it will be able to add items to the Areas HUD element. function areas:registerHudHandler(handler) table.insert(hudHandlers, handler) end - function areas:getExternalHudEntries(pos) local areas = {} for _, func in pairs(hudHandlers) do @@ -118,7 +115,7 @@ end -- Note that this fails and returns false when the specified area is fully -- owned by the player, but with multiple protection zones, none of which -- cover the entire checked area. --- @param name (optional) Player name. If not specified checks for any intersecting areas. +-- @param name (optional) Player name. If not specified checks for any intersecting areas. -- @param allow_open Whether open areas should be counted as if they didn't exist. -- @return Boolean indicating whether the player can interact in that area. -- @return Un-owned intersecting area ID, if found. diff --git a/chatcommands.lua b/chatcommands.lua index 9152e39..a40403e 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -75,8 +75,7 @@ minetest.register_chatcommand("add_owner", { .." positions that have already been protected," .." Use set_owner if you don't want the parent to be set."), func = function(name, param) - local pid, ownerName, areaName - = param:match('^(%d+) ([^ ]+) (.+)$') + local pid, ownerName, areaName = param:match('^(%d+) ([^ ]+) (.+)$') if not pid then minetest.chat_send_player(name, S("Invalid usage, see /help @1.", "add_owner")) @@ -294,7 +293,7 @@ if areas.factions_available then if not id then return false, S("Invalid usage, see /help @1.", "area_faction_open") end - + if not areas:isAreaOwner(id, name) then return false, S("Area @1 does not exist" .." or is not owned by you.", id) @@ -386,7 +385,7 @@ minetest.register_chatcommand("area_info", { area_num = area_num + 1 end end - table.insert(lines, S("You have @1 areas.", area_num)) + table.insert(lines, S("You have @1 areas.", area_num)) -- Area limit local area_limit_line = privs.areas and @@ -418,4 +417,3 @@ minetest.register_chatcommand("area_info", { return true, table.concat(lines, "\n") end, }) - diff --git a/hud.lua b/hud.lua index 9d13b80..8a2d352 100644 --- a/hud.lua +++ b/hud.lua @@ -4,7 +4,6 @@ areas.hud = {} areas.hud.refresh = 0 minetest.register_globalstep(function(dtime) - areas.hud.refresh = areas.hud.refresh + dtime if areas.hud.refresh > areas.config["tick"] then areas.hud.refresh = 0 @@ -69,4 +68,3 @@ end) minetest.register_on_leaveplayer(function(player) areas.hud[player:get_player_name()] = nil end) - diff --git a/init.lua b/init.lua index 53d4eb6..7f0ec41 100644 --- a/init.lua +++ b/init.lua @@ -25,7 +25,7 @@ minetest.register_privilege("areas", { description = "Can administer areas." }) minetest.register_privilege("areas_high_limit", { - description = "Can can more, bigger areas." + description = "Can protect more, bigger areas." }) if not minetest.registered_privileges[areas.config.self_protection_privilege] then @@ -38,4 +38,3 @@ if minetest.settings:get_bool("log_mods") then local diffTime = os.clock() - areas.startTime minetest.log("action", "areas loaded in "..diffTime.."s.") end - diff --git a/interact.lua b/interact.lua index 4e575fb..9cd44e2 100644 --- a/interact.lua +++ b/interact.lua @@ -17,4 +17,3 @@ minetest.register_on_protection_violation(function(pos, name) table.concat(owners, ", "))) end end) - diff --git a/internal.lua b/internal.lua index a7979e5..2db9541 100644 --- a/internal.lua +++ b/internal.lua @@ -48,7 +48,7 @@ end function areas:checkAreaStoreId(sid) if not sid then minetest.log("error", "AreaStore failed to find an ID for an " - .."area! Falling back to iterative area checking.") + .."area! Falling back to iterative area checking.") self.store = nil self.store_ids = nil end @@ -150,7 +150,6 @@ function areas:move(id, area, pos1, pos2) area.pos1 = pos1 area.pos2 = pos2 - for i=1, #areas.registered_on_moves do areas.registered_on_moves[i](id, area, pos1, pos2) end diff --git a/legacy.lua b/legacy.lua index c68afb2..eff281d 100644 --- a/legacy.lua +++ b/legacy.lua @@ -137,4 +137,3 @@ if areas.config.legacy_table then end }) end - diff --git a/locale/areas.fr.tr b/locale/areas.fr.tr index 52b08a9..4ca4c8d 100644 --- a/locale/areas.fr.tr +++ b/locale/areas.fr.tr @@ -86,7 +86,7 @@ Area is too big.=La zone est trop grande. Self protection is disabled or you do not have the necessary privilege.=L’autoprotection est désactivée ou vous n’avez pas le privilège nécessaire. -The area intersects with @1 [@2] (@3).=La zone a une intersection avec @1 [@2] (@3). +The area intersects with @1 [@2] (@3).=La zone a une intersection avec @1 [@2] (@3). You have reached the maximum amount of areas that you are allowed to protect.=Vous avez atteint le nombre maximum de zones que vous êtes autorisé à protéger. diff --git a/pos.lua b/pos.lua index 5ca92f6..7a9cbd2 100644 --- a/pos.lua +++ b/pos.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("areas") + -- 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]. @@ -262,4 +263,3 @@ minetest.register_entity("areas:pos2", { areas.marker2[name] = nil end, }) - diff --git a/settings.lua b/settings.lua index 22af52c..17d290c 100644 --- a/settings.lua +++ b/settings.lua @@ -43,4 +43,3 @@ file:close() -------------- setting("filename", "string", world_path.."/areas.dat") - diff --git a/settingtypes.txt b/settingtypes.txt index 6316523..9abffa4 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -35,4 +35,3 @@ areas.self_protection_max_size_high (Maximal area size) v3f (512, 512, 512) # Only enter positive whole numbers for the coordinate values or you'll mess up stuff. # This setting applies for plyaers with the privilege 'areas_high_limit' areas.self_protection_max_areas_high (Maximal area count) float 32 - From aa3e35acbe77983d2c64b8cb24969a5b66df7075 Mon Sep 17 00:00:00 2001 From: MoNTE48 Date: Sun, 22 Mar 2020 21:26:42 +0100 Subject: [PATCH 29/32] /areas_cleanup for removing ownerless areas --- README.md | 3 +++ chatcommands.lua | 25 +++++++++++++++++++++++++ locale/template.txt | 2 ++ 3 files changed, 30 insertions(+) diff --git a/README.md b/README.md index f86494f..e665e52 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,9 @@ Commands * `/area_pos2 [X,Y,Z|X Y Z]` -- Sets area position two to your position or the one supplied. + + * `/areas_cleanup` -- Removes all ownerless areas. + Useful for cleaning after user deletion, for example using /remove_player. License ------- diff --git a/chatcommands.lua b/chatcommands.lua index a40403e..9fed5f8 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -417,3 +417,28 @@ minetest.register_chatcommand("area_info", { return true, table.concat(lines, "\n") end, }) + + +minetest.register_chatcommand("areas_cleanup", { + description = S("Removes all ownerless areas"), + privs = areas.adminPrivs, + func = function() + local total, count = 0, 0 + + local aareas = areas.areas + for id, _ in pairs(aareas) do + local owner = aareas[id].owner + + if not areas:player_exists(owner) then + areas:remove(id) + count = count + 1 + end + + total = total + 1 + end + areas:save() + + return true, "Total areas: " .. total .. ", Removed " .. + count .. " areas. New count: " .. (total - count) + end +}) diff --git a/locale/template.txt b/locale/template.txt index ba62e97..02b9c77 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -65,6 +65,8 @@ You have extended area protection limits ("areas_high_limit" privilege).= You have the necessary privilege ("@1").= You need to select an area first.= +Removes all ownerless areas.= + ### chatcommands.lua ### ### pos.lua ### From 66bd6a9b1df6cca5b25e49fdf2984cc85e9561e4 Mon Sep 17 00:00:00 2001 From: Buckaroo Banzai <39065740+BuckarooBanzay@users.noreply.github.com> Date: Mon, 8 Jun 2020 21:52:11 +0200 Subject: [PATCH 30/32] Add luacheck CI and drop node_ownership remnants (#44) `node_ownership` is long dead, and pollutes the global namespace. Support dropped after ~7 years. Co-authored-by: BuckarooBanzay --- .github/workflows/luacheck.yml | 17 +++++++++++++++++ .luacheckrc | 10 ++++++++-- legacy.lua | 31 ------------------------------- 3 files changed, 25 insertions(+), 33 deletions(-) create mode 100644 .github/workflows/luacheck.yml diff --git a/.github/workflows/luacheck.yml b/.github/workflows/luacheck.yml new file mode 100644 index 0000000..4077f41 --- /dev/null +++ b/.github/workflows/luacheck.yml @@ -0,0 +1,17 @@ +name: luacheck + +on: [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: apt + run: sudo apt-get install -y luarocks + - name: luacheck install + run: luarocks install --local luacheck + - name: luacheck run + run: $HOME/.luarocks/bin/luacheck ./ diff --git a/.luacheckrc b/.luacheckrc index fc9c148..c47f79b 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,5 +1,4 @@ unused_args = false -allow_defined_top = true read_globals = { "DIR_DELIM", @@ -10,9 +9,16 @@ read_globals = { "PseudoRandom", "ItemStack", "AreaStore", "default", + "factions", table = { fields = { "copy", "getn" } } } globals = { - "minetest" + "minetest", + -- mod namespace + "areas" +} + +files["legacy.lua"] = { + ignore = {"512"} } diff --git a/legacy.lua b/legacy.lua index eff281d..2f333fe 100644 --- a/legacy.lua +++ b/legacy.lua @@ -106,34 +106,3 @@ function areas.hasOwner(pos) end return false end - -IsPlayerNodeOwner = areas.isNodeOwner -GetNodeOwnerName = areas.getNodeOwnerName -HasOwner = areas.hasOwner - --- This is entirely untested and may break in strange and new ways. -if areas.config.legacy_table then - owner_defs = setmetatable({}, { - __index = function(table, key) - local a = rawget(areas.areas, key) - if not a then return a end - local b = {} - for k, v in pairs(a) do b[k] = v end - b.x1, b.y1, b.z1 = b.pos1.x, b.pos1.y, b.pos1.z - b.x2, b.y1, b.z2 = b.pos2.x, b.pos2.y, b.pos2.z - b.pos1, b.pos2 = nil, nil - b.id = key - return b - end, - __newindex = function(table, key, value) - local a = value - a.pos1, a.pos2 = {x=a.x1, y=a.y1, z=a.z1}, - {x=a.x2, y=a.y2, z=a.z2} - a.x1, a.y1, a.z1, a.x2, a.y2, a.z2 = - nil, nil, nil, nil, nil, nil - a.name = a.name or S("unnamed") - a.id = nil - return rawset(areas.areas, key, a) - end - }) -end From 142a723eb247e91b0d702f4b6752c42b45bab2d8 Mon Sep 17 00:00:00 2001 From: Hamlet <54187342+h4ml3t@users.noreply.github.com> Date: Sun, 14 Jun 2020 18:59:48 +0200 Subject: [PATCH 31/32] Add Italian translation (#45) --- locale/areas.it.tr | 125 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 locale/areas.it.tr diff --git a/locale/areas.it.tr b/locale/areas.it.tr new file mode 100644 index 0000000..009697c --- /dev/null +++ b/locale/areas.it.tr @@ -0,0 +1,125 @@ +# textdomain: areas + + +### chatcommands.lua ### + += += += += += +@1 has given you control over the area "@2" (ID @3).=@1 ti ha dato il controllo sull'area "@2" (ID @3). +@1 spanning up to @2x@3x@4.=@1 si estende fino a @2x@3@4. +A regular expression is required.=È necessaria una espressione regolare. +Area @1 does not exist or is not owned by you.=L'area @1 non esiste o non è di tua proprietà. +Area closed for faction members.=Area chiusa per i membri della fazione. +Area closed.=Area chiusa. +Area does not exist.=L'area non esiste. +Area opened for faction members.=Area aperta per i membri della fazione. +Area opened.=Area aperta. +Area protected. ID: @1=Area protetta. ID: @1 +Area renamed.=Area rinominata. +Area successfully moved.=Area spostata con successo. +Change the owner of an area using its ID=Cambia il proprietario di un'area usando il suo ID +Find areas using a Lua regular expression=Trova aree usando una espressione regolare Lua +Get information about area configuration and usage.=Ottieni informazioni sulla configurazione e l'uso delle aree. + +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.=Dai a un giocatore l'accesso a una sotto-area tra due posizioni che sono già state protette, usa set_owner se non vuoi che sia impostato il parent. + +Invalid regular expression.=Espressione regolare non valida. +Limit: @1 areas=Limite: @1 aree +Limit: no area count limit=Limite: nessun limite al numero delle aree +List your areas, or all areas if you are an admin.=Elenca le tue aree, o tutte le aree se sei un amministratore. +Move (or resize) an area to the current positions.=Sposta (o ridimensiona) un'area alle posizioni attuali. +No matches found.=Nessuna corrispondenza trovata. +No visible areas.=Nessuna area visibile. +Owner changed.=Proprietario cambiato. +Players with the "@1" privilege can protect up to @2 areas=I giocatori col privilegio "@1" possono proteggere fino a @2 aree + +Protect an area between two positions and give a player access to it without setting the parent of the area to any existing area=Proteggi un'area tra due posizioni e danne l'accesso a un giocatore senza impostare il parent dell'area a qualsiasi area esistente + +Protect your own area=Proteggi la tua area +Recursively remove areas using an ID=Elimina ricorsivamente delle aree usando un ID +Remove an area using an ID=Elimina un'area usando un ID +Removed area @1=Eliminata l'area @1 +Removed area @1 and it's sub areas.=Eliminata l'area @1 e le sue sotto-aree. +Rename an area that you own=Rinomina un'area che ti appartiene +Self protection is disabled.=L'auto-protezione è disattivata. +Self protection is enabled.=L'auto-protezione è attivata. +That area doesn't exist.=Quell'area non esiste. +The player "@1" does not exist.=Il giocatore "@1" non esiste. +Toggle an area open (anyone can interact) or closed=Apri o chiudi un'area (chiunque può interagirvi) +Toggle an area open/closed for members in your faction.=Apri o chiudi un'area per i membri della tua fazione. +You are an area administrator ("areas" privilege).=Sei un amministratore di aree (privilegio "areas") +You can protect areas=Puoi proteggere aree +You can't protect that area.=Non puoi proteggere quell'area. +You can't protect that area: @1=Non puoi proteggere quell'area: @1 +You don't have the necessary privilege ("@1").=Non hai il privilegio necessario ("@1") +You don't own that area.=Non possiedi quell'area. +You have @1 areas.=Hai @1 aree. + +You have been granted control over area #@1. Type /list_areas to show your areas.=Ti è stato concesso il controllo sull'area #@1. Digita /list_areas per mostrare le tue aree. + +You have extended area protection limits ("areas_high_limit" privilege).=Hai limiti di protezione aree estesi (privilegio "areas_high_limit") + +You have the necessary privilege ("@1").=Hai il privilegio necessario ("@1") +You need to select an area first.=Prima devi selezionare un'area. + +### chatcommands.lua ### +### pos.lua ### + += +Invalid usage, see /help @1.=Utilizzo non valido, si veda /help @1. + +### hud.lua ### + +:open=:aperta +Areas:=Aree: + +### interact.lua ### + +@1 is protected by @2.=@1 è protetta da @2. + +### internal.lua ### + +Area is too big.=L'area è troppo grande. + +Self protection is disabled or you do not have the necessary privilege.=L'auto-protezione è disattivata o non possiedi il privilegio necessario. + +The area intersects with @1 [@2] (@3).=L'area interseca con @1 [@2] (@3). + +You have reached the maximum amount of areas that you are allowed to protect.=Hai raggiunto il numero massimo di aree che ti è consentito proteggere. + + +### legacy.lua ### + += +Converted areas saved. Done.=Aree convertite salvate. Fatto. +Converting areas…=Conversione delle aree... +Error loading legacy file: @1=Errore nel caricamento del file precedente: @1 +Invalid version number. (0 allowed)=Numero di versione non valido. (0 permesso) +Legacy file loaded.=File precedente caricato. + +Loads, converts, and saves the areas from a legacy save file.=Carica, converte e salva le aree da un file di salvataggio precedente. + +Table format updated.=Aggiornato il formato della tabella. +unnamed=innominato + +### pos.lua ### + += +Area @1 selected.=Area @1 selezionata. +Area position @1 set to @2=Posizione @1 dell'area impostata a @2 +Position @1 set to @2=Posizione @1 impostata a @2 +Position @1: =Posizione @1: +Select an area by ID.=Scegli un'area tramite l'ID. +Select position @1 by punching a node.=Seleziona la posizione @1 colpendo un nodo. +Select positions by punching two nodes.=Seleziona le posizioni colpendo due nodi. + +Set area protection region position @1 to your location or the one specified=Imposta la protezione area della posizione @1 della regione alla tua posizione o quella specificata + +Set area protection region, position 1, or position 2 by punching nodes, or display the region=Imposta la protezione area della regione, posizione 1, o posizione 2, colpendo due nodi, o mostra la regione + +The area @1 does not exist.=L'area @1 non esiste. +Unable to get position.=Impossibile ottenere la posizione. +Unknown subcommand: @1=Sotto-comando sconosciuto: @1 From e0783cf8bfa09f7131f0b007d32ad40b9ce9c35c Mon Sep 17 00:00:00 2001 From: sys4 Date: Mon, 15 Jun 2020 01:10:47 +0200 Subject: [PATCH 32/32] =?UTF-8?q?Corrige=20crash=20au=20d=C3=A9marrage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatcommands.lua | 2 +- internal.lua | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 6af4df2..ab918f3 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -397,7 +397,7 @@ minetest.register_chatcommand("area_info", { elseif has_high_limit then table.insert(lines, S("You have extended area protection".. - " limits (\"areas_high_limit\" privilege).") + " limits (\"areas_high_limit\" privilege).")) elseif privs.megabuilder then table.insert(lines, "You are a megabuilder (\"megabuilder\" privilege).") end diff --git a/internal.lua b/internal.lua index 39a9a00..a1b2ee7 100644 --- a/internal.lua +++ b/internal.lua @@ -225,7 +225,8 @@ function areas:canPlayerAddArea(pos1, pos2, name) (pos2.x - pos1.x) > max_size.x or (pos2.y - pos1.y) > max_size.y or (pos2.z - pos1.z) > max_size.z then - return false, S("Area is too big.") + return false, S("Area is too big.") + end end -- Check number of areas the user has and make sure it not above the max