swb_player/PlayerBase.ScreenShake.cs
using SWB.Shared;
using System;

namespace SWB.Player;

public partial class PlayerBase
{
	ScreenShake lastScreenShake;
	RealTimeSince timeSinceShake;
	float nextShake;

	public virtual void ShakeScreen( ScreenShake screenShake )
	{
		lastScreenShake = screenShake;
		timeSinceShake = 0;
		nextShake = 0;
	}

	public virtual void HandleScreenShake()
	{
		if ( timeSinceShake < lastScreenShake?.Duration && timeSinceShake > nextShake )
		{
			var random = Random.Shared;
			var randomPos = new Vector3( random.Float( 0, lastScreenShake.Size ), random.Float( 0, lastScreenShake.Size ), random.Float( 0, lastScreenShake.Size ) );
			var randomRot = new Angles( random.Float( 0, lastScreenShake.Rotation ), random.Float( 0, lastScreenShake.Rotation ), 0 );

			CameraMovement.AnglesOffset += randomRot;
			CameraMovement.PosOffset += randomPos;
			nextShake = timeSinceShake + lastScreenShake.Delay;

			if ( IsUsingController )
				Input.TriggerHaptics( HapticEffect.HardImpact, lastScreenShake.Duration * 2, lastScreenShake.Size, lastScreenShake.Size );
		}
	}
}