TNT: Add explode_center flag
authortenplus1 <tenplus1@users.noreply.github.com>
Sat, 26 Aug 2017 21:14:44 +0000 (22:14 +0100)
committerrubenwardy <rubenwardy@gmail.com>
Sat, 26 Aug 2017 21:14:44 +0000 (22:14 +0100)
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
mods/tnt/init.lua

index a6f4da7c63b8864b49f220e2610d0f857cacfcde..c4dbd78e9bb7a26e417797166b8da7967a28ddd8 100644 (file)
@@ -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])`
 
index 18ca304efdcd6d6af1d875e956b48e730f3bafac..f3e22fdb0d7cb42f8789962bcd9c9d6609186a42 100644 (file)
@@ -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)