diff --git a/.luacheckrc b/.luacheckrc index c47f79b..eaf3a6e 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -10,7 +10,7 @@ read_globals = { "AreaStore", "default", "factions", - table = { fields = { "copy", "getn" } } + table = { fields = { "copy", "getn", "indexof" } } } globals = { diff --git a/README.md b/README.md index e665e52..7c6a464 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,11 @@ Dependencies ------------ Minetest 5.0.0+ is recommended, but 0.4.16+ should work as well. +Minetest 5.0.0+ + +Optional support for following mods: + + * [playerfactions](https://git.leagueh.xyz/katp32/playerfactions/) by [katp32](https://git.leagueh.xyz/katp32) & [Kalio_42](https://git.leagueh.xyz/Kalio_42) Configuration @@ -101,14 +106,22 @@ 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. + * `/area_open ` -- Toggle open/closed the specified area for everyone. + + * `/area_faction_open ` -- Toggle open/closed the specified + area for members of the faction. Factions are created and managed by + playerfactions mod. + License ------- -Copyright (C) 2013 ShadowNinja +Copyright (C) 2013-2017 ShadowNinja + +Copyright (C) 2015-2020 various contributors 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 3a6158f..b899521 100644 --- a/api.lua +++ b/api.lua @@ -120,9 +120,21 @@ function areas:canInteract(pos, name) 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 - return true + if (factions.version or 0) < 2 then + local faction_name = factions.get_player_faction(name) + if faction_name then + for _, fname in ipairs(area.faction_open or {}) do + if faction_name == fname then + return true + end + end + end + else + for _, fname in ipairs(area.faction_open or {}) do + if factions.player_is_in_faction(fname, name) then + return true + end + end end end owned = true diff --git a/chatcommands.lua b/chatcommands.lua index ab918f3..d7920be 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -308,11 +308,15 @@ minetest.register_chatcommand( if areas.factions_available then minetest.register_chatcommand("area_faction_open", { - params = S(""), + params = S(" [faction_name]"), description = S("Toggle an area open/closed for members in your faction."), func = function(name, param) - local id = tonumber(param) - if not id then + local params = param:split(" ") + + local id = tonumber(params[1]) + local faction_name = params[2] + + if not id or not faction_name then return false, S("Invalid usage, see /help @1.", "area_faction_open") end @@ -320,11 +324,25 @@ if areas.factions_available then 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 + + if not factions.get_owner(faction_name) then + return false, S("Faction doesn't exists") + end + local fnames = areas.areas[id].faction_open or {} + local pos = table.indexof(fnames, faction_name) + if pos < 0 then + -- Add new faction to the list + table.insert(fnames, faction_name) + else + table.remove(fnames, pos) + end + if #fnames == 0 then + -- Save {} as nil to avoid inflating the DB. + fnames = nil + end + areas.areas[id].faction_open = fnames areas:save() - return true, open and S("Area opened for faction members.") + return true, fnames and S("Area is open for members of: @1", table.concat(fnames, ", ")) or S("Area closed for faction members.") end }) diff --git a/hud.lua b/hud.lua index 79ef907..1b62dbb 100644 --- a/hud.lua +++ b/hud.lua @@ -20,9 +20,28 @@ minetest.register_globalstep(function(dtime) local areaStrings = {} for id, area in pairs(areas:getAreasAtPos(pos)) do - local faction_info = area.faction_open and areas.factions_available and - factions.get_player_faction(area.owner) - area.faction_open = faction_info + local faction_info + if area.faction_open and areas.factions_available then + -- Gather and clean up disbanded factions + local changed = false + for i, fac_name in ipairs(area.faction_open) do + if not factions.get_owner(fac_name) then + table.remove(area.faction_open, i) + changed = true + end + end + if #area.faction_open == 0 then + -- Prevent DB clutter, remove value + area.faction_open = nil + else + faction_info = table.concat(area.faction_open, ", ") + end + + if changed then + areas:save() + end + end + table.insert(areaStrings, ("%s [%u] (%s%s%s)") :format(area.name, id, area.owner, area.open and S(":open") or area.openfarming and ":openfarming" or "", diff --git a/init.lua b/init.lua index d94d453..8c57eb2 100644 --- a/init.lua +++ b/init.lua @@ -4,7 +4,7 @@ areas = {} -areas.factions_available = minetest.global_exists("factions") +areas.factions_available = minetest.get_modpath("playerfactions") and true areas.adminPrivs = {areas=true} areas.startTime = os.clock() @@ -21,11 +21,15 @@ dofile(areas.modpath.."/hud.lua") areas:load() +local S = minetest.get_translator("areas") + minetest.register_privilege("areas", { - description = "Can administer areas." + description = S("Can administer areas."), + give_to_singleplayer = false }) minetest.register_privilege("areas_high_limit", { - description = "Can protect more, bigger areas." + description = S("Can protect more, bigger areas."), + give_to_singleplayer = false }) -- Mega_builder privilege -- MFF minetest.register_privilege("megabuilder", { @@ -34,7 +38,7 @@ minetest.register_privilege("megabuilder", { if not minetest.registered_privileges[areas.config.self_protection_privilege] then minetest.register_privilege(areas.config.self_protection_privilege, { - description = "Can protect areas.", + description = S("Can protect areas."), }) end diff --git a/locale/areas.fr.tr b/locale/areas.fr.tr index 4ca4c8d..421683a 100644 --- a/locale/areas.fr.tr +++ b/locale/areas.fr.tr @@ -1,9 +1,11 @@ # textdomain: areas + ### chatcommands.lua ### = + [faction_name]= [nom_de_faction] = = = @@ -15,12 +17,13 @@ Area @1 does not exist or is not owned by you.=La zone @1 n’existe pas ou ne v 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 is open for members of: @1=Zone ouverte aux membres de ces factions : @1 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 its ID=Change le propriétaire d’une zone en utilisant son ID. +Faction doesn't exists=La faction n'existe pas 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. @@ -43,6 +46,7 @@ Recursively remove areas using an ID=Supprime les zones récursivement en utilis 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. +Removes all ownerless areas=Supprime toutes les zones sans propriétaire 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.=L’autoprotection est activée. @@ -76,6 +80,12 @@ Invalid usage, see /help @1.=Utilisation incorrecte, voir /help @1. :open= : ouverte Areas:=Zones : +### init.lua ### + +Can administer areas.=Permet d’administrer des zones. +Can protect areas.=Permet de protéger des zones. +Can protect more, bigger areas.=Permet de protéger plus, et de plus grandes zones. + ### interact.lua ### @1 is protected by @2.=@1 est protégée par @2. diff --git a/locale/areas.it.tr b/locale/areas.it.tr index 009697c..5749c76 100644 --- a/locale/areas.it.tr +++ b/locale/areas.it.tr @@ -1,9 +1,11 @@ # textdomain: areas + ### chatcommands.lua ### = + [faction_name]= [nome_fazione] = = = @@ -15,12 +17,13 @@ Area @1 does not exist or is not owned by you.=L'area @1 non esiste o non è di 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 is open for members of: @1=L'area è aperta ai membri di: @1 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 +Faction doesn't exists=La fazione non esiste 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. @@ -43,6 +46,7 @@ Recursively remove areas using an ID=Elimina ricorsivamente delle aree usando un 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. +Removes all ownerless areas= 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. @@ -76,6 +80,12 @@ Invalid usage, see /help @1.=Utilizzo non valido, si veda /help @1. :open=:aperta Areas:=Aree: +### init.lua ### + +Can administer areas.= +Can protect areas.= +Can protect more, bigger areas.= + ### interact.lua ### @1 is protected by @2.=@1 è protetta da @2. @@ -111,7 +121,7 @@ unnamed=innominato 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: +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. diff --git a/locale/template.txt b/locale/template.txt index 02b9c77..acf75b0 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -1,9 +1,11 @@ # textdomain: areas + ### chatcommands.lua ### = + [faction_name]= = = = @@ -15,12 +17,13 @@ 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 is open for members of: @1= Area opened.= Area protected. ID: @1= Area renamed.= Area successfully moved.= Change the owner of an area using its ID= +Faction doesn't exists= Find areas using a Lua regular expression= Get information about area configuration and usage.= @@ -43,6 +46,7 @@ Recursively remove areas using an ID= Remove an area using an ID= Removed area @1= Removed area @1 and it's sub areas.= +Removes all ownerless areas= Rename an area that you own= Self protection is disabled.= Self protection is enabled.= @@ -65,8 +69,6 @@ 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 ### @@ -78,6 +80,12 @@ Invalid usage, see /help @1.= :open= Areas:= +### init.lua ### + +Can administer areas.= +Can protect areas.= +Can protect more, bigger areas.= + ### interact.lua ### @1 is protected by @2.=