From bcd2582cf9d6c1526d3d9cf23501faa6ece431e4 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Fri, 29 Dec 2017 21:06:11 +0200 Subject: [PATCH] - More gore particles when severing limbs! - Explosions can sever limbs even if the target character is dead. Now explosive projectiles can explode creatures into pieces even if the creature dies of the initial projectile impact and not the explosion. - Disabled blood particles on carriers and fractal guardians. --- .../Source/Characters/Limb.cs | 2 +- .../Content/Characters/Carrier/carrier.xml | 2 +- .../Fractalguardian/fractalguardian.xml | 2 +- .../Fractalguardian2/fractalguardian2.xml | 2 +- .../Content/Items/Weapons/railgun.xml | 2 +- .../Content/Particles/ParticlePrefabs.xml | 119 +++++++++++++++++- .../Source/Characters/Animation/Ragdoll.cs | 23 +++- .../Source/Characters/Attack.cs | 2 +- .../Source/Characters/Character.cs | 7 ++ .../Source/Characters/Limb.cs | 28 +++-- .../BarotraumaShared/Source/Map/Explosion.cs | 25 +++- 11 files changed, 184 insertions(+), 30 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs b/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs index 237dcfa98..d73911a8c 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs @@ -17,7 +17,7 @@ namespace Barotrauma private set; } - Sound hitSound; + private Sound hitSound; public Sound HitSound { diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml index 81a8367e1..5678f0bd5 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml @@ -1,5 +1,5 @@  - + diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian/fractalguardian.xml b/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian/fractalguardian.xml index a19739d4a..98fd6e044 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian/fractalguardian.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian/fractalguardian.xml @@ -1,5 +1,5 @@  - + diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian2/fractalguardian2.xml b/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian2/fractalguardian2.xml index 86be15828..01c6a6d2d 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian2/fractalguardian2.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Fractalguardian2/fractalguardian2.xml @@ -1,5 +1,5 @@  - + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml index 50662afde..afb980133 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml @@ -124,7 +124,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/Particles/ParticlePrefabs.xml b/Barotrauma/BarotraumaShared/Content/Particles/ParticlePrefabs.xml index 6f3b8b869..2fd6522a8 100644 --- a/Barotrauma/BarotraumaShared/Content/Particles/ParticlePrefabs.xml +++ b/Barotrauma/BarotraumaShared/Content/Particles/ParticlePrefabs.xml @@ -17,7 +17,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 && character.CurrentHull != null) + { + character.CurrentHull.AddDecal("blood", WorldPosition, MathHelper.Clamp(bloodParticleSize, 0.5f, 1.0f)); } } - - if (bloodParticleAmount > 0 && character.CurrentHull != null) - { - character.CurrentHull.AddDecal("blood", WorldPosition, MathHelper.Clamp(bloodParticleSize, 0.5f, 1.0f)); - } - #endif if (damageType == DamageType.Burn) diff --git a/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs b/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs index 5c3a6999c..d77fe8809 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Explosion.cs @@ -23,6 +23,7 @@ namespace Barotrauma public Explosion(float range, float force, float damage, float structureDamage) { attack = new Attack(damage, structureDamage, 0.0f, range); + attack.SeverLimbsProbability = 1.0f; this.force = force; sparks = true; shockwave = true; @@ -118,7 +119,7 @@ namespace Barotrauma explosionPos = ConvertUnits.ToSimUnits(explosionPos); - bool wasDead = c.IsDead; + Dictionary distFactors = new Dictionary(); foreach (Limb limb in c.AnimController.Limbs) { float dist = Vector2.Distance(limb.WorldPosition, worldPosition); @@ -134,6 +135,8 @@ namespace Barotrauma //solid obstacles between the explosion and the limb reduce the effect of the explosion by 90% if (Submarine.CheckVisibility(limb.SimPosition, explosionPos) != null) distFactor *= 0.1f; + + distFactors.Add(limb, distFactor); c.AddDamage(limb.WorldPosition, DamageType.None, attack.GetDamage(1.0f) / c.AnimController.Limbs.Length * distFactor, @@ -143,17 +146,27 @@ namespace Barotrauma if (limb.WorldPosition != worldPosition && force > 0.0f) { - limb.body.ApplyLinearImpulse(Vector2.Normalize(limb.WorldPosition - worldPosition) * distFactor * force); + Vector2 limbDiff = Vector2.Normalize(limb.WorldPosition - worldPosition); + Vector2 impulsePoint = limb.SimPosition - limbDiff * limbRadius; + limb.body.ApplyLinearImpulse(limbDiff * distFactor * force, impulsePoint); } } - if (!wasDead && c.IsDead) + //sever joints + if (c.IsDead && attack.SeverLimbsProbability > 0.0f) { - foreach (LimbJoint joint in c.AnimController.LimbJoints) + foreach (Limb limb in c.AnimController.Limbs) { - if (Rand.Range(0.0f, 1.0f) < attack.SeverLimbsProbability) + if (!distFactors.ContainsKey(limb)) continue; + + foreach (LimbJoint joint in c.AnimController.LimbJoints) { - c.AnimController.SeverLimbJoint(joint); + if (joint.IsSevered || (joint.LimbA != limb && joint.LimbB != limb)) continue; + + if (Rand.Range(0.0f, 1.0f) < attack.SeverLimbsProbability * distFactors[limb]) + { + c.AnimController.SeverLimbJoint(joint); + } } } }