Lots of content
This commit is contained in:
Executable
+39
@@ -0,0 +1,39 @@
|
||||
-- Pure claim relationship checks. Unknown roles/actions and ambiguous overlaps deny.
|
||||
return function(claims, access)
|
||||
local function owner_at(pos)
|
||||
local found
|
||||
for owner, center in pairs(claims) do
|
||||
if math.abs(pos.x - center.x) <= 12 and math.abs(pos.z - center.z) <= 12
|
||||
and math.abs(pos.y - center.y) <= 24 then
|
||||
if found and found ~= owner then return nil, true end
|
||||
found = owner
|
||||
end
|
||||
end
|
||||
return found, false
|
||||
end
|
||||
|
||||
local function role_at(pos, name)
|
||||
local owner, ambiguous = owner_at(pos)
|
||||
if ambiguous or not owner then return nil end
|
||||
if owner == name then return "owner" end
|
||||
return access[owner] and access[owner][name] or nil
|
||||
end
|
||||
|
||||
local function allowed(pos, name, action)
|
||||
if type(pos) ~= "table" or type(pos.x) ~= "number" or type(pos.y) ~= "number"
|
||||
or type(pos.z) ~= "number" or type(name) ~= "string" or name == "" then return false end
|
||||
action = action or "build"
|
||||
if action ~= "build" and action ~= "dig" and action ~= "use"
|
||||
and action ~= "storage" and action ~= "arrival" and action ~= "combat" then return false end
|
||||
local owner, ambiguous = owner_at(pos)
|
||||
if ambiguous then return false end
|
||||
if not owner then return true end
|
||||
if owner == name then return true end
|
||||
local role = access[owner] and access[owner][name]
|
||||
if role == "resident" then return action ~= "arrival" and action ~= "combat" end
|
||||
if role == "storekeeper" then return action == "storage" end
|
||||
return false
|
||||
end
|
||||
|
||||
return {owner_at = owner_at, role_at = role_at, allowed = allowed}
|
||||
end
|
||||
Reference in New Issue
Block a user