swb_base/particles/BulletEjectParticle.cs
using SWB.Shared;

namespace SWB.Base.Particles;

[Group( "SWB Particles" )]
public class BulletEjectParticle : Component
{
	public IPlayerBase Owner { get; set; }

	protected override void OnStart()
	{
		if ( Owner is null ) return;
		var vel = Owner.Velocity;
		var right = Owner.EyeAngles.ToRotation().Right;
		var lateralSpeed = vel.Dot( right );

		// Only push shells further right when the player is actually moving right.
		if ( lateralSpeed > 0f )
		{
			var effect = GetComponent<ParticleEffect>();
			var lateralForce = right * lateralSpeed * 0.2f;

			if ( effect.ForceSpace == ParticleEffect.SimulationSpace.Local )
				lateralForce = effect.WorldRotation.Inverse * lateralForce;

			effect.ForceDirection += lateralForce;
		}
	}
}