init.lua 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. -- Function that get the input/output rules of the delayer
  2. local delayer_get_output_rules = function(node)
  3. local rules = {{x = 0, y = 0, z = 1}}
  4. for i = 0, node.param2 do
  5. rules = mesecon.rotate_rules_left(rules)
  6. end
  7. return rules
  8. end
  9. local delayer_get_input_rules = function(node)
  10. local rules = {{x = 0, y = 0, z = -1}}
  11. for i = 0, node.param2 do
  12. rules = mesecon.rotate_rules_left(rules)
  13. end
  14. return rules
  15. end
  16. -- Functions that are called after the delay time
  17. local delayer_activate = function(pos, node)
  18. local def = minetest.registered_nodes[node.name]
  19. local time = def.delayer_time
  20. minetest.swap_node(pos, {name = def.delayer_onstate, param2=node.param2})
  21. mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(node)}, time, nil)
  22. end
  23. local delayer_deactivate = function(pos, node)
  24. local def = minetest.registered_nodes[node.name]
  25. local time = def.delayer_time
  26. minetest.swap_node(pos, {name = def.delayer_offstate, param2=node.param2})
  27. mesecon.queue:add_action(pos, "receptor_off", {delayer_get_output_rules(node)}, time, nil)
  28. end
  29. -- Register the 2 (states) x 4 (delay times) delayers
  30. for i = 1, 4 do
  31. local groups = {}
  32. if i == 1 then
  33. groups = {bendy=2,snappy=1,dig_immediate=2}
  34. else
  35. groups = {bendy=2,snappy=1,dig_immediate=2, not_in_creative_inventory=1}
  36. end
  37. local delaytime
  38. if i == 1 then delaytime = 0.1
  39. elseif i == 2 then delaytime = 0.3
  40. elseif i == 3 then delaytime = 0.5
  41. elseif i == 4 then delaytime = 1.0 end
  42. boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab
  43. { -2/16, -7/16, -4/16, 2/16, -26/64, -3/16 }, -- the jeweled "on" indicator
  44. { -3/16, -7/16, -3/16, 3/16, -26/64, -2/16 },
  45. { -4/16, -7/16, -2/16, 4/16, -26/64, 2/16 },
  46. { -3/16, -7/16, 2/16, 3/16, -26/64, 3/16 },
  47. { -2/16, -7/16, 3/16, 2/16, -26/64, 4/16 },
  48. { -6/16, -7/16, -6/16, -4/16, -27/64, -4/16 }, -- the timer indicator
  49. { -8/16, -8/16, -1/16, -6/16, -7/16, 1/16 }, -- the two wire stubs
  50. { 6/16, -8/16, -1/16, 8/16, -7/16, 1/16 }}
  51. minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), {
  52. description = "Delayer",
  53. drawtype = "nodebox",
  54. tiles = {
  55. "mesecons_delayer_off_"..tostring(i)..".png",
  56. "mesecons_delayer_bottom.png",
  57. "mesecons_delayer_ends_off.png",
  58. "mesecons_delayer_ends_off.png",
  59. "mesecons_delayer_sides_off.png",
  60. "mesecons_delayer_sides_off.png"
  61. },
  62. inventory_image = "mesecons_delayer_off_1.png",
  63. wield_image = "mesecons_delayer_off_1.png",
  64. walkable = true,
  65. selection_box = {
  66. type = "fixed",
  67. fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
  68. },
  69. node_box = {
  70. type = "fixed",
  71. fixed = boxes
  72. },
  73. groups = groups,
  74. paramtype = "light",
  75. paramtype2 = "facedir",
  76. sunlight_propagates = true,
  77. is_ground_content = true,
  78. drop = 'mesecons_delayer:delayer_off_1',
  79. on_punch = function (pos, node)
  80. if node.name=="mesecons_delayer:delayer_off_1" then
  81. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_2", param2=node.param2})
  82. elseif node.name=="mesecons_delayer:delayer_off_2" then
  83. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_3", param2=node.param2})
  84. elseif node.name=="mesecons_delayer:delayer_off_3" then
  85. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_4", param2=node.param2})
  86. elseif node.name=="mesecons_delayer:delayer_off_4" then
  87. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_1", param2=node.param2})
  88. end
  89. end,
  90. delayer_time = delaytime,
  91. delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i),
  92. sounds = default.node_sound_stone_defaults(),
  93. mesecons = {
  94. receptor =
  95. {
  96. state = mesecon.state.off,
  97. rules = delayer_get_output_rules
  98. },
  99. effector =
  100. {
  101. rules = delayer_get_input_rules,
  102. action_on = delayer_activate
  103. }
  104. }
  105. })
  106. minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), {
  107. description = "You hacker you",
  108. drawtype = "nodebox",
  109. tiles = {
  110. "mesecons_delayer_on_"..tostring(i)..".png",
  111. "mesecons_delayer_bottom.png",
  112. "mesecons_delayer_ends_on.png",
  113. "mesecons_delayer_ends_on.png",
  114. "mesecons_delayer_sides_on.png",
  115. "mesecons_delayer_sides_on.png"
  116. },
  117. walkable = true,
  118. selection_box = {
  119. type = "fixed",
  120. fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 },
  121. },
  122. node_box = {
  123. type = "fixed",
  124. fixed = boxes
  125. },
  126. groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1},
  127. paramtype = "light",
  128. paramtype2 = "facedir",
  129. sunlight_propagates = true,
  130. is_ground_content = true,
  131. drop = 'mesecons_delayer:delayer_off_1',
  132. on_punch = function (pos, node)
  133. if node.name=="mesecons_delayer:delayer_on_1" then
  134. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_2", param2=node.param2})
  135. elseif node.name=="mesecons_delayer:delayer_on_2" then
  136. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_3", param2=node.param2})
  137. elseif node.name=="mesecons_delayer:delayer_on_3" then
  138. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_4", param2=node.param2})
  139. elseif node.name=="mesecons_delayer:delayer_on_4" then
  140. minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_1", param2=node.param2})
  141. end
  142. end,
  143. delayer_time = delaytime,
  144. delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i),
  145. mesecons = {
  146. receptor =
  147. {
  148. state = mesecon.state.on,
  149. rules = delayer_get_output_rules
  150. },
  151. effector =
  152. {
  153. rules = delayer_get_input_rules,
  154. action_off = delayer_deactivate
  155. }
  156. }
  157. })
  158. end
  159. minetest.register_craft({
  160. output = "mesecons_delayer:delayer_off_1",
  161. recipe = {
  162. {"mesecons_torch:mesecon_torch_on", "group:mesecon_conductor_craftable", "mesecons_torch:mesecon_torch_on"},
  163. {"default:cobble","default:cobble", "default:cobble"},
  164. }
  165. })