Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.6 KiB

5 years ago
//========= Copyright 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.Size() != 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.Size();
}
//-----------------------------------------------------------------------------
// Purpose: Returns true if the specified player is on this team
//-----------------------------------------------------------------------------
bool C_Team::ContainsPlayer( int iPlayerIndex )
{
for (int i = 0; i < m_aPlayers.Size(); 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.Size();
}