diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 4684234e5..a79c970cd 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -728,3 +728,48 @@ function mcl_util.set_bone_position(obj, bone, pos, rot) obj:set_bone_position(bone, pos or current_pos, rot or current_rot) end end + +--[[Check for a protection violation in a given area. +-- +-- 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 similar to, but no larger than, "interval". +-- +-- @param pos1 A position table of the area volume's first edge. +-- @param pos2 A position table of the area volume's second edge. +-- @param player The player performing the action. +-- @param interval Optional. Max spacing between checked points at the volume. +-- Default: Same as minetest.is_area_protected. +-- +-- @return true on protection violation detection. false otherwise. +-- +-- @notes *All corners and edges of the defined volume are checked. +]] +function mcl_util.check_area_protection(pos1, pos2, player, interval) + local name = player and player:get_player_name() or "" + + local protected_pos = minetest.is_area_protected(pos1, pos2, name, interval) + if protected_pos then + minetest.record_protection_violation(protected_pos, name) + return true + end + + return false +end + +--[[Check for a protection violation on a single position. +-- +-- @param position A position table to check for protection violation. +-- @param player The player performing the action. +-- +-- @return true on protection violation detection. false otherwise. +]] +function mcl_util.check_position_protection(position, player) + local name = player and player:get_player_name() or "" + + if minetest.is_protected(position, name) then + minetest.record_protection_violation(position, name) + return true + end + + return false +end diff --git a/mods/ITEMS/mcl_ocean/mod.conf b/mods/ITEMS/mcl_ocean/mod.conf index 9b639a7b0..a50609f52 100644 --- a/mods/ITEMS/mcl_ocean/mod.conf +++ b/mods/ITEMS/mcl_ocean/mod.conf @@ -1,4 +1,4 @@ name = mcl_ocean description = Includes various ocean nodes -depends = mcl_core, mcl_sounds, mcl_dye +depends = mcl_core, mcl_sounds, mcl_dye, mcl_util optional_depends = doc, doc_items, screwdriver diff --git a/mods/ITEMS/mcl_ocean/seagrass.lua b/mods/ITEMS/mcl_ocean/seagrass.lua index 8213fec10..8f319b29f 100644 --- a/mods/ITEMS/mcl_ocean/seagrass.lua +++ b/mods/ITEMS/mcl_ocean/seagrass.lua @@ -39,13 +39,7 @@ local function seagrass_on_place(itemstack, placer, pointed_thing) return itemstack end - if minetest.is_protected(pos_under, player_name) or - minetest.is_protected(pos_above, player_name) then - minetest.log("action", player_name - .. " tried to place " .. itemstack:get_name() - .. " at protected position " - .. minetest.pos_to_string(pos_under)) - minetest.record_protection_violation(pos_under, player_name) + if mcl_util.check_area_protection(pos_under, pos_above, placer) then return itemstack end diff --git a/mods/ITEMS/mcl_smoker/init.lua b/mods/ITEMS/mcl_smoker/init.lua index 696df4917..81f3c366f 100644 --- a/mods/ITEMS/mcl_smoker/init.lua +++ b/mods/ITEMS/mcl_smoker/init.lua @@ -88,11 +88,10 @@ end -- local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) + if mcl_util.check_position_protection(pos, player) then return 0 end + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() if listname == "fuel" then diff --git a/mods/ITEMS/mcl_smoker/mod.conf b/mods/ITEMS/mcl_smoker/mod.conf index c6bda0fc1..c2c49db62 100644 --- a/mods/ITEMS/mcl_smoker/mod.conf +++ b/mods/ITEMS/mcl_smoker/mod.conf @@ -1,3 +1,3 @@ name = mcl_smoker -depends = mcl_init, mcl_formspec, mcl_core, mcl_furnaces, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles +depends = mcl_init, mcl_formspec, mcl_core, mcl_furnaces, mcl_sounds, mcl_craftguide, mcl_achievements, mcl_particles, mcl_util optional_depends = doc, screwdriver