a1b2df3941
- New near_unloaded API that supports custom distance parameter, map bounds check, and some optimizations. - Add area automatic unload check support to ABM API and add to applicable ABMs, replacing many old manual checks. Note that the explicit unload check is only strictly necessary when something will happen due to a node NOT being present in the area, e.g. something igniting due to absent coolant, or soaking quantity being reset due to missing sources. In simple cases where the absence of a thing causes the ABM to do nothing, then the standard check can work because the default action is to do nothing anyway.
119 lines
2.9 KiB
Lua
119 lines
2.9 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local ipairs, math, minetest, nodecore, pairs, vector
|
|
= ipairs, math, minetest, nodecore, pairs, vector
|
|
local math_random
|
|
= math.random
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local modname = minetest.get_current_modname()
|
|
|
|
local sparks_add, sparks_flush = nodecore.fairlimit(50)
|
|
|
|
nodecore.register_globalstep("fire sparks", function()
|
|
for _, pos in ipairs(sparks_flush()) do
|
|
minetest.after(math_random(), function()
|
|
minetest.add_particlespawner({
|
|
amount = math_random(1, 3),
|
|
time = 1,
|
|
minpos = vector.subtract(pos, 0.5),
|
|
maxpos = vector.add(pos, 0.5),
|
|
minvel = {x = -1, y = 2, z = -1},
|
|
maxvel = {x = 1, y = 2.5, z = 1},
|
|
minacc = {x = -0.1, y = 0, z = -0.1},
|
|
maxacc = {x = 0.1, y = 0, z = 0.1},
|
|
minxeptime = 1,
|
|
maxexptime = 3,
|
|
minsize = 0.1,
|
|
maxsize = 0.2,
|
|
collisiondetection = true,
|
|
collision_removal = true,
|
|
texture = "nc_fire_spark.png",
|
|
glow = math_random(5, 9)
|
|
})
|
|
end)
|
|
end
|
|
end)
|
|
|
|
do
|
|
local flamedirs = nodecore.dirs()
|
|
local embers = {}
|
|
minetest.after(0, function()
|
|
for k, v in pairs(minetest.registered_items) do
|
|
if v.groups.ember then
|
|
embers[k] = true
|
|
end
|
|
end
|
|
end)
|
|
minetest.register_abm({
|
|
label = "fire consume",
|
|
interval = 1,
|
|
chance = 1,
|
|
arealoaded = 1,
|
|
nodenames = {modname .. ":fire"},
|
|
action = function(pos)
|
|
sparks_add(pos)
|
|
local found = {}
|
|
for _, dp in ipairs(flamedirs) do
|
|
local npos = vector.add(pos, dp)
|
|
local node = minetest.get_node_or_nil(npos)
|
|
if (not node) or embers[node.name] then
|
|
found[#found + 1] = npos
|
|
end
|
|
end
|
|
if #found < 1 then
|
|
return minetest.remove_node(pos)
|
|
end
|
|
local picked = nodecore.pickrand(found)
|
|
return nodecore.fire_check_expend(picked)
|
|
end
|
|
})
|
|
end
|
|
|
|
minetest.register_abm({
|
|
label = "flammables ignite",
|
|
interval = 5,
|
|
chance = 1,
|
|
nodenames = {"group:flammable"},
|
|
neighbors = {"group:igniter"},
|
|
neighbors_invert = true,
|
|
arealoaded = 1,
|
|
action = function(pos)
|
|
nodecore.fire_check_ignite(pos)
|
|
end
|
|
})
|
|
|
|
minetest.register_abm({
|
|
label = "ember snuff/flames",
|
|
interval = 1,
|
|
chance = 1,
|
|
nodenames = {"group:ember"},
|
|
arealoaded = 1,
|
|
action = function(pos, node)
|
|
local snuff, vents = nodecore.fire_check_snuff(pos, node)
|
|
if snuff or not vents then return end
|
|
for i = 1, #vents do
|
|
if vents[i].q < 1 then
|
|
minetest.set_node(vents[i], {name = modname .. ":fire"})
|
|
end
|
|
end
|
|
end
|
|
})
|
|
|
|
nodecore.register_ambiance({
|
|
label = "flame ambiance",
|
|
nodenames = {"group:flame_ambiance"},
|
|
interval = 1,
|
|
chance = 1,
|
|
sound_name = "nc_fire_flamy",
|
|
sound_gain = 0.1
|
|
})
|
|
|
|
nodecore.register_item_ambiance({
|
|
label = "flame ambiance",
|
|
itemnames = {"group:flame_ambiance"},
|
|
interval = 1,
|
|
chance = 1,
|
|
sound_name = "nc_fire_flamy",
|
|
sound_gain = 0.1
|
|
})
|