|
|
//========= 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
|