Dynamic water
parent
1fded82c2e
commit
d4635146e2
|
@ -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
|
|
@ -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")
|
|
@ -1,2 +1,3 @@
|
|||
name = pmb_nodes_surface
|
||||
author = PMB team
|
||||
depends = pmb_node_update
|
Loading…
Reference in New Issue