Files
mir_server/server/robot/RobotManager.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

198 lines
5.1 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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];
}