Make TNT respect on_blast, implement on_blast for some nodes

Implemented nodes:
- Steel Door: Ignores explosion
- Locked Chest: Ignores explosion
- Fire: Ignores explosion
- TNT: Starts burning
- Burning TNT: Explodes immediately
- Gunpowder: Starts burning
- Burning Gunpowder: Ignores explosion
This commit is contained in:
Wuzzy 2015-03-07 08:32:00 +01:00 committed by Novatux
parent ab4485f824
commit 8bc8dd64c5
4 changed files with 61 additions and 19 deletions

@ -1341,6 +1341,7 @@ minetest.register_node("default:chest_locked", {
) )
end end
end, end,
on_blast = function() end,
}) })

@ -108,6 +108,33 @@ function doors.register_door(name, def)
end end
end end
local function check_and_blast(pos, name)
local node = minetest.get_node(pos)
if node.name == name then
minetest.remove_node(pos)
end
end
local function make_on_blast(base_name, door_type, other_door_type)
if def.only_placer_can_open then
return function() end
else
if door_type == "_b_1" or door_type == "_b_2" then
return function(pos, intensity)
check_and_blast(pos, name..door_type)
pos.y = pos.y + 1
check_and_blast(pos, name..other_door_type)
end
elseif door_type == "_t_1" or door_type == "_t_2" then
return function(pos, intensity)
check_and_blast(pos, name..door_type)
pos.y = pos.y - 1
check_and_blast(pos, name..other_door_type)
end
end
end
end
local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) local function on_rightclick(pos, dir, check_name, replace, replace_dir, params)
pos.y = pos.y+dir pos.y = pos.y+dir
if not minetest.get_node(pos).name == check_name then if not minetest.get_node(pos).name == check_name then
@ -173,7 +200,8 @@ function doors.register_door(name, def)
can_dig = check_player_priv, can_dig = check_player_priv,
sounds = def.sounds, sounds = def.sounds,
sunlight_propagates = def.sunlight sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "_b_1", "_t_1")
}) })
minetest.register_node(name.."_t_1", { minetest.register_node(name.."_t_1", {
@ -206,6 +234,7 @@ function doors.register_door(name, def)
can_dig = check_player_priv, can_dig = check_player_priv,
sounds = def.sounds, sounds = def.sounds,
sunlight_propagates = def.sunlight, sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "_t_1", "_b_1")
}) })
minetest.register_node(name.."_b_2", { minetest.register_node(name.."_b_2", {
@ -237,7 +266,8 @@ function doors.register_door(name, def)
can_dig = check_player_priv, can_dig = check_player_priv,
sounds = def.sounds, sounds = def.sounds,
sunlight_propagates = def.sunlight sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "_b_2", "_t_2")
}) })
minetest.register_node(name.."_t_2", { minetest.register_node(name.."_t_2", {
@ -269,7 +299,8 @@ function doors.register_door(name, def)
can_dig = check_player_priv, can_dig = check_player_priv,
sounds = def.sounds, sounds = def.sounds,
sunlight_propagates = def.sunlight sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "_t_2", "_b_2")
}) })
end end

@ -24,6 +24,9 @@ minetest.register_node("fire:basic_flame", {
on_destruct = function(pos) on_destruct = function(pos)
minetest.after(0, fire.on_flame_remove_at, pos) minetest.after(0, fire.on_flame_remove_at, pos)
end, end,
-- unaffected by explosions
on_blast = function() end,
}) })
fire.D = 6 fire.D = 6

@ -23,6 +23,7 @@ minetest.after(0, function()
name = name, name = name,
drops = def.drops, drops = def.drops,
flammable = def.groups.flammable, flammable = def.groups.flammable,
on_blast = def.on_blast,
} }
end end
end) end)
@ -81,8 +82,14 @@ local function destroy(drops, pos, cid)
local def = cid_data[cid] local def = cid_data[cid]
if def and def.flammable then if def and def.flammable then
minetest.set_node(pos, fire_node) minetest.set_node(pos, fire_node)
else
local on_blast = def.on_blast
if on_blast ~= nil then
on_blast(pos, 1)
return
else else
minetest.remove_node(pos) minetest.remove_node(pos)
end
if def then if def then
local node_drops = minetest.get_node_drops(def.name, "") local node_drops = minetest.get_node_drops(def.name, "")
for _, item in ipairs(node_drops) do for _, item in ipairs(node_drops) do
@ -172,12 +179,6 @@ local function explode(pos, radius)
local p = {} local p = {}
local c_air = minetest.get_content_id("air") local c_air = minetest.get_content_id("air")
local c_tnt = minetest.get_content_id("tnt:tnt")
local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning")
local c_gunpowder = minetest.get_content_id("tnt:gunpowder")
local c_gunpowder_burning = minetest.get_content_id("tnt:gunpowder_burning")
local c_boom = minetest.get_content_id("tnt:boom")
local c_fire = minetest.get_content_id("fire:basic_flame")
for z = -radius, radius do for z = -radius, radius do
for y = -radius, radius do for y = -radius, radius do
@ -189,13 +190,7 @@ local function explode(pos, radius)
p.x = pos.x + x p.x = pos.x + x
p.y = pos.y + y p.y = pos.y + y
p.z = pos.z + z p.z = pos.z + z
if cid == c_tnt or cid == c_gunpowder then if cid ~= c_air then
burn(p)
elseif cid ~= c_tnt_burning and
cid ~= c_gunpowder_burning and
cid ~= c_air and
cid ~= c_fire and
cid ~= c_boom then
destroy(drops, p, cid) destroy(drops, p, cid)
end end
end end
@ -231,6 +226,9 @@ minetest.register_node("tnt:tnt", {
minetest.get_node_timer(pos):start(4) minetest.get_node_timer(pos):start(4)
end end
end, end,
on_blast = function(pos, intensity)
burn(pos)
end,
mesecons = {effector = {action_on = boom}}, mesecons = {effector = {action_on = boom}},
}) })
@ -250,6 +248,8 @@ minetest.register_node("tnt:tnt_burning", {
drop = "", drop = "",
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_timer = boom, on_timer = boom,
-- unaffected by explosions
on_blast = function() end,
}) })
minetest.register_node("tnt:boom", { minetest.register_node("tnt:boom", {
@ -262,6 +262,8 @@ minetest.register_node("tnt:boom", {
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
minetest.remove_node(pos) minetest.remove_node(pos)
end, end,
-- unaffected by explosions
on_blast = function() end,
}) })
minetest.register_node("tnt:gunpowder", { minetest.register_node("tnt:gunpowder", {
@ -285,6 +287,9 @@ minetest.register_node("tnt:gunpowder", {
burn(pos) burn(pos)
end end
end, end,
on_blast = function(pos, intensity)
burn(pos)
end,
}) })
minetest.register_node("tnt:gunpowder_burning", { minetest.register_node("tnt:gunpowder_burning", {
@ -324,7 +329,9 @@ minetest.register_node("tnt:gunpowder_burning", {
end end
end end
minetest.remove_node(pos) minetest.remove_node(pos)
end end,
-- unaffected by explosions
on_blast = function() end,
}) })
minetest.register_abm({ minetest.register_abm({