//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #if !defined( C_BASETFPLAYER_H ) #define C_BASETFPLAYER_H #ifdef _WIN32 #pragma once #endif #include "tf_vehicleshared.h" #include "c_baseplayer.h" #include "CommanderOverlay.h" #include "hud_minimap.h" #include "hud_targetreticle.h" #include "c_tfplayerlocaldata.h" #include "particlemgr.h" #include "particle_prototype.h" #include "particle_util.h" #include "tf_playeranimstate.h" class C_VehicleTeleportStation; class CViewSetup; class IMaterial; class C_Order; class C_BaseObject; class C_PlayerClass; class CPersonalShieldEffect; class CBasePredictedWeapon; class C_BaseViewModel; class CUserCmd; class C_WeaponCombatShield; //----------------------------------------------------------------------------- // Purpose: Client Side TF Player entity //----------------------------------------------------------------------------- class C_BaseTFPlayer : public C_BasePlayer { public: DECLARE_CLASS( C_BaseTFPlayer, C_BasePlayer ); DECLARE_CLIENTCLASS(); DECLARE_ENTITY_PANEL(); DECLARE_MINIMAP_PANEL(); DECLARE_PREDICTABLE(); C_BaseTFPlayer(); virtual ~C_BaseTFPlayer(); private: void Clear(); // Clear all elements. public: bool IsHidden() const; bool IsDamageBoosted() const; bool HasNamedTechnology( const char *name ); float LastAttackTime() const { return m_flLastAttackTime; } void SetLastAttackTime( float flTime ) { m_flLastAttackTime = flTime; } // Return this client's C_BaseTFPlayer pointer static C_BaseTFPlayer* GetLocalPlayer( void ) { return ( static_cast< C_BaseTFPlayer * >( C_BasePlayer::GetLocalPlayer() ) ); } virtual void ClientThink( void ); virtual void OnPreDataChanged( DataUpdateType_t updateType ); virtual void OnDataChanged( DataUpdateType_t updateType ); virtual void PreDataUpdate( DataUpdateType_t updateType ); virtual void PostDataUpdate( DataUpdateType_t updateType ); virtual void ReceiveMessage( int classID, bf_read &msg ); virtual void Release( void ); virtual void ItemPostFrame( void ); virtual bool ShouldDraw(); virtual int DrawModel( int flags ); virtual void SetDormant( bool bDormant ); virtual void GetBoneControllers(float controllers[MAXSTUDIOBONES]); virtual int GetRenderTeamNumber( void ); virtual void ComputeFxBlend( void ); virtual bool IsTransparent( void ); // Called by the view model if its rendering is being overridden. virtual bool ViewModel_IsTransparent( void ); virtual bool IsOverridingViewmodel( void ); virtual int DrawOverriddenViewmodel( C_BaseViewModel *pViewmodel, int flags ); virtual void CreateMove( float flInputSampleTime, CUserCmd *pCmd ); virtual float GetDefaultAnimSpeed( void ); int GetClass( void ); // Called when not in tactical mode. Allows view to be overriden for things like driving a tank. void OverrideView( CViewSetup *pSetup ); // Called when not in tactical mode. Allows view model drawing to be disabled for things like driving a tank. bool ShouldDrawViewModel(); void GetTargetDescription( char *pDest, int bufferSize ); // Orders void SetPersonalOrder( C_Order *pOrder ); void RemoveOrderTarget(); // Resources int GetBankResources( void ); // Objects void SetSelectedObject( C_BaseObject *pObject ); C_BaseObject *GetSelectedObject( void ); int GetNumObjects( int iObjectType ); int GetObjectCount( void ); C_BaseObject *GetObject( int index ); // Targets void Add_Target( C_BaseEntity *pTarget, const char *sName ); void Remove_Target( C_BaseEntity *pTarget ); void Remove_Target( CTargetReticle *pTargetReticle ); void UpdateTargetReticles( void ); bool IsUsingThermalVision( void ) const; // Weapon handling virtual bool IsAllowedToSwitchWeapons( void ); virtual bool Weapon_ShouldSetLast( CBaseCombatWeapon *pOldWeapon, CBaseCombatWeapon *pNewWeapon ); virtual bool Weapon_ShouldSelectItem( CBaseCombatWeapon *pWeapon ); virtual C_BaseCombatWeapon *GetActiveWeaponForSelection( void ); virtual C_BaseCombatWeapon *GetLastWeaponBeforeObject( void ) { return m_hLastWeaponBeforeObject; } virtual C_BaseAnimating* GetRenderedWeaponModel(); // ID Target void SetIDEnt( C_BaseEntity *pEntity ); int GetIDTarget( void ) const; void UpdateIDTarget( void ); bool IsKnockedDown( void ) const; void CheckKnockdownState( void ); bool CheckKnockdownAngleOverride( void ) const; void SetKnockdownAngles( const QAngle& ang ); void GetKnockdownAngles( QAngle& outAngles ); float GetKnockdownViewheightAdjust( void ) const; // Team handling virtual void TeamChange( int iNewTeam ); // Camouflage effect virtual bool IsCamouflaged( void ); virtual float GetCamouflageAmount( void ); virtual float ComputeCamoEffectAmount( void ); // 0 - visible, 1 = invisible virtual int ComputeCamoAlpha( void ); virtual void CheckCamoDampening( void ); virtual void SetCamoDampening( float amount ); virtual float GetDampeningAmount( void ); virtual void CheckCameraMovement( void ); IMaterial *GetCamoMaterial( void ); virtual float GetMovementCamoSuppression( void ); virtual void CheckMovementCamoSuppression( void ); virtual void SetMovementCamoSuppression( float amount ); // Adrenalin void CheckAdrenalin( void ); void CheckLastMovement( void ); float GetLastMoveTime( void ); float GetOverlayAlpha( void ); float GetLastDamageTime( void ) const; float GetLastGainHealthTime( void ) const; // Powerups virtual void PowerupStart( int iPowerup, bool bInitial ); virtual void PowerupEnd( int iPowerup ); // Sniper bool IsDeployed( void ); bool IsDeploying( void ); bool IsUnDeploying( void ); virtual void AddEntity( void ); // Vertification inline bool HasClass( void ) { return GetPlayerClass() != NULL; } bool IsClass( TFClass iClass ); virtual int GetMaxHealth() const { return m_iMaxHealth; } bool ClassProxyUpdate( int nClassID ); // Should this object cast shadows? virtual ShadowType_t ShadowCastType(); // Prediction stuff virtual void PreThink( void ); virtual void PostThink( void ); // Combat prototyping bool IsBlocking( void ) const { return m_bIsBlocking; } bool IsParrying( void ) const { return m_bIsParrying; } void SetBlocking( bool bBlocking ) { m_bIsBlocking = bBlocking; } void SetParrying( bool bParrying ) { m_bIsParrying = bParrying; } // Vehicles void SetVehicleRole( int nRole ); bool CanGetInVehicle( void ); // Returns true if we're in a vehicle and it's mounted on another vehicle // (ie: are we in a manned gun that's mounted on a tank). bool IsVehicleMounted() const; virtual bool IsUseableEntity( CBaseEntity *pEntity ); // Shared Client / Server code public: bool IsHittingShield( const Vector &vecVelocity, float *flDamage ); C_WeaponCombatShield *GetCombatShield( void ); virtual void PainSound( void ); public: // Data for only the local player CTFPlayerLocalData m_TFLocal; // Accessors... const QAngle& DeployedAngles() const { return m_vecDeployedAngles; } int ZoneState() const { return m_iCurrentZoneState; } float CamouflageAmount() const { return m_flCamouflageAmount; } int PlayerClass() const { return m_iPlayerClass; } C_PlayerClass *GetPlayerClass(); C_Order *PersonalOrder() { return m_hPersonalOrder; } C_BaseEntity *SpawnPoint() { return m_hSpawnPoint.Get(); } C_VehicleTeleportStation* GetSelectedMCV() const; // Object sapper placement handling //float m_flSapperAttachmentFinishTime; //float m_flSapperAttachmentStartTime; //CHandle< CGrenadeObjectSapper > m_hSapper; //CHandle< CBaseObject > m_hSappedObject; CHealthBarPanel *m_pSapperAttachmentStatus; private: C_BaseTFPlayer( const C_BaseTFPlayer & ); // Client-side obstacle avoidance void PerformClientSideObstacleAvoidance( float flFrameTime, CUserCmd *pCmd ); float m_flLastAttackTime; EHANDLE m_hSelectedMCV; // Weapon used before switching to an object placement CHandle m_hLastWeaponBeforeObject; float m_flCamouflageAmount; // Movement. Vector m_vecPosDelta; enum { MOMENTUM_MAXSIZE = 10 }; float m_aMomentum[MOMENTUM_MAXSIZE]; int m_iMomentumHead; // Player Class int m_iPlayerClass; C_AllPlayerClasses m_PlayerClasses; // Spawn location... EHANDLE m_hSpawnPoint; // Orders CHandle< C_Order > m_hSelectedOrder; CHandle< C_Order > m_hPersonalOrder; int m_iSelectedTarget; int m_iPersonalTarget; CUtlVector< CTargetReticle * > m_aTargetReticles; // A list of entities to show target reticles for // Objects CHandle< C_BaseObject > m_hSelectedObject; int m_iLastHealth; bool m_bIsBlocking; bool m_bIsParrying; bool m_bUnderAttack; int m_iMaxHealth; bool m_bDeployed; bool m_bDeploying; bool m_bUnDeploying; QAngle m_vecDeployedAngles; int m_iCurrentZoneState; int m_TFPlayerFlags; int m_nOldTacticalView; int m_nOldPlayerClass; float m_flNextUseCheck; bool m_bOldThermalVision; bool m_bOldAttachingSapper; bool m_bOldKnockDownState; float m_flStartKnockdown; float m_flEndKnockdown; QAngle m_vecOriginalViewAngles; QAngle m_vecCurrentKnockdownAngles; QAngle m_vecKnockDownGoalAngles; bool m_bKnockdownOverrideAngles; float m_flKnockdownViewheightAdjust; CPlayerAnimState m_PlayerAnimState; // For sniper hiding float m_flLastMoveTime; Vector m_vecLastOrigin; // For material proxies float m_flLastDamageTime; float m_flLastGainHealthTime; IMaterial *m_pThermalMaterial; IMaterial *m_pCamoEffectMaterial; // Camouflage float m_flDampeningAmount; float m_flGoalDampeningAmount; float m_flDampeningStayoutTime; // Suppression of camo based on movement float m_flMovementCamoSuppression; float m_flGoalMovementCamoSuppressionAmount; float m_flMovementCamoSuppressionStayoutTime; // Adrenalin float m_flNextAdrenalinEffect; bool m_bFadingIn; // ID Target int m_iIDEntIndex; CMaterialReference m_BoostMaterial; CMaterialReference m_EMPMaterial; float m_BoostModelAngles[3]; // Personal shield effects. CUtlLinkedList m_PersonalShieldEffects; CHandle< C_WeaponCombatShield > m_hWeaponCombatShield; // No one should call this C_BaseTFPlayer& operator=( const C_BaseTFPlayer& src ); friend void RecvProxy_PlayerClass( const CRecvProxyData *pData, void *pStruct, void *pOut ); friend class CTFPrediction; }; int GetLocalPlayerClass( void ); bool IsLocalPlayerClass( int iClass ); bool IsLocalPlayerInTactical( ); inline C_BaseTFPlayer *ToBaseTFPlayer( C_BaseEntity *pEntity ) { if ( !pEntity || !pEntity->IsPlayer() ) return NULL; #if _DEBUG return dynamic_cast( pEntity ); #else return static_cast( pEntity ); #endif } #endif // C_BASETFPLAYER_H