sluice.lua 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. for i=0,8 do
  2. local nici = 1
  3. if i == 0 then
  4. nici = 0
  5. end
  6. minetest.register_node("springs:sluice_gate_"..i, {
  7. description = "Sluice Gate",
  8. drawtype = "nodebox",
  9. node_box = {
  10. type = "fixed",
  11. fixed = {
  12. -- top bar
  13. {-.3, .3, -.15, .3, .5, .15},
  14. -- sides
  15. {-.5, -.5, -.4, -.3, .5, .4},
  16. {.3, -.5, -.4, .5, .5, .4},
  17. -- rod
  18. {-.01, .5, -.01, .01, 1.0, .01 },
  19. -- handle
  20. {-.02, 1.0 - .01, -.02, .02, 1.01, .02 },
  21. {-.06, 1.0 - .01, -.01, .06, 1.0, .01 },
  22. {-.01, 1.0 - .01, -.06, .01, 1.0, .06 },
  23. -- gate
  24. {-.3, -.5 + (.08 * i), -.02, .3, .3, .02},
  25. },
  26. },
  27. connects_to = { "group:water_pipe", "group:water_fixture" },
  28. paramtype = "light",
  29. paramtype2 = "facedir",
  30. is_ground_content = false,
  31. tiles = { "default_copper_block.png" },
  32. walkable = true,
  33. groups = { cracky = 3, sluice_gate = i, not_in_creative_inventory = nici },
  34. drop = "springs:sluice_gate_0",
  35. on_place = minetest.rotate_node,
  36. on_punch = function(pos)
  37. local node = minetest.get_node(pos)
  38. local n = math.min(8, i + 1)
  39. minetest.set_node(pos, {name = "springs:sluice_gate_"..n, param2 = node.param2})
  40. end,
  41. on_rightclick = function(pos)
  42. local node = minetest.get_node(pos)
  43. local n = math.max(0, i - 1)
  44. minetest.set_node(pos, {name = "springs:sluice_gate_"..n, param2 = node.param2})
  45. end,
  46. })
  47. end
  48. minetest.register_abm({
  49. nodenames = {"group:sluice_gate"},
  50. neighbors = {"group:fresh_water"},
  51. interval = 1,
  52. chance = 1,
  53. action = function(pos)
  54. local node = minetest.get_node(pos)
  55. local rate = minetest.get_item_group(node.name, "sluice_gate") * 4
  56. if rate == 0 then
  57. return
  58. end
  59. local back_dir = minetest.facedir_to_dir(node.param2)
  60. local backpos = vector.add(pos, back_dir)
  61. local backnode = minetest.get_node(backpos)
  62. -- print("back node: "..backnode.name)
  63. local backlevel = minetest.get_node_level(backpos)
  64. local front_dir = vector.multiply(back_dir, -1)
  65. local frontpos = vector.add(pos, front_dir)
  66. local frontnode = minetest.get_node(frontpos)
  67. local frontlevel = minetest.get_node_level(frontpos)
  68. if frontnode.name ~= "air" and frontnode.name ~= "springs:water" then
  69. -- print("not front")
  70. return
  71. end
  72. if backnode.name ~= "air" and backnode.name ~= "springs:water" then
  73. -- print("not back: ".. backnode.name)
  74. return
  75. end
  76. -- print("back level: "..backlevel)
  77. -- print("front level: "..frontlevel)
  78. if math.abs(backlevel - frontlevel) < 2 then
  79. return
  80. end
  81. if frontlevel > backlevel then
  82. local tmppos = backpos
  83. local tmpnode = backnode
  84. local tmplevel = backlevel
  85. backnode = frontnode
  86. backpos = frontpos
  87. backlevel = frontlevel
  88. frontnode = tmpnode
  89. frontpos = tmppos
  90. frontlevel = tmplevel
  91. end
  92. -- from back to front
  93. local max_cap = 64 - frontlevel
  94. local max_avail = backlevel
  95. local diff = backlevel - frontlevel
  96. local half = math.floor(diff / 2)
  97. local trans = math.min(rate, math.min(half, math.min(max_avail, max_cap)))
  98. -- print("trans: " .. trans)
  99. -- print("front pos: "..frontpos.x ..","..frontpos.y.. ","..frontpos.z)
  100. minetest.set_node_level(backpos, backlevel - trans)
  101. if frontnode.name == "air" then
  102. minetest.set_node(frontpos, {name= "springs:water"})
  103. minetest.set_node_level(frontpos, trans)
  104. else
  105. -- print("setting front level: ".. (frontlevel + trans))
  106. minetest.set_node_level(frontpos, frontlevel + trans)
  107. end
  108. end
  109. })