//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

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

#include "ai_basenpc.h"

//=========================================================
//	>> CBullseye
//=========================================================
class CNPC_Bullseye : public CAI_BaseNPC
{
	DECLARE_CLASS( CNPC_Bullseye, CAI_BaseNPC );

public:
	CNPC_Bullseye(void);
	~CNPC_Bullseye();

	virtual void Precache( void );
	virtual void Spawn( void );
	virtual void Activate( void );
	virtual void OnRestore( void );

	virtual float GetAutoAimRadius() { return m_fAutoaimRadius; }

	Class_T Classify( void );
	void	Event_Killed( const CTakeDamageInfo &info );
	void	DecalTrace( trace_t *pTrace, char const *decalName );
	void	ImpactTrace( trace_t *pTrace, int iDamageType, const char *pCustomImpactName );
	bool	IsLightDamage( const CTakeDamageInfo &info );
	void	TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
	int		OnTakeDamage( const CTakeDamageInfo &info );
	bool	UsePerfectAccuracy( void ) { return m_bPerfectAccuracy; }

	bool	TestHitboxes( const Ray_t &ray, unsigned int fContentsMask, trace_t& tr ) { return false; } // force traces to test against hull
	
	void	BullseyeThink( void );
	bool	CanBecomeRagdoll( void );

	void	SetPainPartner( CBaseEntity *pOther );
	void	InputTargeted( inputdata_t &inputdata );
	void	InputReleased( inputdata_t &inputdata );
	bool	CanBecomeServerRagdoll( void ) { return false;	}

	bool	CanBeAnEnemyOf( CBaseEntity *pEnemy );


protected:

	EHANDLE			m_hPainPartner;	//Entity that the bullseye will pass any damage it take to
	COutputEvent	m_OnTargeted;
	COutputEvent	m_OnReleased;
	bool			m_bPerfectAccuracy;	// Entities that shoot at me should be perfectly accurate
	float			m_fAutoaimRadius;	// How much to influence player's autoaim.
	float			m_flMinDistValidEnemy;

	DECLARE_DATADESC();
};

int FindBullseyesInCone( CBaseEntity **pList, int listMax, const Vector &coneOrigin, const Vector &coneAxis, float coneAngleCos, float coneLength );

#define SF_BULLSEYE_NONSOLID		(1 << 16)
#define SF_BULLSEYE_NODAMAGE		(1 << 17)
#define	SF_BULLSEYE_ENEMYDAMAGEONLY	(1 << 18)
#define	SF_BULLSEYE_BLEED			(1 << 19)
#define SF_BULLSEYE_PERFECTACC		(1 << 20)
#define SF_BULLSEYE_VPHYSICSSHADOW  (1 << 21)


#endif	// NPC_BULLSEYE_H