7bdc95c60a
* splitting up and genericizing some code, localizing default-dependent stuff in one file * make cooling lava an API as well * split out spring code, start roughing in mineclone support * ooh, at some point altitude checking was added to ABM definitions. Awesome. * fix crash in flow through * adding mapgen spring clay. Mineclone2 and Mineclone5 both need to accept pull requests fixing bugs before this will work
62 lines
2.0 KiB
Lua
62 lines
2.0 KiB
Lua
local flow_through_directions = {
|
|
{{x=1,z=0},{x=0,z=1}},
|
|
{{x=0,z=1},{x=1,z=0}},
|
|
}
|
|
|
|
local get_node = minetest.get_node
|
|
local set_node = minetest.set_node
|
|
|
|
dynamic_liquid.flow_through_abm = function(def)
|
|
|
|
minetest.register_abm({
|
|
label = "dynamic_liquid flow-through",
|
|
nodenames = def.nodenames,
|
|
neighbors = dynamic_liquid.registered_liquid_neighbors,
|
|
interval = 1,
|
|
chance = 2, -- since liquid is teleported two nodes by this abm, halve the chance
|
|
catch_up = false,
|
|
action = function(pos)
|
|
local source_pos = {x=pos.x, y=pos.y+1, z=pos.z}
|
|
local dest_pos = {x=pos.x, y=pos.y-1, z=pos.z}
|
|
local source_node = get_node(source_pos)
|
|
local dest_node
|
|
local source_flowing_node = dynamic_liquid.registered_liquids[source_node.name]
|
|
local dest_flowing_node
|
|
if source_flowing_node ~= nil then
|
|
dest_node = get_node(dest_pos)
|
|
if dest_node.name == source_flowing_node or dest_node.name == "air" then
|
|
set_node(dest_pos, source_node)
|
|
set_node(source_pos, dest_node)
|
|
return
|
|
end
|
|
end
|
|
|
|
local perm = flow_through_directions[math.random(2)]
|
|
local dirs -- declare outside of loop so it won't keep entering/exiting scope
|
|
for i=1,2 do
|
|
dirs = perm[i]
|
|
-- reuse to avoid allocating a new table
|
|
source_pos.x = pos.x + dirs.x
|
|
source_pos.y = pos.y
|
|
source_pos.z = pos.z + dirs.z
|
|
|
|
dest_pos.x = pos.x - dirs.x
|
|
dest_pos.y = pos.y
|
|
dest_pos.z = pos.z - dirs.z
|
|
|
|
source_node = get_node(source_pos)
|
|
dest_node = get_node(dest_pos)
|
|
source_flowing_node = dynamic_liquid.registered_liquids[source_node.name]
|
|
dest_flowing_node = dynamic_liquid.registered_liquids[dest_node.name]
|
|
|
|
if (source_flowing_node ~= nil and (dest_node.name == source_flowing_node or dest_node.name == "air")) or
|
|
(dest_flowing_node ~= nil and (source_node.name == dest_flowing_node or source_node.name == "air"))
|
|
then
|
|
set_node(source_pos, dest_node)
|
|
set_node(dest_pos, source_node)
|
|
return
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
end |