add protection check for other mods (areas) when using tool

This commit is contained in:
TenPlus1 2019-04-30 21:35:11 +01:00
commit 2602de4baf

278
tool.lua
View file

@ -1,135 +1,143 @@
-- protector placement tool (thanks to Shara for code and idea) -- protector placement tool (thanks to Shara for code and idea)
-- get protection radius -- get protection radius
local r = tonumber(minetest.settings:get("protector_radius")) or 5 local r = tonumber(minetest.settings:get("protector_radius")) or 5
minetest.register_craftitem("protector:tool", { minetest.register_craftitem("protector:tool", {
description = "Protector Placer Tool (stand near protector, face direction and use)", description = "Protector Placer Tool (stand near protector, face direction and use)",
inventory_image = "protector_display.png^protector_logo.png", inventory_image = "protector_display.png^protector_logo.png",
stack_max = 1, stack_max = 1,
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
local name = user:get_player_name() local name = user:get_player_name()
-- check for protector near player (2 block radius) -- check for protector near player (2 block radius)
local pos = user:get_pos() local pos = user:get_pos()
local pp = minetest.find_nodes_in_area( local pp = minetest.find_nodes_in_area(
vector.subtract(pos, 2), vector.add(pos, 2), vector.subtract(pos, 2), vector.add(pos, 2),
{"protector:protect", "protector:protect2"}) {"protector:protect", "protector:protect2"})
if #pp == 0 then return end -- none found if #pp == 0 then return end -- none found
pos = pp[1] -- take position of first protector found pos = pp[1] -- take position of first protector found
-- get members on protector -- get members on protector
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local members = meta:get_string("members") or "" local members = meta:get_string("members") or ""
-- get direction player is facing -- get direction player is facing
local dir = minetest.dir_to_facedir( user:get_look_dir() ) local dir = minetest.dir_to_facedir( user:get_look_dir() )
local vec = {x = 0, y = 0, z = 0} local vec = {x = 0, y = 0, z = 0}
local gap = (r * 2) + 1 local gap = (r * 2) + 1
local pit = user:get_look_pitch() local pit = user:get_look_pitch()
-- set placement coords -- set placement coords
if pit > 1.2 then if pit > 1.2 then
vec.y = gap -- up vec.y = gap -- up
elseif pit < -1.2 then elseif pit < -1.2 then
vec.y = -gap -- down vec.y = -gap -- down
elseif dir == 0 then elseif dir == 0 then
vec.z = gap -- north vec.z = gap -- north
elseif dir == 1 then elseif dir == 1 then
vec.x = gap -- east vec.x = gap -- east
elseif dir == 2 then elseif dir == 2 then
vec.z = -gap -- south vec.z = -gap -- south
elseif dir == 3 then elseif dir == 3 then
vec.x = -gap -- west vec.x = -gap -- west
end end
-- new position -- new position
pos.x = pos.x + vec.x pos.x = pos.x + vec.x
pos.y = pos.y + vec.y pos.y = pos.y + vec.y
pos.z = pos.z + vec.z pos.z = pos.z + vec.z
-- does placing a protector overlap existing area -- does placing a protector overlap existing area
if not protector.can_dig(r * 2, pos, user:get_player_name(), true, 3) then if not protector.can_dig(r * 2, pos, user:get_player_name(), true, 3) then
minetest.chat_send_player(name, minetest.chat_send_player(name,
"Overlaps into above players protected area") "Overlaps into above players protected area")
return return
end end
-- does a protector already exist ? -- does a protector already exist ?
if #minetest.find_nodes_in_area( if #minetest.find_nodes_in_area(
vector.subtract(pos, 1), vector.add(pos, 1), vector.subtract(pos, 1), vector.add(pos, 1),
{"protector:protect", "protector:protect2"}) > 0 then {"protector:protect", "protector:protect2"}) > 0 then
minetest.chat_send_player(name, "Protector already in place!") minetest.chat_send_player(name, "Protector already in place!")
return return
end end
-- do we have protectors to use ? -- do we have protectors to use ?
local nod local nod
local inv = user:get_inventory() local inv = user:get_inventory()
if not inv:contains_item("main", "protector:protect") if not inv:contains_item("main", "protector:protect")
and not inv:contains_item("main", "protector:protect2") then and not inv:contains_item("main", "protector:protect2") then
minetest.chat_send_player(name, "No protectors available to place!") minetest.chat_send_player(name, "No protectors available to place!")
return return
end end
-- take protector (block first then logo) -- take protector (block first then logo)
if inv:contains_item("main", "protector:protect") then if inv:contains_item("main", "protector:protect") then
inv:remove_item("main", "protector:protect") inv:remove_item("main", "protector:protect")
nod = "protector:protect" nod = "protector:protect"
elseif inv:contains_item("main", "protector:protect2") then elseif inv:contains_item("main", "protector:protect2") then
inv:remove_item("main", "protector:protect2") inv:remove_item("main", "protector:protect2")
nod = "protector:protect2" nod = "protector:protect2"
end end
-- do not replace containers with inventory space -- do not replace containers with inventory space
local inv = minetest.get_inventory({type = "node", pos = pos}) local inv = minetest.get_inventory({type = "node", pos = pos})
if inv then if inv then
minetest.chat_send_player(name, minetest.chat_send_player(name,
"Cannot place protector, container at " .. minetest.pos_to_string(pos)) "Cannot place protector, container at " .. minetest.pos_to_string(pos))
return return
end end
-- place protector -- protection check for other mods like Areas
minetest.set_node(pos, {name = nod, param2 = 1}) if minetest.is_protected(pos, name) then
minetest.chat_send_player(name,
-- set protector metadata "Cannot place protector, already protected at " ..
local meta = minetest.get_meta(pos) minetest.pos_to_string(pos))
return
meta:set_string("owner", name) end
meta:set_string("infotext", "Protection (owned by " .. name .. ")")
-- place protector
-- copy members across if holding sneak when using tool minetest.set_node(pos, {name = nod, param2 = 1})
if user:get_player_control().sneak then
meta:set_string("members", members) -- set protector metadata
else local meta = minetest.get_meta(pos)
meta:set_string("members", "")
end meta:set_string("owner", name)
meta:set_string("infotext", "Protection (owned by " .. name .. ")")
minetest.chat_send_player(name,
"Protector placed at " .. minetest.pos_to_string(pos)) -- copy members across if holding sneak when using tool
if user:get_player_control().sneak then
end, meta:set_string("members", members)
}) else
meta:set_string("members", "")
-- tool recipe end
minetest.register_craft({
output = "protector:tool", minetest.chat_send_player(name,
recipe = { "Protector placed at " .. minetest.pos_to_string(pos))
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "protector:protect", "default:steel_ingot"}, end,
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, })
}
}) -- tool recipe
minetest.register_craft({
output = "protector:tool",
recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "protector:protect", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
}
})