is_area_protected: Rename from intersects_protection (#7073)

* is_area_protected: Rename from intersects_protection
Return first protected position
Clarify docs: Mods may overwrite the function
This commit is contained in:
SmallJoker 2018-02-25 12:25:39 +01:00 committed by GitHub
parent 4118e150f8
commit 66372e75d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 11 deletions

@ -175,7 +175,7 @@ end
-- Checks if specified volume intersects a protected volume -- Checks if specified volume intersects a protected volume
function core.intersects_protection(minp, maxp, player_name, interval) function core.is_area_protected(minp, maxp, player_name, interval)
-- 'interval' is the largest allowed interval for the 3D lattice of checks. -- 'interval' is the largest allowed interval for the 3D lattice of checks.
-- Compute the optimal float step 'd' for each axis so that all corners and -- Compute the optimal float step 'd' for each axis so that all corners and
@ -188,14 +188,18 @@ function core.intersects_protection(minp, maxp, player_name, interval)
local d = {} local d = {}
for _, c in pairs({"x", "y", "z"}) do for _, c in pairs({"x", "y", "z"}) do
if minp[c] > maxp[c] then
-- Repair positions: 'minp' > 'maxp'
local tmp = maxp[c]
maxp[c] = minp[c]
minp[c] = tmp
end
if maxp[c] > minp[c] then if maxp[c] > minp[c] then
d[c] = (maxp[c] - minp[c]) / d[c] = (maxp[c] - minp[c]) /
math.ceil((maxp[c] - minp[c]) / interval) - 1e-4 math.ceil((maxp[c] - minp[c]) / interval) - 1e-4
elseif maxp[c] == minp[c] then else
d[c] = 1 -- Any value larger than 0 to avoid division by zero d[c] = 1 -- Any value larger than 0 to avoid division by zero
else -- maxp[c] < minp[c], print error and treat as protection intersected
minetest.log("error", "maxp < minp in 'minetest.intersects_protection()'")
return true
end end
end end
@ -205,13 +209,13 @@ function core.intersects_protection(minp, maxp, player_name, interval)
local y = math.floor(yf + 0.5) local y = math.floor(yf + 0.5)
for xf = minp.x, maxp.x, d.x do for xf = minp.x, maxp.x, d.x do
local x = math.floor(xf + 0.5) local x = math.floor(xf + 0.5)
if core.is_protected({x = x, y = y, z = z}, player_name) then local pos = {x = x, y = y, z = z}
return true if core.is_protected(pos, player_name) then
return pos
end end
end end
end end
end end
return false return false
end end

@ -3429,9 +3429,10 @@ These functions return the leftover itemstack.
* `minetest.record_protection_violation(pos, name)` * `minetest.record_protection_violation(pos, name)`
* This function calls functions registered with * This function calls functions registered with
`minetest.register_on_protection_violation`. `minetest.register_on_protection_violation`.
* `minetest.intersects_protection(minp, maxp, player_name, interval) * `minetest.is_area_protected(pos1, pos2, player_name, interval)
* Returns a boolean, returns true if the volume defined by `minp` and `maxp` * Returns the position of the first node that `player_name` may not modify in
intersects a protected area not owned by `player_name`. the specified cuboid between `pos1` and `pos2`.
* Returns `false` if no protections were found.
* Applies `is_protected()` to a 3D lattice of points in the defined volume. * Applies `is_protected()` to a 3D lattice of points in the defined volume.
The points are spaced evenly throughout the volume and have a spacing The points are spaced evenly throughout the volume and have a spacing
similar to, but no larger than, `interval`. similar to, but no larger than, `interval`.
@ -3439,6 +3440,8 @@ These functions return the leftover itemstack.
* `interval` defaults to 4. * `interval` defaults to 4.
* `interval` should be carefully chosen and maximised to avoid an excessive * `interval` should be carefully chosen and maximised to avoid an excessive
number of points being checked. number of points being checked.
* Like `minetest.is_protected`, this function may be extended or overwritten by
mods to provide a faster implementation to check the cuboid for intersections.
* `minetest.rotate_and_place(itemstack, placer, pointed_thing, infinitestacks, orient_flags)` * `minetest.rotate_and_place(itemstack, placer, pointed_thing, infinitestacks, orient_flags)`
* Attempt to predict the desired orientation of the facedir-capable node * Attempt to predict the desired orientation of the facedir-capable node
defined by `itemstack`, and place it accordingly (on-wall, on the floor, or defined by `itemstack`, and place it accordingly (on-wall, on the floor, or