TNT: add some depth to the explosion effect
authorAuke Kok <sofar@foo-projects.org>
Mon, 25 Jan 2016 07:48:38 +0000 (23:48 -0800)
committerparamat <mat.gregory@virginmedia.com>
Sat, 16 Apr 2016 18:27:16 +0000 (19:27 +0100)
We add a dirt-like particle (drawn from scratch, uses some
colors from default_dirt's palette) to spawn many particles
that have collision enabled around the center of the blast.

This has the effect of obscuring the center of the blast, as
that is a painfully visible empty area when the explosion happens,
as there's only a little spark.

The dirt particles bounce around the walls and floor a bit,
and disappear rapidly, well before the smoke particles disappear.

This is a nice visual distraction that obscures the sudden
appearance of the gaping hole, and makes it a whole lot more
believable.

mods/tnt/init.lua
mods/tnt/textures/tnt_blast.png [new file with mode: 0644]

index 576d3a8a9850fbe19f1405278fdf1915b3a61b75..528aee02c4ddbf28ee7b8af882024d62d84e14bd 100644 (file)
@@ -162,6 +162,37 @@ local function add_effects(pos, radius)
                maxsize = 16,
                texture = "tnt_smoke.png",
        })
+
+       -- we just dropped some items. Look at the items entities and pick
+       -- one of them to use as texture
+       local texture = "tnt_blast.png" --fallback texture
+       local objs = minetest.get_objects_inside_radius(pos, 2)
+       for _, obj in pairs(objs) do
+               if obj and obj:get_luaentity() then
+                       local def = ItemStack(obj:get_luaentity().itemstring):get_definition()
+                       if def.tiles then
+                               texture = def.tiles[1]
+                               break
+                       end
+               end
+       end
+
+       minetest.add_particlespawner({
+               amount = 64,
+               time = 0.1,
+               minpos = vector.subtract(pos, radius / 2),
+               maxpos = vector.add(pos, radius / 2),
+               minvel = {x=-3, y=0, z=-3},
+               maxvel = {x=3,  y=5,  z=3},
+               minacc = {x=0, y=-10, z=0},
+               maxacc = {x=0, y=-10, z=0},
+               minexptime = 0.8,
+               maxexptime = 2.0,
+               minsize = 2,
+               maxsize = 6,
+               texture = texture,
+               collisiondetection = true,
+       })
 end
 
 local function burn(pos)
diff --git a/mods/tnt/textures/tnt_blast.png b/mods/tnt/textures/tnt_blast.png
new file mode 100644 (file)
index 0000000..bbb1096
Binary files /dev/null and b/mods/tnt/textures/tnt_blast.png differ