<?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_Armor-v0.0.3-20120826.lsl</id>
		<title>User:Allen Kerensky/Myriad Lite/Myriad Lite Module Armor-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_Armor-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_Armor-v0.0.3-20120826.lsl&amp;action=history"/>
		<updated>2026-06-13T18:37:40Z</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_Armor-v0.0.3-20120826.lsl&amp;diff=30505&amp;oldid=prev</id>
		<title>Allen Kerensky: patched a small bug in ARMORATTACH and ARMORDETACH to avoid index out of range in attachpoint list</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_Armor-v0.0.3-20120826.lsl&amp;diff=30505&amp;oldid=prev"/>
				<updated>2012-08-26T19:11:04Z</updated>
		
		<summary type="html">&lt;p&gt;patched a small bug in ARMORATTACH and ARMORDETACH to avoid index out of range in attachpoint list&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 19:11, 26 August 2012&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 96:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 96:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; DEBUG(&amp;quot;ARMORATTACH Amount=[&amp;quot;+(string)waamount+&amp;quot;] Power=[&amp;quot;+(string)wapower+&amp;quot;] AttachPoint=[&amp;quot;+(string)waattachpoint+&amp;quot;] Name=[&amp;quot;+waname+&amp;quot;]&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; DEBUG(&amp;quot;ARMORATTACH Amount=[&amp;quot;+(string)waamount+&amp;quot;] Power=[&amp;quot;+(string)wapower+&amp;quot;] AttachPoint=[&amp;quot;+(string)waattachpoint+&amp;quot;] Name=[&amp;quot;+waname+&amp;quot;]&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; if ( waattachpoint &amp;lt; MINATTACH || ( waattachpoint &amp;gt;= MINHUDATTACH &amp;amp;&amp;amp; waattachpoint &amp;lt;= MAXHUDATTACH ) || waattachpoint &amp;gt; MAXWEAR ) { // valid attach point?&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; if ( waattachpoint &amp;lt; MINATTACH || ( waattachpoint &amp;gt;= MINHUDATTACH &amp;amp;&amp;amp; waattachpoint &amp;lt;= MAXHUDATTACH ) || waattachpoint &amp;gt; MAXWEAR ) { // valid attach point?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ERROR(&amp;quot;Invalid armor attachment point &amp;quot;+&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;llList2String&lt;/del&gt;(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ATTACHPOINTS,waattachpoint&lt;/del&gt;));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ERROR(&amp;quot;Invalid armor attachment point&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;: &lt;/ins&gt;&amp;quot;+(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;string&lt;/ins&gt;)&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;waattachpoint&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 171:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 171:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; DEBUG(&amp;quot;DETACH Amount=[&amp;quot;+(string)raamount+&amp;quot;] Power=[&amp;quot;+(string)rapower+&amp;quot;] Attachpoint=[&amp;quot;+(string)raattachpoint+&amp;quot;] Name=[&amp;quot;+raname+&amp;quot;]&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; DEBUG(&amp;quot;DETACH Amount=[&amp;quot;+(string)raamount+&amp;quot;] Power=[&amp;quot;+(string)rapower+&amp;quot;] Attachpoint=[&amp;quot;+(string)raattachpoint+&amp;quot;] Name=[&amp;quot;+raname+&amp;quot;]&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; if ( raattachpoint &amp;lt; MINATTACH || ( raattachpoint &amp;gt;= MINHUDATTACH &amp;amp;&amp;amp; raattachpoint &amp;lt;= MAXHUDATTACH ) || raattachpoint &amp;gt; MAXWEAR ) { // valid attach point?&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; if ( raattachpoint &amp;lt; MINATTACH || ( raattachpoint &amp;gt;= MINHUDATTACH &amp;amp;&amp;amp; raattachpoint &amp;lt;= MAXHUDATTACH ) || raattachpoint &amp;gt; MAXWEAR ) { // valid attach point?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ERROR(&amp;quot;Invalid armor detachment point &amp;quot;+&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;llList2String&lt;/del&gt;(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;ATTACHPOINTS,raattachpoint&lt;/del&gt;));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; ERROR(&amp;quot;Invalid armor detachment point&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;: &lt;/ins&gt;&amp;quot;+(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;string&lt;/ins&gt;)&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;raattachpoint&lt;/ins&gt;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; return;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; }&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_Armor-v0.0.3-20120826.lsl&amp;diff=30498&amp;oldid=prev</id>
		<title>Allen Kerensky: Myriad_Lite_Module_Armor-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_Armor-v0.0.3-20120826.lsl&amp;diff=30498&amp;oldid=prev"/>
				<updated>2012-08-26T17:24:51Z</updated>
		
		<summary type="html">&lt;p&gt;Myriad_Lite_Module_Armor-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_Armor-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_Armor-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;
// ===========================================================================&lt;br /&gt;
// INTERNAL CONSTANTS - should not change during runtime&lt;br /&gt;
// ===========================================================================&lt;br /&gt;
string VERSION = &amp;quot;0.0.3&amp;quot;;&lt;br /&gt;
string VERDATE = &amp;quot;20120826&amp;quot;;&lt;br /&gt;
key PLAYERID; // cached player UUID&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;
string DIV = &amp;quot;|&amp;quot;; // message divider&lt;br /&gt;
// string names for each attach point - waste of memory?&lt;br /&gt;
list ATTACHPOINTS = [&amp;quot;INVALID&amp;quot;,&amp;quot;chest&amp;quot;,&amp;quot;head&amp;quot;,&amp;quot;left shoulder&amp;quot;,&amp;quot;right shoulder&amp;quot;,&amp;quot;left hand&amp;quot;,&amp;quot;right hand&amp;quot;,&amp;quot;left foot&amp;quot;,&amp;quot;right foot&amp;quot;,&amp;quot;back&amp;quot;,&amp;quot;pelvis&amp;quot;,&amp;quot;mouth&amp;quot;,&amp;quot;chin&amp;quot;,&amp;quot;left ear&amp;quot;,&amp;quot;right ear&amp;quot;,&amp;quot;left eye&amp;quot;,&amp;quot;right eye&amp;quot;,&amp;quot;nose&amp;quot;,&amp;quot;right upper arm&amp;quot;,&amp;quot;right lower arm&amp;quot;,&amp;quot;left upper arm&amp;quot;,&amp;quot;left lower arm&amp;quot;,&amp;quot;right hip&amp;quot;,&amp;quot;right upper leg&amp;quot;,&amp;quot;right lower leg&amp;quot;,&amp;quot;left hip&amp;quot;,&amp;quot;left upper leg&amp;quot;,&amp;quot;left lower leg&amp;quot;,&amp;quot;stomach&amp;quot;,&amp;quot;left pectoral&amp;quot;,&amp;quot;right pectoral&amp;quot;,&amp;quot;HUD Center 2&amp;quot;,&amp;quot;HUD Top Right&amp;quot;,&amp;quot;HUD Top&amp;quot;,&amp;quot;HUD Top Left&amp;quot;,&amp;quot;HUD Center&amp;quot;,&amp;quot;HUD Bottom Left&amp;quot;,&amp;quot;HUD Bottom&amp;quot;,&amp;quot;HUD Bottom Right&amp;quot;, &amp;quot;neck&amp;quot;, &amp;quot;root&amp;quot; ];&lt;br /&gt;
&lt;br /&gt;
// ===========================================================================&lt;br /&gt;
// MYRIAD LITE CONSTANTS - should not be changed&lt;br /&gt;
// ===========================================================================&lt;br /&gt;
integer MINATTACH = 1; // min valid attach point&lt;br /&gt;
integer MINHUDATTACH = 31; // lower HUD attach point number&lt;br /&gt;
integer MAXHUDATTACH = 38; // upper HUD attach point number&lt;br /&gt;
integer MAXWEAR = 40; // max valid in-world wearable attach point&lt;br /&gt;
integer MINARMOR = 1; // min armor defense value&lt;br /&gt;
integer MAXARMOR = 5; // max armor defense value&lt;br /&gt;
&lt;br /&gt;
// ===========================================================================&lt;br /&gt;
// CONFIGURATION VALUES - CONFIGURE VALUES IN SETUP() FUNCTION BELOW&lt;br /&gt;
// ===========================================================================&lt;br /&gt;
// FIXME - MAXEFFECTTIME this needs to be easily configurable and persistent&lt;br /&gt;
integer MAXEFFECTTIME; // maximum time to show armor hit/blocked effects&lt;br /&gt;
integer MAXBATTERY; // maximum power armor battery life - all armor powered equally&lt;br /&gt;
&lt;br /&gt;
// ===========================================================================&lt;br /&gt;
// GLOBAL RUNTIMES - expected to change at runtime&lt;br /&gt;
// ===========================================================================&lt;br /&gt;
integer FLAG_DEBUG; // configure in setup&lt;br /&gt;
list ARMOR; // list of armor amount (1-5) on each attachpoint from 0 (unused) to 30&lt;br /&gt;
list ARMORPOWER; // list of true/false flags for each attachpoint from 0 (unused) to 30 if power armor or not&lt;br /&gt;
integer CURARMOR; // highest armor value worn out of all armor worn, not a total&lt;br /&gt;
integer POWERARMOR;&lt;br /&gt;
integer BATTERY;&lt;br /&gt;
integer EFFECTTIME; // how much time is left to show armor effects&lt;br /&gt;
integer ARMOR_ON; // is armor &amp;quot;on&amp;quot; and protecting?&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORATTACH - Wearing a piece of armor&lt;br /&gt;
// ARMORATTACH|ARMORRATING|ARMORPOWERED?|ARMORATTACHPOINT|ARMORNAME&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORATTACH(integer waamount,integer wapower,integer waattachpoint,string waname) {&lt;br /&gt;
    DEBUG(&amp;quot;ARMORATTACH Amount=[&amp;quot;+(string)waamount+&amp;quot;] Power=[&amp;quot;+(string)wapower+&amp;quot;] AttachPoint=[&amp;quot;+(string)waattachpoint+&amp;quot;] Name=[&amp;quot;+waname+&amp;quot;]&amp;quot;);&lt;br /&gt;
    if ( waattachpoint &amp;lt; MINATTACH || ( waattachpoint &amp;gt;= MINHUDATTACH &amp;amp;&amp;amp; waattachpoint &amp;lt;= MAXHUDATTACH ) || waattachpoint &amp;gt; MAXWEAR ) { // valid attach point?&lt;br /&gt;
        ERROR(&amp;quot;Invalid armor attachment point &amp;quot;+llList2String(ATTACHPOINTS,waattachpoint));&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( waamount &amp;lt; MINARMOR || waamount &amp;gt; MAXARMOR ) { // is armor rating valid or legal?&lt;br /&gt;
        ERROR(&amp;quot;Invalid armor amount &amp;quot;+(string)waamount+&amp;quot; out of range &amp;quot;+(string)MINARMOR+&amp;quot;-&amp;quot;+(string)MAXARMOR);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( wapower != TRUE &amp;amp;&amp;amp; wapower != FALSE ) {&lt;br /&gt;
        ERROR(&amp;quot;Cannot determine if worn armor is power armor.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // FIXME move ARMOR and POWERARMOR into single list?&lt;br /&gt;
    ARMORPOWER = llListReplaceList(ARMORPOWER,[wapower],waattachpoint,waattachpoint); // insert armor value into armor list&lt;br /&gt;
    // FIXME move ARMOR to 3-element strided list? [attachpoint,value,name?]&lt;br /&gt;
    ARMOR = llListReplaceList(ARMOR,[waamount],waattachpoint,waattachpoint); // insert armor value into armor list&lt;br /&gt;
    llOwnerSay(&amp;quot;Armor &amp;quot;+waname+&amp;quot; (&amp;quot;+(string)waamount+&amp;quot;) attached to &amp;quot;+llList2String(ATTACHPOINTS,waattachpoint));&lt;br /&gt;
    ARMORCHECK(); // find new highest armor value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORBATTERY&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORBATTERY() {&lt;br /&gt;
    //llWhisper(CHANATTACH,&amp;quot;ARMORBATTERY&amp;quot;);&lt;br /&gt;
    if ( POWERARMOR != TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Cannot check battery level for non-powered armor.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;Armor battery level: &amp;quot;+(string)BATTERY+&amp;quot; of &amp;quot;+(string)MAXBATTERY+&amp;quot; total.&amp;quot;);&lt;br /&gt;
    SENDTOHUD(&amp;quot;ARMORBATTERY&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORCHECK - sets CURARMOR to highest armor value worn after attach or detach&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORCHECK() {&lt;br /&gt;
    CURARMOR = 0; // start with zero armor&lt;br /&gt;
    POWERARMOR = FALSE;&lt;br /&gt;
    integer racount = llGetListLength(ARMOR); // how long is armor list?&lt;br /&gt;
    while (racount--) { // look at each list item from last to first&lt;br /&gt;
        integer rapoints = llList2Integer(ARMOR,racount); // what is armor value at this point in list?&lt;br /&gt;
        integer pa = llList2Integer(ARMORPOWER,racount);&lt;br /&gt;
        if ( pa == FALSE ) { // not power armor in this slot, so do check regardless of power state&lt;br /&gt;
            if ( rapoints &amp;gt; CURARMOR ) { // is this armor value higher than current max?&lt;br /&gt;
                CURARMOR = rapoints; // yes, save new highest amount&lt;br /&gt;
            }&lt;br /&gt;
        } else { // this is power armor in this slot.&lt;br /&gt;
            POWERARMOR = TRUE;&lt;br /&gt;
            if ( ARMOR_ON == TRUE &amp;amp;&amp;amp; BATTERY &amp;gt; 0 &amp;amp;&amp;amp; rapoints &amp;gt; CURARMOR ) {&lt;br /&gt;
                CURARMOR = rapoints; // yes armor is on, has power, and current value is higher, save new highest amount&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ( POWERARMOR == TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Power Armor Rating is &amp;quot;+(string)CURARMOR);&lt;br /&gt;
    } else {&lt;br /&gt;
        llOwnerSay(&amp;quot;Non-Power Armor Rating is &amp;quot;+(string)CURARMOR);&lt;br /&gt;
    }&lt;br /&gt;
    SENDTOHUD(&amp;quot;ARMORCURRENT|&amp;quot;+(string)CURARMOR);&lt;br /&gt;
    // FIXME send new ARMORCURRENT with RATING, POWERED?, ATTACHPOINT, ARMORNAME, MAXBATTERY, CURRENTBATTERY?&lt;br /&gt;
    // FIXME tell world too?&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORDETACH - Removing a piece of armor&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORDETACH(integer raamount,integer rapower,integer raattachpoint,string raname) {&lt;br /&gt;
    DEBUG(&amp;quot;DETACH Amount=[&amp;quot;+(string)raamount+&amp;quot;] Power=[&amp;quot;+(string)rapower+&amp;quot;] Attachpoint=[&amp;quot;+(string)raattachpoint+&amp;quot;] Name=[&amp;quot;+raname+&amp;quot;]&amp;quot;);&lt;br /&gt;
    if ( raattachpoint &amp;lt; MINATTACH || ( raattachpoint &amp;gt;= MINHUDATTACH &amp;amp;&amp;amp; raattachpoint &amp;lt;= MAXHUDATTACH ) || raattachpoint &amp;gt; MAXWEAR ) { // valid attach point?&lt;br /&gt;
        ERROR(&amp;quot;Invalid armor detachment point &amp;quot;+llList2String(ATTACHPOINTS,raattachpoint));&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( raamount &amp;lt; MINARMOR || raamount &amp;gt; MAXARMOR ) { // is armor rating valid or legal?&lt;br /&gt;
        ERROR(&amp;quot;Invalid armor amount &amp;quot;+(string)raamount+&amp;quot; out of range &amp;quot;+(string)MINARMOR+&amp;quot;-&amp;quot;+(string)MAXARMOR);&lt;br /&gt;
        return;&lt;br /&gt;
    }    &lt;br /&gt;
    if ( rapower != TRUE &amp;amp;&amp;amp; rapower != FALSE ) {&lt;br /&gt;
        ERROR(&amp;quot;Cannot determine if detached armor is power armor.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // FIXME move ARMOR and POWERARMOR into single list?&lt;br /&gt;
    ARMORPOWER = llListReplaceList(ARMORPOWER,[FALSE],raattachpoint,raattachpoint); // insert armor value into armor list&lt;br /&gt;
    // FIXME move ARMOR to 3-element strided list? [attachpoint,value,name?]&lt;br /&gt;
    ARMOR = llListReplaceList(ARMOR,[0],raattachpoint,raattachpoint); // zero out the armor value in armor list&lt;br /&gt;
    llOwnerSay(&amp;quot;Armor &amp;quot;+raname+&amp;quot; (&amp;quot;+(string)raamount+&amp;quot;) detached from &amp;quot;+llList2String(ATTACHPOINTS,raattachpoint));&lt;br /&gt;
    ARMORCHECK(); // find new highest armor value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOREFFECTBLOCKED - CHANGE ARMOR EFFECT WHEN ARMOR HIT AND BLOCKS DAMAGE&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMOREFFECTBLOCKED() {&lt;br /&gt;
    // your commands go here for armor special effect when armor BLOCKS a hit&lt;br /&gt;
    // llWhisper(CHANATTACH,&amp;quot;ARMOREFFECTBLOCKED&amp;quot;);&lt;br /&gt;
    SENDTOHUD(&amp;quot;ARMOREFFECTBLOCKED&amp;quot;);&lt;br /&gt;
    EFFECTTIME = MAXEFFECTTIME; // load the countdown&lt;br /&gt;
    llSetTimerEvent(1.0); // start the effect timer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOREFFECTHIT() - SHOW SPECIAL ARMOR EFFECTS WHEN ARMOR HIT BUT FAILS TO BLOCK&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMOREFFECTHIT() {&lt;br /&gt;
    //llWhisper(CHANATTACH,&amp;quot;ARMOREFFECTHIT&amp;quot;);&lt;br /&gt;
    SENDTOHUD(&amp;quot;ARMOREFFECTHIT&amp;quot;);&lt;br /&gt;
    EFFECTTIME = MAXEFFECTTIME; // load the countdown&lt;br /&gt;
    llSetTimerEvent(1.0); // start the effect timer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOREFFECTOFF - RESET ARMOR TO NORMAL VIEW&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMOREFFECTOFF() {&lt;br /&gt;
    //llWhisper(CHANATTACH,&amp;quot;ARMOREFFECTOFF&amp;quot;);&lt;br /&gt;
    SENDTOHUD(&amp;quot;ARMOREFFECTOFF&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOROFF&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMOROFF() {&lt;br /&gt;
    //llWhisper(CHANATTACH,&amp;quot;ARMOROFF&amp;quot;); // tell attachments to do some inworld special effects if needed&lt;br /&gt;
    if ( POWERARMOR == TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Power armor deactivated.&amp;quot;);&lt;br /&gt;
        ARMOR_ON = FALSE;&lt;br /&gt;
        SENDTOHUD(&amp;quot;ARMOROFF&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(0.0); // stop battery drain timer - FIXME does this kill effect timers?&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ARMORCHECK();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOR ON&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORON() {&lt;br /&gt;
    //llWhisper(CHANATTACH,&amp;quot;ARMORON&amp;quot;); // tell attachment to do some inworld special effect if needed&lt;br /&gt;
    if ( BATTERY &amp;lt;= 0 &amp;amp;&amp;amp; POWERARMOR == TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Power armor out of power. Recharge.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( POWERARMOR == TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Power armor activating.&amp;quot;);&lt;br /&gt;
        ARMOR_ON = TRUE;&lt;br /&gt;
        SENDTOHUD(&amp;quot;ARMORON&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(1.0); // run a battery drain timer, battery already checked &amp;gt; 0    &lt;br /&gt;
    }&lt;br /&gt;
    ARMORCHECK();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORRECHARGE&lt;br /&gt;
// FIXME - Medieval, Modern, Futuristic&lt;br /&gt;
// FIXME - Armor, Power Armor, Shield, PowerShield&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORRECHARGE() {&lt;br /&gt;
    //llWhisper(CHANATTACH,&amp;quot;ARMORRECHARGE&amp;quot;);&lt;br /&gt;
    if ( POWERARMOR != TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Cannot recharge non-powered armor.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // TODO Partial Recharges?&lt;br /&gt;
    BATTERY = MAXBATTERY;&lt;br /&gt;
    llOwnerSay(&amp;quot;Armor recharged.&amp;quot;);&lt;br /&gt;
    SENDTOHUD(&amp;quot;ARMORRECHARGE&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// COMMAND processor&lt;br /&gt;
//============================================================================&lt;br /&gt;
COMMAND(string message) {&lt;br /&gt;
    list fields = llParseString2List(message,[DIV],[]); // break into list of fields based on DIVider&lt;br /&gt;
    string command = llToLower(llStringTrim(llList2String(fields,0),STRING_TRIM)); // assume the first field is a Myriad Lite command&lt;br /&gt;
&lt;br /&gt;
    // General Myriad Module Commnads&lt;br /&gt;
    if ( command == &amp;quot;debugoff&amp;quot; ) { FLAG_DEBUG = FALSE; return;} // disable debugging&lt;br /&gt;
    if ( command == &amp;quot;debugon&amp;quot; ) { FLAG_DEBUG = TRUE; return;} // enable debugging&lt;br /&gt;
    if ( command == &amp;quot;reset&amp;quot; ) { RESET(); return;} // reset when told&lt;br /&gt;
    if ( command == &amp;quot;version&amp;quot; ) { GETVERSION(); return;} // get version when needed&lt;br /&gt;
    &lt;br /&gt;
    // Armor-Specific Module Commands in alphabetical order by command&lt;br /&gt;
    if ( command == &amp;quot;armorattach&amp;quot; ) { // player attached armor somewhere&lt;br /&gt;
        integer armorrating = llList2Integer(fields,1); // get armor value&lt;br /&gt;
        integer armorpower =  llList2Integer(fields,2); // get power armor or not&lt;br /&gt;
        integer attachpoint = llList2Integer(fields,3); // get armor location&lt;br /&gt;
        string armorname = llList2String(fields,4); // get armor's name&lt;br /&gt;
        ARMORATTACH(armorrating,armorpower,attachpoint,armorname); // add armor to set of armor worn&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == &amp;quot;armorbattery&amp;quot;) { ARMORBATTERY(); return;}  // check power armor battery&lt;br /&gt;
    if ( command == &amp;quot;armorcheck&amp;quot; ) { ARMORCHECK(); return; } // check our current armor value&lt;br /&gt;
    // armorcurrent skipped intentionally&lt;br /&gt;
    if ( command == &amp;quot;armordetach&amp;quot; ) { // player attached armor somewhere&lt;br /&gt;
        integer armorrating = llList2Integer(fields,1); // get armor value&lt;br /&gt;
        integer armorpower = llList2Integer(fields,2); // get power armor or not&lt;br /&gt;
        integer attachpoint = llList2Integer(fields,3); // get armor location&lt;br /&gt;
        string armorname = llList2String(fields,4); // get armor's name&lt;br /&gt;
        ARMORDETACH(armorrating,armorpower,attachpoint,armorname); // detach armor from set of armor worn&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( command == &amp;quot;armoreffecthit&amp;quot; ) { ARMOREFFECTHIT(); return;} // show SFX on hit&lt;br /&gt;
    if ( command == &amp;quot;armoreffectblocked&amp;quot; ) { ARMOREFFECTBLOCKED(); return;} // show SFX on hit&lt;br /&gt;
    if ( command == &amp;quot;armoreffectoff&amp;quot; ) { ARMOREFFECTOFF(); return;} // show SFX on hit&lt;br /&gt;
    if ( command == &amp;quot;armoron&amp;quot; ) { ARMORON(); return;} // turn on power armor&lt;br /&gt;
    if ( command == &amp;quot;armoroff&amp;quot; ) { ARMOROFF(); return;} // turn off power armor&lt;br /&gt;
    if ( command == &amp;quot;armorrecharge&amp;quot; ) { ARMORRECHARGE(); return;} // recharge power armor battery&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// DEBUG - show errors on debug channel with wearer name for sorting&lt;br /&gt;
//============================================================================&lt;br /&gt;
DEBUG(string dmessage) {&lt;br /&gt;
    if ( FLAG_DEBUG == TRUE ) llSay(DEBUG_CHANNEL,&amp;quot;(&amp;quot;+llKey2Name(PLAYERID)+&amp;quot;) MOD ARMOR: &amp;quot;+dmessage);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ERROR - show errors on debug channel with wearer name for sorting&lt;br /&gt;
//============================================================================&lt;br /&gt;
ERROR(string emessage) {&lt;br /&gt;
    llSay(DEBUG_CHANNEL,&amp;quot;ERROR (&amp;quot;+llKey2Name(PLAYERID)+&amp;quot;): &amp;quot;+emessage);&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 - shut down running animations then reset the script to reload character sheet&lt;br /&gt;
//============================================================================&lt;br /&gt;
RESET() {&lt;br /&gt;
    llResetScript(); // now reset&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,PLAYERID);    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// SETUP - begin&lt;br /&gt;
//============================================================================&lt;br /&gt;
SETUP() {&lt;br /&gt;
    FLAG_DEBUG = FALSE; // do we want debug messages&lt;br /&gt;
    ARMOR_ON = FALSE; // is armor &amp;quot;on&amp;quot; and protecting? off by default to save battery&lt;br /&gt;
    MAXBATTERY = 3600; // total battery capacity when fully charged - in seconds&lt;br /&gt;
    BATTERY = MAXBATTERY; // start with charged battery FIXME how to save state from wear to wear&lt;br /&gt;
    MAXEFFECTTIME = 3; // show armor effects for how long in seconds?&lt;br /&gt;
    PLAYERID = llGetOwner(); // remember the owner's UUID&lt;br /&gt;
    integer attachpoints = MAXWEAR; // counting from 0 to 30&lt;br /&gt;
    while ( attachpoints-- ) {&lt;br /&gt;
        ARMOR = ARMOR + [0]; // create 30 empty armor slots - avoids SL stack depth error and LSLINT warning&lt;br /&gt;
        ARMORPOWER = ARMORPOWER + [FALSE]; // create 30 empty power armor flags - avoid SL stack depth and LSLINT warning&lt;br /&gt;
    }&lt;br /&gt;
    llSetTimerEvent(0.0); // stop any running timer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// TIMER_HEARTBEAT - code called each time a timer event fires&lt;br /&gt;
// CALLED TO TURN OFF THE ARMOR SPECIAL EFFECTS AND DRAIN POWER ARMOR BATTERIES&lt;br /&gt;
//============================================================================&lt;br /&gt;
TIMER_HEARTBEAT() {&lt;br /&gt;
    if ( EFFECTTIME &amp;gt; 0 ) { // if there is still time to show armor special effects inworld, decrement counter&lt;br /&gt;
        EFFECTTIME--;&lt;br /&gt;
    }&lt;br /&gt;
    if ( EFFECTTIME &amp;lt;= 0 ) { // once armor effect timer counts down, cleanup.&lt;br /&gt;
        EFFECTTIME = 0; // force to zero if somehow it went less than zero&lt;br /&gt;
        ARMOREFFECTOFF(); // send message to shut off special effects&lt;br /&gt;
    }&lt;br /&gt;
    if ( POWERARMOR == TRUE &amp;amp;&amp;amp; ARMOR_ON == TRUE &amp;amp;&amp;amp; BATTERY &amp;gt; 0 ) { // if power armor on, decrement battery counter&lt;br /&gt;
        BATTERY--; // remove some battery&lt;br /&gt;
    }&lt;br /&gt;
    if ( POWERARMOR == TRUE &amp;amp;&amp;amp; ARMOR_ON == TRUE &amp;amp;&amp;amp; BATTERY &amp;lt;= 0 ) { // power armor battery drained, cleanup&lt;br /&gt;
        llOwnerSay(&amp;quot;Power armor battery drained. Shutting down.&amp;quot;);&lt;br /&gt;
        BATTERY = 0;&lt;br /&gt;
        ARMOROFF();&lt;br /&gt;
    }&lt;br /&gt;
    if ( EFFECTTIME &amp;lt;= 0 &amp;amp;&amp;amp; ARMOR_ON == FALSE ) llSetTimerEvent(0.0); // all timers done, stop timer events&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;
    // LINK_MESSAGE - note: NUM field is the number of the sending module&lt;br /&gt;
    // -----------------------------------------------------------------------&lt;br /&gt;
    link_message(integer sender_num,integer num,string str,key id) {&lt;br /&gt;
        if ( num == MODULE_ARMOR || num == LM_SENDTOATTACHMENT ) return; // ignore our own messages&lt;br /&gt;
        DEBUG(&amp;quot;EVENT: 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;
        COMMAND(str); // jump to command processor&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // -----------------------------------------------------------------------&lt;br /&gt;
    // STATE_ENTRY&lt;br /&gt;
    // -----------------------------------------------------------------------&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        DEBUG(&amp;quot;EVENT: state_entry()&amp;quot;);&lt;br /&gt;
        SETUP(); // setup defaults and go into event wait&lt;br /&gt;
    }&lt;br /&gt;
                &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // TIMER&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    timer() {&lt;br /&gt;
        DEBUG(&amp;quot;EVENT: timer()&amp;quot;);&lt;br /&gt;
        TIMER_HEARTBEAT();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	</feed>