The basics of the script is to hover an object over top of an individual speaker/object that speaks, and emit partials down.
Features include the ability of the owner to turn on/off the practicals, and the ability to destroy the object if it gets lost.
It is in compliance with TOS, but to be on the safe side, the self destruct script can be activated by anyone.
Commands:
"start p" = turn on partials (Owner only)
"end p" = turn off partials (Owner only)
"dr4" = destroy the object (Any One)
Some other features: The object blinks from white to orange, displays the name of the last speaker over the object, the partials change color every time something new is said, and it hovers over the object talking, while the partials point to the owner (sorry, but it can't pickup on talking attachments)
par()
{
llParticleSystem([
//**Particle settings *****************************************************
PSYS_PART_START_COLOR, <1.0,1.0,1.0>, PSYS_PART_END_COLOR, <aa,bb,cc>,
PSYS_PART_START_ALPHA, vv, PSYS_PART_END_ALPHA, vv,
PSYS_PART_START_SCALE,<0.1,0.1,0.1>,PSYS_PART_END_SCALE, <0.1,0.1,0.1>,
PSYS_PART_MAX_AGE, 2.0,//age in seconds. 0.1 to 60.0 seconds
//*** System settings *******************************************************
PSYS_SRC_PATTERN, 1,//1=DROP, 2=EXPLODE, 4=ANGLE, 8=ANGLE_CONE
PSYS_SRC_MAX_AGE, 0.0,//seconds it will operate, 0.1 to 60, Zero=infinite
PSYS_SRC_BURST_RATE, 0.0, //sec between bursts 0.0 = full speed to 60 sec
PSYS_SRC_BURST_PART_COUNT, 40, //1 to 4096 number of particles
PSYS_SRC_BURST_RADIUS, 0.1, //dist from, where particles will be created.
PSYS_SRC_ACCEL, <0.0,0.0,-1.0>,//acceleration applied,meters per sec.
PSYS_SRC_OMEGA, <0.0,0.0,0.0>,//rotation spin radians per sec along each axis
//PSYS_SRC_BURST_SPEED_MIN, 1.0, PSYS_SRC_BURST_SPEED_MAX, 2.0,
PSYS_SRC_INNERANGLE, 1.55, PSYS_SRC_OUTERANGLE, 1.54,//angle
PSYS_SRC_ANGLE_BEGIN, 1.0, PSYS_SRC_ANGLE_END, 0.0,
PSYS_SRC_TARGET_KEY, xx,
//PSYS_SRC_TEXTURE, llGetInventoryName(INVENTORY_TEXTURE, 0),
//*** System Behavior **************************************
PSYS_PART_FLAGS, ( 0
| PSYS_PART_INTERP_COLOR_MASK //particle color and alpha transition
| PSYS_PART_INTERP_SCALE_MASK //size/scale transitions
| PSYS_PART_EMISSIVE_MASK //particles are full-bright
| PSYS_PART_FOLLOW_VELOCITY_MASK //rotate to orient their "top" towards the dir
//| PSYS_PART_WIND_MASK //Hmmm yes the wind
// | PSYS_PART_BOUNCE_MASK //bounce off a Z plane
//| PSYS_PART_FOLLOW_SRC_MASK //move relative to the position of the emitter
| PSYS_PART_TARGET_POS_MASK //target specified by the PSYS_SRC_TARGET_KEY
//| PSYS_PART_TARGET_LINEAR_MASK//not doc, emitted particles move in a straight line towards the target spec by the PSYS_SRC_TARGET_KEY
)
] );
}
key xx;
float aa;
float bb;
float cc;
float vv;
integer sw;
string name1;
default
{
state_entry()
{
llListen(0, "", NULL_KEY, ""
;aa = 1.0;
bb = 1.0;
cc = 1.0;
vv = 1.0;
sw = 1;
name1 = "";
llSetTimerEvent(.5);
}
listen(integer chan, string name, key id, string mess) {
name1 = name;
if (mess == "dr4"

{
llInstantMessage(llGetOwner(), "I died at " + llGetRegionName() + " " + (string) llGetPos());
llDie();
}
if (id == llGetOwner() )
{
if (mess == "end p"

{
vv = 0.0;
par();
}
if (mess == "start p"

{
vv = 0.5;
par();
}
}
llSensor(name, id, AGENT, 25, PI);
xx = llGetOwnerKey(id);
aa = llFrand(1);
bb = llFrand(1);
cc = llFrand(1);
par();
}
sensor(integer numDetected) {
while (llGetPos() != llDetectedPos(0) + <0,0,2>
llSetPos(llDetectedPos(0) + <0,0,2>
;}
timer()
{
if (sw == 1)
{
sw = 2;
llSetColor(<1,.5,0>,ALL_SIDES);
llSetText(name1 ,<1,.5,0>,1);
}
else if (sw == 2)
{
sw = 1;
llSetColor(<1,1,1>,ALL_SIDES);
llSetText("" ,<1,.5,0>,1);
}
}
}
