forked from minetest-mods/areas
Compare commits
4 Commits
nalc-1.2.0
...
require_pr
Author | SHA1 | Date | |
---|---|---|---|
f52454edec | |||
4018c0d204 | |||
c167b30ebf | |||
a9c05f0e38 |
@ -10,7 +10,7 @@ read_globals = {
|
||||
"AreaStore",
|
||||
"default",
|
||||
"factions",
|
||||
table = { fields = { "copy", "getn" } }
|
||||
table = { fields = { "copy", "getn", "indexof" } }
|
||||
}
|
||||
|
||||
globals = {
|
||||
|
17
README.md
17
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 <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
|
||||
-------
|
||||
|
||||
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
|
||||
|
25
api.lua
25
api.lua
@ -84,17 +84,34 @@ end
|
||||
|
||||
-- Checks if the area is unprotected or owned by you
|
||||
function areas:canInteract(pos, name)
|
||||
if name == "" then
|
||||
return true -- Mods, namely minetest.item_place_node
|
||||
end
|
||||
if minetest.check_player_privs(name, self.adminPrivs) then
|
||||
return true
|
||||
end
|
||||
local owned = false
|
||||
|
||||
-- Disallow interaction by default when the restrictive setting is enabled
|
||||
local owned = areas.config.require_protection
|
||||
for _, area in pairs(self:getAreasAtPos(pos)) do
|
||||
if area.owner == name or area.open then
|
||||
return 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
|
||||
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
|
||||
|
@ -286,11 +286,15 @@ minetest.register_chatcommand("area_open", {
|
||||
|
||||
if areas.factions_available then
|
||||
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."),
|
||||
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
|
||||
|
||||
@ -298,11 +302,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
|
||||
})
|
||||
|
27
hud.lua
27
hud.lua
@ -20,13 +20,32 @@ 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 "",
|
||||
faction_info and ":"..faction_info or ""))
|
||||
faction_info and ": "..faction_info or ""))
|
||||
end
|
||||
|
||||
for i, area in pairs(areas:getExternalHudEntries(pos)) do
|
||||
|
16
init.lua
16
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()
|
||||
@ -16,21 +16,27 @@ dofile(areas.modpath.."/internal.lua")
|
||||
dofile(areas.modpath.."/chatcommands.lua")
|
||||
dofile(areas.modpath.."/pos.lua")
|
||||
dofile(areas.modpath.."/interact.lua")
|
||||
dofile(areas.modpath.."/legacy.lua")
|
||||
if areas.config.node_ownership_legacy then
|
||||
dofile(areas.modpath.."/legacy.lua")
|
||||
end
|
||||
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
|
||||
})
|
||||
|
||||
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
|
||||
|
||||
|
21
interact.lua
21
interact.lua
@ -9,11 +9,20 @@ function minetest.is_protected(pos, name)
|
||||
end
|
||||
|
||||
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("@1 is protected by @2.",
|
||||
minetest.pos_to_string(pos),
|
||||
table.concat(owners, ", ")))
|
||||
if areas:canInteract(pos, name) then
|
||||
return
|
||||
end
|
||||
|
||||
local owners = areas:getNodeOwners(pos)
|
||||
if #owners == 0 then
|
||||
-- When require_protection=true
|
||||
minetest.chat_send_player(name,
|
||||
S("@1 may not be accessed.",
|
||||
minetest.pos_to_string(pos)))
|
||||
return
|
||||
end
|
||||
minetest.chat_send_player(name,
|
||||
S("@1 is protected by @2.",
|
||||
minetest.pos_to_string(pos),
|
||||
table.concat(owners, ", ")))
|
||||
end)
|
||||
|
13
internal.lua
13
internal.lua
@ -18,7 +18,7 @@ end
|
||||
|
||||
-- Save the areas table to a file
|
||||
function areas:save()
|
||||
local datastr = minetest.serialize(self.areas)
|
||||
local datastr = minetest.write_json(self.areas)
|
||||
if not datastr then
|
||||
minetest.log("error", "[areas] Failed to serialize area data!")
|
||||
return
|
||||
@ -33,10 +33,19 @@ function areas:load()
|
||||
self.areas = self.areas or {}
|
||||
return err
|
||||
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
|
||||
self.areas = {}
|
||||
end
|
||||
if err and #data > 10 then
|
||||
minetest.log("error", "[areas] Failed to load area data: " ..
|
||||
tostring(err))
|
||||
end
|
||||
file:close()
|
||||
self:populateStore()
|
||||
end
|
||||
|
@ -1,9 +1,11 @@
|
||||
# textdomain: areas
|
||||
|
||||
|
||||
|
||||
### chatcommands.lua ###
|
||||
|
||||
<AreaName>=<NomZone>
|
||||
<ID> [faction_name]=<ID> [nom_de_faction]
|
||||
<NewOwner>=<NouveauPropriétaire>
|
||||
<ParentID>=<IDZonePrincipale>
|
||||
<PlayerName>=<NomJoueur>
|
||||
@ -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.
|
||||
|
@ -1,9 +1,11 @@
|
||||
# textdomain: areas
|
||||
|
||||
|
||||
|
||||
### chatcommands.lua ###
|
||||
|
||||
<AreaName>=<NomeArea>
|
||||
<ID> [faction_name]= <ID> [nome_fazione]
|
||||
<NewOwner>=<NuovoProprietario>
|
||||
<ParentID>=<IDparent>
|
||||
<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.=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.
|
||||
|
@ -1,9 +1,11 @@
|
||||
# textdomain: areas
|
||||
|
||||
|
||||
|
||||
### chatcommands.lua ###
|
||||
|
||||
<AreaName>=
|
||||
<ID> [faction_name]=
|
||||
<NewOwner>=
|
||||
<ParentID>=
|
||||
<PlayerName>=
|
||||
@ -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.=
|
||||
|
@ -8,30 +8,34 @@
|
||||
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
|
||||
areas.self_protection_privilege (Self protection: Required priv) string interact
|
||||
|
||||
# Refresh delay for the name displays in the HUD in seconds
|
||||
# Limits interactions of players to the areas they have access to.
|
||||
# This setting is very restrictive and is not recommended for open-world games.
|
||||
areas.require_protection (Require protection) bool false
|
||||
|
||||
# Area name HUD refresh delay 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
|
||||
areas.node_ownership_legacy (node_ownership compatibility) bool false
|
||||
|
||||
[Self protection (normal)]
|
||||
|
||||
# Self protection (normal): Maximal size of the protectable area
|
||||
# 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
|
||||
# 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'
|
||||
# For players with the 'areas_high_limit' privilege.
|
||||
# Maximal size of the protectable area
|
||||
# This setting applies for players 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'
|
||||
# For players with the 'areas_high_limit' privilege.
|
||||
# Maximal amount of protected areas per player
|
||||
areas.self_protection_max_areas_high (Maximal area count) float 32
|
||||
|
Reference in New Issue
Block a user