You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1298 lines
42 KiB
1298 lines
42 KiB
![]()
4 years ago
|
//========= 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
|