Compare commits

13 Commits

Author SHA1 Message Date
a8cacee8cc Fixed a minor bug introduced when I created openfarming, which skips the faction test if an area is openfarming.
And not return false if not a player(ie:mobs api) or unknown node, continue iterate on others areas(minor bug, generaly if 1 area it's protected).
2022-07-09 02:49:12 +02:00
76f8ccf8ab Add morefarming and improve farming support on openfarming areas 2020-10-14 22:33:09 +02:00
02b23b0371 Merge remote-tracking branch 'upstream/master' 2020-09-08 18:45:48 +02:00
4018c0d204 Add privilege translations and update translations (#49)
+ Add new french translation strings
2020-09-07 17:47:18 +02:00
c167b30ebf Adapt to the new version of playerfactions (#48)
Enable to open an area to many factions
    Update to adapt to the new version of playerfactions mod, with its new multi-faction mode
2020-09-05 18:49:17 +02:00
4eeb2a9d11 Merge remote-tracking branch 'upstream/master' 2020-08-29 20:29:29 +02:00
a9c05f0e38 Use JSON to store areas (#47)
This works around a limit of ~21000 areas because of limits in 'minetest.deserialize()'. Files will be migrated to the new format on first change.
2020-08-28 12:54:48 +02:00
99408df96a Delete unused textures 2020-07-05 17:10:03 +02:00
42cde6a494 Merge branch 'nalc-1.2-dev' 2020-07-05 17:02:34 +02:00
c4d0fe020f Corrige lecture de paramètre de configuration 2018-12-24 02:22:29 +01:00
b0c229d80a Restore upstream default config 2016-08-23 15:43:33 +02:00
d7fba610a1 Don't use auth_table, use get_auth_handler().get_auth instead
No guarantee is made auth_table contains auth entries or even exists.
Using this table directly is incompatible with auth handlers that don't
cache auth entries (e.g. when they are stored in an SQL database
supposed to be concurrently accessed and modified).
2016-08-23 14:31:59 +02:00
2a56743f65 Apply MFF edits 2016-08-23 14:28:49 +02:00
12 changed files with 161 additions and 47 deletions

View File

@ -10,7 +10,7 @@ read_globals = {
"AreaStore", "AreaStore",
"default", "default",
"factions", "factions",
table = { fields = { "copy", "getn" } } table = { fields = { "copy", "getn", "indexof" } }
} }
globals = { globals = {

View File

@ -5,6 +5,11 @@ Dependencies
------------ ------------
Minetest 5.0.0+ is recommended, but 0.4.16+ should work as well. 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 Configuration
@ -105,10 +110,18 @@ Commands
* `/areas_cleanup` -- Removes all ownerless areas. * `/areas_cleanup` -- Removes all ownerless areas.
Useful for cleaning after user deletion, for example using /remove_player. Useful for cleaning after user deletion, for example using /remove_player.
* `/area_open <ID>` -- Toggle open/closed the specified area for everyone.
* `/area_faction_open <ID> <faction>` -- Toggle open/closed the specified
area for members of the faction. Factions are created and managed by
playerfactions mod.
License 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. Licensed under the GNU LGPL version 2.1 or later.
See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt

47
api.lua
View File

@ -2,12 +2,21 @@ local hudHandlers = {}
---plants to place in openfarming ---plants to place in openfarming
local plants = { local plants = {
["farming:blueberries"]="air", ["farming:carrot"]="air", ["farming:coffee_beans"]="air", ["farming:beetroot"]="air", ["farming:blueberries"]="air", ["farming:cabbage"]="air",
["farming:corn"]="air", ["farming:cucumber"]="air", ["farming:melon_slice"]="air", ["farming:carrot"]="air", ["farming:chili_pepper"]="air", ["farming:coffee_beans"]="air",
["farming:corn"]="air", ["farming:cucumber"]="air", ["farming:garlic_clove"]="air",
["farming:melon_slice"]="air", ["farming:onion"]="air", ["default:papyrus"]="air",
["farming:pea_pod"]="air", ["farming:peppercorn"]="air", ["farming:pineapple_top"]="air",
["farming:potato"]="air", ["farming:pumpkin_slice"]="air", ["farming:raspberries"]="air", ["farming:potato"]="air", ["farming:pumpkin_slice"]="air", ["farming:raspberries"]="air",
["farming:rhubarb"]="air", ["farming:tomato"]="air", ["farming:seed_cotton"]="air", ["farming:rhubarb"]="air",
["farming:seed_wheat"]="air",["default:papyrus"]="air", ["farming:trellis"]="air", ["farming:seed_barley"]="air", ["farming:seed_cotton"]="air", ["farming:seed_hemp"]="air",
["farming:grapes"]="farming:trellis", ["farming:beanpole"]="air", ["farming:beans"]="farming:beanpole", ["farming:seed_mint"]="air", ["farming:seed_oat"]="air", ["farming:seed_rice"]="air",
["farming:seed_rye"]="air", ["farming:seed_wheat"]="air",
["farming:tomato"]="air",
["farming:trellis"]="air", ["farming:grapes"]="farming:trellis",
["farming:beanpole"]="air", ["farming:beans"]="farming:beanpole",
["morefarming:seed_wildcarrot"]="air", ["morefarming:seed_teosinte"]="air",
["morefarming:seed_carrot"]="air", ["morefarming:seed_corn"]="air",
} }
areas.registered_on_adds = {} areas.registered_on_adds = {}
@ -101,12 +110,12 @@ function areas:canInteract(pos, name)
for _, area in pairs(self:getAreasAtPos(pos)) do for _, area in pairs(self:getAreasAtPos(pos)) do
if area.owner == name or area.open then if area.owner == name or area.open then
return true return true
elseif area.openfarming then end
if area.openfarming then
-- if area is openfarming -- 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) local player = minetest.get_player_by_name(name)
if not player then return false end local node = minetest.get_node(pos).name
if player and minetest.registered_nodes[node] then
local wstack = player:get_wielded_item():get_name() local wstack = player:get_wielded_item():get_name()
if wstack == "" then wstack = "hand" end if wstack == "" then wstack = "hand" end
@ -119,12 +128,26 @@ function areas:canInteract(pos, name)
if plants[wstack] ~= nil and plants[wstack] == node then if plants[wstack] ~= nil and plants[wstack] == node then
return true return true
end end
elseif areas.factions_available and area.faction_open then end
local faction_name = factions.get_player_faction(area.owner) end
if faction_name ~= nil and faction_name == factions.get_player_faction(name) then if areas.factions_available and area.faction_open then
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 return true
end end
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 owned = true
end end
return not owned return not owned

View File

@ -308,11 +308,15 @@ minetest.register_chatcommand(
if areas.factions_available then if areas.factions_available then
minetest.register_chatcommand("area_faction_open", { minetest.register_chatcommand("area_faction_open", {
params = S("<ID>"), params = S("<ID> [faction_name]"),
description = S("Toggle an area open/closed for members in your faction."), description = S("Toggle an area open/closed for members in your faction."),
func = function(name, param) func = function(name, param)
local id = tonumber(param) local params = param:split(" ")
if not id then
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") return false, S("Invalid usage, see /help @1.", "area_faction_open")
end end
@ -320,11 +324,25 @@ if areas.factions_available then
return false, S("Area @1 does not exist" return false, S("Area @1 does not exist"
.." or is not owned by you.", id) .." or is not owned by you.", id)
end end
local open = not areas.areas[id].faction_open
-- Save false as nil to avoid inflating the DB. if not factions.get_owner(faction_name) then
areas.areas[id].faction_open = open or nil 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() 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.") or S("Area closed for faction members.")
end end
}) })

25
hud.lua
View File

@ -20,9 +20,28 @@ minetest.register_globalstep(function(dtime)
local areaStrings = {} local areaStrings = {}
for id, area in pairs(areas:getAreasAtPos(pos)) do for id, area in pairs(areas:getAreasAtPos(pos)) do
local faction_info = area.faction_open and areas.factions_available and local faction_info
factions.get_player_faction(area.owner) if area.faction_open and areas.factions_available then
area.faction_open = faction_info -- 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)") table.insert(areaStrings, ("%s [%u] (%s%s%s)")
:format(area.name, id, area.owner, :format(area.name, id, area.owner,
area.open and S(":open") or area.openfarming and ":openfarming" or "", area.open and S(":open") or area.openfarming and ":openfarming" or "",

View File

@ -4,7 +4,7 @@
areas = {} areas = {}
areas.factions_available = minetest.global_exists("factions") areas.factions_available = minetest.get_modpath("playerfactions") and true
areas.adminPrivs = {areas=true} areas.adminPrivs = {areas=true}
areas.startTime = os.clock() areas.startTime = os.clock()
@ -21,11 +21,15 @@ dofile(areas.modpath.."/hud.lua")
areas:load() areas:load()
local S = minetest.get_translator("areas")
minetest.register_privilege("areas", { minetest.register_privilege("areas", {
description = "Can administer areas." description = S("Can administer areas."),
give_to_singleplayer = false
}) })
minetest.register_privilege("areas_high_limit", { 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 -- Mega_builder privilege -- MFF
minetest.register_privilege("megabuilder", { minetest.register_privilege("megabuilder", {
@ -34,7 +38,7 @@ minetest.register_privilege("megabuilder", {
if not minetest.registered_privileges[areas.config.self_protection_privilege] then if not minetest.registered_privileges[areas.config.self_protection_privilege] then
minetest.register_privilege(areas.config.self_protection_privilege, { minetest.register_privilege(areas.config.self_protection_privilege, {
description = "Can protect areas.", description = S("Can protect areas."),
}) })
end end

View File

@ -18,7 +18,7 @@ end
-- Save the areas table to a file -- Save the areas table to a file
function areas:save() function areas:save()
local datastr = minetest.serialize(self.areas) local datastr = minetest.write_json(self.areas)
if not datastr then if not datastr then
minetest.log("error", "[areas] Failed to serialize area data!") minetest.log("error", "[areas] Failed to serialize area data!")
return return
@ -33,10 +33,19 @@ function areas:load()
self.areas = self.areas or {} self.areas = self.areas or {}
return err return err
end end
self.areas = minetest.deserialize(file:read("*a")) local data = file:read("*a")
if data:sub(1, 1) == "[" then
self.areas, err = minetest.parse_json(data)
else
self.areas, err = minetest.deserialize(data)
end
if type(self.areas) ~= "table" then if type(self.areas) ~= "table" then
self.areas = {} self.areas = {}
end end
if err and #data > 10 then
minetest.log("error", "[areas] Failed to load area data: " ..
tostring(err))
end
file:close() file:close()
self:populateStore() self:populateStore()
end end

View File

@ -1,9 +1,11 @@
# textdomain: areas # textdomain: areas
### chatcommands.lua ### ### chatcommands.lua ###
<AreaName>=<NomZone> <AreaName>=<NomZone>
<ID> [faction_name]=<ID> [nom_de_faction]
<NewOwner>=<NouveauPropriétaire> <NewOwner>=<NouveauPropriétaire>
<ParentID>=<IDZonePrincipale> <ParentID>=<IDZonePrincipale>
<PlayerName>=<NomJoueur> <PlayerName>=<NomJoueur>
@ -15,12 +17,13 @@ Area @1 does not exist or is not owned by you.=La zone @1 nexiste pas ou ne v
Area closed for faction members.=Zone fermée aux membres de la faction. Area closed for faction members.=Zone fermée aux membres de la faction.
Area closed.=Zone fermée. Area closed.=Zone fermée.
Area does not exist.=La zone nexiste pas. Area does not exist.=La zone nexiste 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 opened.=Zone ouverte.
Area protected. ID: @1=Zone protégée. ID : @1 Area protected. ID: @1=Zone protégée. ID : @1
Area renamed.=Zone renommée. Area renamed.=Zone renommée.
Area successfully moved.=Zone déplacée avec succès. Area successfully moved.=Zone déplacée avec succès.
Change the owner of an area using its ID=Change le propriétaire dune zone en utilisant son ID. Change the owner of an area using its ID=Change le propriétaire dune 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. 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 lutilisation des zones. Get information about area configuration and usage.=Obtient des informations sur la configuration des zones et lutilisation 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. Remove an area using an ID=Supprime une zone en utilisant son ID.
Removed area @1=Zone @1 supprimée. Removed area @1=Zone @1 supprimée.
Removed area @1 and it's sub areas.=Zone @1 et ses sous-zones supprimées. 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. Rename an area that you own=Renomme une zone qui vous appartient.
Self protection is disabled.=Lautoprotection est désactivée. Self protection is disabled.=Lautoprotection est désactivée.
Self protection is enabled.=Lautoprotection est activée. Self protection is enabled.=Lautoprotection est activée.
@ -76,6 +80,12 @@ Invalid usage, see /help @1.=Utilisation incorrecte, voir /help @1.
:open= : ouverte :open= : ouverte
Areas:=Zones : Areas:=Zones :
### init.lua ###
Can administer areas.=Permet dadministrer 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 ### ### interact.lua ###
@1 is protected by @2.=@1 est protégée par @2. @1 is protected by @2.=@1 est protégée par @2.

View File

@ -1,9 +1,11 @@
# textdomain: areas # textdomain: areas
### chatcommands.lua ### ### chatcommands.lua ###
<AreaName>=<NomeArea> <AreaName>=<NomeArea>
<ID> [faction_name]= <ID> [nome_fazione]
<NewOwner>=<NuovoProprietario> <NewOwner>=<NuovoProprietario>
<ParentID>=<IDparent> <ParentID>=<IDparent>
<PlayerName>=<NomeGiocatore> <PlayerName>=<NomeGiocatore>
@ -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 for faction members.=Area chiusa per i membri della fazione.
Area closed.=Area chiusa. Area closed.=Area chiusa.
Area does not exist.=L'area non esiste. 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 opened.=Area aperta.
Area protected. ID: @1=Area protetta. ID: @1 Area protected. ID: @1=Area protetta. ID: @1
Area renamed.=Area rinominata. Area renamed.=Area rinominata.
Area successfully moved.=Area spostata con successo. 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 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 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. 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 Remove an area using an ID=Elimina un'area usando un ID
Removed area @1=Eliminata l'area @1 Removed area @1=Eliminata l'area @1
Removed area @1 and it's sub areas.=Eliminata l'area @1 e le sue sotto-aree. 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 Rename an area that you own=Rinomina un'area che ti appartiene
Self protection is disabled.=L'auto-protezione è disattivata. Self protection is disabled.=L'auto-protezione è disattivata.
Self protection is enabled.=L'auto-protezione è attivata. 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 :open=:aperta
Areas:=Aree: Areas:=Aree:
### init.lua ###
Can administer areas.=
Can protect areas.=
Can protect more, bigger areas.=
### interact.lua ### ### interact.lua ###
@1 is protected by @2.=@1 è protetta da @2. @1 is protected by @2.=@1 è protetta da @2.

View File

@ -1,9 +1,11 @@
# textdomain: areas # textdomain: areas
### chatcommands.lua ### ### chatcommands.lua ###
<AreaName>= <AreaName>=
<ID> [faction_name]=
<NewOwner>= <NewOwner>=
<ParentID>= <ParentID>=
<PlayerName>= <PlayerName>=
@ -15,12 +17,13 @@ Area @1 does not exist or is not owned by you.=
Area closed for faction members.= Area closed for faction members.=
Area closed.= Area closed.=
Area does not exist.= Area does not exist.=
Area opened for faction members.= Area is open for members of: @1=
Area opened.= Area opened.=
Area protected. ID: @1= Area protected. ID: @1=
Area renamed.= Area renamed.=
Area successfully moved.= Area successfully moved.=
Change the owner of an area using its ID= Change the owner of an area using its ID=
Faction doesn't exists=
Find areas using a Lua regular expression= Find areas using a Lua regular expression=
Get information about area configuration and usage.= Get information about area configuration and usage.=
@ -43,6 +46,7 @@ Recursively remove areas using an ID=
Remove an area using an ID= Remove an area using an ID=
Removed area @1= Removed area @1=
Removed area @1 and it's sub areas.= Removed area @1 and it's sub areas.=
Removes all ownerless areas=
Rename an area that you own= Rename an area that you own=
Self protection is disabled.= Self protection is disabled.=
Self protection is enabled.= 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 have the necessary privilege ("@1").=
You need to select an area first.= You need to select an area first.=
Removes all ownerless areas.=
### chatcommands.lua ### ### chatcommands.lua ###
### pos.lua ### ### pos.lua ###
@ -78,6 +80,12 @@ Invalid usage, see /help @1.=
:open= :open=
Areas:= Areas:=
### init.lua ###
Can administer areas.=
Can protect areas.=
Can protect more, bigger areas.=
### interact.lua ### ### interact.lua ###
@1 is protected by @2.= @1 is protected by @2.=

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 B

After

Width:  |  Height:  |  Size: 134 B