From 32c7edba1cc18d48f0d09af7bf2b227c30af69cc Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 20 Dec 2016 19:28:25 +0200 Subject: [PATCH] Explosion damage calculations take the size of the limbs into account (e.g. it's possible to damage endworms with explosives that have a damage radius less than 600) --- Subsurface/Source/Map/Explosion.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Subsurface/Source/Map/Explosion.cs b/Subsurface/Source/Map/Explosion.cs index de65641be..1f91af870 100644 --- a/Subsurface/Source/Map/Explosion.cs +++ b/Subsurface/Source/Map/Explosion.cs @@ -119,15 +119,21 @@ namespace Barotrauma foreach (Limb limb in c.AnimController.Limbs) { float dist = Vector2.Distance(limb.WorldPosition, worldPosition); + + //calculate distance from the "outer surface" of the physics body + //doesn't take the rotation of the limb into account, but should be accurate enough for this purpose + float limbRadius = Math.Max(Math.Max(limb.body.width * 0.5f, limb.body.height * 0.5f), limb.body.radius); + dist = Math.Max(0.0f, dist - FarseerPhysics.ConvertUnits.ToDisplayUnits(limbRadius)); if (dist > range) continue; float distFactor = 1.0f - dist / range; - if (limb.WorldPosition == worldPosition) continue; - c.AddDamage(limb.WorldPosition, DamageType.None, damage / c.AnimController.Limbs.Length * distFactor, 0.0f, stun * distFactor, false); + + if (limb.WorldPosition == worldPosition) continue; + if (force > 0.0f) { limb.body.ApplyLinearImpulse(Vector2.Normalize(limb.WorldPosition - worldPosition) * distFactor * force);