forked from luanti-org/minetest_game
		
	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.
This commit is contained in:
		| @@ -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 | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user