functions.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. --Helper function to see if there is open space to place a double wide node.
  2. --All wide nodes should extend to the right.
  3. --Returns true if item should be placeable.
  4. --[[
  5. ### Use this code on nodes that need to check space to side.
  6. Replace placed_node with the node that should be placed. Leave blank to use the default invisible item.
  7. after_place_node = function(pos, placer, itemstack)
  8. if not epic.space_to_side(pos, placed_node) then
  9. minetest.remove_node(pos)
  10. return itemstack
  11. end
  12. end,
  13. ### Use this code on nodes that need to remove the empty node.
  14. after_dig_node = function(pos, oldnode)
  15. epic.remove_side_node(pos, oldnode)
  16. end,
  17. ]]
  18. fdir_table = {
  19. { 1, 0 },
  20. { 0, -1 },
  21. { -1, 0 },
  22. { 0, 1 },
  23. { 1, 0 },
  24. { 0, -1 },
  25. { -1, 0 },
  26. { 0, 1 },
  27. }
  28. function epic.space_to_side(pos, placed_node)
  29. local node = minetest.get_node(pos)
  30. local fdir = node.param2 % 32
  31. local pos2 = {x = pos.x + fdir_table[fdir+1][1], y=pos.y, z = pos.z + fdir_table[fdir+1][2]}
  32. local node2 = minetest.get_node(pos2)
  33. local node2def = minetest.registered_nodes[node2.name] or nil
  34. if not node2def.buildable_to then
  35. return false
  36. else
  37. local placed_node = placed_node or 'epic:empty'
  38. minetest.set_node(pos2,{name = placed_node, param2=fdir})
  39. return true
  40. end
  41. end
  42. function epic.remove_side_node(pos, oldnode)
  43. local fdir = oldnode.param2 % 32
  44. local pos2 = {x = pos.x + fdir_table[fdir+1][1], y=pos.y, z = pos.z + fdir_table[fdir+1][2]}
  45. local node2 = minetest.get_node(pos2).name
  46. if minetest.get_item_group(node2, 'empty_node') > 0 then
  47. minetest.remove_node(pos2)
  48. end
  49. end
  50. function epic.space_to_front(pos)
  51. local node = minetest.get_node(pos)
  52. local fdir = node.param2 % 32
  53. local pos2 = {x = pos.x + fdir_table[fdir+4][1], y=pos.y, z = pos.z + fdir_table[fdir+4][2]}
  54. local node2 = minetest.get_node(pos2)
  55. local node2def = minetest.registered_nodes[node2.name] or nil
  56. if not node2def.buildable_to then
  57. return false
  58. else
  59. minetest.set_node(pos2,{name = 'epic:empty'})
  60. return true
  61. end
  62. end
  63. function epic.remove_front_node(pos, oldnode)
  64. local fdir = oldnode.param2 % 32
  65. local pos2 = {x = pos.x + fdir_table[fdir+4][1], y=pos.y, z = pos.z + fdir_table[fdir+4][2]}
  66. local node2 = minetest.get_node(pos2).name
  67. if minetest.get_item_group(node2, 'empty_node') > 0 then
  68. minetest.remove_node(pos2)
  69. end
  70. end
  71. function epic.space_on_top(pos)
  72. local above = {x = pos.x, y = pos.y + 1, z = pos.z}
  73. local top_node = minetest.get_node(above)
  74. local top_def = minetest.registered_nodes[top_node.name] or nil
  75. if not top_def.buildable_to then
  76. return false
  77. else
  78. minetest.set_node(above,{name='epic:empty'})
  79. return true
  80. end
  81. end
  82. function epic.remove_top_node(pos)
  83. local above = {x = pos.x, y = pos.y + 1, z = pos.z}
  84. local top_node = minetest.get_node(above).name
  85. if minetest.get_item_group(top_node, 'empty_node') > 0 then
  86. minetest.remove_node(above)
  87. end
  88. end
  89. function epic.space_to_top_and_side(pos)
  90. local node = minetest.get_node(pos)
  91. local fdir = node.param2 % 32
  92. local side = {x = pos.x + fdir_table[fdir+1][1], y=pos.y, z = pos.z + fdir_table[fdir+1][2]}
  93. local top = {x = pos.x, y = pos.y + 1, z = pos.z}
  94. local side_node = minetest.get_node(side)
  95. local top_node = minetest.get_node(top)
  96. local side_def = minetest.registered_nodes[side_node.name] or nil
  97. local top_def = minetest.registered_nodes[top_node.name] or nil
  98. if not top_def.buildable_to or not side_def.buildable_to then
  99. return false
  100. else
  101. minetest.set_node(side,{name='epic:empty'})
  102. minetest.set_node(top,{name='epic:empty'})
  103. return true
  104. end
  105. end
  106. function epic.space_for_picnic(pos, placed_node)
  107. local node = minetest.get_node(pos)
  108. local fdir = node.param2 % 32
  109. local pos2 = {x = pos.x + fdir_table[fdir+1][1], y=pos.y, z = pos.z + fdir_table[fdir+1][2]} --Side node
  110. local pos3 = {x = pos.x + fdir_table[fdir+4][1], y=pos.y, z = pos.z + fdir_table[fdir+4][2]} --Across node
  111. local node2 = minetest.get_node(pos2)
  112. local node3 = minetest.get_node(pos3)
  113. local node2def = minetest.registered_nodes[node2.name] or nil
  114. local node3def = minetest.registered_nodes[node3.name] or nil
  115. if not node2def.buildable_to or not node3def.buildable_to then
  116. return false
  117. else
  118. local placed_node = placed_node or 'epic:empty'
  119. minetest.set_node(pos2,{name = placed_node, param2=fdir})
  120. minetest.set_node(pos3,{name = placed_node, param2=fdir})
  121. return true
  122. end
  123. end
  124. function epic.remove_picnic_nodes(pos, oldnode)
  125. local fdir = oldnode.param2 % 32
  126. local pos2 = {x = pos.x + fdir_table[fdir+1][1], y=pos.y, z = pos.z + fdir_table[fdir+1][2]} --Side node
  127. local pos3 = {x = pos.x + fdir_table[fdir+4][1], y=pos.y, z = pos.z + fdir_table[fdir+4][2]} --Across node
  128. local node2 = minetest.get_node(pos2).name
  129. local node3 = minetest.get_node(pos3).name
  130. if minetest.get_item_group(node2, 'empty_node') > 0 and minetest.get_item_group(node3, 'empty_node') >0 then
  131. minetest.remove_node(pos2)
  132. minetest.remove_node(pos3)
  133. end
  134. end