spout.lua 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. local function swap_node(pos, name)
  2. local node = minetest.get_node(pos)
  3. if node.name == name then
  4. return
  5. end
  6. node.name = name
  7. minetest.swap_node(pos, node)
  8. end
  9. minetest.register_node("forge:spout", {
  10. description = "Spout",
  11. drawtype = "nodebox",
  12. node_box = {
  13. type = "fixed",
  14. fixed = {
  15. -- top bar
  16. {-.3, .3, -.35, .3, .5, .35},
  17. -- sides
  18. {-.5, -.5, -.35, -.3, .5, .35},
  19. {.3, -.5, -.35, .5, .5, .35},
  20. -- bottom bar
  21. {-.3, -.5, -.35, .3, -.3, .35},
  22. -- gate
  23. {-.45, -.45, -.1, .45, .45, .1 },
  24. },
  25. },
  26. tiles = {"default_bronze_block.png"},
  27. is_ground_content = false,
  28. paramtype2 = "facedir",
  29. groups = {cracky = 1, petroleum_fixture=1, refractory = 3},
  30. sounds = default.node_sound_glass_defaults(),
  31. on_place = minetest.rotate_node,
  32. on_punch = function(pos)
  33. swap_node(pos, "forge:spout_open")
  34. end,
  35. })
  36. minetest.register_node("forge:spout_open", {
  37. description = "Spout",
  38. drawtype = "nodebox",
  39. node_box = {
  40. type = "fixed",
  41. fixed = {
  42. -- top bar
  43. {-.3, .3, -.35, .3, .5, .35},
  44. -- sides
  45. {-.5, -.5, -.35, -.3, .5, .35},
  46. {.3, -.5, -.35, .5, .5, .35},
  47. -- bottom bar
  48. {-.3, -.5, -.35, .3, -.3, .35},
  49. },
  50. },
  51. tiles = {"default_bronze_block.png"},
  52. is_ground_content = false,
  53. paramtype2 = "facedir",
  54. groups = {cracky = 1, petroleum_fixture=1, refractory = 3},
  55. sounds = default.node_sound_glass_defaults(),
  56. on_place = minetest.rotate_node,
  57. on_punch = function(pos)
  58. swap_node(pos, "forge:spout")
  59. end,
  60. })
  61. minetest.register_abm({
  62. nodenames = {"forge:spout_open"},
  63. interval = 4,
  64. chance = 1,
  65. action = function(pos, node, active_object_count, active_object_count_wider)
  66. local node = minetest.get_node(pos)
  67. local back_dir = minetest.facedir_to_dir(node.param2)
  68. local backpos = vector.add(pos, back_dir)
  69. local front_dir = vector.multiply(back_dir, -1)
  70. local frontpos = vector.add(pos, front_dir)
  71. local bnode = minetest.get_node(backpos)
  72. local fnode = minetest.get_node(frontpos)
  73. if fnode.name ~= "air" and bnode.name ~= "air" then
  74. -- print("forge spout: nowhere to flow to")
  75. return
  76. end
  77. local bdef = minetest.registered_nodes[bnode.name]
  78. local fdef = minetest.registered_nodes[fnode.name]
  79. if not bdef.groups.molten_ore_source and not fdef.groups.molten_ore_source then
  80. -- print("forge spout: no molten ore source")
  81. return
  82. end
  83. if fnode.name == "air" then
  84. minetest.set_node(frontpos, {name = bnode.name})
  85. minetest.set_node(backpos, {name = "air"})
  86. else
  87. minetest.set_node(backpos, {name = fnode.name})
  88. minetest.set_node(frontpos, {name = "air"})
  89. end
  90. end
  91. })
  92. minetest.register_craft({
  93. output = 'forge:spout',
  94. recipe = {
  95. {'forge:refractory_clay_brick', 'default:steel_ingot', 'forge:refractory_clay_brick'},
  96. {'', '', ''},
  97. {'', '', ''},
  98. }
  99. })