From fe67ffda7ca4326c85f114bd02797f25348931f9 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sat, 26 Aug 2017 22:14:44 +0100 Subject: [PATCH] TNT: Add explode_center flag Add 'explode_centre' flag which when false explodes as normal and when true runs on_blast on centre node as well as dropping items. --- game_api.txt | 3 ++- mods/tnt/init.lua | 13 ++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/game_api.txt b/game_api.txt index a6f4da7c..c4dbd78e 100644 --- a/game_api.txt +++ b/game_api.txt @@ -363,7 +363,8 @@ TNT API ^ Create an explosion. * `position` The center of explosion. -* `definition` The TNT definion as passed to `tnt.register` +* `definition` The TNT definion as passed to `tnt.register` with the following addition: + * `explode_center` false by default which removes TNT node on blast, when true will explode center node. `tnt.burn(position, [nodename])` diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua index 18ca304e..f3e22fdb 100644 --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -208,6 +208,7 @@ local function add_effects(pos, radius, drops) collisiondetection = false, vertical = false, texture = "tnt_boom.png", + glow = 15, }) minetest.add_particlespawner({ amount = 64, @@ -272,7 +273,7 @@ function tnt.burn(pos, nodename) end end -local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner) +local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owner, explode_center) pos = vector.round(pos) -- scan for adjacent TNT nodes first, and enlarge the explosion local vm1 = VoxelManip() @@ -286,6 +287,10 @@ local function tnt_explode(pos, radius, ignore_protection, ignore_on_blast, owne local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") local c_tnt_boom = minetest.get_content_id("tnt:boom") local c_air = minetest.get_content_id("air") + -- make sure we still have explosion even when centre node isnt tnt related + if explode_center then + count = 1 + end for z = pos.z - 2, pos.z + 2 do for y = pos.y - 2, pos.y + 2 do @@ -384,12 +389,14 @@ end function tnt.boom(pos, def) local meta = minetest.get_meta(pos) local owner = meta:get_string("owner") + if not def.explode_center then + minetest.set_node(pos, {name = "tnt:boom"}) + end local sound = def.sound or "tnt_explode" minetest.sound_play(sound, {pos = pos, gain = 1.5, max_hear_distance = math.min(def.radius * 20, 128)}) - minetest.set_node(pos, {name = "tnt:boom"}) local drops, radius = tnt_explode(pos, def.radius, def.ignore_protection, - def.ignore_on_blast, owner) + def.ignore_on_blast, owner, def.explode_center) -- append entity drops local damage_radius = (radius / def.radius) * def.damage_radius entity_physics(pos, damage_radius, drops)