forked from Minetest/dynamic_liquid
add the "flow-through" feature
allows liquid to teleport through nodes that it should logically be able to pass through.mineclone_compatibility
parent
ab3ff81b86
commit
ee8d50991d
|
@ -1,3 +1,4 @@
|
||||||
default?
|
default?
|
||||||
intllib?
|
intllib?
|
||||||
doc?
|
doc?
|
||||||
|
xpanes?
|
118
init.lua
118
init.lua
|
@ -1,11 +1,15 @@
|
||||||
dynamic_liquid = {} -- global table to expose liquid_abm for other mods' usage
|
dynamic_liquid = {} -- global table to expose liquid_abm for other mods' usage
|
||||||
|
|
||||||
|
dynamic_liquid.registered_liquids = {} -- used by the flow-through node abm
|
||||||
|
dynamic_liquid.registered_liquid_neighbors = {}
|
||||||
|
|
||||||
-- internationalization boilerplate
|
-- internationalization boilerplate
|
||||||
local MP = minetest.get_modpath(minetest.get_current_modname())
|
local MP = minetest.get_modpath(minetest.get_current_modname())
|
||||||
local S, NS = dofile(MP.."/intllib.lua")
|
local S, NS = dofile(MP.."/intllib.lua")
|
||||||
|
|
||||||
-- By making this giant table of all possible permutations of horizontal direction we can avoid
|
-- By making this giant table of all possible permutations of horizontal direction we can avoid
|
||||||
-- lots of redundant calculations.
|
-- lots of redundant calculations.
|
||||||
|
|
||||||
local all_direction_permutations = {
|
local all_direction_permutations = {
|
||||||
{{x=0,z=1},{x=0,z=-1},{x=1,z=0},{x=-1,z=0}},
|
{{x=0,z=1},{x=0,z=-1},{x=1,z=0},{x=-1,z=0}},
|
||||||
{{x=0,z=1},{x=0,z=-1},{x=-1,z=0},{x=1,z=0}},
|
{{x=0,z=1},{x=0,z=-1},{x=-1,z=0},{x=1,z=0}},
|
||||||
|
@ -36,8 +40,12 @@ local all_direction_permutations = {
|
||||||
local get_node = minetest.get_node
|
local get_node = minetest.get_node
|
||||||
local set_node = minetest.set_node
|
local set_node = minetest.set_node
|
||||||
|
|
||||||
|
-- Dynamic liquids
|
||||||
|
-----------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
dynamic_liquid.liquid_abm = function(liquid, flowing_liquid, chance)
|
dynamic_liquid.liquid_abm = function(liquid, flowing_liquid, chance)
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
|
label = "dynamic_liquid " .. liquid,
|
||||||
nodenames = {liquid},
|
nodenames = {liquid},
|
||||||
neighbors = {flowing_liquid},
|
neighbors = {flowing_liquid},
|
||||||
interval = 1,
|
interval = 1,
|
||||||
|
@ -69,7 +77,9 @@ dynamic_liquid.liquid_abm = function(liquid, flowing_liquid, chance)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
dynamic_liquid.registered_liquids[liquid] = flowing_liquid
|
||||||
|
table.insert(dynamic_liquid.registered_liquid_neighbors, liquid)
|
||||||
end
|
end
|
||||||
|
|
||||||
if not minetest.get_modpath("default") then
|
if not minetest.get_modpath("default") then
|
||||||
|
@ -119,6 +129,110 @@ if river_water then
|
||||||
dynamic_liquid.liquid_abm("default:river_water_source", "default:river_water_flowing", river_water_probability)
|
dynamic_liquid.liquid_abm("default:river_water_source", "default:river_water_flowing", river_water_probability)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Flow-through nodes
|
||||||
|
-----------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local flow_through = minetest.setting_getbool("dynamic_liquid_flow_through")
|
||||||
|
flow_through = flow_through or flow_through == nil -- default true
|
||||||
|
|
||||||
|
if flow_through then
|
||||||
|
|
||||||
|
local flow_through_directions = {
|
||||||
|
{{x=1,z=0},{x=0,z=1}},
|
||||||
|
{{x=0,z=1},{x=1,z=0}},
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.register_abm({
|
||||||
|
label = "dynamic_liquid flow-through",
|
||||||
|
nodenames = {"group:flow_through", "group:leaves", "group:sapling", "group:grass", "group:dry_grass", "group:flora", "groups:rail", "groups:flower"},
|
||||||
|
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 = minetest.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,
|
||||||
|
})
|
||||||
|
|
||||||
|
local add_flow_through = function(node_name)
|
||||||
|
minetest.debug("adding flow through to", node_name)
|
||||||
|
local node_def = minetest.registered_nodes[node_name]
|
||||||
|
new_groups = node_def.groups
|
||||||
|
new_groups.flow_through = 1
|
||||||
|
minetest.override_item(node_name,{groups = groups})
|
||||||
|
end
|
||||||
|
|
||||||
|
if minetest.get_modpath("default") then
|
||||||
|
for _, name in pairs({
|
||||||
|
"default:apple",
|
||||||
|
"default:papyrus",
|
||||||
|
"default:dry_shrub",
|
||||||
|
"default:bush_stem",
|
||||||
|
"default:acacia_bush_stem",
|
||||||
|
"default:sign_wall_wood",
|
||||||
|
"default:sign_wall_steel",
|
||||||
|
"default:ladder_wood",
|
||||||
|
"default:ladder_steel",
|
||||||
|
"default:fence_wood",
|
||||||
|
"default:fence_acacia_wood",
|
||||||
|
"default:fence_junglewood",
|
||||||
|
"default:fence_pine_wood",
|
||||||
|
"default:fence_aspen_wood",
|
||||||
|
}) do
|
||||||
|
add_flow_through(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if minetest.get_modpath("xpanes") then
|
||||||
|
add_flow_through("xpanes:bar")
|
||||||
|
add_flow_through("xpanes:bar_flat")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Springs
|
||||||
|
-----------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
local duplicate_def = function (name)
|
local duplicate_def = function (name)
|
||||||
local old_def = minetest.registered_nodes[name]
|
local old_def = minetest.registered_nodes[name]
|
||||||
local new_def = {}
|
local new_def = {}
|
||||||
|
@ -162,6 +276,7 @@ if springs then
|
||||||
end)
|
end)
|
||||||
|
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
|
label = "dynamic_liquid damp clay spring",
|
||||||
nodenames = {"dynamic_liquid:clay"},
|
nodenames = {"dynamic_liquid:clay"},
|
||||||
neighbors = {"air", "default:water_source", "default:water_flowing"},
|
neighbors = {"air", "default:water_source", "default:water_flowing"},
|
||||||
interval = 1,
|
interval = 1,
|
||||||
|
@ -200,6 +315,7 @@ if springs then
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
|
label = "dynamic_liquid creative spring",
|
||||||
nodenames = {"dynamic_liquid:spring"},
|
nodenames = {"dynamic_liquid:spring"},
|
||||||
neighbors = {"air", "default:water_flowing"},
|
neighbors = {"air", "default:water_flowing"},
|
||||||
interval = 1,
|
interval = 1,
|
||||||
|
|
|
@ -16,6 +16,14 @@ dynamic_liquid_lava (Dynamic lava) bool true
|
||||||
#source in creative mode.
|
#source in creative mode.
|
||||||
dynamic_liquid_springs (Springs) bool true
|
dynamic_liquid_springs (Springs) bool true
|
||||||
|
|
||||||
|
#Allows dynamic liquids to "teleport" through nodes that should allow liquids to
|
||||||
|
#pass through. This includes the groups:
|
||||||
|
#leaves, sapling, grass, dry_grass, flora, rail, flower
|
||||||
|
#As well as select other nodes from the default game's definitions. Other mods
|
||||||
|
#can set nodes as flow-through by adding them to these groups or to the group
|
||||||
|
#"flow_through"
|
||||||
|
dynamic_liquid_flow_through (Flow-through) bool true
|
||||||
|
|
||||||
[Flow Rates]
|
[Flow Rates]
|
||||||
|
|
||||||
#Sets the probability of water flow per block per second.
|
#Sets the probability of water flow per block per second.
|
||||||
|
|
Loading…
Reference in New Issue