Code/ParticleForce.cs

Particle controller that applies a constant force to particles each simulation step. It reads per-axis ParticleFloat values and an overall scale, optionally transforms the force into local space, and increments particle velocity accounting for effect time scale.

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;
	}
	
}