<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://opensimulator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://opensimulator.org/index.php?action=history&amp;feed=atom&amp;title=User%3AAllen_Kerensky%2FMyriad_Lite%2FMyriad_Lite_Module_WELL-v0.0.3-20120826.lsl</id>
		<title>User:Allen Kerensky/Myriad Lite/Myriad Lite Module WELL-v0.0.3-20120826.lsl - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/index.php?action=history&amp;feed=atom&amp;title=User%3AAllen_Kerensky%2FMyriad_Lite%2FMyriad_Lite_Module_WELL-v0.0.3-20120826.lsl"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_WELL-v0.0.3-20120826.lsl&amp;action=history"/>
		<updated>2026-06-13T18:36:27Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_WELL-v0.0.3-20120826.lsl&amp;diff=30524&amp;oldid=prev</id>
		<title>Allen Kerensky: Myriad_Lite_Module_WELL-v0.0.3-20120826.lsl</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_WELL-v0.0.3-20120826.lsl&amp;diff=30524&amp;oldid=prev"/>
				<updated>2012-08-26T22:31:28Z</updated>
		
		<summary type="html">&lt;p&gt;Myriad_Lite_Module_WELL-v0.0.3-20120826.lsl&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Myriad_Lite_Module_WELL-v0.0.3-20120826.lsl =&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Myriad_Lite_Module_WELL-v0.0.3-20120826.lsl&lt;br /&gt;
// Copyright (c) 2012 by Allen Kerensky (OSG/SL) All Rights Reserved.&lt;br /&gt;
// This work is dual-licensed under&lt;br /&gt;
// Creative Commons Attribution (CC BY) 3.0 Unported&lt;br /&gt;
// http://creativecommons.org/licenses/by/3.0/&lt;br /&gt;
// - or -&lt;br /&gt;
// Modified BSD License (3-clause)&lt;br /&gt;
// Redistribution and use in source and binary forms, with or without&lt;br /&gt;
// modification, are permitted provided that the following conditions are met:&lt;br /&gt;
// * Redistributions of source code must retain the above copyright notice, &lt;br /&gt;
//   this list of conditions and the following disclaimer.&lt;br /&gt;
// * Redistributions in binary form must reproduce the above copyright notice,&lt;br /&gt;
//   this list of conditions and the following disclaimer in the documentation&lt;br /&gt;
//   and/or other materials provided with the distribution.&lt;br /&gt;
// * Neither the name of Myriad Lite nor the names of its contributors may be&lt;br /&gt;
//   used to endorse or promote products derived from this software without&lt;br /&gt;
//   specific prior written permission.&lt;br /&gt;
//&lt;br /&gt;
// THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR&lt;br /&gt;
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES&lt;br /&gt;
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN&lt;br /&gt;
// NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,&lt;br /&gt;
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT&lt;br /&gt;
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;br /&gt;
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY&lt;br /&gt;
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT&lt;br /&gt;
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF&lt;br /&gt;
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
//&lt;br /&gt;
// The Myriad RPG System was designed, written, and illustrated by Ashok Desai&lt;br /&gt;
// Myriad RPG System licensed under:&lt;br /&gt;
// Creative Commons Attribution (CC BY) 2.0 UK: England and Wales&lt;br /&gt;
// http://creativecommons.org/licenses/by/2.0/uk/&lt;br /&gt;
&lt;br /&gt;
// CONSTANTS - DO NOT CHANGE DURING RUN&lt;br /&gt;
string VERSION = &amp;quot;0.0.3&amp;quot;; // Allen Kerensky's script version&lt;br /&gt;
string VERDATE = &amp;quot;20120826&amp;quot;; // Allen Kerensky's script yyyymmdd&lt;br /&gt;
string DIV = &amp;quot;|&amp;quot;; // Myriad message divider&lt;br /&gt;
// Module to Module Messaging Constants&lt;br /&gt;
// integer MODULE_HUD = -1;&lt;br /&gt;
// integer MODULE_CHARSHEET = -2;&lt;br /&gt;
// integer MODULE_ARMOR = -3;&lt;br /&gt;
// integer MODULE_BAM = -4;&lt;br /&gt;
// integer MODULE_RUMORS = -5;&lt;br /&gt;
// integer MODULE_CLOSE = -6;&lt;br /&gt;
// integer MODULE_RANGED = -7;&lt;br /&gt;
// integer MODULE_RESILIENCE = -8;&lt;br /&gt;
// integer MODULE_PROGRESS = -9;&lt;br /&gt;
integer MODULE_WELL = -10;&lt;br /&gt;
// integer MODULE_METER = -11;&lt;br /&gt;
integer LM_SENDTOATTACHMENT = 0x80000000;&lt;br /&gt;
&lt;br /&gt;
integer FLAG_DEBUG; // TRUE = output debug messages, FALSE = hide them, set in STATE_ENTRY for lslint&lt;br /&gt;
&lt;br /&gt;
// Particle system presets&lt;br /&gt;
// name, length of list for name, list of rules data ready to pass to llParticleSystem&lt;br /&gt;
list PRESETS = [&lt;br /&gt;
    &amp;quot;Ruth2&amp;quot;, 39,&lt;br /&gt;
        PSYS_PART_FLAGS, 0, // color interp true, glow true, size interp true, followsrc true, followtarget true&lt;br /&gt;
        PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE_CONE,&lt;br /&gt;
        PSYS_SRC_INNERANGLE, PI,&lt;br /&gt;
        PSYS_SRC_OUTERANGLE, 0.0,&lt;br /&gt;
        PSYS_PART_START_SCALE, &amp;lt;.8,1,1&amp;gt;,&lt;br /&gt;
        PSYS_PART_END_SCALE, &amp;lt;0.02, 0.02, 0.02&amp;gt;,&lt;br /&gt;
        PSYS_PART_START_ALPHA, 1.0,&lt;br /&gt;
        PSYS_PART_END_ALPHA, 0.0,&lt;br /&gt;
        PSYS_PART_START_COLOR, &amp;lt;1,1,1&amp;gt;,&lt;br /&gt;
        PSYS_PART_END_COLOR, &amp;lt;1,1,1&amp;gt;,&lt;br /&gt;
        PSYS_PART_MAX_AGE, 3.0,&lt;br /&gt;
        PSYS_SRC_MAX_AGE, 0.0,&lt;br /&gt;
        PSYS_SRC_BURST_RATE, 0.020,&lt;br /&gt;
        PSYS_SRC_BURST_PART_COUNT, 1,&lt;br /&gt;
        PSYS_SRC_BURST_RADIUS, 1.0,&lt;br /&gt;
        PSYS_SRC_BURST_SPEED_MAX, 1,&lt;br /&gt;
        PSYS_SRC_BURST_SPEED_MIN, .1,&lt;br /&gt;
        PSYS_SRC_TEXTURE, &amp;quot;e50ed3cf-6fab-4afe-ac37-187a7d7ab0b8&amp;quot;, // ruth cloud particle&lt;br /&gt;
        PSYS_SRC_OMEGA, &amp;lt;0,0,0&amp;gt;,&lt;br /&gt;
        PSYS_SRC_ACCEL, &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// DEBUG&lt;br /&gt;
//============================================================================&lt;br /&gt;
DEBUG(string debugmsg) {&lt;br /&gt;
    if ( FLAG_DEBUG == TRUE ) llSay(DEBUG_CHANNEL,&amp;quot;(&amp;quot;+llKey2Name(llGetOwner())+&amp;quot;) MOD WELL: &amp;quot;+debugmsg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ERROR&lt;br /&gt;
//============================================================================&lt;br /&gt;
ERROR(string errmsg) {&lt;br /&gt;
    llSay(DEBUG_CHANNEL,&amp;quot;(&amp;quot;+llKey2Name(llGetOwner())+&amp;quot;) MOD WELL ERROR: &amp;quot;+errmsg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// GETVERSION&lt;br /&gt;
//============================================================================&lt;br /&gt;
GETVERSION() {&lt;br /&gt;
    SENDTOHUD(&amp;quot;VERSION=&amp;quot;+VERSION+DIV+&amp;quot;VERSIONDATE=&amp;quot;+VERDATE+DIV+llGetObjectName());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// RESET&lt;br /&gt;
//============================================================================&lt;br /&gt;
RESET() {&lt;br /&gt;
    // do any final work here&lt;br /&gt;
    // then reset&lt;br /&gt;
    llResetScript();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// SENDTOHUD - send reponses to HUD as Link Messages&lt;br /&gt;
//============================================================================&lt;br /&gt;
SENDTOHUD(string str) {&lt;br /&gt;
    DEBUG(&amp;quot;SENDTOHUD(&amp;quot;+str+&amp;quot;)&amp;quot;);&lt;br /&gt;
    llMessageLinked(LINK_THIS,LM_SENDTOATTACHMENT,str,llGetOwner());    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// SETUP&lt;br /&gt;
//============================================================================&lt;br /&gt;
SETUP() {&lt;br /&gt;
    FLAG_DEBUG=FALSE;&lt;br /&gt;
    llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// DEFAULT STATE&lt;br /&gt;
//============================================================================&lt;br /&gt;
default {&lt;br /&gt;
&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // CHANGED EVENT&lt;br /&gt;
    //------------------------------------------------------------------------    &lt;br /&gt;
    changed(integer change) {&lt;br /&gt;
        if ( change &amp;amp; CHANGED_REGION || change &amp;amp; CHANGED_TELEPORT ) {&lt;br /&gt;
            DEBUG(&amp;quot;Region Change or Teleport detected. Re-requesting permissions again.&amp;quot;);&lt;br /&gt;
            SETUP();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // LINK_MESSAGE EVENT&lt;br /&gt;
    //------------------------------------------------------------------------    &lt;br /&gt;
    link_message(integer sender_num,integer num,string str,key id) {&lt;br /&gt;
        if ( num == MODULE_WELL || num == LM_SENDTOATTACHMENT ) return; // ignore our own link messages&lt;br /&gt;
        DEBUG(&amp;quot;link_message(&amp;quot;+(string)sender_num+&amp;quot;,&amp;quot;+(string)num+&amp;quot;,&amp;quot;+str+&amp;quot;,&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        // Break down incoming command&lt;br /&gt;
        list tokens = llParseString2List(str,[DIV],[]);&lt;br /&gt;
        integer fields = llGetListLength(tokens);&lt;br /&gt;
        string cmd = llToLower(llStringTrim(llList2String(tokens,0),STRING_TRIM));&lt;br /&gt;
        // DEBUGOFF&lt;br /&gt;
        if ( cmd == &amp;quot;debugoff&amp;quot; ) {&lt;br /&gt;
            DEBUG(&amp;quot;Turning off DEBUG messages.&amp;quot;);&lt;br /&gt;
            FLAG_DEBUG = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // DEBUGON&lt;br /&gt;
        if ( cmd == &amp;quot;debugon&amp;quot; ) { &lt;br /&gt;
            FLAG_DEBUG = TRUE;&lt;br /&gt;
            DEBUG(&amp;quot;Turning on DEBUG messages.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // DEBUG|debugmessage...&lt;br /&gt;
        if ( cmd == &amp;quot;debug&amp;quot; ) {&lt;br /&gt;
            DEBUG(llList2String(tokens,1));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // ERROR|errormessage...&lt;br /&gt;
        if ( cmd == &amp;quot;error&amp;quot; ) {&lt;br /&gt;
            ERROR(llList2String(tokens,1));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // RESET&lt;br /&gt;
        if ( cmd == &amp;quot;reset&amp;quot; ) {&lt;br /&gt;
            RESET();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // VERSION&lt;br /&gt;
        if ( cmd == &amp;quot;version&amp;quot; ) {&lt;br /&gt;
            GETVERSION();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // OWNERSAY|errormessage...&lt;br /&gt;
        if ( cmd == &amp;quot;ownersay&amp;quot; ) {&lt;br /&gt;
            llOwnerSay(llList2String(tokens,1));&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // WHISPER|CHANNEL=###|MESSAGE=...&lt;br /&gt;
        if ( cmd == &amp;quot;whisper&amp;quot; ) {&lt;br /&gt;
            integer channel = DEBUG_CHANNEL;&lt;br /&gt;
            string message = &amp;quot;&amp;quot;;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;channel&amp;quot; ) channel = llList2Integer(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;message&amp;quot; ) message = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( channel != DEBUG_CHANNEL &amp;amp;&amp;amp; message != &amp;quot;&amp;quot; ) {&lt;br /&gt;
                llWhisper(channel,message);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid WHISPER Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // SAY|CHANNEL=###|MESSAGE=...&lt;br /&gt;
        if ( cmd == &amp;quot;say&amp;quot; ) {&lt;br /&gt;
            integer channel = DEBUG_CHANNEL;&lt;br /&gt;
            string message = &amp;quot;&amp;quot;;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;channel&amp;quot; ) channel = llList2Integer(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;message&amp;quot; ) message = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( channel != DEBUG_CHANNEL &amp;amp;&amp;amp; message != &amp;quot;&amp;quot; ) {&lt;br /&gt;
                llSay(channel,message);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid SAY Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }        &lt;br /&gt;
        // SHOUT|CHANNEL=###|MESSAGE=...&lt;br /&gt;
        if ( cmd == &amp;quot;shout&amp;quot; ) {&lt;br /&gt;
            integer channel = DEBUG_CHANNEL;&lt;br /&gt;
            string message = &amp;quot;&amp;quot;;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;channel&amp;quot; ) channel = llList2Integer(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;message&amp;quot; ) message = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( channel != DEBUG_CHANNEL &amp;amp;&amp;amp; message != &amp;quot;&amp;quot; ) {&lt;br /&gt;
                llShout(channel,message);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid SHOUT Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // REGIONSAY|CHANNEL=###|MESSAGE=...&lt;br /&gt;
        if ( cmd == &amp;quot;regionsay&amp;quot; ) {&lt;br /&gt;
            integer channel = DEBUG_CHANNEL;&lt;br /&gt;
            string message = &amp;quot;&amp;quot;;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;channel&amp;quot; ) channel = llList2Integer(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;message&amp;quot; ) message = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( channel != DEBUG_CHANNEL &amp;amp;&amp;amp; message != &amp;quot;&amp;quot; ) {&lt;br /&gt;
                llRegionSay(channel,message);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid REGIONSAY Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // INSTANTMESSAGE|USER=uuid|MESSAGE=...&lt;br /&gt;
        if ( cmd == &amp;quot;instantmessage&amp;quot; ) {&lt;br /&gt;
            key user = NULL_KEY;&lt;br /&gt;
            string message = &amp;quot;&amp;quot;;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;user&amp;quot; ) user = llList2Key(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;message&amp;quot; ) message = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( user != NULL_KEY &amp;amp;&amp;amp; message != &amp;quot;&amp;quot; ) {&lt;br /&gt;
                llInstantMessage(user,message);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid INSTANTMESSAGE Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // STARTANIMATION|ANIMATION=uuid or name...&lt;br /&gt;
        if ( cmd == &amp;quot;startanimation&amp;quot; &amp;amp;&amp;amp; fields == 2 ) {&lt;br /&gt;
            string animation = &amp;quot;&amp;quot;;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;animation&amp;quot; ) animation = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( animation != &amp;quot;&amp;quot; ) {&lt;br /&gt;
                llStartAnimation(animation); // FIXME Permissions? Track list of running?&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid STARTANIMATION Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // STOPANIMATION|ANIMATION=uuid or name in inventory or all&lt;br /&gt;
        if ( cmd == &amp;quot;stopanimation&amp;quot; &amp;amp;&amp;amp; fields == 2 ) {&lt;br /&gt;
            string animation = &amp;quot;&amp;quot;;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;animation&amp;quot; ) animation = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( llToLower(animation) == &amp;quot;all&amp;quot; ) {&lt;br /&gt;
                list animsrunning = llGetAnimationList(llGetOwner());&lt;br /&gt;
                integer count = llGetListLength(animsrunning);&lt;br /&gt;
                while ( count--) {&lt;br /&gt;
                    llStopAnimation(llList2String(animsrunning,count));&lt;br /&gt;
                }&lt;br /&gt;
                return;&lt;br /&gt;
            } else if ( animation != &amp;quot;&amp;quot; ) {&lt;br /&gt;
                llStopAnimation(animation); // FIXME Permissions? Track list of running?&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid STOPANIMATION Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // PLAYSOUND|SOUND=...|VOLUME=#.# - attached - does not play inworld from HUD&lt;br /&gt;
        if ( cmd == &amp;quot;playsound&amp;quot; &amp;amp;&amp;amp; fields == 3 ) {&lt;br /&gt;
            string sound = &amp;quot;&amp;quot;;&lt;br /&gt;
            float volume = 0.0;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;sound&amp;quot; ) sound = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;volume&amp;quot; ) volume = llList2Float(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( sound != &amp;quot;&amp;quot; &amp;amp;&amp;amp; volume != 0.0 ) {&lt;br /&gt;
                llPlaySound(sound,volume);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid PLAYSOUND Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // TRIGGERSOUND|SOUND=...|VOLUME=#.# - unattached, can play inworld from HUD&lt;br /&gt;
        if ( cmd == &amp;quot;triggersound&amp;quot; &amp;amp;&amp;amp; fields == 3 ) {&lt;br /&gt;
            string sound = &amp;quot;&amp;quot;;&lt;br /&gt;
            float volume = 0.0;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;sound&amp;quot; ) sound = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;volume&amp;quot; ) volume = llList2Float(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( sound != &amp;quot;&amp;quot; &amp;amp;&amp;amp; volume != 0.0 ) {&lt;br /&gt;
                llTriggerSound(sound,volume);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid TRIGGERSOUND Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // LOOPSOUND|SOUND=...|VOLUME=#.# - does not play inworld from HUD&lt;br /&gt;
        if ( cmd == &amp;quot;loopsound&amp;quot; &amp;amp;&amp;amp; fields == 3 ) {&lt;br /&gt;
            string sound = &amp;quot;&amp;quot;;&lt;br /&gt;
            float volume = 0.0;&lt;br /&gt;
            while ( fields-- ) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;sound&amp;quot; ) sound = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
                if ( attrib == &amp;quot;volume&amp;quot; ) volume = llList2Float(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( sound != &amp;quot;&amp;quot; &amp;amp;&amp;amp; volume != 0.0 ) {&lt;br /&gt;
                llLoopSound(sound,volume);&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid LOOPSOUND Command Received&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // STOPSOUND&lt;br /&gt;
        if ( cmd == &amp;quot;stopsound&amp;quot; ) {&lt;br /&gt;
            llStopSound();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // PARTICLEPRESET|NAME=presetname...&lt;br /&gt;
        if ( cmd == &amp;quot;particlepreset&amp;quot; &amp;amp;&amp;amp; fields == 2 ) {&lt;br /&gt;
            string name = &amp;quot;&amp;quot;;&lt;br /&gt;
            while (fields--) {&lt;br /&gt;
                string attrib = llToLower(llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),0));&lt;br /&gt;
                if ( attrib == &amp;quot;name&amp;quot; ) name = llList2String(llParseString2List(llList2String(tokens,fields),[&amp;quot;=&amp;quot;],[]),1);&lt;br /&gt;
            }&lt;br /&gt;
            if ( name != &amp;quot;&amp;quot; ) { // found preset&lt;br /&gt;
                integer start = llListFindList(PRESETS,[name]) + 2;&lt;br /&gt;
                integer end = start + llList2Integer(PRESETS,start - 1);&lt;br /&gt;
                llParticleSystem(llList2List(PRESETS,start,end));&lt;br /&gt;
            } else {&lt;br /&gt;
                ERROR(&amp;quot;Invalid PARTICLEPRESET Command Received.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        // PARTICLES|whoanelly&lt;br /&gt;
        // PARTICLESOFF&lt;br /&gt;
        if ( cmd == &amp;quot;particlesoff&amp;quot; ) {&lt;br /&gt;
            llParticleSystem([]);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // RUN_TIME_PERMISSIONS EVENT&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    run_time_permissions(integer perm) {&lt;br /&gt;
        if ( perm &amp;amp; PERMISSION_TRIGGER_ANIMATION) {&lt;br /&gt;
            DEBUG(&amp;quot;PERMISSION_TRIGGER_ANIMATION granted.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
    &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // STATE_ENTRY EVENT&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        SETUP();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	</feed>