summaryrefslogtreecommitdiff
path: root/game/client/tf/c_tf_player.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/c_tf_player.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf/c_tf_player.h')
-rw-r--r--game/client/tf/c_tf_player.h996
1 files changed, 996 insertions, 0 deletions
diff --git a/game/client/tf/c_tf_player.h b/game/client/tf/c_tf_player.h
new file mode 100644
index 0000000..c6a7807
--- /dev/null
+++ b/game/client/tf/c_tf_player.h
@@ -0,0 +1,996 @@
+//========= 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 &params );
+
+ 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 &params );
+
+ 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