tool.lua 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. -- protector placement tool (thanks to Shara for code and idea)
  2. -- get protection radius
  3. local r = tonumber(minetest.settings:get("protector_radius")) or 5
  4. minetest.register_craftitem("protector:tool", {
  5. description = "Protector Placer Tool (stand near protector, face direction and use)",
  6. inventory_image = "protector_display.png^protector_logo.png",
  7. stack_max = 1,
  8. on_use = function(itemstack, user, pointed_thing)
  9. local name = user:get_player_name()
  10. -- check for protector near player (2 block radius)
  11. local pos = user:get_pos()
  12. local pp = minetest.find_nodes_in_area(
  13. vector.subtract(pos, 2), vector.add(pos, 2),
  14. {"protector:protect", "protector:protect2"})
  15. if #pp == 0 then return end -- none found
  16. pos = pp[1] -- take position of first protector found
  17. -- get members on protector
  18. local meta = minetest.get_meta(pos)
  19. local members = meta:get_string("members") or ""
  20. -- get direction player is facing
  21. local dir = minetest.dir_to_facedir( user:get_look_dir() )
  22. local vec = {x = 0, y = 0, z = 0}
  23. local gap = (r * 2) + 1
  24. local pit = user:get_look_pitch()
  25. -- set placement coords
  26. if pit > 1.2 then
  27. vec.y = gap -- up
  28. elseif pit < -1.2 then
  29. vec.y = -gap -- down
  30. elseif dir == 0 then
  31. vec.z = gap -- north
  32. elseif dir == 1 then
  33. vec.x = gap -- east
  34. elseif dir == 2 then
  35. vec.z = -gap -- south
  36. elseif dir == 3 then
  37. vec.x = -gap -- west
  38. end
  39. -- new position
  40. pos.x = pos.x + vec.x
  41. pos.y = pos.y + vec.y
  42. pos.z = pos.z + vec.z
  43. -- does placing a protector overlap existing area
  44. if not protector.can_dig(r * 2, pos, user:get_player_name(), true, 3) then
  45. minetest.chat_send_player(name,
  46. "Overlaps into above players protected area")
  47. return
  48. end
  49. -- does a protector already exist ?
  50. if #minetest.find_nodes_in_area(
  51. vector.subtract(pos, 1), vector.add(pos, 1),
  52. {"protector:protect", "protector:protect2"}) > 0 then
  53. minetest.chat_send_player(name, "Protector already in place!")
  54. return
  55. end
  56. -- do we have protectors to use ?
  57. local nod
  58. local inv = user:get_inventory()
  59. if not inv:contains_item("main", "protector:protect")
  60. and not inv:contains_item("main", "protector:protect2") then
  61. minetest.chat_send_player(name, "No protectors available to place!")
  62. return
  63. end
  64. -- take protector (block first then logo)
  65. if inv:contains_item("main", "protector:protect") then
  66. inv:remove_item("main", "protector:protect")
  67. nod = "protector:protect"
  68. elseif inv:contains_item("main", "protector:protect2") then
  69. inv:remove_item("main", "protector:protect2")
  70. nod = "protector:protect2"
  71. end
  72. -- do not replace containers with inventory space
  73. local inv = minetest.get_inventory({type = "node", pos = pos})
  74. if inv then
  75. minetest.chat_send_player(name,
  76. "Cannot place protector, container at " .. minetest.pos_to_string(pos))
  77. return
  78. end
  79. -- place protector
  80. minetest.set_node(pos, {name = nod, param2 = 1})
  81. -- set protector metadata
  82. local meta = minetest.get_meta(pos)
  83. meta:set_string("owner", name)
  84. meta:set_string("infotext", "Protection (owned by " .. name .. ")")
  85. -- copy members across if holding sneak when using tool
  86. if user:get_player_control().sneak then
  87. meta:set_string("members", members)
  88. else
  89. meta:set_string("members", "")
  90. end
  91. minetest.chat_send_player(name,
  92. "Protector placed at " .. minetest.pos_to_string(pos))
  93. end,
  94. })
  95. -- tool recipe
  96. minetest.register_craft({
  97. output = "protector:tool",
  98. recipe = {
  99. {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
  100. {"default:steel_ingot", "protector:protect", "default:steel_ingot"},
  101. {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
  102. }
  103. })