aspect_w = 16, aspect_h = 16, length = 1},
}},
inventory_image = "fire_basic_flame.png",
+ paramtype = "light",
light_source = 14,
groups = {igniter = 2, dig_immediate = 3},
drop = '',
walkable = false,
buildable_to = true,
+ sunlight_propagates = true,
damage_per_second = 4,
on_construct = function(pos)
minetest.after(0, fire.on_flame_remove_at, pos)
end,
- -- unaffected by explosions
- on_blast = function() end,
+ on_blast = function() end, -- unaffected by explosions
})
--- Fire sounds table
--- key: position hash of low corner of area
--- value: {handle=sound handle, name=sound name}
-fire.sounds = {}
-
-
-- Get sound area of position
--- size of sound areas
-fire.D = 6
+fire.D = 6 -- size of sound areas
function fire.get_area_p0p1(pos)
local p0 = {
end
+-- Fire sounds table
+-- key: position hash of low corner of area
+-- value: {handle=sound handle, name=sound name}
+fire.sounds = {}
+
+
-- Update fire sounds in sound area of position
function fire.update_sounds_around(pos)
local should_have_sound = (#flames_p > 0)
local wanted_sound = nil
if #flames_p >= 9 then
- wanted_sound = {name = "fire_large", gain = 1.5}
+ wanted_sound = {name = "fire_large", gain = 0.7}
elseif #flames_p > 0 then
- wanted_sound = {name = "fire_small", gain = 1.5}
+ wanted_sound = {name = "fire_small", gain = 0.9}
end
local p0_hash = minetest.hash_node_position(p0)
local sound = fire.sounds[p0_hash]
-- Detect nearby extinguishing nodes
function fire.flame_should_extinguish(pos)
- if minetest.setting_getbool("disable_fire") then return true end
- --return minetest.find_node_near(pos, 1, {"group:puts_out_fire"})
- local p0 = {x = pos.x - 1, y = pos.y, z = pos.z - 1}
- local p1 = {x = pos.x + 1, y = pos.y + 1, z = pos.z + 1}
- local ps = minetest.find_nodes_in_area(p0, p1, {"group:puts_out_fire"})
- return (#ps ~= 0)
+ return minetest.find_node_near(pos, 1, {"group:puts_out_fire"})
end
--- Ignite neighboring nodes
+-- Enable ABMs according to 'disable fire' setting
-minetest.register_abm({
- nodenames = {"group:flammable"},
- neighbors = {"group:igniter"},
- interval = 7,
- chance = 32,
- action = function(p0, node, _, _)
- -- If there is water or stuff like that around flame, don't ignite
- if fire.flame_should_extinguish(p0) then
- return
- end
- local p = fire.find_pos_for_flame_around(p0)
- if p then
- minetest.set_node(p, {name = "fire:basic_flame"})
- end
- end,
-})
+if minetest.setting_getbool("disable_fire") then
+
+ -- Extinguish flames quickly with dedicated ABM
+
+ minetest.register_abm({
+ nodenames = {"fire:basic_flame"},
+ interval = 3,
+ chance = 2,
+ action = function(p0, node, _, _)
+ minetest.remove_node(p0)
+ end,
+ })
+
+else
+
+ -- Extinguish flames quickly with water, snow, ice
+
+ minetest.register_abm({
+ nodenames = {"fire:basic_flame"},
+ neighbors = {"group:puts_out_fire"},
+ interval = 3,
+ chance = 2,
+ action = function(p0, node, _, _)
+ minetest.remove_node(p0)
+ minetest.sound_play("fire_extinguish_flame",
+ {pos = p0, max_hear_distance = 16, gain = 0.25})
+ end,
+ })
+
+ -- Ignite neighboring nodes
+
+ minetest.register_abm({
+ nodenames = {"group:flammable"},
+ neighbors = {"group:igniter"},
+ interval = 7,
+ chance = 16,
+ action = function(p0, node, _, _)
+ -- If there is water or stuff like that around node, don't ignite
+ if fire.flame_should_extinguish(p0) then
+ return
+ end
+ local p = fire.find_pos_for_flame_around(p0)
+ if p then
+ minetest.set_node(p, {name = "fire:basic_flame"})
+ end
+ end,
+ })
+
+ -- Remove flames and flammable nodes
+
+ minetest.register_abm({
+ nodenames = {"fire:basic_flame"},
+ interval = 5,
+ chance = 16,
+ action = function(p0, node, _, _)
+ -- If there are no flammable nodes around flame, remove flame
+ if not minetest.find_node_near(p0, 1, {"group:flammable"}) then
+ minetest.remove_node(p0)
+ return
+ end
+ if math.random(1, 4) == 1 then
+ -- remove flammable nodes around flame
+ local p = minetest.find_node_near(p0, 1, {"group:flammable"})
+ if p then
+ minetest.remove_node(p)
+ nodeupdate(p)
+ end
+ end
+ end,
+ })
+
+end
-- Rarely ignite things from far
end,
})
--]]
-
-
--- Remove flammable nodes and flame
-
-minetest.register_abm({
- nodenames = {"fire:basic_flame"},
- interval = 5,
- chance = 16,
- action = function(p0, node, _, _)
- -- If there is water or stuff like that around flame, remove flame
- if fire.flame_should_extinguish(p0) then
- minetest.remove_node(p0)
- return
- end
- -- Make the following things rarer
- if math.random(1, 3) == 1 then
- return
- end
- -- If there are no flammable nodes around flame, remove flame
- if not minetest.find_node_near(p0, 1, {"group:flammable"}) then
- minetest.remove_node(p0)
- return
- end
- if math.random(1, 4) == 1 then
- -- remove a flammable node around flame
- local p = minetest.find_node_near(p0, 1, {"group:flammable"})
- if p then
- -- If there is water or stuff like that around flame, don't remove
- if fire.flame_should_extinguish(p0) then
- return
- end
- minetest.remove_node(p)
- nodeupdate(p)
- end
- else
- -- remove flame
- minetest.remove_node(p0)
- end
- end,
-})
-