Smoke Particles

Written by Kitsune
// Particle System 1.0

StartSteam()
{
                                // MASK FLAGS: set  to "TRUE" to enable
integer glow = FALSE;                                // Makes the particles glow
integer bounce = FALSE;                             // Make particles bounce on Z plane of objects
integer interpColor = TRUE;                         // Color - from start value to end value
integer interpSize = TRUE;                          // Size - from start value to end value
integer wind = TRUE;                               // Particles effected by wind
integer followSource = FALSE;                       // Particles follow the source
integer followVel = FALSE;                           // Particles turn to velocity direction



                                                    // Choose a pattern from the following:
                                                    // PSYS_SRC_PATTERN_EXPLODE
                                                    //PSYS_SRC_PATTERN_DROP
                                                    // PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
                                                    // PSYS_SRC_PATTERN_ANGLE_CONE
                                                    // PSYS_SRC_PATTERN_ANGLE
    integer pattern = PSYS_SRC_PATTERN_EXPLODE;

                                                    // Select a target for particles to go towards
                                                    // "" for no target, "owner" will follow object owner 
                                                    //    and "self" will target this object
                                                    //    or put the key of an object for particles to go to
    key target;
    

                            // Particle paramaters
                            
    float age = 30;                                  // Life of each particle
    float maxSpeed = .75;                          // Max speed each particle is spit out at
    float minSpeed = 0.20;                           // Min speed each particle is spit out at
    string texture = "smoke2";                     // Texture used for particles, default used if blank
    float startAlpha = .70;                         // Start alpha (transparency) value
    float endAlpha = 0.0;                           // End alpha (transparency) value
    vector startColor = <0.5,0.5,0.5>;                // Start color of particles 
    vector endColor = <1,1,1>;                      // End color of particles  (if interpColor == TRUE)
    vector startSize = <5.1,5.1,5.1>;               // Start size of particles 
    vector endSize = <30.0,30.0,30.0>;                       // End size of particles (if interpSize == TRUE)
    vector push = <0,0,0.7>;                        // Force pushed on particles

                            // System paramaters
                            
    float rate = 1.1;                               // How fast (rate) to emit particles
    float radius = .0001;                             // Radius to emit particles for BURST pattern
    integer count = 20;                             // How many particles to emit per BURST 
    float outerAngle = 0.1;                         // Outer angle for all ANGLE patterns
    float innerAngle = 0.65;                        // Inner angle for all ANGLE patterns
    vector omega = <0,0,0>;                         // Rotation of ANGLE patterns around the source
    float life = 0;                                 // Life in seconds for the system to make particles

                            // Script variables
                            
    integer flags; 


      flags = 0;
    if (target == "owner") target = llGetOwner();
    if (target == "self") target = llGetKey();
    if (glow) flags = flags | PSYS_PART_EMISSIVE_MASK;
    if (bounce) flags = flags | PSYS_PART_BOUNCE_MASK;
    if (interpColor) flags = flags | PSYS_PART_INTERP_COLOR_MASK;
    if (interpSize) flags = flags | PSYS_PART_INTERP_SCALE_MASK;
    if (wind) flags = flags | PSYS_PART_WIND_MASK;
    if (followSource) flags = flags | PSYS_PART_FOLLOW_SRC_MASK;
    if (followVel) flags = flags | PSYS_PART_FOLLOW_VELOCITY_MASK;
    if (target != "") flags = flags | PSYS_PART_TARGET_POS_MASK;

    llParticleSystem([  PSYS_PART_MAX_AGE,age,
                        PSYS_PART_FLAGS,flags,
                        PSYS_PART_START_COLOR, startColor,
                        PSYS_PART_END_COLOR, endColor,
                        PSYS_PART_START_SCALE,startSize,
                        PSYS_PART_END_SCALE,endSize, 
                        PSYS_SRC_PATTERN, pattern,
                        PSYS_SRC_BURST_RATE,rate,
                        PSYS_SRC_ACCEL, push,
                        PSYS_SRC_BURST_PART_COUNT,count,
                        PSYS_SRC_BURST_RADIUS,radius,
                        PSYS_SRC_BURST_SPEED_MIN,minSpeed,
                        PSYS_SRC_BURST_SPEED_MAX,maxSpeed,
                        PSYS_SRC_TARGET_KEY,target,
                        PSYS_SRC_INNERANGLE,innerAngle, 
                        PSYS_SRC_OUTERANGLE,outerAngle,
                        PSYS_SRC_OMEGA, omega,
                        PSYS_SRC_MAX_AGE, life,
                        PSYS_SRC_TEXTURE, texture,
                        PSYS_PART_START_ALPHA, startAlpha,
                        PSYS_PART_END_ALPHA, endAlpha
                            ]);
      
}
StartSpray ()
{

}

StopSpray()
{
    llParticleSystem([]);   
}



default
{
    state_entry()
    {
         StartSteam();
    }

    listen(integer channel, string name, key id, string message)
    {
 
         if (0 == llSubStringIndex(message, "spray on"))
        {
            StartSteam();
            
        }
        else if (0 == llSubStringIndex(message, "spray off"))
        {
            StopSpray();
        }
    }
}