mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-04-04 07:35:25 +00:00
323 lines
9.1 KiB
C++
323 lines
9.1 KiB
C++
//====== Copyright © 1996-2004, 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"
|
|
|
|
// Client specific.
|
|
#ifdef CLIENT_DLL
|
|
class C_TFPlayer;
|
|
// Server specific.
|
|
#else
|
|
class CTFPlayer;
|
|
#endif
|
|
|
|
//=============================================================================
|
|
//
|
|
// Tables.
|
|
//
|
|
|
|
// Client specific.
|
|
#ifdef CLIENT_DLL
|
|
|
|
EXTERN_RECV_TABLE( DT_TFPlayerShared );
|
|
|
|
// Server specific.
|
|
#else
|
|
|
|
EXTERN_SEND_TABLE( DT_TFPlayerShared );
|
|
|
|
#endif
|
|
|
|
|
|
//=============================================================================
|
|
|
|
#define PERMANENT_CONDITION -1
|
|
|
|
// Damage storage for crit multiplier calculation
|
|
class CTFDamageEvent
|
|
{
|
|
DECLARE_EMBEDDED_NETWORKVAR()
|
|
|
|
public:
|
|
float flDamage;
|
|
float flTime;
|
|
bool bKill;
|
|
};
|
|
|
|
//=============================================================================
|
|
//
|
|
// Shared player class.
|
|
//
|
|
class CTFPlayerShared
|
|
{
|
|
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 );
|
|
|
|
// Initialization.
|
|
CTFPlayerShared();
|
|
void Init( OuterClass *pOuter );
|
|
|
|
// 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_*).
|
|
int GetCond() const { return m_nPlayerCond; }
|
|
void SetCond( int nCond ) { m_nPlayerCond = nCond; }
|
|
void AddCond( int nCond, float flDuration = PERMANENT_CONDITION );
|
|
void RemoveCond( int nCond );
|
|
bool InCond( int nCond );
|
|
void RemoveAllCond( CTFPlayer *pPlayer );
|
|
void OnConditionAdded( int nCond );
|
|
void OnConditionRemoved( int nCond );
|
|
void ConditionThink( void );
|
|
float GetConditionDuration( int nCond );
|
|
|
|
void ConditionGameRulesThink( void );
|
|
|
|
void InvisibilityThink( void );
|
|
|
|
int GetMaxBuffedHealth( void );
|
|
|
|
#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 UpdateConditions( void );
|
|
#endif
|
|
|
|
void Disguise( int nTeam, int nClass );
|
|
void CompleteDisguise( void );
|
|
void RemoveDisguise( void );
|
|
void FindDisguiseTarget( void );
|
|
int GetDisguiseTeam( void ) { return m_nDisguiseTeam; }
|
|
int GetDisguiseClass( void ) { return m_nDisguiseClass; }
|
|
int GetDesiredDisguiseClass( void ) { return m_nDesiredDisguiseClass; }
|
|
int GetDesiredDisguiseTeam( void ) { return m_nDesiredDisguiseTeam; }
|
|
EHANDLE GetDisguiseTarget( void )
|
|
{
|
|
#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
|
|
}
|
|
int GetDisguiseHealth( void ) { return m_iDisguiseHealth; }
|
|
void SetDisguiseHealth( int iDisguiseHealth );
|
|
|
|
#ifdef CLIENT_DLL
|
|
void OnDisguiseChanged( void );
|
|
void RecalcDisguiseWeapon( void );
|
|
int GetDisguiseWeaponModelIndex( void ) { return m_iDisguiseWeaponModelIndex; }
|
|
CTFWeaponInfo *GetDisguiseWeaponInfo( void );
|
|
#endif
|
|
|
|
#ifdef GAME_DLL
|
|
void Heal( CTFPlayer *pPlayer, float flAmount, bool bDispenserHeal = false );
|
|
void StopHealing( CTFPlayer *pPlayer );
|
|
void RecalculateInvuln( bool bInstantRemove = false );
|
|
int FindHealerIndex( CTFPlayer *pPlayer );
|
|
EHANDLE GetFirstHealer();
|
|
#endif
|
|
int GetNumHealers( void ) { return m_nNumHealers; }
|
|
|
|
void Burn( CTFPlayer *pPlayer );
|
|
|
|
// 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 flInvisFadeTime );
|
|
float GetPercentInvisible( void );
|
|
void NoteLastDamageTime( int nDamage );
|
|
void OnSpyTouchedByEnemy( void );
|
|
float GetLastStealthExposedTime( void ) { return m_flLastStealthExposeTime; }
|
|
|
|
int GetDesiredPlayerClassIndex( void );
|
|
|
|
float GetSpyCloakMeter() const { return m_flCloakMeter; }
|
|
void SetSpyCloakMeter( float val ) { m_flCloakMeter = val; }
|
|
|
|
bool IsJumping( void ) { return m_bJumping; }
|
|
void SetJumping( bool bJumping );
|
|
bool IsAirDashing( void ) { return m_bAirDash; }
|
|
void SetAirDash( bool bAirDash );
|
|
|
|
void DebugPrintConditions( void );
|
|
|
|
float GetStealthNoAttackExpireTime( void );
|
|
|
|
void SetPlayerDominated( CTFPlayer *pPlayer, bool bDominated );
|
|
bool IsPlayerDominated( int iPlayerIndex );
|
|
bool IsPlayerDominatingMe( int iPlayerIndex );
|
|
void SetPlayerDominatingMe( CTFPlayer *pPlayer, bool bDominated );
|
|
|
|
private:
|
|
|
|
void ImpactWaterTrace( trace_t &trace, const Vector &vecStart );
|
|
|
|
void OnAddStealthed( void );
|
|
void OnAddInvulnerable( void );
|
|
void OnAddTeleported( void );
|
|
void OnAddBurning( void );
|
|
void OnAddDisguising( void );
|
|
void OnAddDisguised( void );
|
|
|
|
void OnRemoveZoomed( void );
|
|
void OnRemoveBurning( void );
|
|
void OnRemoveStealthed( void );
|
|
void OnRemoveDisguised( void );
|
|
void OnRemoveDisguising( void );
|
|
void OnRemoveInvulnerable( void );
|
|
void OnRemoveTeleported( void );
|
|
|
|
float GetCritMult( void );
|
|
|
|
#ifdef GAME_DLL
|
|
void UpdateCritMult( void );
|
|
void RecordDamageEvent( const CTakeDamageInfo &info, bool bKill );
|
|
void ClearDamageEvents( void ) { m_DamageEvents.Purge(); }
|
|
int GetNumKillsInTime( float flTime );
|
|
|
|
// Invulnerable.
|
|
bool IsProvidingInvuln( CTFPlayer *pPlayer );
|
|
void SetInvulnerable( bool bState, bool bInstant = false );
|
|
#endif
|
|
|
|
private:
|
|
|
|
// Vars that are networked.
|
|
CNetworkVar( int, m_nPlayerState ); // Player state.
|
|
CNetworkVar( int, m_nPlayerCond ); // Player condition flags.
|
|
float m_flCondExpireTimeLeft[TF_COND_LAST]; // Time until each condition expires
|
|
|
|
//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.
|
|
EHANDLE m_hDisguiseTarget; // Playing the spy is using for name disguise.
|
|
CNetworkVar( int, m_iDisguiseTargetIndex );
|
|
CNetworkVar( int, m_iDisguiseHealth ); // Health to show our enemies in player id
|
|
CNetworkVar( int, m_nDesiredDisguiseClass );
|
|
CNetworkVar( int, m_nDesiredDisguiseTeam );
|
|
|
|
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;
|
|
CNetworkVar( float, m_flInvisChangeCompleteTime ); // when uncloaking, must be done by this time
|
|
float m_flLastStealthExposeTime;
|
|
|
|
CNetworkVar( int, m_nNumHealers );
|
|
|
|
// Vars that are not networked.
|
|
OuterClass *m_pOuter; // C_TFPlayer or CTFPlayer (client/server).
|
|
|
|
#ifdef GAME_DLL
|
|
// Healer handling
|
|
struct healers_t
|
|
{
|
|
EHANDLE pPlayer;
|
|
float flAmount;
|
|
bool bDispenserHeal;
|
|
};
|
|
CUtlVector< healers_t > m_aHealers;
|
|
float m_flHealFraction; // Store fractional health amounts
|
|
float m_flDisguiseHealFraction; // Same for disguised healing
|
|
|
|
float m_flInvulnerableOffTime;
|
|
#endif
|
|
|
|
// Burn handling
|
|
CHandle<CTFPlayer> m_hBurnAttacker;
|
|
CNetworkVar( int, m_nNumFlames );
|
|
float m_flFlameBurnTime;
|
|
float m_flFlameRemoveTime;
|
|
float m_flTauntRemoveTime;
|
|
|
|
|
|
float m_flDisguiseCompleteTime;
|
|
|
|
int m_nOldConditions;
|
|
int m_nOldDisguiseClass;
|
|
|
|
CNetworkVar( int, m_iDesiredPlayerClass );
|
|
|
|
float m_flNextBurningSound;
|
|
|
|
CNetworkVar( float, m_flCloakMeter ); // [0,100]
|
|
|
|
CNetworkVar( bool, m_bJumping );
|
|
CNetworkVar( bool, m_bAirDash );
|
|
|
|
CNetworkVar( float, m_flStealthNoAttackExpire );
|
|
CNetworkVar( float, m_flStealthNextChangeTime );
|
|
|
|
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
|
|
|
|
#ifdef GAME_DLL
|
|
float m_flNextCritUpdate;
|
|
CUtlVector<CTFDamageEvent> m_DamageEvents;
|
|
#else
|
|
int m_iDisguiseWeaponModelIndex;
|
|
int m_iOldDisguiseWeaponModelIndex;
|
|
CTFWeaponInfo *m_pDisguiseWeaponInfo;
|
|
|
|
WEAPON_FILE_INFO_HANDLE m_hDisguiseWeaponInfo;
|
|
#endif
|
|
};
|
|
|
|
#define TF_DEATH_DOMINATION 0x0001 // killer is dominating victim
|
|
#define TF_DEATH_ASSISTER_DOMINATION 0x0002 // assister is dominating victim
|
|
#define TF_DEATH_REVENGE 0x0004 // killer got revenge on victim
|
|
#define TF_DEATH_ASSISTER_REVENGE 0x0008 // assister got revenge on victim
|
|
|
|
extern const char *g_pszBDayGibs[22];
|
|
|
|
#endif // TF_PLAYER_SHARED_H
|