csgo-2018-source/matchmaking/game.cpp

170 lines
3.2 KiB
C++
Raw Normal View History

2021-07-25 12:11:47 +08:00
//===== Copyright <20> 1996-2009, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
//===========================================================================//
#include "game.h"
#include "gamemanager.h"
#include "matchsystem.h"
#include "playermanager.h"
#include "matchmaking.h"
// NOTE: This has to be the last file included!
#include "tier0/memdbgon.h"
CMatchGame::CMatchGame()
{
}
CMatchGame::~CMatchGame()
{
}
void CMatchGame::Reset()
{
RemoveAllPlayers();
}
XNKID CMatchGame::GetXNKID()
{
return (XNKID) g_pMatchmaking->GetSessionXNKID();
}
int CMatchGame::GetNumPlayers()
{
return m_PlayerList.Count();
}
IPlayer * CMatchGame::GetPlayer( int index )
{
if ( m_PlayerList.IsValidIndex( index ) )
return m_PlayerList[index];
else
return NULL;
}
void CMatchGame::AddPlayer( XUID xuid, int pExperience[ MATCH_MAX_DIFFICULTIES ] /*= NULL*/, int pSkills[ MATCH_MAX_DIFFICULTIES ][ MATCH_MAX_SKILL_FIELDS ] /*= NULL*/ )
{
if ( MM_IsDebug() )
{
Msg( "[L4DMM] CMatchGame::AddPlayer( %llx )\n", xuid );
}
IPlayer * player = g_pPlayerManager->FindPlayer( xuid );
if ( !player )
{
Warning( "[L4DMM] CMatchGame::AddPlayer - Cannot find player by %llx!\n", xuid );
return;
}
// Find a player first
for ( int k = 0; k < m_PlayerList.Count(); ++ k )
{
if( m_PlayerList[k]->GetXUID() == xuid )
{
Warning( "[L4DMM] CMatchGame::AddPlayer - player %llx already added!\n", xuid );
return;
}
}
m_PlayerList.AddToTail( player );
}
void CMatchGame::RemovePlayer( XUID xuid )
{
if ( MM_IsDebug() )
{
Msg( "[L4DMM] CMatchGame::RemovePlayer( %llx )\n", xuid );
}
int numRemoved = 0;
for ( int k = 0; k < m_PlayerList.Count(); ++ k )
{
if( m_PlayerList[k]->GetXUID() == xuid )
{
m_PlayerList.Remove( k );
++ numRemoved;
}
}
if ( !numRemoved )
{
Warning( "[L4DMM] CMatchGame::RemovePlayer - Cannot find player by %llx!\n", xuid );
}
}
void CMatchGame::RemoveAllPlayers( )
{
if ( MM_IsDebug() )
{
Msg( "[L4DMM] CMatchGame::RemoveAllPlayers\n" );
}
m_PlayerList.RemoveAll();
}
int CMatchGame::GetAggregateExperience( )
{
int difficulty = 1; // CMatchSystem::GetMatchSystem()->GetManager()->GameGetDifficulty();
double exp = 0;
int numExp = 0;
int numPlayers = m_PlayerList.Count();
for( int index = 0; index < numPlayers; ++index )
{
IPlayer * player = GetPlayer( index );
if( player )
{
// TODO: exp += player->GetExperience( difficulty );
++ numExp;
}
}
if( numExp )
exp /= numExp;
if ( MM_IsDebug() >= 2 )
{
Msg( "[L4DMM] Game aggregate experience on difficulty%d = %f out of %d exp players.\n", difficulty, exp, numExp );
}
return exp;
}
int CMatchGame::GetAggregateSkill( int iSkillType )
{
int difficulty = 1; // CMatchSystem::GetMatchSystem()->GetManager()->GameGetDifficulty();
double skill = 0;
int numSkills = 0;
int numPlayers = m_PlayerList.Count();
for( int index = 0; index < numPlayers; ++index )
{
IPlayer * player = GetPlayer( index );
if( player )
{
// TODO: skill += player->GetSkill( iSkillType, difficulty );
++ numSkills;
}
}
if( numSkills )
skill /= numSkills;
if ( MM_IsDebug() >= 2 )
{
Msg( "[L4DMM] Game aggregate skill%d on difficulty%d = %f out of %d skill players.\n", iSkillType, difficulty, skill, numSkills );
}
return skill;
}