tnt_arrow.lua 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. minetest.register_craftitem("throwing:arrow_tnt", {
  2. description = "TNT Arrow",
  3. inventory_image = "throwing_arrow_tnt.png",
  4. })
  5. minetest.register_node("throwing:arrow_tnt_box", {
  6. drawtype = "nodebox",
  7. node_box = {
  8. type = "fixed",
  9. fixed = {
  10. -- Shaft
  11. {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17},
  12. --Spitze
  13. {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17},
  14. {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17},
  15. --Federn
  16. {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17},
  17. {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17},
  18. {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17},
  19. {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17},
  20. {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17},
  21. {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17},
  22. {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17},
  23. {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17},
  24. }
  25. },
  26. tiles = {"throwing_arrow_tnt.png", "throwing_arrow_tnt.png", "throwing_arrow_tnt_back.png", "throwing_arrow_tnt_front.png", "throwing_arrow_tnt_2.png", "throwing_arrow_tnt.png"},
  27. groups = {not_in_creative_inventory=1},
  28. })
  29. local THROWING_ARROW_ENTITY={
  30. _name = "throwing:arrow_tnt",
  31. physical = false,
  32. timer=0,
  33. visual = "wielditem",
  34. visual_size = {x=0.1, y=0.1},
  35. textures = {"throwing:arrow_tnt_box"},
  36. lastpos={},
  37. collisionbox = {0,0,0,0,0,0},
  38. }
  39. local function boom(pos, pname)
  40. -- Detonate some TNT!
  41. tnt.boom(pos, {
  42. radius = 2,
  43. ignore_protection = false,
  44. ignore_on_blast = false,
  45. damage_radius = 5,
  46. disable_drops = true,
  47. name = pname,
  48. from_arrow = true,
  49. })
  50. end
  51. -- Back to the arrow
  52. THROWING_ARROW_ENTITY.on_step = function(self, dtime)
  53. self.timer=self.timer+dtime
  54. local pos = self.object:get_pos()
  55. local node = minetest.get_node(pos)
  56. if self.timer>0.2 then
  57. local objs = minetest.get_objects_inside_radius(table.copy(pos), 2)
  58. for k, obj in pairs(objs) do
  59. if obj:get_luaentity() ~= nil then
  60. local oname = obj:get_luaentity().name
  61. if not throwing.entity_blocks_arrow(oname) then
  62. local damage = 1
  63. local pname = self.player_name
  64. -- Punch to alert mobs who hit them.
  65. throwing_arrow_punch_entity(obj, self, damage)
  66. boom(pos, pname)
  67. self.object:remove()
  68. return
  69. end
  70. elseif obj:is_player() then
  71. local damage = 1
  72. local pname = self.player_name
  73. boom(pos, pname)
  74. self.object:remove()
  75. return
  76. end
  77. end
  78. end
  79. if self.lastpos.x~=nil then
  80. if throwing_node_should_block_arrow(node.name) then
  81. local pname = self.player_name
  82. boom(self.lastpos, pname)
  83. self.object:remove()
  84. return
  85. end
  86. end
  87. self.lastpos={x=pos.x, y=pos.y, z=pos.z}
  88. end
  89. minetest.register_entity("throwing:arrow_tnt_entity", THROWING_ARROW_ENTITY)
  90. minetest.register_craft({
  91. output = 'throwing:arrow_tnt 3',
  92. recipe = {
  93. {'default:stick', 'tnt:tnt', 'default:copper_ingot'},
  94. }
  95. })
  96. minetest.register_craft({
  97. output = 'throwing:arrow_tnt 3',
  98. recipe = {
  99. {'default:copper_ingot', 'tnt:tnt', 'default:stick'},
  100. }
  101. })