You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
419 lines
12 KiB
419 lines
12 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef C_CS_PLAYER_H |
|
#define C_CS_PLAYER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
#include "cs_playeranimstate.h" |
|
#include "c_baseplayer.h" |
|
#include "cs_shareddefs.h" |
|
#include "weapon_csbase.h" |
|
#include "baseparticleentity.h" |
|
#include "beamdraw.h" |
|
|
|
|
|
class C_PhysicsProp; |
|
|
|
extern ConVar cl_disablefreezecam; |
|
|
|
class CAddonModel |
|
{ |
|
public: |
|
CHandle<C_BaseAnimating> m_hEnt; // The model for the addon. |
|
int m_iAddon; // One of the ADDON_ bits telling which model this is. |
|
int m_iAttachmentPoint; // Which attachment point on the player model this guy is on. |
|
}; |
|
|
|
|
|
|
|
class C_CSPlayer : public C_BasePlayer, public ICSPlayerAnimStateHelpers |
|
{ |
|
public: |
|
DECLARE_CLASS( C_CSPlayer, C_BasePlayer ); |
|
DECLARE_CLIENTCLASS(); |
|
DECLARE_PREDICTABLE(); |
|
DECLARE_INTERPOLATION(); |
|
|
|
C_CSPlayer(); |
|
~C_CSPlayer(); |
|
|
|
virtual void Simulate(); |
|
|
|
bool HasDefuser() const; |
|
|
|
void GiveDefuser(); |
|
void RemoveDefuser(); |
|
|
|
bool HasNightVision() const; |
|
|
|
static C_CSPlayer* GetLocalCSPlayer(); |
|
CSPlayerState State_Get() const; |
|
|
|
virtual float GetMinFOV() const; |
|
|
|
// Get how much $$$ this guy has. |
|
int GetAccount() const; |
|
|
|
// Returns one of the CS_CLASS_ enums. |
|
int PlayerClass() const; |
|
|
|
bool IsInBuyZone(); |
|
bool CanShowTeamMenu() const; // Returns true if we're allowed to show the team menu right now. |
|
|
|
// Get the amount of armor the player has. |
|
int ArmorValue() const; |
|
bool HasHelmet() const; |
|
int GetCurrentAssaultSuitPrice(); |
|
|
|
virtual const QAngle& EyeAngles(); |
|
virtual const QAngle& GetRenderAngles(); |
|
virtual void CalcObserverView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov ); |
|
|
|
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 void VPhysicsUpdate( IPhysicsObject *pPhysics ); |
|
|
|
// 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; |
|
|
|
virtual void NotifyShouldTransmit( ShouldTransmitState_t state ); |
|
virtual void ClientThink(); |
|
|
|
virtual void OnDataChanged( DataUpdateType_t type ); |
|
virtual void PostDataUpdate( DataUpdateType_t updateType ); |
|
virtual bool Interpolate( float currentTime ); |
|
virtual void UpdateStepSound( surfacedata_t *psurface, const Vector &vecOrigin, const Vector &vecVelocity ); |
|
virtual surfacedata_t * GetFootstepSurface( const Vector &origin, const char *surfaceName ); |
|
virtual void ValidateModelIndex( void ); |
|
|
|
virtual int GetMaxHealth() const; |
|
|
|
bool Weapon_CanSwitchTo(C_BaseCombatWeapon *pWeapon); |
|
|
|
virtual void UpdateClientSideAnimation(); |
|
virtual void ProcessMuzzleFlashEvent(); |
|
|
|
virtual const Vector& GetRenderOrigin( void ); |
|
|
|
bool CreateMove( float flInputSampleTime, CUserCmd *pCmd ); |
|
|
|
CUtlVector< C_BaseParticleEntity* > m_SmokeGrenades; |
|
|
|
virtual bool ShouldDraw( void ); |
|
virtual void BuildTransformations( CStudioHdr *pStudioHdr, Vector *pos, Quaternion q[], const matrix3x4_t& cameraTransform, int boneMask, CBoneBitList &boneComputed ); |
|
|
|
virtual C_BaseAnimating * BecomeRagdollOnClient(); |
|
virtual IRagdoll* GetRepresentativeRagdoll() const; |
|
|
|
void ImpactTrace( trace_t *pTrace, int iDamageType, const char *pCustomImpactName ); |
|
|
|
// Have this player play the sounds from his view model's reload animation. |
|
void PlayReloadEffect(); |
|
|
|
virtual void FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options ); |
|
|
|
bool HasC4( void ); |
|
|
|
virtual void CreateLightEffects( void ) {} //no dimlight effects |
|
|
|
// Sometimes the server wants to update the client's cycle to get the two to run in sync (for proper hit detection) |
|
virtual void SetServerIntendedCycle( float intended ) { m_serverIntendedCycle = intended; } |
|
virtual float GetServerIntendedCycle( void ) { return m_serverIntendedCycle; } |
|
|
|
virtual bool ShouldReceiveProjectedTextures( int flags ) |
|
{ |
|
return ( this != C_BasePlayer::GetLocalPlayer() ); |
|
} |
|
|
|
void ClearSoundEvents() |
|
{ |
|
m_SoundEvents.RemoveAll(); |
|
} |
|
|
|
//============================================================================= |
|
// HPE_BEGIN: |
|
// [menglish] Returns whether this player is dominating or is being dominated by the specified player |
|
//============================================================================= |
|
bool IsPlayerDominated( int iPlayerIndex ); |
|
bool IsPlayerDominatingMe( int iPlayerIndex ); |
|
|
|
virtual void CalcFreezeCamView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov ); |
|
|
|
virtual float GetDeathCamInterpolationTime(); |
|
//============================================================================= |
|
// HPE_END |
|
//============================================================================= |
|
|
|
|
|
// Called by shared code. |
|
public: |
|
|
|
// ICSPlayerAnimState overrides. |
|
virtual CWeaponCSBase* CSAnim_GetActiveWeapon(); |
|
virtual bool CSAnim_CanMove(); |
|
|
|
|
|
void DoAnimationEvent( PlayerAnimEvent_t event, int nData = 0 ); |
|
|
|
|
|
// Implemented in shared code. |
|
public: |
|
virtual float GetPlayerMaxSpeed(); |
|
|
|
void GetBulletTypeParameters( |
|
int iBulletType, |
|
float &fPenetrationPower, |
|
float &flPenetrationDistance ); |
|
|
|
void FireBullet( |
|
Vector vecSrc, |
|
const QAngle &shootAngles, |
|
float flDistance, |
|
int iPenetration, |
|
int iBulletType, |
|
int iDamage, |
|
float flRangeModifier, |
|
CBaseEntity *pevAttacker, |
|
bool bDoEffects, |
|
float xSpread, float ySpread ); |
|
|
|
void KickBack( |
|
float up_base, |
|
float lateral_base, |
|
float up_modifier, |
|
float lateral_modifier, |
|
float up_max, |
|
float lateral_max, |
|
int direction_change ); |
|
|
|
// Returns true if the player is allowed to move. |
|
bool CanMove() const; |
|
|
|
void OnJump( float fImpulse ); |
|
void OnLand( float fVelocity ); |
|
|
|
bool HasC4() const; // Is this player carrying a C4 bomb? |
|
bool IsVIP() const; // Is this player the VIP? |
|
|
|
virtual void SetAnimation( PLAYER_ANIM playerAnim ); |
|
|
|
|
|
public: |
|
|
|
void UpdateIDTarget( void ); |
|
void RemoveAddonModels( void ); |
|
void UpdateMinModels( void ); |
|
|
|
void SetActivity( Activity eActivity ); |
|
Activity GetActivity( void ) const; |
|
|
|
ICSPlayerAnimState *GetPlayerAnimState() { return m_PlayerAnimState; } |
|
|
|
public: |
|
|
|
ICSPlayerAnimState *m_PlayerAnimState; |
|
|
|
// Used to control animation state. |
|
Activity m_Activity; |
|
|
|
// Predicted variables. |
|
CNetworkVar( bool, m_bResumeZoom ); |
|
CNetworkVar( int , m_iLastZoom ); // after firing a shot, set the FOV to 90, and after showing the animation, bring the FOV back to last zoom level. |
|
CNetworkVar( CSPlayerState, m_iPlayerState ); // SupraFiend: this gives the current state in the joining process, the states are listed above |
|
CNetworkVar( bool, m_bIsDefusing ); // tracks whether this player is currently defusing a bomb |
|
CNetworkVar( bool, m_bInBombZone ); |
|
CNetworkVar( bool, m_bInBuyZone ); |
|
CNetworkVar( int, m_iThrowGrenadeCounter ); // used to trigger grenade throw animations. |
|
|
|
bool IsInHostageRescueZone( void ); |
|
|
|
// This is a combination of the ADDON_ flags in cs_shareddefs.h. |
|
CNetworkVar( int, m_iAddonBits ); |
|
|
|
// Clients don't know about holstered weapons, so we need to be told about them here |
|
CNetworkVar( int, m_iPrimaryAddon ); |
|
CNetworkVar( int, m_iSecondaryAddon ); |
|
|
|
// 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 ); |
|
|
|
CNetworkVar( float, m_flStamina ); |
|
CNetworkVar( int, m_iDirection ); // The current lateral kicking direction; 1 = right, 0 = left |
|
CNetworkVar( int, m_iShotsFired ); // number of shots fired recently |
|
CNetworkVar( bool, m_bNightVisionOn ); |
|
CNetworkVar( bool, m_bHasNightVision ); |
|
|
|
//============================================================================= |
|
// HPE_BEGIN: |
|
// [dwenger] Added for fun-fact support |
|
//============================================================================= |
|
|
|
//CNetworkVar( bool, m_bPickedUpDefuser ); |
|
//CNetworkVar( bool, m_bDefusedWithPickedUpKit ); |
|
|
|
//============================================================================= |
|
// HPE_END |
|
//============================================================================= |
|
|
|
CNetworkVar( float, m_flVelocityModifier ); |
|
|
|
bool m_bDetected; |
|
|
|
EHANDLE m_hRagdoll; |
|
|
|
CWeaponCSBase* GetActiveCSWeapon() const; |
|
CWeaponCSBase* GetCSWeapon( CSWeaponID id ) const; |
|
|
|
virtual ShadowType_t ShadowCastType(); |
|
|
|
#ifdef CS_SHIELD_ENABLED |
|
bool HasShield( void ) { return m_bHasShield; } |
|
bool IsShieldDrawn( void ) { return m_bShieldDrawn; } |
|
void SetShieldDrawnState( bool bState ) { m_bShieldDrawn = bState; } |
|
#else |
|
bool HasShield( void ) { return false; } |
|
bool IsShieldDrawn( void ) { return false; } |
|
void SetShieldDrawnState( bool bState ) {} |
|
#endif |
|
|
|
float m_flNightVisionAlpha; |
|
|
|
float m_flFlashAlpha; |
|
float m_flFlashBangTime; |
|
CNetworkVar( float, m_flFlashMaxAlpha ); |
|
CNetworkVar( float, m_flFlashDuration ); |
|
|
|
// Having the RecvProxy in the player allows us to keep the var private |
|
static void RecvProxy_CycleLatch( const CRecvProxyData *pData, void *pStruct, void *pOut ); |
|
|
|
// Bots and hostages auto-duck during jumps |
|
bool m_duckUntilOnGround; |
|
|
|
Vector m_lastStandingPos; // used by the gamemovement code for finding ladders |
|
|
|
void SurpressLadderChecks( const Vector& pos, const Vector& normal ); |
|
bool CanGrabLadder( const Vector& pos, const Vector& normal ); |
|
|
|
//============================================================================= |
|
// HPE_BEGIN: |
|
//============================================================================= |
|
|
|
// [tj] checks if this player has another given player on their Steam friends list. |
|
bool HasPlayerAsFriend(C_CSPlayer* player); |
|
|
|
private: |
|
CountdownTimer m_ladderSurpressionTimer; |
|
Vector m_lastLadderNormal; |
|
Vector m_lastLadderPos; |
|
|
|
void UpdateRadar(); |
|
void UpdateSoundEvents(); |
|
|
|
void CreateAddonModel( int i ); |
|
void UpdateAddonModels(); |
|
|
|
void PushawayThink(); |
|
|
|
int m_iAccount; |
|
bool m_bHasHelmet; |
|
int m_iClass; |
|
int m_ArmorValue; |
|
QAngle m_angEyeAngles; |
|
bool m_bHasDefuser; |
|
bool m_bInHostageRescueZone; |
|
float m_fNextThinkPushAway; |
|
|
|
bool m_bPlayingFreezeCamSound; |
|
|
|
#ifdef CS_SHIELD_ENABLED |
|
bool m_bHasShield; |
|
bool m_bShieldDrawn; |
|
#endif |
|
|
|
Vector m_vecRagdollVelocity; |
|
|
|
CInterpolatedVar< QAngle > m_iv_angEyeAngles; |
|
|
|
// ID Target |
|
int m_iIDEntIndex; |
|
CountdownTimer m_delayTargetIDTimer; |
|
|
|
// Show the ID target after the cursor leaves the entity |
|
int m_iOldIDEntIndex; |
|
CountdownTimer m_holdTargetIDTimer; |
|
|
|
void ReleaseFlashlight( void ); |
|
Beam_t *m_pFlashlightBeam; |
|
|
|
class CCSSoundEvent |
|
{ |
|
public: |
|
string_t m_SoundName; |
|
float m_flEventTime; // Play the event when gpGlobals->curtime goes past this. |
|
}; |
|
CUtlLinkedList<CCSSoundEvent,int> m_SoundEvents; |
|
|
|
|
|
// This is the list of addons hanging off the guy (grenades, C4, nightvision, etc). |
|
CUtlLinkedList<CAddonModel, int> m_AddonModels; |
|
int m_iLastAddonBits; |
|
int m_iLastPrimaryAddon; |
|
int m_iLastSecondaryAddon; |
|
|
|
int m_cycleLatch; // server periodically updates this to fix up our anims, here it is a 4 bit fixed point |
|
float m_serverIntendedCycle; // server periodically updates this to fix up our anims, here it is the float we want, or -1 for no override |
|
|
|
|
|
|
|
//============================================================================= |
|
// HPE_BEGIN: |
|
// [tj] Network variables that track who are dominating and being dominated by |
|
//============================================================================= |
|
|
|
CNetworkArray( bool, m_bPlayerDominated, MAX_PLAYERS+1 ); // array of state per other player whether player is dominating other players |
|
CNetworkArray( bool, m_bPlayerDominatingMe, MAX_PLAYERS+1 ); // array of state per other player whether other players are dominating this player |
|
|
|
//============================================================================= |
|
// HPE_END |
|
//============================================================================= |
|
|
|
|
|
|
|
C_CSPlayer( const C_CSPlayer & ); |
|
}; |
|
|
|
C_CSPlayer* GetLocalOrInEyeCSPlayer( void ); |
|
|
|
inline C_CSPlayer *ToCSPlayer( CBaseEntity *pEntity ) |
|
{ |
|
if ( !pEntity || !pEntity->IsPlayer() ) |
|
return NULL; |
|
|
|
return dynamic_cast<C_CSPlayer*>( pEntity ); |
|
} |
|
|
|
namespace vgui |
|
{ |
|
class IImage; |
|
} |
|
|
|
vgui::IImage* GetDefaultAvatarImage( C_BasePlayer *pPlayer ); |
|
|
|
|
|
|
|
|
|
#endif // C_CS_PLAYER_H
|
|
|