#include "stdafx.h" #include #include "MasterServerInfo.h" #include #include #include #include #include // WorkLoad #include #include BOOL MasterServerInfo::SendMX_FUNCRESTRICT_RELOAD_REQ( MasterServerEx* pMasterServer ) { MasterServerEx::sConnectSession& rSessions = pMasterServer->ConnectSessions; AccountDBProxySession* pSession = rSessions.SessionAccountDB(); if( pSession && pSession->IsConnected() ) { pMasterServer->RestrictManager().Clear(); MSG_MX_FUNCRESTRICT_RELOAD_REQ msgREQ; pSession->SendPacket( &msgREQ, sizeof(msgREQ) ); return TRUE; } return TRUE; } BOOL MasterServerInfo::SendGM_OPERATION_FUNCRESTRICT_CMD( MasterServerEx* pMasterServer ) { // ±ÝÁö ±â´Éµé Á¤º¸ ³¯·ÁÁØ´Ù #ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ MSG_GM_OPERATION_FUNCRESTRICT_CMD* pMsgCMD = new ( PACKET_CONTROL_SM::GetBasePacketPtr4Send() ) MSG_GM_OPERATION_FUNCRESTRICT_CMD(); #else //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ MSG_GM_OPERATION_FUNCRESTRICT_CMD pMsgCMD[1]; #endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ sRESTRICT_MGR::MakePacket::Make_GM_OPERATION_FUNCRESTRICT_CMD( &pMasterServer->RestrictManager(), pMsgCMD ); ServerSessionManager::SendToGameServers( pMsgCMD, pMsgCMD->GetSize() ); return TRUE; } BOOL MasterServerInfo::SendGM_OPERATION_STATISTICS_REQ( MasterServerEx* pMasterServer ) { sPTR_SERVER_NODE_ARRAY ptrARRAY; ServerSessionManager::GetGameServerList( &ptrARRAY ); DWORD dwCount = ptrARRAY.m_dwCount; if( !dwCount ) return FALSE; MSG_GM_OPERATION_STATISTICS_REQ msgREQ; sSERVER_NODE** ppNODE = ptrARRAY.m_pPTRs; for( DWORD i=0 ; im_pServerSession; pGameServer->SendPacket( &msgREQ, sizeof(msgREQ) ); } return TRUE; } BOOL MasterServerInfo::MakeServerExitList( SERVER_KEY IN skExitKey, EXIT_SERVER_MAP*& OUT pRefAgentServerList, EXIT_SERVER_MAP*& OUT pRefDBPServerList, EXIT_SERVER_MAP*& OUT pRefServerList ) { //=========================================================================================== // OpServer·Î ºÎÅÍ ¿À´Â ¸Þ½ÃÁö ÄÚµå Á¤ÀÇ // // WorldID | ChannID | ServerT | SvrIDX // 0 | x | x | x = Àüü World¸¦ ´ë»óÀ¸·Î ÇÑ´Ù. // x | 0xFF | x | x = ÇØ´ç WorldÀÇ Àüü ä³Î, Áï ÇØ´ç ¿ùµå Àüü ´ë»ó // 0 | 0 | x | x = Àüü WorldÀÇ 0¹ø ä³ÎÀ» ´ë»óÀ¸·Î // 0 | 1 | 0 | x = Àüü WorldÀÇ 1¹ø ä³Î¿¡ ÀÖ´Â ¼­¹ö Àüü // //=========================================================================================== const DWORD c_ALL = (DWORD)-1; const DWORD c_AGENT = (DWORD)(1<GetServerArrayList( dwUpperBound ); sSERVER_NODE* pNODE = pNODEs; for( DWORD i=0 ; im_ServerType); if( !(dwServerTID & dwServerTID_T) ) continue; if( !pNODE->m_pServerSession ) continue; SERVER_KEY& rKey = pNODE->m_ServerKey; DWORD dwWorldID_T = (DWORD)(1<insert( pList->end(), EXIT_SERVER_PAIR(pNODE->m_pServerSession, FALSE) ); } // for // register IWorkNode for Exit Server Process pRefAgentServerList = pAgentList; pRefDBPServerList = pDBPList; pRefServerList = pServerList; return TRUE; } BOOL MasterServerInfo::RegisterServerExitProcess( EXIT_SERVER_MAP*& OUT pAgentServerList, EXIT_SERVER_MAP*& OUT pDBPServerList, EXIT_SERVER_MAP*& OUT pServerList ) { PROCESS_EXIT_PROCESS* pWorkNode = new PROCESS_EXIT_PROCESS(); pWorkNode->SetInformation( pAgentServerList, pDBPServerList, pServerList ); WORK_KEY wkWorkKey = WorkLoadManager::RegisterTask( pWorkNode ); if( WorkLoadManager::c_NotExistKey != wkWorkKey ) { GetWorkLoadContainer().RegisterWork( wkWorkKey, (DWORD)(__int64)pWorkNode ); m_wkExitProcess = wkWorkKey; return TRUE; } return FALSE; } VOID MasterServerInfo::StartTimerProcess( DWORD dwInterval ) { if( dwInterval == 0 ) m_dwMoneyTimerInterval = 10000; else m_dwMoneyTimerInterval = dwInterval; m_dwMoneyTimer = GetTickCount() + m_dwMoneyTimerInterval; //m_pMoneyTimer = new util::SimpleTimer(); //m_pMoneyTimer->SetTimer( m_pMasterServer->StatisticsInterval() ); // ¿ä³ðÀº Á»´õ Á¤¸®µÇ¸é »ç¿ëÇÏÀÚ. PROCESS_TIMER_PROCESS* pWorkNode = new PROCESS_TIMER_PROCESS(); WORK_KEY wkWorkKey = WorkLoadManager::RegisterTask( pWorkNode ); if( WorkLoadManager::c_NotExistKey != wkWorkKey ) { GetWorkLoadContainer().RegisterWork( wkWorkKey, (DWORD)(__int64)pWorkNode ); //m_wkTimerProcess = wkWorkKey; } } VOID MasterServerInfo::Update() { DWORD dwCurTick = GetTickCount(); if( !(m_dwMoneyTimer > dwCurTick) ) { m_dwMoneyTimer = dwCurTick + m_dwMoneyTimerInterval; SendGM_OPERATION_STATISTICS_REQ( m_pMasterServer ); } // if( m_pMoneyTimer->IsExpired() ) // { //MessageOut( eMIDDLE_LOG, _T("Timer SendGM_OPERATION_STATISTICS_REQ\n") ); // SendGM_OPERATION_STATISTICS_REQ( m_pMasterServer ); // } }