Thank you!
// Particle Poofer
// 7/6/05
// update 7/1/06
// Enjoy
// --Keknehv Psaltery
//Just change this variable to change the (default) texture.
//It needs either the name of a texture in the inventory, or a key ( asset UUID )
string pooftexture = "hug poofer";
float pooftime = 2; //How long it poofs
float poofrate = 0.4; //How long between each emission ( during poofing )
integer poofnum = 10; //How many particles per emission
float poofscale = 2; //The scale of the particles
float poofspeed = 5.5; //Speed of emitted particles
integer commandchannel = 1; //What channel to listen for commands on
list poofCommands; //The commands
list poofTextures; //The associated textures
key requestId;
integer lineNum;
string cardToRead = "poofconfig";
poof() //This is the function that actually starts the particle system.
{
llParticleSystem([ //KPSv1.0
PSYS_PART_FLAGS , 0 //Comment out any of the following masks to deactivate them
//| PSYS_PART_BOUNCE_MASK //Bounce on object's z-axis
//| PSYS_PART_WIND_MASK //Particles are moved by wind
| PSYS_PART_INTERP_COLOR_MASK //Colors fade from start to end
| PSYS_PART_INTERP_SCALE_MASK //Scale fades from beginning to end
| PSYS_PART_FOLLOW_SRC_MASK //Particles follow the emitter
//| PSYS_PART_FOLLOW_VELOCITY_MASK //Particles are created at the velocity of the emitter
| PSYS_PART_TARGET_POS_MASK //Particles follow the target
| PSYS_PART_EMISSIVE_MASK //Particles are self-lit (glow)
//| PSYS_PART_TARGET_LINEAR_MASK //Undocumented--Sends particles in straight line?
,
PSYS_SRC_TARGET_KEY , llGetKey(), //Key of the target for the particles to head towards
//This one is particularly finicky, so be careful.
//Choose one of these as a pattern:
//PSYS_SRC_PATTERN_DROP Particles start at emitter with no velocity
//PSYS_SRC_PATTERN_EXPLODE Particles explode from the emitter
//PSYS_SRC_PATTERN_ANGLE Particles are emitted in a 2-D angle
//PSYS_SRC_PATTERN_ANGLE_CONE Particles are emitted in a 3-D cone
//PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY Particles are emitted everywhere except for a 3-D cone
PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE
,PSYS_SRC_TEXTURE, pooftexture //UUID of the desired particle texture
,PSYS_PART_MAX_AGE, 5.0 //Lifetime, in seconds, that a particle lasts
,PSYS_SRC_MAX_AGE, pooftime //How long, in seconds, that the system lasts
,PSYS_SRC_BURST_RATE, poofrate //How long, in seconds, between each emission
,PSYS_SRC_BURST_PART_COUNT, 10 //Number of particles per emission
,PSYS_SRC_BURST_RADIUS, 5.0 //Radius of emission
,PSYS_SRC_BURST_SPEED_MIN, poofspeed //Minimum speed of an emitted particle
,PSYS_SRC_BURST_SPEED_MAX, poofspeed + .5 //Maximum speed of an emitted particle
,PSYS_SRC_ACCEL, <0.0,0.0,0.0> //Acceleration of particles each second
,PSYS_PART_START_COLOR, <1.0,1.0,1.0> //Starting RGB color
,PSYS_PART_END_COLOR, <1.0,1.0,1.0> //Ending RGB color, if INTERP_COLOR_MASK is on
,PSYS_PART_START_ALPHA, 0.9 //Starting transparency, 1 is opaque, 0 is transparent.
,PSYS_PART_END_ALPHA, 0.5 //Ending transparency
,PSYS_PART_START_SCALE, poofscale*<1,1,1> //Starting particle size
,PSYS_PART_END_SCALE, poofscale*<1,1,1>-<.3,.3,.3> //Ending particle size, if INTERP_SCALE_MASK is on
,PSYS_SRC_ANGLE_BEGIN, PI //Inner angle for ANGLE patterns
,PSYS_SRC_ANGLE_END, PI //Outer angle for ANGLE patterns
,PSYS_SRC_OMEGA, <0.0,0.0,0.0> //Rotation of ANGLE patterns, similar to llTargetOmega()
]);
}
string trim( string f2s ) //This will trim a typecast float
{
integer length = llStringLength( f2s ) - 1;
while( llGetSubString( f2s, length, length ) == "0" )
{
--length;
f2s = llGetSubString( f2s, 0, length );
}
if ( llGetSubString( f2s, length, length ) == "." )
{
--length;
f2s = llGetSubString( f2s, 0, length );
}
return f2s;
}
doCommand( string msg ) //This will parse out a command for the poofer
{
msg = llToLower( msg ); //Make it accept commands in any case
list parsedcommand = llParseString2List( msg, [" "], [] );
string part1 = llList2String( parsedcommand, 0 );
string part2 = llList2String( parsedcommand, 1 );
if ( part1 == "poof" )
{
if ( llGetListLength( parsedcommand ) > 1 ) //They gave us a texture parameter
{
pooftexture = llDumpList2String( llList2List( parsedcommand, 1, llGetListLength( parsedcommand ) ), " " );
poof();
} else
{
poof();
}
} else if ( ( part1 == "pooftexture" ) || ( part1 == "pt" ) )
//This is so long because it needs to ignore the spaces
pooftexture = llDumpList2String( llList2List( parsedcommand, 1, llGetListLength( parsedcommand ) ), " " );
else if ( part1 == "pooftime" )
pooftime = (float)llList2String( parsedcommand, 1 );
else if ( part1 == "poofrate" )
poofrate = (float)llList2String( parsedcommand, 1 );
else if ( part1 == "poofnum" )
poofnum = (integer)llList2String( parsedcommand, 1 );
else if ( part1 == "poofscale" )
poofscale = (float)llList2String( parsedcommand, 1 );
else if ( part1 == "poofspeed" )
poofspeed = (float)llList2String( parsedcommand, 1 );
else if ( part1 == "poofreset" )
llResetScript();
else if ( part1 == "poofdump" )
{
llOwnerSay( "pooftexture : " + pooftexture );
llOwnerSay( "pooftime : " + trim( (string)pooftime ) );
llOwnerSay( "poofrate: " + trim( (string)poofrate ) );
llOwnerSay( "poofnum: " + (string)poofnum );
llOwnerSay( "poofscale: " + trim( (string)poofscale ) );
llOwnerSay( "poofspeed: " + trim( (string)poofspeed ) );
} else if ( part1 == "poofadd" )
{
//Check to make sure we don't already have this in the command list
if (llListFindList( [ "poof","pooftexture","pooftime","poofrate","poofnum","poofscale","poofspeed","poofreset","poofdump","poofadd"]+
poofCommands, [ part2 ] ) != -1 )
{
llOwnerSay( "The command \""+ part2 + "\" already exists!" );
} else
{
llOwnerSay("Command \"" + part2 + "\" added"
; poofCommands += [ part2 ];
poofTextures += [ llDumpList2String( llList2List( parsedcommand, 2, llGetListLength( parsedcommand ) ), " " ) ];
}
} else if ( part1 == "poofremove" )
{
integer commandLoc = llListFindList( poofCommands, [part2] );
if ( commandLoc != -1 )
{
llDeleteSubList( poofCommands, commandLoc, commandLoc );
llDeleteSubList( poofTextures, commandLoc, commandLoc );
} else
{
llOwnerSay( "No command to delete!" );
}
} else if ( part1 == "help" )
{
llGiveInventory( llGetOwner(), "Instructions" );
} else
{
integer commandLoc = llListFindList( poofCommands, [ part1 ] );
if ( commandLoc != -1 )
{
string temp = pooftexture;
pooftexture = llList2String( poofTextures, commandLoc );
poof();
pooftexture = temp;
}
}
}
default
{
on_rez( integer sparam )
{
poof();
llResetScript();
}
state_entry()
{
llParticleSystem([]);
llSetTimerEvent( 20 );
lineNum = 0;
requestId = llGetNotecardLine( cardToRead, lineNum++ );
llListen( commandchannel, "", llGetOwner(), "" );
}
listen( integer chan, string name, key id, string msg )
{
doCommand( msg );
}
timer()
{
llOwnerSay( cardToRead + " reading timed out" );
requestId = "";
}
dataserver( key id, string data )
{
if ( requestId == id )
{
if ( data != EOF )
{
doCommand( data );
llSetTimerEvent( 20 );
requestId = llGetNotecardLine( cardToRead, lineNum++ );
} else
llSetTimerEvent( 0 );
}
}
changed( integer change )
{
if ( change & CHANGED_TELEPORT )
poof();
else
llParticleSystem( [] ); //Stop the particles going off with every modification
}
}
Seagel Neville