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