123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- -- protector placement tool (thanks to Shara for code and idea)
- local S = protector.intllib
- -- get protection radius
- local r = tonumber(minetest.settings:get("protector_radius")) or 5
- -- radius limiter (minetest cannot handle node volume of more than 4096000)
- if r > 22 then r = 22 end
- minetest.register_craftitem("protector:tool", {
- description = S("Protector Placer Tool (stand near protector, face direction and use)"),
- inventory_image = "protector_tool.png",
- 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(
- vector.subtract(pos, 2), vector.add(pos, 2),
- {"protector:protect", "protector:protect2", "protector:protect_hidden"})
- 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,
- S("Overlaps into above players protected area"))
- return
- end
- -- does a protector already exist ?
- if #minetest.find_nodes_in_area(
- vector.subtract(pos, 1), vector.add(pos, 1),
- {"protector:protect", "protector:protect2",
- "protector:protect_hidden"}) > 0 then
- minetest.chat_send_player(name, S("Protector already in place!"))
- return
- end
- -- do not place protector out of map bounds
- if minetest.find_node_near(pos, 1, {"ignore"}) then
- return
- end
- -- 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
- minetest.chat_send_player(name,
- S("Cannot place protector, container at") ..
- " " .. minetest.pos_to_string(pos))
- return
- end
- -- protection check for other mods like Areas
- if minetest.is_protected(pos, name) then
- minetest.chat_send_player(name,
- S("Cannot place protector, already protected at") ..
- " " .. minetest.pos_to_string(pos))
- 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))
- end,
- })
- -- tool recipe
- local df = "default:steel_ingot"
- if not minetest.registered_items[df] then
- df = "mcl_core:iron_ingot"
- end
- minetest.register_craft({
- output = "protector:tool",
- recipe = {
- {df, df, df},
- {df, "protector:protect", df},
- {df, df, df}
- }
- })
|