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.
262 lines
7.5 KiB
262 lines
7.5 KiB
//========= 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(); |
|
} |