123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- for i=0,8 do
- local nici = 1
- if i == 0 then
- nici = 0
- end
- minetest.register_node("springs:sluice_gate_"..i, {
- description = "Sluice Gate",
- drawtype = "nodebox",
- node_box = {
- type = "fixed",
- fixed = {
- -- top bar
- {-.3, .3, -.15, .3, .5, .15},
-
- -- sides
- {-.5, -.5, -.4, -.3, .5, .4},
- {.3, -.5, -.4, .5, .5, .4},
-
- -- rod
- {-.01, .5, -.01, .01, 1.0, .01 },
- -- handle
- {-.02, 1.0 - .01, -.02, .02, 1.01, .02 },
- {-.06, 1.0 - .01, -.01, .06, 1.0, .01 },
- {-.01, 1.0 - .01, -.06, .01, 1.0, .06 },
-
- -- gate
- {-.3, -.5 + (.08 * i), -.02, .3, .3, .02},
-
- },
- },
- connects_to = { "group:water_pipe", "group:water_fixture" },
- paramtype = "light",
- paramtype2 = "facedir",
- is_ground_content = false,
- tiles = { "default_copper_block.png" },
- walkable = true,
- groups = { cracky = 3, sluice_gate = i, not_in_creative_inventory = nici },
- drop = "springs:sluice_gate_0",
- on_place = minetest.rotate_node,
- on_punch = function(pos)
- local node = minetest.get_node(pos)
- local n = math.min(8, i + 1)
- minetest.set_node(pos, {name = "springs:sluice_gate_"..n, param2 = node.param2})
- end,
- on_rightclick = function(pos)
- local node = minetest.get_node(pos)
- local n = math.max(0, i - 1)
- minetest.set_node(pos, {name = "springs:sluice_gate_"..n, param2 = node.param2})
-
- end,
-
- })
- end
- minetest.register_abm({
- nodenames = {"group:sluice_gate"},
- neighbors = {"group:fresh_water"},
- interval = 1,
- chance = 1,
- action = function(pos)
- local node = minetest.get_node(pos)
-
- local rate = minetest.get_item_group(node.name, "sluice_gate") * 4
- if rate == 0 then
- return
- end
-
- local back_dir = minetest.facedir_to_dir(node.param2)
- local backpos = vector.add(pos, back_dir)
- local backnode = minetest.get_node(backpos)
- -- print("back node: "..backnode.name)
- local backlevel = minetest.get_node_level(backpos)
-
- local front_dir = vector.multiply(back_dir, -1)
- local frontpos = vector.add(pos, front_dir)
- local frontnode = minetest.get_node(frontpos)
- local frontlevel = minetest.get_node_level(frontpos)
-
- if frontnode.name ~= "air" and frontnode.name ~= "springs:water" then
- -- print("not front")
- return
- end
- if backnode.name ~= "air" and backnode.name ~= "springs:water" then
- -- print("not back: ".. backnode.name)
- return
- end
-
- -- print("back level: "..backlevel)
- -- print("front level: "..frontlevel)
-
- if math.abs(backlevel - frontlevel) < 2 then
- return
- end
-
- if frontlevel > backlevel then
- local tmppos = backpos
- local tmpnode = backnode
- local tmplevel = backlevel
- backnode = frontnode
- backpos = frontpos
- backlevel = frontlevel
- frontnode = tmpnode
- frontpos = tmppos
- frontlevel = tmplevel
- end
-
- -- from back to front
-
- local max_cap = 64 - frontlevel
- local max_avail = backlevel
- local diff = backlevel - frontlevel
- local half = math.floor(diff / 2)
- local trans = math.min(rate, math.min(half, math.min(max_avail, max_cap)))
- -- print("trans: " .. trans)
- -- print("front pos: "..frontpos.x ..","..frontpos.y.. ","..frontpos.z)
- minetest.set_node_level(backpos, backlevel - trans)
- if frontnode.name == "air" then
- minetest.set_node(frontpos, {name= "springs:water"})
- minetest.set_node_level(frontpos, trans)
- else
- -- print("setting front level: ".. (frontlevel + trans))
- minetest.set_node_level(frontpos, frontlevel + trans)
- end
-
-
-
- end
- })
|