From 25056a913cc9e9bf0b400683808a0ebc1aa2834c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 21 Jul 2024 02:50:25 -0400 Subject: [PATCH] Mass Contests Affect Camera Shake (#560) # Description I made this entirely on a whim to prove a point in the middle of a conversation. I have not tested this code, but I'm confident that it will work as advertised. This refactors the public KickCamera function so that it no longer: Divides by 1, divides by 1 again, multiplies by 1, normalizes a vector(turning its A value to 1), and then divides said vector by 1 again for good measure. Instead 1 has been replaced by MassContest, wooh! I also got rid of redundant steps. The effect of this is that characters with greater than human-standard mass are slightly more resistant to all sources of camera shake(Explosions, gravity generator turning off, gunfire, being hit by flying objects, etc), while characters with less than standard human mass experience a greater amount of camera shake. You're welcome. Now go find a Felinid to shake vigorously. # Changelog :cl: - add: Camera Shake is now affected by character mass. Small characters experience more camera shake. Large characters experience less. --- Content.Client/Camera/CameraRecoilSystem.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Content.Client/Camera/CameraRecoilSystem.cs b/Content.Client/Camera/CameraRecoilSystem.cs index 3e04cd5bf19..2a0b6258cc0 100644 --- a/Content.Client/Camera/CameraRecoilSystem.cs +++ b/Content.Client/Camera/CameraRecoilSystem.cs @@ -1,6 +1,7 @@ using System.Numerics; using Content.Shared.Camera; using Content.Shared.CCVar; +using Content.Shared.Contests; using Robust.Shared.Configuration; namespace Content.Client.Camera; @@ -8,6 +9,7 @@ namespace Content.Client.Camera; public sealed class CameraRecoilSystem : SharedCameraRecoilSystem { [Dependency] private readonly IConfigurationManager _configManager = default!; + [Dependency] private readonly ContestsSystem _contests = default!; private float _intensity; @@ -37,15 +39,15 @@ public override void KickCamera(EntityUid uid, Vector2 recoil, CameraRecoilCompo if (!Resolve(uid, ref component, false)) return; - recoil *= _intensity; + var massRatio = _contests.MassContest(uid); + var maxRecoil = KickMagnitudeMax / massRatio; + recoil *= _intensity / massRatio; - // Use really bad math to "dampen" kicks when we're already kicked. var existing = component.CurrentKick.Length(); - var dampen = existing / KickMagnitudeMax; - component.CurrentKick += recoil * (1 - dampen); + component.CurrentKick += recoil * (1 - existing); - if (component.CurrentKick.Length() > KickMagnitudeMax) - component.CurrentKick = component.CurrentKick.Normalized() * KickMagnitudeMax; + if (component.CurrentKick.Length() > maxRecoil) + component.CurrentKick = component.CurrentKick.Normalized() * maxRecoil; component.LastKickTime = 0; }