minetest_springs/sluice.lua

141 lines
3.4 KiB
Lua

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
})