From d6c33da3554051b3e326d3b78ef3012f3746fb3a Mon Sep 17 00:00:00 2001
From: Auke Kok <sofar@foo-projects.org>
Date: Sat, 16 Apr 2016 12:00:17 -0700
Subject: [PATCH] TNT: Damage mobs, knock back players

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 | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua
index f8b59ab2..b48a56b9 100644
--- a/mods/tnt/init.lua
+++ b/mods/tnt/init.lua
@@ -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
 
-- 
GitLab