init; updated fire-handling for use in newer luanti-versions

This commit is contained in:
Rainer 2026-02-12 13:31:10 +01:00
commit f389357776
34 changed files with 914 additions and 0 deletions

239
abms.lua Normal file
View file

@ -0,0 +1,239 @@
-- ~~~~~~~~~~~~~~~~~~~~~~~~
-- DRIFTING SMOKE
-- ~~~~~~~~~~~~~~~~~~~~~~~~
-- WHITE, BOTTOM SMOKE
-- Closest to fire, hotter, faster, more dense
minetest.register_abm({
nodenames = {
"group:smoky_d",
},
interval = 1,
chance = 1,
action = function(pos, node)
if
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z}, 2)
then
local white_or_grey = math.random(2)
minetest.add_particlespawner({
amount = 1,
time = 1,
minpos = {x=pos.x-0.1, y=pos.y+0.5, z=pos.z-0.3},
maxpos = {x=pos.x+0.1, y=pos.y+1.0, z=pos.z+0.1},
minvel = {x=-0.1, y=0.3, z=-0.3},
maxvel = {x=0.1, y=0.6, z=-0.5},
minacc = {x=0.0,y=0.3,z=-0.3},
maxacc = {x=0.0,y=0.6,z=-0.5},
minexptime = 1,
maxexptime = 3,
minsize = 8,
maxsize = 12,
collisiondetection = true,
texture = "smoke_"..white_or_grey..".png"
})
end
end
})
-- GREY, MIDDLE SMOKE
-- Cooler, slower, not as dense.
minetest.register_abm({
nodenames = {
"group:smoky_d",
},
-- The white and black smoke interval/chance are 1/2.
-- Grey smoke is in the middle and has to be there to connect the two.
-- So it's interval/chance is 1/1.
-- ~ LazyJ, 2014_07_28
interval = 1,
chance = 2,
action = function(pos, node)
local mgrey_or_dgrey = math.random(2)
-- The nodes.lua file does a space check for this area to determine whether
-- to use drifting smoke or non-drifting smoke. That *would* be enough *if*
-- nothing is built in this area *after* the smoke has been set in motion.
-- So I added an extra space check here just for that possibility.
-- ~ LazyJ, 2014_07_31
if
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z-1}, 3)
then
minetest.add_particlespawner({
amount = 1,
time = 1,
minpos = {x=pos.x-0.2, y=pos.y+0.5, z=pos.z-1.0},
maxpos = {x=pos.x+0.2, y=pos.y+1.0, z=pos.z-0.5},
minvel = {x=-0.1, y=0.3, z=-0.3},
maxvel = {x=0.1, y=0.6, z=-0.5},
minacc = {x=0.0,y=0.3,z=-0.3},
maxacc = {x=0.0,y=0.6,z=-0.5},
minexptime = 1,
maxexptime = 6,
minsize = 6,
maxsize = 11,
collisiondetection = true,
texture = "smoke2_"..mgrey_or_dgrey..".png"
})
end
end
})
-- BLACK, TOP SMOKE
-- Farthest from the fire, coolest, slowest, more spread out.
minetest.register_abm({
nodenames = {
"group:smoky_d",
},
interval = 1,
chance = 4,
action = function(pos, node)
if
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z-1}, 7) and
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z-2}, 7) and
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z-3}, 7) and
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z-4}, 7) and
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z-5}, 7)
then
minetest.add_particlespawner({
amount = 1,
time = 1,
minpos = {x=pos.x-0.4, y=pos.y+0.5, z=pos.z-0.4},
maxpos = {x=pos.x+0.4, y=pos.y+1.0, z=pos.z+0.4},
minvel = {x=-0.1, y=0.3, z=-0.3},
maxvel = {x=0.1, y=0.6, z=-0.5},
minacc = {x=0.0,y=0.3,z=-0.3},
maxacc = {x=0.0,y=0.6,z=-0.5},
minexptime = 2,
maxexptime = 4,
minsize = 6,
maxsize = 10,
collisiondetection = true,
texture = "black_smoke.png"
})
end
end
})
-- ~~~~~~~~~~~~~~~~~~~~~~~~
-- NON-DRIFTING SMOKE
-- ~~~~~~~~~~~~~~~~~~~~~~~~
-- WHITE, BOTTOM SMOKE
-- Closest to fire, hotter, faster, more dense
minetest.register_abm({
nodenames = {
"group:smoky_v",
},
interval = 1,
chance = 1,
action = function(pos, node)
if
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z}, 2)
then
local white_or_grey = math.random(2)
minetest.add_particlespawner({
amount = 1,
time = 1,
minpos = {x=pos.x, y=pos.y+0.2, z=pos.z},
maxpos = {x=pos.x, y=pos.y+1.5, z=pos.z},
minvel = {x=0.0, y=0.1, z=0.0},
maxvel = {x=0.0, y=0.6, z=0.0},
minacc = {x=0.0,y=0.1,z=0.0},
maxacc = {x=0.0,y=0.6,z=0.0},
minexptime = 1.0,
maxexptime = 3.0,
minsize = 7,
-- a maxsize larger than 10 and the biggest smoke particle gets stuck
-- in a 1x1 chimney flue. ~ LazyJ, 2014_07_30
maxsize = 10,
collisiondetection = true,
texture = "smoke_"..white_or_grey..".png"
--texture = "top_03.png"
})
end
end
})
-- GREY, MIDDLE SMOKE
-- Cooler, slower, not as dense.
minetest.register_abm({
nodenames = {
"group:smoky_v",
},
-- The white and black smoke interval/chance are 1/2.
-- Grey smoke is in the middle and has to be there to connect the two.
-- So it's interval/chance is 1/1.
-- ~ LazyJ, 2014_07_28
interval = 1,
chance = 3,
action = function(pos, node)
if
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z}, 5)
then
local mgrey_or_dgrey = math.random(2)
minetest.add_particlespawner({
amount = 1,
time = 8,
minpos = {x=pos.x, y=pos.y+0.2, z=pos.z},
maxpos = {x=pos.x, y=pos.y+1.5, z=pos.z},
minvel = {x=0.0, y=0.4, z=0.0},
maxvel = {x=0.0, y=1.0, z=0.0},
minacc = {x=0.0,y=0.4,z=0.0},
maxacc = {x=0.0,y=1.0,z=0.0},
minexptime = 3,
maxexptime = 7,
minsize = 6,
-- a maxsize larger than 10 and the biggest smoke particle gets stuck
-- in a 1x1 chimney flue. ~ LazyJ, 2014_07_30
maxsize = 9,
collisiondetection = true,
texture = "smoke2_"..mgrey_or_dgrey..".png"
-- texture = "top_02.png"
})
end
end
})
-- BLACK, TOP SMOKE
-- Farthest from the fire, coolest, slowest, more spread out.
minetest.register_abm({
nodenames = {
"group:smoky_v",
},
interval = 1,
chance = 4,
action = function(pos, node)
if
fake_fire.check_for_air({x=pos.x, y=pos.y+1, z=pos.z}, 7)
then
minetest.add_particlespawner({
amount = 1,
time = 1,
minpos = {x=pos.x, y=pos.y+0.2, z=pos.z},
maxpos = {x=pos.x, y=pos.y+1.5, z=pos.z},
minvel = {x=0.0, y=0.9, z=0.0},
maxvel = {x=0.0, y=1.5, z=0.0},
minacc = {x=0.0,y=1.5,z=0.0},
maxacc = {x=0.0,y=0.9,z=0.0},
minexptime = 1,
maxexptime = 5,
minsize = 4,
maxsize = 7,
collisiondetection = true,
texture = "black_smoke.png"
--texture = "top_01.png"
})
end
end
})