diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 1d7419ebb6b..9d9b3705747 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -382,11 +382,6 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem var visualEnt = CreateExplosionVisualEntity(pos, queued.Proto.ID, spaceMatrix, spaceData, gridData.Values, iterationIntensity); - // camera shake - // ES START - // CameraShake(iterationIntensity.Count * 4f, pos, queued.TotalIntensity); - // ES END - //For whatever bloody reason, sound system requires ENTITY coordinates. var mapEntityCoords = _transformSystem.ToCoordinates(_map.GetMap(pos.MapId), pos); @@ -416,12 +411,7 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem ? queued.Proto.SmallSoundFar : queued.Proto.SoundFar; - // ES START - var farTranslationShake = iterationIntensity.Count < queued.Proto.SmallSoundIterationThreshold - ? new ESScreenshakeParameters() { Trauma = 0.4f, DecayRate = 0.2f, Frequency = 0.014f } - : new ESScreenshakeParameters() { Trauma = 0.6f, DecayRate = 0.05f, Frequency = 0.014f }; - _shake.Screenshake(filter, farTranslationShake, null); - // ES END + CameraShake(iterationIntensity, pos, queued); // Starlight _audio.PlayGlobal(farSound, farFilter, true, farSound.Params); @@ -444,8 +434,13 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem _damageableSystem); } - private void CameraShake(float range, MapCoordinates epicenter, float totalIntensity) + private void CameraShake(List rangeList, MapCoordinates epicenter, QueuedExplosion queued) // Starlight - replace range with rangeList, totalIntensity with queued { + // Starlight BEGIN + var range = rangeList.Count * 4f; + var totalIntensity = queued.TotalIntensity * 10f; + // Starlight END + var players = Filter.Empty(); players.AddInRange(epicenter, range, _playerManager, EntityManager); @@ -463,7 +458,40 @@ public sealed partial class ExplosionSystem : SharedExplosionSystem var distance = delta.Length(); var effect = 5 * MathF.Pow(totalIntensity, 0.5f) * (1 - distance / range); if (effect > 0.01f) - _recoilSystem.KickCamera(uid, -delta.Normalized() * effect); + { + // DeltaV - Camera kick falloff START + // _recoilSystem.KickCamera(uid, -delta.Normalized() * effect); + + // Exponential decay: N(t) = N₀ ⋅ e^(-λ ⋅ t) + // In this case, N = effect and we aren't decaying over time but with increasing distance from the epicenter, + // so t = distance / range. Higher values of λ lead to faster decay, lower values to slower decay. + // + // severity is a fixed factor used to decrease the overall severity of the camera kick, + // as the values were so high by default that decay was only becoming really noticeable near range. + // + // these changes are made here instead of directly assigning to the effect variable + // above to maintain the same overall effect range as before. + const float severity = 0.033f; + const float lambda = 4f; + _recoilSystem.KickCamera(uid, -delta.Normalized() * effect * severity * MathF.Exp(-lambda * (distance / range))); + // DeltaV END + + // Starlight START + var shakeParams = rangeList.Count < queued.Proto.SmallSoundIterationThreshold + ? new ESScreenshakeParameters() { Trauma = 0.4f, DecayRate = 0.2f, Frequency = 0.014f } + : new ESScreenshakeParameters() { Trauma = 0.6f, DecayRate = 0.05f, Frequency = 0.014f }; + + // DeltaV - Screenshake falloff START + // Linear falloff with increasing distance from epicenter, + // capped at certain values to avoid diminishing the effect completely near range. + shakeParams.DecayRate *= MathF.Min(1 + distance / range, 1.75f); + shakeParams.Frequency *= MathF.Max(1 - distance / range, 0.33f); + shakeParams.Trauma *= MathF.Max(1 - distance / range, 0.33f); + // DeltaV END + + _shake.Screenshake(players, shakeParams, null); + // Starlight END + } } } } diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 2f5840155ef..dfadc14371b 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -31,6 +31,7 @@ using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; +using Content.Shared.Wieldable.Components; // Starlight | ES Screenshake using Content.Shared.Zombies; // DeltaV - Buff Zombies using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -597,18 +598,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem if (damageResult.GetTotal() > FixedPoint2.Zero) { DoDamageEffect(targets, user, targetXform); - - // ES START - // dog shit copy plaste but thats melee for you - var userShakeRotation = new ESScreenshakeParameters() - { Trauma = 0.08f, DecayRate = 1.0f, Frequency = 0.009f }; - var otherShakeTranslation = new ESScreenshakeParameters() { Trauma = 0.45f, DecayRate = 1.1f, Frequency = 0.04f }; - _shake.Screenshake(user, null, userShakeRotation); - foreach (var shakeTarget in targets) - { - _shake.Screenshake(shakeTarget, otherShakeTranslation, null); - } - // ES END + DoScreenshake(meleeUid, damageResult, user, targets); // Starlight | ES Screenshake } } @@ -774,21 +764,10 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem _meleeSound.PlayHitSound(target, user, GetHighestDamageSound(appliedDamage, _protoManager), hitEvent.HitSoundOverride, component); } - // ES START - // dog shit copy plaste but thats melee for you - var userShakeRotation = new ESScreenshakeParameters() - { Trauma = 0.08f, DecayRate = 1.0f, Frequency = 0.009f }; - var otherShakeTranslation = new ESScreenshakeParameters() { Trauma = 0.45f, DecayRate = 1.1f, Frequency = 0.04f }; - _shake.Screenshake(user, null, userShakeRotation); - foreach (var shakeTarget in targets) - { - _shake.Screenshake(shakeTarget, otherShakeTranslation, null); - } - // ES END - if (appliedDamage.GetTotal() > FixedPoint2.Zero) { DoDamageEffect(targets, user, Transform(targets[0])); + DoScreenshake(meleeUid, damage, user, targets); // Starlight | ES Screenshake } return true; @@ -1104,4 +1083,55 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem } } } + + //Starlight begin | ES Screenshake + private void DoScreenshake(EntityUid weapon, DamageSpecifier damage, EntityUid attacker, List targets) + { + if(damage.GetTotal()>4) // only show to others if it hurts real bad // DeltaV - reduce from 8 to 4 + { + var otherTranslation = new ESScreenshakeParameters + { + Trauma = 0.45f, + DecayRate = 1.1f, + Frequency = 0.04f, + }; + foreach(var target in targets) + _shake.Screenshake(target, otherTranslation, null); + } + + // only show to attacker if they put real oompf into it, or the weapon is just THAT strong + // var bluntRequirement = damage.DamageDict.TryGetValue(BluntDamageName, out var blunt) && blunt >= 20; // DeltaV - unused + var isWielding = TryComp(weapon, out var wieldable) && wieldable.Wielded; + + // DeltaV - unused + // if (!bluntRequirement && !wieldRequirement) + // return; + + // DeltaV - heavy/light screenshake variants START + ESScreenshakeParameters userRotation; + if (damage.GetTotal() >= 15 || isWielding) + { + // heavy damage or two-handed + userRotation = new ESScreenshakeParameters + { + Trauma = 0.08f, + DecayRate = 1, + Frequency = 0.009f, + }; + } + else + { + // light damage + userRotation = new ESScreenshakeParameters + { + Trauma = 0.06f, + DecayRate = 1, + Frequency = 0.0045f, + }; + } + // DeltaV END + + _shake.Screenshake(attacker, null, userRotation); + } + //Starlight end }