GravitySystem.Shake.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System.Numerics;
  2. using Content.Shared.Camera;
  3. using Content.Shared.Gravity;
  4. using Robust.Client.Player;
  5. using Robust.Shared.Audio;
  6. using Robust.Shared.Audio.Systems;
  7. using Robust.Shared.Player;
  8. using Robust.Shared.Random;
  9. namespace Content.Client.Gravity;
  10. public sealed partial class GravitySystem
  11. {
  12. [Dependency] private readonly IPlayerManager _playerManager = default!;
  13. [Dependency] private readonly IRobustRandom _random = default!;
  14. [Dependency] private readonly SharedAudioSystem _audio = default!;
  15. [Dependency] private readonly SharedCameraRecoilSystem _sharedCameraRecoil = default!;
  16. private void InitializeShake()
  17. {
  18. SubscribeLocalEvent<GravityShakeComponent, ComponentInit>(OnShakeInit);
  19. }
  20. private void OnShakeInit(EntityUid uid, GravityShakeComponent component, ComponentInit args)
  21. {
  22. var localPlayer = _playerManager.LocalEntity;
  23. if (!TryComp(localPlayer, out TransformComponent? xform) ||
  24. xform.GridUid != uid && xform.MapUid != uid)
  25. {
  26. return;
  27. }
  28. if (Timing.IsFirstTimePredicted && TryComp<GravityComponent>(uid, out var gravity))
  29. {
  30. _audio.PlayGlobal(gravity.GravityShakeSound, Filter.Local(), true, AudioParams.Default.WithVolume(-2f));
  31. }
  32. }
  33. protected override void ShakeGrid(EntityUid uid, GravityComponent? gravity = null)
  34. {
  35. base.ShakeGrid(uid, gravity);
  36. if (!Resolve(uid, ref gravity) || !Timing.IsFirstTimePredicted)
  37. return;
  38. var localPlayer = _playerManager.LocalEntity;
  39. if (!TryComp(localPlayer, out TransformComponent? xform))
  40. return;
  41. if (xform.GridUid != uid ||
  42. xform.GridUid == null && xform.MapUid != uid)
  43. {
  44. return;
  45. }
  46. var kick = new Vector2(_random.NextFloat(), _random.NextFloat()) * GravityKick;
  47. _sharedCameraRecoil.KickCamera(localPlayer.Value, kick);
  48. }
  49. }