From cfe180284b19448b35e0fd14d64edeff9fe9949b Mon Sep 17 00:00:00 2001 From: Cussrro Date: Thu, 19 Dec 2024 11:10:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E8=B5=84=E6=BA=90=E8=B7=AF?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/DNDBServer/DNDBServer.cpp | 34 ++++++------ Server/DNGameServer/DnMainFrame.cpp | 12 +++-- Server/DNLoginServer/DNLoginServer.cpp | 54 ++++++++++--------- Server/DNMasterServer/DNMasterServer.cpp | 60 +++++++++++---------- Server/DNVillageServer/DNVillageServer.cpp | Bin 83512 -> 40869 bytes 5 files changed, 88 insertions(+), 72 deletions(-) diff --git a/Server/DNDBServer/DNDBServer.cpp b/Server/DNDBServer/DNDBServer.cpp index 418e66f8..5a38ed7d 100644 --- a/Server/DNDBServer/DNDBServer.cpp +++ b/Server/DNDBServer/DNDBServer.cpp @@ -102,7 +102,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) g_Config.nCombineWorldDBID = nCombineWorldID; if( g_Config.nCombineWorldDBID <= 0 ) - g_Log.Log(LogType::_FILELOG, L" DBID Ǿ Ȯּ. ̿ ϴ.\r\n"); + g_Log.Log(LogType::_FILELOG, L"월드통합 관련 DBID가 설정되었는지 확인해주세요. 설정하지 않으면 제대로 이용할 수가 없습니다.\r\n"); else g_Log.Log(LogType::_FILELOG, L"CombineWorld = %d\r\n", g_Config.nCombineWorldDBID); #endif @@ -130,7 +130,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) #if defined( PRE_WORLDCOMBINE_PARTY ) g_IniFile.GetValue(L"DB_DNWorld", L"CombineWorldDB", &g_Config.nCombineWorldDBID); if( g_Config.nCombineWorldDBID <= 0 ) - g_Log.Log(LogType::_FILELOG, L" DBID Ǿ Ȯּ. ̿ ϴ.\r\n"); + g_Log.Log(LogType::_FILELOG, L"월드통합 관련 DBID가 설정되었는지 확인해주세요. 설정하지 않으면 제대로 이용할 수가 없습니다.\r\n"); #endif // #if defined( PRE_WORLDCOMBINE_PARTY ) WCHAR wszLogStr[128] = {0,}; @@ -170,7 +170,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) g_IniFile.GetValue(L"DB_DNWorld", wszData, g_Config.WorldDB[i].wszDBName); } - // ResourcePath ش. + // ResourcePath 등록해준다. WCHAR wszPath[_MAX_PATH] = { 0, }; char szPath[_MAX_PATH] = { 0, }; @@ -193,10 +193,10 @@ bool LoadConfig(int argc, TCHAR * argv[]) } } - //󸶴 Ʋ config д´. + //나라마다 틀리고 고정 값은 공통으로 config에서 읽는다. if (g_Config.nThreadMax > THREADMAX) g_Config.nThreadMax = THREADMAX; - // ̵ ڰ ڵ忡 . + // 미들웨어 쓰레드 인자값과 상관없이 코드에 박음. g_Config.nThreadMax = THREADMAX; #if defined(_KRAZ) @@ -242,7 +242,7 @@ bool InitApp(int argc, TCHAR * argv[]) #if defined(_DEBUG) && defined(_WORK) if ( CheckWorkingFolder(L"out") == false ) { - wprintf(L"۾ 丮 ּ!!!! setworking folder error " ); + wprintf(L"작업 디렉토리를 설정해주세요!!!! setworking folder error " ); } #endif @@ -289,12 +289,16 @@ bool InitApp(int argc, TCHAR * argv[]) g_Log.SetServerID(g_Config.nManagedID); - // ResourceMng + // ResourceMng 생성 CEtResourceMng::CreateInstance(); - // Path + // TODO(Cussrro): 固定资源路径 + std::string path = ".\\GameRes"; + g_Config.szResourcePath = path; + + // Path 설정 std::string szResource = g_Config.szResourcePath + "\\Resource"; - // + // 국가별 셋팅 std::string szNationStr; if( szNationStr.empty() && !g_Config.szResourceNation.empty() ) szNationStr = g_Config.szResourceNation; if( !szNationStr.empty() ) @@ -413,12 +417,12 @@ void ClearApp() int _tmain(int argc, TCHAR* argv[]) { #if defined( PRE_PARTY_DB ) - // PartyList ɰ µ Ŷ ִ Network 󿡼 ִ ִ ũⰡ Ѿ Ÿӽ ˻Ѵ. + // PartyList 를 쪼개서 보내는데 한 패킷의 최대사이즈가 Network 상에서 보낼수 있는 최대 크기가 넘어가는지 컴파일타임시 검사한다. BOOST_STATIC_ASSERT( (40*1024) >= sizeof(TAGetListParty) ); #endif // #if defined( PRE_PARTY_DB ) - // DB KeySetting ִ ̳ʸ ũⰡ 59Ʈ Ǿ Ƿ - // ũ⺸ Ŀ . + // DB에 KeySetting 저장할 수 있는 바이너리 크기가 59바이트로 고정되어 있으므로 + // 지정된 크기보다 커지면 컴파일 에러를 내버린다. #if defined(PRE_ADD_SKILLSLOT_EXTEND) BOOST_STATIC_ASSERT( 79 >= sizeof(TKeySetting) ); BOOST_STATIC_ASSERT( 201 >= sizeof(TPadSetting) ); @@ -439,8 +443,8 @@ int _tmain(int argc, TCHAR* argv[]) setlocale(LC_ALL, "Korean"); #endif - // ó غ - DWORD dwRetVal = CExceptionReport::GetInstancePtr()->Open(_T(".\\"), TRUE, TRUE); // Release C4744 ߻Ͽ Singleton , CExceptionReport::GetInstancePtr() inline ȭ ( : http://msdn.microsoft.com/ko-kr/library/a7za416f.aspx) + // 예외 처리자 준비 + DWORD dwRetVal = CExceptionReport::GetInstancePtr()->Open(_T(".\\"), TRUE, TRUE); // Release 모드 컴파일 시 C4744 경고가 발생하여 Singleton 구현 변경, CExceptionReport::GetInstancePtr() 을 inline 화 하지 않음 (참고 : http://msdn.microsoft.com/ko-kr/library/a7za416f.aspx) if (NOERROR != dwRetVal) { DWORD dwErrNo = ::GetLastError(); DN_RETURN(dwErrNo); @@ -452,7 +456,7 @@ int _tmain(int argc, TCHAR* argv[]) return 0; } - wprintf(L"exit ġ \r\n"); + wprintf(L"exit 명령을 치면 종료\r\n"); char szCmd[256] = {0}; while (1) diff --git a/Server/DNGameServer/DnMainFrame.cpp b/Server/DNGameServer/DnMainFrame.cpp index 6c0b00e8..3fe82984 100644 --- a/Server/DNGameServer/DnMainFrame.cpp +++ b/Server/DNGameServer/DnMainFrame.cpp @@ -40,11 +40,15 @@ void CDnMainFrame::InitializeLocalize() bool CDnMainFrame::PreInitialize() { - // Path + // TODO(Cussrro): 固定资源路径 + std::string path = ".\\GameRes"; + g_Config.szResourcePath = path; + + // Path 설정 std::string szResource = g_Config.szResourcePath + "\\Resource"; std::string szMapData = g_Config.szResourcePath + "\\MapData"; - // + // 국가별 셋팅 std::string szNationStr; if( szNationStr.empty() && !g_Config.szResourceNation.empty() ) szNationStr = g_Config.szResourceNation; if( !szNationStr.empty() ) { @@ -80,7 +84,7 @@ bool CDnMainFrame::PreInitialize() strNationFileName.clear(); strNationFileName = "uistring"; - if (i != 0) //0 Ʈ + if (i != 0) //0번은 디폴트 strNationFileName.append(MultiLanguage::NationString[i]); strNationFileName.append(".xml"); @@ -92,7 +96,7 @@ bool CDnMainFrame::PreInitialize() #ifdef PRE_ADD_UISTRING_DIVIDE strNationItemFileName = "uistring_item"; - if (i != 0) //0 Ʈ + if (i != 0) //0번은 디폴트 strNationItemFileName.append(MultiLanguage::NationString[i]); strNationItemFileName.append(".xml"); diff --git a/Server/DNLoginServer/DNLoginServer.cpp b/Server/DNLoginServer/DNLoginServer.cpp index ea098105..272cfb5a 100644 --- a/Server/DNLoginServer/DNLoginServer.cpp +++ b/Server/DNLoginServer/DNLoginServer.cpp @@ -148,7 +148,7 @@ void LoadUserSessionID() fclose(fp); - nSessionID += DEFAULTUSERSESSIONID; // Ȥ ȵǼ dzʶ Ƿ Ǽ N ! + nSessionID += DEFAULTUSERSESSIONID; // 혹시 저장 제대로 안되서 건너뛸 수 있으므로 꽁수로 N 더해줌! if (0x00FFFFFF <= nSessionID) nSessionID = DEFAULTUSERSESSIONID; g_IDGenerator.SetUserConnectionID(nSessionID); @@ -206,7 +206,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) WCHAR wszBuf[128] = { 0, }; //, wszStr[64] = { 0, }; char szData[128] = { 0, }, *pStr = NULL; - wstring wszFileName = L"./Config/DNLogin.ini"; // ѱ + wstring wszFileName = L"./Config/DNLogin.ini"; // 한국 if (!g_IniFile.Open(wszFileName.c_str())){ g_Log.Log(LogType::_FILELOG, L"%s File not Found!!\r\n", wszFileName.c_str()); @@ -351,7 +351,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) g_IniFile.GetValue(L"DB_DNWorld", wszData, g_Config.WorldDB[i].wszDBName); } - // ResourcePath ش. + // ResourcePath 등록해준다. WCHAR wszPath[_MAX_PATH] = { 0, }; char szPath[_MAX_PATH] = { 0, }; @@ -374,11 +374,11 @@ bool LoadConfig(int argc, TCHAR * argv[]) } } - //󸶴 Ʋ config д´. + //나라마다 틀리고 고정 값은 공통으로 config에서 읽는다. #if defined(_TW) USES_CONVERSION; - wstring wszGamaniaAuth = L"./Config/DNGamaniaAuth.ini"; // 븸 + wstring wszGamaniaAuth = L"./Config/DNGamaniaAuth.ini"; // 대만 if (!g_IniFile.Open(wszGamaniaAuth.c_str())){ g_Log.Log(LogType::_FILELOG, L"%s File not Found!!\r\n", wszGamaniaAuth.c_str()); @@ -545,10 +545,14 @@ bool InitApp(int argc, TCHAR * argv[]) } g_Log.SetServerID(g_Config.nManagedID); - // ResourceMng + // ResourceMng 생성 CEtResourceMng::CreateInstance(); - // Path + // TODO(Cussrro): 固定资源路径 + std::string path = ".\\GameRes"; + g_Config.szResourcePath = path; + + // Path 설정 std::string szResource = g_Config.szResourcePath + "\\Resource"; std::string szNationStr; if( szNationStr.empty() && !g_Config.szResourceNation.empty() ) szNationStr = g_Config.szResourceNation; @@ -579,7 +583,7 @@ bool InitApp(int argc, TCHAR * argv[]) strNationFileName.clear(); strNationFileName = "uistring"; - if (i != 0) //0 Ʈ + if (i != 0) //0번은 디폴트 strNationFileName.append(MultiLanguage::NationString[i]); strNationFileName.append(".xml"); @@ -599,7 +603,7 @@ bool InitApp(int argc, TCHAR * argv[]) strNationItemFileName.clear(); strNationItemFileName = "uistring_item"; - if (i != 0) //0 Ʈ + if (i != 0) //0번은 디폴트 strNationItemFileName.append(MultiLanguage::NationString[i]); strNationItemFileName.append(".xml"); @@ -685,7 +689,7 @@ bool InitApp(int argc, TCHAR * argv[]) if (!g_pUserConnectionManager) return false; #if defined(_GPK) - // Shanda + // Shanda 보안 g_Config.pDynCode = GPKCreateSvrDynCode(); if (!g_Config.pDynCode){ g_Log.Log(LogType::_FILELOG, L"SvrDynCode NULL!!!\r\n"); @@ -722,7 +726,7 @@ bool InitApp(int argc, TCHAR * argv[]) return false; } - if (g_Config.pDynCode->LoadAuthFile("AuthData.dat") == false) // CSAuthõ + if (g_Config.pDynCode->LoadAuthFile("AuthData.dat") == false) // CSAuth관련된 애 { g_Log.Log(LogType::_FILELOG, L"LoadAuthFile() Fail!!!\r\n"); return false; @@ -751,7 +755,7 @@ bool InitApp(int argc, TCHAR * argv[]) g_Log.Log(LogType::_FILELOG, L"Iocp Initialize Sucess(%d)\r\n", g_Config.nIocpMax); } - // α׿ 񽺸޴ ó ࿡ ϵ (ڿ ) + //변경 로그와 서비스메니저의 연결은 런처를 통한 실행에서만 동작하도록 하자(실행인자에 의한 실행) g_pLogConnection = new CDNLogConnection; if( !g_pLogConnection ) return false; g_pLogConnection->SetIp(g_Config.LogInfo.szIP); @@ -790,7 +794,7 @@ bool InitApp(int argc, TCHAR * argv[]) } #endif // #if defined(_KRAZ) - g_pAuthManager = new CDNAuthManager; // P.S.> _FINAL_BUILD ƴ ڰ MasterServer Acceptor , ʱȭǾ g_Config.nManagedID + g_pAuthManager = new CDNAuthManager; // P.S.> _FINAL_BUILD 가 아닌 경우 인증 관리자가 MasterServer Acceptor 보다 먼저 생성, 초기화되어야 g_Config.nManagedID 를 세팅할 수 있음 if (!g_pAuthManager) { g_Log.Log(LogType::_FILELOG, L"g_pAuthManager Create Fail\r\n"); return false; @@ -823,10 +827,10 @@ bool InitApp(int argc, TCHAR * argv[]) LoadUserSessionID(); // Client Accept - // QUERY_RESETAUTHSERVER AcceptѴ. + // QUERY_RESETAUTHSERVER 응답받으면 Accept한다. -#if defined(_KR) // Nexon - // +#if defined(_KR) // Nexon 인증 + // 인증 int nRet = AuthCheck_SetLocale(kLocaleID_KR); if (nRet == AUTHCHECK_ERROR_OK){ g_Log.Log(LogType::_FILELOG, L"Nexon AuthCheck OK!!\r\n"); @@ -849,8 +853,8 @@ bool InitApp(int argc, TCHAR * argv[]) if (!g_pActozShield->Init()) return false; -#elif defined(_US) // Nexon - // +#elif defined(_US) // Nexon 인증 + // 인증 NMLOCALEID Locale = (NMLOCALEID)g_Config.nLocaleID; int nRet = AuthCheck_SetLocale(Locale); if (nRet == AUTHCHECK_ERROR_OK){ @@ -862,15 +866,15 @@ bool InitApp(int argc, TCHAR * argv[]) } #if defined(_FINAL_BUILD) - // PI + // PI인증 g_pNexonPI = new CDNNexonPI; if (!g_pNexonPI) return false; #endif // #if defined(_FINAL_BUILD) #elif defined(_JP) && defined(_FINAL_BUILD) - // - int nRet = HanAuthInit("J_DNEST"); // ߿ Ÿ ٲ + // 인증 + int nRet = HanAuthInit("J_DNEST"); // 나중에 서비스 타입 바꿔야함 if (nRet == HAN_AUTHSVR_OK){ g_Log.Log(LogType::_FILELOG, L"HanAuthInit OK!!\r\n"); } @@ -984,7 +988,7 @@ void ClearApp() DWORD dwRetVal = NOERROR; HShieldSvrWrapper::AhnHS_CloseServerHandle(g_Config.hHSServer, &dwRetVal); if (NOERROR != dwRetVal) { - // ߻ + // 예외 발생 } g_Config.hHSServer = ANTICPX_INVALID_HANDLE_VALUE; @@ -1078,8 +1082,8 @@ int _tmain(int argc, TCHAR* argv[]) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif - // ó غ - DWORD dwRetVal = CExceptionReport::GetInstancePtr()->Open(_T(".\\"), TRUE, TRUE, MiniDumpWithFullMemory); // Release C4744 ߻Ͽ Singleton , CExceptionReport::GetInstancePtr() inline ȭ ( : http://msdn.microsoft.com/ko-kr/library/a7za416f.aspx) + // 예외 처리자 준비 + DWORD dwRetVal = CExceptionReport::GetInstancePtr()->Open(_T(".\\"), TRUE, TRUE, MiniDumpWithFullMemory); // Release 모드 컴파일 시 C4744 경고가 발생하여 Singleton 구현 변경, CExceptionReport::GetInstancePtr() 을 inline 화 하지 않음 (참고 : http://msdn.microsoft.com/ko-kr/library/a7za416f.aspx) if (NOERROR != dwRetVal) { DWORD dwErrNo = ::GetLastError(); DN_RETURN(dwErrNo); @@ -1095,7 +1099,7 @@ int _tmain(int argc, TCHAR* argv[]) g_Log.Log(LogType::_FILELOG, L"[Thread-Start] MainThread - PID ; %d, TID : %d\r\n", ::GetCurrentProcessId(), ::GetCurrentThreadId()); - wprintf(L"exit ġ \r\n"); + wprintf(L"exit 명령을 치면 종료\r\n"); //SetConsoleTitleA(FormatA("LoginServer Rev.%s", revDNLoginServer).c_str()); diff --git a/Server/DNMasterServer/DNMasterServer.cpp b/Server/DNMasterServer/DNMasterServer.cpp index e038db4c..0515d46d 100644 --- a/Server/DNMasterServer/DNMasterServer.cpp +++ b/Server/DNMasterServer/DNMasterServer.cpp @@ -73,7 +73,7 @@ void LoadPartyID() FILE * fp = NULL; if (_access(szFileName.c_str(), 0) == -1) { - // ٸ Ѵ. + //파일이 없다면 생성한다. fp = fopen(szFileName.c_str(), "a"); fclose(fp); } @@ -86,7 +86,7 @@ void LoadPartyID() fclose(fp); - nPartyIdx += 10000; //Ȥ ȵǼ dzʶ Ƿ Ǽ 10000 ! + nPartyIdx += 10000; //혹시 저장 제대로 안되서 건너뛸 수 있으므로 꽁수로 10000 더해줌! g_IDGenerator.SetPartyID(nPartyIdx); } @@ -109,7 +109,7 @@ void LoadVoiceChannelID() FILE * fp = NULL; if (_access(szFileName.c_str(), 0) == -1) { - // ٸ Ѵ. + //파일이 없다면 생성한다. fp = fopen(szFileName.c_str(), "a"); fclose(fp); } @@ -122,7 +122,7 @@ void LoadVoiceChannelID() fclose(fp); - nChannelID += 10000; //Ȥ ȵǼ dzʶ Ƿ Ǽ 10000 ! + nChannelID += 10000; //혹시 저장 제대로 안되서 건너뛸 수 있으므로 꽁수로 10000 더해줌! g_IDGenerator.SetVoiceChannelID(nChannelID); } @@ -311,7 +311,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) g_Log.Log(LogType::_FILELOG, L"LogInfo (Ip:%S, Port:%d)\r\n", g_Config.LogInfo.szIP, g_Config.LogInfo.nPort); - // ResourcePath ش. + // ResourcePath 등록해준다. WCHAR wszPath[_MAX_PATH] = { 0, }; char szPath[_MAX_PATH] = { 0, }; g_IniFile.GetValue( L"Resource", L"Path", wszPath ); @@ -338,9 +338,9 @@ bool LoadConfig(int argc, TCHAR * argv[]) g_IniFile.GetValue(L"Info", L"PCBangGrade", &g_nPCBangGrade); #endif // #if defined(_FINAL_BUILD) - //󸶴 Ʋ config д´. + //나라마다 틀리고 고정 값은 공통으로 config에서 읽는다. #if defined(_KR) && defined(_FINAL_BUILD) - wstring wszAuthFileName = L"./Config/DNNexonAuth.ini"; // ѱ + wstring wszAuthFileName = L"./Config/DNNexonAuth.ini"; // 한국 if (!g_IniFile.Open(wszAuthFileName.c_str())){ g_Log.Log(LogType::_FILELOG, L"%s File not Found!!\r\n", wszAuthFileName.c_str()); @@ -375,7 +375,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) #elif defined(_TW) && defined(_FINAL_BUILD) USES_CONVERSION; - wstring wszGamaniaAuth = L"./Config/DNGamaniaAuth.ini"; // 븸 + wstring wszGamaniaAuth = L"./Config/DNGamaniaAuth.ini"; // 대만 if (!g_IniFile.Open(wszGamaniaAuth.c_str())){ g_Log.Log(LogType::_FILELOG, L"%s File not Found!!\r\n", wszGamaniaAuth.c_str()); @@ -390,7 +390,7 @@ bool LoadConfig(int argc, TCHAR * argv[]) g_IniFile.GetValue(L"GamaniaAuth", L"Port2", &g_Config.AuthInfoTW.nPort); #elif defined(_TH) - wstring wszAsiaSoftPCCafe = L"./Config/DNAsiaSoftPCCafe.ini"; // ± + wstring wszAsiaSoftPCCafe = L"./Config/DNAsiaSoftPCCafe.ini"; // 태국 if (!g_IniFile.Open(wszAsiaSoftPCCafe.c_str())){ g_Log.Log(LogType::_FILELOG, L"%s File not Found!!\r\n", wszAsiaSoftPCCafe.c_str()); @@ -490,20 +490,24 @@ bool InitApp(int argc, TCHAR * argv[]) g_Log.Init(wszLogName, LOGTYPE_CRT_FILE_DAY); #endif - // ε ñ⶧ DivisionManager . 081208 + // 로딩 시기때문에 DivisionManager에서 빼냈음. 081208 if (!LoadConfig(argc, argv)){ g_Log.Log(LogType::_FILELOG, L"LoadConfig Failed\r\n"); return false; } g_Log.SetServerID(g_Config.nManagedID); - // ResourceMng + // ResourceMng 생성 CEtResourceMng::CreateInstance(); - // Path + // TODO(Cussrro): 固定资源路径 + std::string path = ".\\GameRes"; + g_Config.szResourcePath = path; + + // Path 설정 std::string szResource = g_Config.szResourcePath + "\\Resource"; std::string szMapData = g_Config.szResourcePath + "\\MapData"; - // + // 국가별 셋팅 std::string szNationStr; if( szNationStr.empty() && !g_Config.szResourceNation.empty() ) szNationStr = g_Config.szResourceNation; @@ -540,7 +544,7 @@ bool InitApp(int argc, TCHAR * argv[]) g_Log.Log(LogType::_FILELOG, L"Iocp Initialize Success(%d)\r\n", 100); } - // worldid, worldname DataManager ٽ ϰ ٲ + // worldid, worldname을 DataManager에서 다시 세팅하게 바꿈 g_pExtManager = new CDNExtManager; if (!g_pExtManager) { @@ -611,7 +615,7 @@ bool InitApp(int argc, TCHAR * argv[]) strNationFileName.clear(); strNationFileName = "uistring"; - if (i != 0) //0 Ʈ + if (i != 0) //0번은 디폴트 strNationFileName.append(MultiLanguage::NationString[i]); strNationFileName.append(".xml"); @@ -632,7 +636,7 @@ bool InitApp(int argc, TCHAR * argv[]) #ifdef PRE_ADD_UISTRING_DIVIDE strNationItemFileName = "uistring_item"; - if (i != 0) //0 Ʈ + if (i != 0) //0번은 디폴트 strNationItemFileName.append(MultiLanguage::NationString[i]); strNationItemFileName.append(".xml"); @@ -702,8 +706,8 @@ bool InitApp(int argc, TCHAR * argv[]) g_Log.Log(LogType::_FILELOG, L"GameAcceptPort (%d)\r\n", g_Config.nGameAcceptPort); } -#if defined(_KR) && defined(_FINAL_BUILD) // Nexon - // pc +#if defined(_KR) && defined(_FINAL_BUILD) // Nexon 인증 + // pc방 g_pNexonAuth = new CDNNexonAuth; if (!g_pNexonAuth) return false; @@ -714,8 +718,8 @@ bool InitApp(int argc, TCHAR * argv[]) if (!g_pActozShield->Init()) return false; -#elif defined(_US) && defined(_FINAL_BUILD) // Nexon - // PI +#elif defined(_US) && defined(_FINAL_BUILD) // Nexon 인증 + // PI인증 g_pNexonPI = new CDNNexonPI; if (!g_pNexonPI) return false; @@ -724,7 +728,7 @@ bool InitApp(int argc, TCHAR * argv[]) g_pShandaFCM = new CDNShandaFCM; if (!g_pShandaFCM) return false; - if (!g_pShandaFCM->InitService()){ // FCM ʱȭ۾ + if (!g_pShandaFCM->InitService()){ // FCM 초기화작업 g_Log.Log(LogType::_FILELOG, L"g_pShandaFCM->InitService() Fail!!\r\n"); } #elif defined (_JP) && defined(_FINAL_BUILD) && defined (WIN64) @@ -866,8 +870,8 @@ int _tmain(int argc, TCHAR* argv[]) setlocale(LC_ALL, "Korean"); #endif - // ó غ - DWORD dwRetVal = CExceptionReport::GetInstancePtr()->Open(_T(".\\"), TRUE, TRUE, MiniDumpWithFullMemory); // Release C4744 ߻Ͽ Singleton , CExceptionReport::GetInstancePtr() inline ȭ ( : http://msdn.microsoft.com/ko-kr/library/a7za416f.aspx) + // 예외 처리자 준비 + DWORD dwRetVal = CExceptionReport::GetInstancePtr()->Open(_T(".\\"), TRUE, TRUE, MiniDumpWithFullMemory); // Release 모드 컴파일 시 C4744 경고가 발생하여 Singleton 구현 변경, CExceptionReport::GetInstancePtr() 을 inline 화 하지 않음 (참고 : http://msdn.microsoft.com/ko-kr/library/a7za416f.aspx) if (NOERROR != dwRetVal) { DWORD dwErrNo = ::GetLastError(); DN_RETURN(dwErrNo); @@ -879,7 +883,7 @@ int _tmain(int argc, TCHAR* argv[]) return 0; } - wprintf(L"exit ġ \r\n"); + wprintf(L"exit 명령을 치면 종료\r\n"); char szCmd[256] = {0}; while (1) @@ -1009,23 +1013,23 @@ int _tmain(int argc, TCHAR* argv[]) std::vector vSplit; boost::algorithm::split( vSplit, strValue, boost::algorithm::is_any_of("/") ); - // ɾ + // 명령어 if( vSplit.size() >= 1 ) { if( stricmp( vSplit[0].c_str(), "create" ) ) break; } - // 氳 + // 방개수 if( vSplit.size() >= 2 ) { iDefaultCreateCount = boost::lexical_cast( vSplit[1] ); } - // õ + // 랜덤시드 if( vSplit.size() >= 3 ) { iRandomSeed = boost::lexical_cast( vSplit[2] ); } - // ʹȣ + // 맵번호 if( vSplit.size() >= 4 ) { iDefaultMapIndex = boost::lexical_cast( vSplit[3] ); diff --git a/Server/DNVillageServer/DNVillageServer.cpp b/Server/DNVillageServer/DNVillageServer.cpp index a68681c0fe65f010c9956e33b5ece9bd1fc49a93..0ee8a4d6839d294661b185e6ce6f12bb3a98f98c 100644 GIT binary patch literal 40869 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