|
|
//========= 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(); }
|