From 39ed87570bdb2f86969d4be821c94b722dc71179 Mon Sep 17 00:00:00 2001 From: Joe Ludwig Date: Wed, 26 Jun 2013 15:22:04 -0700 Subject: First version of the SOurce SDK 2013 --- sp/src/game/client/c_team.cpp | 256 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 sp/src/game/client/c_team.cpp (limited to 'sp/src/game/client/c_team.cpp') diff --git a/sp/src/game/client/c_team.cpp b/sp/src/game/client/c_team.cpp new file mode 100644 index 00000000..94373b5f --- /dev/null +++ b/sp/src/game/client/c_team.cpp @@ -0,0 +1,256 @@ +//========= 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(); +} \ No newline at end of file -- cgit v1.2.3