pusher.lua 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. --[[
  2. Tubelib Addons 3
  3. ================
  4. Copyright (C) 2017-2020 Joachim Stolberg
  5. AGPL v3
  6. See LICENSE.txt for more information
  7. pusher.lua
  8. A high performance pusher
  9. ]]--
  10. -- Load support for I18n
  11. local S = tubelib_addons3.S
  12. -- for lazy programmers
  13. local P = minetest.string_to_pos
  14. local M = minetest.get_meta
  15. local STANDBY_TICKS = 5
  16. local COUNTDOWN_TICKS = 5
  17. local CYCLE_TIME = 2
  18. local FIRST_CYCLE = 0.5
  19. local State = tubelib.NodeStates:new({
  20. node_name_passive = "tubelib_addons3:pusher",
  21. node_name_active = "tubelib_addons3:pusher_active",
  22. node_name_defect = "tubelib_addons3:pusher_defect",
  23. infotext_name = S("HighPerf Pusher"),
  24. cycle_time = CYCLE_TIME,
  25. first_cycle_time = FIRST_CYCLE,
  26. standby_ticks = STANDBY_TICKS,
  27. has_item_meter = true,
  28. aging_factor = 50,
  29. })
  30. local function pushing(pos, meta)
  31. local player_name = meta:get_string("player_name")
  32. local items = tubelib.pull_stack(pos, "L", player_name)
  33. if items ~= nil then
  34. local count = items:get_count()
  35. if tubelib.push_items(pos, "R", items, player_name) == false then
  36. -- place item back
  37. tubelib.unpull_items(pos, "L", items, player_name)
  38. -- Complete stack rejected
  39. if count == items:get_count() then
  40. State:blocked(pos, meta)
  41. return
  42. end
  43. end
  44. if State.get_state(pos, meta) ~= tubelib.STOPPED then
  45. State:keep_running(pos, meta, COUNTDOWN_TICKS, 1)
  46. end
  47. return
  48. end
  49. State:idle(pos, meta)
  50. end
  51. local function keep_running(pos, elapsed)
  52. if tubelib.data_not_corrupted(pos) then
  53. local meta = M(pos)
  54. pushing(pos, meta)
  55. return State:is_active(meta)
  56. end
  57. return false
  58. end
  59. minetest.register_node("tubelib_addons3:pusher", {
  60. description = S("HighPerf Pusher"),
  61. tiles = {
  62. -- up, down, right, left, back, front
  63. 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png',
  64. 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png',
  65. 'tubelib_outp.png^tubelib_addons3_node_frame4.png',
  66. 'tubelib_inp.png^tubelib_addons3_node_frame4.png',
  67. "tubelib_pusher1.png^[transformR180]^tubelib_addons3_node_frame4.png^[transformR180]",
  68. "tubelib_pusher1.png^tubelib_addons3_node_frame4.png",
  69. },
  70. after_place_node = function(pos, placer)
  71. local meta = minetest.get_meta(pos)
  72. meta:set_string("player_name", placer:get_player_name())
  73. local number = tubelib.add_node(pos, "tubelib_addons3:pusher")
  74. State:node_init(pos, number)
  75. end,
  76. on_rightclick = function(pos, node, clicker)
  77. if not minetest.is_protected(pos, clicker:get_player_name()) then
  78. State:start(pos, M(pos))
  79. end
  80. end,
  81. on_dig = function(pos, node, player)
  82. State:on_dig_node(pos, node, player)
  83. tubelib.remove_node(pos)
  84. end,
  85. on_timer = keep_running,
  86. on_rotate = screwdriver.disallow,
  87. paramtype = "light",
  88. sunlight_propagates = true,
  89. paramtype2 = "facedir",
  90. groups = {choppy=2, cracky=2, crumbly=2},
  91. is_ground_content = false,
  92. sounds = default.node_sound_wood_defaults(),
  93. })
  94. minetest.register_node("tubelib_addons3:pusher_active", {
  95. description = S("HighPerf Pusher"),
  96. tiles = {
  97. -- up, down, right, left, back, front
  98. {
  99. image = "tubelib_addons3_pusher_active.png",
  100. backface_culling = false,
  101. animation = {
  102. type = "vertical_frames",
  103. aspect_w = 32,
  104. aspect_h = 32,
  105. length = 2.0,
  106. },
  107. },
  108. {
  109. image = "tubelib_addons3_pusher_active.png",
  110. backface_culling = false,
  111. animation = {
  112. type = "vertical_frames",
  113. aspect_w = 32,
  114. aspect_h = 32,
  115. length = 2.0,
  116. },
  117. },
  118. 'tubelib_outp.png^tubelib_addons3_node_frame4.png',
  119. 'tubelib_inp.png^tubelib_addons3_node_frame4.png',
  120. {
  121. image = "tubelib_addons3_pusher_active.png^[transformR180]",
  122. backface_culling = false,
  123. animation = {
  124. type = "vertical_frames",
  125. aspect_w = 32,
  126. aspect_h = 32,
  127. length = 2.0,
  128. },
  129. },
  130. {
  131. image = "tubelib_addons3_pusher_active.png",
  132. backface_culling = false,
  133. animation = {
  134. type = "vertical_frames",
  135. aspect_w = 32,
  136. aspect_h = 32,
  137. length = 2.0,
  138. },
  139. },
  140. },
  141. on_rightclick = function(pos, node, clicker)
  142. if not minetest.is_protected(pos, clicker:get_player_name()) then
  143. State:stop(pos, M(pos))
  144. end
  145. end,
  146. on_timer = keep_running,
  147. on_rotate = screwdriver.disallow,
  148. diggable = false,
  149. can_dig = function() return false end,
  150. paramtype = "light",
  151. sunlight_propagates = true,
  152. paramtype2 = "facedir",
  153. groups = {crumbly=0, not_in_creative_inventory=1},
  154. is_ground_content = false,
  155. sounds = default.node_sound_wood_defaults(),
  156. })
  157. minetest.register_node("tubelib_addons3:pusher_defect", {
  158. description = S("HighPerf Pusher"),
  159. tiles = {
  160. -- up, down, right, left, back, front
  161. 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png',
  162. 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png',
  163. 'tubelib_outp.png^tubelib_addons3_node_frame4.png^tubelib_defect.png',
  164. 'tubelib_inp.png^tubelib_addons3_node_frame4.png^tubelib_defect.png',
  165. "tubelib_pusher1.png^[transformR180]^tubelib_addons3_node_frame4.png^[transformR180]^tubelib_defect.png",
  166. "tubelib_pusher1.png^tubelib_addons3_node_frame4.png^tubelib_defect.png",
  167. },
  168. after_place_node = function(pos, placer)
  169. local meta = minetest.get_meta(pos)
  170. meta:set_string("player_name", placer:get_player_name())
  171. local number = tubelib.add_node(pos, "tubelib_addons3:pusher")
  172. State:node_init(pos, number)
  173. State:defect(pos, meta)
  174. end,
  175. after_dig_node = function(pos)
  176. tubelib.remove_node(pos)
  177. end,
  178. on_timer = keep_running,
  179. on_rotate = screwdriver.disallow,
  180. paramtype = "light",
  181. sunlight_propagates = true,
  182. paramtype2 = "facedir",
  183. groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1},
  184. is_ground_content = false,
  185. sounds = default.node_sound_wood_defaults(),
  186. })
  187. minetest.register_craft({
  188. output = "tubelib_addons3:pusher",
  189. recipe = {
  190. {"default:tin_ingot", "tubelib:pusher", ""},
  191. {"tubelib:pusher", "default:gold_ingot", ""},
  192. {"", "", ""},
  193. },
  194. })
  195. tubelib.register_node("tubelib_addons3:pusher",
  196. {"tubelib_addons3:pusher_active", "tubelib_addons3:pusher_defect"}, {
  197. is_pusher = true, -- is a pulling/pushing node
  198. valid_sides = {"R","L"},
  199. on_recv_message = function(pos, topic, payload)
  200. local resp = State:on_receive_message(pos, topic, payload)
  201. if resp then
  202. return resp
  203. else
  204. return "unsupported"
  205. end
  206. end,
  207. on_node_load = function(pos)
  208. State:on_node_load(pos)
  209. end,
  210. on_node_repair = function(pos)
  211. return State:on_node_repair(pos)
  212. end,
  213. })