#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD )

#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "weapons.h"
#include "monsters.h"
#include "player.h"
#include "gamerules.h"


enum saw_e {
SAW_SLOWIDLE = 0,
SAW_IDLE2,
SAW_RELOAD1,
SAW_RELOAD2,
SAW_HOLSTER,
SAW_DRAW,
SAW_SHOOT,
SAW_SHOOT2,
SAW_SHOOT3
};

LINK_ENTITY_TO_CLASS( weapon_saw, CSAW );
LINK_ENTITY_TO_CLASS( weapon_SAW, CSAW );

int CSAW::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "556";
p->iMaxAmmo1 = _556_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = SAW_MAX_CLIP;
p->iFlags = 0;
p->iSlot = 3;
p->iPosition = 0;
p->iId = m_iId = WEAPON_SAW;
p->iWeight = SAW_WEIGHT;

return 1;
}

int CSAW::AddToPlayer( CBasePlayer *pPlayer )
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}

void CSAW::Spawn( )
{
pev->classname = MAKE_STRING("weapon_saw"); // hack to allow for old names
Precache( );
m_iId = WEAPON_SAW;
SET_MODEL(ENT(pev), "models/w_saw.mdl");
m_iDefaultAmmo = SAW_DEFAULT_GIVE;
FallInit();// get ready to fall down.
}


void CSAW::Precache( void )
{
PRECACHE_MODEL("models/v_saw.mdl");
PRECACHE_MODEL("models/w_saw.mdl");
PRECACHE_MODEL("models/p_saw.mdl");
PRECACHE_MODEL("models/w_saw_clip.mdl");

PRECACHE_SOUND("items/9mmclip1.wav");
PRECACHE_SOUND ("weapons/saw_reload2.wav");
PRECACHE_SOUND ("weapons/357_cock1.wav");
PRECACHE_SOUND ("weapons/saw_fire1.wav");
PRECACHE_SOUND ("weapons/saw_fire2.wav");
PRECACHE_SOUND ("weapons/saw_fire3.wav");

m_iShell = PRECACHE_MODEL ("models/saw_shell.mdl");
m_iLink = PRECACHE_MODEL ("models/saw_link.mdl");

m_usFireSAW = PRECACHE_EVENT( 1, "events/saw.sc" );
}

BOOL CSAW::Deploy( )
{
UpdateClip();
return DefaultDeploy( "models/v_saw.mdl", "models/p_saw.mdl", SAW_DRAW, "mp5", UseDecrement() ? 1 : 0, pev->body );
}
void CSAW::Holster( int skiplocal /* = 0 */)
{
UpdateClip();
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0;
SendWeaponAnim( SAW_HOLSTER, UseDecrement() ? 1 : 0, pev->body );
}
void CSAW::PrimaryAttack()
{
UpdateClip();
if ( m_fInSpecialReload )
return;

// don't fire underwater
if (m_pPlayer->pev->waterlevel == 3)
{
PlayEmptySound( );
m_flNextPrimaryAttack = 0.15;
return;
}

if (m_iClip <= 0)
{
UpdateClip();
PlayEmptySound();
m_flNextPrimaryAttack = 0.15;
return;
}

m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;

m_iClip--;

UpdateClip();

m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;

// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
Vector vecSrc = m_pPlayer->GetGunPosition( );
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
Vector vecDir;
vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_4DEGREES, 8192, BULLET_PLAYER_556, 2, 0, m_pPlayer->pev, m_pPlayer->random_seed );

int flags;
#if defined( CLIENT_WEAPONS )
flags = FEV_NOTHOST;
#else
flags = 0;
#endif

PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireSAW, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, pev->body, 0, 0, 0 );

if (!m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)
// HEV suit - indicate out of ammo condition
m_pPlayer->SetSuitUpdate("!HEV_AMO0", FALSE, 0);

m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.0675;

if ( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() )
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.0675;

if ( !FBitSet( m_pPlayer->pev->flags, FL_DUCKING ) )
{
float flOldPlayerVel = m_pPlayer->pev->velocity.z;
m_pPlayer->pev->velocity = m_pPlayer->pev->velocity + (RANDOM_LONG( 20, 35 ) * -gpGlobals->v_forward);
m_pPlayer->pev->velocity.z = flOldPlayerVel;
}
UpdateClip();
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 7.0 / 30.0;
}

void CSAW::Reload( void )
{
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SAW_MAX_CLIP)
return;

if (m_iClip != 50 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] != 0 )
{
UpdateClip();
m_fInSpecialReload = 1;
DefaultReload( SAW_MAX_CLIP, SAW_RELOAD1, 1.5, pev->body );
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + (61 / 40)+(111 / 45);
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 61 / 40;
}
}
void CSAW::UpdateClip( void )
{
switch (m_iClip)
{
case 8:
pev->body = 1;
break;
case 7:
pev->body = 2;
break;
case 6:
pev->body = 3;
break;
case 5:
pev->body = 4;
break;
case 4:
pev->body = 5;
break;
case 3:
pev->body = 6;
break;
case 2:
pev->body = 7;
break;
case 1:
pev->body = 8;
break;
case 0:
pev->body = 8;
break;
default:
pev->body = 0;
break;
}
}
void CSAW::WeaponIdle( void )
{
if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
{
if ( m_fInSpecialReload )
{
UpdateClip();
m_fInSpecialReload = 0;
SendWeaponAnim( SAW_RELOAD2 , UseDecrement() ? 1 : 0, pev->body );
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 111.0 / 45.0;
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 111.0 / 45.0;
}
else
{
ResetEmptySound( );
UpdateClip();

int iAnim;
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
if (flRand <= 0.8)
{
iAnim = SAW_SLOWIDLE;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (45.0/9.0);
}
else
{
iAnim = SAW_IDLE2;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (74.0/12.0);// * RANDOM_LONG(2, 5);
}
SendWeaponAnim( iAnim , UseDecrement() ? 1 : 0, pev->body );
}
}
}



class C556Ammo : public CBasePlayerAmmo
{
void Spawn( void )
{
Precache( );
SET_MODEL(ENT(pev), "models/w_saw_clip.mdl");
CBasePlayerAmmo::Spawn( );
}
void Precache( void )
{
PRECACHE_MODEL ("models/w_saw_clip.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
}
BOOL AddAmmo( CBaseEntity *pOther )
{
if (pOther->GiveAmmo( AMMO_556_BOXGIVE, "556", _556_MAX_CARRY ) != -1)
{
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
return TRUE;
}
return FALSE;
}
};
LINK_ENTITY_TO_CLASS( ammo_556, C556Ammo );


#endif