Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fire / tnt: Make flint-and-steel use node on_ignite functions
Add on_ignite functions to tnt, gunpowder, coalblock.
  • Loading branch information
Ferk authored and paramat committed Nov 7, 2016
1 parent c7e2d59 commit c824d69
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 35 deletions.
8 changes: 8 additions & 0 deletions game_api.txt
Expand Up @@ -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
----------------------

Expand Down
53 changes: 20 additions & 33 deletions mods/fire/init.lua
Expand Up @@ -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
Expand All @@ -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
Expand Down
10 changes: 8 additions & 2 deletions mods/tnt/init.lua
Expand Up @@ -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", {
Expand Down Expand Up @@ -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

Expand Down

0 comments on commit c824d69

Please sign in to comment.