<?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_Armor-v0.0.7-20120826.lsl</id>
		<title>User:Allen Kerensky/Myriad Lite/Myriad Lite Armor-v0.0.7-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_Armor-v0.0.7-20120826.lsl"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Armor-v0.0.7-20120826.lsl&amp;action=history"/>
		<updated>2026-06-13T18:40: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_Armor-v0.0.7-20120826.lsl&amp;diff=30507&amp;oldid=prev</id>
		<title>Allen Kerensky: added detach code back in case JustinCC fixed it in master dev</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Armor-v0.0.7-20120826.lsl&amp;diff=30507&amp;oldid=prev"/>
				<updated>2012-08-26T19:41:43Z</updated>
		
		<summary type="html">&lt;p&gt;added detach code back in case JustinCC fixed it in master dev&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:41, 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 289:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 289:&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; attach(key id) {&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; attach(key id) {&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; DEBUG(&amp;quot;EVENT: attach(&amp;quot;+(string)id+&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; &amp;#160; &amp;#160; DEBUG(&amp;quot;EVENT: attach(&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&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;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if ( id == NULL_KEY ) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&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;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ARMORDETACH();&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&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;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&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; // is this an attach event?&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; // is this an attach event?&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; if ( id != NULL_KEY ) { // a valid key means its an attach&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; if ( id != NULL_KEY ) { // a valid key means its an attach&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_Armor-v0.0.7-20120826.lsl&amp;diff=30506&amp;oldid=prev</id>
		<title>Allen Kerensky: Myriad_Lite_Armor-v0.0.7-20120826.lsl</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite/Myriad_Lite_Armor-v0.0.7-20120826.lsl&amp;diff=30506&amp;oldid=prev"/>
				<updated>2012-08-26T19:12:27Z</updated>
		
		<summary type="html">&lt;p&gt;Myriad_Lite_Armor-v0.0.7-20120826.lsl&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Myriad_Lite_Armor-v0.0.7-20120826.lsl =&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//============================================================================&lt;br /&gt;
// Myriad_Lite_Armor-v0.0.7-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;
//============================================================================&lt;br /&gt;
// MESSAGE FORMATS&lt;br /&gt;
//============================================================================&lt;br /&gt;
// CHANATTACH - IN  - DEBUGOFF&lt;br /&gt;
// CHANATTACH - IN  - DEBUGON&lt;br /&gt;
// CHANATTACH - IN  - REGISTERATTACHMENTS&lt;br /&gt;
// CHANATTACH - IN  - RESET&lt;br /&gt;
// CHANATTACH - IN  - VERSION&lt;br /&gt;
// CHANATTACH - OUT - ARMORATTACH|int ARMORRATING|int ATTACHPOINT|string OBJECTNAME&lt;br /&gt;
// CHANATTACH - IN  - ARMORBATTERY&lt;br /&gt;
// CHANATTACH - IN  - ARMORCHECK&lt;br /&gt;
// CHANATTACH - OUT - ARMORDETACH|int ARMORRATING|int ATTACHPOINT|string OBJECTNAME&lt;br /&gt;
// CHANATTACH - IN  - ARMOREFFECTBLOCKED&lt;br /&gt;
// CHANATTACH - IN  - ARMOREFFECTHIT&lt;br /&gt;
// CHANATTACH - IN  - ARMOREFFECTOFF&lt;br /&gt;
// CHANATTACH - IN  - ARMORON&lt;br /&gt;
// CHANATTACH - IN  - ARMOROFF&lt;br /&gt;
// CHANATTACH - IN  - ARMORRECHARGE&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// CONSTANTS - variables which don't change over runtime&lt;br /&gt;
//============================================================================&lt;br /&gt;
// Example Armor (Myriad PDF p64, Myriad Special Edition p98)&lt;br /&gt;
// Archaic Armor Ratings&lt;br /&gt;
// 1 Soft leather, heavy cloth&lt;br /&gt;
// 2 Hardened leather, thick hide&lt;br /&gt;
// 3 Chain mail, dragon hide&lt;br /&gt;
// 4 Full plate mail, mithril chain&lt;br /&gt;
// 5 Mithril plate mail&lt;br /&gt;
// Modern Armor Ratings&lt;br /&gt;
// 1 Leather jacket&lt;br /&gt;
// 2 Bullet-proof vest&lt;br /&gt;
// 3 SWAT tactical armor&lt;br /&gt;
// 4 Advanced military armor&lt;br /&gt;
// 5 Sci-fi powered battle armor&lt;br /&gt;
&lt;br /&gt;
string  VERSION = &amp;quot;0.0.7&amp;quot;; // version number&lt;br /&gt;
string  VERDATE = &amp;quot;20120826&amp;quot;; // version date&lt;br /&gt;
&lt;br /&gt;
integer ARMORRATING = 1; // the *actual* amount of protection THIS piece of armor provides&lt;br /&gt;
string  CHAN_PREFIX = &amp;quot;0x&amp;quot;; // channel prefix to convert to hexadecimal&lt;br /&gt;
string  DIV=&amp;quot;|&amp;quot;; // the divider used between fields on a Myriad Lite messages&lt;br /&gt;
integer MINATTACH = 1; // minimum allowed attachment point number&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; // maximum allowed avatar/inworld attachpoint number for multiattach/HUD attach cheaters&lt;br /&gt;
integer MAXEFFECTTIME = 3; // maximum time to show armor hit/blocked effects&lt;br /&gt;
integer POWERARMOR; // does this armor burn power? configured in SETUP()&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// RUNTIME VARIABLES - variables which should change during runtime&lt;br /&gt;
//============================================================================&lt;br /&gt;
integer FLAG_DEBUG; // see debugging messages? Configured in SETUP();&lt;br /&gt;
key     WEARER = NULL_KEY; // holds UUID of last wearer, so we can send detach message to correct meter&lt;br /&gt;
integer ATTACHPOINT = 0; // the avatar position where armor attached to or detached from&lt;br /&gt;
integer CHANATTACH; // owner's attachment channel&lt;br /&gt;
integer HANDATTACH; // chat handle for attachment channel&lt;br /&gt;
integer ARMOR_ON; // is armor &amp;quot;on&amp;quot; and protecting when worn? configured in SETUP()&lt;br /&gt;
integer EFFECTTIME; // how much time is left to show armor effects&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORATTACH(key id) - SHOW SPECIAL ARMOR EFFECTS WHEN ATTACHING ARMOR&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORATTACH(key id) {&lt;br /&gt;
    integer attachpoint = llGetAttached();&lt;br /&gt;
    if ( attachpoint &amp;lt; MINATTACH || ( attachpoint &amp;gt;= MINHUDATTACH &amp;amp;&amp;amp; attachpoint &amp;lt;= MAXHUDATTACH ) || attachpoint &amp;gt; MAXWEAR ) { // valid attach point?&lt;br /&gt;
        ERROR(&amp;quot;Invalid armor attachment point: &amp;quot;+(string)attachpoint);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    WEARER = id; // save who attached this armor piece for use during detach&lt;br /&gt;
    ATTACHPOINT = llGetAttached(); // where was this armor attached?&lt;br /&gt;
    integer dynchan = ATTACHCHANNEL(WEARER);&lt;br /&gt;
    // send the ATTACHARMOR to ML HUD to register that this armor piece is worn&lt;br /&gt;
    llWhisper(dynchan,&amp;quot;ARMORATTACH&amp;quot;+DIV+(string)ARMORRATING+DIV+(string)POWERARMOR+DIV+(string)ATTACHPOINT+DIV+llGetObjectName());&lt;br /&gt;
    // your commands go here for armor special effect when armor is attached&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORBATTERY() - SHOW SPECIAL ARMOR EFFECTS WHEN CHECKING ARMOR BATTERY LEVEL&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORBATTERY() {&lt;br /&gt;
    // your commands go here for armor special effect when checking armor battery&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORBATTERY() - SHOW SPECIAL ARMOR EFFECTS WHEN CHECKING ARMOR PROTECTION RATING&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORCHECK() {&lt;br /&gt;
    // your commands go here for armor special effect when checking armor protection rating&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORDETACH() - tell HUD/Module Armor that we detached - called from TIMER_HEARTBEAT, not ATTACH&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORDETACH() {&lt;br /&gt;
    if ( llGetAttached() == 0 ) {&lt;br /&gt;
        llWhisper((integer)(CHAN_PREFIX+llGetSubString((string)llGetOwner(),1,7)),&amp;quot;ARMORDETACH&amp;quot;+DIV+(string)ARMORRATING+DIV+(string)POWERARMOR+DIV+(string)ATTACHPOINT+DIV+llGetObjectName());&lt;br /&gt;
        WEARER = NULL_KEY; // armor detached and reported as such, so we can forget previous wearer&lt;br /&gt;
        ATTACHPOINT = 0; // armor detached and reported as such, so we can forget previous attach point&lt;br /&gt;
    }&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;
//============================================================================&lt;br /&gt;
ARMOREFFECTBLOCKED() {&lt;br /&gt;
    // your commands go here for armor special effect when armor BLOCKS a hit&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
    // ***        &lt;br /&gt;
    EFFECTTIME = MAXEFFECTTIME; // load the countdown&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;
//============================================================================&lt;br /&gt;
ARMOREFFECTHIT() {&lt;br /&gt;
    // your commands go here for armor special effect when armor hit and does not block&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
    EFFECTTIME = MAXEFFECTTIME; // load the countdown&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// EFFECTOFF - RESET ARMOR TO NORMAL VIEW&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMOREFFECTOFF() {&lt;br /&gt;
    // your commands go here to turn off armor effects&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOR OFF - DEACTIVATE POWERED ARMOR&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMOROFF() {&lt;br /&gt;
    if ( POWERARMOR == FALSE ) return;&lt;br /&gt;
    ARMOR_ON = FALSE;&lt;br /&gt;
    // your commands go here for armor special effect when shutting down&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMOR ON - ACTIVATE POWERED ARMOR&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORON() {&lt;br /&gt;
    ARMOR_ON = TRUE;&lt;br /&gt;
    // your commands go here for armor special effect when starting up&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ARMORRECHARGE() - SHOW SPECIAL ARMOR EFFECTS WHEN RECHARGING ARMOR BATTERY LEVEL&lt;br /&gt;
//============================================================================&lt;br /&gt;
ARMORRECHARGE() {&lt;br /&gt;
    // your commands go here for armor special effect when recharging&lt;br /&gt;
    // Example - Particles, animated textures, sound effects, visible/invisible&lt;br /&gt;
    // *** BEGIN your special effect code here&lt;br /&gt;
    // ***&lt;br /&gt;
    // *** END your special effect code here&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// ATTACHCHANNEL - calculate dynamic channels&lt;br /&gt;
//============================================================================&lt;br /&gt;
integer ATTACHCHANNEL(key forwho) {&lt;br /&gt;
    // FIXME validate key does if (uuid) work in OSgrid?&lt;br /&gt;
    if ( forwho == NULL_KEY ) return 0; // not valid&lt;br /&gt;
    return ((integer)(CHAN_PREFIX+llGetSubString((string)forwho,1,7)));&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(WEARER)+&amp;quot;) 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(WEARER)+&amp;quot;) ARMOR: &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;
    integer dynchan = ATTACHCHANNEL(llGetOwner());&lt;br /&gt;
    llWhisper(dynchan,&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() - wrap the llResetScript so we can persist data if needed&lt;br /&gt;
//============================================================================&lt;br /&gt;
RESET() {&lt;br /&gt;
    ARMOREFFECTOFF(); // stop armor effects then reset&lt;br /&gt;
    llResetScript();&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; // do we want debugging?&lt;br /&gt;
    ARMOR_ON = TRUE; // is power armor on and protecting by default&lt;br /&gt;
    POWERARMOR = TRUE; // is this a piece of power armor or not?&lt;br /&gt;
    WEARER = llGetOwner(); // set the default wearer key&lt;br /&gt;
    // calculate a dynamic chat channel based on owner key, for where the&lt;br /&gt;
    // wearer's ML HUD should be listening of attachment -specific events&lt;br /&gt;
    CHANATTACH = ATTACHCHANNEL(llGetOwner());&lt;br /&gt;
    // open a channel, listening on player HUD channel, save handle for later close if needed&lt;br /&gt;
    if ( HANDATTACH != 0 ) llListenRemove(HANDATTACH); // close an existing listerner first&lt;br /&gt;
    HANDATTACH = llListen(CHANATTACH,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;);&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;
    // ATTACH EVENT&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    attach(key id) {&lt;br /&gt;
        DEBUG(&amp;quot;EVENT: attach(&amp;quot;+(string)id+&amp;quot;)&amp;quot;);&lt;br /&gt;
        // is this an attach event?&lt;br /&gt;
        if ( id != NULL_KEY ) { // a valid key means its an attach&lt;br /&gt;
            ARMORATTACH(id); // call the attachment fucntion&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // CHANGED EVENT&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    changed(integer change) {&lt;br /&gt;
        DEBUG(&amp;quot;EVENT: changed(&amp;quot;+(string)change+&amp;quot;)&amp;quot;);&lt;br /&gt;
        if ( ( change &amp;amp; CHANGED_REGION ) || ( change &amp;amp; CHANGED_TELEPORT ) ) {&lt;br /&gt;
            RESET();&lt;br /&gt;
        }&lt;br /&gt;
    } &lt;br /&gt;
      &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // LISTEN EVENT&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    listen(integer channel,string speakername,key speakerid,string message) {&lt;br /&gt;
        DEBUG(&amp;quot;EVENT: listen(&amp;quot;+(string)channel+&amp;quot;,&amp;quot;+speakername+&amp;quot;,&amp;quot;+(string)speakerid+&amp;quot;,&amp;quot;+message+&amp;quot;)&amp;quot;);&lt;br /&gt;
        ATTACHPOINT = llGetAttached(); // get location we're attached to&lt;br /&gt;
        list tokens = llParseString2List(message,[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        string command = llToLower(llStringTrim(llList2String(tokens,0),STRING_TRIM));&lt;br /&gt;
        if ( channel == CHANATTACH ) { // is this message on the attach channel?&lt;br /&gt;
            // General Myriad Lite System Commands&lt;br /&gt;
            if ( command == &amp;quot;debugoff&amp;quot; ) { FLAG_DEBUG = FALSE; DEBUG(&amp;quot;off&amp;quot;); return; }&lt;br /&gt;
            if ( command == &amp;quot;debugon&amp;quot; ) { FLAG_DEBUG = TRUE; DEBUG(&amp;quot;on&amp;quot;); return; }&lt;br /&gt;
            if ( command == &amp;quot;registerattachments&amp;quot; ) { ARMORATTACH(llGetOwner()); return; }&lt;br /&gt;
            if ( command == &amp;quot;reset&amp;quot; ) { RESET(); return; }&lt;br /&gt;
            if ( command == &amp;quot;version&amp;quot; ) { GETVERSION(); return; }&lt;br /&gt;
            // Armor Commands&lt;br /&gt;
            // armorattach skipped intentionally &lt;br /&gt;
            if ( command == &amp;quot;armorbattery&amp;quot; ) { ARMORBATTERY(); return;} // show effects on armor battery level check&lt;br /&gt;
            if ( command == &amp;quot;armorcheck&amp;quot; ) { ARMORCHECK(); return;} // show effects on armor check            &lt;br /&gt;
            // armordetach skipped intentionally&lt;br /&gt;
            if ( command == &amp;quot;armoreffectblocked&amp;quot; ) { ARMOREFFECTBLOCKED(); return; } // did the armor block the hit too&lt;br /&gt;
            if ( command == &amp;quot;armoreffecthit&amp;quot; ) { ARMOREFFECTHIT(); return; } // is this an armor hit?&lt;br /&gt;
            if ( command == &amp;quot;armoreffectoff&amp;quot; ) { ARMOREFFECTOFF(); return; } // time to turn off effects?&lt;br /&gt;
            if ( command == &amp;quot;armoroff&amp;quot; ) { ARMOROFF(); return;} // deactivate power armor&lt;br /&gt;
            if ( command == &amp;quot;armoron&amp;quot; ) { ARMORON(); return;} // activate power armor&lt;br /&gt;
            if ( command == &amp;quot;armorrecharge&amp;quot; ) { ARMORRECHARGE(); return;} // show effects on armor recharge&lt;br /&gt;
        } // end if channel CHANATTACH&lt;br /&gt;
    } &lt;br /&gt;
&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // ON_REZ EVENT&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        DEBUG(&amp;quot;EVENT: on_rez(&amp;quot;+(string)start_param+&amp;quot;)&amp;quot;);&lt;br /&gt;
        SETUP(); // call event independent SETUP code        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // DEFAULT STATE ENTRY - begin our setup or call a setup block&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        SETUP(); // call the event-independent SETUP code&lt;br /&gt;
    }&lt;br /&gt;
       &lt;br /&gt;
} // end default&lt;br /&gt;
//============================================================================&lt;br /&gt;
// END&lt;br /&gt;
//============================================================================&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	</feed>