//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Weapon Base Melee 
//
//=============================================================================

#ifndef TF_WEAPONBASE_MELEE_H
#define TF_WEAPONBASE_MELEE_H
#ifdef _WIN32
#pragma once
#endif

#include "tf_shareddefs.h"
#include "tf_weaponbase.h"

#if defined( CLIENT_DLL )
#define CTFWeaponBaseMelee C_TFWeaponBaseMelee
extern ConVar cl_crosshair_file;
#endif

//=============================================================================
//
// Weapon Base Melee Class
//
class CTFWeaponBaseMelee : public CTFWeaponBase
{
public:

	DECLARE_CLASS( CTFWeaponBaseMelee, CTFWeaponBase );
	DECLARE_NETWORKCLASS(); 
	DECLARE_PREDICTABLE();

#if !defined( CLIENT_DLL ) 
	DECLARE_DATADESC();
#endif

	CTFWeaponBaseMelee();

	// We say yes to this so the weapon system lets us switch to it.
	virtual bool	HasPrimaryAmmo()								{ return true; }
	virtual bool	CanBeSelected()									{ return true; }
	virtual void	Precache();
	virtual void	ItemPreFrame();
	virtual void	ItemPostFrame();
	virtual void	Spawn();
	virtual void	PrimaryAttack();
	virtual void	SecondaryAttack();
	virtual bool	Holster( CBaseCombatWeapon *pSwitchingTo );
	virtual int		GetWeaponID( void ) const						{ return TF_WEAPON_NONE; }
	virtual int		GetSwingRange( void );
	virtual void	WeaponReset( void );
	virtual bool	CanHolster( void ) const;

	virtual bool	CalcIsAttackCriticalHelper( void );
	virtual bool	CalcIsAttackCriticalHelperNoCrits( void );

	virtual void	DoViewModelAnimation( void );

	virtual bool	DoSwingTrace( trace_t &trace );
	virtual void	Smack( void );
	virtual void	DoMeleeDamage( CBaseEntity* ent, trace_t& trace );
	virtual void	DoMeleeDamage( CBaseEntity* ent, trace_t& trace, float flDamageMod );

	virtual float	GetMeleeDamage( CBaseEntity *pTarget, int* piDamageType, int* piCustomDamage );

#ifndef CLIENT_DLL
	virtual float	GetForceScale( void );
	virtual int		GetDamageCustom( void ) { return TF_DMG_CUSTOM_NONE; }
#endif

	// Call when we hit an entity. Use for special weapon effects on hit.
	virtual void	OnEntityHit( CBaseEntity *pEntity, CTakeDamageInfo *info );

	virtual void	SendPlayerAnimEvent( CTFPlayer *pPlayer );

	bool			ConnectedHit( void ) { return m_bConnected; }

	virtual char const		*GetShootSound( int iIndex ) const;

public:	

	CTFWeaponInfo	*m_pWeaponInfo;

protected:

	virtual void	Swing( CTFPlayer *pPlayer );

protected:

	float	m_flSmackTime;
	bool	m_bConnected;
	bool	m_bMiniCrit;

#ifdef GAME_DLL
	CUtlVector< CHandle< CTFPlayer > > m_potentialVictimVector;
#endif

private:
	bool DoSwingTraceInternal( trace_t &trace, bool bCleave, CUtlVector< trace_t >* pTargetTraceVector );
	bool OnSwingHit( trace_t &trace );

	CTFWeaponBaseMelee( const CTFWeaponBaseMelee & ) {}
};

#endif // TF_WEAPONBASE_MELEE_H