<?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-Preview6.lsl</id>
		<title>User:Allen Kerensky/Myriad Lite/Myriad Lite Module Armor-Preview6.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-Preview6.lsl"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_Armor-Preview6.lsl&amp;action=history"/>
		<updated>2026-04-17T04:35:15Z</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-Preview6.lsl&amp;diff=33162&amp;oldid=prev</id>
		<title>Allen Kerensky: fixed a stupid FLAG_DEBUG = TRUE I had left in the setup - generates spammy nonsense by default which annoys me</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_Armor-Preview6.lsl&amp;diff=33162&amp;oldid=prev"/>
				<updated>2013-07-27T18:20:01Z</updated>
		
		<summary type="html">&lt;p&gt;fixed a stupid FLAG_DEBUG = TRUE I had left in the setup - generates spammy nonsense by default which annoys me&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 18:20, 27 July 2013&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 73:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 73:&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;//============================================================================&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;//============================================================================&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;SETUP() {&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;SETUP() {&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; FLAG_DEBUG= &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;TRUE&lt;/del&gt;; // do we want debug messages&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; FLAG_DEBUG = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;FALSE&lt;/ins&gt;; // do we want debug messages&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; ARMOR_ON = FALSE; // is armor &amp;quot;on&amp;quot; and protecting? off by default to save battery&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; ARMOR_ON = FALSE; // is armor &amp;quot;on&amp;quot; and protecting? off by default to save battery&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; BATTERY = 3600; // start with charged battery FIXME how to save state from wear to wear&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; BATTERY = 3600; // start with charged battery FIXME how to save state from wear to wear&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-Preview6.lsl&amp;diff=30307&amp;oldid=prev</id>
		<title>Allen Kerensky: Myriad_Lite_Module_Armor-Preview6.lsl</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Module_Armor-Preview6.lsl&amp;diff=30307&amp;oldid=prev"/>
				<updated>2012-08-12T00:55:03Z</updated>
		
		<summary type="html">&lt;p&gt;Myriad_Lite_Module_Armor-Preview6.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-Preview6.lsl =&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
// Myriad_Lite_Module_Armor-Preview6.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;
string VERSION = &amp;quot;0.0.2&amp;quot;;&lt;br /&gt;
string VERDATE = &amp;quot;20120317&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
integer FLAG_DEBUG; // configure in setup&lt;br /&gt;
&lt;br /&gt;
key PLAYERID = NULL_KEY; // cached player UUID&lt;br /&gt;
&lt;br /&gt;
integer MINATTACH = 1; // min valid attach point&lt;br /&gt;
integer MAXWEAR = 30; // 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;
integer CURARMOR = 0; // highest armor value worn out of all armor worn, not a total&lt;br /&gt;
&lt;br /&gt;
list ARMOR = [];&lt;br /&gt;
list ARMORPOWER = [];&lt;br /&gt;
integer POWERARMOR;&lt;br /&gt;
integer BATTERY;&lt;br /&gt;
integer MAXBATTERY;&lt;br /&gt;
integer MAXEFFECTTIME = 3; // maximum time to show armor hit/blocked effects&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;
// 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; ];&lt;br /&gt;
&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 LM_SENDTOATTACHMENT = 0x80000000;&lt;br /&gt;
string DIV = &amp;quot;|&amp;quot;; // message divider&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// SETUP - begin&lt;br /&gt;
//============================================================================&lt;br /&gt;
SETUP() {&lt;br /&gt;
    FLAG_DEBUG= TRUE; // 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;
    BATTERY = 3600; // start with charged battery FIXME how to save state from wear to wear&lt;br /&gt;
    MAXBATTERY = 3600; // total battery capacity when fully charged - 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;
// 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;
// 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;
// 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;
// WEARARMOR - Wearing a piece of armor&lt;br /&gt;
//============================================================================&lt;br /&gt;
WEARARMOR(integer waattachpoint,integer waamount,integer wapower,string waname) {&lt;br /&gt;
    DEBUG(&amp;quot;ATTACH Attachpoint=[&amp;quot;+(string)waattachpoint+&amp;quot;] Amount=[&amp;quot;+(string)waamount+&amp;quot;] Power=[&amp;quot;+(string)wapower+&amp;quot;] Name=[&amp;quot;+waname+&amp;quot;]&amp;quot;);&lt;br /&gt;
    if ( waattachpoint &amp;lt; MINATTACH || 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;
    RECALCULATE_ARMOR(); // find new highest armor value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// REMOVEARMOR - Removing a piece of armor&lt;br /&gt;
//============================================================================&lt;br /&gt;
REMOVEARMOR(integer raattachpoint,integer raamount,integer rapower,string raname) {&lt;br /&gt;
    DEBUG(&amp;quot;DETACH Attachpoint=[&amp;quot;+(string)raattachpoint+&amp;quot;] Amount=[&amp;quot;+(string)raamount+&amp;quot;] Power=[&amp;quot;+(string)rapower+&amp;quot;] Name=[&amp;quot;+raname+&amp;quot;]&amp;quot;);&lt;br /&gt;
    if ( raattachpoint &amp;lt; MINATTACH || 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;
    RECALCULATE_ARMOR(); // find new highest armor value&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// RECALCULATE_ARMOR - sets CURARMOR to highest armor value worn after attach or detach&lt;br /&gt;
//============================================================================&lt;br /&gt;
RECALCULATE_ARMOR() {&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 tell world too?&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOR ON&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;
    RECALCULATE_ARMOR();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOROFF&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;
    RECALCULATE_ARMOR();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// CHECKBATTERY&lt;br /&gt;
//============================================================================&lt;br /&gt;
CHECKBATTERY() {&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;
// RECHARGE&lt;br /&gt;
//============================================================================&lt;br /&gt;
RECHARGE() {&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;
// EFFECTHIT() - SHOW SPECIAL ARMOR EFFECTS WHEN ARMOR HIT BUT FAILS TO BLOCK&lt;br /&gt;
//============================================================================&lt;br /&gt;
EFFECTHIT() {&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;
// EFFECTBLOCKED - CHANGE ARMOR EFFECT WHEN ARMOR HIT AND BLOCKS DAMAGE&lt;br /&gt;
//============================================================================&lt;br /&gt;
EFFECTBLOCKED() {&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;
// EFFECTOFF - RESET ARMOR TO NORMAL VIEW&lt;br /&gt;
//============================================================================&lt;br /&gt;
EFFECTOFF() {&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;
// 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;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;
    if ( command == &amp;quot;debugon&amp;quot; ) { FLAG_DEBUG = TRUE; return;} // enable debugging&lt;br /&gt;
    if ( command == &amp;quot;debugoff&amp;quot; ) { FLAG_DEBUG = FALSE; return;} // disable debugging&lt;br /&gt;
    &lt;br /&gt;
    // Armor-Specific Module Commands&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;
        WEARARMOR(attachpoint,armorrating,armorpower,armorname); // add armor to set of armor worn&lt;br /&gt;
        return;&lt;br /&gt;
    }&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;
        REMOVEARMOR(attachpoint,armorrating,armorpower,armorname); // detach armor from set of armor worn&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    // armorcurrent skipped intentionally&lt;br /&gt;
    if ( command == &amp;quot;armorreset&amp;quot; ) { RESET(); return;} // reset HUD&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;armorbattery&amp;quot;) { CHECKBATTERY(); return;}  // check power armor battery&lt;br /&gt;
    if ( command == &amp;quot;armorrecharge&amp;quot; ) { RECHARGE(); return;} // recharge power armor battery&lt;br /&gt;
    if ( command == &amp;quot;armorcheck&amp;quot; ) { RECALCULATE_ARMOR(); return; } // check our current armor value&lt;br /&gt;
    if ( command == &amp;quot;armoreffecthit&amp;quot; ) { EFFECTHIT(); return;} // show SFX on hit&lt;br /&gt;
    if ( command == &amp;quot;armoreffectblocked&amp;quot; ) { EFFECTBLOCKED(); return;} // show SFX on hit&lt;br /&gt;
    if ( command == &amp;quot;armoreffectoff&amp;quot; ) { EFFECTOFF(); return;} // show SFX on hit&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;
    // STATE_ENTRY - the script starts here&lt;br /&gt;
    //------------------------------------------------------------------------        &lt;br /&gt;
    state_entry() {&lt;br /&gt;
        SETUP(); // setup defaults and go into event wait&lt;br /&gt;
    }&lt;br /&gt;
    //------------------------------------------------------------------------    &lt;br /&gt;
    // ON REZ - RESET to force through state entry&lt;br /&gt;
    //------------------------------------------------------------------------        &lt;br /&gt;
    on_rez(integer params) {&lt;br /&gt;
        params = 0; // LSLINT&lt;br /&gt;
        RESET();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //------------------------------------------------------------------------    &lt;br /&gt;
    // ON ATTACH - RESET to force through state entry&lt;br /&gt;
    //------------------------------------------------------------------------    &lt;br /&gt;
    attach(key id) {&lt;br /&gt;
        id = NULL_KEY; // LSLINT&lt;br /&gt;
        RESET();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // CHANGED - triggered for many changes to the avatar&lt;br /&gt;
    // TODO reload sim-specific settings on region change&lt;br /&gt;
    //------------------------------------------------------------------------    &lt;br /&gt;
    changed(integer changes) {&lt;br /&gt;
        if ( changes &amp;amp; CHANGED_INVENTORY ) { // inventory changed somehow?&lt;br /&gt;
            RESET();&lt;br /&gt;
        }&lt;br /&gt;
        if ( changes &amp;amp; CHANGED_REGION || changes &amp;amp; CHANGED_TELEPORT ) {&lt;br /&gt;
            RESET();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // INCOMING LINK MESSSAGES&lt;br /&gt;
    //------------------------------------------------------------------------    &lt;br /&gt;
    link_message(integer sender_num,integer sending_module,string str,key id) {&lt;br /&gt;
        if ( sending_module == MODULE_ARMOR || sending_module == LM_SENDTOATTACHMENT ) return; // ignore our own messages&lt;br /&gt;
        DEBUG(&amp;quot;link_message str=[&amp;quot;+str+&amp;quot;]&amp;quot;);&lt;br /&gt;
        sender_num = 0; // LSLINT&lt;br /&gt;
        id = NULL_KEY; // LSLINT&lt;br /&gt;
        if ( llGetSubString(llStringTrim(llToLower(str),STRING_TRIM),0,4) == &amp;quot;armor&amp;quot; ) { // if armor command&lt;br /&gt;
            COMMAND(str); // jump to command processor&lt;br /&gt;
            return; // return here too in case we add later commands&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // TIMER CALLED TO TURN OFF THE SPECIAL EFFECTS AND DRAIN BATTERIES&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    timer() {&lt;br /&gt;
        if ( EFFECTTIME &amp;gt; 0 ) {&lt;br /&gt;
            EFFECTTIME--;&lt;br /&gt;
            if ( EFFECTTIME == 0 ) { &lt;br /&gt;
                EFFECTOFF(); // turn off special effects&lt;br /&gt;
            } // timer expired, turn off effect&lt;br /&gt;
        }&lt;br /&gt;
        if ( EFFECTTIME &amp;lt; 0 ) { // we should never have this happen, but just in case, catch and cleanup.&lt;br /&gt;
            EFFECTTIME = 0;&lt;br /&gt;
            EFFECTOFF();&lt;br /&gt;
        }&lt;br /&gt;
        if ( POWERARMOR == TRUE &amp;amp;&amp;amp; ARMOR_ON == TRUE &amp;amp;&amp;amp; BATTERY &amp;gt; 0 ) {&lt;br /&gt;
            BATTERY--; // remove some battery&lt;br /&gt;
            if ( BATTERY == 0 ) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Armor battery drained. Shutting down.&amp;quot;);&lt;br /&gt;
                ARMOROFF(); // turn off armor&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if ( BATTERY &amp;lt; 0 ) { // we should never have this happen, but just in case, catch and cleanup&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;
    } // end timer&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	</feed>