diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/c_tf_team.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/tf/c_tf_team.cpp')
| -rw-r--r-- | game/client/tf/c_tf_team.cpp | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/game/client/tf/c_tf_team.cpp b/game/client/tf/c_tf_team.cpp new file mode 100644 index 0000000..f3cfbc0 --- /dev/null +++ b/game/client/tf/c_tf_team.cpp @@ -0,0 +1,262 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Client side C_TFTeam class +// +// $NoKeywords: $ +//============================================================================= +#include "cbase.h" +#include "engine/IEngineSound.h" +#include "hud.h" +#include "recvproxy.h" +#include "c_tf_team.h" +#include "c_tf_player.h" +#include "tf_shareddefs.h" +#include "tf_gamerules.h" +#include "c_tf_playerresource.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +//----------------------------------------------------------------------------- +// Purpose: RecvProxy that converts the Player's object UtlVector to entindexes +//----------------------------------------------------------------------------- +void RecvProxy_TeamObjectList( const CRecvProxyData *pData, void *pStruct, void *pOut ) +{ + C_TFTeam *pPlayer = (C_TFTeam*)pStruct; + CBaseHandle *pHandle = (CBaseHandle*)(&(pPlayer->m_aObjects[pData->m_iElement])); + RecvProxy_IntToEHandle( pData, pStruct, pHandle ); +} + +void RecvProxyArrayLength_TeamObjects( void *pStruct, int objectID, int currentArrayLength ) +{ + C_TFTeam *pPlayer = (C_TFTeam*)pStruct; + + if ( pPlayer->m_aObjects.Count() != currentArrayLength ) + { + pPlayer->m_aObjects.SetSize( currentArrayLength ); + } +} + +IMPLEMENT_CLIENTCLASS_DT( C_TFTeam, DT_TFTeam, CTFTeam ) + + RecvPropInt( RECVINFO( m_nFlagCaptures ) ), + RecvPropInt( RECVINFO( m_iRole ) ), + + RecvPropArray2( + RecvProxyArrayLength_TeamObjects, + RecvPropInt( "team_object_array_element", 0, SIZEOF_IGNORE, 0, RecvProxy_TeamObjectList ), + MAX_PLAYERS * MAX_OBJECTS_PER_PLAYER, + 0, + "team_object_array" ), + + RecvPropEHandle( RECVINFO( m_hLeader ) ), + +END_RECV_TABLE() + +#define TEAM_THINK_RATE 0.5f + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_TFTeam::C_TFTeam() +{ + m_nFlagCaptures = 0; + m_bUsingCustomTeamName = false; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_TFTeam::~C_TFTeam() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_TFTeam::OnDataChanged( DataUpdateType_t updateType ) +{ + BaseClass::OnDataChanged( updateType ); + + if ( updateType == DATA_UPDATE_CREATED ) + { + SetNextClientThink( gpGlobals->curtime + TEAM_THINK_RATE ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +char* C_TFTeam::Get_Name( void ) +{ + // Use Get_Localized_Name() instead + AssertMsg( false, "Use Get_Localized_Name() instead" ); + return ""; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_TFTeam::ClientThink() +{ + BaseClass::ClientThink(); + + UpdateTeamName(); + SetNextClientThink( gpGlobals->curtime + TEAM_THINK_RATE ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_TFTeam::UpdateTeamName( void ) +{ + m_bUsingCustomTeamName = false; + + const wchar_t *pwzName = NULL; + if ( TFGameRules() && TFGameRules()->IsInTournamentMode() && ( ( m_iTeamNum == TF_TEAM_RED ) || ( m_iTeamNum == TF_TEAM_BLUE ) ) ) + { + if ( TFGameRules()->IsCompetitiveMode() ) + { + if ( g_TF_PR && ( g_TF_PR->HasPremadeParties() || g_TF_PR->GetEventTeamStatus() ) ) + { + wchar_t wszTempName[MAX_TEAM_NAME_LENGTH]; + wchar_t *pFormat = g_pVGuiLocalize->Find( "#TF_Team_PartyLeader" ); + if ( !pFormat ) + { + pFormat = L"%s"; + } + + if ( g_TF_PR->GetEventTeamStatus() ) + { + // GetEventTeamStatus() returns a value in the following range + // enum WarMatch + // { + // NOPE = 0; + // INVADERS_ARE_PYRO = 1; + // INVADERS_ARE_HEAVY = 2; + // }; + const char *pszTeamName = ( m_iTeamNum == TF_TEAM_BLUE ) ? + ( g_TF_PR->GetEventTeamStatus() == 1 ? "#TF_Pyro" : "#TF_HWGuy" ) : + ( g_TF_PR->GetEventTeamStatus() == 1 ? "#TF_HWGuy" : "#TF_Pyro" ); + wchar_t *pwzWarTeam = g_pVGuiLocalize->Find( pszTeamName ); + V_swprintf_safe( m_wzTeamname, pFormat, pwzWarTeam ); + m_bUsingCustomTeamName = true; + return; + } + else + { + int iPlayerIndex = ( m_iTeamNum == TF_TEAM_RED ) ? g_TF_PR->GetPartyLeaderRedTeamIndex() : g_TF_PR->GetPartyLeaderBlueTeamIndex(); + if ( g_TF_PR->IsConnected( iPlayerIndex ) ) + { + g_pVGuiLocalize->ConvertANSIToUnicode( UTIL_SafeName( g_TF_PR->GetPlayerName( iPlayerIndex ) ), wszTempName, sizeof( wszTempName ) ); + V_swprintf_safe( m_wzTeamname, pFormat, wszTempName ); + m_bUsingCustomTeamName = true; + return; + } + } + } + } + else + { + const char *pTemp = ( m_iTeamNum == TF_TEAM_BLUE ) ? mp_tournament_blueteamname.GetString() : mp_tournament_redteamname.GetString(); + if ( pTemp && pTemp[0] ) + { + g_pVGuiLocalize->ConvertANSIToUnicode( pTemp, m_wzTeamname, sizeof( m_wzTeamname ) ); + return; + } + } + } + + if ( m_iTeamNum == TF_TEAM_BLUE ) + { + pwzName = g_pVGuiLocalize->Find( "#TF_BlueTeam_Name" ); + if ( !pwzName ) + { + pwzName = L"BLU"; + } + } + else if ( m_iTeamNum == TF_TEAM_RED ) + { + if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() ) + { + pwzName = g_pVGuiLocalize->Find( "#TF_Defenders" ); + if ( !pwzName ) + { + pwzName = L"DEFENDERS"; + } + } + else + { + pwzName = g_pVGuiLocalize->Find( "#TF_RedTeam_Name" ); + if ( !pwzName ) + { + pwzName = L"RED"; + } + } + } + else if ( m_iTeamNum == TEAM_SPECTATOR ) + { + pwzName = g_pVGuiLocalize->Find( "#TF_Spectators" ); + if ( !pwzName ) + { + pwzName = L"SPECTATORS"; + } + } + + V_wcscpy_safe( m_wzTeamname, pwzName ? pwzName : L"" ); +} + +//----------------------------------------------------------------------------- +// Purpose: Get the C_TFTeam for the specified team number +//----------------------------------------------------------------------------- +C_TFTeam *GetGlobalTFTeam( int iTeamNumber ) +{ + for ( int i = 0; i < g_Teams.Count(); i++ ) + { + if ( g_Teams[i]->GetTeamNumber() == iTeamNumber ) + return ( dynamic_cast< C_TFTeam* >( g_Teams[i] ) ); + } + + return NULL; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +int C_TFTeam::GetNumObjects( int iObjectType ) +{ + // Asking for a count of a specific object type? + if ( iObjectType > 0 ) + { + int iCount = 0; + for ( int i = 0; i < GetNumObjects(); i++ ) + { + CBaseObject *pObject = GetObject(i); + if ( pObject && pObject->GetType() == iObjectType ) + { + iCount++; + } + } + return iCount; + } + + return m_aObjects.Count(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CBaseObject *C_TFTeam::GetObject( int num ) +{ + Assert( num >= 0 && num < m_aObjects.Count() ); + return m_aObjects[ num ]; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +C_BasePlayer *C_TFTeam::GetTeamLeader( void ) +{ + return m_hLeader.Get(); +}
\ No newline at end of file |