From c824d6918226cfb88bd1d843b7108d980813ccca Mon Sep 17 00:00:00 2001
From: Fernando Carmona Varo <ferkiwi@gmail.com>
Date: Mon, 24 Oct 2016 22:24:49 +0200
Subject: [PATCH] Fire / tnt: Make flint-and-steel use node on_ignite functions

Add on_ignite functions to tnt, gunpowder, coalblock.
---
 game_api.txt       |  8 +++++++
 mods/fire/init.lua | 53 +++++++++++++++++-----------------------------
 mods/tnt/init.lua  | 10 +++++++--
 3 files changed, 36 insertions(+), 35 deletions(-)

diff --git a/game_api.txt b/game_api.txt
index 2958bfdc..80272a60 100644
--- a/game_api.txt
+++ b/game_api.txt
@@ -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
 ----------------------
 
diff --git a/mods/fire/init.lua b/mods/fire/init.lua
index a3457f64..c600edc7 100644
--- a/mods/fire/init.lua
+++ b/mods/fire/init.lua
@@ -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
diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua
index 4142be78..0c447f95 100644
--- a/mods/tnt/init.lua
+++ b/mods/tnt/init.lua
@@ -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
 
-- 
GitLab