private void HandleCameraKick(CameraKickEvent args)
    {
        if (!EntityManager.TryGetComponent(args.Euid, out CameraRecoilComponent recoil))
        {
            _log.Warning($"Received a kick for euid {args.Euid}, but it is missing required components.");
            return;
        }

        if (!float.IsFinite(args.Recoil.X) || !float.IsFinite(args.Recoil.Y))
        {
            _log.Error($"CameraRecoilComponent on entity {recoil.Owner} passed a NaN recoil value. Ignoring.");
            return;
        }

        // Use really bad math to "dampen" kicks when we're already kicked.
        var existing = recoil.CurrentKick.Length;
        var dampen   = existing / KickMagnitudeMax;

        recoil.CurrentKick += args.Recoil * (1 - dampen);

        if (recoil.CurrentKick.Length > KickMagnitudeMax)
        {
            recoil.CurrentKick = recoil.CurrentKick.Normalized * KickMagnitudeMax;
        }

        recoil.LastKickTime = 0;
    }
 private void OnCameraKick(CameraKickEvent ev)
 {
     KickCamera(ev.Euid, ev.Recoil);
 }