TNT: Damage mobs, knock back players
authorAuke Kok <sofar@foo-projects.org>
Sat, 16 Apr 2016 19:00:17 +0000 (12:00 -0700)
committerparamat <mat.gregory@virginmedia.com>
Tue, 26 Apr 2016 21:33:59 +0000 (22:33 +0100)
We apply punch damage to mobs caught in the blast radius, as
this code previously only hurt players.

We "move" players back 1 node if they're caught in the blast, and
slightly up. We can't "eject" players due to missing API code to
support that, unfortunately.

mods/tnt/init.lua

index f8b59ab2caf535b168ad086a2c42c72b9ad6fa87..b48a56b9b688f68fc3f3dd6e7e66bb7521e0e811 100644 (file)
@@ -135,16 +135,29 @@ local function entity_physics(pos, radius)
        local objs = minetest.get_objects_inside_radius(pos, radius)
        for _, obj in pairs(objs) do
                local obj_pos = obj:getpos()
-               local obj_vel = obj:getvelocity()
                local dist = math.max(1, vector.distance(pos, obj_pos))
 
-               if obj_vel ~= nil then
+               local damage = (4 / dist) * radius
+               if obj:is_player() then
+                       -- currently the engine has no method to set
+                       -- player velocity. See #2960
+                       -- instead, we knock the player back 1.0 node, and slightly upwards
+                       local dir = vector.normalize(vector.subtract(obj_pos, pos))
+                       local moveoff = vector.multiply(dir, dist + 1.0)
+                       local newpos = vector.add(pos, moveoff)
+                       local newpos = vector.add(newpos, {x = 0, y = 0.2, z = 0})
+                       obj:setpos(newpos)
+
+                       obj:set_hp(obj:get_hp() - damage)
+               else
+                       local obj_vel = obj:getvelocity()
                        obj:setvelocity(calc_velocity(pos, obj_pos,
                                        obj_vel, radius * 10))
+                       obj:punch(obj, 1.0, {
+                               full_punch_interval = 1.0,
+                               damage_groups = {fleshy = damage},
+                       }, nil)
                end
-
-               local damage = (4 / dist) * radius
-               obj:set_hp(obj:get_hp() - damage)
        end
 end