Fire Flies

Written by Kitsune
//start_unprocessed_text
/*mySetParticles() {
    /|/ Part-1 - APPEARANCE - Settings for how each particle LOOKS
    vector   START_SCALE = < 0.1, 0.1, 0.1 >; /|/ < 1.0, 1.0, 0.0 >
    vector     END_SCALE = < 0.1, 0.1, 0.1 >; /|/ < 1.0, 1.0, 0.0 >
    vector   START_COLOR = < 1.0, 1.0, 0.0 >; /|/ < 1.0, 1.0, 1.0 >
    vector     END_COLOR = < 1.0, 1.0, 0.0 >; /|/ < 1.0, 1.0, 1.0 >
    float    START_ALPHA = 1.0; /|/ 1.00
    float      END_ALPHA = 1.0; /|/ 1.00
    integer INTERP_COLOR = TRUE; /|/ FALSE
    integer INTERP_SCALE = TRUE; /|/ FALSE
    integer     EMISSIVE = TRUE; /|/ FALSE
    string       TEXTURE = ""; /|/ ""
    /|/ START/END: refers to the birth and death time of each particle.
    /|/ SCALE: particle height/width, from 0.04 to 4.0. (no depth)
    /|/ ALPHA: sets transparency, from invis = 0.0 to opaque = 1.0
    /|/       START_ALPHA is ignored if it is less than END_ALPHA
    /|/ COLOR: vectors , each 0.00 to 1.00
    /|/ INTERP_COLOR: enables/disables END_COLOR and END_ALPHA
    /|/ INTERP_SCALE: enables/disables END_SCALE
    /|/ EMISSIVE: enables/diables particle 'glow'
    /|/ TEXTURE: name of a texture in the emitter-prim's inventory
    /|/          or the asset id key of any texture
 
    /|/ Part-2 - FLOW - These settings affect how Many, how Quickly,
    /|/                  and for how Long particles are present
    float     AGE = 2.00; /|/ 10.00
    float    RATE = 0.5;  /|/ 0.10
    integer COUNT = 1;    /|/ 1
    float    LIFE = 0.0;  /|/ 0.0
    /|/ AGE: How many seconds each particle lives, 0.1 to 60
    /|/ RATE: Seconds between particle bursts, 0.0 to 60
    /|/ COUNT: Number of particles per burst, 1 to 4096
    /|/ LIFE Number of seconds to wait before shutting off 0.1 to 60
    /|/       0.0 never stops
 
    /|/ Part-3 - 3    PLACEMENT -- Where are new particles created, and what
    /|/                     direction  are they facing?
    integer   PATTERN = PSYS_SRC_PATTERN_EXPLODE; /|/ PSYS_SRC_PATTERN_DROP
    float      RADIUS = 1.00; /|/ 0.00
    float ANGLE_BEGIN = 0.10; /|/ 0.00
    float   ANGLE_END = 0.10; /|/ 0.00
    vector      OMEGA = < 0.00, 0.00, 1.00 >; /|/ < 0.00, 0.00, 0.00 >
    /|/float  INNERANGLE = 0.00; /|/ 0.00
    /|/float  OUTERANGLE = 0.00; /|/ 0.00
    /|/ PATTERN: must be set to one of the following:
    /|/      PSYS_SRC_PATTERN_EXPLODE sends particles in all directions
    /|/      PSYS_SRC_PATTERN_DROP  ignores minSpeed and maxSpeed.
    /|/      PSYS_SRC_PATTERN_ANGLE_CONE use ANGLE settings to make rings/cones
    /|/      PSYS_SRC_PATTERN_ANGLE use innerangle/outerangle to make flat
    /|/      wedges
    /|/ RADIUS: distance between emitter and each new particle,  0.0 to 64?
    /|/ ANGLE_BEGIN: for both ANGLE patterns, 0 to PI(3.14159)
    /|/ ANGLE_END: for both for ANGLE patterns,  0 to PI.
    /|/ OMEGA: How much to rotate the emitter around the  axises
    /|/         after each burst.  Set OMEGA to all 0's to reset/disable it.
    /|/ INNER/OUTER ANGLE:  Depreciated. Old versions of ANGLE_BEGIN/_END.
    /|/    Can still be used to make lop-sided angle displays though.
 
    /|/  Part-4 - MOVEMENT - How do the particles move once they're created?
    integer      FOLLOW_SRC = TRUE; /|/ FALSE
    integer FOLLOW_VELOCITY = TRUE; /|/ FALSE
    integer            WIND = TRUE; /|/ FALSE
    integer          BOUNCE = FALSE; /|/ FALSE
    float         SPEED_MIN = 1.00; /|/ 1.00
    float         SPEED_MAX = 2.20; /|/ 1.00
    vector            ACCEL = < 0.00, 0.00, 0.00 >; /|/ < 0.00, 0.00, 0.00 >
    integer      TARGET_POS = TRUE; /|/ FALSE
    key              TARGET = llGetKey(); /|/ llGetKey();
    /|/ FOLLOW_SRC: moves particles when emitter moves. It will disable RADIUS!
    /|/ FOLLOW_VELOCITY:  Particles rotate towards their heading
    /|/ WIND: Sim's Wind will push particles
    /|/ BOUNCE: Make particles bounce above the Z altitude of emitter
    /|/ SPEED_MIN: 0.01 to ?, slowest speed of new particles, 1.0(*)
    /|/ SPEED_MAX: 0.01 to ?, fastest speed of new particle, 1.0(*)
    /|/      SPEED_ is ignored for the DROP pattern.
    /|/ ACCEL: a continuous force pushed on particles,
    /|/             use SMALL settings for long lived particles
    /|/ TARGET_POS: If FALSE(*), TARGET value is ignored.
    /|/ TARGET: Select a target for particles to arrive at when they die
    /|/      key TARGET = llGetKey(); /|/ particles return to the emitter
    /|/      key TARGET = llGetOwner(); /|/ particles home in on owner
    /|/      You can have another object llSay(999,llGetKey);
    /|/      and grab the key with this object by using the listen()
    /|/      event handler.
 
    list particle_parameters = [
            PSYS_PART_FLAGS, (
                (        EMISSIVE * PSYS_PART_EMISSIVE_MASK ) |
                (          BOUNCE * PSYS_PART_BOUNCE_MASK ) |
                (    INTERP_COLOR * PSYS_PART_INTERP_COLOR_MASK ) |
                (    INTERP_SCALE * PSYS_PART_INTERP_SCALE_MASK ) |
                (            WIND * PSYS_PART_WIND_MASK ) |
                (      FOLLOW_SRC * PSYS_PART_FOLLOW_SRC_MASK ) |
                ( FOLLOW_VELOCITY * PSYS_PART_FOLLOW_VELOCITY_MASK ) |
                (      TARGET_POS * PSYS_PART_TARGET_POS_MASK ) ),
            PSYS_PART_START_COLOR,     START_COLOR,
            PSYS_PART_END_COLOR,       END_COLOR,
            PSYS_PART_START_ALPHA,     START_ALPHA,
            PSYS_PART_END_ALPHA,       END_ALPHA,
            PSYS_PART_START_SCALE,     START_SCALE,
            PSYS_PART_END_SCALE,       END_SCALE,
            PSYS_SRC_PATTERN,          PATTERN,
            PSYS_SRC_BURST_PART_COUNT, COUNT,
            PSYS_SRC_BURST_RATE,       RATE,
            PSYS_PART_MAX_AGE,         AGE,
            PSYS_SRC_ACCEL,            ACCEL,
            PSYS_SRC_BURST_RADIUS,     RADIUS,
            PSYS_SRC_BURST_SPEED_MIN,  SPEED_MIN,
            PSYS_SRC_BURST_SPEED_MAX,  SPEED_MAX,
            PSYS_SRC_TARGET_KEY,       TARGET,
            PSYS_SRC_ANGLE_BEGIN,      ANGLE_BEGIN,
            PSYS_SRC_ANGLE_END,        ANGLE_END,
            /|/PSYS_SRC_INNERANGLE,       INNERANGLE,
            /|/PSYS_SRC_OUTERANGLE,       OUTERANGLE,
            PSYS_SRC_OMEGA,            OMEGA,
            PSYS_SRC_MAX_AGE,          LIFE,
            PSYS_SRC_TEXTURE,          TEXTURE
        ];
 
    llParticleSystem( particle_parameters ); /|/ Turns on the particle hose!
 
    if ( (AGE/RATE)*COUNT > 4096) {
        llOwnerSay( "Your emitter creates too many particles!"
            + "Please decrease AGE and COUNT and/or increase RATE."
            + "Give a hoot, don't pollute!");
    } else {
        llOwnerSay( "This emitter produces "
                    + (string)((integer)((AGE/RATE)*COUNT))
                    + " concurrent particles." );
    }
}
 
default
{
    state_entry() {
        mySetParticles();
        /|/ llSetTimerEvent(60); /|/ uncomment to set auto-off for 60 seconds
    }
 
    timer() {
        llSetTimerEvent( 0 );  /|/ Turn off the alarm clock
        llParticleSystem( [ ] );  /|/ Turn off the particles
        /|/ updateParticles(); /|/ Or use this to update/change the particle
        /|/ system
    }
 
    touch(integer i) {
        mySetParticles(); /|/ touch to reset/turn on the particles
        /|/ llSetTimerEvent(60); /|/ reset the alarm clock
    }
}*/
//end_unprocessed_text
//nfo_preprocessor_version 0
//program_version Emerald Viewer
//mono
 
mySetParticles() {
 
    vector   START_SCALE = < 0.1, 0.1, 0.1 >;
    vector     END_SCALE = < 0.1, 0.1, 0.1 >;
    vector   START_COLOR = < 1.0, 1.0, 0.0 >;
    vector     END_COLOR = < 1.0, 1.0, 0.0 >;
    float    START_ALPHA = 1.0;
    float      END_ALPHA = 1.0;
    integer INTERP_COLOR = TRUE;
    integer INTERP_SCALE = TRUE;
    integer     EMISSIVE = TRUE;
    string       TEXTURE = ""; 
 
    float     AGE = 2.00;
    float    RATE = 0.5;
    integer COUNT = 1;
    float    LIFE = 0.0;  
 
    integer   PATTERN = PSYS_SRC_PATTERN_EXPLODE;
    float      RADIUS = 1.00;
    float ANGLE_BEGIN = 0.10;
    float   ANGLE_END = 0.10;
    vector      OMEGA = < 0.00, 0.00, 1.00 >; 
 
    integer      FOLLOW_SRC = TRUE;
    integer FOLLOW_VELOCITY = TRUE;
    integer            WIND = TRUE;
    integer          BOUNCE = FALSE;
    float         SPEED_MIN = 1.00;
    float         SPEED_MAX = 2.20;
    vector            ACCEL = < 0.00, 0.00, 0.00 >;
    integer      TARGET_POS = TRUE;
    key              TARGET = llGetKey(); 
 
    list particle_parameters = [
            PSYS_PART_FLAGS, (
                (        EMISSIVE * PSYS_PART_EMISSIVE_MASK ) |
                (          BOUNCE * PSYS_PART_BOUNCE_MASK ) |
                (    INTERP_COLOR * PSYS_PART_INTERP_COLOR_MASK ) |
                (    INTERP_SCALE * PSYS_PART_INTERP_SCALE_MASK ) |
                (            WIND * PSYS_PART_WIND_MASK ) |
                (      FOLLOW_SRC * PSYS_PART_FOLLOW_SRC_MASK ) |
                ( FOLLOW_VELOCITY * PSYS_PART_FOLLOW_VELOCITY_MASK ) |
                (      TARGET_POS * PSYS_PART_TARGET_POS_MASK ) ),
            PSYS_PART_START_COLOR,     START_COLOR,
            PSYS_PART_END_COLOR,       END_COLOR,
            PSYS_PART_START_ALPHA,     START_ALPHA,
            PSYS_PART_END_ALPHA,       END_ALPHA,
            PSYS_PART_START_SCALE,     START_SCALE,
            PSYS_PART_END_SCALE,       END_SCALE,
            PSYS_SRC_PATTERN,          PATTERN,
            PSYS_SRC_BURST_PART_COUNT, COUNT,
            PSYS_SRC_BURST_RATE,       RATE,
            PSYS_PART_MAX_AGE,         AGE,
            PSYS_SRC_ACCEL,            ACCEL,
            PSYS_SRC_BURST_RADIUS,     RADIUS,
            PSYS_SRC_BURST_SPEED_MIN,  SPEED_MIN,
            PSYS_SRC_BURST_SPEED_MAX,  SPEED_MAX,
            PSYS_SRC_TARGET_KEY,       TARGET,
            PSYS_SRC_ANGLE_BEGIN,      ANGLE_BEGIN,
            PSYS_SRC_ANGLE_END,        ANGLE_END,
 
            PSYS_SRC_OMEGA,            OMEGA,
            PSYS_SRC_MAX_AGE,          LIFE,
            PSYS_SRC_TEXTURE,          TEXTURE
        ];
 
    llParticleSystem( particle_parameters ); 
 
    if ( (AGE/RATE)*COUNT > 4096) {
        llOwnerSay( "Your emitter creates too many particles!"
            + "Please decrease AGE and COUNT and/or increase RATE."
            + "Give a hoot, don't pollute!");
    } else {
        llOwnerSay( "This emitter produces "
                    + (string)((integer)((AGE/RATE)*COUNT))
                    + " concurrent particles." );
    }
}
 
default
{
    state_entry() {
        mySetParticles();
 
    }
 
    timer() {
        llSetTimerEvent( 0 );
        llParticleSystem( [ ] );  
 
    }
 
    touch(integer i) {
        mySetParticles(); 
 
    }
}