ParticleForce.cs

A particle controller that applies a per-particle directional force each simulation step. It reads X/Y/Z force components and a force scale from ParticleFloat properties, optionally converts the force into local space, then modifies the particle velocity each step.

Native Interop
using Sandbox;

public sealed class ParticleForce : ParticleController
{
	
	[Property]
	public ParticleFloat ForceX { get; set; }
	[Property]
	public ParticleFloat ForceY { get; set; }
	[Property]
	public ParticleFloat ForceZ { get; set; }

	[Property]
	public bool LocalSpace {get; set;} = false;
	
	[Property]
	public ParticleFloat ForceScale { get; set; }

	protected override void OnParticleStep( Particle particle, float delta )
	{
		var forceX = ForceX.Evaluate( particle, 62611 );
		var forceY = ForceY.Evaluate( particle, 62611 );
		var forceZ = ForceZ.Evaluate( particle, 62611 );
		var forceScale = ForceScale.Evaluate(particle, 62611);
		var vector3 = new Vector3( forceX, forceY, forceZ );
		if ( LocalSpace )
		{
			vector3 = WorldTransform.NormalToLocal(vector3);
		}
		particle.Velocity += vector3 / 100 * ParticleEffect.TimeScale * forceScale;
	}
	
}