diff --git a/mods/fire/init.lua b/mods/fire/init.lua index 0ca8afc6..f3f6369a 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -16,11 +16,13 @@ minetest.register_node("fire:basic_flame", { 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) @@ -31,21 +33,13 @@ minetest.register_node("fire:basic_flame", { 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 = { @@ -62,6 +56,12 @@ function fire.get_area_p0p1(pos) 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) @@ -73,9 +73,9 @@ 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] @@ -125,33 +125,84 @@ end -- 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 @@ -184,44 +235,3 @@ minetest.register_abm({ 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, -}) - diff --git a/mods/fire/sounds/fire_extinguish_flame.1.ogg b/mods/fire/sounds/fire_extinguish_flame.1.ogg new file mode 100644 index 00000000..42506ddf Binary files /dev/null and b/mods/fire/sounds/fire_extinguish_flame.1.ogg differ diff --git a/mods/fire/sounds/fire_extinguish_flame.2.ogg b/mods/fire/sounds/fire_extinguish_flame.2.ogg new file mode 100644 index 00000000..2747ab81 Binary files /dev/null and b/mods/fire/sounds/fire_extinguish_flame.2.ogg differ diff --git a/mods/fire/sounds/fire_extinguish_flame.3.ogg b/mods/fire/sounds/fire_extinguish_flame.3.ogg new file mode 100644 index 00000000..8baeac32 Binary files /dev/null and b/mods/fire/sounds/fire_extinguish_flame.3.ogg differ