airpump.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. local has_pipeworks = minetest.get_modpath("pipeworks")
  2. local tube_entry = ""
  3. if has_pipeworks then
  4. tube_entry = "^pipeworks_tube_connection_wooden.png"
  5. end
  6. local has_full_air_bottle = function(inv)
  7. return inv:contains_item("main", {name="vacuum:air_bottle", count=1})
  8. end
  9. local has_empty_air_bottle = function(inv)
  10. return inv:contains_item("main", {name="vessels:steel_bottle", count=1})
  11. end
  12. local do_empty_bottle = function(inv)
  13. if not has_full_air_bottle(inv) then
  14. return false
  15. end
  16. local new_stack = ItemStack("vessels:steel_bottle")
  17. inv:remove_item("main", {name="vacuum:air_bottle", count=1})
  18. if inv:room_for_item("main", new_stack) then
  19. inv:add_item("main", new_stack)
  20. return true
  21. end
  22. return false
  23. end
  24. local do_fill_bottle = function(inv)
  25. if not has_empty_air_bottle(inv) then
  26. return false
  27. end
  28. local new_stack = ItemStack("vacuum:air_bottle")
  29. inv:remove_item("main", {name="vessels:steel_bottle", count=1})
  30. if inv:room_for_item("main", new_stack) then
  31. inv:add_item("main", new_stack)
  32. return true
  33. end
  34. return false
  35. end
  36. -- just enabled
  37. vacuum.airpump_enabled = function(meta)
  38. return meta:get_int("enabled") == 1
  39. end
  40. -- enabled and actively pumping
  41. vacuum.airpump_active = function(meta)
  42. local inv = meta:get_inventory()
  43. return vacuum.airpump_enabled(meta) and has_full_air_bottle(inv)
  44. end
  45. local update_infotext = function(meta)
  46. local str = "Airpump: "
  47. if vacuum.airpump_enabled(meta) then
  48. str = str .. " (Enabled)"
  49. else
  50. str = str .. " (Disabled)"
  51. end
  52. meta:set_string("infotext", str)
  53. end
  54. -- update airpump formspec
  55. local update_formspec = function(meta)
  56. local btnName = "State: "
  57. if meta:get_int("enabled") == 1 then
  58. btnName = btnName .. "<Enabled>"
  59. else
  60. btnName = btnName .. "<Disabled>"
  61. end
  62. meta:set_string("formspec", "size[8,7.2;]" ..
  63. "image[3,0;1,1;" .. vacuum.air_bottle_image .. "]" ..
  64. "image[4,0;1,1;vessels_steel_bottle.png]" ..
  65. "button[0,1;8,1;toggle;" .. btnName .. "]" ..
  66. "list[context;main;0,2;8,1;]" ..
  67. "list[current_player;main;0,3.2;8,4;]" ..
  68. "listring[]" ..
  69. "")
  70. update_infotext(meta)
  71. end
  72. minetest.register_node("vacuum:airpump", {
  73. description = "Air pump",--tube_entry
  74. tiles = { -- top, bottom
  75. "vacuum_airpump_top.png",
  76. "vacuum_airpump_side.png" .. tube_entry,
  77. "vacuum_airpump_side.png" .. tube_entry,
  78. "vacuum_airpump_side.png" .. tube_entry,
  79. "vacuum_airpump_side.png" .. tube_entry,
  80. "vacuum_airpump_front.png"
  81. },
  82. paramtype = "light",
  83. paramtype2 = "facedir",
  84. legacy_facedir_simple = true,
  85. groups = {cracky=3, oddly_breakable_by_hand=3, tubedevice=1, tubedevice_receiver=1},
  86. sounds = default.node_sound_glass_defaults(),
  87. mesecons = {effector = {
  88. action_on = function (pos, node)
  89. local meta = minetest.get_meta(pos)
  90. meta:set_int("enabled", 1)
  91. update_infotext(meta)
  92. end,
  93. action_off = function (pos, node)
  94. local meta = minetest.get_meta(pos)
  95. meta:set_int("enabled", 0)
  96. update_infotext(meta)
  97. end
  98. }},
  99. after_place_node = function(pos, placer)
  100. local meta = minetest.get_meta(pos)
  101. meta:set_string("owner", placer:get_player_name() or "")
  102. end,
  103. on_construct = function(pos)
  104. local meta = minetest.get_meta(pos)
  105. meta:set_int("enabled", 0)
  106. local inv = meta:get_inventory()
  107. inv:set_size("main", 8)
  108. update_formspec(meta)
  109. end,
  110. can_dig = function(pos,player)
  111. if player and player:is_player() and minetest.is_protected(pos, player:get_player_name()) then
  112. -- protected
  113. return false
  114. end
  115. local meta = minetest.get_meta(pos);
  116. local inv = meta:get_inventory()
  117. return inv:is_empty("main")
  118. end,
  119. allow_metadata_inventory_take = function(pos, listname, index, stack, player)
  120. if player and player:is_player() and minetest.is_protected(pos, player:get_player_name()) then
  121. -- protected
  122. return 0
  123. end
  124. return stack:get_count()
  125. end,
  126. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  127. if player and player:is_player() and minetest.is_protected(pos, player:get_player_name()) then
  128. -- protected
  129. return 0
  130. end
  131. return stack:get_count()
  132. end,
  133. on_receive_fields = function(pos, formname, fields, sender)
  134. local meta = minetest.get_meta(pos);
  135. if minetest.is_protected(pos, sender:get_player_name()) then
  136. -- not allowed
  137. return
  138. end
  139. if fields.toggle then
  140. if meta:get_int("enabled") == 1 then
  141. meta:set_int("enabled", 0)
  142. else
  143. meta:set_int("enabled", 1)
  144. end
  145. end
  146. update_formspec(meta)
  147. end,
  148. tube = {
  149. insert_object = function(pos, node, stack, direction)
  150. local meta = minetest.get_meta(pos)
  151. local inv = meta:get_inventory()
  152. return inv:add_item("main", stack)
  153. end,
  154. can_insert = function(pos, node, stack, direction)
  155. local meta = minetest.get_meta(pos)
  156. local inv = meta:get_inventory()
  157. stack = stack:peek_item(1)
  158. return inv:room_for_item("main", stack)
  159. end,
  160. input_inventory = "main",
  161. connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
  162. }
  163. })
  164. minetest.register_abm({
  165. label = "airpump",
  166. nodenames = {"vacuum:airpump"},
  167. interval = 5,
  168. chance = 1,
  169. action = function(pos)
  170. local meta = minetest.get_meta(pos)
  171. if vacuum.airpump_enabled(meta) then
  172. local used
  173. if vacuum.is_pos_in_space(pos) then
  174. used = do_empty_bottle(meta:get_inventory())
  175. else
  176. used = do_fill_bottle(meta:get_inventory())
  177. end
  178. if used then
  179. minetest.sound_play("vacuum_hiss", {pos = pos, gain = 0.5})
  180. minetest.add_particlespawner(
  181. 12, --amount
  182. 4, --time
  183. {x=pos.x-0.95, y=pos.y-0.95, z=pos.z-0.95},
  184. {x=pos.x+0.95, y=pos.y+0.95, z=pos.z+0.95},
  185. {x=-1.2, y=-1.2, z=-1.2},
  186. {x=1.2, y=1.2, z=1.2},
  187. {x=0,y=0,z=0},
  188. {x=0,y=0,z=0},
  189. 0.5,
  190. 1,
  191. 1,
  192. 2,
  193. false,
  194. "bubble.png"
  195. )
  196. end
  197. update_infotext(meta)
  198. end
  199. end
  200. })
  201. -- initial airpump step
  202. minetest.register_abm({
  203. label = "airpump seed",
  204. nodenames = {"vacuum:airpump"},
  205. neighbors = {"vacuum:vacuum"},
  206. interval = 1,
  207. chance = 1,
  208. action = function(pos)
  209. local meta = minetest.get_meta(pos)
  210. if vacuum.airpump_active(meta) then
  211. -- seed initial air
  212. local node = minetest.find_node_near(pos, 1, {"vacuum:vacuum"})
  213. if node ~= nil then
  214. minetest.set_node(node, {name = "air"})
  215. end
  216. end
  217. end
  218. })
  219. minetest.register_craft({
  220. output = "vacuum:airpump",
  221. recipe = {
  222. {"default:steel_ingot", "default:mese_block", "default:steel_ingot"},
  223. {"default:diamond", "default:glass", "default:steel_ingot"},
  224. {"default:steel_ingot", "default:steelblock", "default:steel_ingot"},
  225. },
  226. })