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.
256 lines
7.7 KiB
256 lines
7.7 KiB
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Client side CTeam class |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "c_team.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: RecvProxy that converts the Team's player UtlVector to entindexes |
|
//----------------------------------------------------------------------------- |
|
void RecvProxy_PlayerList( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
C_Team *pTeam = (C_Team*)pOut; |
|
pTeam->m_aPlayers[pData->m_iElement] = pData->m_Value.m_Int; |
|
} |
|
|
|
|
|
void RecvProxyArrayLength_PlayerArray( void *pStruct, int objectID, int currentArrayLength ) |
|
{ |
|
C_Team *pTeam = (C_Team*)pStruct; |
|
|
|
if ( pTeam->m_aPlayers.Count() != currentArrayLength ) |
|
pTeam->m_aPlayers.SetSize( currentArrayLength ); |
|
} |
|
|
|
|
|
IMPLEMENT_CLIENTCLASS_DT_NOBASE(C_Team, DT_Team, CTeam) |
|
RecvPropInt( RECVINFO(m_iTeamNum)), |
|
RecvPropInt( RECVINFO(m_iScore)), |
|
RecvPropInt( RECVINFO(m_iRoundsWon) ), |
|
RecvPropString( RECVINFO(m_szTeamname)), |
|
|
|
RecvPropArray2( |
|
RecvProxyArrayLength_PlayerArray, |
|
RecvPropInt( "player_array_element", 0, SIZEOF_IGNORE, 0, RecvProxy_PlayerList ), |
|
MAX_PLAYERS, |
|
0, |
|
"player_array" |
|
) |
|
END_RECV_TABLE() |
|
|
|
BEGIN_PREDICTION_DATA( C_Team ) |
|
DEFINE_PRED_ARRAY( m_szTeamname, FIELD_CHARACTER, MAX_TEAM_NAME_LENGTH, FTYPEDESC_PRIVATE ), |
|
DEFINE_PRED_FIELD( m_iScore, FIELD_INTEGER, FTYPEDESC_PRIVATE ), |
|
DEFINE_PRED_FIELD( m_iRoundsWon, FIELD_INTEGER, FTYPEDESC_PRIVATE ), |
|
DEFINE_PRED_FIELD( m_iDeaths, FIELD_INTEGER, FTYPEDESC_PRIVATE ), |
|
DEFINE_PRED_FIELD( m_iPing, FIELD_INTEGER, FTYPEDESC_PRIVATE ), |
|
DEFINE_PRED_FIELD( m_iPacketloss, FIELD_INTEGER, FTYPEDESC_PRIVATE ), |
|
DEFINE_PRED_FIELD( m_iTeamNum, FIELD_INTEGER, FTYPEDESC_PRIVATE ), |
|
END_PREDICTION_DATA(); |
|
|
|
// Global list of client side team entities |
|
CUtlVector< C_Team * > g_Teams; |
|
|
|
//================================================================================================= |
|
// C_Team functionality |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
C_Team::C_Team() |
|
{ |
|
m_iScore = 0; |
|
m_iRoundsWon = 0; |
|
memset( m_szTeamname, 0, sizeof(m_szTeamname) ); |
|
|
|
m_iDeaths = 0; |
|
m_iPing = 0; |
|
m_iPacketloss = 0; |
|
|
|
// Add myself to the global list of team entities |
|
g_Teams.AddToTail( this ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
C_Team::~C_Team() |
|
{ |
|
g_Teams.FindAndRemove( this ); |
|
} |
|
|
|
|
|
void C_Team::RemoveAllPlayers() |
|
{ |
|
m_aPlayers.RemoveAll(); |
|
} |
|
|
|
void C_Team::PreDataUpdate( DataUpdateType_t updateType ) |
|
{ |
|
BaseClass::PreDataUpdate( updateType ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Gets the ith player on the team (may return NULL) |
|
//----------------------------------------------------------------------------- |
|
C_BasePlayer* C_Team::GetPlayer( int idx ) |
|
{ |
|
return (C_BasePlayer*)cl_entitylist->GetEnt(m_aPlayers[idx]); |
|
} |
|
|
|
|
|
int C_Team::GetTeamNumber() const |
|
{ |
|
return m_iTeamNum; |
|
} |
|
|
|
|
|
//================================================================================================= |
|
// TEAM HANDLING |
|
//================================================================================================= |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
char *C_Team::Get_Name( void ) |
|
{ |
|
return m_szTeamname; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
int C_Team::Get_Score( void ) |
|
{ |
|
return m_iScore; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
int C_Team::Get_Deaths( void ) |
|
{ |
|
return m_iDeaths; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
int C_Team::Get_Ping( void ) |
|
{ |
|
return m_iPing; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Return the number of players in this team |
|
//----------------------------------------------------------------------------- |
|
int C_Team::Get_Number_Players( void ) |
|
{ |
|
return m_aPlayers.Count(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns true if the specified player is on this team |
|
//----------------------------------------------------------------------------- |
|
bool C_Team::ContainsPlayer( int iPlayerIndex ) |
|
{ |
|
for (int i = 0; i < m_aPlayers.Count(); i++ ) |
|
{ |
|
if ( m_aPlayers[i] == iPlayerIndex ) |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
|
|
void C_Team::ClientThink() |
|
{ |
|
} |
|
|
|
|
|
//================================================================================================= |
|
// GLOBAL CLIENT TEAM HANDLING |
|
//================================================================================================= |
|
// Purpose: Get the C_Team for the local player |
|
//----------------------------------------------------------------------------- |
|
C_Team *GetLocalTeam( void ) |
|
{ |
|
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); |
|
|
|
if ( !player ) |
|
return NULL; |
|
|
|
return GetPlayersTeam( player->index ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Get the C_Team for the specified team number |
|
//----------------------------------------------------------------------------- |
|
C_Team *GetGlobalTeam( int iTeamNumber ) |
|
{ |
|
for (int i = 0; i < g_Teams.Count(); i++ ) |
|
{ |
|
if ( g_Teams[i]->GetTeamNumber() == iTeamNumber ) |
|
return g_Teams[i]; |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns the number of teams you can access via GetGlobalTeam() (hence the +1) |
|
//----------------------------------------------------------------------------- |
|
int GetNumTeams() |
|
{ |
|
return g_Teams.Count() + 1; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Get the team of the specified player |
|
//----------------------------------------------------------------------------- |
|
C_Team *GetPlayersTeam( int iPlayerIndex ) |
|
{ |
|
for (int i = 0; i < g_Teams.Count(); i++ ) |
|
{ |
|
if ( g_Teams[i]->ContainsPlayer( iPlayerIndex ) ) |
|
return g_Teams[i]; |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Get the team of the specified player |
|
//----------------------------------------------------------------------------- |
|
C_Team *GetPlayersTeam( C_BasePlayer *pPlayer ) |
|
{ |
|
return GetPlayersTeam( pPlayer->entindex() ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Returns true if the two specified players are on the same team |
|
//----------------------------------------------------------------------------- |
|
bool ArePlayersOnSameTeam( int iPlayerIndex1, int iPlayerIndex2 ) |
|
{ |
|
for (int i = 0; i < g_Teams.Count(); i++ ) |
|
{ |
|
if ( g_Teams[i]->ContainsPlayer( iPlayerIndex1 ) && g_Teams[i]->ContainsPlayer( iPlayerIndex2 ) ) |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Get the number of team managers |
|
//----------------------------------------------------------------------------- |
|
int GetNumberOfTeams( void ) |
|
{ |
|
return g_Teams.Count(); |
|
} |