minetest-mm/mods/protector/tool.lua

175 lines
4.3 KiB
Lua
Raw Normal View History

2020-10-26 17:38:53 +01:00
-- protector placement tool (thanks to Shara for code and idea)
2024-12-19 12:55:40 +01:00
local S = minetest.get_translator("protector")
2020-10-26 17:38:53 +01:00
-- get protection radius
2024-12-19 12:55:40 +01:00
2020-10-26 17:38:53 +01:00
local r = tonumber(minetest.settings:get("protector_radius")) or 5
-- radius limiter (minetest cannot handle node volume of more than 4096000)
2024-12-19 12:55:40 +01:00
if r > 30 then r = 30 end
-- protector placement tool
2020-10-26 17:38:53 +01:00
minetest.register_craftitem("protector:tool", {
description = S("Protector Placer Tool (stand near protector, face direction and use)"),
2024-12-19 12:55:40 +01:00
inventory_image = "protector_tool.png",
2020-10-26 17:38:53 +01:00
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
local name = user:get_player_name()
-- check for protector near player (2 block radius)
local pos = user:get_pos()
local pp = minetest.find_nodes_in_area(
2024-12-19 12:55:40 +01:00
vector.subtract(pos, 2), vector.add(pos, 2),
{"protector:protect", "protector:protect2", "protector:protect_hidden"})
2020-10-26 17:38:53 +01:00
if #pp == 0 then return end -- none found
pos = pp[1] -- take position of first protector found
-- get members on protector
local meta = minetest.get_meta(pos)
local members = meta:get_string("members") or ""
-- get direction player is facing
local dir = minetest.dir_to_facedir( user:get_look_dir() )
local vec = {x = 0, y = 0, z = 0}
local gap = (r * 2) + 1
local pit = user:get_look_vertical()
-- set placement coords
if pit > 1.2 then
vec.y = -gap -- up
elseif pit < -1.2 then
vec.y = gap -- down
elseif dir == 0 then
vec.z = gap -- north
elseif dir == 1 then
vec.x = gap -- east
elseif dir == 2 then
vec.z = -gap -- south
elseif dir == 3 then
vec.x = -gap -- west
end
-- new position
pos.x = pos.x + vec.x
pos.y = pos.y + vec.y
pos.z = pos.z + vec.z
-- does placing a protector overlap existing area
if not protector.can_dig(r * 2, pos, user:get_player_name(), true, 3) then
minetest.chat_send_player(name,
2024-12-19 12:55:40 +01:00
S("Overlaps into above players protected area"))
2020-10-26 17:38:53 +01:00
return
end
-- does a protector already exist ?
2024-12-19 12:55:40 +01:00
if #minetest.find_nodes_in_area(vector.subtract(pos, 1), vector.add(pos, 1),
{"protector:protect", "protector:protect2",
"protector:protect_hidden"}) > 0 then
2020-10-26 17:38:53 +01:00
minetest.chat_send_player(name, S("Protector already in place!"))
return
end
2024-12-19 12:55:40 +01:00
-- do not place protector out of map bounds or replace bedrock
if #minetest.find_nodes_in_area(pos, pos, {"ignore", "mcl_core:bedrock"}) > 0 then
minetest.chat_send_player(name, S("Out of bounds!"))
2021-09-05 16:06:04 +02:00
return
end
2020-10-26 17:38:53 +01:00
-- do we have protectors to use ?
local nod
local inv = user:get_inventory()
if not inv:contains_item("main", "protector:protect")
and not inv:contains_item("main", "protector:protect2") then
minetest.chat_send_player(name,
S("No protectors available to place!"))
return
end
-- take protector (block first then logo)
if inv:contains_item("main", "protector:protect") then
inv:remove_item("main", "protector:protect")
nod = "protector:protect"
elseif inv:contains_item("main", "protector:protect2") then
inv:remove_item("main", "protector:protect2")
nod = "protector:protect2"
end
-- do not replace containers with inventory space
local inv = minetest.get_inventory({type = "node", pos = pos})
if inv then
2024-12-19 12:55:40 +01:00
minetest.chat_send_player(name, S("Cannot place protector, container at") ..
2020-10-26 17:38:53 +01:00
" " .. minetest.pos_to_string(pos))
return
end
-- protection check for other mods like Areas
if minetest.is_protected(pos, name) then
2024-12-19 12:55:40 +01:00
2020-10-26 17:38:53 +01:00
minetest.chat_send_player(name,
2024-12-19 12:55:40 +01:00
S("Cannot place protector, already protected at")
.. " " .. minetest.pos_to_string(pos))
2020-10-26 17:38:53 +01:00
return
end
-- place protector
minetest.set_node(pos, {name = nod, param2 = 1})
-- set protector metadata
local meta = minetest.get_meta(pos)
meta:set_string("owner", name)
meta:set_string("infotext", "Protection (owned by " .. name .. ")")
-- copy members across if holding sneak when using tool
if user:get_player_control().sneak then
meta:set_string("members", members)
else
meta:set_string("members", "")
end
minetest.chat_send_player(name,
S("Protector placed at") ..
" " .. minetest.pos_to_string(pos))
2024-12-19 12:55:40 +01:00
end
2020-10-26 17:38:53 +01:00
})
-- tool recipe
2024-12-19 12:55:40 +01:00
2020-10-26 17:38:53 +01:00
local df = "default:steel_ingot"
2024-12-19 12:55:40 +01:00
if minetest.get_modpath("mcl_core") then
2020-10-26 17:38:53 +01:00
df = "mcl_core:iron_ingot"
end
minetest.register_craft({
output = "protector:tool",
recipe = {
{df, df, df},
{df, "protector:protect", df},
2021-12-11 12:24:24 +01:00
{df, df, df}
2020-10-26 17:38:53 +01:00
}
})