//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================
#ifndef TF_WEAPON_FLAREGUN_H
#define TF_WEAPON_FLAREGUN_H
#ifdef _WIN32
#pragma once
#endif

#include "tf_weaponbase_gun.h"
#ifdef GAME_DLL
#include "tf_projectile_flare.h"
#endif

// Client specific.
#ifdef CLIENT_DLL
#define CTFFlareGun C_TFFlareGun
#define CTFFlareGun_Revenge C_TFFlareGun_Revenge
#endif

enum FlareGunTypes_t
{
	FLAREGUN_NORMAL = 0,
	FLAREGUN_DETONATE,
	FLAREGUN_GRORDBORT,
	FLAREGUN_SCORCHSHOT
};

//=============================================================================
//
// TF Weapon Flare gun.
//
class CTFFlareGun : public CTFWeaponBaseGun
{
public:

	DECLARE_CLASS( CTFFlareGun, CTFWeaponBaseGun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

// Server specific.
#ifdef GAME_DLL
	DECLARE_DATADESC();
#endif

	CTFFlareGun();
	~CTFFlareGun();

	virtual void	Precache();
	virtual void	DestroySounds( void );

	virtual int		GetWeaponID( void ) const			{ return TF_WEAPON_FLAREGUN; }
	virtual void	PrimaryAttack();
	virtual void	SecondaryAttack();

	virtual bool Holster( CBaseCombatWeapon *pSwitchingTo );
	virtual bool Deploy( void );
	virtual void ItemPostFrame( void );
	virtual void WeaponReset( void );

	int				GetFlareGunType( void ) const	{ int iMode = 0; CALL_ATTRIB_HOOK_INT( iMode, set_weapon_mode ); return iMode; }

#ifdef GAME_DLL
	void			AddFlare( CTFProjectile_Flare *pFlare );
	void			DeathNotice( CBaseEntity *pVictim );
	void			DetonateFlare( void );
#endif

	virtual void StartCharge( void );
	virtual void StopCharge( void );
	virtual void ChargePostFrame( void ) {}	// Derived weapons can figure out what to do with this
	virtual const char* GetChargeEffect( void ) const { return "drg_cowmangler_muzzleflash_chargeup"; }

	float GetChargeBeginTime( void ) const { return m_flChargeBeginTime; }

protected:

#ifdef GAME_DLL
	typedef CHandle<CTFProjectile_Flare>	FlareHandle;
	CUtlVector <FlareHandle>				m_Flares;
	int										m_iFlareCount;
#endif

protected:
	void StartChargeStartTime() { m_flChargeBeginTime = gpGlobals->curtime; }

#ifdef CLIENT_DLL
	virtual void DispatchMuzzleFlash( const char* effectName, C_BaseEntity* pAttachEnt );
	void ClientEffectsThink( void );
	void StartChargeEffects();
	void StopChargeEffects();
	virtual bool ShouldPlayClientReloadSound() { return true; }
#endif

private:

	CNetworkVar( float, m_flChargeBeginTime );

	bool m_bEffectsThinking;
	float m_flLastDenySoundTime;

#if defined( CLIENT_DLL )
	CSoundPatch	*m_pChargeLoop;
	bool m_bReadyToFire;
#endif

	CTFFlareGun( const CTFFlareGun & ) {}
};


//---------------------------------------------------------
class CTFFlareGun_Revenge : public CTFFlareGun
{
public:
	DECLARE_CLASS( CTFFlareGun_Revenge, CTFFlareGun );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

	CTFFlareGun_Revenge();

	virtual void Precache();

	virtual int GetWeaponID( void ) const			{ return TF_WEAPON_FLAREGUN_REVENGE; }
	virtual bool IsEnergyWeapon( void ) const { return true; }

	virtual int GetCustomDamageType() const;

	virtual bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL );
	virtual bool Deploy( void );

#ifdef GAME_DLL
	virtual void Detach();
#endif

	int GetCount( void );
	float GetProgress( void ) { return 0.0f; }
	const char* GetEffectLabelText( void )			{ return "#TF_CRITS"; }

	const char* GetMuzzleFlashParticleEffect( void ) { return "drg_manmelter_muzzleflash"; }

	virtual void PrimaryAttack();
	virtual void SecondaryAttack( void );
	virtual void ChargePostFrame( void );
	virtual const char* GetChargeEffect( void ) const { return "drg_manmelter_vacuum"; }
	virtual const char* ReadyToFireSound( void ) const { return "Weapon_SniperRailgun.NonScoped"; }

#ifdef CLIENT_DLL
	virtual void OnDataChanged( DataUpdateType_t type );
	void DoAbsorbEffect( void );
#endif

private:
	bool ExtinguishPlayerInternal( CTFPlayer *pTarget, CTFPlayer *pOwner );

	CNetworkVar( float, m_fLastExtinguishTime );

#ifdef CLIENT_DLL
	int m_nOldRevengeCrits;
#endif

};

#endif // TF_WEAPON_FLAREGUN_H