TNT: Add explode_center flag
authortenplus1 <tenplus1@users.noreply.github.com>
Sat, 26 Aug 2017 21:14:44 +0000 (22:14 +0100)
committersfan5 <sfan5@live.de>
Sun, 19 Nov 2017 22:03:38 +0000 (23:03 +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 1864cba4279b6e1b021b20d59f449887f2330a2c..00bbf455112fe403a5f7bc10109c3b0fe652b932 100644 (file)
@@ -309,7 +309,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 0326000b79cdf523f857d0f16d85794dcbe66909..9a76b9275fb08b1169f7c4ea59c9ee50d35f301f 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,10 +389,12 @@ 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
        minetest.sound_play("tnt_explode", {pos = pos, gain = 1.5, max_hear_distance = 2*64})
-       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)