Make TNT a bit more fun.
authorAuke Kok <sofar@foo-projects.org>
Mon, 25 Jan 2016 07:27:50 +0000 (23:27 -0800)
committerparamat <mat.gregory@virginmedia.com>
Sat, 16 Apr 2016 18:27:16 +0000 (19:27 +0100)
But not too much.

TNT is a bit underwhelming at the moment. We can make it a bit
more interesting by ejecting not just one or two itemstacks,
but a bunch of them. This code splits up the drops into
separate itemstacks that are 2-5 items together, which
results in generally roughly 10 itemstacks being ejected.

Since now we have multiple ejecta, it makes sense to tune
the ejecta velocities a bit better to get the appearance of
an actual explosion better. The items will not all start
with the same vertical velocity, since that would look
like fireworks. Instead we give them all a different vertical
speed.

mods/tnt/init.lua

index 6b16ab7e4ee64fc0410796f614095edebfe98e09..576d3a8a9850fbe19f1405278fdf1915b3a61b75 100644 (file)
@@ -49,23 +49,20 @@ local function eject_drops(drops, pos, radius)
        local drop_pos = vector.new(pos)
        for _, item in pairs(drops) do
                local count = item:get_count()
-               local max = item:get_stack_max()
-               if count > max then
-                       item:set_count(max)
-               end
                while count > 0 do
-                       if count < max then
-                               item:set_count(count)
-                       end
+                       local take = math.min(math.random(2,5),
+                                       item:get_count(),
+                                       item:get_stack_max())
                        rand_pos(pos, drop_pos, radius)
-                       local obj = minetest.add_item(drop_pos, item)
+                       local obj = minetest.add_item(drop_pos, item:get_name() .. " " .. take)
                        if obj then
                                obj:get_luaentity().collect = true
                                obj:setacceleration({x=0, y=-10, z=0})
-                               obj:setvelocity({x=math.random(-3, 3), y=10,
+                               obj:setvelocity({x=math.random(-3, 3),
+                                               y=math.random(0, 10),
                                                z=math.random(-3, 3)})
                        end
-                       count = count - max
+                       count = count - take
                end
        end
 end