Combined LockMeister Cuff script
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
An update for LockMeister Cuffs
This script implements a combination of extensions to the LockMeister system protocol LSL_Protocol/LockMeister_System using them together to bring added benefits.
<lsl>/////////////////////////////////////////////////////////////////////// // // Comprehensive Lockmeister Cuff Script // // Tianna Violet // 20 Jan 2010 // // This is a Lockmeister cuff script that combines many of the extensions // to the lockmeister protocol at defined here: // http://wiki.secondlife.com/wiki/LSL_Protocol/LockMeister_System // To the basic query response is added Amethyst Rosencrans' Sensations // extensions for allowing particle links between cuffs and // Henri Beauchamp's "here" and "gone" extensions which notify when a cuff // is attached and detached. Combining these allows a few extra features: // * Cuffs can delete or reassign particle chains if their target object // disappears. // * Cuffs can attach if the target point appears. // * Cuffs can reattach when an AV logs in. // // In addition is added a new command, "reset" defined as stopping the // particle chain and resetting the Age, Gravity, and Texture back to // their defaults. // // Although this script is new, reference was made to Amethyst Rosencrans' // "Free Amethyst cuff script v2" (which is a little out of date) and // from spying on the Lockmeister messages coming from the Amethyst cuffs // set. /////////////////////////////////////////////////////////////////////// // The lockmeister name of the cuff. See the above link for details string LOCKMEISTER_NAME = "lcuff"; /////////////////////////////////////////////////////////////////////// string gCuffMessage; string gRequestedTargets; string gWorkingTargets; key gCurrentTarget; float gAge; float gGravity; string gTexture;
// Start or update the particle stream updateParticles() {
llParticleSystem( [PSYS_PART_START_SCALE, <0.1, 0.1, 0>, PSYS_PART_END_SCALE, <1, 1, 0>, PSYS_PART_START_COLOR, <1, 1, 1>, PSYS_PART_END_COLOR, <1, 1, 1>, PSYS_PART_START_ALPHA, 1.0, PSYS_PART_END_ALPHA, 1.0, PSYS_SRC_TEXTURE, gTexture, PSYS_SRC_BURST_PART_COUNT, 1, PSYS_SRC_BURST_RATE, 0.0, PSYS_PART_MAX_AGE, gAge, PSYS_SRC_MAX_AGE, 0.0, PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_DROP, PSYS_SRC_BURST_RADIUS, 0.5, PSYS_SRC_INNERANGLE, 0.0, PSYS_SRC_OUTERANGLE, 0.0, PSYS_SRC_OMEGA, <0, 0, 0>, PSYS_SRC_ACCEL, <0, 0, -gGravity>, PSYS_SRC_BURST_SPEED_MIN, 1000.0, PSYS_SRC_BURST_SPEED_MAX, 1000.0, PSYS_SRC_TARGET_KEY, gCurrentTarget, PSYS_PART_FLAGS, PSYS_PART_FOLLOW_VELOCITY_MASK | PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_TARGET_POS_MASK]);
}
// ping the cuffs that can be used as possible targets, if any pingCuffs() {
list cuffs;
integer a;
integer len;
gWorkingTargets = gRequestedTargets;
if (gWorkingTargets != "")
{
cuffs = llParseString2List(gWorkingTargets, ["-"], []);
len = llGetListLength(cuffs);
for (a = 0; a < len; a++)
{
llWhisper(-8888, (string) llGetOwner() + llList2String(cuffs, a));
}
}
}
default {
state_entry()
{
gCuffMessage = (string) llGetOwner() + LOCKMEISTER_NAME;
gRequestedTargets = "";
gWorkingTargets = "";
gCurrentTarget = NULL_KEY;
gAge = 2;
gGravity = 0.7;
gTexture = "1ffb37fa-2fc1-dbec-d8ea-0607583a03c6";
llListen(-8888, "", NULL_KEY, "");
}
on_rez(integer start_param)
{
llParticleSystem([]);
gCuffMessage = (string) llGetOwner() + LOCKMEISTER_NAME;
}
attach(key id)
{
string message;
message = " gone";
if (id)
{
gCuffMessage = (string) llGetOwner() + LOCKMEISTER_NAME;
message = " here";
pingCuffs();
}
llSay(-8888, gCuffMessage + message); // send the "here" and "gone" message
}
listen(integer channel, string name, key id, string message)
{
list commands = ["gravity", "age", "texture", "target", "reset"];
list responses = ["ok", "here", "gone"];
list data;
list cuffs;
integer index;
integer i;
integer atThis;
float tempf;
string temps;
if (channel == -8888)
{
if (message == gCuffMessage) // quick early out for the basic response
{
llSay(-8888, gCuffMessage + " ok");
return;
}
if (((key) llGetSubString(message, 0, 35)) == llGetOwner())
{
data = llParseStringKeepNulls(llGetSubString(message, 36, -1), ["|"], []);
index = llListFindList(commands, llList2List(data, 0, 0));
if (~index)
{
if (index < 3) // the 3 particle params that can change
{
if (index < 2)
{
tempf = (float) llList2String(data, 1);
if (tempf)
{
if (index) // "age"
{
gAge = tempf;
} else { // "gravity"
gGravity = tempf;
}
}
} else { // "texture"
temps = llList2String(data, 1);
if (((key) temps) != NULL_KEY)
{
gTexture = temps;
}
}
if (gCurrentTarget)
{
updateParticles();
}
}
if (index == 3) // "target"
{
temps = "";
atThis = TRUE;
if (llGetListLength(data) > 1)
{
i = llListFindList(llList2ListStrided(llList2List(data, 1, -1), 0, -1, 2), [LOCKMEISTER_NAME]);
if (~i)
{
temps = llList2String(data, (i + 1) << 1);
} else {
atThis = FALSE;
}
}
if (atThis)
{
gCurrentTarget = NULL_KEY;
gRequestedTargets = temps;
pingCuffs();
llParticleSystem([]);
}
}
if (index == 4) // "reset"
{
llParticleSystem([]);
llResetScript();
}
} else {
data = llParseString2List(llList2String(data, 0), [" "], []);
index = llListFindList(responses, llList2List(data, 1, 1));
if (~index) // "ok", "here" and "gone" messages from others
{
if (index < 2) // "ok" and "here" treated the same
{
if (gWorkingTargets != "")
{
cuffs = llParseString2List(gWorkingTargets, ["-"], []);
i = llListFindList(cuffs, llList2List(data, 0, 0));
if (~i)
{
gWorkingTargets = llDumpList2String(llList2List(cuffs, i + 1, -1), "-");
gCurrentTarget = id;
updateParticles();
}
}
} else { // "gone"
if (gCurrentTarget == id)
{
gCurrentTarget = NULL_KEY;
llParticleSystem([]);
pingCuffs();
}
}
}
}
}
}
}
} </lsl>