css_enhanced_waf/game/client/cstrike/c_cs_player.h
Kamay Xutax 854991ab8c Fixed lag compensation for animations
The problem is that we still trust the client, although now we have a
good base to start with; The key difference here is that we don't need
to use anymore the cs player animestate client side anymore
because server side values are used

There are minor bugs like fire effect but they can be fixed
2024-07-11 02:12:51 +02:00

415 lines
12 KiB
C++

//========= 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, float currentTime );
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();
virtual bool SetupBones( matrix3x4_t *pBoneToWorldOut, int nMaxBones, int boneMask, float currentTime );
//=============================================================================
// 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;
public:
// 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;
float 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