text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: Client side CHostage class
  //
  // $NoKeywords: $
  //=============================================================================//
  
  #ifndef C_CHOSTAGE_H
  #define C_CHOSTAGE_H
  #ifdef _WIN32
  #pragma once
  #endif
  
  #include "c_ai_basenpc.h"
  #include "utlvector.h"
  #include "util_shared.h"
  #include "cs_playeranimstate.h"
  #include "c_cs_player.h"
  
  
  // for shared code
  #define CHostage C_CHostage
  
  
  //----------------------------------------------------------------------------------------------
  /**
   * The client-side implementation of the Hostage
   */
  class C_CHostage : public C_BaseCombatCharacter, public ICSPlayerAnimStateHelpers
  {
  public:
  	DECLARE_CLASS( C_CHostage, C_BaseCombatCharacter );
  	DECLARE_CLIENTCLASS();
  
  	C_CHostage();
  	virtual ~C_CHostage();
  
  // ICSPlayerAnimState overrides.
  public:
  	virtual CWeaponCSBase* CSAnim_GetActiveWeapon();
  	virtual bool CSAnim_CanMove();
  
  public:	
  	virtual void Spawn( void );
  	virtual void UpdateClientSideAnimation();
  
  	void OnPreDataChanged( DataUpdateType_t updateType );
  	void OnDataChanged( DataUpdateType_t updateType );
  
  	bool IsRescued( void ) { return m_isRescued; }
  	bool WasRecentlyKilledOrRescued( void );
  
  	int GetHealth( void ) const { return m_iHealth; }
  	int GetMaxHealth( void ) const { return m_iMaxHealth; }
  
  	virtual void ClientThink( void );
  
  	C_CSPlayer *GetLeader( void ) const;			// return who we are following or NULL
  
  	virtual C_BaseAnimating * BecomeRagdollOnClient();
  	virtual bool ShouldDraw( void );
  
  	void ImpactTrace( trace_t *pTrace, int iDamageType, const char *pCustomImpactName );
  private:
  	int  m_OldLifestate;
  	int  m_iMaxHealth;
  
  	ICSPlayerAnimState *m_PlayerAnimState;
  
  	CNetworkVar( EHANDLE, m_leader );				// who we are following, or NULL
  
  	CNetworkVar( bool, m_isRescued );
  	float m_flDeadOrRescuedTime;
  	static void RecvProxy_Rescued( const CRecvProxyData *pData, void *pStruct, void *pOut );
  
  	CountdownTimer m_blinkTimer;
  
  	Vector m_lookAt;		// point in space we are looking at
  	void UpdateLookAt( CStudioHdr *pStudioHdr );	// orient head and eyes towards m_lookAt
  	void LookAround( void );										// look around at various interesting things
  	CountdownTimer m_lookAroundTimer;
  
  	bool m_isInit;
  	void Initialize( void );						// set up attachment and pose param indices
  
  	int m_eyeAttachment;
  	int m_chestAttachment;
  
  	int m_bodyYawPoseParam;
  	float m_bodyYawMin;
  	float m_bodyYawMax;
  
  	int m_headYawPoseParam;
  	float m_headYawMin;
  	float m_headYawMax;
  	float m_flCurrentHeadYaw;
  	float m_flLastBodyYaw;
  
  	int m_headPitchPoseParam;
  	float m_headPitchMin;
  	float m_headPitchMax;
  	float m_flCurrentHeadPitch;
  
  	int m_seq;
  
  	bool m_createdLowViolenceRagdoll;
  	
  private:
  	C_CHostage( const C_CHostage & );				// not defined, not accessible
  };
  
  
  inline C_CSPlayer *C_CHostage::GetLeader( void ) const
  {
  	return ToCSPlayer( m_leader.m_Value );
  }
  
  
  extern CUtlVector< C_CHostage* > g_Hostages;
  extern CUtlVector< EHANDLE > g_HostageRagdolls;
  
  
  #endif // C_CHOSTAGE_H
  