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); + } } } }