ParticleSystemToolThis object is a tool for helping Second Life users make scripted particle systems. It includes a script: ParticleSystemTool.lslwhich will make particle systems on command as well as change the particle system parameters in real-time. Please read the comments inside the script for help on how to use it. Also included are a collection of sample textures that work well for particle systems.
// ParticleSystemTool.lsl
//
// There are four calls in the scripting language that produce
// particle-systems. They are:
//
// llMakeExplosion()
// llMakeFire()
// llMakeFountain()
// llMakeSmoke()
//
// Unfortunately, the documentation in the Second Life scripting
// guide is woefully inadequate. What to do? ==> Experiment!
//
// This script can help an intrepid scriptor home in on good
// parameters for making a particle-system look "just right".
// It accepts commands from its owner that can make any of the
// four particle systems, or change the values of the parameters
// that are used in the llMake*() call.
//
// To make a particle system, chat one of the following commands:
//
// explosion -- rapidly expanding, no fading
// fire -- rises quickly, fades quickly
// fountain -- bounces on some plane, influenced by wind
// smoke -- rises slow, fades slow
//
// To hear a report on the current values being used in the script
// call, chat the following command:
//
// report -- chats list of parameter values
//
// To change one of the parameters, use a command of the form:
//
// parameter,value
//
// Where "parameter" is one of the following:
//
// count -- the number of particles to produce (integer only)
// scale -- the size of particles
// speed -- speed at which particles move
// lifetime -- how long particles last
// arc -- arc of randomization
// bounce -- ??? (fountain only) (integer only)
// offset -- where to spawn the particles (in object's z direction)
// bounce_offset -- ??? (fountain only)
//
// and "value" is a number, whitespace is allowed after the comma
//
// Note: the same parameters passed to different varieties of particle
// systems will produce very different results. For instance, since "fire"
// systems decay faster than "explosion" systems, the same "lifetime"
// parameter will not produce particle systems with the same apparent
// lifetime. Hence the need for this script for exploring what works,
// and what doesn't.
//
// Play and learn.
//
// Andrew Linden
// These are the parameters
integer count = 10;
float scale = 1.0;
float speed = 0.5;
float lifetime = 10.0;
float arc = PI; // radians (not solid-angle)
integer bounce = 1; // fountain only
vector offset = <0,0,1>;
float bounce_offset = 1.0; // fountain only
string last_command = "fountain";
// change this line to change the texture used in the particle system
// (the texture must be in this object's inventory, and have the
// exact name you supply here)
string particle_texture = "Jet Blast";
// a custom function for figuring out which particle system to make
make_particles(string command)
{
// this script expects a texture in the object's inventory called "heart"
if (command == "fountain")
{
llMakeFountain(count, scale, speed, lifetime, arc, bounce, particle_texture, offset, bounce_offset);
last_command = command;
}
else if (command == "explosion")
{
llMakeExplosion(count, scale, speed, lifetime, arc, particle_texture, offset);
last_command = command;
}
else if (command == "fire")
{
llMakeFire(count, scale, speed, lifetime, arc, particle_texture, offset);
last_command = command;
}
else if (command == "smoke")
{
llMakeSmoke(count, scale, speed, lifetime, arc, particle_texture, offset);
last_command = command;
}
}
default
{
state_entry()
{
// only accept commands from the owner
llListen(0, "", llGetOwner(), "");
last_command = "explosion";
}
touch_start(integer touch_count)
{
// make another particle system like the last one
make_particles(last_command);
}
listen(integer channel, string name, key id, string command)
{
// convert the comma separated values (CSV) to a list
list command_list = llCSV2List(command);
integer list_length = llGetListLength(command_list);
if (list_length == 1)
{
// found a single-word command
if (command == "report")
{
llWhisper(0, "count = " + (string)count);
llWhisper(0, "scale = " + (string)scale);
llWhisper(0, "speed = " + (string)speed);
llWhisper(0, "lifetime = " + (string)lifetime);
llWhisper(0, "arc = " + (string)arc);
llWhisper(0, "bounce = " + (string)bounce);
llWhisper(0, "offset = " + (string)offset);
llWhisper(0, "bounce_offset = " + (string)bounce_offset);
}
else
{
make_particles(command);
}
}
else if (list_length == 2)
{
// found a command of the form: "parameter,value"
string variable = llList2String(command_list, 0);
string value = llList2String(command_list, 1);
if (variable == "count")
{
count = llList2Integer(command_list, 1);
llWhisper(0, "count = " + (string)count);
}
else if (variable == "scale")
{
scale = llList2Float(command_list, 1);
llWhisper(0, "scale = " + (string)scale);
}
else if (variable == "speed")
{
speed = llList2Float(command_list, 1);
llWhisper(0, "speed = " + (string)speed);
}
else if (variable == "lifetime")
{
lifetime = llList2Float(command_list, 1);
llWhisper(0, "lifetime = " + (string)lifetime);
}
else if (variable == "arc")
{
arc = llList2Float(command_list, 1);
llWhisper(0, "arc = " + (string)arc);
}
else if (variable == "bounce")
{
bounce = llList2Integer(command_list, 1);
llWhisper(0, "bounce = " + (string)bounce);
}
else if (variable == "offset")
{
// we can't pass vectors into a CSV, so we only change the z-value here
offset.z = llList2Float(command_list, 1);
llWhisper(0, "offset = " + (string)offset);
}
else if (variable == "bounce_offset")
{
bounce_offset = llList2Float(command_list, 1);
llWhisper(0, "bounce_offset = " + (string)bounce_offset);
}
}
}
}