From e17cda925b7ab7d3d586ed1c40c591854704d770 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Sat, 12 Jul 2014 16:37:54 -0400 Subject: Add canInteractInArea --- api.lua | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'api.lua') diff --git a/api.lua b/api.lua index d6a2cfd..bdb886a 100644 --- a/api.lua +++ b/api.lua @@ -39,3 +39,34 @@ function areas:getNodeOwners(pos) return owners end +--- Checks if the area intersects with an area that the player can't interact in. +-- Note that this fails and returns false when the specified area is fully +-- owned by the player, but with miltiple protection zones, none of which +-- cover the entire checked area. +-- @return Boolean indicating whether the player can interact in that area. +-- @return Un-owned intersecting area id, if found. +function areas:canInteractInArea(pos1, pos2, name) + areas:sortPos(pos1, pos2) + -- First check for a fully enclosing owned area + for id, area in pairs(self.areas) do + -- A little optimization: isAreaOwner isn't necessary here + -- since we're iterating through all areas. + if area.owner == name and self:isSubarea(pos1, pos2, id) then + return true + end + end + -- Then check for intersecting non-owned areas + for id, area in pairs(self.areas) do + local p1, p2 = area.pos1, area.pos2 + if (p1.x <= pos2.x and p2.x >= pos1.x) and + (p1.y <= pos2.y and p2.y >= pos1.y) and + (p1.z <= pos2.z and p2.z >= pos1.z) then + -- Found an intersecting area + if not areas:isAreaOwner(id, name) then + return false, id + end + end + end + return true +end + -- cgit v1.2.3