string sound;
string bullet;
integer gAttachPart = ATTACH_RHAND;
string INSTR_HELD_1 = "Enter Mouselook (press 'M') to shoot me.";
string INSTR_HELD_2 = "Right-click and choose 'Detach' to take me off.";
string INSTR_NOT_HELD_1 = "To wear and use me, right click and choose";
string INSTR_NOT_HELD_2 = "Acquire -> Attach -> Right Hand.";
string INSTR_NOT_OWNER_1 = "To use this gun, take it (right-click and choose 'Take'.)";
string INSTR_NOT_OWNER_2 = "Then, drag it from your inventory onto yourself.";
integer gDesiredPerm;
integer gHavePermissions;
// Bullet travel speed
float gBulletSpeed = 45.0;
float gLastFireTime = 0;
float gTapReloadTime = 0.01;
float gHoldReloadTime = 2;
float gOutOfAmmoReloadTime = 0.1;
integer gAmmoClipSize = 45;
integer gAmmo;
vector gEyeOffset = <0.0, 0.0, 0.84>;
say(string msg)
{
llSay(0, msg);
}
debug(string msg)
{
// llSay(0, msg);
}
func_debug(string msg)
{
}
default
{
on_rez(integer start_param)
{
func_debug("on_rez"

vector size = llGetAgentSize(llGetOwner());
gEyeOffset.z = gEyeOffset.z * (size.z / 2.0);
llWhisper(0,"Press 'M' to enter mouslook and the mouse button to fire"

}
state_entry()
{
func_debug("default state_entry"

gHavePermissions = FALSE;
gDesiredPerm = (PERMISSION_TAKE_CONTROLS
| PERMISSION_TRIGGER_ANIMATION);
gAmmo = gAmmoClipSize;
llResetTime();
}
touch_start(integer tnum)
{
func_debug("touch_start"

if ( llDetectedKey(0) == llGetOwner() )
{
if ( gHavePermissions )
{
} else
{
}
} else
{
// Not the owner
}
}
listen(integer channel,string name, key id, string message)
{
if(message == "SG on"

{
sound = "grenade1";
}
if (message == "SG off"

{
sound = "MG";
}
if (message == "SA on"

{
llTriggerSound("SA", 0.7);
sound = "SA";
gTapReloadTime = 1.00;
gHoldReloadTime = 1.00;
}
if (message == "FA on"

{
llTriggerSound("MG", 0.7);
sound = "MG";
gTapReloadTime = 0.01;
gHoldReloadTime = 0.01;
}
if (message == "push on"

{
bullet == "PBullet";
}
if (message == "push off"

{
bullet == "Bullet";
}
}
attach(key av_key)
{
func_debug("attach"

if (av_key != NULL_KEY)
{
if ( av_key != llGetOwner() )
{
llWhisper(0, INSTR_NOT_OWNER_1);
llWhisper(0, INSTR_NOT_OWNER_2);
return;
}
llRequestPermissions(av_key, gDesiredPerm);
} else
{
func_debug(" detach"

if ( gHavePermissions )
{
llStopAnimation("hold_R_rifle"

llReleaseControls();
llSetRot(<0.0, 0.0, 0.0, 1.0>

gHavePermissions = FALSE;
}
}
}
run_time_permissions(integer perm)
{
func_debug("run_time_permissions"

if ( (perm & gDesiredPerm) == gDesiredPerm )
{
func_debug(" got perms"

gHavePermissions = TRUE;
llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
llStartAnimation("hold_R_rifle"

} else
{
func_debug(" didn't get perms"

// we didn't get them, kill ourselves
llDie();
}
}
// the player has used the controls, process them
control(key owner, integer level, integer edge)
{
func_debug("control"

float time = llGetTime();
if ( ( ((edge & level) & CONTROL_ML_LBUTTON)
&& (time > gTapReloadTime) )
|| ( (time > gHoldReloadTime)
&& (level & CONTROL_ML_LBUTTON) ) )
{
if ( (gAmmo >= 1) || (time > gOutOfAmmoReloadTime) )
{
// bang!
llTriggerSound("MG", 1.0);
llResetTime();
vector my_pos = llGetPos() + gEyeOffset;
rotation my_rot = llGetRot();
vector my_fwd = llRot2Fwd(my_rot);
llRezObject(bullet,
my_pos,
my_fwd * gBulletSpeed,
my_rot,
1);
llRezObject("shell", llGetPos(), llGetVel(),llGetRot(),1);
--gAmmo;
if ( gAmmo > 0 )
{
}
else if ( gAmmo == 0 )
{
llTriggerSound("pistol_reload.wav", 1.0);
}
else // gAmmo < 0
{
gAmmo = gAmmoClipSize - 1;
}
} else
{
debug("Can't shoot, reloading..."

}
}
} // control
} // default state