master
Izzy 2019-04-08 23:36:00 -06:00
parent dc9f144de1
commit 286c9c86fc
3 changed files with 223 additions and 16 deletions

View File

@ -208,24 +208,48 @@ local function register_fluid(modname, name, info)
if info.evap_chance > 0 then
-- evaporation
minetest.register_abm({
nodenames = {"group:"..gname},
neighbors = {"group:"..gname, "air"},
interval = info.evap_interval,
chance = info.evap_chance,
action = function(pos)
local mylevel = minetest.get_node_level(pos)
if math.random(16 - minetest.get_node_light(pos)) == 1 then
if mylevel > info.evap_rate then
minetest.set_node_level(pos, mylevel - info.evap_rate)
else
minetest.set_node(pos, {name = "air"})
if info.vapor == true then
-- evaporation to flammable vapors
minetest.register_abm({
nodenames = {"group:"..gname},
neighbors = {"air"},
interval = info.evap_interval,
chance = info.evap_chance,
action = function(pos)
local mylevel = minetest.get_node_level(pos)
if math.random(16 - minetest.get_node_light(pos)) == 1 then
if mylevel > info.evap_rate then
minetest.set_node_level(pos, mylevel - info.evap_rate)
local vn = minetest.find_node_near(pos, 1, {"air"})
if vn then
minetest.set_node(vn, {name = "bitumen:vapor_2"})
end
else
minetest.set_node(pos, {name = "bitumen:vapor_2"})
end
end
end
end
})
})
else
-- normal evaporation
minetest.register_abm({
nodenames = {"group:"..gname},
neighbors = {"air"},
interval = info.evap_interval,
chance = info.evap_chance,
action = function(pos)
local mylevel = minetest.get_node_level(pos)
if math.random(16 - minetest.get_node_light(pos)) == 1 then
if mylevel > info.evap_rate then
minetest.set_node_level(pos, mylevel - info.evap_rate)
else
minetest.set_node(pos, {name = "air"})
end
end
end
})
end
end
-- de-stagnation (faster flowing)
@ -382,6 +406,7 @@ register_fluid("bitumen", "mineral_spirits", {
colorize = "^[colorize:white:160",
post_effect_color = {a = 103, r = 30, g = 76, b = 90},
vapor = true,
evap_interval = 10,
evap_chance = 10,
evap_rate = 5,
@ -394,6 +419,7 @@ register_fluid("bitumen", "gasoline", {
colorize = "^[colorize:yellow:160",
post_effect_color = {a = 103, r = 30, g = 76, b = 90},
vapor = true,
evap_interval = 20,
evap_chance = 10,
evap_rate = 5,
@ -418,6 +444,7 @@ register_fluid("bitumen", "kerosene", {
colorize = "^[colorize:white:100",
post_effect_color = {a = 103, r = 80, g = 76, b = 190},
vapor = true,
evap_interval = 20,
evap_chance = 20,
evap_rate = 8,

View File

@ -90,6 +90,7 @@ dofile(modpath.."/burner.lua")
-- next core nodes
dofile(modpath.."/fluids.lua")
dofile(modpath.."/concrete.lua")
dofile(modpath.."/vapors.lua")
-- now the kitchen sink

179
vapors.lua Normal file
View File

@ -0,0 +1,179 @@
-- more concentrated
minetest.register_node("bitumen:vapor_2", {
description = "Vapor",
drawtype = "airlike",
pointable = false,
diggable = false,
buildable_to = true,
paramtype = "light",
sunlight_propagates = true,
-- post_effect_color = info.post_effect_color,
-- tiles = { "default_copper_block.png" },
groups = { not_in_creative_inventory = 1 },
})
-- less concentrated
minetest.register_node("bitumen:vapor_1", {
description = "Vapor",
drawtype = "airlike",
pointable = false,
diggable = false,
buildable_to = true,
paramtype = "light",
sunlight_propagates = true,
-- tiles = { "default_steel_block.png" },
groups = { not_in_creative_inventory = 1 },
})
--[[ for testing
minetest.register_node("bitumen:vapor_gen", {
description = "Vapor Generator",
tiles = { "default_steel_block.png" },
groups = { cracky = 1 },
})
minetest.register_abm({
nodenames = {"bitumen:vapor_gen"},
neighbors = {"air"},
interval = 3,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
pos.y = pos.y + 1
minetest.set_node(pos, {name="bitumen:vapor_2"})
end
})
]]
-- move around randomly
minetest.register_abm({
nodenames = {"bitumen:vapor_2", "bitumen:vapor_1"},
neighbors = {"air"},
interval = 4,
chance = 8,
action = function(pos, node, active_object_count, active_object_count_wider)
local name = node.name
local air_nodes = minetest.find_nodes_in_area(
{x=pos.x - 1, y=pos.y - 1, z=pos.z - 1},
{x=pos.x + 1, y=pos.y, z=pos.z + 1},
"air"
)
-- try to go down first
if #air_nodes > 0 and math.random(6) > 1 then
local off = math.random(#air_nodes)
--print("off "..dump(off).. " - " .. dump(#air_nodes))
minetest.set_node(pos, {name="air"})
minetest.set_node(air_nodes[off], {name=name})
return
end
-- go up if there's no down
air_nodes = minetest.find_nodes_in_area(
{x=pos.x - 1, y=pos.y + 1, z=pos.z - 1},
{x=pos.x + 1, y=pos.y + 1, z=pos.z + 1},
"air"
)
if #air_nodes > 0 then
off = math.random(#air_nodes)
minetest.set_node(pos, {name="air"})
minetest.set_node(air_nodes[off], {name=name})
end
end
})
-- diffuse away completely
minetest.register_abm({
nodenames = {"bitumen:vapor_1"},
neighbors = {"air"},
interval = 8,
chance = 16,
action = function(pos, node)
local air_nodes = minetest.find_nodes_in_area(
{x=pos.x - 1, y=pos.y - 1, z=pos.z - 1},
{x=pos.x + 1, y=pos.y + 1, z=pos.z + 1},
"air"
)
if #air_nodes > 12 then
minetest.set_node(pos, {name="air"})
end
end
})
-- diffuse
minetest.register_abm({
nodenames = {"bitumen:vapor_2"},
neighbors = {"air"},
interval = 4,
chance = 4,
action = function(pos, node, active_object_count, active_object_count_wider)
local air_nodes = minetest.find_nodes_in_area(
{x=pos.x - 1, y=pos.y - 1, z=pos.z - 1},
{x=pos.x + 1, y=pos.y + 1, z=pos.z + 1},
"air"
)
if #air_nodes > 0 then
local off = math.random(#air_nodes)
--print("off "..dump(off).. " - " .. dump(#air_nodes))
minetest.set_node(pos, {name="bitumen:vapor_1"})
minetest.set_node(air_nodes[off], {name="bitumen:vapor_1"})
end
end
})
-- go up in flames
minetest.register_abm({
nodenames = {"bitumen:vapor_1", "bitumen:vapor_2"},
neighbors = {"group:igniter", "default:torch"},
interval = 1,
chance = 3,
action = function(pos, node, active_object_count, active_object_count_wider)
local air_nodes = minetest.find_nodes_in_area(
{x=pos.x - 1, y=pos.y - 1, z=pos.z - 1},
{x=pos.x + 1, y=pos.y + 1, z=pos.z + 1},
{"air", "group:flammable"}
)
if #air_nodes > 0 then
local off = math.random(#air_nodes)
local num = math.random(#air_nodes / 2)
for i = 1,num do
--local theirlevel = minetest.get_node_level(fp)
local fp = air_nodes[((i + off) % #air_nodes) + 1]
minetest.set_node(fp, {name="fire:basic_flame"})
end
end
minetest.set_node(pos, {name="fire:basic_flame"})
end
})