//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef C_DOD_PLAYER_H #define C_DOD_PLAYER_H #ifdef _WIN32 #pragma once #endif #include "dod_playeranimstate.h" #include "c_baseplayer.h" #include "dod_shareddefs.h" #include "baseparticleentity.h" #include "dod_player_shared.h" #include "beamdraw.h" #include "hintsystem.h" #define PRONE_MAX_SWAY 3.0 #define PRONE_SWAY_AMOUNT 4.0 #define RECOIL_DURATION 0.1 class CViewAngleAnimation; class C_DODPlayer : public C_BasePlayer { public: friend class CDODPlayerShared; DECLARE_CLASS( C_DODPlayer, C_BasePlayer ); DECLARE_CLIENTCLASS(); DECLARE_PREDICTABLE(); DECLARE_INTERPOLATION(); C_DODPlayer(); ~C_DODPlayer(); static C_DODPlayer* GetLocalDODPlayer(); virtual const QAngle& GetRenderAngles(); virtual void UpdateClientSideAnimation(); virtual void ProcessMuzzleFlashEvent(); virtual void PostDataUpdate( DataUpdateType_t updateType ); virtual bool CreateMove( float flInputSampleTime, CUserCmd *pCmd ); virtual void FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options ); virtual void OnDataChanged( DataUpdateType_t type ); virtual void NotifyShouldTransmit( ShouldTransmitState_t state ); virtual void ClientThink( void ); virtual void GetToolRecordingState( KeyValues *msg ); void LocalPlayerRespawn( void ); // Returns true if we're allowed to show the menus right now. bool CanShowTeamMenu() const { return true; } bool CanShowClassMenu(); bool ShouldDraw( void ); virtual C_BaseAnimating * BecomeRagdollOnClient(); virtual IRagdoll* GetRepresentativeRagdoll() const; virtual void ReceiveMessage( int classID, bf_read &msg ); void PopHelmet( Vector vecDir, Vector vecForceOffset, int model ); // Get the ID target entity index. The ID target is the player that is behind our crosshairs, used to // display the player's name. int GetIDTarget() const { return m_iIDEntIndex; } void UpdateIDTarget(); bool ShouldAutoReload( void ); bool ShouldAutoRezoom( void ); void SetSprinting( bool bIsSprinting ); bool IsSprinting( void ); void LowerWeapon( void ); void RaiseWeapon( void ); bool IsWeaponLowered( void ); virtual ShadowType_t ShadowCastType( void ); virtual void GetRenderBounds( Vector& theMins, Vector& theMaxs ); virtual void GetShadowRenderBounds( Vector &mins, Vector &maxs, ShadowType_t shadowType ); virtual bool GetShadowCastDirection( Vector *pDirection, ShadowType_t shadowType ) const; virtual int DrawModel( int flags ); virtual void Simulate(); virtual float GetMinFOV() const { return 20; } virtual bool SetFOV( CBaseEntity *pRequester, int FOV, float zoomRate = 0.0f ); virtual void CreateLightEffects( void ) {} //no dimlight effects virtual Vector GetChaseCamViewOffset( CBaseEntity *target ); virtual const QAngle& EyeAngles(); virtual const Vector& GetRenderOrigin(); // return ragdoll origin if dead bool dod_IsInterpolationEnabled( void ) { return IsInterpolationEnabled(); } void CreateViewAngleAnimations( void ); void CheckGrenadeHint( Vector vecGrenadeOrigin ); void CheckBombTargetPlantHint( void ); void CheckBombTargetDefuseHint( void ); virtual void ComputeWorldSpaceSurroundingBox( Vector *pVecWorldMins, Vector *pVecWorldMaxs ); // Hints virtual CHintSystem *Hints( void ) { return &m_Hints; } // Player avoidance bool ShouldCollide( int collisionGroup, int contentsMask ) const; void AvoidPlayers( CUserCmd *pCmd ); virtual bool ShouldReceiveProjectedTextures( int flags ) { return ( this != C_BasePlayer::GetLocalPlayer() ); } bool IsNemesisOfLocalPlayer(); bool ShouldShowNemesisIcon(); virtual void OnAchievementAchieved( int iAchievement ); int GetActiveAchievementAward( void ); IMaterial *GetHeadIconMaterial( void ); protected: virtual void CalcObserverView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov ); void CalcDODDeathCamView( Vector &eyeOrigin, QAngle& eyeAngles, float& fov ); void CalcChaseCamView(Vector& eyeOrigin, QAngle& eyeAngles, float& fov); virtual void CalcFreezeCamView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov ); // Called by shared code. public: void DoAnimationEvent( PlayerAnimEvent_t event, int nData = 0 ); DODPlayerState State_Get() const; IDODPlayerAnimState *m_PlayerAnimState; QAngle m_angEyeAngles; CInterpolatedVar< QAngle > m_iv_angEyeAngles; void FireBullets( const FireBulletsInfo_t &info ); bool CanAttack( void ); void SetBazookaDeployed( bool bDeployed ) {} // the control point index the player is near int GetCPIndex( void ) { return m_Shared.GetCPIndex(); } //Implemented in shared code public: virtual void SharedSpawn(); void CheckProneMoveSound( int groundspeed, bool onground ); virtual void UpdateStepSound( surfacedata_t *psurface, const Vector &vecOrigin, const Vector &vecVelocity ); virtual void PlayStepSound( Vector &vecOrigin, surfacedata_t *psurface, float fvol, bool force ); virtual const Vector GetPlayerMins( void ) const; // uses local player virtual const Vector GetPlayerMaxs( void ) const; // uses local player // Returns true if the player is allowed to move. bool CanMove() const; float GetStamina( void ) const; void SetStamina( float flStamina ); virtual void SetAnimation( PLAYER_ANIM playerAnim ); CDODPlayerShared m_Shared; float m_flRecoilTimeRemaining; float m_flPitchRecoilAccumulator; float m_flYawRecoilAccumulator; void GetWeaponRecoilAmount( int weaponId, float &flPitchRecoil, float &flYawRecoil ); void DoRecoil( int iWpnID, float flWpnRecoil ); void SetRecoilAmount( float flPitchRecoil, float flYawRecoil ); void GetRecoilToAddThisFrame( float &flPitchRecoil, float &flYawRecoil ); EHANDLE m_hRagdoll; CWeaponDODBase* GetActiveDODWeapon() const; Activity TranslateActivity( Activity baseAct, bool *pRequired = NULL ); Vector m_lastStandingPos; // used by the gamemovement code for finding ladders // for stun effect float m_flStunEffectTime; float m_flStunAlpha; CNetworkVar( float, m_flStunMaxAlpha ); CNetworkVar( float, m_flStunDuration ); float GetDeathTime( void ) { return m_flDeathTime; } // How long the progress bar takes to get to the end. If this is 0, then the progress bar // should not be drawn. CNetworkVar( int, m_iProgressBarDuration ); // When the progress bar should start. CNetworkVar( float, m_flProgressBarStartTime ); float m_flLastRespawnTime; private: C_DODPlayer( const C_DODPlayer & ); CNetworkVar( DODPlayerState, m_iPlayerState ); CNetworkVar( float, m_flStamina ); float m_flProneViewOffset; bool m_bProneSwayingRight; Vector m_vecRagdollVelocity; // ID Target int m_iIDEntIndex; bool m_bWeaponLowered; // should our weapon be lowered right now CNetworkVar( bool, m_bSpawnInterpCounter ); bool m_bSpawnInterpCounterCache; CHintSystem m_Hints; void ReleaseFlashlight( void ); Beam_t *m_pFlashlightBeam; float m_flMinNextStepSoundTime; float m_fNextThinkPushAway; bool m_bPlayingProneMoveSound; void StaminaSoundThink( void ); CSoundPatch *m_pStaminaSound; bool m_bPlayingLowStaminaSound; // Cold Breath bool CreateColdBreathEmitter( void ); void DestroyColdBreathEmitter( void ); void UpdateColdBreath( void ); void EmitColdBreathParticles( void ); bool m_bColdBreathOn; float m_flColdBreathTimeStart; float m_flColdBreathTimeEnd; CSmartPtr m_hColdBreathEmitter; PMaterialHandle m_hColdBreathMaterial; int m_iHeadAttach; float m_flHideHeadIconUntilTime; virtual void CalculateIKLocks( float currentTime ); int m_iAchievementAwardsMask; IMaterial *m_pHeadIconMaterial; }; inline C_DODPlayer *ToDODPlayer( CBaseEntity *pEntity ) { if ( !pEntity || !pEntity->IsPlayer() ) return NULL; return dynamic_cast( pEntity ); } #endif // C_DOD_PLAYER_H