Fire / tnt: Make flint-and-steel use node on_ignite functions
authorFernando Carmona Varo <ferkiwi@gmail.com>
Mon, 24 Oct 2016 20:24:49 +0000 (22:24 +0200)
committerparamat <mat.gregory@virginmedia.com>
Mon, 7 Nov 2016 14:10:00 +0000 (14:10 +0000)
Add on_ignite functions to tnt, gunpowder, coalblock.

game_api.txt
mods/fire/init.lua
mods/tnt/init.lua

index 2958bfdcfced1416b2500c98667cd74afbe0065b..80272a60995350aaf9702765700c0c98ee8ec8dd 100644 (file)
@@ -227,6 +227,14 @@ New node def property:
  * Called when fire attempts to remove a burning node.
  * `pos` Position of the burning node.
 
+ `on_ignite(pos, igniter)`
+
+  * Called when Flint and steel (or a mod defined ignitor) is used on a node.
+    Defining it may prevent the default action (spawning flames) from triggering.
+  * `pos` Position of the ignited node.
+  * `igniter` Player that used the tool, when available.
+
+
 Give Initial Stuff API
 ----------------------
 
index a3457f649091266f003009f0cff29bd41f2146eb..c600edc731952f4c8f6420a8fc308b526326ed12 100644 (file)
@@ -95,38 +95,20 @@ minetest.register_tool("fire:flint_and_steel", {
                itemstack:add_wear(1000)
                if pt.type == "node" then
                        local node_under = minetest.get_node(pt.under).name
-                       local is_coalblock = node_under == "default:coalblock"
-                       local is_tnt = node_under == "tnt:tnt"
-                       local is_gunpowder = node_under == "tnt:gunpowder"
-                       if minetest.get_item_group(node_under, "flammable") >= 1 or
-                                       is_coalblock or is_tnt or is_gunpowder then
-                               local flame_pos = pt.above
-                               if is_coalblock then
-                                       flame_pos = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z}
-                               elseif is_tnt or is_gunpowder then
-                                       flame_pos = pt.under
-                               end
-                               if minetest.get_node(flame_pos).name == "air" or
-                                               is_tnt or is_gunpowder then
-                                       local player_name = user:get_player_name()
-                                       if not minetest.is_protected(flame_pos, player_name) then
-                                               if is_coalblock then
-                                                       minetest.set_node(flame_pos,
-                                                               {name = "fire:permanent_flame"})
-                                               elseif is_tnt then
-                                                       minetest.set_node(flame_pos,
-                                                               {name = "tnt:tnt_burning"})
-                                               elseif is_gunpowder then
-                                                       minetest.set_node(flame_pos,
-                                                               {name = "tnt:gunpowder_burning"})
-                                               else
-                                                       minetest.set_node(flame_pos,
-                                                               {name = "fire:basic_flame"})
-                                               end
-                                       else
-                                               minetest.chat_send_player(player_name, "This area is protected")
-                                       end
-                               end
+                       local nodedef = minetest.registered_nodes[node_under]
+                       if not nodedef then
+                               return
+                       end
+                       local player_name = user:get_player_name()
+                       if minetest.is_protected(pt.under, player_name) then
+                               minetest.chat_send_player(player_name, "This area is protected")
+                               return
+                       end
+                       if nodedef.on_ignite then
+                               nodedef.on_ignite(pt.under, user)
+                       elseif minetest.get_item_group(node_under, "flammable") >= 1
+                                       and minetest.get_node(pt.above).name == "air" then
+                               minetest.set_node(pt.above, {name = "fire:basic_flame"})
                        end
                end
                if not minetest.setting_getbool("creative_mode") then
@@ -153,9 +135,14 @@ minetest.override_item("default:coalblock", {
                        minetest.remove_node(pos)
                end
        end,
+       on_ignite = function(pos, igniter)
+               local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z}
+               if minetest.get_node(flame_pos).name == "air" then
+                       minetest.set_node(flame_pos, {name = "fire:permanent_flame"})
+               end
+       end,
 })
 
-
 -- Get sound area of position
 
 fire.D = 6 -- size of sound areas
index 4142be78d1e83faf10f3c127406fdb720a7ac4f2..0c447f950fd4e7554049547f2ec30d80fe566996 100644 (file)
@@ -418,7 +418,10 @@ minetest.register_node("tnt:gunpowder", {
        end,
        on_burn = function(pos)
                minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
-       end
+       end,
+       on_ignite = function(pos, igniter)
+               minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
+       end,
 })
 
 minetest.register_node("tnt:gunpowder_burning", {
@@ -563,7 +566,10 @@ function tnt.register_tnt(def)
                        },
                        on_burn = function(pos)
                                minetest.set_node(pos, {name = name .. "_burning"})
-                       end
+                       end,
+                       on_ignite = function(pos, igniter)
+                               minetest.set_node(pos, {name = name .. "_burning"})
+                       end,
                })
        end