//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Ammo boxes for HL1
//
//=============================================================================//


#include "cbase.h"
#include "player.h"
#include "gamerules.h"
#include "items.h"
#include "hl1_items.h"


// ========================================================================
//	>> Crossbow bolts
// ========================================================================
#define AMMO_CROSSBOW_GIVE	5
#define AMMO_CROSSBOW_MODEL	"models/w_crossbow_clip.mdl"

class CCrossbowAmmo : public CHL1Item
{
public:
	DECLARE_CLASS( CCrossbowAmmo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_CROSSBOW_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel( AMMO_CROSSBOW_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_CROSSBOW_GIVE, "XBowBolt" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_crossbow, CCrossbowAmmo);
PRECACHE_REGISTER(ammo_crossbow);


// ========================================================================
//	>> Egon ammo
// ========================================================================
#define AMMO_EGON_GIVE		20
#define AMMO_EGON_MODEL		"models/w_chainammo.mdl"

class CEgonAmmo : public CHL1Item
{
public:
	DECLARE_CLASS( CEgonAmmo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_EGON_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_EGON_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_EGON_GIVE, "Uranium" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );	
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_egonclip, CEgonAmmo);
PRECACHE_REGISTER(ammo_egonclip);


// ========================================================================
//	>> Gauss ammo
// ========================================================================
#define AMMO_GAUSS_GIVE		20
#define AMMO_GAUSS_MODEL	"models/w_gaussammo.mdl"

class CGaussAmmo : public CHL1Item
{
public:
	DECLARE_CLASS( CGaussAmmo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_GAUSS_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_GAUSS_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_GAUSS_GIVE, "Uranium" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_gaussclip, CGaussAmmo);
PRECACHE_REGISTER(ammo_gaussclip);


// ========================================================================
//	>> Glock ammo
// ========================================================================
#define AMMO_GLOCK_GIVE		18
#define AMMO_GLOCK_MODEL	"models/w_9mmclip.mdl"

class CGlockAmmo : public CHL1Item
{
public:
	DECLARE_CLASS( CGlockAmmo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_GLOCK_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_GLOCK_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_GLOCK_GIVE, "9mmRound" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_glockclip, CGlockAmmo);
PRECACHE_REGISTER(ammo_glockclip);
LINK_ENTITY_TO_CLASS(ammo_9mmclip, CGlockAmmo);
PRECACHE_REGISTER(ammo_9mmclip);


// ========================================================================
//	>> MP5 ammo
// ========================================================================
#define AMMO_MP5_GIVE		50
#define AMMO_MP5_MODEL		"models/w_9mmARclip.mdl"

class CMP5AmmoClip : public CHL1Item
{
public:
	DECLARE_CLASS( CMP5AmmoClip, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_MP5_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_MP5_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_MP5_GIVE, "9mmRound" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_mp5clip, CMP5AmmoClip);
PRECACHE_REGISTER(ammo_mp5clip);
LINK_ENTITY_TO_CLASS(ammo_9mmar, CMP5AmmoClip);
PRECACHE_REGISTER(ammo_9mmar);


// ========================================================================
//	>> MP5Chain (?) ammo
// ========================================================================
#define AMMO_MP5CHAIN_GIVE		200
#define AMMO_MP5CHAIN_MODEL		"models/w_chainammo.mdl"

class CMP5Chainammo : public CHL1Item
{
public:
	DECLARE_CLASS( CMP5Chainammo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_MP5CHAIN_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_MP5CHAIN_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_MP5CHAIN_GIVE, "9mmRound" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_9mmbox, CMP5Chainammo);
PRECACHE_REGISTER(ammo_9mmbox);


// ========================================================================
//	>> MP5 grenades
// ========================================================================
#define AMMO_MP5GRENADE_GIVE		2
#define AMMO_MP5GRENADE_MODEL		"models/w_ARgrenade.mdl"

class CMP5AmmoGrenade : public CHL1Item
{
public:
	DECLARE_CLASS( CMP5AmmoGrenade, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_MP5GRENADE_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_MP5GRENADE_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_MP5GRENADE_GIVE, "MP5_Grenade" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_mp5grenades, CMP5AmmoGrenade);
PRECACHE_REGISTER(ammo_mp5grenades);
LINK_ENTITY_TO_CLASS(ammo_argrenades, CMP5AmmoGrenade);
PRECACHE_REGISTER(ammo_argrenades);


// ========================================================================
//	>> 357 ammo
// ========================================================================
#define AMMO_357_GIVE		6
#define AMMO_357_MODEL		"models/w_357ammobox.mdl"

class CPythonAmmo : public CHL1Item
{
public:
	DECLARE_CLASS( CPythonAmmo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_357_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_357_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_357_GIVE, "357Round" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_357, CPythonAmmo);
PRECACHE_REGISTER(ammo_357);


// ========================================================================
//	>> RPG rockets
// ========================================================================
#define AMMO_RPG_GIVE		1
#define AMMO_RPG_MODEL		"models/w_rpgammo.mdl"

class CRpgAmmo : public CHL1Item
{
public:
	DECLARE_CLASS( CRpgAmmo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_RPG_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_RPG_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		int nGive;

		if ( g_pGameRules->IsMultiplayer() )
		{
			// hand out more ammo per rocket in multiplayer.
			nGive = AMMO_RPG_GIVE * 2;
		}
		else
		{
			nGive = AMMO_RPG_GIVE;
		}

		if (pPlayer->GiveAmmo( nGive, "RPG_Rocket" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_rpgclip, CRpgAmmo);
PRECACHE_REGISTER(ammo_rpgclip);


// ========================================================================
//	>> Shotgun ammo
// ========================================================================
#define AMMO_SHOTGUN_GIVE		12
#define AMMO_SHOTGUN_MODEL		"models/w_shotbox.mdl"

class CShotgunAmmo : public CHL1Item
{
public:
	DECLARE_CLASS( CShotgunAmmo, CHL1Item );

	void Spawn( void )
	{ 
		Precache();
		SetModel( AMMO_SHOTGUN_MODEL );
		BaseClass::Spawn();
	}
	void Precache( void )
	{
		PrecacheModel ( AMMO_SHOTGUN_MODEL );
	}
	bool MyTouch( CBasePlayer *pPlayer )
	{
		if (pPlayer->GiveAmmo( AMMO_SHOTGUN_GIVE, "Buckshot" ) )
		{
			if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO )
			{
				UTIL_Remove( this );
			}
			return true;
		}
		return false;
	}
};
LINK_ENTITY_TO_CLASS(ammo_buckshot, CShotgunAmmo);
PRECACHE_REGISTER(ammo_buckshot);