<?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%2FFirearm</id>
		<title>User:Allen Kerensky/Myriad Lite Preview 5/Firearm - 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%2FFirearm"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Firearm&amp;action=history"/>
		<updated>2026-04-17T07:19:57Z</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/Firearm&amp;diff=27323&amp;oldid=prev</id>
		<title>Allen Kerensky: moved User:Allen Kerensky:Myriad Lite Preview 5:Firearm to User:Allen Kerensky/Myriad Lite Preview 5/Firearm: move into subsite</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=User:Allen_Kerensky/Myriad_Lite_Preview_5/Firearm&amp;diff=27323&amp;oldid=prev"/>
				<updated>2012-02-06T22:33:31Z</updated>
		
		<summary type="html">&lt;p&gt;moved &lt;a href=&quot;/wiki/User:Allen_Kerensky:Myriad_Lite_Preview_5:Firearm&quot; class=&quot;mw-redirect&quot; title=&quot;User:Allen Kerensky:Myriad Lite Preview 5:Firearm&quot;&gt;User:Allen Kerensky:Myriad Lite Preview 5:Firearm&lt;/a&gt; to &lt;a href=&quot;/wiki/User:Allen_Kerensky/Myriad_Lite_Preview_5/Firearm&quot; title=&quot;User:Allen Kerensky/Myriad Lite Preview 5/Firearm&quot;&gt;User:Allen Kerensky/Myriad Lite Preview 5/Firearm&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:33, 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/Firearm&amp;diff=27195&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/Firearm&amp;diff=27195&amp;oldid=prev"/>
				<updated>2012-02-06T16:56:26Z</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 Firearm =&lt;br /&gt;
&lt;br /&gt;
Many existing firearms can be adapted to fire Myriad Lite bullets.&lt;br /&gt;
&lt;br /&gt;
The main change needed is to add the bullet's damage class as a starting parameter in the llRezObject call which launches the bullet.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
# Create a firearm such as a pistol or rifle.&lt;br /&gt;
# Drag Drop the Firearm script from inventory into the firearm&lt;br /&gt;
# Drag and Drop in a gunshot sound.&lt;br /&gt;
# Drag and Drop the Myriad Lite Bullet you made into the firearm.&lt;br /&gt;
# Edit the Firearm script to have the correct gunshot sound name.&lt;br /&gt;
# Edit the Firearm script to have the correct bullet object name.&lt;br /&gt;
# Take the firearm into inventory.&lt;br /&gt;
# Attach it to your right hand&lt;br /&gt;
# Adjust the position and rotation.&lt;br /&gt;
# Detach the firearm back into inventory again to &amp;quot;save&amp;quot; the new default attach point.&lt;br /&gt;
# Attach or wear the firearm when desired.&lt;br /&gt;
&lt;br /&gt;
== Myriad_Lite_Firearm-v1.5-20120130.lsl ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
//============================================================================&lt;br /&gt;
// Myriad_Lite_Firearm-v1.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-2012 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;
// Based on phillip linden (SL) gunscript&lt;br /&gt;
// With many refinements by Rhonin Nissondorf (SL)&lt;br /&gt;
// Retrieved 2011-04-30 from http://wiki.secondlife.com/wiki/Gun_Script&lt;br /&gt;
// Copyright (c) 2009 Linden Research, Inc.&lt;br /&gt;
// Licensed under Creative Commons Attribution-Share Alike 3.0 (CC-BY-SA 3.0)&lt;br /&gt;
// Converted to OSSL by Allen Kerensky (SL/OSG).&lt;br /&gt;
//===========================================================================&lt;br /&gt;
&lt;br /&gt;
//===========================================================================&lt;br /&gt;
// MESSAGE FORMAT REFERENCE&lt;br /&gt;
//===========================================================================&lt;br /&gt;
// CHANMYRIAD OUT - RPEVENT|str event_message&lt;br /&gt;
// CHANATTACH IN - REGISTERATTACHMENTS&lt;br /&gt;
// CHANATTACH OUT - ATTACHRANGED|int damagedice|int attachpoint|str attachmentname&lt;br /&gt;
// CHANATTACH OUT - DETACHRANGED|int damagedice|int attachpoint|str attachmentname&lt;br /&gt;
&lt;br /&gt;
//===========================================================================&lt;br /&gt;
// GLOBAL VARIABLES - variables to be changed  below.&lt;br /&gt;
//===========================================================================&lt;br /&gt;
float BULLET_VELOCITY = 30.0;                       // change this to change the speed of the bullet.&lt;br /&gt;
float REPEAT_DELAY = 0.20;                          // delay between bullets, i recommend you dont' set it to  low.&lt;br /&gt;
string gunsound = &amp;quot;pistol_shot.wav&amp;quot;;                            // string; name of sound in inventory&lt;br /&gt;
string ammo =  &amp;quot;Myriad Lite Bullet v0.0.3 20110813&amp;quot;; //name of desired object to be shot out. Must be in the inventory of the &amp;quot;gun&amp;quot;.&lt;br /&gt;
integer ATTACH_HAND = 6;                            // left hand = 5, right hand = 6&lt;br /&gt;
string SAFETY_OFF_MESSAGE = &amp;quot;The safety is now OFF.&amp;quot;; //message when you touch it.&lt;br /&gt;
string SAFETY_ON_MESSAGE = &amp;quot;The safety is now ON.&amp;quot;;        // a message when you... &lt;br /&gt;
string NOT_OWNER = &amp;quot;You are not the owner of this weapon.&amp;quot;; //message when non-owner touches it - assumes a sci-fi-like grip with owner ID&lt;br /&gt;
string ANIM_HOLD = &amp;quot;hold_R_handgun&amp;quot;;                // animation to use when holding pistol&lt;br /&gt;
string ANIM_AIM  = &amp;quot;PistolRightSteady1&amp;quot;;            // animation to use when aiming in mouselook&lt;br /&gt;
float  TIMER_RES = 0.5;                             // time in seconds to check for mouselook to start aim animation, like an AO&lt;br /&gt;
integer AVSTATE  = 0;                               // is av in mouselook?&lt;br /&gt;
vector OFFSET = &amp;lt;1.10, -0.25, 0.75&amp;gt;;                // rez offset for bullet&lt;br /&gt;
vector OFFSET_LEFT  = &amp;lt;1.10,  0.25, 0.75&amp;gt;;                // rez offset for bullet&lt;br /&gt;
vector OFFSET_RIGHT = &amp;lt;1.10, -0.25, 0.75&amp;gt;;                // rez offset for bullet&lt;br /&gt;
integer CHANMYRIAD = -999;                      // regionwide RPEVENT channel for Myriad&lt;br /&gt;
string DIV = &amp;quot;|&amp;quot;;                               // field divider between parts of Myriad messages&lt;br /&gt;
// Myriad Ranged Weapons Damage Dice, PDF page 64, Myriad Special Edition page 98&lt;br /&gt;
// 1 die of damage = small stones thrown by hand (or in crude sling)&lt;br /&gt;
// 2 die of damage = throwing knife, derringer, hand catapult, thrown house brick&lt;br /&gt;
// 3 die of damage = throwing axe, pistol, hunting rifle, automatic pistol (full auto)&lt;br /&gt;
// 4 die of damage = very heavy pistol (Magnum), assault rifle (full auto), shotgun&lt;br /&gt;
// 5 die of damage = high velocity sniper rifle, heavy calibre machine gun (full auto)&lt;br /&gt;
integer DAMAGEDICE = 3;                             // many damage dice does this bullet do in Myriad? default to pistol here&lt;br /&gt;
integer MAXAMMO = 30; // 30 round clip&lt;br /&gt;
&lt;br /&gt;
//===========================================================================&lt;br /&gt;
// GLOBAL RUNTIMES - runtime variables we change as we go&lt;br /&gt;
// Don't alter anything below if your not  familiar with it.&lt;br /&gt;
//===========================================================================&lt;br /&gt;
integer SAFETY_ON = TRUE;  // is this weapon safety on or off by default?&lt;br /&gt;
vector pos;         // holds our current position temporarily  &lt;br /&gt;
rotation rot;       // holds our current rotation temporarily&lt;br /&gt;
vector offset;      // holds an offset to where to rez the bullet based on position and rotation   &lt;br /&gt;
integer CHANATTACH = 0; // dynamic channel for attachment messages&lt;br /&gt;
integer HANDATTACH = 0; // chat channel handle for attachment dynamic channel&lt;br /&gt;
integer AMMOLEFT; // how much ammo is left?&lt;br /&gt;
&lt;br /&gt;
//===========================================================================&lt;br /&gt;
// GLOBAL SETUP&lt;br /&gt;
//===========================================================================&lt;br /&gt;
SETUP() {&lt;br /&gt;
    CHANATTACH = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetOwner(),1,7)); // calculate the dynamic attachment channel&lt;br /&gt;
    HANDATTACH = llListen(CHANATTACH,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;); // start a listener on the attachment channel&lt;br /&gt;
    llWhisper(CHANATTACH,&amp;quot;ATTACHRANGED&amp;quot;+DIV+(string)DAMAGEDICE+DIV+(string)llGetAttached()+DIV+llGetObjectName()); // inform the player HUD that we're using a weapon to turn off fist fighter&lt;br /&gt;
    llOwnerSay(&amp;quot;Attach me to your right hand, and enter mouselook to fire!&amp;quot;);    &lt;br /&gt;
    // ask for permission to trigger animations, take controls, and attach to avatar&lt;br /&gt;
    llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS|PERMISSION_ATTACH);&lt;br /&gt;
    llPreloadSound(gunsound); // try pre-loading the gunsound for everyone around&lt;br /&gt;
    if ( SAFETY_ON == TRUE ) { // lets tell owner the state of the safety&lt;br /&gt;
        if ( llGetAttached() == 5 ) HOLSTER(&amp;quot;left&amp;quot;); // safety on? start holstered&lt;br /&gt;
        if ( llGetAttached() == 6 ) HOLSTER(&amp;quot;right&amp;quot;); // safety on? start holstered&lt;br /&gt;
    } else { // safety is not on&lt;br /&gt;
        if ( llGetAttached() == 5 ) DRAW(&amp;quot;left&amp;quot;); // safety off! start drawn&lt;br /&gt;
        if ( llGetAttached() == 6 ) DRAW(&amp;quot;right&amp;quot;); // safety off! start drawn&lt;br /&gt;
    }&lt;br /&gt;
    RELOAD(); // start the weapon with a full clip&lt;br /&gt;
    llSetTimerEvent(TIMER_RES); // start a timer running to check for mouselook and start aim animations or not&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SAFETY OFF - turn off safety and enable firing&lt;br /&gt;
SAFETYOFF() {&lt;br /&gt;
    SAFETY_ON = FALSE; // switch the safety off&lt;br /&gt;
    llOwnerSay(SAFETY_OFF_MESSAGE); // and tell them&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// SAFETY ON - turn on safety&lt;br /&gt;
SAFETYON() {&lt;br /&gt;
    SAFETY_ON = TRUE; // switch the safety on&lt;br /&gt;
    llOwnerSay(SAFETY_ON_MESSAGE); // and tell them    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// DRAW THE WEAPON&lt;br /&gt;
DRAW(string hand) {&lt;br /&gt;
    // draw code goes here - turn copy in hand visible?&lt;br /&gt;
    if ( llGetAttached() == 5 &amp;amp;&amp;amp; ( hand == &amp;quot;left&amp;quot; || hand == &amp;quot;both&amp;quot; ) ) {&lt;br /&gt;
        llRegionSay(CHANMYRIAD,llKey2Name(llGetOwner())+&amp;quot; draws a weapon with their left hand.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Left hand weapon drawn.&amp;quot;);&lt;br /&gt;
        llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES);        &lt;br /&gt;
    }&lt;br /&gt;
    if ( llGetAttached() == 6 &amp;amp;&amp;amp; ( hand == &amp;quot;right&amp;quot; || hand == &amp;quot;both&amp;quot; ) ) {&lt;br /&gt;
        llRegionSay(CHANMYRIAD,llKey2Name(llGetOwner())+&amp;quot; draws a weapon with their right hand.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Right hand weapon drawn.&amp;quot;);&lt;br /&gt;
        llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES);        &lt;br /&gt;
    }&lt;br /&gt;
    SAFETYOFF(); // unholster and turn off safety&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// HOLSTER THE WEAPON&lt;br /&gt;
HOLSTER(string hand) {&lt;br /&gt;
    // holster code goes here - turn copy in hand invisible?&lt;br /&gt;
    if ( llGetAttached() == 5 &amp;amp;&amp;amp; ( hand == &amp;quot;left&amp;quot; || hand == &amp;quot;both&amp;quot; ) ) {&lt;br /&gt;
        llRegionSay(CHANMYRIAD,llKey2Name(llGetOwner())+&amp;quot; holsters their left-hand weapon.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Left hand weapon holstered.&amp;quot;);&lt;br /&gt;
        llSetLinkAlpha(LINK_SET,0.0,ALL_SIDES);        &lt;br /&gt;
    }&lt;br /&gt;
    if ( llGetAttached() == 6 &amp;amp;&amp;amp; ( hand == &amp;quot;right&amp;quot; || hand == &amp;quot;both&amp;quot; ) ) {&lt;br /&gt;
        llRegionSay(CHANMYRIAD,llKey2Name(llGetOwner())+&amp;quot; holsters their right-hand weapon.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Right hand weapon holstered.&amp;quot;);&lt;br /&gt;
        llSetLinkAlpha(LINK_SET,0.0,ALL_SIDES);        &lt;br /&gt;
    }&lt;br /&gt;
    SAFETYON(); // turn on safety before holstering&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// RELOAD THE WEAPON&lt;br /&gt;
RELOAD() {&lt;br /&gt;
    AMMOLEFT = MAXAMMO;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// CHECK AMMO LEFT&lt;br /&gt;
CHECKAMMO() {&lt;br /&gt;
    if ( AMMOLEFT &amp;gt; MAXAMMO ) { AMMOLEFT = MAXAMMO; } // don't overflow clip&lt;br /&gt;
    if ( AMMOLEFT &amp;lt; 0 ) { AMMOLEFT = 0; } // can't have negative bullets&lt;br /&gt;
    llOwnerSay(&amp;quot;Ammo remaining: &amp;quot;+(string)AMMOLEFT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//===========================================================================&lt;br /&gt;
// STATE DEFAULT - the main state is the default state.&lt;br /&gt;
// When a script is compiled, reset or loaded, this is the state it enters by default.&lt;br /&gt;
//===========================================================================&lt;br /&gt;
default {&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // STATE_ENTRY EVENT - Triggered on any state transition and start up&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        SETUP(); // call global setup&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // ON_REZ EVENT - Triggered when object attached or rezzed on the ground&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    on_rez(integer rezparams) {&lt;br /&gt;
        rezparams = 0; // LSLINT&lt;br /&gt;
        SETUP();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // ATTACH EVENT - when the object is attached or detached&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    attach(key id) {&lt;br /&gt;
        if ( id == NULL_KEY) { // if id is null key, this is a detach event&lt;br /&gt;
            llRegionSay(CHANMYRIAD,&amp;quot;RPEVENT&amp;quot;+DIV+llKey2Name(llGetOwner())+ &amp;quot; puts away their &amp;quot;+llGetObjectName());&lt;br /&gt;
            llWhisper(CHANATTACH,&amp;quot;DETACHRANGED&amp;quot;+DIV+(string)DAMAGEDICE+DIV+(string)llGetAttached()+DIV+llGetObjectName()); // inform the player HUD that we're using a weapon to turn on fist fighter&lt;br /&gt;
            integer perms = llGetPermissions(); // what permissions does object have&lt;br /&gt;
            if ( perms &amp;amp; PERMISSION_TRIGGER_ANIMATION ) { // if object has permission to change animations&lt;br /&gt;
                llStopAnimation(ANIM_HOLD); // stop the 'hold a weapon' animation since we're detaching&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // RUN_TIME_PERMISSIONS EVENT - triggered when avatar grants permissions to object&lt;br /&gt;
    // some permissions automatically granted on attach or sit - but you should STILL check correctly for those&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    run_time_permissions(integer perm) {&lt;br /&gt;
        if ( perm &amp;amp; PERMISSION_TAKE_CONTROLS ) { // was object granted permission to read control events?&lt;br /&gt;
            llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE); // start reading the left mouse button in mouselook mode&lt;br /&gt;
        }&lt;br /&gt;
        if ( perm &amp;amp; PERMISSION_TRIGGER_ANIMATION ) { // was object granted permission to trigger animations?&lt;br /&gt;
            llStartAnimation(ANIM_HOLD); // start the 'hold a weapon' animation&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // TOUCH_START EVENT - trigger at the start of someone clicking on the object&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    touch_start(integer touches) {  // Triggered by the start of agent clicking on object&lt;br /&gt;
        while (touches--) { // count down through each touch event&lt;br /&gt;
            key who = llDetectedKey(touches); // get the key of who triggered the touch&lt;br /&gt;
            if ( llGetOwner() != who ) { // if not the owner&lt;br /&gt;
                llInstantMessage(who,NOT_OWNER); // tell them&lt;br /&gt;
            } if ( SAFETY_ON == TRUE ) { // lets tell owner the state of the safety&lt;br /&gt;
                SAFETY_ON = FALSE;&lt;br /&gt;
                if ( llGetAttached() == 5 ) DRAW(&amp;quot;left&amp;quot;); // safety off! start drawn&lt;br /&gt;
                if ( llGetAttached() == 6 ) DRAW(&amp;quot;right&amp;quot;); // safety off! start drawn&lt;br /&gt;
            } else if (SAFETY_ON == FALSE ) { // safety is not on&lt;br /&gt;
                SAFETY_ON = TRUE;&lt;br /&gt;
                if ( llGetAttached() == 5 ) HOLSTER(&amp;quot;left&amp;quot;); // safety on? start holstered&lt;br /&gt;
                if ( llGetAttached() == 6 ) HOLSTER(&amp;quot;right&amp;quot;); // safety on? start holstered&lt;br /&gt;
            }&lt;br /&gt;
        } // end while&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // CHANGED EVENT - various changes to object can trigger this event&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    changed(integer change) {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER) { // did the object change owner through a give or drop/take?&lt;br /&gt;
            integer perms = llGetPermissions(); // what permissions does object have?&lt;br /&gt;
            if ( perms &amp;amp; PERMISSION_TRIGGER_ANIMATION ) { // if object has permission to change animations&lt;br /&gt;
                llStopAnimation(ANIM_HOLD); // stop the 'hold a weapon' animation'&lt;br /&gt;
            }&lt;br /&gt;
            llResetScript(); // and reset the entire script&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // EVENT CONTROL - called for user input we've requested with LLTAKECONTROLS&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    control(key owner, integer level, integer edge) {&lt;br /&gt;
        owner = NULL_KEY; // LSLINT&lt;br /&gt;
        if ( SAFETY_ON == TRUE ) { // check the safety before shooting&lt;br /&gt;
            llOwnerSay(&amp;quot;The safety is ON.&amp;quot;); // warn owner they are shooting with safety on&lt;br /&gt;
            return; // return now to prevent running the rest of the shooting code&lt;br /&gt;
        }&lt;br /&gt;
        integer pressed = level &amp;amp; edge; // level is when you click ,edge would be if you let up.&lt;br /&gt;
        if ( pressed &amp;amp; CONTROL_ML_LBUTTON ) { // if left mouse button was pressed in MouseLook mode&lt;br /&gt;
            if ( AMMOLEFT &amp;lt;= 0 ) { &lt;br /&gt;
                llOwnerSay(&amp;quot;Out of ammo! Reload!&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            // Fire 1 bullet,,  the heart of the firearm script.&lt;br /&gt;
            pos = llGetPos(); // get our current position&lt;br /&gt;
            rot = llGetRot(); // get our current rotation&lt;br /&gt;
            offset = OFFSET; // start with the base offset for the gun held in the right hand&lt;br /&gt;
            if ( ATTACH_HAND == 5 ) { // is weapon in left hand?&lt;br /&gt;
                offset = OFFSET_LEFT; // use the left-hand offset&lt;br /&gt;
            }&lt;br /&gt;
            if ( ATTACH_HAND == 6 ) { // is weapon in right hand?&lt;br /&gt;
                offset = OFFSET_RIGHT; // use the right hand offset&lt;br /&gt;
            }&lt;br /&gt;
            offset *= rot; // now, rotate the offset to match the avatar rotation&lt;br /&gt;
            pos += offset; // now combine the rotated offset with avatar position &lt;br /&gt;
            vector fwd = llRot2Fwd(rot); // calculate the direction that is &amp;quot;avatar's facing&amp;quot; &lt;br /&gt;
            fwd *= BULLET_VELOCITY; // now multiply that by bullet speed to tell bullet to push in that direction, that fast&lt;br /&gt;
            rot *= llEuler2Rot(&amp;lt;0, PI_BY_TWO, 0&amp;gt;); // now, straighten rotation for object we're about to rez&lt;br /&gt;
            llPlaySound(gunsound,1.0); // here &amp;quot;gunsound&amp;quot;is a variable defined above.&lt;br /&gt;
            // DAMAGEDICE is passed to rez-param of bullet. Myriad Bullets read this as damage dice to do if they hit&lt;br /&gt;
            AMMOLEFT--;&lt;br /&gt;
            llRezObject(ammo, pos, fwd, rot, DAMAGEDICE); // does the actual work rezzes the ammo in the specified variables.&lt;br /&gt;
            llSleep(REPEAT_DELAY); // force a pause between shots&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // LISTEN EVENT - listen for whisper, say, shout, regionsay messages&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    listen(integer channel, string name, key uuid, string message) {&lt;br /&gt;
        name = &amp;quot;&amp;quot;; // LSLINT&lt;br /&gt;
        uuid = NULL_KEY; // LSLINT&lt;br /&gt;
        if ( channel == CHANATTACH ) { // did message come in on attachment channel?&lt;br /&gt;
            if ( message == &amp;quot;REGISTERATTACHMENTS&amp;quot; ) { // request from a HUD to register attachments already in use&lt;br /&gt;
                llWhisper(CHANATTACH,&amp;quot;ATTACHRANGED&amp;quot;+DIV+(string)DAMAGEDICE+DIV+(string)llGetAttached()+DIV+llGetObjectName()); // inform the player HUD that we're using a weapon to turn off fist fighter&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            if ( message == &amp;quot;DRAWLEFT&amp;quot; ) { DRAW(&amp;quot;left&amp;quot;); return;} // draw pistol if in left hand&lt;br /&gt;
            if ( message == &amp;quot;DRAWRIGHT&amp;quot; ) { DRAW(&amp;quot;right&amp;quot;); return;} // draw pistol in right hand&lt;br /&gt;
            if ( message == &amp;quot;DRAWBOTH&amp;quot; ) { DRAW(&amp;quot;both&amp;quot;); return; } // draw pistols in both hands&lt;br /&gt;
            if ( message == &amp;quot;HOLSTERLEFT&amp;quot; ) { HOLSTER(&amp;quot;left&amp;quot;); return;} // holster left-hand pistol&lt;br /&gt;
            if ( message == &amp;quot;HOLSTERRIGHT&amp;quot; ) { HOLSTER(&amp;quot;right&amp;quot;); return;} // holster right-hand pistol&lt;br /&gt;
            if ( message == &amp;quot;HOLSTERBOTH&amp;quot; ) { HOLSTER(&amp;quot;both&amp;quot;); return; } // holster both pistols&lt;br /&gt;
            if ( message == &amp;quot;SAFETYOFF&amp;quot; ) { SAFETYOFF(); return; } // unsafe the weapon&lt;br /&gt;
            if ( message == &amp;quot;SAFETYON&amp;quot; ) { SAFETYON(); return; } // safe the weapon&lt;br /&gt;
            if ( message == &amp;quot;CHECKAMMO&amp;quot; ) { CHECKAMMO(); return; } // check ammo left&lt;br /&gt;
            if ( message == &amp;quot;RELOAD&amp;quot; ) { RELOAD(); return; } // reload the clip            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    // TIMER EVENT - called regularly as an animation override for holding or aiming weapon&lt;br /&gt;
    //-----------------------------------------------------------------------&lt;br /&gt;
    timer() {&lt;br /&gt;
        if ( SAFETY_ON == TRUE ) return; // if safety is on, don't need to do weapon hold and aim animation&lt;br /&gt;
        AVSTATE = llGetAgentInfo(llGetOwner()); // get an integer that holds the current state of the avatar to see if they are in mouselook or not&lt;br /&gt;
        if ( AVSTATE &amp;amp; 0x0008 ) { // 0x0008 = AGENT_MOUSELOOK constant - this hack needed on OpenSim&lt;br /&gt;
            llStopAnimation(ANIM_HOLD); // stop the 'just hold a weapon' animation&lt;br /&gt;
            llSleep(0.05); // wait a little&lt;br /&gt;
            llStartAnimation(ANIM_AIM); // start the aiming weapon animation&lt;br /&gt;
        } else { // avatar is not in mouselook&lt;br /&gt;
            llStopAnimation(ANIM_AIM); // stop the aiming animation&lt;br /&gt;
            llSleep(0.05); // wait a little&lt;br /&gt;
            llStartAnimation(ANIM_HOLD); // now start the just holding a weapon animation&lt;br /&gt;
        }&lt;br /&gt;
        AVSTATE = 0; // clean up or reset the avatar state variable&lt;br /&gt;
    }&lt;br /&gt;
} // end of 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>