Files
mir_server/server/robot/RobotManager.cpp

198 lines
5.1 KiB
C++
Raw Normal View History

2025-01-09 17:45:40 +08:00
#include "stdafx.h"
//#include "SSManager.h"
CRobotManager::CRobotManager()
{
m_hasStart = false;
}
CRobotManager::~CRobotManager()
{
Shutdown();
}
bool CRobotManager::LoadConfig()
{
if (!m_VSPDefines.LoadDefinitions(_T("./data/VSPDef.txt")))
{
return false;
}
if (!m_LanguageText.LoadFromFile(_T("./data/language/LangCode.config")))
{
return false;
}
if (!m_configLoader.LoadAllConfig())
{
OutputMsg(rmError, _T("Load Config Failed"));
return false;
}
return true;
}
BOOL CRobotManager::Startup()
{
if (!LoadConfig())
return FALSE;
m_hasStart =true;
//配置的账户的数目
INT_PTR nCount =m_accounts.count();
//如果有账户限制的话就取限制的这些账户的数目比如可能配置了最大只能登陆100个账户
if(m_maxAccountCount >0)
{
nCount = m_maxAccountCount < nCount ? m_maxAccountCount : nCount;
}
INT_PTR nGroupCount = nCount / MAX_THREAD_CLIENT_COUNT; //有多少个组
if( nCount % MAX_THREAD_CLIENT_COUNT )
{
nGroupCount ++;
}
CRobotGroup groups;
//先初始化这些机器人组
OutputMsg(rmNormal, _T("Start GroupThread and Connect"));
int nAccountIndex =0;
for(INT_PTR i=0; i< nGroupCount; i++)
{
m_robotGroups.add(groups);
int nGroupMemberCount = MAX_THREAD_CLIENT_COUNT < nCount ? MAX_THREAD_CLIENT_COUNT : nCount;
OutputMsg(rmNormal, _T("Start Group: %d"), (int)i);
m_robotGroups[i].SetID((int)i);
if (!m_robotGroups[i].Start())
{
OutputMsg(rmError, _T("Start Group Thread Failed"));
return false;
}
if( false == m_robotGroups[i].Init(nAccountIndex,nAccountIndex + nGroupMemberCount -1) )
{
return FALSE;
}
nCount -= nGroupMemberCount; //剩余人数减少
nAccountIndex += nGroupMemberCount; //位置的索引增加
Sleep(m_groupLoginInterval*1000);
}
////启动这些机器人
//for(INT_PTR i=0; i< nGroupCount; i++)
//{
// if( m_robotGroups[i].Start() ==false)
// {
// return false;
// }
//}
/*
while(m_hasStart)
{
for(INT_PTR i=0; i< nGroupCount; i++)
{
m_robotGroups[i].SingleRun();
}
Sleep(10);
}
*/
return TRUE;
}
VOID CRobotManager::Shutdown()
{
if( !m_hasStart ) return ;
for( INT_PTR i=0; i < m_robotGroups.count(); i++)
{
m_robotGroups[i].Stop();
}
m_hasStart = false;
}
SERVERCONFIG* CRobotManager::GetServerPtr()
{
INT_PTR nCount = m_configs.count();
if(nCount <=0) return NULL;
if(nCount ==1) return &m_configs[0];
int nRand = rand() % nCount;
return &m_configs[nRand];
}
void CRobotManager::ShowServerAgentCount()
{
if( !m_hasStart ) return ;
int nTotal =0; //总数目
int nInSessionCount=0;//session服务器的数目
int nInDbCount=0; //db服务器
int nLogicCount=0; //逻辑服务器的数目
int nIdelCount =0; //空闲状态
int sessionStatus[CRobotClient::eStatusMax]; //session服务器各状态数目
int dbStatus[CRobotClient::eStatusMax]; //db服务器各状态数目
int logicStatus[CRobotClient::eStatusMax]; //db服务器各状态数目
memset(sessionStatus,0,sizeof(sessionStatus));
memset(dbStatus,0,sizeof(sessionStatus));
memset(logicStatus,0,sizeof(sessionStatus));
for( INT_PTR i=0; i < m_robotGroups.count(); i++)
{
int nClientCount= m_robotGroups[i].GetClientCount();
nTotal += nClientCount;
for(INT_PTR j=0; j< nClientCount;j ++)
{
CRobotClient * pClient = m_robotGroups[i].GetClient(j);
if(pClient ==NULL) continue;
int nCommStatus =pClient->GetCurrentStatus(); //通信状态
switch(pClient->GetCurrentServerType())
{
case CRobotClient::eServerSession:
sessionStatus[nCommStatus] ++;
nInSessionCount ++;
break;
case CRobotClient::eServerDbsever:
dbStatus[nCommStatus] ++;
nInDbCount ++;
break;
case CRobotClient::eServerLogic:
logicStatus[nCommStatus] ++;
nLogicCount ++;
break;
default:
nIdelCount ++;
break;
}
}
}
OutputMsg(rmNormal,_T("Total=%d,idle=%d,session=%d,db=%d,logic=%d"),nTotal,nIdelCount,nInSessionCount,nInDbCount,nLogicCount);
OutputMsg(rmNormal,_T("session,idle=%d,reqsalt=%d,commu=%d,reqDisConnect=%d,commuDisConnect=%d"),sessionStatus[CRobotClient::eStatusIdle],
sessionStatus[CRobotClient::eStatusEncryReq],sessionStatus[CRobotClient::eStatusCommunication],
sessionStatus[CRobotClient::eStatusEncryReqDisConnect],sessionStatus[CRobotClient::eStatusCommuDisConnect]);
OutputMsg(rmNormal,_T("dbserve,idle=%d,reqsalt=%d,commu=%d,reqDisConnect=%d,commuDisConnect=%d"),dbStatus[CRobotClient::eStatusIdle],
dbStatus[CRobotClient::eStatusEncryReq],dbStatus[CRobotClient::eStatusCommunication],
dbStatus[CRobotClient::eStatusEncryReqDisConnect],dbStatus[CRobotClient::eStatusCommuDisConnect]);
OutputMsg(rmNormal,_T("logicsr,idle=%d,reqsalt=%d,commu=%d,reqDisConnect=%d,commuDisConnect=%d"),logicStatus[CRobotClient::eStatusIdle],
logicStatus[CRobotClient::eStatusEncryReq],logicStatus[CRobotClient::eStatusCommunication],
logicStatus[CRobotClient::eStatusEncryReqDisConnect],logicStatus[CRobotClient::eStatusCommuDisConnect]);
}
MapScenePoint* CRobotManager::GetRandomSceneId()
{
Assert(m_mapPoints.count() > 0);
unsigned long nIdx = wrand((unsigned long)m_mapPoints.count());
return &m_mapPoints[nIdx];
}