/***
*
*	Copyright (c) 1996-2002, Valve LLC. All rights reserved.
*	
*	This product contains software technology licensed from Id 
*	Software, Inc. ("Id Technology").  Id Technology (c) 1996 Id Software, Inc. 
*	All Rights Reserved.
*
*   Use, distribution, and modification of this source code and/or resulting
*   object code is restricted to non-commercial enhancements to products from
*   Valve LLC.  All other use, distribution, or modification is prohibited
*   without written permission from Valve LLC.
*
****/
#ifndef WEAPONS_H
#define WEAPONS_H

#include "effects.h"

class CBasePlayer;
extern int gmsgWeapPickup;

void DeactivateSatchels( CBasePlayer *pOwner );

// Contact Grenade / Timed grenade / Satchel Charge
/* removed by harSens
class CGrenade : public CBaseMonster
{
public:
	void Spawn( void );

	typedef enum { SATCHEL_DETONATE = 0, SATCHEL_RELEASE } SATCHELCODE;

	static CGrenade *ShootTimed( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time );
	static CGrenade *ShootContact( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity );
	static CGrenade *ShootSatchelCharge( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity );
	static void UseSatchelCharges( entvars_t *pevOwner, SATCHELCODE code );

	void Explode( Vector vecSrc, Vector vecAim );
	void Explode( TraceResult *pTrace, int bitsDamageType );
	void EXPORT Smoke( void );

	void EXPORT BounceTouch( CBaseEntity *pOther );
	void EXPORT SlideTouch( CBaseEntity *pOther );
	void EXPORT ExplodeTouch( CBaseEntity *pOther );
	void EXPORT DangerSoundThink( void );
	void EXPORT PreDetonate( void );
	void EXPORT Detonate( void );
	void EXPORT DetonateUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
	void EXPORT TumbleThink( void );

	virtual void BounceSound( void );
	virtual int	BloodColor( void ) { return DONT_BLEED; }
	virtual void Killed( entvars_t *pevAttacker, int iGib );

	BOOL m_fRegisteredSound;// whether or not this grenade has issued its DANGER sound to the world sound list yet.
};
*/

/* disabled by harSens
// constant items
#define ITEM_HEALTHKIT		1
#define ITEM_ANTIDOTE		2
#define ITEM_SECURITY		3
#define ITEM_BATTERY		4

#define WEAPON_NONE				0
#define WEAPON_CROWBAR			1
#define	WEAPON_GLOCK			2
#define WEAPON_PYTHON			3
#define WEAPON_MP5				4
#define WEAPON_CHAINGUN			5
#define WEAPON_CROSSBOW			6
#define WEAPON_SHOTGUN			7
#define WEAPON_RPG				8
#define WEAPON_GAUSS			9
#define WEAPON_EGON				10
#define WEAPON_HORNETGUN		11
#define WEAPON_HANDGRENADE		12
#define WEAPON_TRIPMINE			13
#define	WEAPON_SATCHEL			14
#define	WEAPON_SNARK			15

#define WEAPON_ALLWEAPONS		(~(1<<WEAPON_SUIT))

#define WEAPON_SUIT				31	// ?????

#define MAX_WEAPONS			32
*/


#define MAX_NORMAL_BATTERY	100


// weapon weight factors (for auto-switching)   (-1 = noswitch)
/* disabled by harSens
#define CROWBAR_WEIGHT		0
#define GLOCK_WEIGHT		10
#define PYTHON_WEIGHT		15
#define MP5_WEIGHT			15
#define SHOTGUN_WEIGHT		15
#define CROSSBOW_WEIGHT		10
#define RPG_WEIGHT			20
#define GAUSS_WEIGHT		20
#define EGON_WEIGHT			20
#define HORNETGUN_WEIGHT	10
#define HANDGRENADE_WEIGHT	5
#define SNARK_WEIGHT		5
#define SATCHEL_WEIGHT		-10
#define TRIPMINE_WEIGHT		-10


// weapon clip/carry ammo capacities
#define URANIUM_MAX_CARRY		100
#define	_9MM_MAX_CARRY			250
#define _357_MAX_CARRY			36
#define BUCKSHOT_MAX_CARRY		125
#define BOLT_MAX_CARRY			50
#define ROCKET_MAX_CARRY		5
#define HANDGRENADE_MAX_CARRY	10
#define SATCHEL_MAX_CARRY		5
#define TRIPMINE_MAX_CARRY		5
#define SNARK_MAX_CARRY			15
#define HORNET_MAX_CARRY		8
#define M203_GRENADE_MAX_CARRY	10
*/
// the maximum amount of ammo each weapon's clip can hold
#define WEAPON_NOCLIP			-1

/*removed by harSen
//#define CROWBAR_MAX_CLIP		WEAPON_NOCLIP
#define GLOCK_MAX_CLIP			17
#define PYTHON_MAX_CLIP			6
#define MP5_MAX_CLIP			50
#define MP5_DEFAULT_AMMO		25
#define SHOTGUN_MAX_CLIP		8
#define CROSSBOW_MAX_CLIP		5
#define RPG_MAX_CLIP			1
#define GAUSS_MAX_CLIP			WEAPON_NOCLIP
#define EGON_MAX_CLIP			WEAPON_NOCLIP
#define HORNETGUN_MAX_CLIP		WEAPON_NOCLIP
#define HANDGRENADE_MAX_CLIP	WEAPON_NOCLIP
#define SATCHEL_MAX_CLIP		WEAPON_NOCLIP
#define TRIPMINE_MAX_CLIP		WEAPON_NOCLIP
#define SNARK_MAX_CLIP			WEAPON_NOCLIP


// the default amount of ammo that comes with each gun when it spawns
#define GLOCK_DEFAULT_GIVE			17
#define PYTHON_DEFAULT_GIVE			6
#define MP5_DEFAULT_GIVE			25
#define MP5_DEFAULT_AMMO			25
#define MP5_M203_DEFAULT_GIVE		0
#define SHOTGUN_DEFAULT_GIVE		12
#define CROSSBOW_DEFAULT_GIVE		5
#define RPG_DEFAULT_GIVE			1
#define GAUSS_DEFAULT_GIVE			20
#define EGON_DEFAULT_GIVE			20
#define HANDGRENADE_DEFAULT_GIVE	5
#define SATCHEL_DEFAULT_GIVE		1
#define TRIPMINE_DEFAULT_GIVE		1
#define SNARK_DEFAULT_GIVE			5
#define HIVEHAND_DEFAULT_GIVE		8

// The amount of ammo given to a player by an ammo item.
#define AMMO_URANIUMBOX_GIVE	20
#define AMMO_GLOCKCLIP_GIVE		GLOCK_MAX_CLIP
#define AMMO_357BOX_GIVE		PYTHON_MAX_CLIP
#define AMMO_MP5CLIP_GIVE		MP5_MAX_CLIP
#define AMMO_CHAINBOX_GIVE		200
#define AMMO_M203BOX_GIVE		2
#define AMMO_BUCKSHOTBOX_GIVE	12
#define AMMO_CROSSBOWCLIP_GIVE	CROSSBOW_MAX_CLIP
#define AMMO_RPGCLIP_GIVE		RPG_MAX_CLIP
#define AMMO_URANIUMBOX_GIVE	20
#define AMMO_SNARKBOX_GIVE		5
*/
#define MAX_POWER_RATIO				100.0
#define WEAPON_NONE					0
#define WEAPON_MELEE				1
#define WEAPON_SWORD				2
#define WEAPON_KIBLAST				3	
#define WEAPON_GENERICBEAM			4
#define WEAPON_GALLITGUN			5
#define WEAPON_KAMEHAMEHA			6
#define	WEAPON_DESTRUCTODISC		7
#define WEAPON_SOLARFLARE			8
#define WEAPON_EYELASER				9
#define WEAPON_FRIEZADISC			10
#define WEAPON_SPECIALBEAMCANNON	11
#define WEAPON_SPIRITBOMB			12
#define WEAPON_BIGBANG				13
#define WEAPON_FINGERLASER			14
#define WEAPON_FINALFLASH			15
#define	WEAPON_MASENKO				16
#define WEAPON_DEATHBALL			17
#define WEAPON_BURNINGATTACK		18
#define WEAPON_SCATTERBEAM			19
#define WEAPON_CANDY				20
#define WEAPON_SCATTERSHOT			21
#define WEAPON_POWERBEAM			22
#define WEAPON_MOUTHBLAST			23
#define WEAPON_FINISHINGBUSTER		24
#define WEAPON_SENSUBEAN			25
#define WEAPON_DRAGONBALL			26
#define WEAPON_BODYPART				27
#define WEAPON_SHIELDATTACK			28
#define WEAPON_REGENERATION			29
#define WEAPON_RENZOKU				30

#define WEAPON_SUIT				31	// ?????

//added by harSens
#define WEAPON_KAMETORPEDO			32
#define WEAPON_TELEKINESIS			33
#define WEAPON_FLAMETHROWER			34
#define WEAPON_PURPLEBALL			35

// added by ian
#define WEAPON_KIDRAIN				36

#define WEAPON_MAKOSEN				37



/* removed by harSens
#define WEAPON_ALLWEAPONS		(~(1<<WEAPON_SUIT))
*/

/* increased by harSens
#define MAX_WEAPONS				32
*/
#define MAX_WEAPONS				64

// weapon weight factors (for auto-switching)   (-1 = noswitch)
#define MELEE_WEIGHT				25
#define SWORD_WEIGHT				25
#define KIBLAST_WEIGHT				25
#define RENZOKU_WEIGHT				25
#define SHIELDATTACK_WEIGHT			20
#define SCATTERSHOT_WEIGHT			25
#define GENERICBEAM_WEIGHT			20
#define GALLITGUN_WEIGHT			15
#define KAMEHAMEHA_WEIGHT			15
#define MOUTHBLAST_WEIGHT			15
#define SPECIALBEAMCANNON_WEIGHT	15
#define SCATTERBEAM_WEIGHT			12
#define FINGERLASER_WEIGHT			15
#define TELEKINESIS_WEIGHT			15
#define BIGBANG_WEIGHT				10
#define MAKOSEN_WEIGHT				10
#define PURPLEBALL_WEIGHT			10
#define FINISHINGBUSTER_WEIGHT		10
#define DESTRUCTODISC_WEIGHT		10	
#define EYELASER_WEIGHT				20
#define MASENKO_WEIGHT				 5
#define SPIRITBOMB_WEIGHT			 5
#define DEATHBALL_WEIGHT			 5
#define FINALFLASH_WEIGHT			 5
#define POWERBEAM_WEIGHT			 5 
#define BURNINGATTACK_WEIGHT		 5
#define	KAMETORPEDO_WEIGHT			 5
#define	FLAMETHROWER_WEIGHT			 5
#define FRIEZADISC_WEIGHT			-1
#define SOLARFLARE_WEIGHT			-1
#define CANDY_WEIGHT				-1
#define BODYPART_WEIGHT				-1
#define SENSUBEAN_WEIGHT			-1
#define REGENERATION_WEIGHT			-1
#define KIDRAIN_WEIGHT				-1
#define DRAGONBALL_WEIGHT			100//autoselect db

#define CHARGETIME				0.20
// weapon max charge times * CHARGETIME seconds
#define GENERICBEAM_MAXCHARGETIME		 9
#define TELEKINESIS_MINCHARGETIME		 9
#define TELEKINESIS_MAXCHARGETIME		18
#define SPECIALBEAMCANNON_MAXCHARGETIME	21
#define KAMEHAMEHA_MAXCHARGETIME		36
//#define GALLITGUN_MAXCHARGETIME			24
#define MOUTHBLAST_MAXCHARGETIME		30
#define PURPLEBALL_MAXCHARGETIME		30
#define FINISHINGBUSTER_MAXCHARGETIME	30
#define MASENKO_MAXCHARGETIME			24
#define POWERBEAM_MAXCHARGETIME			20
#define FINALFLASH_MAXCHARGETIME		42
#define SCATTERBEAM_MAXCHARGETIME		42
#define BURNINGATTACK_MAXCHARGETIME		12
#define FINGERLASER_MAXCHARGETIME		15
#define SPIRITBOMB_MAXCHARGETIME		90
#define SPIRITBOMB2_MAXCHARGETIME		45
#define DEATHBALL_MAXCHARGETIME			45
#define DESTRUCTODISC_MAXCHARGETIME		30
#define SHIELDATTACK_MAXCHARGETIME		21
#define FRIEZADISC_MAXCHARGETIME		30
#define KAMETORPEDO_MAXCHARGETIME		21
#define FLAMETHROWER_MAXCHARGETIME		4 //in seconds

//max weapon sprite sizes
#define GUIDEDATTACK_SIZE		     50.0
#define SPIRITBOMB_SIZE				256.0
#define DEATHBALL_SIZE				 80.0
#define MAX_KIBLOB_SIZE				200.0

// the maximum amount of ammo each weapon's clip can hold
#define WEAPON_NOCLIP			-1

//Ki cost for the magic weapons
#define MELEE_KI_COST					 3
#define KAMETORPEDO_KI_COST				20
#define KIBLAST_PRIMARYKI_COST			20
#define KIBLAST_SECONDARYKI_COST		15
#define GENERICBEAM_KI_COST				10
#define KAMEHAMEHA_KI_COST				20
#define MOUTHBLAST_KI_COST				20
#define FINALFLASH_KI_COST				30
#define MASENKO_KI_COST					30
#define POWERBEAM_KI_COST				20
#define SPECIALBEAMCANNON_KI_COST		20
#define FINGERLASER_PRIMARYKI_COST		150
#define FINGERLASER_SECONDARYKI_COST	200
#define DESTRUCTODISC_KI_COST			25
#define FRIEZADISC_KI_COST			    25
#define SOLARFLARE_KI_COST			   500
#define SOLARFLARE_MAX_KI_COST		   750
#define EYELASER_KI_COST				50
#define SPIRITBOMB_KI_COST			     0
#define SPIRITBOMB2_KI_COST			     0
#define DEATHBALL_KI_COST			    20
#define PURPLEBALL_KI_COST				35
#define FINISHINGBUSTER_KI_COST			25
#define BURNINGATTACK_KI_COST			26
#define SCATTERBEAM_KI_COST				25
#define CANDY_KI_COST					15
#define REGENERATION_KI_COST			20
#define TELEKINESIS_KI_COST				2	
#define FLAMETHROWER_KI_COST			10

#define KIDRAIN_PERCENT_COST			10
#define KIDRAIN_MIN_COST				2
#define KIDRAIN_COOLDOWN				30 // how long until we can do this again
#define KIDRAIN_DRAIN_LENGTH			500 // how long we can drain for
#define KIDRAIN_DRAIN_AMT				500 // amount drained = drain_amt - distance
#define KIDRAIN_DRAIN_TICKS				4 // this is how many times we will drain ki during the drain
#define KIDRAIN_RADIUS					150

#define KIDRAIN_STOPTURBO_PERCENT		4 // x in 10 chance that kidrain will stop enemy turbo
#define KIDRAIN_STOPFLY_PERCENT		    8 // x in 10 chance that kidrain will stop enemy flying

// Added by Pcjoe
#define BEAMJUMP_KI_COST		   		 0.33 //relative beamjump cost (as compared to normal beam ki cost)
#define BLOCK_BLOW_KI_COST			    75
#define BLOW_KICK_KI_COST				35
#define	BLOBATTACK_KI_COST				35
#define SHIELDATTACK_KI_COST			8

#define REGENERATION_HEALTHGAIN		1

/*
//weapon speeds, bbox & trail test by harSens
#define GENERICBEAM_SPEED			10
#define GALLITGUN_SPEED				10
#define MOUTHBLAST_SPEED			10
#define KAMEHAMEHA_SPEED			10
#define KAMETORPEDO_SPEED			10
#define MASENKO_SPEED				10
#define FINALFLASH_SPEED			10
#define POWERBEAM_SPEED				10
#define BIGBANG_SPEED				10
#define FINISHINGBUSTER_SPEED		10
#define SPIRITBOMB_SPEED			10
#define DEATHBALL_SPEED				10
#define BURNINGATTACK_SPEED			10
#define SPECIALBEAMCANNON_SPEED		10
#define DESTRUCTODISC_SPEED			10
#define FRIEZADISC_SPEED			10
#define KIBLAST_SPEED				10
#define RENZOKU_SPEED				10
#define SCATTERSHOT_SPEED			10
#define SCATTERSHOT_CONTRACT_SPEED	10
#define SCATTERBEAM_SPEED			10
#define SENSU_SPEED					10
#define DRAGONBALL_SPEED			10
#define BODYPART_SPEED				10
#define SHIELDATTACK_SPEED			10
*/

//weapon speeds
#define GENERICBEAM_SPEED			1700
#define MOUTHBLAST_SPEED			1200
#define KAMEHAMEHA_SPEED			1150
//#define KAMEHAMEHA_SPEED			10

#define KAMETORPEDO_SPEED			1000
#define MASENKO_SPEED				1350
#define FINALFLASH_SPEED			1000
#define POWERBEAM_SPEED				1100
#define PURPLEBALL_SPEED			1500
#define FINISHINGBUSTER_SPEED		1900
#define SPIRITBOMB_SPEED			1000
#define DEATHBALL_SPEED				1900
#define BURNINGATTACK_SPEED			1800
#define SPECIALBEAMCANNON_SPEED		1700
#define DESTRUCTODISC_SPEED			 800
#define ROCK_SPEED					1200
#define FRIEZADISC_SPEED			1000
#define KIBLAST_SPEED				2000
#define SCATTERBEAM_SPEED			1500
#define SENSU_SPEED					 500
#define DRAGONBALL_SPEED			1000
#define BODYPART_SPEED				500
// Added by Pcjoe
#define SHIELDATTACK_SPEED			 900

//attacks rate of turn, when turning. 1 is immediate
#define MOUTHBLAST_ROT				0.25	//in 0.05 secs
#define GENERICBEAM_ROT				0.25
#define KAMEHAMEHA_ROT				0.1
#define MASENKO_ROT					0.1
#define FINALFLASH_ROT				0.05
#define POWERBEAM_ROT				0.12
#define BURNINGATTACK_ROT			0.25
#define SCATTERBEAM_ROT			    0.6		//in 0.3 secs
#define KAMETORPEDO_ROT			    0.4		//in 0.1 secs

//player speeds when charging
#define GENERICBEAM_PLAYERSLOWDOWN		0.75
#define PURPLEBALL_PLAYERSLOWDOWN		0.0
#define KAMEHAMEHA_PLAYERSLOWDOWN		0.5
#define MASENKO_PLAYERSLOWDOWN			0.5
#define POWERBEAM_PLAYERSLOWDOWN		0.25
#define MOUTHBLAST_PLAYERSLOWDOWN		0.5
#define FINALFLASH_PLAYERSLOWDOWN		0.0
#define BURNINGATTACK_PLAYERSLOWDOWN	0.0
#define REGENERATION_PLAYERSLOWDOWN		0.0
#define KAMETORPEDO_PLAYERSLOWDOWN		0.0
#define TELEKINESIS_PLAYERSLOWDOWN		0.0
#define FLAMETHROWER_PLAYERSLOWDOWN		0.0
// Added by Pcjoe
#define SHIELDATTACK_PLAYERSLOWDOWN		0.0


//weapon damage
#define EYELASER_DAMAGE				3
#define FLAMETHROWER_DAMAGE			4
#define KIBLAST_PRIMARYDAMAGE		7
#define KIBLAST_SECONDARYDAMAGE		5
#define BLOBATTACK_DAMAGE		    3
#define FINGERLASER_PRIMARYDAMAGE	25
#define FINGERLASER_SECONDARYDAMAGE	15
#define KICK_DAMAGE					8
#define PUNCH_DAMAGE				6
#define CANDY_DAMAGE				6
#define BODYPART_DAMAGE				2
#define ROCK_DAMAGE					5
// Pcjoe: Melee Damage
#define BLOW_KICK_DAMAGE			15
#define POWERHIT_DAMAGE				7
#define PREPUNCH_DMG_PINNED			2
#define PREPUNCH_DMG_REG			1
#define PREPUNCH_DMG_BLOCKMULTI		0.5
#define PREPUNCH_DMG_BEHINDNULTI	1.2

//damages per chargepoint
#define GENERICBEAM_DAMAGE			4
#define GENERICBALL_DAMAGE			3
#define KAMEHAMEHA_DAMAGE			4
#define ENVMODEL_DAMAGE				25
#define KAMETORPEDO_DAMAGE			3
#define MASENKO_DAMAGE				4
#define SPECIALBEAMCANNON_DAMAGE	6 //'cause of shorter chargetime
#define PURPLEBALL_DAMAGE			4
#define FINISHINGBUSTER_DAMAGE		3
#define FINALFLASH_DAMAGE			4
#define POWERBEAM_DAMAGE			4
#define BURNINGATTACK_DAMAGE		2
#define SPIRITBOMB_DAMAGE			3
#define DEATHBALL_DAMAGE			4
#define SCATTERBEAM_DAMAGE			3
#define MOUTHBLAST_DAMAGE			4
#define SHIELDATTACK_DAMAGE			3

#define GENERICBEAM_RADIUS			5
#define ENVMODEL_RADIUS				3
#define ROCK_RADIUS					80
#define KAMETORPEDO_RADIUS			5
#define KAMEHAMEHA_RADIUS			4
#define MASENKO_RADIUS				3
#define SPECIALBEAMCANNON_RADIUS	4 
#define FINGERLASER_RADIUS			2
#define FINISHINGBUSTER_RADIUS		6
#define PURPLEBALL_RADIUS			7
#define FINALFLASH_RADIUS			5
#define BURNINGATTACK_RADIUS		5
#define BURNINGATTACK_BLINDINGRADIUS	5
#define SPIRITBOMB_RADIUS			5
#define DEATHBALL_RADIUS			5
#define SCATTERBEAM_RADIUS			2
#define POWERBEAM_RADIUS			4
#define MOUTHBLAST_RADIUS			5
#define KIATTACK_RADIUS				80
#define SOLARFLARE_RADIUS			325
#define EYELASER_RADIUS				500
#define CANDYATTACK_RADIUS			500
#define FLAMETHROWER_MINRADIUS		10
#define FLAMETHROWER_MAXRADIUS		100

// Added by Pcjoe
#define SHIELDATTACK_RADIUS			110
#define SHIELDATTACK_START_RADIUS	40
#define SHIELDFIRINGRADIUS			4
#define BLOBATTACK_START_RADIUS		50
#define SOLARFLARE_BLIND_TIME       12
#define BURNINGATTACK_BLIND_TIME    3.5


// Pcjoe: Distance of MeleeBlows(how close you have to be to the player)
#define MELEE_RADIUS				95
#define EXP_PUSHBACK_FORCE			300
#define EXP_PUSHBACK_DMGMULTI		3

// bullet types
typedef	enum
{
	BULLET_NONE = 0,
	BULLET_PLAYER_9MM, // glock
	BULLET_PLAYER_MP5, // mp5
	BULLET_PLAYER_357, // python
	BULLET_PLAYER_BUCKSHOT, // shotgun
	BULLET_PLAYER_CROWBAR, // crowbar swipe

	BULLET_MONSTER_9MM,
	BULLET_MONSTER_MP5,
	BULLET_MONSTER_12MM,
} Bullet;


#define ITEM_FLAG_SELECTONEMPTY		1
#define ITEM_FLAG_NOAUTORELOAD		2
#define ITEM_FLAG_NOAUTOSWITCHEMPTY	4
#define ITEM_FLAG_LIMITINWORLD		8
#define ITEM_FLAG_EXHAUSTIBLE		16 // A player can totally exhaust their ammo supply and lose this weapon

#define WEAPON_IS_ONTARGET 0x40

typedef struct
{
	int		iSlot;
	int		iPosition;
	const char	*pszAmmo1;	// ammo 1 type
	int		iMaxAmmo1;		// max ammo 1
	const char	*pszAmmo2;	// ammo 2 type
	int		iMaxAmmo2;		// max ammo 2
	const char	*pszName;
	int		iMaxClip;
	int		iId;
	int		iFlags;
	int		iWeight;// this value used to determine this weapon's importance in autoselection.
} ItemInfo;

typedef struct
{
	const char *pszName;
	int iId;
} AmmoInfo;

// Items that the player has in their inventory that they can use
class CBasePlayerItem : public CBaseAnimating
{
public:
	virtual void SetObjectCollisionBox( void );

	virtual int		Save( CSave &save );
	virtual int		Restore( CRestore &restore );
	
	static	TYPEDESCRIPTION m_SaveData[];

	virtual int AddToPlayer( CBasePlayer *pPlayer );	// return TRUE if the item you want the item added to the player inventory
	virtual int AddDuplicate( CBasePlayerItem *pItem ) { return FALSE; }	// return TRUE if you want your duplicate removed from world
	void EXPORT DestroyItem( void );
	void EXPORT DefaultTouch( CBaseEntity *pOther );	// default weapon touch
	void EXPORT FallThink ( void );// when an item is first spawned, this think is run to determine when the object has hit the ground.
	void EXPORT Materialize( void );// make a weapon visible and tangible
	void EXPORT AttemptToMaterialize( void );  // the weapon desires to become visible and tangible, if the game rules allow for it
	CBaseEntity* Respawn ( void );// copy a weapon
	void FallInit( void );
	void CheckRespawn( void );
	virtual int GetItemInfo(ItemInfo *p) { return 0; };	// returns 0 if struct not filled out
	virtual BOOL CanDeploy( void ) { return TRUE; };
	virtual BOOL Deploy( )								// returns is deploy was successful
		 { return TRUE; };

	virtual BOOL CanHolster( void ) { return TRUE; };// can this weapon be put away right now?
	virtual void Holster( int skiplocal = 0 );
	virtual void UpdateItemInfo( void ) { return; };

	virtual void ItemPreFrame( void )	{ return; }		// called each frame by the player PreThink
	virtual void ItemPostFrame( void ) { return; }		// called each frame by the player PostThink

	virtual void Drop( void );
	virtual void Kill( void );
	virtual void AttachToPlayer ( CBasePlayer *pPlayer );

	virtual int PrimaryAmmoIndex() { return -1; };
	virtual int SecondaryAmmoIndex() { return -1; };

	virtual int UpdateClientData( CBasePlayer *pPlayer ) { return 0; }

	virtual CBasePlayerItem *GetWeaponPtr( void ) { return NULL; };

	static ItemInfo ItemInfoArray[ MAX_WEAPONS ];
	static AmmoInfo AmmoInfoArray[ MAX_AMMO_SLOTS ];

	CBasePlayer	*m_pPlayer;
	CBasePlayerItem *m_pNext;
	int		m_iId;												// WEAPON_???

	virtual int iItemSlot( void ) { return 0; }			// return 0 to MAX_ITEMS_SLOTS, used in hud

	int			iItemPosition( void ) { return ItemInfoArray[ m_iId ].iPosition; }
	const char	*pszAmmo1( void )	{ return ItemInfoArray[ m_iId ].pszAmmo1; }
	int			iMaxAmmo1( void )	{ return ItemInfoArray[ m_iId ].iMaxAmmo1; }
	const char	*pszAmmo2( void )	{ return ItemInfoArray[ m_iId ].pszAmmo2; }
	int			iMaxAmmo2( void )	{ return ItemInfoArray[ m_iId ].iMaxAmmo2; }
	const char	*pszName( void )	{ return ItemInfoArray[ m_iId ].pszName; }
	int			iMaxClip( void )	{ return ItemInfoArray[ m_iId ].iMaxClip; }
	int			iWeight( void )		{ return ItemInfoArray[ m_iId ].iWeight; }
	int			iFlags( void )		{ return ItemInfoArray[ m_iId ].iFlags; }

	// int		m_iIdPrimary;										// Unique Id for primary ammo
	// int		m_iIdSecondary;										// Unique Id for secondary ammo
};


// inventory items that 
class CBasePlayerWeapon : public CBasePlayerItem
{
public:
	virtual int		Save( CSave &save );
	virtual int		Restore( CRestore &restore );
	
	static	TYPEDESCRIPTION m_SaveData[];

	// generic weapon versions of CBasePlayerItem calls
	virtual int AddToPlayer( CBasePlayer *pPlayer );
	/*disabled by harSens
	virtual int AddDuplicate( CBasePlayerItem *pItem );

	virtual int ExtractAmmo( CBasePlayerWeapon *pWeapon ); //{ return TRUE; };			// Return TRUE if you can add ammo to yourself when picked up
	virtual int ExtractClipAmmo( CBasePlayerWeapon *pWeapon );// { return TRUE; };			// Return TRUE if you can add ammo to yourself when picked up

	virtual int AddWeapon( void ) { ExtractAmmo( this ); return TRUE; };	// Return TRUE if you want to add yourself to the player

	// generic "shared" ammo handlers
	BOOL AddPrimaryAmmo( int iCount, char *szName, int iMaxClip, int iMaxCarry );
	BOOL AddSecondaryAmmo( int iCount, char *szName, int iMaxCarry );
	*/

	virtual void UpdateItemInfo( void ) {};	// updates HUD state

	int m_iPlayEmptySound;
	int m_fFireOnEmpty;		// True when the gun is empty and the player is still holding down the
							// attack key(s)
	virtual BOOL PlayEmptySound( void );
	virtual void ResetEmptySound( void );

	virtual void SendWeaponAnim( int iAnim, int skiplocal = 1, int body = 0 );  // skiplocal is 1 if client is predicting weapon animations

	/*disabled by harSens
	virtual BOOL CanDeploy( void );
	virtual BOOL IsUseable( void );
	*/
	BOOL DefaultDeploy( char *szViewModel, char *szWeaponModel, int iAnim, char *szAnimExt, int skiplocal = 0, int body = 0 );
	/*disabled by harSens
	int DefaultReload( int iClipSize, int iAnim, float fDelay, int body = 0 );
	*/

	//added by harSens
	/**
	* Deploys a no-model weapon 
	* @param char *szAnimExt:The name of the animation extender in the models
	*/
	BOOL DefaultDeploy( char *szAnimExt );

	/**
	* Gets the powerratio for the player
	* @returns float: the power ratio
	*/
	float GetPowerRatio ();
	//end harSens add

	virtual void ItemPostFrame( void );	// called each frame by the player PostThink
	// called by CBasePlayerWeapons ItemPostFrame()
	virtual void PrimaryAttack( void ) { return; }				// do "+ATTACK"
	virtual void SecondaryAttack( void ) { return; }			// do "+ATTACK2"
	/*
	virtual void Reload( void ) { return; }						// do "+RELOAD"
	*/
	virtual void WeaponIdle( void ) { return; }					// called when no buttons pressed
	virtual int UpdateClientData( CBasePlayer *pPlayer );		// sends hud info to client dll, if things have changed
	virtual void RetireWeapon( void );
	virtual BOOL ShouldWeaponIdle( void ) {return FALSE; };
	virtual void Holster( int skiplocal = 0 );
	virtual BOOL UseDecrement( void ) { return FALSE; };

	// Added by Pcjoe
	virtual BOOL HolsterWhenMeleed( void ) { return FALSE; }
	
	int	PrimaryAmmoIndex(); 
	int	SecondaryAmmoIndex(); 

	void PrintState( void );

	virtual CBasePlayerItem *GetWeaponPtr( void ) { return (CBasePlayerItem *)this; };

	float m_flPumpTime;
	int		m_fInSpecialReload;									// Are we in the middle of a reload for the shotguns
	float	m_flNextPrimaryAttack;								// soonest time ItemPostFrame will call PrimaryAttack
	float	m_flNextSecondaryAttack;							// soonest time ItemPostFrame will call SecondaryAttack
	float	m_flTimeWeaponIdle;									// soonest time ItemPostFrame will call WeaponIdle
	int		m_iPrimaryAmmoType;									// "primary" ammo index into players m_rgAmmo[]
	int		m_iSecondaryAmmoType;								// "secondary" ammo index into players m_rgAmmo[]
	int		m_iClip;											// number of shots left in the primary weapon clip, -1 it not used
	int		m_iClientClip;										// the last version of m_iClip sent to hud dll
	int		m_iClientWeaponState;								// the last version of the weapon state sent to hud dll (is current weapon, is on target)
	int		m_fInReload;										// Are we in the middle of a reload;

	int		m_iDefaultAmmo;// how much ammo you get when you pick up this weapon as placed by a level designer.

};


class CBasePlayerAmmo : public CBaseEntity
{
public:
	virtual void Spawn( void );
	void EXPORT DefaultTouch( CBaseEntity *pOther ); // default weapon touch
	virtual BOOL AddAmmo( CBaseEntity *pOther ) { return TRUE; };

	CBaseEntity* Respawn( void );
	void EXPORT Materialize( void );
};


extern DLL_GLOBAL	short	g_sModelIndexLaser;// holds the index for the laser beam
extern DLL_GLOBAL	const char *g_pModelNameLaser;

extern DLL_GLOBAL	short	g_sModelIndexLaserDot;// holds the index for the laser beam dot
extern DLL_GLOBAL	short	g_sModelIndexFireball;// holds the index for the fireball
extern DLL_GLOBAL	short	g_sModelIndexSmoke;// holds the index for the smoke cloud
extern DLL_GLOBAL	short	g_sModelIndexWExplosion;// holds the index for the underwater explosion
extern DLL_GLOBAL	short	g_sModelIndexBubbles;// holds the index for the bubbles model
extern DLL_GLOBAL	short	g_sModelIndexBloodDrop;// holds the sprite index for blood drops
extern DLL_GLOBAL	short	g_sModelIndexBloodSpray;// holds the sprite index for blood spray (bigger)

extern void ClearMultiDamage(void);
extern void ApplyMultiDamage(entvars_t* pevInflictor, entvars_t* pevAttacker );
extern void AddMultiDamage( entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType);

extern void DecalGunshot( TraceResult *pTrace, int iBulletType );
extern void SpawnBlood(Vector vecSpot, int bloodColor, float flDamage);
extern int DamageDecal( CBaseEntity *pEntity, int bitsDamageType );
extern void RadiusDamage( Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType );

typedef struct 
{
	CBaseEntity		*pEntity;
	float			amount;
	int				type;
} MULTIDAMAGE;

extern MULTIDAMAGE gMultiDamage;


#define LOUD_GUN_VOLUME			1000
#define NORMAL_GUN_VOLUME		600
#define QUIET_GUN_VOLUME		200

#define	BRIGHT_GUN_FLASH		512
#define NORMAL_GUN_FLASH		256
#define	DIM_GUN_FLASH			128

#define BIG_EXPLOSION_VOLUME	2048
#define NORMAL_EXPLOSION_VOLUME	1024
#define SMALL_EXPLOSION_VOLUME	512

#define	WEAPON_ACTIVITY_VOLUME	64

#define VECTOR_CONE_1DEGREES	Vector( 0.00873, 0.00873, 0.00873 )
#define VECTOR_CONE_2DEGREES	Vector( 0.01745, 0.01745, 0.01745 )
#define VECTOR_CONE_3DEGREES	Vector( 0.02618, 0.02618, 0.02618 )
#define VECTOR_CONE_4DEGREES	Vector( 0.03490, 0.03490, 0.03490 )
#define VECTOR_CONE_5DEGREES	Vector( 0.04362, 0.04362, 0.04362 )
#define VECTOR_CONE_6DEGREES	Vector( 0.05234, 0.05234, 0.05234 )
#define VECTOR_CONE_7DEGREES	Vector( 0.06105, 0.06105, 0.06105 )
#define VECTOR_CONE_8DEGREES	Vector( 0.06976, 0.06976, 0.06976 )
#define VECTOR_CONE_9DEGREES	Vector( 0.07846, 0.07846, 0.07846 )
#define VECTOR_CONE_10DEGREES	Vector( 0.08716, 0.08716, 0.08716 )
#define VECTOR_CONE_15DEGREES	Vector( 0.13053, 0.13053, 0.13053 )
#define VECTOR_CONE_20DEGREES	Vector( 0.17365, 0.17365, 0.17365 )

//=========================================================
// CWeaponBox - a single entity that can store weapons
// and ammo. 
//=========================================================
/*disabled by harSens
class CWeaponBox : public CBaseEntity
{
	void Precache( void );
	void Spawn( void );
	void Touch( CBaseEntity *pOther );
	void KeyValue( KeyValueData *pkvd );
	BOOL IsEmpty( void );
	int  GiveAmmo( int iCount, char *szName, int iMax, int *pIndex = NULL );
	void SetObjectCollisionBox( void );

public:
	void EXPORT Kill ( void );
	int		Save( CSave &save );
	int		Restore( CRestore &restore );
	static	TYPEDESCRIPTION m_SaveData[];

	HasWeapon( CBasePlayerItem *pCheckItem );
	BOOL PackWeapon( CBasePlayerItem *pWeapon );
	BOOL PackAmmo( int iszName, int iCount );
	
	CBasePlayerItem	*m_rgpPlayerItems[MAX_ITEM_TYPES];// one slot for each 

	int m_rgiszAmmo[MAX_AMMO_SLOTS];// ammo names
	int	m_rgAmmo[MAX_AMMO_SLOTS];// ammo quantities

	int m_cAmmoTypes;// how many ammo types packed into this box (if packed by a level designer)
};
*/

#ifdef CLIENT_DLL
bool bIsMultiplayer ( void );
void LoadVModel ( char *szViewModel, CBasePlayer *m_pPlayer );
#endif

/* removed by harSens
class CGlock : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 2; }
	int GetItemInfo(ItemInfo *p);

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	void GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim );
	BOOL Deploy( void );
	void Reload( void );
	void WeaponIdle( void );

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	int m_iShell;
	

	unsigned short m_usFireGlock1;
	unsigned short m_usFireGlock2;
};


class CCrowbar : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 1; }
	void EXPORT SwingAgain( void );
	void EXPORT Smack( void );
	int GetItemInfo(ItemInfo *p);

	void PrimaryAttack( void );
	int Swing( int fFirst );
	BOOL Deploy( void );
	void Holster( int skiplocal = 0 );
	int m_iSwing;
	TraceResult m_trHit;

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}
private:
	unsigned short m_usCrowbar;
};

class CPython : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 2; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );
	void PrimaryAttack( void );
	void SecondaryAttack( void );
	BOOL Deploy( void );
	void Holster( int skiplocal = 0 );
	void Reload( void );
	void WeaponIdle( void );
	float m_flSoundDelay;

	BOOL m_fInZoom;// don't save this. 

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usFirePython;
};

class CMP5 : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 3; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	int SecondaryAmmoIndex( void );
	BOOL Deploy( void );
	void Reload( void );
	void WeaponIdle( void );
	float m_flNextAnimTime;
	int m_iShell;

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usMP5;
	unsigned short m_usMP52;
};

class CCrossbow : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( ) { return 3; }
	int GetItemInfo(ItemInfo *p);

	void FireBolt( void );
	void FireSniperBolt( void );
	void PrimaryAttack( void );
	void SecondaryAttack( void );
	int AddToPlayer( CBasePlayer *pPlayer );
	BOOL Deploy( );
	void Holster( int skiplocal = 0 );
	void Reload( void );
	void WeaponIdle( void );

	int m_fInZoom; // don't save this

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usCrossbow;
	unsigned short m_usCrossbow2;
};

class CShotgun : public CBasePlayerWeapon
{
public:

#ifndef CLIENT_DLL
	int		Save( CSave &save );
	int		Restore( CRestore &restore );
	static	TYPEDESCRIPTION m_SaveData[];
#endif


	void Spawn( void );
	void Precache( void );
	int iItemSlot( ) { return 3; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	BOOL Deploy( );
	void Reload( void );
	void WeaponIdle( void );
	int m_fInReload;
	float m_flNextReload;
	int m_iShell;

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usDoubleFire;
	unsigned short m_usSingleFire;
};

class CLaserSpot : public CBaseEntity
{
	void Spawn( void );
	void Precache( void );

	int	ObjectCaps( void ) { return FCAP_DONT_SAVE; }

public:
	void Suspend( float flSuspendTime );
	void EXPORT Revive( void );
	
	static CLaserSpot *CreateSpot( void );
};

class CRpg : public CBasePlayerWeapon
{
public:

#ifndef CLIENT_DLL
	int		Save( CSave &save );
	int		Restore( CRestore &restore );
	static	TYPEDESCRIPTION m_SaveData[];
#endif

	void Spawn( void );
	void Precache( void );
	void Reload( void );
	int iItemSlot( void ) { return 4; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );

	BOOL Deploy( void );
	BOOL CanHolster( void );
	void Holster( int skiplocal = 0 );

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	void WeaponIdle( void );

	void UpdateSpot( void );
	BOOL ShouldWeaponIdle( void ) { return TRUE; };

	CLaserSpot *m_pSpot;
	int m_fSpotActive;
	int m_cActiveRockets;// how many missiles in flight from this launcher right now?

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usRpg;

};

class CRpgRocket : public CGrenade
{
public:
	int		Save( CSave &save );
	int		Restore( CRestore &restore );
	static	TYPEDESCRIPTION m_SaveData[];
	void Spawn( void );
	void Precache( void );
	void EXPORT FollowThink( void );
	void EXPORT IgniteThink( void );
	void EXPORT RocketTouch( CBaseEntity *pOther );
	static CRpgRocket *CreateRpgRocket( Vector vecOrigin, Vector vecAngles, CBaseEntity *pOwner, CRpg *pLauncher );

	int m_iTrail;
	float m_flIgniteTime;
	CRpg *m_pLauncher;// pointer back to the launcher that fired me. 
};

class CGauss : public CBasePlayerWeapon
{
public:

#ifndef CLIENT_DLL
	int		Save( CSave &save );
	int		Restore( CRestore &restore );
	static	TYPEDESCRIPTION m_SaveData[];
#endif

	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 4; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );

	BOOL Deploy( void );
	void Holster( int skiplocal = 0  );

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	void WeaponIdle( void );
	
	void StartFire( void );
	void Fire( Vector vecOrigSrc, Vector vecDirShooting, float flDamage );
	float GetFullChargeTime( void );
	int m_iBalls;
	int m_iGlow;
	int m_iBeam;
	int m_iSoundState; // don't save this

	// was this weapon just fired primary or secondary?
	// we need to know so we can pick the right set of effects. 
	BOOL m_fPrimaryFire;

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usGaussFire;
	unsigned short m_usGaussSpin;
};

class CEgon : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
	int		Save( CSave &save );
	int		Restore( CRestore &restore );
	static	TYPEDESCRIPTION m_SaveData[];
#endif

	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 4; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );

	BOOL Deploy( void );
	void Holster( int skiplocal = 0 );

	void UpdateEffect( const Vector &startPoint, const Vector &endPoint, float timeBlend );

	void CreateEffect ( void );
	void DestroyEffect ( void );

	void EndAttack( void );
	void Attack( void );
	void PrimaryAttack( void );
	void WeaponIdle( void );

	float m_flAmmoUseTime;// since we use < 1 point of ammo per update, we subtract ammo on a timer.

	float GetPulseInterval( void );
	float GetDischargeInterval( void );

	void Fire( const Vector &vecOrigSrc, const Vector &vecDir );

	BOOL HasAmmo( void );

	void UseAmmo( int count );
	
	enum EGON_FIREMODE { FIRE_NARROW, FIRE_WIDE};

	CBeam				*m_pBeam;
	CBeam				*m_pNoise;
	CSprite				*m_pSprite;

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

	unsigned short m_usEgonStop;

private:
	float				m_shootTime;
	EGON_FIREMODE		m_fireMode;
	float				m_shakeTime;
	BOOL				m_deployed;

	unsigned short m_usEgonFire;
};

class CHgun : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 4; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	BOOL Deploy( void );
	BOOL IsUseable( void );
	void Holster( int skiplocal = 0 );
	void Reload( void );
	void WeaponIdle( void );
	float m_flNextAnimTime;

	float m_flRechargeTime;
	
	int m_iFirePhase;// don't save me.

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}
private:
	unsigned short m_usHornetFire;
};



class CHandGrenade : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 5; }
	int GetItemInfo(ItemInfo *p);

	void PrimaryAttack( void );
	BOOL Deploy( void );
	BOOL CanHolster( void );
	void Holster( int skiplocal = 0 );
	void WeaponIdle( void );
	
	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}
};

class CSatchel : public CBasePlayerWeapon
{
public:

#ifndef CLIENT_DLL
	int		Save( CSave &save );
	int		Restore( CRestore &restore );
	static	TYPEDESCRIPTION m_SaveData[];
#endif

	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 5; }
	int GetItemInfo(ItemInfo *p);
	int AddToPlayer( CBasePlayer *pPlayer );
	void PrimaryAttack( void );
	void SecondaryAttack( void );
	int AddDuplicate( CBasePlayerItem *pOriginal );
	BOOL CanDeploy( void );
	BOOL Deploy( void );
	BOOL IsUseable( void );
	
	void Holster( int skiplocal = 0 );
	void WeaponIdle( void );
	void Throw( void );
	
	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}
};


class CTripmine : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 5; }
	int GetItemInfo(ItemInfo *p);
	void SetObjectCollisionBox( void )
	{
		//!!!BUGBUG - fix the model!
		pev->absmin = pev->origin + Vector(-16, -16, -5);
		pev->absmax = pev->origin + Vector(16, 16, 28); 
	}

	void PrimaryAttack( void );
	BOOL Deploy( void );
	void Holster( int skiplocal = 0 );
	void WeaponIdle( void );

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usTripFire;

};

class CSqueak : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 5; }
	int GetItemInfo(ItemInfo *p);

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	BOOL Deploy( void );
	void Holster( int skiplocal = 0 );
	void WeaponIdle( void );
	int m_fJustThrown;

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	unsigned short m_usSnarkFire;
};
*/


#endif // WEAPONS_H
