7 Commits

Author SHA1 Message Date
paramat
b0d3bf0ecd Settings: Use new settings object 2017-05-24 07:18:26 +01:00
Fernando Carmona Varo
1f1a1e81dd TNT: Gunpowder (and tnt.burn) will trigger the on_ignite of nodes
The previous behaviour is kept as fallback for compatibility, for when the on_ignite
is not defined in the node.
2017-05-01 19:38:38 +01:00
Fixer
98c4fc4738 TNT: Clarify new TNT receipe
Update readme.txt with new TNT crafting recipe.
2017-03-14 19:05:49 +00:00
Auke Kok
02ddade1ae TNT: start fire nodetimers for created fire nodes.
Without this patch, any fire created(placed) by tnt explosions
will remain forever on the map.
2017-03-14 19:03:34 +00:00
Diego Martínez
3fc49d574b Fix some warnings.
Also fixes the failing travis checks.
2017-03-05 09:27:53 +00:00
Auke Kok
66fae9316f TNT: Log explosions and player igniting tnt or gunpowder 2017-01-19 21:57:34 -08:00
DS-Minetest
472a5a6bde Decrease the cost of gunpowder for trails
The cost of TNT remains the same
2017-01-01 23:41:04 +00:00
2 changed files with 55 additions and 17 deletions

View File

@@ -31,7 +31,10 @@ in mining.
How to use the mod: How to use the mod:
Craft gunpowder by placing coal and gravel in the crafting area. Craft gunpowder by placing coal and gravel in the crafting area.
The gunpowder can be used to craft TNT or as fuse for TNT. The gunpowder can be used to craft TNT or as fuse for TNT.
To craft TNT surround gunpowder with 4 wood in a + shape. To craft TNT place items like this:
-- wood - gunpowder -- wood -
gunpowder gunpowder gunpowder
-- wood - gunpowder -- wood -
There are different ways to blow up TNT: There are different ways to blow up TNT:
1. Hit it with a torch. 1. Hit it with a torch.

View File

@@ -1,7 +1,7 @@
tnt = {} tnt = {}
-- Default to enabled when in singleplayer -- Default to enabled when in singleplayer
local enable_tnt = minetest.setting_getbool("enable_tnt") local enable_tnt = minetest.settings:get_bool("enable_tnt")
if enable_tnt == nil then if enable_tnt == nil then
enable_tnt = minetest.is_singleplayer() enable_tnt = minetest.is_singleplayer()
end end
@@ -12,7 +12,7 @@ local loss_prob = {}
loss_prob["default:cobble"] = 3 loss_prob["default:cobble"] = 3
loss_prob["default:dirt"] = 4 loss_prob["default:dirt"] = 4
local tnt_radius = tonumber(minetest.setting_get("tnt_radius") or 3) local tnt_radius = tonumber(minetest.settings:get("tnt_radius") or 3)
-- Fill a list with data for content IDs, after all nodes are registered -- Fill a list with data for content IDs, after all nodes are registered
local cid_data = {} local cid_data = {}
@@ -83,7 +83,10 @@ local function add_drop(drops, item)
end end
end end
local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_protection, ignore_on_blast) local basic_flame_on_construct -- cached value
local function destroy(drops, npos, cid, c_air, c_fire,
on_blast_queue, on_construct_queue,
ignore_protection, ignore_on_blast)
if not ignore_protection and minetest.is_protected(npos, "") then if not ignore_protection and minetest.is_protected(npos, "") then
return cid return cid
end end
@@ -93,9 +96,16 @@ local function destroy(drops, npos, cid, c_air, c_fire, on_blast_queue, ignore_p
if not def then if not def then
return c_air return c_air
elseif not ignore_on_blast and def.on_blast then elseif not ignore_on_blast and def.on_blast then
on_blast_queue[#on_blast_queue + 1] = {pos = vector.new(npos), on_blast = def.on_blast} on_blast_queue[#on_blast_queue + 1] = {
pos = vector.new(npos),
on_blast = def.on_blast
}
return cid return cid
elseif def.flammable then elseif def.flammable then
on_construct_queue[#on_construct_queue + 1] = {
fn = basic_flame_on_construct,
pos = vector.new(npos)
}
return c_fire return c_fire
else else
local node_drops = minetest.get_node_drops(def.name, "") local node_drops = minetest.get_node_drops(def.name, "")
@@ -250,13 +260,15 @@ end
function tnt.burn(pos, nodename) function tnt.burn(pos, nodename)
local name = nodename or minetest.get_node(pos).name local name = nodename or minetest.get_node(pos).name
local group = minetest.get_item_group(name, "tnt") local def = minetest.registered_nodes[name]
if group > 0 then if not def then
return
elseif def.on_ignite then
def.on_ignite(pos)
elseif minetest.get_item_group(name, "tnt") > 0 then
minetest.sound_play("tnt_ignite", {pos = pos}) minetest.sound_play("tnt_ignite", {pos = pos})
minetest.set_node(pos, {name = name .. "_burning"}) minetest.set_node(pos, {name = name .. "_burning"})
minetest.get_node_timer(pos):start(1) minetest.get_node_timer(pos):start(1)
elseif name == "tnt:gunpowder" then
minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
end end
end end
@@ -306,6 +318,8 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
local drops = {} local drops = {}
local on_blast_queue = {} local on_blast_queue = {}
local on_construct_queue = {}
basic_flame_on_construct = minetest.registered_nodes["fire:basic_flame"].on_construct
local c_fire = minetest.get_content_id("fire:basic_flame") local c_fire = minetest.get_content_id("fire:basic_flame")
for z = -radius, radius do for z = -radius, radius do
@@ -318,8 +332,8 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z} local p = {x = pos.x + x, y = pos.y + y, z = pos.z + z}
if cid ~= c_air then if cid ~= c_air then
data[vi] = destroy(drops, p, cid, c_air, c_fire, data[vi] = destroy(drops, p, cid, c_air, c_fire,
on_blast_queue, ignore_protection, on_blast_queue, on_construct_queue,
ignore_on_blast) ignore_protection, ignore_on_blast)
end end
end end
vi = vi + 1 vi = vi + 1
@@ -357,6 +371,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast)
end end
end end
for _, queued_data in pairs(on_construct_queue) do
queued_data.fn(queued_data.pos)
end
return drops, radius return drops, radius
end end
@@ -372,6 +390,8 @@ function tnt.boom(pos, def)
eject_drops(drops, pos, radius) eject_drops(drops, pos, radius)
end end
add_effects(pos, radius, drops) add_effects(pos, radius, drops)
minetest.log("action", "A TNT explosion occurred at " .. minetest.pos_to_string(pos) ..
" with radius " .. radius)
end end
minetest.register_node("tnt:boom", { minetest.register_node("tnt:boom", {
@@ -397,7 +417,12 @@ minetest.register_node("tnt:gunpowder", {
is_ground_content = false, is_ground_content = false,
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
tiles = {"tnt_gunpowder_straight.png", "tnt_gunpowder_curved.png", "tnt_gunpowder_t_junction.png", "tnt_gunpowder_crossing.png"}, tiles = {
"tnt_gunpowder_straight.png",
"tnt_gunpowder_curved.png",
"tnt_gunpowder_t_junction.png",
"tnt_gunpowder_crossing.png"
},
inventory_image = "tnt_gunpowder_inventory.png", inventory_image = "tnt_gunpowder_inventory.png",
wield_image = "tnt_gunpowder_inventory.png", wield_image = "tnt_gunpowder_inventory.png",
selection_box = { selection_box = {
@@ -411,6 +436,9 @@ minetest.register_node("tnt:gunpowder", {
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
if puncher:get_wielded_item():get_name() == "default:torch" then if puncher:get_wielded_item():get_name() == "default:torch" then
minetest.set_node(pos, {name = "tnt:gunpowder_burning"}) minetest.set_node(pos, {name = "tnt:gunpowder_burning"})
minetest.log("action", puncher:get_player_name() ..
" ignites tnt:gunpowder at " ..
minetest.pos_to_string(pos))
end end
end, end,
on_blast = function(pos, intensity) on_blast = function(pos, intensity)
@@ -471,7 +499,11 @@ minetest.register_node("tnt:gunpowder_burning", {
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
}, },
drop = "", drop = "",
groups = {dig_immediate = 2, attached_node = 1, connect_to_raillike = minetest.raillike_group("gunpowder")}, groups = {
dig_immediate = 2,
attached_node = 1,
connect_to_raillike = minetest.raillike_group("gunpowder")
},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
for dx = -1, 1 do for dx = -1, 1 do
@@ -498,7 +530,7 @@ minetest.register_node("tnt:gunpowder_burning", {
}) })
minetest.register_craft({ minetest.register_craft({
output = "tnt:gunpowder", output = "tnt:gunpowder 5",
type = "shapeless", type = "shapeless",
recipe = {"default:coal_lump", "default:gravel"} recipe = {"default:coal_lump", "default:gravel"}
}) })
@@ -507,9 +539,9 @@ if enable_tnt then
minetest.register_craft({ minetest.register_craft({
output = "tnt:tnt", output = "tnt:tnt",
recipe = { recipe = {
{"", "group:wood", ""}, {"group:wood", "tnt:gunpowder", "group:wood"},
{"group:wood", "tnt:gunpowder", "group:wood"}, {"tnt:gunpowder", "tnt:gunpowder", "tnt:gunpowder"},
{"", "group:wood", ""} {"group:wood", "tnt:gunpowder", "group:wood"}
} }
}) })
@@ -550,6 +582,9 @@ function tnt.register_tnt(def)
on_punch = function(pos, node, puncher) on_punch = function(pos, node, puncher)
if puncher:get_wielded_item():get_name() == "default:torch" then if puncher:get_wielded_item():get_name() == "default:torch" then
minetest.set_node(pos, {name = name .. "_burning"}) minetest.set_node(pos, {name = name .. "_burning"})
minetest.log("action", puncher:get_player_name() ..
" ignites " .. node.name .. " at " ..
minetest.pos_to_string(pos))
end end
end, end,
on_blast = function(pos, intensity) on_blast = function(pos, intensity)