1
0

CameraRecoilSystem.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System.Numerics;
  2. using Content.Shared.Camera;
  3. using Content.Shared.CCVar;
  4. using Robust.Shared.Configuration;
  5. namespace Content.Client.Camera;
  6. public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
  7. {
  8. [Dependency] private readonly IConfigurationManager _configManager = default!;
  9. private float _intensity;
  10. public override void Initialize()
  11. {
  12. base.Initialize();
  13. SubscribeNetworkEvent<CameraKickEvent>(OnCameraKick);
  14. Subs.CVar(_configManager, CCVars.ScreenShakeIntensity, OnCvarChanged, true);
  15. }
  16. private void OnCvarChanged(float value)
  17. {
  18. _intensity = value;
  19. }
  20. private void OnCameraKick(CameraKickEvent ev)
  21. {
  22. KickCamera(GetEntity(ev.NetEntity), ev.Recoil);
  23. }
  24. public override void KickCamera(EntityUid uid, Vector2 recoil, CameraRecoilComponent? component = null)
  25. {
  26. if (_intensity == 0)
  27. return;
  28. if (!Resolve(uid, ref component, false))
  29. return;
  30. recoil *= _intensity;
  31. // Use really bad math to "dampen" kicks when we're already kicked.
  32. var existing = component.CurrentKick.Length();
  33. var dampen = existing / KickMagnitudeMax;
  34. component.CurrentKick += recoil * (1 - dampen);
  35. if (component.CurrentKick.Length() > KickMagnitudeMax)
  36. component.CurrentKick = component.CurrentKick.Normalized() * KickMagnitudeMax;
  37. component.LastKickTime = 0;
  38. }
  39. }