Dynamic water

master
opfromthestart 2022-08-28 17:15:58 -04:00
parent 1fded82c2e
commit d4635146e2
3 changed files with 89 additions and 8 deletions

View File

@ -0,0 +1,70 @@
pmb_fluid_api = {}
pmb_fluid_api.box = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }
function pmb_fluid_api.register_fluid(name, nodedef)
nodedef.groups.dynamic_fluid = 1
nodedef.leveled = 64
nodedef.drawtype = "nodebox"
nodedef.node_box = {
type = "leveled",
fixed = pmb_fluid_api.box,
}
minetest.register_node(name, nodedef)
end
local flows = {
vector.new(1, 0, 0),
vector.new(-1, 0, 0),
vector.new(0, 0, 1),
vector.new(0, 0, -1),
}
function pmb_fluid_api.flow(pos, to_name)
local node = minetest.get_node(pos)
local flow = vector.new(0, -1, 0)
local flow_pos = vector.add(flow, pos)
local flow_node = minetest.get_node(flow_pos)
if flow_node.name == to_name or flow_node.name == "air" then
minetest.set_node(flow_pos, node)
minetest.set_node(pos, flow_node)
return
end
local offset = math.random(4)
for i = 1, 4 do
flow = flows[(offset + i) % 4 + 1]
flow_pos = vector.add(flow, pos)
flow_node = minetest.get_node(flow_pos)
if flow_node.name == to_name or flow_node.name == "air" then
minetest.set_node(flow_pos, node)
minetest.set_node(pos, flow_node)
return
end
end
end
function pmb_fluid_api.flow_maybe(chance)
return function(pos)
if math.random() < chance then
pmb_fluid_api.flow(pos)
end
end
end
function pmb_fluid_api.register_flow(from_name, to_name)
local nodedef = minetest.registered_nodes[from_name]
minetest.register_abm({
label = "Fluid flow "..from_name,
nodenames = { from_name },
neighbors = { to_name },
interval = (.5 + nodedef.liquid_viscosity),
chance = 1,
action = function(pos)
minetest.after(0, pmb_fluid_api.flow, pos, to_name)
end
})
end

View File

@ -1,8 +1,13 @@
local mod_name = minetest.get_current_modname()
local mod_path = minetest.get_modpath(mod_name)
dofile(mod_path .. DIR_DELIM .. "api.lua")
pmb_nodes_surface = {}
minetest.register_node('pmb_nodes_surface:water_source', {
description = 'Water Source',
groups = { water_source = 1, oddly_breakable_by_hand = 3, liquid = 1, water = 1, flowing = 0 },
groups = { water_source = 1, oddly_breakable_by_hand = 3, liquid = 1, water = 1, flowing = 0, dynamic_source=1 },
tiles = { {
name = 'pmb_surface_water.png^[opacity:190',
@ -21,13 +26,16 @@ minetest.register_node('pmb_nodes_surface:water_source', {
buildable_to = true,
liquidtype = "source",
liquid_viscosity = 0,
liquid_renewable = false,
liquid_range = 8,
liquid_alternative_source = "pmb_nodes_surface:water_source",
liquid_alternative_flowing = "pmb_nodes_surface:water_flowing",
--_on_node_update = pmb_fluid_api.flow_maybe(0.5)
})
minetest.register_node('pmb_nodes_surface:water_flowing', {
description = 'Water Source',
groups = { water_flowing = 1, oddly_breakable_by_hand = 3, liquid = 1, water = 1, flowing = 1 },
description = 'Water Flowing',
groups = { water_flowing = 1, oddly_breakable_by_hand = 3, liquid = 1, water = 1, flowing = 1, dynamic_flow=1 },
special_tiles = {
{
@ -55,17 +63,17 @@ minetest.register_node('pmb_nodes_surface:water_flowing', {
buildable_to = true,
liquidtype = "flowing",
liquid_viscosity = 0,
liquid_renewable = false,
-- liquid_range = 8,
liquid_alternative_source = "pmb_nodes_surface:water_source",
liquid_alternative_flowing = "pmb_nodes_surface:water_flowing",
})
pmb_fluid_api.register_flow("pmb_nodes_surface:water_source", "pmb_nodes_surface:water_flowing")
minetest.register_node('pmb_nodes_surface:river_water_source', {
description = 'Water Source',
description = 'River Water Source',
groups = { water_source = 1, oddly_breakable_by_hand = 3, liquid = 1, water = 1, flowing = 0 },
tiles = { {
@ -88,7 +96,7 @@ minetest.register_node('pmb_nodes_surface:river_water_source', {
liquid_range = 8,
})
minetest.register_node('pmb_nodes_surface:riverwater_flowing', {
description = 'Water Source',
description = 'River Water Flowing',
groups = { water_flowing = 1, oddly_breakable_by_hand = 3, liquid = 1, water = 1, flowing = 1 },
special_tiles = {
@ -156,7 +164,7 @@ minetest.register_node('pmb_nodes_surface:lava_source', {
})
minetest.register_node('pmb_nodes_surface:lava_flowing', {
description = 'Water Source',
description = 'Lava Flowing',
groups = { lava_flowing = 1, oddly_breakable_by_hand = 3, liquid = 1, lava = 1, flowing = 1 },
special_tiles = {
@ -191,3 +199,5 @@ minetest.register_node('pmb_nodes_surface:lava_flowing', {
liquid_alternative_source = "pmb_nodes_surface:lava_source",
liquid_alternative_flowing = "pmb_nodes_surface:lava_flowing",
})
pmb_fluid_api.register_flow("pmb_nodes_surface:lava_source", "pmb_nodes_surface:lava_flowing")

View File

@ -1,2 +1,3 @@
name = pmb_nodes_surface
author = PMB team
depends = pmb_node_update