vertical.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. local vertical_box = {
  2. type = "fixed",
  3. fixed = {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16}
  4. }
  5. local top_box = {
  6. type = "fixed",
  7. fixed = {{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}}
  8. }
  9. local bottom_box = {
  10. type = "fixed",
  11. fixed = {
  12. {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16},
  13. {-1/16, -7/16, -1/16, 1/16, 8/16, 1/16},
  14. }
  15. }
  16. local vertical_rules = {
  17. {x=0, y=1, z=0},
  18. {x=0, y=-1, z=0}
  19. }
  20. local top_rules = {
  21. {x=1,y=0, z=0},
  22. {x=-1,y=0, z=0},
  23. {x=0,y=0, z=1},
  24. {x=0,y=0, z=-1},
  25. {x=0,y=-1, z=0}
  26. }
  27. local bottom_rules = {
  28. {x=1, y=0, z=0},
  29. {x=-1, y=0, z=0},
  30. {x=0, y=0, z=1},
  31. {x=0, y=0, z=-1},
  32. {x=0, y=1, z=0},
  33. {x=0, y=2, z=0} -- receive power from pressure plate / detector / ... 2 nodes above
  34. }
  35. local vertical_updatepos = function (pos)
  36. local node = minetest.get_node(pos)
  37. if minetest.registered_nodes[node.name]
  38. and minetest.registered_nodes[node.name].is_vertical_conductor then
  39. local node_above = minetest.get_node(vector.add(pos, vertical_rules[1]))
  40. local node_below = minetest.get_node(vector.add(pos, vertical_rules[2]))
  41. local above = minetest.registered_nodes[node_above.name]
  42. and minetest.registered_nodes[node_above.name].is_vertical_conductor
  43. local below = minetest.registered_nodes[node_below.name]
  44. and minetest.registered_nodes[node_below.name].is_vertical_conductor
  45. mesecon.on_dignode(pos, node)
  46. -- Always place offstate conductor and let mesecon.on_placenode take care
  47. local newname = "mesecons_extrawires:vertical_"
  48. if above and below then -- above and below: vertical mesecon
  49. newname = newname .. "off"
  50. elseif above and not below then -- above only: bottom
  51. newname = newname .. "bottom_off"
  52. elseif not above and below then -- below only: top
  53. newname = newname .. "top_off"
  54. else -- no vertical wire above, no vertical wire below: use bottom
  55. newname = newname .. "bottom_off"
  56. end
  57. minetest.set_node(pos, {name = newname})
  58. mesecon.on_placenode(pos, {name = newname})
  59. end
  60. end
  61. local vertical_update = function (pos, node)
  62. vertical_updatepos(pos) -- this one
  63. vertical_updatepos(vector.add(pos, vertical_rules[1])) -- above
  64. vertical_updatepos(vector.add(pos, vertical_rules[2])) -- below
  65. end
  66. -- Vertical wire
  67. mesecon.register_node("mesecons_extrawires:vertical", {
  68. description = "Vertical Mesecon",
  69. drawtype = "nodebox",
  70. walkable = false,
  71. paramtype = "light",
  72. is_ground_content = false,
  73. sunlight_propagates = true,
  74. selection_box = vertical_box,
  75. node_box = vertical_box,
  76. is_vertical_conductor = true,
  77. drop = "mesecons_extrawires:vertical_off",
  78. after_place_node = vertical_update,
  79. after_dig_node = vertical_update,
  80. sounds = default.node_sound_defaults(),
  81. },{
  82. tiles = {"mesecons_wire_off.png"},
  83. groups = {dig_immediate=3},
  84. mesecons = {conductor = {
  85. state = mesecon.state.off,
  86. onstate = "mesecons_extrawires:vertical_on",
  87. rules = vertical_rules,
  88. }}
  89. },{
  90. tiles = {"mesecons_wire_on.png"},
  91. groups = {dig_immediate=3, not_in_creative_inventory=1},
  92. mesecons = {conductor = {
  93. state = mesecon.state.on,
  94. offstate = "mesecons_extrawires:vertical_off",
  95. rules = vertical_rules,
  96. }}
  97. })
  98. -- Vertical wire top
  99. mesecon.register_node("mesecons_extrawires:vertical_top", {
  100. description = "Vertical mesecon",
  101. drawtype = "nodebox",
  102. walkable = false,
  103. paramtype = "light",
  104. is_ground_content = false,
  105. sunlight_propagates = true,
  106. groups = {dig_immediate=3, not_in_creative_inventory=1},
  107. selection_box = top_box,
  108. node_box = top_box,
  109. is_vertical_conductor = true,
  110. drop = "mesecons_extrawires:vertical_off",
  111. after_place_node = vertical_update,
  112. after_dig_node = vertical_update,
  113. sounds = default.node_sound_defaults(),
  114. },{
  115. tiles = {"mesecons_wire_off.png"},
  116. mesecons = {conductor = {
  117. state = mesecon.state.off,
  118. onstate = "mesecons_extrawires:vertical_top_on",
  119. rules = top_rules,
  120. }}
  121. },{
  122. tiles = {"mesecons_wire_on.png"},
  123. mesecons = {conductor = {
  124. state = mesecon.state.on,
  125. offstate = "mesecons_extrawires:vertical_top_off",
  126. rules = top_rules,
  127. }}
  128. })
  129. -- Vertical wire bottom
  130. mesecon.register_node("mesecons_extrawires:vertical_bottom", {
  131. description = "Vertical mesecon",
  132. drawtype = "nodebox",
  133. walkable = false,
  134. paramtype = "light",
  135. is_ground_content = false,
  136. sunlight_propagates = true,
  137. groups = {dig_immediate = 3, not_in_creative_inventory = 1},
  138. selection_box = bottom_box,
  139. node_box = bottom_box,
  140. is_vertical_conductor = true,
  141. drop = "mesecons_extrawires:vertical_off",
  142. after_place_node = vertical_update,
  143. after_dig_node = vertical_update,
  144. sounds = default.node_sound_defaults(),
  145. },{
  146. tiles = {"mesecons_wire_off.png"},
  147. mesecons = {conductor = {
  148. state = mesecon.state.off,
  149. onstate = "mesecons_extrawires:vertical_bottom_on",
  150. rules = bottom_rules,
  151. }}
  152. },{
  153. tiles = {"mesecons_wire_on.png"},
  154. mesecons = {conductor = {
  155. state = mesecon.state.on,
  156. offstate = "mesecons_extrawires:vertical_bottom_off",
  157. rules = bottom_rules,
  158. }}
  159. })
  160. minetest.register_craft({
  161. output = "mesecons_extrawires:vertical_off 3",
  162. recipe = {
  163. {"mesecons:wire_00000000_off"},
  164. {"mesecons:wire_00000000_off"},
  165. {"mesecons:wire_00000000_off"}
  166. }
  167. })
  168. minetest.register_craft({
  169. output = "mesecons:wire_00000000_off",
  170. recipe = {{"mesecons_extrawires:vertical_off"}}
  171. })