#include "stdafx.h" #include #include #include #include #include //========================================================================================================= // MasterServer Include Files // #include "MasterServerEx.h" #include "Sessions/ServerSessionEx.h" #include "Sessions/ServerSessionManager.h" #include "PacketHandler/PacketHandler.h" #include "Function/ServerInfoManager.h" #include "Function/AbuseUserManager.h" #include // #include #include "MasterScriptParserManager.h" // //========================================================================================================= MasterServerEx::MasterServerEx() { SetPhaseStatus(PHASE_UNKNOWN); is_service_mode_ = FALSE; ConnectSessions.Init(); // (CHANGES)(20100311)(hukim) RestrictManager(), GetMasterServerInfo() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ // Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //RestrictManager().Clear(); //GetMasterServerInfo().Init( this ); restrict_manager_.Clear(); master_server_info_.Init(this); auth_process_work_load_key_ = 0; master_script_parser_manager_ = NULL; } MasterServerEx::~MasterServerEx() { // ServerFrame¿¡¼­ ¾Ë¾Æ¼­ ¿¬°áµÈ SessionµéÀ» Á¦°ÅÇÒ °ÍÀÌ´Ù... ±×·±°¡? SetPhaseStatus(PHASE_UNKNOWN); is_service_mode_ = FALSE; ConnectSessions.Init(); // (CHANGES)(20100311)(hukim) RestrictManager() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ // ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //RestrictManager().Clear(); restrict_manager_.Clear(); auth_process_work_load_key_ = 0; } BOOL MasterServerEx::Init() { nsPacket::Environment::Init(); InitializeLogger(); MessageOut(eCRITICAL_LOG, _T("*** Master·þÎñ¿ªÆô *** ")); MessageOut(eCRITICAL_LOG, _T("*** Master·þÎñ°æ±¾ºÅ = %d ***"), SERVER_RELEASE_BUILD_NO); // (¼­ºñ½º/ÄܼÖ)¸ðµå Á¦¾î È®ÀÎÇÒ °Í. __READ_CONFIG_NUMBER(is_service_mode_, _T("COMMON"), _T("SERVICE_MODE"), 0, MASTER_SERVER_INFO_FILE_NAME); WorkLoadManager::CreateInstance(); PacketHandler::RegisterHandler(); ServerInfoManager::CreateInstance(); ServerSessionManager::CreateInstance(); InitializeDataLoad(); ReloadFromFile_RestrictFunction(); // Åë°è ¼öÁý ´ë±â ½Ã°£ ÀúÀå(±âº»°ªÀº 10ÃÊ) ReloadFromFile_StatisticsInterval(); ReloadFromFile_LogicViolationControl(); AbuseUserManager::Instance()->Init(); #ifdef _JP_0_20101123_PMS SERVER_KEY key = GetKey(); key.Set(0,0,GetServerType(),0); SetKey(key); #endif return TRUE; } VOID MasterServerEx::Release() { WorkLoadManager::DestroyInstance(); AbuseUserManager::Instance()->Release(); AbuseUserManager::DestroyInstance(); PacketHandler::ReleaseHandler(); if (master_script_parser_manager_ != NULL) { master_script_parser_manager_->Release(); master_script_parser_manager_->DestroyInstanceEx(); SAFE_DELETE( master_script_parser_manager_); } MessageOut(eCRITICAL_LOG, _T("*** MasterServer Close *** ")); SAFE_DELETE(g_pSunLog); } VOID MasterServerEx::Finalize() { ServerSessionManager::DestroyInstance(); ServerInfoManager::DestroyInstance(); } BOOL MasterServerEx::Update( DWORD /*tick*/ ) { // <2> Server Session °ü¸® WorkLoadManager::Update(); AbuseUserManager::Instance()->Update(); // SunLog Update À§Ä¡³ª Á¾·á½ÃÁ¡ÀÇ ·Î±× ¾²±â µîÀ» °í·ÁÇØ¼­ Àç¼³Á¤ÇÒ °Í. g_pSunLog->Update(); g_pSecureCollectLog->Update(); // (CHANGES)(20100311)(hukim) GetMasterServerInfo() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ // ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //MasterServerInfo& master_server_info = GetMasterServerInfo(); //master_server_info.Update(); master_server_info_.Update(); return TRUE; } VOID MasterServerEx::StartListen() { #ifdef __WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ do { PROCESS_SERVER_AUTHENTICATION* server_auth_work = new PROCESS_SERVER_AUTHENTICATION(); const WORK_KEY server_auth_work_key = WorkLoadManager::RegisterTask(server_auth_work); if (server_auth_work_key == WorkLoadManager::c_NotExistKey) { MessageOut(eCRITICAL_LOG, _T("Can't Register Server Authentication Routine")); return; } auth_process_work_load_key_ = server_auth_work_key; } while(0); #endif //__WAVERIX_SERVER_AUTHENTICATION_BY_SOLARAUTH__ // DB Proxy¿¡ ¿¬°áµÈ ÈÄ¿¡ Listen ½ÃÀÛ? Listen(SERVER_IOHANDLER); // // Account DB pxory ¼¼¼ÇÀº DB Á¤º¸¸¦ ¹ÞÀº Áö±Ý ½ÃÁ¡¿¡ ¼­¹ö ¼¼¼Ç ¸Å´ÏÁ®¿¡ Ãß°¡ // SERVER_KEY serverKey = ServerInfoManager::Instance()->GetServerKey( ACCOUNT_DBPROXY, (char*)m_pAccountDBProxySession->GetConnectIP().c_str() ); // if( !ServerSessionManager::Instance()->FindServer( serverKey ) ) // { // // ¼­¹ö Á¤º¸¸¦ ¾÷µ¥ÀÌÆ® ÇÏ´Â °æ¿ì ¶Ç Ãß°¡ÇÏÁö ¾Ê°Ô²û ¼­¹öŰ·Î ã¾Æº» ÈÄ¿¡ Ãß°¡ // m_pAccountDBProxySession->SetServerKey( serverKey ); // ServerSessionManager::Instance()->AddServer( m_pAccountDBProxySession ); // } // // // Op Server ¼¼¼ÇÀº DB Á¤º¸¸¦ ¹ÞÀº Áö±Ý ½ÃÁ¡¿¡ ¼­¹ö ¼¼¼Ç ¸Å´ÏÁ®¿¡ Ãß°¡ // SERVER_KEY opServerKey = ServerInfoManager::Instance()->GetServerKey( OP_SERVER, (char*)m_pOpServerSession->GetConnectIP().c_str() ); // if( !ServerSessionManager::Instance()->FindServer( opServerKey ) ) // { // // Op Server°¡ ¿¬°áÀÌ µÇ¾îÀÖ´Â °æ¿ì Ãß°¡! // if( m_pOpServerSession->IsConnected() ) // { // m_pOpServerSession->SetServerKey( opServerKey ); // ServerSessionManager::Instance()->AddServer( m_pOpServerSession ); // } // } // //#ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ // // Solar Auth Server ¼¼¼ÇÀº DB Á¤º¸¸¦ ¹ÞÀº Áö±Ý ½ÃÁ¡¿¡ ¼­¹ö ¼¼¼Ç ¸Å´ÏÁ®¿¡ Ãß°¡ // SERVER_KEY solarAuthServerKey = ServerInfoManager::Instance()->GetServerKey( SOLARAUTH_SERVER, (char*)m_pSolarAuthServerSession->GetConnectIP().c_str() ); // if( !ServerSessionManager::Instance()->FindServer( solarAuthServerKey ) ) // { // // ¼­¹ö Á¤º¸¸¦ ¾÷µ¥ÀÌÆ® ÇÏ´Â °æ¿ì ¶Ç Ãß°¡ÇÏÁö ¾Ê°Ô²û ¼­¹öŰ·Î ã¾Æº» ÈÄ¿¡ Ãß°¡ // m_pSolarAuthServerSession->SetServerKey( solarAuthServerKey ); // ServerSessionManager::Instance()->AddServer( m_pSolarAuthServerSession ); // } //#endif } ServerSession* MasterServerEx::AllocServerSession(eSERVER_TYPE server_type) { ServerSessionEx* server_session = static_cast(MasterServerEx::Handler_AllocServerSession_NoInit(server_type)); if (server_session != NULL) { (static_cast(server_session))->Init(this); } return static_cast(server_session); } VOID MasterServerEx::FreeServerSession(ServerSession* server_session) { // SolarAuth¿Í ´Þ¶óÁø °ÍÀº ¿©±â¼­´Â Release¸¦ È£ÃâÇÑ´Ù´Â °ÍÀÓ. ¹®Á¦ ¾ø´ÂÁö È®ÀÎÇØ º¼ °Í. MasterServerEx::Handler_FreeServerSession(server_session); } #include "PacketHandler\Handler_MO.h" BOOL MasterServerEx::KeyEvent(CHAR pressed_key) { switch(pressed_key) { case 'A': { AbuseUserManager::Instance()->DisplayAbuseInfo(); } break; case 'U': { AccountDBProxySession* adbp_server = ConnectSessions.SessionAccountDB(); if ((adbp_server != NULL) && adbp_server->IsConnected()) { MSG_MX_CONNECTION_REQ_SERVER_INFO_SYN msg; msg.m_byCategory = MX_CONNECTION; msg.m_byProtocol = MX_CONNECTION_REQ_SERVER_INFO_SYN; adbp_server->Send(reinterpret_cast(&msg), sizeof(MSG_MX_CONNECTION_REQ_SERVER_INFO_SYN)); MessageOut(eCRITICAL_LOG, _T("ÇëÇó·þÎñÆ÷ÐÅÏ¢...")); } else { MessageOut(eCRITICAL_LOG, _T("δÁ¬½ÓÕÊ»§Êý¾Ý¿â´úÀí·þÎñÆ÷.")); } } break; case 'S': break; case 'R': { ReloadFromFile_RestrictFunction(); if (!IsRestrictFuncFromFile()) { // (CHANGES)(20100311)(hukim) GetMasterServerInfo() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ // ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //GetMasterServerInfo().SendMX_FUNCRESTRICT_RELOAD_REQ(this); master_server_info_.SendMX_FUNCRESTRICT_RELOAD_REQ(this); } ReloadFromFile_LogicViolationControl(); } break; case 'X': { #ifdef _DEBUG BYTE world_id = 0; BYTE channel_id = 0xFF; BYTE server_type = 0; BYTE server_id = 0; SERVER_KEY server_exit_key(world_id, channel_id, server_type, server_id); EXIT_SERVER_MAP* agent_server_list = NULL; EXIT_SERVER_MAP* dbp_server_list = NULL; EXIT_SERVER_MAP* server_list = NULL; // (CHANGES)(20100311)(hukim) GetMasterServerInfo() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ // ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //MasterServerInfo& master_server_info = this->GetMasterServerInfo(); //BOOL is_success = master_server_info.MakeServerExitList(server_exit_key, // agent_server_list, // dbp_server_list, // server_list); BOOL is_success = master_server_info_.MakeServerExitList(server_exit_key, agent_server_list, dbp_server_list, server_list); if (is_success) { is_success = master_server_info_.RegisterServerExitProcess(agent_server_list, dbp_server_list, server_list); if (is_success) { //¼­¹ö Á¾·á´Â ¼øÂ÷ÀûÀ¸·Î(Çʵå/¹èƲ/¿¡ÀÌÀüÆ®->DBÇÁ¶ô½Ã) ÀÌ·ç¾îÁ®¾ß ÇϹǷÎ, ¼­¹ö Á¾·á ¸ðµå·Î µé¾î°¡¼­ ó¸®ÇØ¾ß ÇÑ´Ù MessageOut( eCRITICAL_LOG, _T("Á¤»ó Á¾·á ÇÁ·ÎÅäÄÝ ¼ö½Å[W:%u/C:%u/T:%u/I:%u] - ¼­¹ö±º Á¾·á ÇÁ·Î¼¼½º¿¡ ¸ÂÃç Á¾·á ¸í·ÉÀ» ³»¸®°í ÀÖ½À´Ï´Ù."), server_exit_key.GetWorldID(), server_exit_key.GetChannelID(), server_exit_key.GetServerType(), server_exit_key.GetServerID()); return TRUE; } } #else DISPMSG(_T("´Ë¹¦ÄÜÔÚµ÷ÊÔģʽÏÂÆôÓÃ\n")); #endif } break; //__NA001254_20090109_RTTG_FUNC_ADD case 'T': { Handler_MO::SendTest(); } } return TRUE; } //============================================================================================================ // Logger Initializer // BOOL MasterServerEx::InitializeLogger() { // (CHANGES)(20100311)(hukim) sun_log_file_path °æ·Î ±æÀ̰¡ ³Ê¹« ª¾Æ ¹öÆÛ ¿À¹ö Ç÷ο찡 ÀϾ // °¡´É¼ºÀÌ ¸¹±â ¶§¹®¿¡ ¹öÆÛ Å©±â ¼öÁ¤ BYTE sun_log_option = 0; BYTE sun_log_file_level = 0; CHAR sun_log_file_path[MAX_PATH]; __READ_CONFIG_NUMBER(sun_log_option, _T("LOGFILE"), _T("SUN_LOGFILE_OPTION"), 0, MASTER_SERVER_INFO_FILE_NAME); __READ_CONFIG_NUMBER(sun_log_file_level, _T("LOGFILE"), _T("SUN_LOGFILE_LEVEL"), 0, MASTER_SERVER_INFO_FILE_NAME); __READ_CONFIG_STRING(sun_log_file_path, _T("LOGFILE"), _T("SUN_LOGFILE_PATH"), NULL, MASTER_SERVER_INFO_FILE_NAME); DISPMSG("SUNLOG.Master ³õʼ»¯...\t"); g_pSunLog = new CSunLog; BOOL is_success = g_pSunLog->Init(sun_log_option, sun_log_file_level, sun_log_file_path, _T("Master")); if (is_success) { DISP_OK; } else { DISP_FAIL; } DISPMSG("SUNLOG.Secure ³õʼ»¯...\t"); g_pSecureCollectLog = new CSunLog; is_success = g_pSecureCollectLog->Init(sun_log_option, sun_log_file_level, sun_log_file_path, _T("Secure")); if (is_success) { DISP_OK; } else { DISP_FAIL; } return is_success; } VOID MasterServerEx::InitializeDataLoad() { master_script_parser_manager_ = new MasterScriptParserManager; master_script_parser_manager_->InitParserPool(NULL); master_script_parser_manager_->RegisterParser(); #ifndef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ master_script_parser_manager_->Load(); #endif } VOID MasterServerEx::StartDataService() { MessageOut(eCRITICAL_LOG, _T("Êý¾Ý¼ÓÔØÍê±Ï!\n")); #ifdef __WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ MasterServerEx::GetMainFrame()->GetParserManager()->Load(); // ¿¬°áµÈ ¸ðµç ¼­¹öµé¿¡°Ô PHASE_SHIFT_CMD :: PHASE_EXCHANGE ¸í·ÉÀ» º¸³½´Ù. // ¿¬°áµÈ ¼­¹öµéÀº µ¥ÀÌÅÍ ¿äûÇÒ °ÍÀÌ´Ù. // ÀÌÀü ÄÚµå <060802> ServerSessionManager::SEND_PHASE_SHIFT_CMD_BROADCAST( PHASE_EXCHANGE, PHASE_SERVICE ); // À§¿Í °°ÀÌ Çϸé, PHASE_SERVICE »óÅ¿¡ ÀÖ´Â °æ¿ì¶óµµ ÀϽÃÀûÀ¸·Î PHASE_EXCHANGE·Î // ÀüȯµÇ¾î µ¥ÀÌÅÍ ±³È¯À» ÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸, ¸ðµÎ ÀÐÀº °æ¿ì¶óµµ ÁöÁ¤µÈ Control Flag¸¸À» // ÀоîµéÀÌ°í ´Ù½Ã SERVICE ·Î ÀüȯµÇ°Ô ÇÏÀÚ. // ¸¶½ºÅͰ¡ µ¥ÀÌÅ͸¦ ÀоîµéÀ̱â Àü¿¡ ¿äûÇÒ °æ¿ì´Â ´ë±â »óŰ¡ µÉ ÅÙµ¥, ÀÌ °æ¿ìµµ Àû¿ë¹Þ°Ô // µÉ °ÍÀÌ´Ù. // ÀÌÈÄ º°µµ·Î Á¢¼ÓÇÏ´Â °æ¿ì¶ó¸é, °³º° PHASE_EXCHANGE ¸í·ÉÀ» ÅëÇØ µ¥ÀÌÅ͸¦ ¹Þ°Ô µÉ °ÍÀÌ´Ù. // ¿Ï·á ¸í·ÉÀÌ ¿Ã °æ¿ì, Field, Battle, DB µîµîÀº ¹Ù·Î PHASE_SERVICE ·Î ÀüȯÇÑ´Ù. // Agent, World µîÀÇ Front °è¿­ ¶Ç´Â ´Ù¸¥ ¼­¹öµé°úÀÇ ¿¬°üµµ°¡ ÀÖ´Â °æ¿ì // ´Ê°Ô PHASE_SERVICE·Î Àüȯ½ÃŲ´Ù. <- ¾î¶»°Ô ã¾Æ¾ß ÇÏ´Â Áö, °¨½ÃÇØ¾ß ÇÏ´ÂÁö¸¦ ÆÇ´ÜÇÒ °Í. #endif //__WAVERIX_SOLAR_AUTH_SERVER_IMPLEMENTATION__ } BOOL MasterServerEx::ReloadFromFile_RestrictFunction() { __READ_CONFIG_NUMBER(is_restrict_from_file_, _T("FUNCTIONALRESTRICT"), _T("GETRESTRICTINFO_FROMFILE"), 0, MASTER_SERVER_INFO_FILE_NAME); if (is_restrict_from_file_) { // (CHANGES)(20100311)(hukim) RestrictManager(), GetMasterServerInfo() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ // Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //sRESTRICT_MGR::MakePacket::Read_FUNCRESTRICT_FROM_FILE(&RestrictManager(), TRUE); //GetMasterServerInfo().SendGM_OPERATION_FUNCRESTRICT_CMD(this); sRESTRICT_MGR::MakePacket::Read_FUNCRESTRICT_FROM_FILE(&restrict_manager_, TRUE); master_server_info_.SendGM_OPERATION_FUNCRESTRICT_CMD(this); MessageOut(eCRITICAL_LOG, _T("Reload FuncRestrict from DB & Broadcast GameServers")); } return TRUE; } BOOL MasterServerEx::ReloadFromFile_StatisticsInterval() { __READ_CONFIG_NUMBER(statistics_interval_, _T("INTERVAL"), _T("STATISTICS"), 10000, MASTER_SERVER_INFO_FILE_NAME ); //GetMasterServerInfo().GetMoneyTimer()->SetTimer( statistics_interval_ ); // (CHANGES)(20100311)(hukim) GetMasterServerInfo() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ // ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //GetMasterServerInfo().StartTimerProcess(statistics_interval_); master_server_info_.StartTimerProcess(statistics_interval_); return TRUE; } BOOL MasterServerEx::ReloadFromFile_LogicViolationControl() { // (CHANGES)(20100311)(hukim) GetLogicViolationControl() ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇØ Á¢±ÙÀÚ¸¦ // ¸¸µé¾î »ç¿ëÇÑ´Ù. ºÒÇÊ¿äÇÑ ÇÔ¼ö È£ÃâÀ̹ǷΠÁ÷Á¢ Á¢±ÙÀ¸·Î ´ëü //LOGIC_VIOLATION_CONTOL_FLAGS& controller = GetLogicViolationControl(); //controller.ClearAll(); logic_violation_control_.ClearAll(); BOOL is_forced_disconnect_control; __READ_CONFIG_NUMBER(is_forced_disconnect_control, _T("LOGIC_VIOLATION_CONTROL"), _T("FORCED_DISCONNECT"), 0, MASTER_SERVER_INFO_FILE_NAME); MessageOut(eCRITICAL_LOG, _T("ÖØÔØÂß¼­³åÍ»¿ØÖÆl")); if (is_forced_disconnect_control) { logic_violation_control_.Set(eLOGIC_VIOLATION_FIELD_INFO::FORCED_DISCONNECT_CONTROL); } return TRUE; } //================================================================================================== //================================================================================================== //==================================================================================================