<?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_Preview_5%2FModule_Armor</id>
		<title>User:Allen Kerensky/Myriad Lite Preview 5/Module Armor - 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_Preview_5%2FModule_Armor"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Module_Armor&amp;action=history"/>
		<updated>2026-05-15T12:55:07Z</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_Preview_5/Module_Armor&amp;diff=27313&amp;oldid=prev</id>
		<title>Allen Kerensky: moved User:Allen Kerensky:Myriad Lite Preview 5:Module Armor to User:Allen Kerensky/Myriad Lite Preview 5/Module Armor: move into subsite</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Module_Armor&amp;diff=27313&amp;oldid=prev"/>
				<updated>2012-02-06T22:31:15Z</updated>
		
		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/wiki/User:Allen_Kerensky:Myriad_Lite_Preview_5:Module_Armor&quot; class=&quot;mw-redirect&quot; title=&quot;User:Allen Kerensky:Myriad Lite Preview 5:Module Armor&quot;&gt;User:Allen Kerensky:Myriad Lite Preview 5:Module Armor&lt;/a&gt; to &lt;a href=&quot;/wiki/User:Allen_Kerensky/Myriad_Lite_Preview_5/Module_Armor&quot; title=&quot;User:Allen Kerensky/Myriad Lite Preview 5/Module Armor&quot;&gt;User:Allen Kerensky/Myriad Lite Preview 5/Module Armor&lt;/a&gt;: move into subsite&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
			&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 22:31, 6 February 2012&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_Preview_5/Module_Armor&amp;diff=27193&amp;oldid=prev</id>
		<title>Allen Kerensky: fixed page to be about the HUD Module rather than armor attachment... oops</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Module_Armor&amp;diff=27193&amp;oldid=prev"/>
				<updated>2012-02-06T16:50:47Z</updated>
		
		<summary type="html">&lt;p&gt;fixed page to be about the HUD Module rather than armor attachment... oops&lt;/p&gt;
&lt;a href=&quot;http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Module_Armor&amp;amp;diff=27193&amp;amp;oldid=27190&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Module_Armor&amp;diff=27190&amp;oldid=prev</id>
		<title>Allen Kerensky: created</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Module_Armor&amp;diff=27190&amp;oldid=prev"/>
				<updated>2012-02-06T16:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;created&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Myriad Lite Module: Armor =&lt;br /&gt;
&lt;br /&gt;
Armor is never a bad idea if you are in a place where combat is likely.&lt;br /&gt;
&lt;br /&gt;
Unlike many game systems, armor does not make you harder to hit.&lt;br /&gt;
&lt;br /&gt;
Armor deflects kinetic impact damage away from you (armor glancing) or absorbs some or all of the damage on a hit.&lt;br /&gt;
&lt;br /&gt;
Some armor is static, just a simple object like a medieval shield or bulletproof vest.&lt;br /&gt;
&lt;br /&gt;
In science-fiction, armor may be computerized or formed from an electronic field.&lt;br /&gt;
&lt;br /&gt;
Myriad Lite calls armor that requires energy to run &amp;quot;power armor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Example Armor ==&lt;br /&gt;
&lt;br /&gt;
Example Armor (Myriad PDF p64, Myriad Special Edition p98)&lt;br /&gt;
&lt;br /&gt;
=== Archaic Armor Ratings ===&lt;br /&gt;
# Soft leather, heavy cloth&lt;br /&gt;
# Hardened leather, thick hide&lt;br /&gt;
# Chain mail, dragon hide&lt;br /&gt;
# Full plate mail, mithril chain&lt;br /&gt;
# Mithril plate mail&lt;br /&gt;
&lt;br /&gt;
=== Modern Armor Ratings ===&lt;br /&gt;
# Leather jacket&lt;br /&gt;
# Bullet-proof vest&lt;br /&gt;
# SWAT tactical armor&lt;br /&gt;
# Advanced military armor&lt;br /&gt;
# Sci-fi powered battle armor&lt;br /&gt;
&lt;br /&gt;
== Quick Start ==&lt;br /&gt;
&lt;br /&gt;
* (required) Wear the Myriad Lite HUD.&lt;br /&gt;
* (optional) Wear the hovertext meter&lt;br /&gt;
* (optional) Wear armor, which you should see reported in your chat window.&lt;br /&gt;
* (optional) Wear a holster&lt;br /&gt;
* (optional) Wear a melee or ranged combat weapon&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
Myriad Lite accepts a variety of chat commands on channel 5.&lt;br /&gt;
&lt;br /&gt;
/5 &amp;lt;command&amp;gt; will activate that command.&lt;br /&gt;
Scripters can also send the same commands as a link message.&lt;br /&gt;
Custom HUDs can be constructed with buttons named each command, and the button will activate the command of the same name&lt;br /&gt;
&lt;br /&gt;
=== Armor Commands ===&lt;br /&gt;
Armor commands are detailed below in context.&lt;br /&gt;
&lt;br /&gt;
For non-powered armor, simply wear the item and you should see the armor value reported.&lt;br /&gt;
/5 checkarmor to see what your current armor value is&lt;br /&gt;
&lt;br /&gt;
The following commands let you control power armor:&lt;br /&gt;
* /5 armoron to activate power armor.&lt;br /&gt;
* /5 armoroff to deactivate power armor and save the battery&lt;br /&gt;
* /5 recharge to recharge a power armor battery&lt;br /&gt;
&lt;br /&gt;
== Creating Armor ==&lt;br /&gt;
&lt;br /&gt;
# Save the Armor script below into your inventory.&lt;br /&gt;
# Create an object to represent a piece of armor, such as a bracelet or helmet.&lt;br /&gt;
# Drag and Drop the Myriad Lite Armor script from inventory into the attachment.&lt;br /&gt;
# (optional) Edit the script to adjust:&lt;br /&gt;
## (optional) Rating from 1-5&lt;br /&gt;
## (optional) Whether or not this is a piece of power armor&lt;br /&gt;
## (optional) How much battery life this armor has before recharging&lt;br /&gt;
## Attach the armor and adjust the position&lt;br /&gt;
# Detach the piece of armor back into inventory again to &amp;quot;save&amp;quot; the default attach point.&lt;br /&gt;
# Attach/wear the armor piece when desired.&lt;br /&gt;
&lt;br /&gt;
NOTE: The Myriad Lite HUD should report the armor registering as a change in armor value.&lt;br /&gt;
&lt;br /&gt;
== Myriad_Lite_Armor-v0.0.5-20120130.lsl ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
//============================================================================&lt;br /&gt;
// Myriad_Lite_Armor_v0.0.5-20120130.lsl&lt;br /&gt;
// Copyright (c) 2012 By Allen Kerensky (OSG/SL)&lt;br /&gt;
// The Myriad RPG System was designed, written, and illustrated by Ashok Desai&lt;br /&gt;
// Myriad RPG licensed under the Creative Commons Attribution 2.0 UK: England and Wales&lt;br /&gt;
// http://creativecommons.org/licenses/by/2.0/uk/&lt;br /&gt;
// Myriad Lite software Copyright (c) 2011 by Allen Kerensky (OSG/SL)&lt;br /&gt;
// Baroun's Adventure Machine Copyright (c) 2008-2011 by Baroun Tardis (SL)&lt;br /&gt;
// Myriad Lite and Baroun's Adventure Machine licensed under the&lt;br /&gt;
// Creative Commons Attribution-Share Alike-Non-Commercial 3.0 Unported&lt;br /&gt;
// http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
// You must agree to the terms of this license before making any use of this software.&lt;br /&gt;
// If you do not agree to this license, simply delete these materials.&lt;br /&gt;
// There is no warranty, express or implied, for your use of these materials.&lt;br /&gt;
//============================================================================&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// MESSAGE FORMATS&lt;br /&gt;
//============================================================================&lt;br /&gt;
// CHANATTACH - IN - REGISTERATTACHMENTS&lt;br /&gt;
// CHANATTACH - OUT - ATTACHARMOR|int ARMORRATING|int ATTACHPOINT|string OBJECTNAME&lt;br /&gt;
// CHANATTACH - OUT - DETACHARMOR|int ARMORRATING|int ATTACHPOINT|string OBJECTNAME&lt;br /&gt;
// CHANATTACH - IN - ARMORHIT&lt;br /&gt;
// CHANATTACH - IN - ARMORBLOCKED&lt;br /&gt;
// CHANATTACH - IN - ARMORON&lt;br /&gt;
// CHANATTACH - IN - ARMOROFF&lt;br /&gt;
// CHANATTACH - IN - CHECKBATTERY&lt;br /&gt;
// CHANATTACH - IN - RECHARGE&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;
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 MINATTACHPOINT = 1; // minimum allowed attachment point number&lt;br /&gt;
integer MAXATTACHPOINT = 30; // 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 = FALSE; // does this armor burn power?&lt;br /&gt;
integer MAXBATTERY = 3600; // how many seconds can armor run before recharge?&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// RUNTIME VARIABLES - variables which should change during runtime&lt;br /&gt;
//============================================================================&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 = TRUE; // is armor &amp;quot;on&amp;quot; and protecting?&lt;br /&gt;
integer BATTERY; // current charge left for power armor&lt;br /&gt;
integer EFFECTTIME; // how much time is left to show armor effects&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// DEBUG - show debug chat with wearer name for sorting&lt;br /&gt;
//============================================================================&lt;br /&gt;
DEBUG(string dmessage) {&lt;br /&gt;
    llOwnerSay(&amp;quot;DEBUG: &amp;quot;+dmessage);&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;
    // your commands go here for armor special effect when armor hit and does not block&lt;br /&gt;
&lt;br /&gt;
    // end of special effects&lt;br /&gt;
    EFFECTTIME = MAXEFFECTTIME; // load the countdown&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;
        &lt;br /&gt;
    // end of special effects&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;
EFFECTOFF() {&lt;br /&gt;
    // your commands go here to turn off armor effects&lt;br /&gt;
&lt;br /&gt;
    // end of armor reset&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;
    if ( POWERARMOR != TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Cannot activate non-powered armor.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ( BATTERY &amp;lt;= 0 ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Armor out of power. Recharge.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ARMOR_ON = TRUE;&lt;br /&gt;
    // your special effect code here&lt;br /&gt;
    llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES);&lt;br /&gt;
    llSetTimerEvent(1.0); // run a battery drain timer, battery already checked &amp;gt; 0&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 != TRUE ) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Cannot deactivate non-powered armor.&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    ARMOR_ON = FALSE;&lt;br /&gt;
    llOwnerSay(&amp;quot;Power armor shutting down.&amp;quot;);&lt;br /&gt;
    // your code here&lt;br /&gt;
    llSetLinkAlpha(LINK_SET,0.0,ALL_SIDES);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// CHECK BATTERY&lt;br /&gt;
//============================================================================&lt;br /&gt;
CHECKBATTERY() {&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;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// RECHARGE POWER ARMOR BATTERY&lt;br /&gt;
//============================================================================&lt;br /&gt;
RECHARGE() {&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;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// GLOBAL SETUP()&lt;br /&gt;
//============================================================================&lt;br /&gt;
SETUP() {&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 = (integer)(CHAN_PREFIX+llGetSubString((string)llGetOwner(),1,7));&lt;br /&gt;
    // open a channel, listening on player HUD channel, save handle for later close if needed&lt;br /&gt;
    HANDATTACH = llListen(CHANATTACH,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;);&lt;br /&gt;
    if ( POWERARMOR == TRUE ) BATTERY = MAXBATTERY; // charge the battery to full&lt;br /&gt;
    llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES); // show the armor&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//============================================================================&lt;br /&gt;
// DEFAULT&lt;br /&gt;
//============================================================================&lt;br /&gt;
default {&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;
    // DEFAULT ON_REZ&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    on_rez(integer start_param) {&lt;br /&gt;
        start_param = 0; // LSLINT&lt;br /&gt;
        SETUP(); // call event independent SETUP code        &lt;br /&gt;
    }&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // DEFAULT ATTACH - Called for detach too&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    attach(key id) {&lt;br /&gt;
        SETUP(); // call event-independent SETUP code&lt;br /&gt;
        // is this an attach event or detach event?&lt;br /&gt;
        if ( id != NULL_KEY ) { // a valid key means its an attach&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;
            // this should NOT be necessary, since it should match CHANPLAYER&lt;br /&gt;
            // however, armor can be dropped! So, wearer may NOT be owner. Need changed block?&lt;br /&gt;
            integer dynchan = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)WEARER,1,7));&lt;br /&gt;
            // Send ATTACHARMOR message to WEARER HUD&lt;br /&gt;
            llWhisper(dynchan,&amp;quot;ATTACHARMOR&amp;quot;+DIV+(string)ARMORRATING+DIV+(string)ATTACHPOINT+DIV+llGetObjectName());&lt;br /&gt;
        } else { // else the id equals NULL_KEY which happens for detach&lt;br /&gt;
            // calculate dynamic channel for person last wearing armor piece&lt;br /&gt;
            integer dynchan = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)WEARER,1,7));&lt;br /&gt;
            if ( dynchan != 0 ) { // did the dynamic channel check give us usable channel number &amp;lt;0 or &amp;gt;0 but not actually 0?&lt;br /&gt;
                // Send DETACHARMOR message to previous wearer's HUD&lt;br /&gt;
                llWhisper(dynchan,&amp;quot;DETACHARMOR&amp;quot;+DIV+(string)ARMORRATING+DIV+(string)ATTACHPOINT+DIV+llGetObjectName());&lt;br /&gt;
            } else { // the dynamic channel was 0?&lt;br /&gt;
                // how did we get in this mess? a detach without an attach. Report error. Design failure somewhere. THIS SHOULD NEVER HAPPEN.&lt;br /&gt;
                DEBUG(&amp;quot;DETACH EVENT WITHOUT PREVIOUS ATTACH?&amp;quot;);&lt;br /&gt;
            } // end of if dynchan not equal zero&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;
        } // end of if id not equal null key&lt;br /&gt;
    }&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // DEFAULT CHANGED&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    changed(integer change) {&lt;br /&gt;
        if ( change &amp;amp; CHANGED_OWNER ) { // if armor has a new owner from take-from-ground or copy, resetup&lt;br /&gt;
            SETUP(); // call event-independent setup code, in this case to update channels&lt;br /&gt;
        }&lt;br /&gt;
        if ( ( change &amp;amp; CHANGED_REGION ) || ( change &amp;amp; CHANGED_TELEPORT ) ) {&lt;br /&gt;
            EFFECTOFF(); // stop effects before reset&lt;br /&gt;
            // FIXME - resets battery state&lt;br /&gt;
            llResetScript(); // restart attachment after region change or teleport&lt;br /&gt;
        }&lt;br /&gt;
    }    &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // DEFAULT LISTEN&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    listen(integer channel,string speakername,key speakerid,string message) {&lt;br /&gt;
        speakername = &amp;quot;&amp;quot;; // LSLINT&lt;br /&gt;
        speakerid = NULL_KEY; // LSLINT&lt;br /&gt;
        ATTACHPOINT = llGetAttached(); // get location we're attached to&lt;br /&gt;
        if ( channel == CHANATTACH ) { // is this message on the attach channel?&lt;br /&gt;
            if ( message == &amp;quot;ARMORHIT&amp;quot; ) { // is this an armor hit?&lt;br /&gt;
                EFFECTHIT(); // turn on armor hit effects&lt;br /&gt;
                return; // message processed, exit early&lt;br /&gt;
            }&lt;br /&gt;
            if ( message == &amp;quot;ARMORBLOCKED&amp;quot; ) { // did the armor block the hit too&lt;br /&gt;
                EFFECTBLOCKED(); // turn on armor block effects&lt;br /&gt;
                return; // message processed, exit early&lt;br /&gt;
            }&lt;br /&gt;
            // ML HUD sent a request for any attached items&lt;br /&gt;
            if ( ( message == &amp;quot;REGISTERATTACHMENTS&amp;quot; ) &amp;amp;&amp;amp; ( ATTACHPOINT &amp;gt;= MINATTACHPOINT ) &amp;amp;&amp;amp; ( ATTACHPOINT &amp;lt;= MAXATTACHPOINT ) ) {&lt;br /&gt;
                WEARER = llGetOwner(); // get armor owner BUG: what if owner not equal wearer?&lt;br /&gt;
                // calculate the dynamic channel of the wearer&lt;br /&gt;
                integer dynchan = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)WEARER,1,7));&lt;br /&gt;
                // send the ATTACHARMOR to ML HUD to register that this armor piece is worn&lt;br /&gt;
                llWhisper(dynchan,&amp;quot;ATTACHARMOR&amp;quot;+DIV+(string)ARMORRATING+DIV+(string)ATTACHPOINT+DIV+llGetObjectName());&lt;br /&gt;
                return; // message processed, exit early&lt;br /&gt;
            } // end of if message equal REGISTERATTACHMENTS            &lt;br /&gt;
            if ( message == &amp;quot;ARMORON&amp;quot; ) { ARMORON(); return;} // activate power armor&lt;br /&gt;
            if ( message == &amp;quot;ARMOROFF&amp;quot; ) { ARMOROFF(); return;} // deactivate power armor&lt;br /&gt;
            if ( message == &amp;quot;RECHARGE&amp;quot; ) { RECHARGE(); return;} // recharge power armor battery?&lt;br /&gt;
            if ( message == &amp;quot;CHECKBATTERY&amp;quot; ) { CHECKBATTERY(); return;} // check battery level&lt;br /&gt;
        } // end if channel CHANATTACH&lt;br /&gt;
    }    &lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    // TIMER CALLED TO TURN OFF THE SPECIAL EFFECTS&lt;br /&gt;
    //------------------------------------------------------------------------&lt;br /&gt;
    timer() {&lt;br /&gt;
        EFFECTTIME--;&lt;br /&gt;
        if ( EFFECTTIME &amp;lt;= 0 ) { &lt;br /&gt;
            EFFECTOFF(); // turn off special effects&lt;br /&gt;
            EFFECTTIME=0; // make it zero anyway&lt;br /&gt;
        } // timer expired, turn off effect&lt;br /&gt;
        if ( POWERARMOR == TRUE &amp;amp;&amp;amp; ARMOR_ON == TRUE ) {&lt;br /&gt;
            BATTERY--; // remove some battery&lt;br /&gt;
            if ( BATTERY &amp;lt;= 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 ( EFFECTTIME &amp;lt;= 0 || ARMOR_ON == FALSE ) llSetTimerEvent(0.0); // all timers done, stop timer events&lt;br /&gt;
    } // end timer&lt;br /&gt;
} // end default&lt;br /&gt;
//============================================================================&lt;br /&gt;
// END&lt;br /&gt;
//============================================================================&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Allen Kerensky</name></author>	</entry>

	</feed>