-- -- Peaceful areas -- Where hitting is impossible -- peace_areas = {areas = {}} function is_in_peace_area(player) local pos = player:getpos() if pos == nil then return false end for name, positions in pairs(peace_areas.areas) do local pos1 = positions["pos1"] local pos2 = positions["pos2"] local minp = { x = math.min(pos1.x, pos2.x), y = math.min(pos1.y, pos2.y), z = math.min(pos1.z, pos2.z) } local maxp = { x = math.max(pos1.x, pos2.x), y = math.max(pos1.y, pos2.y), z = math.max(pos1.z, pos2.z) } if minp.x < pos.x and pos.x < maxp.x and minp.y < pos.y and pos.y < maxp.y and minp.z < pos.z and pos.z < maxp.z then return true end end return false end function peace_area(pos) for name, positions in pairs(peace_areas.areas) do local pos1 = positions["pos1"] local pos2 = positions["pos2"] local minp = { x = math.min(pos1.x, pos2.x), y = math.min(pos1.y, pos2.y), z = math.min(pos1.z, pos2.z) } local maxp = { x = math.max(pos1.x, pos2.x), y = math.max(pos1.y, pos2.y), z = math.max(pos1.z, pos2.z) } if minp.x < pos.x and pos.x < maxp.x and minp.y < pos.y and pos.y < maxp.y and minp.z < pos.z and pos.z < maxp.z then return name end end end minetest.register_on_punchplayer(function(player, hitter) if is_in_peace_area(player) and hitter:is_player() then minetest.chat_send_player(hitter:get_player_name(), "You cannot punch player " .. player:get_player_name() .. ". They are in area '" .. peace_area(player:getpos()) .. "'.") return true --[[ Note: This use of the callback register_on_punchplayer may prevent other instance of it to work correctly. Please take note of it. ]]-- end end) function peace_areas.register_area(area_name, def) peace_areas.areas[area_name] = def end peace_areas.register_area("spawn", { ["pos1"] = {x = 16, y = 0, z = 12}, ["pos2"] = {x = 42, y = 100, z = -14}, })