init.lua 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. -- MOVESTONE
  2. -- Non-sticky:
  3. -- Moves along mesecon lines
  4. -- Pushes all blocks in front of it
  5. --
  6. -- Sticky one
  7. -- Moves along mesecon lines
  8. -- Pushes all block in front of it
  9. -- Pull all blocks in its back
  10. -- settings:
  11. local timer_interval = 1 / mesecon.setting("movestone_speed", 3)
  12. local max_push = mesecon.setting("movestone_max_push", 50)
  13. local max_pull = mesecon.setting("movestone_max_pull", 50)
  14. -- helper functions:
  15. local function get_movestone_direction(rulename, is_vertical)
  16. if is_vertical then
  17. if rulename.z > 0 then
  18. return {x = 0, y = -1, z = 0}
  19. elseif rulename.z < 0 then
  20. return {x = 0, y = 1, z = 0}
  21. elseif rulename.x > 0 then
  22. return {x = 0, y = -1, z = 0}
  23. elseif rulename.x < 0 then
  24. return {x = 0, y = 1, z = 0}
  25. end
  26. else
  27. if rulename.z > 0 then
  28. return {x = -1, y = 0, z = 0}
  29. elseif rulename.z < 0 then
  30. return {x = 1, y = 0, z = 0}
  31. elseif rulename.x > 0 then
  32. return {x = 0, y = 0, z = -1}
  33. elseif rulename.x < 0 then
  34. return {x = 0, y = 0, z = 1}
  35. end
  36. end
  37. end
  38. -- registration functions:
  39. function mesecon.register_movestone(name, def, is_sticky, is_vertical)
  40. local function movestone_move(pos, node, rulename)
  41. local direction = get_movestone_direction(rulename, is_vertical)
  42. local frontpos = vector.add(pos, direction)
  43. -- ### Step 1: Push nodes in front ###
  44. local success, stack, oldstack = mesecon.mvps_push(frontpos, direction, max_push)
  45. if not success then
  46. minetest.get_node_timer(pos):start(timer_interval)
  47. return
  48. end
  49. mesecon.mvps_move_objects(frontpos, direction, oldstack)
  50. -- ### Step 2: Move the movestone ###
  51. minetest.set_node(frontpos, node)
  52. minetest.remove_node(pos)
  53. mesecon.on_dignode(pos, node)
  54. mesecon.on_placenode(frontpos, node)
  55. minetest.get_node_timer(frontpos):start(timer_interval)
  56. -- ### Step 3: If sticky, pull stack behind ###
  57. if not is_sticky then
  58. return
  59. end
  60. local backpos = vector.subtract(pos, direction)
  61. success, stack, oldstack = mesecon.mvps_pull_all(backpos, direction, max_pull)
  62. if success then
  63. mesecon.mvps_move_objects(backpos, vector.multiply(direction, -1), oldstack, -1)
  64. end
  65. end
  66. def.is_ground_content = false
  67. def.mesecons = {effector = {
  68. action_on = function(pos, node, rulename)
  69. if rulename and not minetest.get_node_timer(pos):is_started() then
  70. movestone_move(pos, node, rulename)
  71. end
  72. end,
  73. rules = mesecon.rules.default,
  74. }}
  75. def.on_timer = function(pos, elapsed)
  76. local sourcepos = mesecon.is_powered(pos)
  77. if not sourcepos then
  78. return
  79. end
  80. local rulename = vector.subtract(sourcepos[1], pos)
  81. mesecon.activate(pos, minetest.get_node(pos), rulename, 0)
  82. end
  83. def.on_blast = mesecon.on_blastnode
  84. minetest.register_node(name, def)
  85. end
  86. -- registration:
  87. mesecon.register_movestone("mesecons_movestones:movestone", {
  88. tiles = {
  89. "jeija_movestone_side.png",
  90. "jeija_movestone_side.png",
  91. "jeija_movestone_arrows.png^[transformFX",
  92. "jeija_movestone_arrows.png^[transformFX",
  93. "jeija_movestone_arrows.png",
  94. "jeija_movestone_arrows.png",
  95. },
  96. groups = {cracky = 3},
  97. description = "Movestone",
  98. sounds = default.node_sound_stone_defaults()
  99. }, false, false)
  100. mesecon.register_movestone("mesecons_movestones:sticky_movestone", {
  101. tiles = {
  102. "jeija_movestone_side.png",
  103. "jeija_movestone_side.png",
  104. "jeija_sticky_movestone.png^[transformFX",
  105. "jeija_sticky_movestone.png^[transformFX",
  106. "jeija_sticky_movestone.png",
  107. "jeija_sticky_movestone.png",
  108. },
  109. groups = {cracky = 3},
  110. description = "Sticky Movestone",
  111. sounds = default.node_sound_stone_defaults(),
  112. }, true, false)
  113. mesecon.register_movestone("mesecons_movestones:movestone_vertical", {
  114. tiles = {
  115. "jeija_movestone_side.png",
  116. "jeija_movestone_side.png",
  117. "jeija_movestone_arrows.png^[transformFXR90",
  118. "jeija_movestone_arrows.png^[transformR90",
  119. "jeija_movestone_arrows.png^[transformFXR90",
  120. "jeija_movestone_arrows.png^[transformR90",
  121. },
  122. groups = {cracky = 3},
  123. description = "Vertical Movestone",
  124. sounds = default.node_sound_stone_defaults()
  125. }, false, true)
  126. mesecon.register_movestone("mesecons_movestones:sticky_movestone_vertical", {
  127. tiles = {
  128. "jeija_movestone_side.png",
  129. "jeija_movestone_side.png",
  130. "jeija_sticky_movestone.png^[transformFXR90",
  131. "jeija_sticky_movestone.png^[transformR90",
  132. "jeija_sticky_movestone.png^[transformFXR90",
  133. "jeija_sticky_movestone.png^[transformR90",
  134. },
  135. groups = {cracky = 3},
  136. description = "Vertical Sticky Movestone",
  137. sounds = default.node_sound_stone_defaults(),
  138. }, true, true)
  139. -- crafting:
  140. -- base recipe:
  141. minetest.register_craft({
  142. output = "mesecons_movestones:movestone 2",
  143. recipe = {
  144. {"default:stone", "default:stone", "default:stone"},
  145. {"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"},
  146. {"default:stone", "default:stone", "default:stone"},
  147. }
  148. })
  149. -- conversation:
  150. minetest.register_craft({
  151. type = "shapeless",
  152. output = "mesecons_movestones:movestone",
  153. recipe = {"mesecons_movestones:movestone_vertical"},
  154. })
  155. minetest.register_craft({
  156. type = "shapeless",
  157. output = "mesecons_movestones:movestone_vertical",
  158. recipe = {"mesecons_movestones:movestone"},
  159. })
  160. minetest.register_craft({
  161. type = "shapeless",
  162. output = "mesecons_movestones:sticky_movestone",
  163. recipe = {"mesecons_movestones:sticky_movestone_vertical"},
  164. })
  165. minetest.register_craft({
  166. type = "shapeless",
  167. output = "mesecons_movestones:sticky_movestone_vertical",
  168. recipe = {"mesecons_movestones:sticky_movestone"},
  169. })
  170. -- make sticky:
  171. minetest.register_craft({
  172. output = "mesecons_movestones:sticky_movestone",
  173. recipe = {
  174. {"mesecons_materials:glue", "mesecons_movestones:movestone", "mesecons_materials:glue"},
  175. }
  176. })
  177. minetest.register_craft({
  178. output = "mesecons_movestones:sticky_movestone_vertical",
  179. recipe = {
  180. {"mesecons_materials:glue"},
  181. {"mesecons_movestones:movestone_vertical"},
  182. {"mesecons_materials:glue"},
  183. }
  184. })
  185. -- legacy code:
  186. minetest.register_alias("mesecons_movestones:movestone_active",
  187. "mesecons_movestones:movestone")
  188. minetest.register_alias("mesecons_movestones:sticky_movestone_active",
  189. "mesecons_movestones:sticky_movestone")