From 286c9c86fc3c3ec008be3061595052567ad1f103 Mon Sep 17 00:00:00 2001 From: Izzy Date: Mon, 8 Apr 2019 23:36:00 -0600 Subject: [PATCH] vapors --- fluids.lua | 59 +++++++++++++----- init.lua | 1 + vapors.lua | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 223 insertions(+), 16 deletions(-) create mode 100644 vapors.lua diff --git a/fluids.lua b/fluids.lua index 6cb467f..bc4dddd 100644 --- a/fluids.lua +++ b/fluids.lua @@ -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, diff --git a/init.lua b/init.lua index 214ebb6..40ed71a 100644 --- a/init.lua +++ b/init.lua @@ -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 diff --git a/vapors.lua b/vapors.lua new file mode 100644 index 0000000..dd55b7b --- /dev/null +++ b/vapors.lua @@ -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 +}) + + +