|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef C_TF_PLAYER_H
#define C_TF_PLAYER_H
#ifdef _WIN32
#pragma once
#endif
#include "tf_playeranimstate.h"
#include "c_baseplayer.h"
#include "tf_shareddefs.h"
#include "baseparticleentity.h"
#include "tf_player_shared.h"
#include "c_tf_playerclass.h"
#include "tf_item.h"
#include "props_shared.h"
#include "hintsystem.h"
#include "c_playerattachedmodel.h"
#include "c_playerrelativemodel.h"
#include "iinput.h"
#include "ihasattributes.h"
#include "GameEventListener.h"
#include "tf_item_inventory.h"
#include "c_tf_mvm_boss_progress_user.h"
#include "c_te_legacytempents.h"
class C_MuzzleFlashModel; class C_BaseObject; class C_TFRagdoll; class C_TFWearable; class C_CaptureZone; class C_MerasmusBombEffect; class CTFReviveDialog; class C_TFDroppedWeapon; class C_PasstimePlayerReticle; class C_PasstimeAskForBallReticle;
extern ConVar tf_medigun_autoheal; extern ConVar cl_autorezoom; extern ConVar cl_autoreload;
enum EBonusEffectFilter_t { kEffectFilter_AttackerOnly, kEffectFilter_AttackerTeam, kEffectFilter_VictimOnly, kEffectFilter_VictimTeam, kEffectFilter_AttackerAndVictimOnly, kEffectFilter_BothTeams, };
struct BonusEffect_t { BonusEffect_t( const char* pszSoundName, const char* pszParticleName, EBonusEffectFilter_t eParticleFilter, EBonusEffectFilter_t eSoundFilter, bool bPlaySoundInAttackersEars ) : m_pszSoundName( pszSoundName ) , m_pszParticleName( pszParticleName ) , m_eParticleFilter( eParticleFilter ) , m_eSoundFilter( eSoundFilter ) , m_bPlaySoundInAttackersEars( bPlaySoundInAttackersEars )
{}
const char* m_pszSoundName; const char* m_pszParticleName; EBonusEffectFilter_t m_eParticleFilter; EBonusEffectFilter_t m_eSoundFilter; bool m_bPlaySoundInAttackersEars; };
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class C_TFPlayer : public C_BasePlayer, public IHasAttributes, public IInventoryUpdateListener, public C_TFMvMBossProgressUser { public:
DECLARE_CLASS( C_TFPlayer, C_BasePlayer ); DECLARE_CLIENTCLASS(); DECLARE_PREDICTABLE(); DECLARE_INTERPOLATION();
C_TFPlayer(); ~C_TFPlayer();
virtual void Spawn();
static C_TFPlayer* GetLocalTFPlayer();
virtual void UpdateOnRemove( void );
virtual const QAngle& GetRenderAngles(); virtual void UpdateClientSideAnimation(); virtual void SetDormant( bool bDormant ); virtual void OnPreDataChanged( DataUpdateType_t updateType ); virtual void OnDataChanged( DataUpdateType_t updateType ); virtual void ProcessMuzzleFlashEvent(); virtual void ValidateModelIndex( void ); void Touch( CBaseEntity *pOther );
virtual Vector GetObserverCamOrigin( void ); virtual int DrawModel( int flags );
virtual void ApplyBoneMatrixTransform( matrix3x4_t& transform ); virtual void BuildTransformations( CStudioHdr *hdr, Vector *pos, Quaternion q[], const matrix3x4_t& cameraTransform, int boneMask, CBoneBitList &boneComputed );
virtual bool CreateMove( float flInputSampleTime, CUserCmd *pCmd ) OVERRIDE; void CreateVehicleMove( float flInputSampleTime, CUserCmd *pCmd );
virtual bool IsAllowedToSwitchWeapons( void );
void StopViewModelParticles( C_BaseEntity *pParticleEnt );
virtual void ClientThink();
// Deal with recording
virtual void GetToolRecordingState( KeyValues *msg );
CTFWeaponBase *GetActiveTFWeapon( void ) const; bool IsActiveTFWeapon( CEconItemDefinition *weaponHandle ) const; bool IsActiveTFWeapon( const CSchemaItemDefHandle &weaponHandle ) const;
virtual void Simulate( void ); virtual void FireEvent( const Vector& origin, const QAngle& angles, int event, const char *options ) OVERRIDE; virtual void UpdateStepSound( surfacedata_t *psurface, const Vector &vecOrigin, const Vector &vecVelocity ) OVERRIDE;
CNewParticleEffect *SpawnHalloweenSpellFootsteps( ParticleAttachment_t eParticleAttachment, int iHalloweenFootstepType );
void FireBullet( CTFWeaponBase *pWpn, const FireBulletsInfo_t &info, bool bDoEffects, int nDamageType, int nCustomDamageType = TF_DMG_CUSTOM_NONE );
void ImpactWaterTrace( trace_t &trace, const Vector &vecStart );
bool CanAttack( int iCanAttackFlags = 0 );
const C_TFPlayerClass *GetPlayerClass( void ) const { return &m_PlayerClass; } C_TFPlayerClass *GetPlayerClass( void ) { return &m_PlayerClass; } bool IsPlayerClass( int iClass ) const; virtual int GetMaxHealth( void ) const; int GetMaxHealthForBuffing() const;
virtual int GetRenderTeamNumber( void );
bool IsWeaponLowered( void );
void AvoidPlayers( CUserCmd *pCmd );
bool IsABot( void );
// Get the ID target entity index. The ID target is the player that is behind our crosshairs, used to
// display the player's name.
void UpdateIDTarget(); int GetIDTarget() const; void SetForcedIDTarget( int iTarget );
void SetAnimation( PLAYER_ANIM playerAnim );
virtual float GetMinFOV() const;
virtual const QAngle& EyeAngles();
bool ShouldDrawSpyAsDisguised(); virtual int GetBody( void );
int GetBuildResources( void );
// MATTTODO: object selection if necessary
void SetSelectedObject( C_BaseObject *pObject ) {}
void GetTeamColor( Color &color ); bool InSameDisguisedTeam( CBaseEntity *pEnt );
virtual void ComputeFxBlend( void );
// Taunts/VCDs
virtual bool StartSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor, C_BaseEntity *pTarget ); virtual bool ClearSceneEvent( CSceneEventInfo *info, bool fastKill, bool canceled ); virtual void CalcView( Vector &eyeOrigin, QAngle &eyeAngles, float &zNear, float &zFar, float &fov ); bool StartGestureSceneEvent( CSceneEventInfo *info, CChoreoScene *scene, CChoreoEvent *event, CChoreoActor *actor, CBaseEntity *pTarget ); bool StopGestureSceneEvent( CSceneEventInfo *info, bool fastKill, bool canceled ); void TurnOnTauntCam( void ); void TurnOnTauntCam_Finish( void ); void TurnOffTauntCam( void ); void TurnOffTauntCam_Finish( void ); bool IsTaunting( void ) const { return m_Shared.InCond( TF_COND_TAUNTING ); }
virtual void InitPhonemeMappings();
// Gibs.
void InitPlayerGibs( void ); void CheckAndUpdateGibType( void ); void CreatePlayerGibs( const Vector &vecOrigin, const Vector &vecVelocity, float flImpactScale, bool bBurning, bool bWearableGibs=false, bool bOnlyHead=false, bool bDisguiseGibs=false ); void DropPartyHat( breakablepropparams_t &breakParams, Vector &vecBreakVelocity ); void DropWearable( C_TFWearable *pItem, const breakablepropparams_t ¶ms );
int GetObjectCount( void ); C_BaseObject *GetObject( int index ); C_BaseObject *GetObjectOfType( int iObjectType, int iObjectMode=0 ) const; int GetNumObjects( int iObjectType, int iObjectMode=0 );
virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const;
float GetPercentInvisible( void ); float GetEffectiveInvisibilityLevel( void ); // takes viewer into account
virtual bool IsTransparent( void ) OVERRIDE { return GetPercentInvisible() > 0.f; }
virtual void AddDecal( const Vector& rayStart, const Vector& rayEnd, const Vector& decalCenter, int hitbox, int decalIndex, bool doTrace, trace_t& tr, int maxLODToDecal = ADDDECAL_TO_ALL_LODS );
virtual void CalcDeathCamView(Vector& eyeOrigin, QAngle& eyeAngles, float& fov); virtual Vector GetChaseCamViewOffset( CBaseEntity *target ); virtual Vector GetDeathViewPosition();
void ClientPlayerRespawn( void );
virtual bool ShouldDraw();
virtual int GetVisionFilterFlags( bool bWeaponsCheck = false ); virtual void CalculateVisionUsingCurrentFlags( void );
void CreateSaveMeEffect( MedicCallerType nType = CALLER_TYPE_NORMAL ); void StopSaveMeEffect( bool bForceRemoveInstantly = false );
void CreateTauntWithMeEffect(); void StopTauntWithMeEffect();
void CreateKart(); void RemoveKart(); C_BaseAnimating *GetKart() const { return m_pKart; } void CreateKartEffect( const char *pszEffectName ); void StopKartEffect(); void UpdateKartSounds(); void StartKartBrakeEffect(); void StopKartBrakeEffect(); CNetworkVar( int, m_iKartState );
bool IsAllowedToTaunt( void ); virtual bool IsOverridingViewmodel( void ); virtual int DrawOverriddenViewmodel( C_BaseViewModel *pViewmodel, int flags );
void SetHealer( C_TFPlayer *pHealer, float flChargeLevel ); void SetWasHealedByLocalPlayer( bool bState ) { m_bWasHealedByLocalPlayer = bState; } void GetHealer( C_TFPlayer **pHealer, float *flChargeLevel ) { *pHealer = m_hHealer; *flChargeLevel = m_flHealerChargeLevel; } bool GetWasHealedByLocalPlayer() { return m_bWasHealedByLocalPlayer; } float MedicGetChargeLevel( CTFWeaponBase **pRetMedigun = NULL ); bool MedicIsReleasingCharge( void ); CBaseEntity *MedicGetHealTarget( void );
void StartBurningSound( void ); void StopBurningSound( void );
void StopBlastJumpLoopSound( int iUserID ); void UpdateSpyStateChange( void );
void UpdateRecentlyTeleportedEffect( void ); void UpdateOverhealEffect( void ); void UpdatedMarkedForDeathEffect( bool bFroceStop = false ); void CreateOverhealEffect( int iTeam ); void UpdateRuneIcon( bool bForceStop = false );
bool CanShowClassMenu( void ); bool CanShowTeamMenu( void );
void InitializePoseParams( void ); void UpdateLookAt( void );
bool IsEnemyPlayer( void ); void ShowNemesisIcon( bool bShow ); void ShowDuelingIcon( bool bShow ); void ShowIconForIT( bool bShow );
#ifdef STAGING_ONLY
void UpdateTranqMark( bool bShow, bool bForceStop = false ); void UpdateSpyClassStealParticle( bool bShow ); #endif // STAGING_ONLY
void ShowBirthdayEffect( bool bShow );
CUtlVector<EHANDLE> *GetSpawnedGibs( void ) { return &m_hSpawnedGibs; }
bool HasBombinomiconEffectOnDeath( void );
Vector GetClassEyeHeight( void );
void ForceUpdateObjectHudState( void );
bool GetMedigunAutoHeal( void ){ return tf_medigun_autoheal.GetBool(); } bool ShouldAutoRezoom( void ){ return cl_autorezoom.GetBool(); } bool ShouldAutoReload( void ){ return cl_autoreload.GetBool(); }
void GetTargetIDDataString( bool bIsDisguised, OUT_Z_BYTECAP(iMaxLenInBytes) wchar_t *sDataString, int iMaxLenInBytes, bool &bIsAmmoData, bool &bIsKillStreakData );
void RemoveDisguise( void ); bool CanDisguise( void ); bool CanDisguise_OnKill( void );
virtual void OnAchievementAchieved( int iAchievement );
virtual void OverrideView( CViewSetup *pSetup );
bool CanAirDash( void ) const; bool CanGetWet() const;
void CreateBoneAttachmentsFromWearables( C_TFRagdoll *pRagdoll, bool bDisguised );
bool CanUseFirstPersonCommand( void );
bool IsEffectRateLimited( EBonusEffectFilter_t effect, const C_TFPlayer* pAttacker ) const; bool ShouldPlayEffect( EBonusEffectFilter_t filter, const C_TFPlayer* pAttacker, const C_TFPlayer* pVictim ) const; virtual void FireGameEvent( IGameEvent *event );
virtual const char* ModifyEventParticles( const char* token );
// Set the distances the camera should use.
void SetTauntCameraTargets( float back, float up );
// TF-specific color values for GlowEffect
virtual void GetGlowEffectColor( float *r, float *g, float *b ); void UpdateGlowColor( void );
virtual const Vector& GetRenderOrigin( void );
RTime32 GetSpottedInPVSTime() const { return m_rtSpottedInPVSTime; } RTime32 GetJoinedSpectatorTeamTime() const { return m_rtJoinedSpectatorTeam; } RTime32 GetJoinedNormalTeamTime() const { return m_rtJoinedNormalTeam; }
// IHasAttributes
CAttributeManager *GetAttributeManager( void ) { return &m_AttributeManager; } CAttributeContainer *GetAttributeContainer( void ) { return NULL; } CBaseEntity *GetAttributeOwner( void ) { return NULL; } CAttributeList *GetAttributeList( void ) { return &m_AttributeList; } virtual void ReapplyProvision( void ) { return; }
// ITFMvMBossProgressUser
virtual const char* GetBossProgressImageName() const OVERRIDE; virtual float GetBossStatusProgress() const OVERRIDE;
protected: CNetworkVarEmbedded( CAttributeContainerPlayer, m_AttributeManager );
// IClientNetworkable implementation.
public: virtual void NotifyShouldTransmit( ShouldTransmitState_t state );
public: // Shared functions
float GetMovementForwardPull( void ) const; bool CanPlayerMove() const; float TeamFortress_CalculateMaxSpeed( bool bIgnoreSpecialAbility = false ) const; void TeamFortress_SetSpeed(); bool HasItem( void ) const; // Currently can have only one item at a time.
void SetItem( C_TFItem *pItem ); C_TFItem *GetItem( void ) const; bool HasTheFlag( ETFFlagType exceptionTypes[] = NULL, int nNumExceptions = 0 ) const; virtual bool IsAllowedToPickUpFlag( void ) const; float GetCritMult( void ) { return m_Shared.GetCritMult(); }
virtual void ItemPostFrame( void );
void SetOffHandWeapon( CTFWeaponBase *pWeapon ); void HolsterOffHandWeapon( void ); CTFWeaponBase* GetOffHandWeapon( void ) { return m_hOffHandWeapon; }
void GetActiveSets( CUtlVector<const CEconItemSetDefinition *> *pItemSets );
virtual int GetSkin();
float GetLastDamageTime( void ) const { return m_flLastDamageTime; }
virtual bool Weapon_CanSwitchTo( CBaseCombatWeapon *pWeapon );
virtual bool Weapon_ShouldSetLast( CBaseCombatWeapon *pOldWeapon, CBaseCombatWeapon *pNewWeapon ) OVERRIDE; virtual bool Weapon_Switch( C_BaseCombatWeapon *pWeapon, int viewmodelindex = 0 ) OVERRIDE; virtual void SelectItem( const char *pstr, int iSubType = 0 ) OVERRIDE;
virtual void UpdateWearables() OVERRIDE; CTFWearable *GetEquippedWearableForLoadoutSlot( int iLoadoutSlot ); CBaseEntity *GetEntityForLoadoutSlot( int iLoadoutSlot ); //Gets whatever entity is associated with the loadout slot (wearable or weapon)
CTFWeaponBase *Weapon_OwnsThisID( int iWeaponID ) const; CTFWeaponBase *Weapon_GetWeaponByType( int iType );
virtual void GetStepSoundVelocities( float *velwalk, float *velrun ); virtual void SetStepSoundTime( stepsoundtimes_t iStepSoundTime, bool bWalking ); virtual const char *GetOverrideStepSound( const char *pszBaseStepSoundName );
virtual void OnEmitFootstepSound( const CSoundParameters& params, const Vector& vecOrigin, float fVolume );
virtual void ModifyEmitSoundParams( EmitSound_t ¶ms );
virtual void ThirdPersonSwitch( bool bThirdperson );
bool DoClassSpecialSkill( void ); bool EndClassSpecialSkill( void ); bool CanGoInvisible( bool bAllowWhileCarryingFlag = false ); int GetMaxAmmo( int iAmmoIndex, int iClassIndex = -1 );
//-----------------------------------------------------------------------------------------------------
// Return true if we are a "mini boss" in Mann Vs Machine mode
bool IsMiniBoss( void ) const; bool ShouldTauntHintIconBeVisible() const; virtual bool IsHealthBarVisible( void ) const OVERRIDE;
bool CanStartPhase( void );
bool CanPickupBuilding( CBaseObject *pPickupObject ); bool TryToPickupBuilding( void ); void StartBuildingObjectOfType( int iType, int iObjectMode=0 );
void FeignDeath( CTakeDamageInfo& info );
C_CaptureZone *GetCaptureZoneStandingOn( void ); C_CaptureZone *GetClosestCaptureZone( void );
float GetMetersRan( void ) { return m_fMetersRan; } void SetMetersRan( float fMeters, int iFrame );
CEconItemView *GetInspectItem( int *iLastItem );
void SetBodygroupsDirty( void ); void RecalcBodygroupsIfDirty( void );
bool CanMoveDuringTaunt(); bool ShouldStopTaunting(); bool IsTauntForceMovingForward() const { return m_bTauntForceMoveForward; } float GetTauntMoveAcceleration() const { return m_flTauntMoveAccelerationTime; } float GetTauntMoveSpeed() const { return m_flTauntForceMoveForwardSpeed; } float GetTauntTurnAccelerationTime() const { return m_flTauntTurnAccelerationTime; } bool IsReadyToTauntWithPartner( void ) const { return m_bIsReadyToHighFive; } CTFPlayer * GetTauntPartner( void ) { return m_hHighFivePartner; } float GetTauntYaw( void ) { return m_flTauntYaw; } float GetPrevTauntYaw( void ) { return m_flPrevTauntYaw; } void SetTauntYaw( float flTauntYaw ); int GetActiveTauntSlot() const { return m_nActiveTauntSlot; } void PlayTauntSoundLoop( const char *pszSoundLoopName ); void StopTauntSoundLoop(); float GetCurrentTauntMoveSpeed() const { return m_flCurrentTauntMoveSpeed; } void SetCurrentTauntMoveSpeed( float flSpeed ) { m_flCurrentTauntMoveSpeed = flSpeed; } float GetVehicleReverseTime() const { return m_flVehicleReverseTime; } void SetVehicleReverseTime( float flTime ) { m_flVehicleReverseTime = flTime; }
CEconItemView *GetTauntEconItemView() { return m_TauntEconItemView.IsValid() ? &m_TauntEconItemView : NULL; }
float GetHeadScale() const { return m_flHeadScale; } float GetTorsoScale() const { return m_flTorsoScale; } float GetHandScale() const { return m_flHandScale; } float GetLastResistTime() const { return m_flLastResistTime; } bool BRenderAsZombie( bool bWeaponsCheck = false ); static void AdjustSkinIndexForZombie( int iClassIndex, int &iSkinIndex );
// Ragdolls.
virtual C_BaseAnimating *BecomeRagdollOnClient(); virtual IRagdoll *GetRepresentativeRagdoll() const; EHANDLE m_hRagdoll; Vector m_vecRagdollVelocity;
// Objects
int CanBuild( int iObjectType, int iObjectMode=0 ); CUtlVector< CHandle<C_BaseObject> > m_aObjects;
virtual CStudioHdr *OnNewModel( void );
void DisplaysHintsForTarget( C_BaseEntity *pTarget );
// Shadows
virtual ShadowType_t ShadowCastType( void ) ; virtual void GetShadowRenderBounds( Vector &mins, Vector &maxs, ShadowType_t shadowType ); virtual void GetRenderBounds( Vector& theMins, Vector& theMaxs ); virtual bool GetShadowCastDirection( Vector *pDirection, ShadowType_t shadowType ) const;
CMaterialReference *GetInvulnMaterialRef( void ) { return &m_InvulnerableMaterial; } bool IsNemesisOfLocalPlayer(); bool ShouldShowDuelingIcon(); bool ShouldShowNemesisIcon();
virtual IMaterial *GetHeadLabelMaterial( void );
// Spy Cigarette
bool CanLightCigarette( void );
void UpdateDemomanEyeEffect( int iDecapitations ); const char* GetDemomanEyeEffectName( int iDecapitations );
int GetCurrency( void ){ return m_nCurrency; }
virtual void UpdateMVMEyeGlowEffect( bool bVisible );
void UpdateKillStreakEffects( int iCount, bool bKillScored = false ); const char *GetEyeGlowEffect() { return m_pszEyeGlowEffectName; } Vector GetEyeGlowColor( bool bAlternate ) { return bAlternate? m_vEyeGlowColor1 : m_vEyeGlowColor2 ; }
// Bounty Mode
int GetExperienceLevel( void ) { return m_nExperienceLevel; }
// Matchmaking
bool GetMatchSafeToLeave() { return m_bMatchSafeToLeave; }
// Halloween silliness.
void HalloweenBombHeadUpdate( void );
bool IsUsingVRHeadset( void ){ return m_bUsingVRHeadset; }
bool ShouldPlayerDrawParticles( void );
bool IsPlayerOnSteamFriendsList( C_BasePlayer *pPlayer );
protected:
void ResetFlexWeights( CStudioHdr *pStudioHdr );
virtual void CalcInEyeCamView( Vector& eyeOrigin, QAngle& eyeAngles, float& fov );
virtual void UpdateGlowEffect( void ); virtual void DestroyGlowEffect( void );
private:
bool ShouldShowPowerupGlowEffect(); void GetPowerupGlowEffectColor( float *r, float *g, float *b );
void HandleTaunting( void ); void TauntCamInterpolation( void );
void OnPlayerClassChange( void ); void UpdatePartyHat( void );
void InitInvulnerableMaterial( void );
void GetHorriblyHackedRailgunPosition( const Vector& vStart, Vector *out_pvStartPos ); void MaybeDrawRailgunBeam( IRecipientFilter *pFilter, CTFWeaponBase *pWeapon, const Vector& vStartPos, const Vector& vEndPos );
bool m_bWasTaunting; bool m_bTauntInterpolating; CameraThirdData_t m_TauntCameraData; float m_flTauntCamCurrentDist; float m_flTauntCamTargetDist; float m_flTauntCamCurrentDistUp; float m_flTauntCamTargetDistUp;
QAngle m_angTauntPredViewAngles; QAngle m_angTauntEngViewAngles;
CSoundPatch *m_pTauntSoundLoop;
C_TFPlayerClass m_PlayerClass;
// ID Target
int m_iIDEntIndex; int m_iForcedIDTarget;
CNewParticleEffect *m_pTeleporterEffect; bool m_bToolRecordingVisibility;
int m_iOldSpawnCounter;
// Healer
CHandle<C_TFPlayer> m_hHealer; bool m_bWasHealedByLocalPlayer; float m_flHealerChargeLevel; int m_iOldHealth; int m_nOldMaxHealth;
float m_fMetersRan; int m_iLastRanFrame;
HPARTICLEFFECT m_pEyeEffect;
bool m_bOldCustomModelVisible;
CHandle< C_BaseCombatWeapon > m_hOldActiveWeapon;
// Look At
/*
int m_headYawPoseParam; int m_headPitchPoseParam; float m_headYawMin; float m_headYawMax; float m_headPitchMin; float m_headPitchMax; float m_flLastBodyYaw; float m_flCurrentHeadYaw; float m_flCurrentHeadPitch; */
// Spy cigarette smoke
bool m_bCigaretteSmokeActive;
// Medic callout particle effect
CNewParticleEffect *m_pSaveMeEffect; CNewParticleEffect *m_pTauntWithMeEffect;
bool m_bUpdateObjectHudState; bool m_bBodygroupsDirty;
HPARTICLEFFECT m_hKartDamageEffect; CNetworkVar( float, m_flKartNextAvailableBoost ); CNetworkVar( int, m_iKartHealth ); int m_iOldKartHealth; void UpdateKartEffects();
void UpdateKartState(); int m_iOldKartState;
C_BaseAnimating *m_pKart;
public: float GetKartSpeedBoost( void ); float GetKartHealth( void ) { return m_iKartHealth; }
CTFPlayerShared m_Shared; friend class CTFPlayerShared;
// Called by shared code.
public: float GetClassChangeTime() const { return m_flChangeClassTime; } void SetFootStamps( int nFootStamps ) { m_nFootStamps = nFootStamps; }
void DoAnimationEvent( PlayerAnimEvent_t event, int nData = 0 ); bool PlayAnimEventInPrediction( PlayerAnimEvent_t event );
bool GetPredictable( void ) const;
// Halloween
void CreateBombonomiconHint(); void DestroyBombonomiconHint();
void CleanUpAnimationOnSpawn(); CTFPlayerAnimState *m_PlayerAnimState;
QAngle m_angEyeAngles; CInterpolatedVar< QAngle > m_iv_angEyeAngles;
CNetworkHandle( C_TFItem, m_hItem );
CNetworkHandle( C_TFWeaponBase, m_hOffHandWeapon ); CNetworkHandle( C_TFPlayer, m_hCoach ); CNetworkHandle( C_TFPlayer, m_hStudent );
CGlowObject *m_pStudentGlowEffect; CGlowObject *m_pPowerupGlowEffect;
int m_iOldPlayerClass; // Used to detect player class changes
bool m_bIsDisplayingNemesisIcon; bool m_bIsDisplayingDuelingIcon; bool m_bIsDisplayingIconForIT; bool m_bIsDisplayingTranqMark; bool m_bShouldShowBirthdayEffect;
RuneTypes_t m_eDisplayingRuneIcon;
float m_flLastDamageTime;
bool m_bInPowerPlay;
int m_iSpawnCounter; bool m_bArenaSpectator;
bool m_bIsMiniBoss; bool m_bIsABot; int m_nBotSkill; int m_nOldBotSkill; bool m_bSaveMeParity; bool m_bOldSaveMeParity; bool m_bIsCoaching;
private: void UpdateTauntItem(); void ParseSharedTauntDataFromEconItemView( CEconItemView *pEconItemView );
bool m_bAllowMoveDuringTaunt; bool m_bTauntForceMoveForward; float m_flTauntForceMoveForwardSpeed; float m_flTauntMoveAccelerationTime; float m_flTauntTurnSpeed; float m_flTauntTurnAccelerationTime; bool m_bIsReadyToHighFive; CNetworkHandle( C_TFPlayer, m_hHighFivePartner ); int m_nForceTauntCam; float m_flTauntYaw; float m_flPrevTauntYaw; int m_nActiveTauntSlot; int m_nPrevTauntSlot; item_definition_index_t m_iTauntItemDefIndex; item_definition_index_t m_iPrevTauntItemDefIndex; float m_flCurrentTauntMoveSpeed; float m_flVehicleReverseTime;
int m_nTauntSequence; float m_flTauntStartTime; float m_flTauntDuration;
CEconItemView m_TauntEconItemView;
public:
int m_nOldWaterLevel; float m_flWaterEntryTime; bool m_bWaterExitEffectActive;
bool m_bDuckJumpInterp; float m_flFirstDuckJumpInterp; float m_flLastDuckJumpInterp; float m_flDuckJumpInterp;
CMaterialReference m_InvulnerableMaterial;
// Burning
CSoundPatch *m_pBurningSound; HPARTICLEFFECT m_pBurningEffect; float m_flBurnEffectStartTime;
// Urine
HPARTICLEFFECT m_pUrineEffect;
// Milk
HPARTICLEFFECT m_pMilkEffect;
// Soldier Buff
HPARTICLEFFECT m_pSoldierOffensiveBuffEffect; HPARTICLEFFECT m_pSoldierDefensiveBuffEffect; HPARTICLEFFECT m_pSoldierOffensiveHealthRegenBuffEffect; HPARTICLEFFECT m_pSoldierNoHealingDamageBuffEffect;
// Speed boost
HPARTICLEFFECT m_pSpeedBoostEffect;
// Taunt effects
HPARTICLEFFECT m_pTauntEffect;
// Temp HACK for crit boost
HPARTICLEFFECT m_pCritBoostEffect;
HPARTICLEFFECT m_pOverHealedEffect; HPARTICLEFFECT m_pPhaseStandingEffect;
HPARTICLEFFECT m_pStunnedEffect;
HPARTICLEFFECT m_pMegaHealEffect; HPARTICLEFFECT m_pRadiusHealEffect; HPARTICLEFFECT m_pKingRuneRadiusEffect; HPARTICLEFFECT m_pKingBuffRadiusEffect; HPARTICLEFFECT m_pRunePlagueEffect; C_LocalTempEntity* m_pTempShield; float m_flLastResistTime;
HPARTICLEFFECT m_pSappedPlayerEffect; HPARTICLEFFECT m_pMVMEyeGlowEffect[ 2 ];
// KillStreak Weapons
char m_pszEyeGlowEffectName[MAX_PATH]; Vector m_vEyeGlowColor1; Vector m_vEyeGlowColor2; HPARTICLEFFECT m_pEyeGlowEffect[ 2 ]; float m_flNextSheenStartTime; HPARTICLEFFECT m_pMVMBotRadiowave;
HPARTICLEFFECT m_pRuneChargeReadyEffect;
#ifdef STAGING_ONLY
HPARTICLEFFECT m_pRocketPackEffect; #endif // STAGING_ONLY
enum EKartParticles { KART_PARTICLE_LEFT_LIGHT = 0, KART_PARTICLE_RIGHT_LIGHT,
KART_PARTICLE_LEFT_WHEEL, KART_PARTICLE_RIGHT_WHEEL, NUM_KART_PARTICLES }; HPARTICLEFFECT m_pKartParticles[ NUM_KART_PARTICLES ];
enum EKartSounds { KART_SOUND_ENGINE_LOOP = 0, KART_SOUND_BURNOUT_LOOP,
NUM_KART_SOUNDS, }; CSoundPatch *m_pKartSounds[ NUM_KART_SOUNDS ];
CNewParticleEffect *m_pDisguisingEffect; float m_flDisguiseEffectStartTime; float m_flDisguiseEndEffectStartTime;
EHANDLE m_hFirstGib; EHANDLE m_hHeadGib; CUtlVector<EHANDLE> m_hSpawnedGibs;
int m_iOldTeam; int m_iOldClass; int m_iOldDisguiseTeam; int m_iOldDisguiseClass; int m_iOldObserverMode; EHANDLE m_hOldObserverTarget;
bool m_bDisguised; int m_iPreviousMetal;
int GetNumActivePipebombs( void );
int m_iSpyMaskBodygroup; Vector m_vecCustomModelOrigin;
// Halloween
CHandle<C_PlayerAttachedModel> m_hHalloweenBombHat; CHandle<C_MerasmusBombEffect> m_hBombonomiconHint; CHandle<C_PlayerAttachedModel> m_hHalloweenKartCage; float m_flBombDelay;
// Achievements
float m_flSaveMeExpireTime;
//CountdownTimer m_LeaveServerTimer;
//----------------------------
// INVENTORY MANAGEMENT
public: // IInventoryUpdateListener
virtual void InventoryUpdated( CPlayerInventory *pInventory ); virtual void SOCacheUnsubscribed( const CSteamID & steamIDOwner ) { m_Shared.SetLoadoutUnavailable( true ); } void UpdateInventory( bool bInit );
// Inventory access
CTFPlayerInventory *Inventory( void ) { return &m_Inventory; }
bool CanDisplayAllSeeEffect( EAttackBonusEffects_t effect ) const; void SetNextAllSeeEffectTime( EAttackBonusEffects_t effect, float flTime );
private: CTFPlayerInventory m_Inventory; bool m_bInventoryReceived;
private: float m_flChangeClassTime;
float m_flWaterImpactTime; RTime32 m_rtSpottedInPVSTime; RTime32 m_rtJoinedSpectatorTeam; RTime32 m_rtJoinedNormalTeam;
// Gibs.
CUtlVector< int > m_aSillyGibs; CUtlVector< char* > m_aNormalGibs; CUtlVector<breakmodel_t> m_aGibs;
C_TFPlayer( const C_TFPlayer & );
mutable char m_bIsCalculatingMaximumSpeed;
// In-game currency
int m_nCurrency; int m_nOldCurrency;
// Bounty Mode
int m_nExperienceLevel; int m_nExperienceLevelProgress; int m_nPrevExperienceLevel;
// Matchmaking
// is this player bound to the match on penalty of abandon. Sync'd via local-player-only DT
bool m_bMatchSafeToLeave;
// Medic healtarget active weapon ammo/clip count
uint16 m_nActiveWpnClip; // Blast jump whistle
CSoundPatch *m_pBlastJumpLoop; float m_flBlastJumpLaunchTime;
CNetworkVar( float, m_flHeadScale ); CNetworkVar( float, m_flTorsoScale ); CNetworkVar( float, m_flHandScale );
// Allseecrit throttle - other clients ask us if we can be the source of another particle+sound
float m_flNextMiniCritEffectTime[ kBonusEffect_Count ];
CNetworkVar( bool, m_bUseBossHealthBar );
CNetworkVar( bool, m_bUsingVRHeadset );
CNetworkVar( bool, m_bForcedSkin ); CNetworkVar( int, m_nForcedSkin );
int m_nFootStamps;
vgui::DHANDLE< CTFReviveDialog > m_hRevivePrompt;
public: void SetShowHudMenuTauntSelection( bool bShow ) { m_bShowHudMenuTauntSelection = bShow; } bool ShouldShowHudMenuTauntSelection() const { return m_bShowHudMenuTauntSelection; }
private: bool m_bShowHudMenuTauntSelection;
public: CBaseEntity *GetGrapplingHookTarget() const { return m_hGrapplingHookTarget; }
bool IsUsingActionSlot() const { return m_bUsingActionSlot; } void SetUsingActionSlot( bool bUsingActionSlot ) { m_bUsingActionSlot = bUsingActionSlot; } void SetSecondaryLastWeapon( CBaseCombatWeapon *pSecondaryLastWeapon ) { m_hSecondaryLastWeapon = pSecondaryLastWeapon; } CBaseCombatWeapon* GetSecondaryLastWeapon() const { return m_hSecondaryLastWeapon; }
bool CanPickupDroppedWeapon( const C_TFDroppedWeapon *pWeapon ); C_TFDroppedWeapon* GetDroppedWeaponInRange();
bool HasCampaignMedal( int iMedal ); CampaignMedalDisplayType_t GetCampaignMedalType( void ); const char *GetCampaignMedalImage( void );
void SetInspectTime( float flInspectTime ) { m_flInspectTime = flInspectTime; } bool IsInspecting() const; void HandleInspectHint();
bool AddOverheadEffect( const char *pszEffectName ); void RemoveOverheadEffect( const char *pszEffectName, bool bRemoveInstantly ); void UpdateOverheadEffects(); Vector GetOverheadEffectPosition();
int GetSkinOverride() const { return m_iPlayerSkinOverride; }
private: CNetworkHandle( CBaseEntity, m_hGrapplingHookTarget ); CNetworkHandle( CBaseCombatWeapon, m_hSecondaryLastWeapon ); CNetworkVar( bool, m_bUsingActionSlot ); CNetworkVar( int, m_iCampaignMedals ); CNetworkVar( float, m_flInspectTime );
bool m_bNotifiedWeaponInspectThisLife;
C_PasstimePlayerReticle *m_pPasstimePlayerReticle; C_PasstimeAskForBallReticle *m_pPasstimeAskForBallReticle;
CUtlMap< const char *, HPARTICLEFFECT > m_mapOverheadEffects; float m_flOverheadEffectStartTime;
CNetworkVar( int, m_iPlayerSkinOverride ); };
inline C_TFPlayer* ToTFPlayer( C_BaseEntity *pEntity ) { if ( !pEntity || !pEntity->IsPlayer() ) return NULL;
Assert( dynamic_cast<C_TFPlayer*>( pEntity ) != 0 ); return static_cast< C_TFPlayer* >( pEntity ); }
void SetAppropriateCamera( C_TFPlayer *pPlayer );
class C_TFPlayerPreviewEffect { public: // If you re-order this list, please update TF_ImportPreview_Effect* in tf_english.txt
enum PREVIEW_EFFECT { PREVIEW_EFFECT_NONE, PREVIEW_EFFECT_UBER, //PREVIEW_EFFECT_CRIT, // Punting on particle effects for now
PREVIEW_EFFECT_URINE, //PREVIEW_EFFECT_MILK, // Punting on particle effects for now
//PREVIEW_EFFECT_INVIS, // The CMDLPanel draw path doesn't handle transparency at the moment
PREVIEW_EFFECT_BURN, NUM_PREVIEW_EFFECTS };
public: C_TFPlayerPreviewEffect();
void SetEffect(PREVIEW_EFFECT nEffect) { m_nPreviewEffect = nEffect; } PREVIEW_EFFECT GetEffect() const { return m_nPreviewEffect; }
void SetTeam(int nTeam); int GetTeam() const { return m_nTeam; }
CMaterialReference *GetInvulnMaterialRef( void ) { return &m_InvulnerableMaterial; }
void Reset();
protected: PREVIEW_EFFECT m_nPreviewEffect; int m_nTeam; CMaterialReference m_InvulnerableMaterial; }; extern C_TFPlayerPreviewEffect g_PlayerPreviewEffect;
#endif // C_TF_PLAYER_H
|