summaryrefslogtreecommitdiff
path: root/game/client/tf/c_tf_playerresource.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/c_tf_playerresource.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf/c_tf_playerresource.cpp')
-rw-r--r--game/client/tf/c_tf_playerresource.cpp337
1 files changed, 337 insertions, 0 deletions
diff --git a/game/client/tf/c_tf_playerresource.cpp b/game/client/tf/c_tf_playerresource.cpp
new file mode 100644
index 0000000..133b7bb
--- /dev/null
+++ b/game/client/tf/c_tf_playerresource.cpp
@@ -0,0 +1,337 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: TF's custom C_PlayerResource
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "c_tf_playerresource.h"
+#include <shareddefs.h>
+#include <tf_shareddefs.h>
+#include "hud.h"
+#include "tf_gamerules.h"
+#include "tf_gc_client.h"
+#include "tf_lobby_server.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+extern ConVar tf_mvm_respec_limit;
+extern ConVar tf_mvm_buybacks_method;
+
+C_TF_PlayerResource *g_TF_PR;
+
+IMPLEMENT_CLIENTCLASS_DT( C_TF_PlayerResource, DT_TFPlayerResource, CTFPlayerResource )
+ RecvPropArray3( RECVINFO_ARRAY( m_iTotalScore ), RecvPropInt( RECVINFO( m_iTotalScore[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iMaxHealth ), RecvPropInt( RECVINFO( m_iMaxHealth[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iMaxBuffedHealth ), RecvPropInt( RECVINFO( m_iMaxBuffedHealth[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iPlayerClass ), RecvPropInt( RECVINFO( m_iPlayerClass[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_bArenaSpectator ), RecvPropBool( RECVINFO( m_bArenaSpectator[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iActiveDominations ), RecvPropInt( RECVINFO( m_iActiveDominations[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_flNextRespawnTime ), RecvPropTime( RECVINFO( m_flNextRespawnTime[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iChargeLevel ), RecvPropInt( RECVINFO( m_iChargeLevel[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iDamage ), RecvPropInt( RECVINFO( m_iDamage[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iDamageAssist ), RecvPropInt( RECVINFO( m_iDamageAssist[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iDamageBoss ), RecvPropInt( RECVINFO( m_iDamageBoss[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iHealing ), RecvPropInt( RECVINFO( m_iHealing[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iHealingAssist ), RecvPropInt( RECVINFO( m_iHealingAssist[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iDamageBlocked ), RecvPropInt( RECVINFO( m_iDamageBlocked[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iCurrencyCollected ), RecvPropInt( RECVINFO( m_iCurrencyCollected[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iBonusPoints ), RecvPropInt( RECVINFO( m_iBonusPoints[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iPlayerLevel ), RecvPropInt( RECVINFO( m_iPlayerLevel[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iStreaks ), RecvPropInt( RECVINFO_ARRAY( m_iStreaks ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iUpgradeRefundCredits ), RecvPropInt( RECVINFO( m_iUpgradeRefundCredits[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iBuybackCredits ), RecvPropInt( RECVINFO( m_iBuybackCredits[0] ) ) ),
+ RecvPropInt( RECVINFO( m_iPartyLeaderRedTeamIndex ) ),
+ RecvPropInt( RECVINFO( m_iPartyLeaderBlueTeamIndex ) ),
+ RecvPropInt( RECVINFO( m_iEventTeamStatus ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iPlayerClassWhenKilled ), RecvPropInt( RECVINFO( m_iPlayerClassWhenKilled[0] ) ) ),
+ RecvPropArray3( RECVINFO_ARRAY( m_iConnectionState ), RecvPropInt( RECVINFO( m_iConnectionState[0] ) ) ),
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_TF_PlayerResource::C_TF_PlayerResource()
+{
+ m_Colors[TEAM_UNASSIGNED] = COLOR_TF_SPECTATOR;
+ m_Colors[TEAM_SPECTATOR] = COLOR_TF_SPECTATOR;
+ m_Colors[TF_TEAM_RED] = COLOR_RED;
+ m_Colors[TF_TEAM_BLUE] = COLOR_BLUE;
+
+ m_iPartyLeaderRedTeamIndex = 0;
+ m_iPartyLeaderBlueTeamIndex = 0;
+ m_iEventTeamStatus = 0;
+
+ ResetPlayerScoreStats();
+
+ g_TF_PR = this;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_TF_PlayerResource::~C_TF_PlayerResource()
+{
+ g_TF_PR = NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetTeam( int iIndex )
+{
+ bool bValid = ( iIndex >= 1 && iIndex <= MAX_PLAYERS );
+ if ( !bValid )
+ {
+ Assert( bValid );
+ return TEAM_UNASSIGNED;
+ }
+
+ int iTeam = BaseClass::GetTeam( iIndex );
+
+ if ( iTeam == TEAM_UNASSIGNED )
+ {
+ // In MvM, force everybody to show as being on the defending team,
+ // even if they have not picked a team yet
+ if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() )
+ {
+ iTeam = TF_TEAM_PVE_DEFENDERS;
+ }
+ }
+
+ return iTeam;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+MM_PlayerConnectionState_t C_TF_PlayerResource::GetPlayerConnectionState( int iIndex ) const
+{
+ if ( !iIndex || ( iIndex > MAX_PLAYERS ) )
+ return MM_DISCONNECTED;
+
+ return m_iConnectionState[iIndex];
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Gets a value from an array member
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetArrayValue( int iIndex, int *pArray, int iDefaultVal )
+{
+ if ( !IsConnected( iIndex ) && !IsValid( iIndex ) )
+ return iDefaultVal;
+
+ return pArray[iIndex];
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Gets a streak value
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetStreak( unsigned int iIndex, CTFPlayerShared::ETFStreak streak_type )
+{
+ if ( !IsConnected( iIndex ) && !IsValid( iIndex ) )
+ return 0;
+
+ return m_iStreaks[ iIndex * CTFPlayerShared::kTFStreak_COUNT + streak_type ];
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetNumRespecCredits( uint32 unIndex )
+{
+ if ( !unIndex || unIndex > MAX_PLAYERS )
+ return 0;
+
+ if ( !tf_mvm_respec_limit.GetBool() )
+ return 1;
+
+ return GetArrayValue( unIndex, m_iUpgradeRefundCredits, 0 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetNumBuybackCredits( uint32 unIndex )
+{
+ if ( !unIndex || unIndex > MAX_PLAYERS )
+ return 0;
+
+ if ( !tf_mvm_buybacks_method.GetBool() )
+ return 0;
+
+ return GetArrayValue( unIndex, m_iBuybackCredits, 0 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetCountForPlayerClass( int iTeam, int iClass, bool bExcludeLocalPlayer /*=false*/ )
+{
+ int count = 0;
+ int iLocalPlayerIndex = GetLocalPlayerIndex();
+
+ for ( int i = 1 ; i <= MAX_PLAYERS ; i++ )
+ {
+ if ( bExcludeLocalPlayer && ( i == iLocalPlayerIndex ) )
+ {
+ continue;
+ }
+
+ if ( ( GetTeam( i ) == iTeam ) && ( GetPlayerClass( i ) == iClass ) )
+ {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetNumPlayersForTeam( int iTeam, bool bAliveOnly )
+{
+ int count = 0;
+
+ for ( int playerIndex = 1 ; playerIndex <= MAX_PLAYERS; playerIndex++ )
+ {
+ if ( IsConnected( playerIndex ) )
+ {
+ if ( GetTeam( playerIndex ) == iTeam )
+ {
+ if ( bAliveOnly && !IsAlive( playerIndex ) )
+ continue;
+
+ count++;
+ }
+ }
+ }
+
+ return count;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetDamage( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iDamage, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevDamage;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetDamageAssist( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iDamageAssist, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevDamageAssist;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetDamageBoss( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iDamageBoss, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevDamageBoss;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetHealing( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iHealing, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevHealing;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetHealingAssist( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iHealingAssist, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevHealingAssist;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetDamageBlocked( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iDamageBlocked, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevDamageBlocked;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetCurrencyCollected( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iCurrencyCollected, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevCurrencyCollected;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int C_TF_PlayerResource::GetBonusPoints( unsigned int nIndex )
+{
+ Assert( nIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+
+ return GetArrayValue( nIndex, m_iBonusPoints, 0 ) + m_aPlayerScoreStats[nIndex].m_iPrevBonusPoints;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_TF_PlayerResource::UpdatePlayerScoreStats( void )
+{
+ for ( int playerIndex = 0; playerIndex < ARRAYSIZE( m_aPlayerScoreStats ); playerIndex++ )
+ {
+ // Add current round stats to the accumulator
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamage += GetArrayValue( playerIndex, m_iDamage, 0 );
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamageAssist += GetArrayValue( playerIndex, m_iDamageAssist, 0 );
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamageBoss += GetArrayValue( playerIndex, m_iDamageBoss, 0 );
+ m_aPlayerScoreStats[playerIndex].m_iPrevHealing += GetArrayValue( playerIndex, m_iHealing, 0 );
+ m_aPlayerScoreStats[playerIndex].m_iPrevHealingAssist += GetArrayValue( playerIndex, m_iHealingAssist, 0 );
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamageBlocked += GetArrayValue( playerIndex, m_iDamageBlocked, 0 );
+ m_aPlayerScoreStats[playerIndex].m_iPrevCurrencyCollected += GetArrayValue( playerIndex, m_iCurrencyCollected, 0 );
+ m_aPlayerScoreStats[playerIndex].m_iPrevBonusPoints += GetArrayValue( playerIndex, m_iBonusPoints, 0 );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_TF_PlayerResource::ResetPlayerScoreStats( int playerIndex /*= -1*/ )
+{
+ if ( playerIndex == -1 )
+ {
+ Q_memset( m_aPlayerScoreStats, 0, sizeof( m_aPlayerScoreStats ) );
+ }
+ else
+ {
+ // valid playerIndex should be 1-33 (32 players)
+ Assert( playerIndex > 0 && playerIndex < ARRAYSIZE( m_aPlayerScoreStats ) );
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamage = 0;
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamageAssist = 0;
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamageBoss = 0;
+ m_aPlayerScoreStats[playerIndex].m_iPrevHealing = 0;
+ m_aPlayerScoreStats[playerIndex].m_iPrevHealingAssist = 0;
+ m_aPlayerScoreStats[playerIndex].m_iPrevDamageBlocked = 0;
+ m_aPlayerScoreStats[playerIndex].m_iPrevCurrencyCollected = 0;
+ m_aPlayerScoreStats[playerIndex].m_iPrevBonusPoints = 0;
+ }
+}