123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- -- protector placement tool (thanks to Shara for code and idea)
- minetest.register_craftitem("protector:tool", {
- description = "Protector Placer Tool (stand near protector, face direction and use)",
- inventory_image = "protector_display.png^protector_logo.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"})
- 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 = (protector.radius * 2) + 1
- local pit = user:get_look_pitch()
- -- 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(protector.radius * 2, pos,
- user:get_player_name(), true, 3) then
- minetest.chat_send_player(name,
- "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"}) > 0 then
- minetest.chat_send_player(name, "Protector already in place!")
- 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, "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
- -- 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,
- "Protector placed at " .. minetest.pos_to_string(pos))
- end,
- })
- -- 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"},
- }
- })
|