mirror of
https://github.com/minetest-mods/areas.git
synced 2025-07-20 16:40:28 +02:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
102
api.lua
102
api.lua
@ -19,10 +19,23 @@ local plants = {
|
||||
["morefarming:seed_carrot"]="air", ["morefarming:seed_corn"]="air",
|
||||
}
|
||||
|
||||
areas.registered_protection_conditions = {}
|
||||
areas.registered_on_adds = {}
|
||||
areas.registered_on_removes = {}
|
||||
areas.registered_on_moves = {}
|
||||
|
||||
areas.callback_origins = {}
|
||||
|
||||
function areas:registerProtectionCondition(func)
|
||||
table.insert(areas.registered_protection_conditions, func)
|
||||
local debug_info = debug.getinfo(func, "S")
|
||||
areas.callback_origins[func] = {
|
||||
mod = core.get_current_modname() or "??",
|
||||
source = debug_info.short_src or "??",
|
||||
line = debug_info.linedefined or "??"
|
||||
}
|
||||
end
|
||||
|
||||
function areas:registerOnAdd(func)
|
||||
table.insert(areas.registered_on_adds, func)
|
||||
end
|
||||
@ -101,56 +114,75 @@ function areas:getAreasIntersectingArea(pos1, pos2)
|
||||
return res
|
||||
end
|
||||
|
||||
-- Checks if the area is unprotected or owned by you
|
||||
-- Returns smallest area at position and its id or nil.
|
||||
-- If multiple areas have the same volume, larger id takes precedence.
|
||||
function areas:getSmallestAreaAtPos(pos)
|
||||
local smallest_area, smallest_id, volume
|
||||
local smallest_volume = math.huge
|
||||
for id, area in pairs(self:getAreasAtPos(pos)) do
|
||||
volume = (area.pos2.x - area.pos1.x + 1)
|
||||
* (area.pos2.y - area.pos1.y + 1)
|
||||
* (area.pos2.z - area.pos1.z + 1)
|
||||
if smallest_volume >= volume then
|
||||
smallest_area = area
|
||||
smallest_id = id
|
||||
smallest_volume = volume
|
||||
end
|
||||
end
|
||||
return smallest_area, smallest_id
|
||||
end
|
||||
|
||||
-- Checks if the area is unprotected, open, owned by player
|
||||
-- or player is part of faction of smallest area at position.
|
||||
function areas:canInteract(pos, name)
|
||||
if minetest.check_player_privs(name, self.adminPrivs) then
|
||||
return true
|
||||
end
|
||||
local owned = false
|
||||
for _, area in pairs(self:getAreasAtPos(pos)) do
|
||||
if area.owner == name or area.open then
|
||||
return true
|
||||
end
|
||||
if area.openfarming then
|
||||
-- if area is openfarming
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local node = minetest.get_node(pos).name
|
||||
if player and minetest.registered_nodes[node] then
|
||||
local wstack = player:get_wielded_item():get_name()
|
||||
if wstack == "" then wstack = "hand" end
|
||||
local area = self:getSmallestAreaAtPos(pos)
|
||||
-- No area, player owns it or area is open
|
||||
if not area
|
||||
or area.owner == name
|
||||
or area.open
|
||||
then
|
||||
return true
|
||||
elseif area.openfarming then
|
||||
-- if area is openfarming
|
||||
local player = minetest.get_player_by_name(name)
|
||||
local node = minetest.get_node(pos).name
|
||||
if player and minetest.registered_nodes[node] then
|
||||
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_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
|
||||
--on_place
|
||||
if plants[wstack] ~= nil and plants[wstack] == node then
|
||||
return true
|
||||
end
|
||||
end
|
||||
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
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
end
|
||||
elseif 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 factions.player_is_in_faction(fname, name) then
|
||||
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
|
||||
owned = true
|
||||
end
|
||||
return not owned
|
||||
return false
|
||||
end
|
||||
|
||||
-- Returns a table (list) of all players that own an area
|
||||
|
Reference in New Issue
Block a user