141 lines
3.4 KiB
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
|
|
})
|
|
|
|
|
|
|