CODE
// Particle Script 0.3
// Created by Ama Omega
// 10-10-2003
// Interactive Dev Kit version by Cienna Rand
integer lHandle = -1;
integer run = 1;
// Mask Flags - set to TRUE to enable
integer glow = TRUE;
integer bounce = FALSE;
integer interpColor = TRUE;
integer interpSize = TRUE;
integer wind = FALSE;
integer followSource = TRUE;
integer followVel = FALSE;
integer pattern = PSYS_SRC_PATTERN_ANGLE_CONE;
key target = "";
float age = 3.5;
float maxSpeed = 0.0;
float minSpeed = 0.0;
string texture;
float startAlpha = 1;
float endAlpha = 0.1;
vector startColor = <1,2,0>;
vector endColor = <1,0,0>;
vector startSize = <1.5,1.5,1.5>;
vector endSize = <0.1,0.1,0.1>;
vector push = <0,1,0>;
float rate = 0.1;
float radius = 0;
integer count = 3;
float outerAngle = 0;
float innerAngle = 0;
vector omega = <0,0,20>;
float life = 0;
integer flags;
updateParticles()
{
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
]);
}
processFlag(string var)
{
integer type;
string c = llGetSubString(var, 0, 0);
if (c == "+") type = TRUE;
else if (c == "-") type = FALSE;
else return;
string v = llToLower(llGetSubString(var, 1, llStringLength(var)));
if (v == "glow") glow = type;
else if (v == "bounce") bounce = type;
else if (v == "interpcolor") interpColor = type;
else if (v == "interpsize") interpSize = type;
else if (v == "wind") wind = type;
else if (v == "followsource") followSource = type;
else if (v == "followvel") followVel = type;
updateParticles();
}
processPattern(string var)
{
string v = llToUpper(var);
if (v == "EXPLODE")
pattern = PSYS_SRC_PATTERN_EXPLODE;
else if (v == "DROP")
pattern = PSYS_SRC_PATTERN_DROP;
else if (v == "ANGLE_CONE_EMPTY")
pattern = PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY;
else if (v == "ANGLE_CONE")
pattern = PSYS_SRC_PATTERN_ANGLE_CONE;
else if (v == "ANGLE")
pattern = PSYS_SRC_PATTERN_ANGLE;
else return;
updateParticles();
}
showSetFlags()
{
list f = [];
if (glow) f += ["GLOW"];
if (bounce) f += ["BOUNCE"];
if (interpColor) f += ["INTERP_COLOR"];
if (interpSize) f += ["INTERP_SIZE"];
if (wind) f += ["WIND"];
if (followSource) f += ["FOLLOW_SOURCE"];
if (followVel) f += ["FOLLOW_VEL"];
llWhisper(0, "Set: " + llList2CSV(f));
}
showPattern()
{
if (pattern == PSYS_SRC_PATTERN_EXPLODE)
llWhisper(0, "Pattern: EXPLODE");
else if (pattern == PSYS_SRC_PATTERN_DROP)
llWhisper(0, "Pattern: DROP");
else if (pattern == PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY)
llWhisper(0, "Pattern: ANGLE_CONE_EMPTY");
else if (pattern == PSYS_SRC_PATTERN_ANGLE_CONE)
llWhisper(0, "Pattern: ANGLE_CONE");
else if (pattern == PSYS_SRC_PATTERN_ANGLE)
llWhisper(0, "Pattern: ANGLE");
}
vector string2vector(string s)
{
list foo = llCSV2List(s);
vector v;
v.x = llList2Float(foo,0);
v.y = llList2Float(foo,1);
v.z = llList2Float(foo,2);
return v;
}
float fixColor(integer c)
{
if (c > 255) return 255;
if (c <= 0) return 0;
return (float)c/255;
}
vector colorVector(string s)
{
list foo = llCSV2List(s);
vector v;
v.x = fixColor(llList2Integer(foo,0));
v.y = fixColor(llList2Integer(foo,1));
v.z = fixColor(llList2Integer(foo,2));
//llWhisper(0, "Debug: v: " + (string)v);
return v;
}
dumpParams()
{
llWhisper(0, "PART_MAX_AGE:" + (string)age);
llWhisper(0, "PART_FLAGS:" + (string)flags);
llWhisper(0, "PART_START_COLOR:" + (string)startColor);
llWhisper(0, "PART_END_COLOR:" + (string)endColor);
llWhisper(0, "PART_START_SCALE:" + (string)startSize);
llWhisper(0, "PART_END_SCALE:" + (string)endSize);
llWhisper(0, "SRC_PATTERN:" + (string)pattern);
llWhisper(0, "SRC_BURST_RATE:" + (string)rate);
llWhisper(0, "SRC_ACCEL:" + (string)push);
llWhisper(0, "SRC_BURST_PART_COUNT:" + (string)count);
llWhisper(0, "SRC_BURST_RADIUS:" + (string)radius);
llWhisper(0, "SRC_BURST_SPEED_MIN:" + (string)minSpeed);
llWhisper(0, "SRC_BURST_SPEED_MAX:" + (string)maxSpeed);
llWhisper(0, "SRC_TARGET_KEY:" + (string)target);
llWhisper(0, "SRC_INNERANGLE:" + (string)innerAngle);
llWhisper(0, "SRC_OUTERANGLE:" + (string)outerAngle);
llWhisper(0, "SRC_OMEGA:" + (string)omega);
llWhisper(0, "SRC_MAX_AGE:" + (string)life);
llWhisper(0, "SRC_TEXTURE:" + (string)texture);
llWhisper(0, "PART_START_ALPHA:" + (string)startAlpha);
llWhisper(0, "PART_END_ALPHA:" + (string)endAlpha);
}
default
{
state_entry()
{
if (lHandle == -1) lHandle = llListen(0, "", llGetOwner(), "");
else {
llListenRemove(lHandle);
lHandle = llListen(0, "", llGetOwner(), "");
}
updateParticles();
}
touch(integer num_deteced)
{
if (run == 1) {
run *= -1;
llParticleSystem([]);
} else {
run *= -1;
updateParticles();
}
}
listen(integer channel, string name, key id, string msg)
{
list argv = llParseString2List(msg, [" "], []);
integer argc = llGetListLength(argv);
string cmd = llToLower(llList2String(argv, 0));
if (cmd == "set")
{
if (argc == 1) showSetFlags();
else processFlag(llList2String(argv, 1));
}
else if (cmd == "pattern")
{
if (argc == 1) showPattern();
else processPattern(llList2String(argv, 1));
}
else if (cmd == "target")
{
target = llList2String(argv, 1);
if (target == "none") target = "";
updateParticles();
}
else if (cmd == "age")
{
age = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "maxspeed")
{
maxSpeed = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "minspeed")
{
minSpeed = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "startalpha")
{
startAlpha = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "endalpha")
{
endAlpha = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "startcolor")
{
startColor = colorVector(llList2String(argv, 1));
updateParticles();
}
else if (cmd == "endcolor")
{
endColor = colorVector(llList2String(argv, 1));
updateParticles();
}
else if (cmd == "startsize")
{
startSize = string2vector(llList2String(argv, 1));
updateParticles();
}
else if (cmd == "endsize")
{
endSize = string2vector(llList2String(argv, 1));
updateParticles();
}
else if (cmd == "push")
{
push = string2vector(llList2String(argv, 1));
updateParticles();
}
else if (cmd == "omega")
{
omega = string2vector(llList2String(argv, 1));
updateParticles();
}
else if (cmd == "rate")
{
rate = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "radius")
{
radius = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "count")
{
count = llList2Integer(argv, 1);
updateParticles();
}
else if (cmd == "outerangle")
{
outerAngle = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "innerangle")
{
innerAngle = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "life")
{
life = llList2Float(argv, 1);
updateParticles();
}
else if (cmd == "on")
{
updateParticles();
}
else if (cmd == "off")
{
llParticleSystem([]);
}
else if (cmd == "dump")
{
dumpParams();
}
}
}