summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_player_shared.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/shared/tf/tf_player_shared.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/tf/tf_player_shared.h')
-rw-r--r--game/shared/tf/tf_player_shared.h1297
1 files changed, 1297 insertions, 0 deletions
diff --git a/game/shared/tf/tf_player_shared.h b/game/shared/tf/tf_player_shared.h
new file mode 100644
index 0000000..a3eaca9
--- /dev/null
+++ b/game/shared/tf/tf_player_shared.h
@@ -0,0 +1,1297 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Shared player code.
+//
+//=============================================================================
+#ifndef TF_PLAYER_SHARED_H
+#define TF_PLAYER_SHARED_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "networkvar.h"
+#include "tf_shareddefs.h"
+#include "tf_weaponbase.h"
+#include "basegrenade_shared.h"
+#include "SpriteTrail.h"
+#include "tf_condition.h"
+
+// Client specific.
+#ifdef CLIENT_DLL
+#include "baseobject_shared.h"
+#include "c_tf_weapon_builder.h"
+class C_TFPlayer;
+// Server specific.
+#else
+#include "entity_currencypack.h"
+#include "tf_weapon_builder.h"
+class CTFPlayer;
+#endif
+
+
+//=============================================================================
+//
+// Tables.
+//
+
+// Client specific.
+#ifdef CLIENT_DLL
+
+ EXTERN_RECV_TABLE( DT_TFPlayerShared );
+
+// Server specific.
+#else
+
+ EXTERN_SEND_TABLE( DT_TFPlayerShared );
+
+#endif
+
+enum
+{
+ MELEE_NOCRIT = 0,
+ MELEE_MINICRIT = 1,
+ MELEE_CRIT = 2,
+};
+
+struct stun_struct_t
+{
+ CHandle<CTFPlayer> hPlayer;
+ float flDuration;
+ float flExpireTime;
+ float flStartFadeTime;
+ float flStunAmount;
+ int iStunFlags;
+};
+
+//=============================================================================
+
+#define PERMANENT_CONDITION -1
+
+#define MOVEMENTSTUN_PARITY_BITS 2
+
+// Damage storage for crit multiplier calculation
+class CTFDamageEvent
+{
+#ifdef CLIENT_DLL
+ // This redundantly declares friendship which leads to gcc warnings.
+ //DECLARE_CLIENTCLASS_NOBASE();
+#else
+public:
+ // This redundantly declares friendship which leads to gcc warnings.
+ //DECLARE_SERVERCLASS_NOBASE();
+#endif
+ DECLARE_EMBEDDED_NETWORKVAR();
+
+public:
+ float flDamage;
+ float flDamageCritScaleMultiplier; // scale the damage by this amount when taking it into consideration for "should I crit?" calculations
+ float flTime;
+ int nDamageType;
+ byte nKills;
+};
+
+#ifdef CLIENT_DLL
+struct WheelEffect_t
+{
+ WheelEffect_t( float flTriggerSpeed, const char *pszRedParticleName, const char *pszBlueParticleName )
+ : m_flMinTriggerSpeed( flTriggerSpeed )
+ {
+ memset( m_pszParticleName, NULL, sizeof( m_pszParticleName ) );
+ m_pszParticleName[ TF_TEAM_RED ] = pszRedParticleName;
+ m_pszParticleName[ TF_TEAM_BLUE ] = pszBlueParticleName;
+ }
+
+ float m_flMinTriggerSpeed;
+ const char *m_pszParticleName[ TF_TEAM_COUNT ];
+};
+#endif
+
+//=============================================================================
+// Scoring data for the local player
+struct RoundStats_t;
+struct localplayerscoring_t
+{
+ DECLARE_EMBEDDED_NETWORKVAR();
+ DECLARE_CLASS_NOBASE( localplayerscoring_t );
+
+ localplayerscoring_t()
+ {
+ Reset();
+ }
+
+ void Reset( void )
+ {
+ m_iCaptures = 0;
+ m_iDefenses = 0;
+ m_iKills = 0;
+ m_iDeaths = 0;
+ m_iSuicides = 0;
+ m_iKillAssists = 0;
+ m_iBuildingsBuilt = 0;
+ m_iBuildingsDestroyed = 0;
+ m_iHeadshots = 0;
+ m_iDominations = 0;
+ m_iRevenge = 0;
+ m_iInvulns = 0;
+ m_iTeleports = 0;
+ m_iDamageDone = 0;
+ m_iCrits = 0;
+ m_iBackstabs = 0;
+ m_iHealPoints = 0;
+ m_iResupplyPoints = 0;
+ m_iBonusPoints = 0;
+ m_iPoints = 0;
+ }
+
+ void UpdateStats( RoundStats_t& roundStats, CTFPlayer *pPlayer, bool bIsRoundData );
+
+ CNetworkVar( int, m_iCaptures );
+ CNetworkVar( int, m_iDefenses );
+ CNetworkVar( int, m_iKills );
+ CNetworkVar( int, m_iDeaths );
+ CNetworkVar( int, m_iSuicides );
+ CNetworkVar( int, m_iDominations );
+ CNetworkVar( int, m_iRevenge );
+ CNetworkVar( int, m_iBuildingsBuilt );
+ CNetworkVar( int, m_iBuildingsDestroyed );
+ CNetworkVar( int, m_iHeadshots );
+ CNetworkVar( int, m_iBackstabs );
+ CNetworkVar( int, m_iHealPoints );
+ CNetworkVar( int, m_iInvulns );
+ CNetworkVar( int, m_iTeleports );
+ CNetworkVar( int, m_iDamageDone );
+ CNetworkVar( int, m_iCrits );
+ CNetworkVar( int, m_iResupplyPoints );
+ CNetworkVar( int, m_iKillAssists );
+ CNetworkVar( int, m_iBonusPoints );
+ CNetworkVar( int, m_iPoints );
+};
+
+
+// Condition Provider
+struct condition_source_t
+{
+ DECLARE_EMBEDDED_NETWORKVAR();
+ DECLARE_CLASS_NOBASE( condition_source_t );
+
+ condition_source_t()
+ {
+ m_nPreventedDamageFromCondition = 0;
+ m_flExpireTime = 0.f;
+ m_pProvider = NULL;
+ m_bPrevActive = false;
+ }
+
+ int m_nPreventedDamageFromCondition;
+ float m_flExpireTime;
+ CNetworkHandle( CBaseEntity, m_pProvider );
+ bool m_bPrevActive;
+};
+
+
+//=============================================================================
+// For checkpointing upgrades Players have purchased in Mann Vs Machine
+class CUpgradeInfo
+{
+public:
+ int m_iPlayerClass; // the character class this upgrade is being applied too
+ item_definition_index_t m_itemDefIndex; // item that was upgraded (or INVALID_ITEM_DEF_INDEX for the player itself)
+ int m_upgrade; // the upgrade that was applied
+ int m_nCost; // price of the upgrade
+};
+
+//=============================================================================
+//
+// Shared player class.
+//
+class CTFPlayerShared : public CGameEventListener
+{
+public:
+
+// Client specific.
+#ifdef CLIENT_DLL
+
+ friend class C_TFPlayer;
+ typedef C_TFPlayer OuterClass;
+ DECLARE_PREDICTABLE();
+
+// Server specific.
+#else
+
+ friend class CTFPlayer;
+ typedef CTFPlayer OuterClass;
+
+#endif
+
+ DECLARE_EMBEDDED_NETWORKVAR()
+ DECLARE_CLASS_NOBASE( CTFPlayerShared );
+
+private:
+
+ struct RageBuff
+ {
+ int m_iBuffTypeActive;
+ int m_iBuffPulseCount;
+ float m_flNextBuffPulseTime;
+ };
+
+ // Condition Provider tracking
+ CUtlVector< condition_source_t > m_ConditionData;
+
+public:
+ enum ERageBuffSlot
+ {
+ kBuffSlot_Rage,
+ kBuffSlot_Decapitation,
+ kBuffSlot_MAX,
+ };
+
+ enum ETFStreak
+ {
+ kTFStreak_Kills = 0,
+ kTFStreak_KillsAll = 1, // Counts all kills not just attr based killstreak. For Data collection purposes
+ kTFStreak_Ducks = 2,
+ kTFStreak_Duck_levelup = 3,
+ kTFStreak_COUNT = 4,
+ };
+
+ enum EKartStateFlags
+ {
+ kKartState_Driving = 1 << 0,
+ kKartState_Braking = 1 << 1,
+ kKartState_Reversing = 1 << 2,
+ kKartState_Stopped = 1 << 3,
+ kKartState_SteerLeft = 1 << 4,
+ kKartState_SteerRight = 1 << 5
+ };
+
+ // Initialization.
+ CTFPlayerShared();
+ void Init( OuterClass *pOuter );
+ void Spawn( void );
+
+ // State (TF_STATE_*).
+ int GetState() const { return m_nPlayerState; }
+ void SetState( int nState ) { m_nPlayerState = nState; }
+ bool InState( int nState ) { return ( m_nPlayerState == nState ); }
+
+ // Condition (TF_COND_*).
+ void AddCond( ETFCond eCond, float flDuration = PERMANENT_CONDITION, CBaseEntity *pProvider = NULL );
+ void RemoveCond( ETFCond eCond, bool ignore_duration=false );
+ bool InCond( ETFCond eCond ) const;
+ bool WasInCond( ETFCond eCond ) const;
+ void ForceRecondNextSync( ETFCond eCond );
+ void RemoveAllCond();
+ void OnConditionAdded( ETFCond eCond );
+ void OnConditionRemoved( ETFCond eCond );
+ void ConditionThink( void );
+ float GetConditionDuration( ETFCond eCond ) const;
+ void SetConditionDuration( ETFCond eCond, float flNewDur )
+ {
+ Assert( eCond < m_ConditionData.Count() );
+ m_ConditionData[eCond].m_flExpireTime = flNewDur;
+ }
+
+ CBaseEntity *GetConditionProvider( ETFCond eCond ) const;
+ CBaseEntity *GetConditionAssistFromVictim( void );
+ CBaseEntity *GetConditionAssistFromAttacker( void );
+
+ void ConditionGameRulesThink( void );
+
+ void InvisibilityThink( void );
+
+ void CheckDisguiseTimer( void );
+
+ int GetMaxBuffedHealth( bool bIgnoreAttributes = false, bool bIgnoreHealthOverMax = false );
+
+ bool IsAiming( void );
+
+ void SetCarryingRuneType( RuneTypes_t rt );
+ RuneTypes_t GetCarryingRuneType( void ) const;
+ bool IsCarryingRune( void ) const { return GetCarryingRuneType() != RUNE_NONE; }
+ float m_flRuneAcquireTime;
+
+#ifdef CLIENT_DLL
+ // This class only receives calls for these from C_TFPlayer, not
+ // natively from the networking system
+ virtual void OnPreDataChanged( void );
+ virtual void OnDataChanged( void );
+
+ // check the newly networked conditions for changes
+ void SyncConditions( int nPreviousConditions, int nNewConditions, int nForceConditionBits, int nBaseCondBit );
+
+ enum ECritBoostUpdateType { kCritBoost_Ignore, kCritBoost_ForceRefresh };
+ void UpdateCritBoostEffect( ECritBoostUpdateType eUpdateType = kCritBoost_Ignore );
+
+ bool ShouldShowRecentlyTeleported( void );
+ void EndRadiusHealEffect( void );
+ void EndKingBuffRadiusEffect( void );
+#endif
+
+ bool IsCritBoosted( void ) const;
+ bool IsInvulnerable( void ) const;
+ bool IsStealthed( void ) const;
+ bool CanBeDebuffed( void ) const;
+
+ void Disguise( int nTeam, int nClass, CTFPlayer* pDesiredTarget=NULL, bool bOnKill = false );
+ void CompleteDisguise( void );
+ void RemoveDisguise( void );
+ void RemoveDisguiseWeapon( void );
+ void FindDisguiseTarget( void );
+ int GetDisguiseTeam( void ) const;
+ int GetDisguiseClass( void ) const { return InCond( TF_COND_DISGUISED_AS_DISPENSER ) ? (int)TF_CLASS_ENGINEER : m_nDisguiseClass; }
+ int GetDisguisedSkinOverride( void ) const { return m_nDisguiseSkinOverride; }
+ int GetDisguiseMask( void ) const { return InCond( TF_COND_DISGUISED_AS_DISPENSER ) ? (int)TF_CLASS_ENGINEER : m_nMaskClass; }
+ int GetDesiredDisguiseClass( void ) const { return m_nDesiredDisguiseClass; }
+ int GetDesiredDisguiseTeam( void ) const { return m_nDesiredDisguiseTeam; }
+ bool WasLastDisguiseAsOwnTeam( void ) const { return m_bLastDisguisedAsOwnTeam; }
+ int GetDisguiseTargetIndex( void ) const { return m_iDisguiseTargetIndex; }
+ EHANDLE GetDisguiseTarget( void ) const
+ {
+#ifdef CLIENT_DLL
+ if ( m_iDisguiseTargetIndex == TF_DISGUISE_TARGET_INDEX_NONE )
+ return NULL;
+ return cl_entitylist->GetNetworkableHandle( m_iDisguiseTargetIndex );
+#else
+ return m_hDisguiseTarget.Get();
+#endif
+ }
+ CTFWeaponBase *GetDisguiseWeapon( void ) { return m_hDisguiseWeapon; }
+ int GetDisguiseHealth( void ) { return m_iDisguiseHealth; }
+ void SetDisguiseHealth( int iDisguiseHealth );
+ int GetDisguiseMaxHealth( void );
+ int GetDisguiseMaxBuffedHealth( bool bIgnoreAttributes = false, bool bIgnoreHealthOverMax = false );
+ void ProcessDisguiseImpulse( CTFPlayer *pPlayer );
+ int GetDisguiseAmmoCount( void ) { return m_iDisguiseAmmo; }
+ void SetDisguiseAmmoCount( int nValue ) { m_iDisguiseAmmo = nValue; }
+
+ bool CanRecieveMedigunChargeEffect( medigun_charge_types eType ) const;
+#ifdef CLIENT_DLL
+ int GetDisplayedTeam( void ) const;
+ void OnDisguiseChanged( void );
+
+ float GetTimeTeleEffectAdded( void ) { return m_flGotTeleEffectAt; }
+ int GetTeamTeleporterUsed( void ) { return m_nTeamTeleporterUsed; }
+
+ void ClientDemoBuffThink( void );
+ void ClientKillStreakBuffThink( void );
+#endif
+
+ int CalculateObjectCost( CTFPlayer* pBuilder, int iObjectType );
+
+ // Pickup effects, including putting out fires, updating HUD, etc.
+ void HealthKitPickupEffects( int iHealthGiven = 0 );
+
+#ifdef GAME_DLL
+ void DetermineDisguiseWeapon( bool bForcePrimary = false );
+ void DetermineDisguiseWearables();
+ void RemoveDisguiseWearables();
+ void Heal( CBaseEntity *pHealer, float flAmount, float flOverhealBonus, float flOverhealDecayMult, bool bDispenserHeal = false, CTFPlayer *pHealScorer = NULL );
+ float StopHealing( CBaseEntity *pHealer );
+ void TestAndExpireChargeEffect( medigun_charge_types iCharge );
+ void RecalculateChargeEffects( bool bInstantRemove = false );
+ int FindHealerIndex( CBaseEntity *pPlayer );
+ EHANDLE GetFirstHealer();
+ void CheckForAchievement( int iAchievement );
+
+ void IncrementArenaNumChanges( void ) { m_nArenaNumChanges++; }
+ void ResetArenaNumChanges( void ) { m_nArenaNumChanges = 0; }
+
+ bool AddToSpyCloakMeter( float val, bool bForce=false );
+
+ void AddTmpDamageBonus( float flBonus, float flExpiration );
+ float GetTmpDamageBonus( void ) { return (InCond(TF_COND_TMPDAMAGEBONUS)) ? m_flTmpDamageBonusAmount : 1.0; }
+
+ void SetTeamTeleporterUsed( int nTeam ){ m_nTeamTeleporterUsed.Set( nTeam ); }
+
+ void SetBiteEffectWasApplied() { m_bBiteEffectWasApplied = true; }
+
+#endif // GAME_DLL
+
+ int GetArenaNumChanges( void ) { return m_nArenaNumChanges; }
+
+ CBaseEntity *GetHealerByIndex( int index );
+ bool HealerIsDispenser( int index );
+ int GetNumHealers( void ) { return m_nNumHealers; }
+
+ void Burn( CTFPlayer *pPlayer, CTFWeaponBase *pWeapon, float flBurningTime = -1.0f );
+ void SelfBurn( float flBurningTime ); // Boss Burn
+ void MakeBleed( CTFPlayer *pPlayer, CTFWeaponBase *pWeapon, float flBleedingTime, int nBleedDmg = TF_BLEEDING_DMG, bool bPermanentBleeding = false );
+#ifdef GAME_DLL
+ void StopBleed( CTFPlayer *pPlayer, CTFWeaponBase *pWeapon );
+#endif // GAME_DLL
+
+ // Weapons.
+ CTFWeaponBase *GetActiveTFWeapon() const;
+
+ // Utility.
+ bool IsAlly( CBaseEntity *pEntity );
+
+ // Separation force
+ bool IsSeparationEnabled( void ) const { return m_bEnableSeparation; }
+ void SetSeparation( bool bEnable ) { m_bEnableSeparation = bEnable; }
+ const Vector &GetSeparationVelocity( void ) const { return m_vSeparationVelocity; }
+ void SetSeparationVelocity( const Vector &vSeparationVelocity ) { m_vSeparationVelocity = vSeparationVelocity; }
+
+ void FadeInvis( float fAdditionalRateScale );
+ float GetPercentInvisible( void ) const;
+ float GetPercentInvisiblePrevious( void ) { return m_flPrevInvisibility; }
+ void NoteLastDamageTime( int nDamage );
+ void OnSpyTouchedByEnemy( void );
+ float GetLastStealthExposedTime( void ) { return m_flLastStealthExposeTime; }
+ void SetNextStealthTime( float flTime ) { m_flStealthNextChangeTime = flTime; }
+#ifdef STAGING_ONLY
+ bool IsFullyInvisible( void ) { return GetPercentInvisible() == 1.f || InCond( TF_COND_STEALTHED_PHASE ); }
+#else
+ bool IsFullyInvisible( void ) { return ( GetPercentInvisible() == 1.f ); }
+#endif
+
+ bool IsEnteringOrExitingFullyInvisible( void );
+
+ bool CanRuneCharge() const;
+ float GetRuneCharge() const { return m_flRuneCharge; }
+ void SetRuneCharge( float flVal ) { m_flRuneCharge = Clamp( flVal, 0.f, 100.f ); }
+ bool IsRuneCharged() const { return m_flRuneCharge == 100.f; }
+
+#ifdef STAGING_ONLY
+ bool HasPhaseCloakAbility( void );
+
+ float GetSpaceJumpChargeMeter() const { return m_flSpaceJumpCharge; }
+ void SetSpaceJumpChargeMeter( float val ) { m_flSpaceJumpCharge = Min( val, 100.0f); }
+
+#endif // STAGING_ONLY
+
+ int GetDesiredPlayerClassIndex( void );
+ bool IsInUpgradeZone( void ) { return m_bInUpgradeZone; }
+ void SetInUpgradeZone( bool bInZone ) { m_bInUpgradeZone = bInZone; }
+
+ // Cloak, rage, phase, team juice...this should really all be done with composition?
+ void UpdateCloakMeter( void );
+ float GetSpyCloakMeter() const { return m_flCloakMeter; }
+ void SetSpyCloakMeter( float val ) { m_flCloakMeter = val; }
+
+ void UpdateRageBuffsAndRage();
+ bool IsRageDraining() const { return m_bRageDraining; }
+ float GetRageMeter() const { return m_flRageMeter; }
+ void SetRageMeter( float val );
+ void ModifyRage( float fDelta );
+ void ResetRageMeter( void );
+ void PulseRageBuff( ERageBuffSlot eBuffSlot );
+ void StartRageDrain( void ) { m_bRageDraining = true; }
+ void ResetRageSystem( void );
+
+ void ActivateRageBuff( CBaseEntity *pBuffItem, int iBuffType );
+ void SetupRageBuffTimer( int iBuffType, int iPulseCount, ERageBuffSlot eBuffSlot );
+ void ResetRageBuffs( void );
+
+ void UpdatePhaseEffects( void );
+ void AddPhaseEffects( void );
+ void RemovePhaseEffects( void );
+
+ void PulseMedicRadiusHeal( void );
+
+ float GetScoutEnergyDrinkMeter() const{ return m_flEnergyDrinkMeter; }
+ void SetScoutEnergyDrinkMeter( float val ) { m_flEnergyDrinkMeter = val; }
+ void UpdateEnergyDrinkMeter( void );
+
+ float GetScoutHypeMeter() const { return m_flHypeMeter; }
+ void SetScoutHypeMeter( float val );
+ void StopScoutHypeDrain( void ) { RemoveCond( TF_COND_SODAPOPPER_HYPE ); }
+ bool IsHypeBuffed( void ) const { return InCond( TF_COND_SODAPOPPER_HYPE ); }
+
+ void DemoShieldChargeThink( void );
+ void UpdateChargeMeter( void );
+ float GetDemomanChargeMeter() const { return m_flChargeMeter; }
+ void EndCharge( void );
+ float CalculateChargeCap( void ) const;
+ void SetDemomanChargeMeter( float val ) { m_flChargeMeter = Clamp( val, 0.0f, 100.0f); }
+ void CalcChargeCrit( bool bForceCrit=false );
+ bool HasDemoShieldEquipped() const;
+
+ bool IsJumping( void ) const { return m_bJumping; }
+ void SetJumping( bool bJumping );
+ bool IsAirDashing( void ) const { return (m_iAirDash > 0); }
+ int GetAirDash( void ) const { return m_iAirDash; }
+ void SetAirDash( int iAirDash );
+ void SetAirDucked( int nAirDucked ) { m_nAirDucked = nAirDucked; }
+ int AirDuckedCount( void ) { return m_nAirDucked; }
+ void SetDuckTimer( float flTime ) { m_flDuckTimer = flTime; }
+ float GetDuckTimer( void ) const { return m_flDuckTimer; }
+
+ void DebugPrintConditions( void );
+ void InstantlySniperUnzoom( void );
+
+ float GetStealthNoAttackExpireTime( void );
+
+ void SetPlayerDominated( CTFPlayer *pPlayer, bool bDominated );
+ bool IsPlayerDominated( int iPlayerIndex );
+ bool IsPlayerDominatingMe( int iPlayerIndex );
+ void SetPlayerDominatingMe( CTFPlayer *pPlayer, bool bDominated );
+
+ float GetDisguiseCompleteTime( void ) { return m_flDisguiseCompleteTime; }
+ bool IsSpyDisguisedAsMyTeam( CTFPlayer *pPlayer );
+
+ // Stuns
+ stun_struct_t *GetActiveStunInfo( void ) const;
+#ifdef GAME_DLL
+ void StunPlayer( float flTime, float flReductionAmount, int iStunFlags = TF_STUN_MOVEMENT, CTFPlayer* pAttacker = NULL );
+#endif // GAME_DLL
+ float GetAmountStunned( int iStunFlags );
+ bool IsLoserStateStunned( void ) const;
+ bool IsControlStunned( void );
+ bool IsSnared( void );
+ CTFPlayer *GetStunner( void );
+ void ControlStunFading( void );
+ int GetStunFlags( void ) const { return GetActiveStunInfo() ? GetActiveStunInfo()->iStunFlags : 0; }
+ float GetStunExpireTime( void ) const { return GetActiveStunInfo() ? GetActiveStunInfo()->flExpireTime : 0; }
+ void SetStunExpireTime( float flTime );
+ void UpdateLegacyStunSystem( void );
+
+ bool IsFirstBloodBoosted( void ) const { return m_bArenaFirstBloodBoost; }
+ void SetFirstBloodBoosted( bool bBoost ) { m_bArenaFirstBloodBoost = bBoost; }
+
+ CTFPlayer *GetAssist( void ) const { return m_hAssist; }
+ void SetAssist( CTFPlayer* newAssist ) { m_hAssist = newAssist; }
+
+ CTFPlayer *GetBurnAttacker( void ) const { return m_hBurnAttacker; }
+ CTFPlayer *GetOriginalBurnAttacker( void ) const { return m_hOriginalBurnAttacker; }
+
+ void SetCloakConsumeRate( float newCloakConsumeRate ) { m_fCloakConsumeRate = newCloakConsumeRate; }
+ void SetCloakRegenRate( float newCloakRegenRate ) { m_fCloakRegenRate = newCloakRegenRate; }
+
+ int GetWeaponKnockbackID( void ) const { return m_iWeaponKnockbackID; }
+ void SetWeaponKnockbackID( int iID ) { m_iWeaponKnockbackID = iID; }
+
+ bool IsLoadoutUnavailable( void ) { return m_bLoadoutUnavailable; }
+ void SetLoadoutUnavailable( bool bUnavailable ) { m_bLoadoutUnavailable = bUnavailable; }
+
+ float GetInvulOffTime( void ) { return m_flInvulnerabilityRemoveTime; }
+
+ int GetDisguiseBody( void ) const { return m_iDisguiseBody; }
+ void SetDisguiseBody( int iVal ) { m_iDisguiseBody = iVal; }
+
+ bool IsCarryingObject( void ) const { return m_bCarryingObject; }
+ CBaseObject* GetCarriedObject( void ) const { return m_hCarriedObject.Get(); }
+ void SetCarriedObject( CBaseObject* pObj );
+ void StartBuildingObjectOfType( int iType, int iObjectMode=0 );
+
+ void InterruptCharge( void );
+
+ void PulseKingRuneBuff();
+
+public:
+ // Scoring
+ int GetCaptures( int iIndex ) const { return m_ScoreData.m_iCaptures; }
+ int GetDefenses( int iIndex ) const { return m_ScoreData.m_iDefenses; }
+ int GetDominations( int iIndex ) const { return m_ScoreData.m_iDominations; }
+ int GetRevenge( int iIndex ) const { return m_ScoreData.m_iRevenge; }
+ int GetBuildingsDestroyed( int iIndex ) const { return m_ScoreData.m_iBuildingsDestroyed; }
+ int GetHeadshots( int iIndex ) const { return m_ScoreData.m_iHeadshots; }
+ int GetBackstabs( int iIndex ) const { return m_ScoreData.m_iBackstabs; }
+ int GetHealPoints( int iIndex ) const { return m_ScoreData.m_iHealPoints; }
+ int GetInvulns( int iIndex ) const { return m_ScoreData.m_iInvulns; }
+ int GetTeleports( int iIndex ) const { return m_ScoreData.m_iTeleports; }
+ int GetResupplyPoints( int iIndex ) const { return m_ScoreData.m_iResupplyPoints; }
+ int GetKillAssists( int iIndex ) const { return m_ScoreData.m_iKillAssists; }
+ int GetBonusPoints( int iIndex ) const { return m_ScoreData.m_iBonusPoints; }
+
+ void ResetScores( void ) { m_ScoreData.Reset(); }
+ localplayerscoring_t *GetScoringData( void ) { return &m_ScoreData; }
+
+ // Per-round scoring data utilized by the steamworks stats system.
+ void ResetRoundScores( void ) { m_RoundScoreData.Reset(); }
+ localplayerscoring_t *GetRoundScoringData( void ) { return &m_RoundScoreData; }
+
+ void SetFeignDeathReady( bool bVal ) { m_bFeignDeathReady = bVal; }
+ bool IsFeignDeathReady( void ) const { return m_bFeignDeathReady; }
+ void ReduceFeignDeathDuration( float flAmount ) { m_flFeignDeathEnd -= flAmount; }
+
+ void SetShieldEquipped( bool bVal ) { m_bShieldEquipped = bVal; }
+ bool IsShieldEquipped() const { return m_bShieldEquipped; }
+
+ void SetParachuteEquipped( bool bVal ) { m_bParachuteEquipped = bVal; }
+ bool IsParachuteEquipped() const { return m_bParachuteEquipped; }
+
+ void SetNextMeleeCrit( int iVal ) { m_iNextMeleeCrit = iVal; }
+ int GetNextMeleeCrit( void ) const { return m_iNextMeleeCrit; }
+
+ void SetDecapitations( int iVal ) { m_iDecapitations = iVal; }
+ int GetDecapitations( void ) const { return m_iDecapitations; }
+
+ void SetStreak( ETFStreak streak_type, int iVal ) { m_nStreaks.Set( streak_type, iVal ); }
+ int GetStreak( ETFStreak streak_type ) const { return m_nStreaks[streak_type]; }
+ int IncrementStreak( ETFStreak streak_type, int iVal )
+ {
+ // Track duck streak steps so we can put deltas in the event
+ if ( streak_type == kTFStreak_Ducks )
+ m_nLastDuckStreakIncrement = iVal;
+ m_nStreaks.Set( streak_type, m_nStreaks[streak_type] + iVal );
+ return m_nStreaks[streak_type];
+ }
+ void ResetStreaks( void ) { for ( int streak_type = 0; streak_type < kTFStreak_COUNT; streak_type++ ) { m_nStreaks.Set( streak_type, 0 ); } }
+
+ int GetLastDuckStreakIncrement( void ) const { return m_nLastDuckStreakIncrement; }
+
+ void SetRevengeCrits( int iVal );
+ int GetRevengeCrits( void ) const { return m_iRevengeCrits; }
+ void IncrementRevengeCrits( void );
+
+ int GetSequenceForDeath( CBaseAnimating* pRagdoll, bool bBurning, int nCustomDeath );
+
+ float GetNextNoiseMakerTime() const { return m_flNextNoiseMakerTime; }
+ void SetNextNoiseMakerTime( float time ) { m_flNextNoiseMakerTime = time; }
+
+ void Heal_Radius ( bool bActive );
+
+ void IncrementRespawnTouchCount() { ++m_iSpawnRoomTouchCount; }
+ void DecrementRespawnTouchCount() { m_iSpawnRoomTouchCount = Max( m_iSpawnRoomTouchCount - 1, 0 ); }
+ int GetRespawnTouchCount() const { return m_iSpawnRoomTouchCount; }
+
+#ifdef CLIENT_DLL
+ void SetVehicleMoveAngles( const QAngle& angVehicleMoveAngles ) { m_angVehicleMovePitchLast = angVehicleMoveAngles[PITCH]; m_angVehicleMoveAngles = angVehicleMoveAngles; }
+#endif
+
+#ifdef STAGING_ONLY
+ void DoRocketPack();
+#endif // STAGING_ONLY
+
+#ifdef GAME_DLL
+ void SetBestOverhealDecayMult( float fValue ) { m_flBestOverhealDecayMult = fValue; }
+ float GetBestOverhealDecayMult() const { return m_flBestOverhealDecayMult; }
+
+ void SetPeeAttacker( CTFPlayer *pPlayer ) { m_hPeeAttacker = pPlayer; }
+ CTFPlayer *GetPeeAttacker() const { return m_hPeeAttacker; }
+
+ void SetChargeEffectOffTime( int iCondition, float flTime ) { m_flChargeEffectOffTime[iCondition] = flTime; }
+
+ void GetSpeedWatchersList( CUtlVector<CTFPlayer *> *out_pVecSpeedWatchers ) const;
+#endif
+
+ int GetTauntIndex( void ) const { return m_iTauntIndex; }
+ int GetTauntConcept( void ) const { return m_iTauntConcept; }
+ itemid_t GetTauntSourceItemID( void ) const { return ((uint64)m_unTauntSourceItemID_High << 32) | (uint64)m_unTauntSourceItemID_Low; }
+ void CreateVehicleMove( float flInputSampleTime, CUserCmd *pCmd );
+ void SetVehicleTurnAmount( float flTurnSpeed ) { m_flCurrentTauntTurnSpeed = flTurnSpeed; }
+ float GetVehicleTurnPoseAmount( void ) const { return m_flCurrentTauntTurnSpeed; }
+ void VehicleThink( void );
+
+ bool IsLoser( void );
+
+ int GetItemFindBonus( void ) //{ return m_iItemFindBonus; }
+ {
+#ifdef GAME_DLL
+ if ( !m_iItemFindBonus )
+ {
+ m_iItemFindBonus = RandomInt( 1, 300 );
+ }
+#endif
+ return m_iItemFindBonus;
+ }
+
+ void RecalculatePlayerBodygroups( void );
+
+ void FireGameEvent( IGameEvent *event );
+
+ float GetFlameBurnTime( void ) const { return m_flFlameBurnTime; }
+
+ void GetConditionsBits( CBitVec< TF_COND_LAST >& vbConditions ) const;
+
+#ifdef STAGING_ONLY
+ void UpdateRocketPack( void );
+ void ApplyRocketPackStun( float flStunDuration );
+ bool CanBuildSpyTraps( void );
+#endif // STAGING_ONLY
+
+private:
+ CNetworkVarEmbedded( localplayerscoring_t, m_ScoreData );
+ CNetworkVarEmbedded( localplayerscoring_t, m_RoundScoreData );
+
+private:
+#ifdef CLIENT_DLL
+ typedef std::pair<const char *, float> taunt_particle_state_t;
+ taunt_particle_state_t GetClientTauntParticleDesiredState() const;
+ void FireClientTauntParticleEffects();
+#endif // CLIENT_DLL
+
+ void ImpactWaterTrace( trace_t &trace, const Vector &vecStart );
+
+ void OnAddZoomed( void );
+ void OnAddStealthed( void );
+ void OnAddInvulnerable( void );
+ void OnAddTeleported( void );
+ void OnAddBurning( void );
+ void OnAddDisguising( void );
+ void OnAddDisguised( void );
+ void OnAddDemoCharge( void );
+ void OnAddCritBoost( void );
+ void OnAddSodaPopperHype( void );
+ void OnAddOverhealed( void );
+ void OnAddFeignDeath( void );
+ void OnAddStunned( void );
+ void OnAddPhase( void );
+ void OnAddUrine( void );
+ void OnAddMarkedForDeath( void );
+ void OnAddBleeding( void );
+ void OnAddDefenseBuff( void );
+ void OnAddOffenseBuff( void );
+ void OnAddOffenseHealthRegenBuff( void );
+ const char* GetSoldierBuffEffectName( void );
+ void OnAddSoldierOffensiveBuff( void );
+ void OnAddSoldierDefensiveBuff( void );
+ void OnAddSoldierOffensiveHealthRegenBuff( void );
+ void OnAddSoldierNoHealingDamageBuff( void );
+ void OnAddShieldCharge( void );
+ void OnAddDemoBuff( void );
+ void OnAddEnergyDrinkBuff( void );
+ void OnAddRadiusHeal( void );
+ void OnAddMegaHeal( void );
+ void OnAddMadMilk( void );
+ void OnAddTaunting( void );
+ void OnAddNoHealingDamageBuff( void );
+ void OnAddSpeedBoost( bool IsNonCombat );
+ void OnAddSapped( void );
+ void OnAddReprogrammed( void );
+ void OnAddMarkedForDeathSilent( void );
+ void OnAddDisguisedAsDispenser( void );
+ void OnAddHalloweenBombHead( void );
+ void OnAddHalloweenThriller( void );
+ void OnAddRadiusHealOnDamage( void );
+ void OnAddMedEffectUberBulletResist( void );
+ void OnAddMedEffectUberBlastResist( void );
+ void OnAddMedEffectUberFireResist( void );
+ void OnAddMedEffectSmallBulletResist( void );
+ void OnAddMedEffectSmallBlastResist( void );
+ void OnAddMedEffectSmallFireResist( void );
+ void OnAddStealthedUserBuffFade( void );
+ void OnAddBulletImmune( void );
+ void OnAddBlastImmune( void );
+ void OnAddFireImmune( void );
+ void OnAddMVMBotRadiowave( void );
+ void OnAddHalloweenSpeedBoost( void );
+ void OnAddHalloweenQuickHeal( void );
+ void OnAddHalloweenGiant( void );
+ void OnAddHalloweenTiny( void );
+ void OnAddHalloweenGhostMode( void );
+ void OnAddHalloweenKartDash( void );
+ void OnAddHalloweenKart( void );
+ void OnAddBalloonHead( void );
+ void OnAddMeleeOnly( void );
+ void OnAddSwimmingCurse( void );
+ void OnAddHalloweenKartCage( void );
+ void OnAddRuneResist( void );
+ void OnAddGrapplingHookLatched( void );
+ void OnAddPasstimeInterception( void );
+ void OnAddRunePlague( void );
+ void OnAddPlague( void );
+ void OnAddKingBuff( void );
+ void OnAddInPurgatory( void );
+ void OnAddCompetitiveWinner( void );
+ void OnAddCompetitiveLoser( void );
+
+#ifdef STAGING_ONLY
+ void OnAddTranqMark( void );
+ void OnAddSpaceGravity( void );
+ void OnAddSelfConc( void );
+ void OnAddRocketPack( void );
+ void OnAddStealthedPhase( void );
+ void OnAddClipOverload( void );
+ void OnAddCondSpyClassSteal( void );
+#endif // STAGING_ONLY
+
+ void OnRemoveZoomed( void );
+ void OnRemoveBurning( void );
+ void OnRemoveStealthed( void );
+ void OnRemoveDisguised( void );
+ void OnRemoveDisguising( void );
+ void OnRemoveInvulnerable( void );
+ void OnRemoveTeleported( void );
+ void OnRemoveDemoCharge( void );
+ void OnRemoveCritBoost( void );
+ void OnRemoveSodaPopperHype( void );
+ void OnRemoveTmpDamageBonus( void );
+ void OnRemoveOverhealed( void );
+ void OnRemoveFeignDeath( void );
+ void OnRemoveStunned( void );
+ void OnRemovePhase( void );
+ void OnRemoveUrine( void );
+ void OnRemoveMarkedForDeath( void );
+ void OnRemoveBleeding( void );
+ void OnRemoveInvulnerableWearingOff( void );
+ void OnRemoveDefenseBuff( void );
+ void OnRemoveOffenseBuff( void );
+ void OnRemoveOffenseHealthRegenBuff( void );
+ void OnRemoveSoldierOffensiveBuff( void );
+ void OnRemoveSoldierDefensiveBuff( void );
+ void OnRemoveSoldierOffensiveHealthRegenBuff( void );
+ void OnRemoveSoldierNoHealingDamageBuff( void );
+ void OnRemoveShieldCharge( void );
+ void OnRemoveDemoBuff( void );
+ void OnRemoveEnergyDrinkBuff( void );
+ void OnRemoveRadiusHeal( void );
+ void OnRemoveMegaHeal( void );
+ void OnRemoveMadMilk( void );
+ void OnRemoveTaunting( void );
+ void OnRemoveNoHealingDamageBuff( void );
+ void OnRemoveSpeedBoost( bool IsNonCombat );
+ void OnRemoveSapped( void );
+ void OnRemoveReprogrammed( void );
+ void OnRemoveMarkedForDeathSilent( void );
+ void OnRemoveDisguisedAsDispenser( void );
+ void OnRemoveHalloweenBombHead( void );
+ void OnRemoveHalloweenThriller( void );
+ void OnRemoveRadiusHealOnDamage( void );
+ void OnRemoveMedEffectUberBulletResist( void );
+ void OnRemoveMedEffectUberBlastResist( void );
+ void OnRemoveMedEffectUberFireResist( void );
+ void OnRemoveMedEffectSmallBulletResist( void );
+ void OnRemoveMedEffectSmallBlastResist( void );
+ void OnRemoveMedEffectSmallFireResist( void );
+ void OnRemoveStealthedUserBuffFade( void );
+ void OnRemoveBulletImmune( void );
+ void OnRemoveBlastImmune( void );
+ void OnRemoveFireImmune( void );
+ void OnRemoveMVMBotRadiowave( void );
+ void OnRemoveHalloweenSpeedBoost( void );
+ void OnRemoveHalloweenQuickHeal( void );
+ void OnRemoveHalloweenGiant( void );
+ void OnRemoveHalloweenTiny( void );
+ void OnRemoveHalloweenGhostMode( void );
+ void OnRemoveHalloweenKartDash( void );
+ void OnRemoveHalloweenKart( void );
+ void OnRemoveBalloonHead( void );
+ void OnRemoveMeleeOnly( void );
+ void OnRemoveSwimmingCurse( void );
+ void OnRemoveHalloweenKartCage( void );
+ void OnRemoveRuneResist( void );
+ void OnRemoveGrapplingHookLatched( void );
+ void OnRemovePasstimeInterception( void );
+ void OnRemoveRunePlague( void );
+ void OnRemovePlague( void );
+ void OnRemoveRuneKing( void );
+ void OnRemoveKingBuff( void );
+ void OnRemoveRuneSupernova( void );
+ void OnRemoveInPurgatory( void );
+ void OnRemoveCompetitiveWinner( void );
+ void OnRemoveCompetitiveLoser( void );
+
+#ifdef STAGING_ONLY
+ void OnRemoveTranqMark( void );
+ void OnRemoveSpaceGravity( void );
+ void OnRemoveSelfConc( void );
+ void OnRemoveRocketPack( void );
+ void OnRemoveStealthedPhase( void );
+ void OnRemoveClipOverload( void );
+ void OnRemoveCondSpyClassSteal( void );
+#endif // STAGING_ONLY
+
+ // Starting a new trend, putting Add and Remove next to each other
+ void OnAddCondParachute( void );
+ void OnRemoveCondParachute( void );
+
+ float GetCritMult( void );
+
+#ifdef GAME_DLL
+ void UpdateCritMult( void );
+ void RecordDamageEvent( const CTakeDamageInfo &info, bool bKill, int nVictimPrevHealth );
+ void AddTempCritBonus( float flAmount );
+ void ClearDamageEvents( void ) { m_DamageEvents.Purge(); }
+ int GetNumKillsInTime( float flTime );
+
+ // Invulnerable.
+ void SendNewInvulnGameEvent( void );
+ void SetChargeEffect( medigun_charge_types iCharge, bool bState, bool bInstant, const struct MedigunEffects_t& effects, float flWearOffTime, CTFPlayer *pProvider = NULL );
+ void SetCritBoosted( bool bState );
+
+ void RadiusCurrencyCollectionCheck( void );
+ void RadiusHealthkitCollectionCheck( void );
+ void RadiusSpyScan( void );
+
+ // Attr for Conditions
+ void ApplyAttributeToPlayer( const char* pszAttribName, float flValue );
+ void RemoveAttributeFromPlayer( const char* pszAttribName );
+#endif // GAME_DLL
+
+private:
+ // Vars that are networked.
+ CNetworkVar( int, m_nPlayerState ); // Player state.
+ CNetworkVar( int, m_nPlayerCond ); // Player condition flags.
+ CNetworkVar( int, m_nPlayerCondEx ); // Player condition flags (extended -- we overflowed 32 bits).
+ CNetworkVar( int, m_nPlayerCondEx2 ); // Player condition flags (extended -- we overflowed 64 bits).
+ CNetworkVar( int, m_nPlayerCondEx3 ); // Player condition flags (extended -- we overflowed 96 bits).
+
+ CNetworkVarEmbedded( CTFConditionList, m_ConditionList );
+
+//TFTODO: What if the player we're disguised as leaves the server?
+//...maybe store the name instead of the index?
+ CNetworkVar( int, m_nDisguiseTeam ); // Team spy is disguised as.
+ CNetworkVar( int, m_nDisguiseClass ); // Class spy is disguised as.
+ CNetworkVar( int, m_nDisguiseSkinOverride ); // skin override value of the player spy disguised as.
+ CNetworkVar( int, m_nMaskClass );
+#ifdef GAME_DLL
+ EHANDLE m_hDisguiseTarget; // Playing the spy is using for name disguise.
+#endif // GAME_DLL
+ CNetworkVar( int, m_iDisguiseTargetIndex );
+ CNetworkVar( int, m_iDisguiseHealth ); // Health to show our enemies in player id
+ CNetworkVar( int, m_nDesiredDisguiseClass );
+ CNetworkVar( int, m_nDesiredDisguiseTeam );
+ CNetworkHandle( CTFWeaponBase, m_hDisguiseWeapon );
+ CNetworkVar( int, m_nTeamTeleporterUsed ); // for disguised spies using enemy teleporters
+ CHandle<CTFPlayer> m_hDesiredDisguiseTarget;
+ int m_iDisguiseAmmo;
+
+ bool m_bEnableSeparation; // Keeps separation forces on when player stops moving, but still penetrating
+ Vector m_vSeparationVelocity; // Velocity used to keep player seperate from teammates
+
+ float m_flInvisibility;
+ float m_flPrevInvisibility;
+ CNetworkVar( float, m_flInvisChangeCompleteTime ); // when uncloaking, must be done by this time
+ float m_flLastStealthExposeTime;
+ float m_fCloakConsumeRate;
+ float m_fCloakRegenRate;
+ bool m_bMotionCloak;
+#ifdef GAME_DLL
+ // Cloak Strange Tracking
+ float m_flCloakStartTime;
+#endif
+
+ float m_fEnergyDrinkConsumeRate;
+ float m_fEnergyDrinkRegenRate;
+
+
+ EHANDLE m_pPhaseTrail[TF_SCOUT_NUMBEROFPHASEATTACHMENTS];
+ bool m_bPhaseFXOn;
+ float m_fPhaseAlpha;
+
+ CNetworkVar( int, m_nNumHealers );
+
+ // Halloween silliness.
+ CNetworkVar( int, m_nHalloweenBombHeadStage );
+
+ // Vars that are not networked.
+ OuterClass *m_pOuter; // C_TFPlayer or CTFPlayer (client/server).
+
+#ifdef GAME_DLL
+ // Healer handling
+ struct healers_t
+ {
+ EHANDLE pHealer;
+ float flAmount;
+ float flHealAccum;
+ float flOverhealBonus;
+ float flOverhealDecayMult;
+ bool bDispenserHeal;
+ EHANDLE pHealScorer;
+ int iKillsWhileBeingHealed; // for engineer achievement ACHIEVEMENT_TF_ENGINEER_TANK_DAMAGE
+ float flHealedLastSecond;
+ };
+ CUtlVector< healers_t > m_aHealers;
+ float m_flHealFraction; // Store fractional health amounts
+ float m_flDisguiseHealFraction; // Same for disguised healing
+ float m_flBestOverhealDecayMult;
+ float m_flHealedPerSecondTimer;
+
+ float m_flChargeEffectOffTime[MEDIGUN_NUM_CHARGE_TYPES];
+ bool m_bChargeSoundEffectsOn[MEDIGUN_NUM_CHARGE_TYPES];
+
+ // Heal_Radius handling
+ CUtlVector< int > m_iRadiusHealTargets;
+ float m_flRadiusHealCheckTime;
+
+#endif
+
+ // King Rune buff
+ float m_flKingRuneBuffCheckTime;
+ CNetworkVar( bool, m_bKingRuneBuffActive );
+
+ bool m_bPulseRadiusHeal;
+
+ CNetworkVar( bool, m_bLastDisguisedAsOwnTeam );
+
+ // Burn handling
+ CHandle<CTFPlayer> m_hBurnAttacker;
+ CHandle<CTFPlayer> m_hOriginalBurnAttacker; // Player who originally ignited this target
+ CHandle<CTFWeaponBase> m_hBurnWeapon;
+ CNetworkVar( int, m_nNumFlames );
+ float m_flFlameBurnTime;
+ float m_flFlameRemoveTime;
+
+ // Bleeding
+#ifdef GAME_DLL
+ struct bleed_struct_t
+ {
+ CHandle<CTFPlayer> hBleedingAttacker;
+ CHandle<CTFWeaponBase> hBleedingWeapon;
+ float flBleedingTime;
+ float flBleedingRemoveTime;
+ int nBleedDmg;
+ bool bPermanentBleeding;
+ };
+ CUtlVector <bleed_struct_t> m_PlayerBleeds;
+#endif // GAME_DLL
+
+ CNetworkVar( int, m_iTauntIndex );
+ CNetworkVar( int, m_iTauntConcept );
+ CNetworkVar( uint32, m_unTauntSourceItemID_Low );
+ CNetworkVar( uint32, m_unTauntSourceItemID_High );
+#ifdef CLIENT_DLL
+ float m_flTauntParticleRefireTime;
+#endif // CLIENT_DLL
+
+ float m_flDisguiseCompleteTime;
+ float m_flTmpDamageBonusAmount;
+
+#ifdef CLIENT_DLL
+ bool m_bSyncingConditions;
+#endif
+ int m_nOldConditions;
+ int m_nOldConditionsEx;
+ int m_nOldConditionsEx2;
+ int m_nOldConditionsEx3;
+ int m_nOldDisguiseClass;
+ int m_nOldDisguiseTeam;
+
+ int m_nForceConditions;
+ int m_nForceConditionsEx;
+ int m_nForceConditionsEx2;
+ int m_nForceConditionsEx3;
+
+
+ // Feign Death
+ float m_flFeignDeathEnd;
+ CNetworkVar( bool, m_bFeignDeathReady );
+
+ CNetworkVar( int, m_iDesiredPlayerClass );
+
+ float m_flNextBurningSound;
+
+ CNetworkVar( float, m_flCloakMeter ); // [0,100]
+
+ CNetworkVar( bool, m_bInUpgradeZone );
+
+ // Scout
+ CNetworkVar( float, m_flEnergyDrinkMeter ); // [0,100]
+ CNetworkVar( float, m_flHypeMeter );
+
+ // Demoman
+ CNetworkVar( float, m_flChargeMeter );
+
+ // Rage (Soldier, Pyro, Sniper)
+ CNetworkVar( float, m_flRageMeter );
+ CNetworkVar( bool, m_bRageDraining );
+ CNetworkVar( float, m_flNextRageEarnTime );
+
+ RageBuff m_RageBuffSlots[kBuffSlot_MAX];
+
+ // Movement.
+ CNetworkVar( bool, m_bJumping );
+ CNetworkVar( int, m_iAirDash );
+ CNetworkVar( int, m_nAirDucked );
+ CNetworkVar( float, m_flDuckTimer );
+
+ CNetworkVar( float, m_flStealthNoAttackExpire );
+ CNetworkVar( float, m_flStealthNextChangeTime );
+
+ CNetworkVar( float, m_flRuneCharge );
+
+#ifdef STAGING_ONLY
+ // Space
+ CNetworkVar( float, m_flSpaceJumpCharge );
+#endif
+
+ CNetworkVar( int, m_iCritMult );
+
+ 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
+
+ CNetworkVar( float, m_flMovementStunTime );
+ CNetworkVar( int, m_iMovementStunAmount );
+ CNetworkVar( unsigned char, m_iMovementStunParity );
+ CNetworkHandle( CTFPlayer, m_hStunner );
+ CNetworkVar( int, m_iStunFlags );
+ CNetworkVar( int, m_iStunIndex );
+
+ CNetworkHandle( CBaseObject, m_hCarriedObject );
+ CNetworkVar( bool, m_bCarryingObject );
+
+ CHandle<CTFPlayer> m_hAssist;
+
+ CNetworkVar( int, m_nArenaNumChanges ); // number of times a player has re-rolled their class
+
+ CNetworkVar( int, m_iWeaponKnockbackID );
+
+ CNetworkVar( bool, m_bLoadoutUnavailable );
+
+ CNetworkVar( int, m_iItemFindBonus );
+
+ CNetworkVar( bool, m_bShieldEquipped );
+
+ CNetworkVar( bool, m_bParachuteEquipped );
+
+ CNetworkVar( int, m_iDecapitations );
+ int m_iOldDecapitations;
+
+ CNetworkArray( int, m_nStreaks, kTFStreak_COUNT );
+
+ int m_nLastDuckStreakIncrement;
+
+ int m_iOldKillStreak;
+ int m_iOldKillStreakWepSlot;
+
+ CNetworkVar( int, m_iRevengeCrits );
+
+ CNetworkVar( int, m_iNextMeleeCrit );
+ bool m_bPostShieldCharge;
+ float m_flChargeEndTime;
+
+ CNetworkVar( int, m_iDisguiseBody );
+
+ CNetworkVar( int, m_iSpawnRoomTouchCount );
+
+ CNetworkVar( float, m_flNextNoiseMakerTime );
+
+ float m_flCurrentTauntTurnSpeed;
+#ifdef CLIENT_DLL
+ const WheelEffect_t *m_pWheelEffect;
+ QAngle m_angVehicleMoveAngles;
+ bool m_bPreKartPredictionState;
+ float m_angVehicleMovePitchLast;
+
+ CHandle<CBaseAnimating> m_hKartParachuteEntity;
+
+#endif
+public:
+ CNetworkVar( int, m_iKillCountSinceLastDeploy );
+ CNetworkVar( float, m_flFirstPrimaryAttack );
+
+ CNetworkVar( float, m_flSpyTranqBuffDuration );
+private:
+
+#ifdef GAME_DLL
+ float m_flNextCritUpdate;
+ CUtlVector<CTFDamageEvent> m_DamageEvents;
+
+ CHandle<CTFPlayer> m_hPeeAttacker;
+
+ float m_flRadiusCurrencyCollectionTime;
+ float m_flRadiusSpyScanTime;
+
+ struct pulledcurrencypacks_t
+ {
+ CHandle<CCurrencyPack> hPack;
+ float flTime;
+ };
+ CUtlVector <pulledcurrencypacks_t> m_CurrencyPacks;
+
+#else
+ float m_flGotTeleEffectAt;
+ unsigned char m_iOldMovementStunParity;
+ CSoundPatch *m_pCritBoostSoundLoop;
+#endif
+
+public:
+ float m_flStunFade;
+ float m_flStunEnd;
+ float m_flStunMid;
+ int m_iStunAnimState;
+ int m_iPhaseDamage;
+
+ // Movement stun state.
+ bool m_bStunNeedsFadeOut;
+ float m_flStunLerpTarget;
+ float m_flLastMovementStunChange;
+#ifdef GAME_DLL
+ CUtlVector <stun_struct_t> m_PlayerStuns;
+ CUtlVector< CHandle<CTFPlayer> > m_hPlayersVisibleAtChargeStart; // ACHIEVEMENT_TF_DEMOMAN_KILL_PLAYER_YOU_DIDNT_SEE
+#else
+ stun_struct_t m_ActiveStunInfo;
+#endif // CLIENT_DLL
+
+ float m_flInvulnerabilityRemoveTime;
+
+ /*
+ float m_flShieldChargeStartTime;
+ */
+
+ // Demoman charge weapon glow.
+ float m_flLastChargeTime;
+ float m_flLastNoChargeTime;
+ bool m_bChargeGlowing;
+
+ bool m_bChargeOffSounded;
+
+ bool m_bBiteEffectWasApplied;
+
+ float m_flNextRocketPackTime;
+ float m_flLastNoMovementTime;
+
+ CNetworkVar( bool, m_bArenaFirstBloodBoost );
+
+// passtime
+public:
+ void SetHasPasstimeBall( bool has ) { m_bHasPasstimeBall = has; }
+ bool HasPasstimeBall() const { return m_bHasPasstimeBall; }
+
+ bool IsTargetedForPasstimePass() const { return m_bIsTargetedForPasstimePass; }
+ void SetPasstimePassTarget( CTFPlayer *ent );
+ CTFPlayer *GetPasstimePassTarget() const;
+
+ void SetAskForBallTime( float time ) { m_askForBallTime = time; }
+ float AskForBallTime() const { return m_askForBallTime; }
+
+ float m_flPasstimeThrowAnimStateTime;
+ int m_iPasstimeThrowAnimState;
+
+private:
+ CNetworkVar( bool, m_bHasPasstimeBall );
+ CNetworkVar( bool, m_bIsTargetedForPasstimePass );
+ CNetworkHandle( CTFPlayer, m_hPasstimePassTarget );
+ CNetworkVar( float, m_askForBallTime );
+};
+
+#define CONTROL_STUN_ANIM_TIME 1.5f
+#define STUN_ANIM_NONE 0
+#define STUN_ANIM_LOOP 1
+#define STUN_ANIM_END 2
+
+#define PASSTIME_THROW_ANIM_NONE 0
+#define PASSTIME_THROW_ANIM_LOOP 1
+#define PASSTIME_THROW_ANIM_END 2
+#define PASSTIME_THROW_ANIM_CANCEL 3
+
+extern const char *g_pszBDayGibs[22];
+
+class CTraceFilterIgnoreTeammatesAndTeamObjects : public CTraceFilterSimple
+{
+public:
+ DECLARE_CLASS( CTraceFilterIgnoreTeammatesAndTeamObjects, CTraceFilterSimple );
+
+ CTraceFilterIgnoreTeammatesAndTeamObjects( const IHandleEntity *passentity, int collisionGroup, int iIgnoreTeam )
+ : CTraceFilterSimple( passentity, collisionGroup ), m_iIgnoreTeam( iIgnoreTeam ) {}
+
+ virtual bool ShouldHitEntity( IHandleEntity *pServerEntity, int contentsMask );
+
+private:
+ int m_iIgnoreTeam;
+};
+
+enum { kSoldierBuffCount = 6 };
+extern ETFCond g_SoldierBuffAttributeIDToConditionMap[kSoldierBuffCount + 1];
+
+class CTFPlayerSharedUtils
+{
+public:
+ static CEconItemView *GetEconItemViewByLoadoutSlot( CTFPlayer *pTFPlayer, int iSlot, CEconEntity **pEntity = NULL );
+ static bool ConceptIsPartnerTaunt( int iConcept );
+ static CTFWeaponBuilder *GetBuilderForObjectType( CTFPlayer *pTFPlayer, int iObjectType );
+};
+
+class CTargetOnlyFilter : public CTraceFilterSimple
+{
+public:
+ CTargetOnlyFilter( CBaseEntity *pShooter, CBaseEntity *pTarget );
+ virtual bool ShouldHitEntity( IHandleEntity *pHandleEntity, int contentsMask );
+ CBaseEntity *m_pShooter;
+ CBaseEntity *m_pTarget;
+};
+
+#endif // TF_PLAYER_SHARED_H