Fire: Move flame extinguishing to separate faster ABM
authorparamat <mat.gregory@virginmedia.com>
Wed, 26 Aug 2015 01:31:56 +0000 (02:31 +0100)
committerparamat <mat.gregory@virginmedia.com>
Fri, 4 Sep 2015 22:05:26 +0000 (23:05 +0100)
Add extinguish sounds (from default mod lavacooling)
'disable fire' setting extinguishes fire quickly using a dedicated ABM
'disable fire' also disables all other ABMs
Simplify flammable node removal ABM
Speed up node ignition, it was too slow
Add 'sunlight propagates = true' and 'paramtype = "light" to flame
Balance fire sounds' gain

mods/fire/init.lua
mods/fire/sounds/fire_extinguish_flame.1.ogg [new file with mode: 0644]
mods/fire/sounds/fire_extinguish_flame.2.ogg [new file with mode: 0644]
mods/fire/sounds/fire_extinguish_flame.3.ogg [new file with mode: 0644]

index 0ca8afc6e07de7613653030ed2d20547ee01df32..f3f6369af96ff5672f4987e46ff4563ca6dc6c45 100644 (file)
@@ -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 (file)
index 0000000..42506dd
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 (file)
index 0000000..2747ab8
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 (file)
index 0000000..8baeac3
Binary files /dev/null and b/mods/fire/sounds/fire_extinguish_flame.3.ogg differ