2024-12-21 10:04:04 +08:00
// DNMasterServer.cpp : Defines the entry point for the console application.
//
# include "stdafx.h"
# include "DNConfig.h"
# include "DNIocpManager.h"
# include "DNLoginConnection.h"
# include "Util.h"
# include "Log.h"
# include "ExceptionReport.h"
# include "DNExtManager.h"
# include "DNDivisionManager.h"
# include "DNServiceConnection.h"
# include "IniFile.h"
# include "Version.h"
# include "Stream.h"
# include "./EtStringManager/EtUIXML.h"
# include "./EtResManager/EtResourceMng.h"
# if defined(_WORK)
# include "PsUpdater.h"
# endif // #if defined(_WORK)
# include "DNWaitUserManager.h"
# include "DNLogConnection.h"
# if defined(_TW)
# include ".\\TW\\DNGamaniaAuth.h"
# endif // #if defined(_TW)
# ifdef PRE_ADD_DOORS
# include "DNDoorsConnection.h"
# endif //#ifdef PRE_ADD_DOORS
# if defined( STRESS_TEST )
# include "./boost/algorithm/string.hpp"
# include "./boost/lexical_cast.hpp"
# define MAX_SESSION_COUNT 1200
# endif
# include "ServiceUtil.h"
# if defined(_KR)
# include "DNNexonAuth.h"
# elif defined(_KRAZ)
# include "DNActozShield.h"
# elif defined(_CH)
# include "DNShandaFCM.h"
# elif defined (_JP) && defined (WIN64)
# include "DNNHNNetCafe.h"
# elif defined(_US)
# include "DNNexonPI.h"
# elif defined(_TH)
# include "DNAsiaSoftPCCafe.h"
# elif defined(_ID)
# include "DNKreonPCCafe.h"
# endif // _CH
# include "DNGuildWarManager.h"
//#include "../../Server/RLKT_LICENSE/license_rlkt.h"
TMasterConfig g_Config ;
# if !defined(_FINAL_BUILD)
int g_nPCBangGrade = 0 ;
# endif // _WORK
# if defined(PRE_ADD_CHNC2C)
# include "../ServerCommon/CH/properties.h"
# include "DNC2C.h"
# endif
# if defined(PRE_FIX_DEBUGSET_INIT)
# include "DebugSet.h"
# endif
void LoadPartyID ( )
{
string szFileName = " ./Config/PartyIndex.dat " ;
FILE * fp = NULL ;
if ( _access ( szFileName . c_str ( ) , 0 ) = = - 1 )
{
//파일이 없다면 생성한다.
fp = fopen ( szFileName . c_str ( ) , " a " ) ;
fclose ( fp ) ;
}
fp = fopen ( szFileName . c_str ( ) , " rb " ) ;
if ( ! fp ) return ;
USHORT nPartyIdx = 0 ;
fread ( & nPartyIdx , 1 , sizeof ( USHORT ) , fp ) ;
fclose ( fp ) ;
nPartyIdx + = 10000 ; //혹시 저장 제대로 안되서 건너뛸 수 있으므로 꽁수로 10000 더해줌!
g_IDGenerator . SetPartyID ( nPartyIdx ) ;
}
void SavePartyID ( )
{
string szFileName = " ./Config/PartyIndex.dat " ;
FILE * fp = fopen ( szFileName . c_str ( ) , " wb " ) ;
if ( ! fp ) return ;
USHORT nPartyIdx = g_IDGenerator . GetPartyID ( ) ;
fwrite ( & nPartyIdx , 1 , sizeof ( UINT ) , fp ) ;
fclose ( fp ) ;
}
void LoadVoiceChannelID ( )
{
string szFileName = " ./Config/VoiceChannelID.dat " ;
FILE * fp = NULL ;
if ( _access ( szFileName . c_str ( ) , 0 ) = = - 1 )
{
//파일이 없다면 생성한다.
fp = fopen ( szFileName . c_str ( ) , " a " ) ;
fclose ( fp ) ;
}
fp = fopen ( szFileName . c_str ( ) , " rb " ) ;
if ( ! fp ) return ;
USHORT nChannelID = 0 ;
fread ( & nChannelID , 1 , sizeof ( USHORT ) , fp ) ;
fclose ( fp ) ;
nChannelID + = 10000 ; //혹시 저장 제대로 안되서 건너뛸 수 있으므로 꽁수로 10000 더해줌!
g_IDGenerator . SetVoiceChannelID ( nChannelID ) ;
}
void SaveVoiceChannelID ( )
{
string szFileName = " ./Config/VoiceChannelID.dat " ;
FILE * fp = fopen ( szFileName . c_str ( ) , " wb " ) ;
if ( ! fp ) return ;
USHORT nVoiceChannelID = g_IDGenerator . GetVoiceChannelID ( ) ;
fwrite ( & nVoiceChannelID , 1 , sizeof ( UINT ) , fp ) ;
fclose ( fp ) ;
}
bool LoadConfig ( int argc , TCHAR * argv [ ] )
{
memset ( & g_Config , 0 , sizeof ( TMasterConfig ) ) ;
//Version
_strcpy ( g_Config . szVersion , _countof ( g_Config . szVersion ) , szMasterVersion , ( int ) strlen ( szMasterVersion ) ) ;
_strcpy ( g_Config . szResVersion , _countof ( g_Config . szResVersion ) , " Unknown Version " , ( int ) strlen ( " Unknown Version " ) ) ;
if ( ! g_IniFile . Open ( L " ./Config/DNMaster.ini " ) ) {
g_Log . Log ( LogType : : _FILELOG , L " DNMaster.ini File not Found!! \r \n " ) ;
return false ;
}
# ifdef PRE_MOD_OPERATINGFARM
g_Config . nFarmServerID = 0 ;
# endif //#ifdef PRE_MOD_OPERATINGFARM
g_Config . bUseCmd = argc > = 2 ? IsUseCmd ( argv [ 1 ] ) : false ;
if ( g_Config . bUseCmd )
{
std : : wstring wstrTempConfig ;
std : : string strTempConfig ;
GetFirstRightValue ( L " nation " , argv [ 1 ] , wstrTempConfig ) ;
if ( wstrTempConfig . size ( ) > 0 & & wstrTempConfig ! = L " dev " )
{
ToMultiString ( wstrTempConfig , g_Config . szResourceNation ) ;
g_Log . Log ( LogType : : _FILELOG , L " ResourceNation String [%s] \r \n " , wstrTempConfig . empty ( ) ? L " None or Dev " : wstrTempConfig . c_str ( ) ) ;
}
GetDefaultInfo ( argv [ 1 ] , g_Config . nManagedID , g_Config . szResourcePath , g_Config . szResVersion , g_Config . ServiceInfo . szIP , g_Config . ServiceInfo . nPort ) ;
g_Log . Log ( LogType : : _FILELOG , L " ManagedID(SID) [%d] \n " , g_Config . nManagedID ) ;
g_Log . Log ( LogType : : _FILELOG , L " ResourcePath [%S] \n ResourceRevision [%S] \n " , g_Config . szResourcePath . c_str ( ) , g_Config . szResVersion ) ;
g_Log . Log ( LogType : : _FILELOG , L " ServiceManager [IP:%S][Port:%d] \n " , g_Config . ServiceInfo . szIP , g_Config . ServiceInfo . nPort ) ;
if ( GetFirstRightValue ( L " mwi " , argv [ 1 ] , wstrTempConfig ) ) {
g_Config . nWorldSetID = _wtoi ( wstrTempConfig . c_str ( ) ) ;
}
else _ASSERT ( 0 ) ;
g_Log . Log ( LogType : : _FILELOG , L " WorldID[%d] \n " , g_Config . nWorldSetID ) ;
if ( GetFirstRightValue ( L " mvp " , argv [ 1 ] , wstrTempConfig ) )
g_Config . nVillageAcceptPort = _wtoi ( wstrTempConfig . c_str ( ) ) ;
else _ASSERT ( 0 ) ;
if ( GetFirstRightValue ( L " title " , argv [ 1 ] , wstrTempConfig ) )
SetConsoleTitleW ( wstrTempConfig . c_str ( ) ) ;
if ( GetFirstRightValue ( L " mgp " , argv [ 1 ] , wstrTempConfig ) )
g_Config . nGameAcceptPort = _wtoi ( wstrTempConfig . c_str ( ) ) ;
else _ASSERT ( 0 ) ;
g_Log . Log ( LogType : : _FILELOG , L " VillageAcceptPort:%d, GameAcceptPort:%d \r \n " , g_Config . nVillageAcceptPort , g_Config . nGameAcceptPort ) ;
GetDefaultConInfo ( argv [ 1 ] , L " log " , & g_Config . LogInfo , 1 ) ;
g_Log . Log ( LogType : : _FILELOG , L " LogInfo (Ip:%S, Port:%d) \r \n " , g_Config . LogInfo . szIP , g_Config . LogInfo . nPort ) ;
GetDefaultConInfo ( argv [ 1 ] , L " login " , g_Config . LoginInfo , LOGINCOUNTMAX ) ;
for ( int nIndex = 0 ; nIndex < LOGINCOUNTMAX ; nIndex + + )
{
if ( g_Config . LoginInfo [ nIndex ] . nPort < = 0 ) continue ;
g_Log . Log ( LogType : : _FILELOG , L " LoginInfo[%04d] (Ip:%S, Port:%d) Success \r \n " , nIndex , g_Config . LoginInfo [ nIndex ] . szIP , g_Config . LoginInfo [ nIndex ] . nPort ) ;
}
# ifdef PRE_MOD_OPERATINGFARM
if ( GetFirstRightValue ( L " fsid " , argv [ 1 ] , wstrTempConfig ) )
g_Config . nFarmServerID = _wtoi ( wstrTempConfig . c_str ( ) ) ;
# endif //#ifdef PRE_MOD_OPERATINGFARM
# ifdef PRE_ADD_DOORS
GetDefaultConInfo ( argv [ 1 ] , L " door " , & g_Config . DoorsInfo , 1 ) ;
GetDefaultConInfo ( argv [ 1 ] , L " did1 " , & g_Config . DoorsIdenty [ 0 ] , 1 ) ;
GetDefaultConInfo ( argv [ 1 ] , L " did2 " , & g_Config . DoorsIdenty [ 1 ] , 1 ) ;
if ( g_Config . DoorsInfo . nPort > 0 ) g_Log . Log ( LogType : : _FILELOG , L " DoorsInfo (Ip:%S, Port:%d) Success \r \n " , g_Config . DoorsInfo . szIP , g_Config . DoorsInfo . nPort ) ;
if ( g_Config . DoorsIdenty [ 0 ] . nPort > 0 ) g_Log . Log ( LogType : : _FILELOG , L " DoorsIdenty1 (Ip:%S, Port:%d) Success \r \n " , g_Config . DoorsIdenty [ 0 ] . szIP , g_Config . DoorsIdenty [ 0 ] . nPort ) ;
if ( g_Config . DoorsIdenty [ 1 ] . nPort > 0 ) g_Log . Log ( LogType : : _FILELOG , L " DoorsIdenty2 (Ip:%S, Port:%d) Success \r \n " , g_Config . DoorsIdenty [ 1 ] . szIP , g_Config . DoorsIdenty [ 1 ] . nPort ) ;
# endif //#ifdef PRE_ADD_DOORS
}
else
{
# if !defined(_WORK)
g_IniFile . GetValue ( L " Info " , L " WorldID " , & g_Config . nWorldSetID ) ;
# endif // _WORK
# if defined( PRE_WORLDCOMBINE_PARTY )
# if defined( _WORK )
g_IniFile . GetValue ( L " Info " , L " WorldID " , & g_Config . nWorldSetID ) ;
# endif // #if defined( _WORK )
g_IniFile . GetValue ( L " Info " , L " CombinePartyWorld " , & g_Config . nCombinePartyWorld ) ;
# endif
if ( g_Config . nWorldSetID < = 0 ) {
g_Log . Log ( LogType : : _FILELOG , L " WorldID(%d) Failed!!!!!!!! \r \n " , g_Config . nWorldSetID ) ;
}
g_IniFile . GetValue ( L " Connection " , L " VillageAcceptPort " , & g_Config . nVillageAcceptPort ) ;
g_IniFile . GetValue ( L " Connection " , L " GameAcceptPort " , & g_Config . nGameAcceptPort ) ;
g_Log . Log ( LogType : : _FILELOG , L " VillageAcceptPort:%d, GameAcceptPort:%d \r \n " , g_Config . nVillageAcceptPort , g_Config . nGameAcceptPort ) ;
WCHAR wszBuf [ 128 ] = { 0 , } ;
char szData [ 128 ] = { 0 , } ;
std : : vector < std : : string > Tokens ;
for ( int nIndex = 0 ; LOGINCOUNTMAX > nIndex ; + + nIndex ) {
: : memset ( wszBuf , 0 , sizeof ( wszBuf ) ) ;
USES_CONVERSION ;
g_IniFile . GetValue ( L " Connection " , CVarArgW < MAX_PATH > ( L " Login%d " , nIndex + 1 ) , wszBuf ) ;
if ( L ' \0 ' = = wszBuf [ 0 ] )
break ;
_strcpy ( szData , _countof ( szData ) , W2CA ( wszBuf ) , ( int ) strlen ( W2CA ( wszBuf ) ) ) ;
Tokens . clear ( ) ;
TokenizeA ( szData , Tokens , " : " ) ;
if ( ! Tokens . empty ( ) ) {
_strcpy ( g_Config . LoginInfo [ nIndex ] . szIP , _countof ( g_Config . LoginInfo [ nIndex ] . szIP ) , Tokens [ 0 ] . c_str ( ) , ( int ) strlen ( Tokens [ 0 ] . c_str ( ) ) ) ;
g_Config . LoginInfo [ nIndex ] . nPort = atoi ( Tokens [ 1 ] . c_str ( ) ) ;
}
g_Log . Log ( LogType : : _FILELOG , L " LoginInfo[%04d] (Ip:%S, Port:%d) \r \n " , nIndex , g_Config . LoginInfo [ nIndex ] . szIP , g_Config . LoginInfo [ nIndex ] . nPort ) ;
}
WCHAR wszLogStr [ 128 ] = { 0 , } ;
g_IniFile . GetValue ( L " Connection " , L " Log " , wszLogStr ) ;
if ( wszLogStr [ 0 ] ! = ' \0 ' ) {
WideCharToMultiByte ( CP_ACP , NULL , wszLogStr , - 1 , szData , sizeof ( szData ) , NULL , NULL ) ;
Tokens . clear ( ) ;
TokenizeA ( szData , Tokens , " : " ) ;
if ( ! Tokens . empty ( ) ) {
_strcpy ( g_Config . LogInfo . szIP , _countof ( g_Config . LogInfo . szIP ) , Tokens [ 0 ] . c_str ( ) , ( int ) strlen ( Tokens [ 0 ] . c_str ( ) ) ) ;
g_Config . LogInfo . nPort = atoi ( Tokens [ 1 ] . c_str ( ) ) ;
}
}
# ifdef PRE_ADD_DOORS
WCHAR wszDoorsStr [ 128 ] = { 0 , } ;
g_IniFile . GetValue ( L " Connection " , L " Doors " , wszDoorsStr ) ;
if ( wszDoorsStr [ 0 ] ! = ' \0 ' ) {
WideCharToMultiByte ( CP_ACP , NULL , wszDoorsStr , - 1 , szData , sizeof ( szData ) , NULL , NULL ) ;
Tokens . clear ( ) ;
TokenizeA ( szData , Tokens , " : " ) ;
if ( ! Tokens . empty ( ) ) {
_strcpy ( g_Config . DoorsInfo . szIP , _countof ( g_Config . DoorsInfo . szIP ) , Tokens [ 0 ] . c_str ( ) , ( int ) strlen ( Tokens [ 0 ] . c_str ( ) ) ) ;
g_Config . DoorsInfo . nPort = atoi ( Tokens [ 1 ] . c_str ( ) ) ;
}
}
memset ( wszDoorsStr , 0 , sizeof ( wszDoorsStr ) ) ;
for ( int i = 0 ; i < 2 ; i + + )
{
g_IniFile . GetValue ( L " Connection " , i = = 0 ? L " DoorsIdenty1 " : L " DoorsIdenty2 " , wszDoorsStr ) ;
if ( wszDoorsStr [ 0 ] ! = ' \0 ' ) {
WideCharToMultiByte ( CP_ACP , NULL , wszDoorsStr , - 1 , szData , sizeof ( szData ) , NULL , NULL ) ;
Tokens . clear ( ) ;
TokenizeA ( szData , Tokens , " : " ) ;
if ( ! Tokens . empty ( ) ) {
_strcpy ( g_Config . DoorsIdenty [ i ] . szIP , _countof ( g_Config . DoorsIdenty [ i ] . szIP ) , Tokens [ 0 ] . c_str ( ) , ( int ) strlen ( Tokens [ 0 ] . c_str ( ) ) ) ;
g_Config . DoorsIdenty [ i ] . nPort = atoi ( Tokens [ 1 ] . c_str ( ) ) ;
}
}
}
# endif //PRE_ADD_DOORS
g_Log . Log ( LogType : : _FILELOG , L " LogInfo (Ip:%S, Port:%d) \r \n " , g_Config . LogInfo . szIP , g_Config . LogInfo . nPort ) ;
// ResourcePath 등록해준다.
WCHAR wszPath [ _MAX_PATH ] = { 0 , } ;
char szPath [ _MAX_PATH ] = { 0 , } ;
g_IniFile . GetValue ( L " Resource " , L " Path " , wszPath ) ;
if ( wszPath [ 0 ] ! = ' \0 ' ) {
WideCharToMultiByte ( CP_ACP , NULL , wszPath , - 1 , szPath , sizeof ( szPath ) , NULL , NULL ) ;
g_Config . szResourcePath = szPath ;
if ( g_Config . szResourcePath . empty ( ) ) g_Config . szResourcePath = " . " ;
}
WCHAR wszResNation [ 64 ] = { 0 , } ;
char szResNation [ 64 ] = { 0 , } ;
g_IniFile . GetValue ( L " Resource " , L " Nation " , wszResNation ) ;
if ( wszResNation [ 0 ] ! = ' \0 ' ) {
WideCharToMultiByte ( CP_ACP , NULL , wszResNation , - 1 , szResNation , sizeof ( szResNation ) , NULL , NULL ) ;
if ( strlen ( szResNation ) > 0 ) {
g_Config . szResourceNation = " _ " ;
g_Config . szResourceNation + = szResNation ;
}
}
g_IniFile . GetValue ( L " ServerManagerEx " , L " sid " , & g_Config . nManagedID ) ;
g_IniFile . GetValue ( L " ServerManagerEx " , L " ip " , wszBuf ) ;
WideCharToMultiByte ( CP_ACP , NULL , wszBuf , - 1 , g_Config . ServiceInfo . szIP , sizeof ( g_Config . ServiceInfo . szIP ) , NULL , NULL ) ;
g_IniFile . GetValue ( L " ServerManagerEx " , L " port " , & g_Config . ServiceInfo . nPort ) ;
}
# if !defined(_FINAL_BUILD)
g_IniFile . GetValue ( L " Info " , L " PCBangGrade " , & g_nPCBangGrade ) ;
# endif // #if defined(_FINAL_BUILD)
//나라마다 틀리고 고정 값은 공통으로 config에서 읽는다.
# if defined(_KR) && defined(_FINAL_BUILD)
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 ( ) ) ;
return false ;
}
std : : vector < std : : string > Tokens ;
WCHAR wszStr [ 64 ] = { 0 , } ;
char szData [ 128 ] = { 0 , } , * pStr = NULL ;
memset ( & wszStr , 0 , sizeof ( wszStr ) ) ;
g_IniFile . GetValue ( L " NexonAuth " , L " Auth " , wszStr ) ;
if ( wszStr [ 0 ] ! = ' \0 ' ) {
WideCharToMultiByte ( CP_ACP , NULL , wszStr , - 1 , szData , sizeof ( szData ) , NULL , NULL ) ;
Tokens . clear ( ) ;
TokenizeA ( szData , Tokens , " : " ) ;
if ( ! Tokens . empty ( ) ) {
_strcpy ( g_Config . AuthInfo . szIP , _countof ( g_Config . AuthInfo . szIP ) , Tokens [ 0 ] . c_str ( ) , ( int ) strlen ( Tokens [ 0 ] . c_str ( ) ) ) ;
g_Config . AuthInfo . nPort = atoi ( Tokens [ 1 ] . c_str ( ) ) ;
}
}
# ifdef _FINAL_BUILD
g_Config . nAuthDomainSN = g_Config . nWorldSetID - 1 ;
g_Log . Log ( LogType : : _FILELOG , L " AuthInfo (Ip:%S, Port:%d, SN:%d) Success \r \n " , g_Config . AuthInfo . szIP , g_Config . AuthInfo . nPort , g_Config . nAuthDomainSN ) ;
# else //_FINAL_BUILD
g_IniFile . GetValue ( L " NexonAuth " , L " DomainSN " , & g_Config . nAuthDomainSN ) ;
g_Log . Log ( LogType : : _FILELOG , L " AuthInfo (Ip:%S, Port:%d, SN:%d) Success \r \n " , g_Config . AuthInfo . szIP , g_Config . AuthInfo . nPort , g_Config . nAuthDomainSN ) ;
# endif //_FINAL_BUILD
# elif defined(_TW) && defined(_FINAL_BUILD)
USES_CONVERSION ;
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 ( ) ) ;
return false ;
}
WCHAR wszStr [ 64 ] = { 0 , } ;
memset ( & wszStr , 0 , sizeof ( wszStr ) ) ;
g_IniFile . GetValue ( L " GamaniaAuth " , L " IpAddr2 " , wszStr ) ;
if ( wszStr [ 0 ] ! = ' \0 ' )
_strcpy ( g_Config . AuthInfoTW . szIP , _countof ( g_Config . AuthInfoTW . szIP ) , W2CA ( wszStr ) , ( int ) strlen ( W2CA ( wszStr ) ) ) ;
g_IniFile . GetValue ( L " GamaniaAuth " , L " Port2 " , & g_Config . AuthInfoTW . nPort ) ;
# elif defined(_TH)
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 ( ) ) ;
return false ;
}
WCHAR wszStr [ 64 ] = { 0 , } ;
char szData [ 128 ] = { 0 , } ;
std : : vector < std : : string > Tokens ;
g_IniFile . GetValue ( L " AsiaSoftPCCafe " , L " PCCafeServer " , wszStr , 64 ) ;
if ( wszStr [ 0 ] ! = ' \0 ' ) {
WideCharToMultiByte ( CP_ACP , NULL , wszStr , - 1 , szData , sizeof ( szData ) , NULL , NULL ) ;
Tokens . clear ( ) ;
TokenizeA ( szData , Tokens , " : " ) ;
if ( ! Tokens . empty ( ) ) {
_strcpy ( g_Config . AsiaSoftPCCafe . szIP , _countof ( g_Config . AsiaSoftPCCafe . szIP ) , Tokens [ 0 ] . c_str ( ) , ( int ) strlen ( Tokens [ 0 ] . c_str ( ) ) ) ;
g_Config . AsiaSoftPCCafe . nPort = atoi ( Tokens [ 1 ] . c_str ( ) ) ;
}
}
# endif // _KR _TW
# if defined(_US)
WCHAR wszBuf [ 128 ] = { 0 , } ;
wstring wstrPI = L " ./Config/DNNexonUS_PI.ini " ;
if ( ! g_IniFile . Open ( wstrPI . c_str ( ) ) ) {
g_Log . Log ( LogType : : _FILELOG , L " %s File not Found!! \r \n " , wstrPI . c_str ( ) ) ;
return false ;
}
memset ( & wszBuf , 0 , sizeof ( wszBuf ) ) ;
g_IniFile . GetValue ( L " PassportImmigrator " , L " HostAddress " , wszBuf ) ;
if ( wszBuf [ 0 ] ! = ' \0 ' )
WideCharToMultiByte ( CP_ACP , NULL , wszBuf , - 1 , g_Config . PIInfo . szIP , sizeof ( g_Config . PIInfo . szIP ) , NULL , NULL ) ;
g_IniFile . GetValue ( L " PassportImmigrator " , L " Port " , & g_Config . PIInfo . nPort ) ;
memset ( & wszBuf , 0 , sizeof ( wszBuf ) ) ;
g_IniFile . GetValue ( L " PassportImmigrator " , L " RequestPage " , wszBuf ) ;
if ( wszBuf [ 0 ] ! = ' \0 ' )
WideCharToMultiByte ( CP_ACP , NULL , wszBuf , - 1 , g_Config . szRequestPage , sizeof ( g_Config . szRequestPage ) , NULL , NULL ) ;
memset ( & wszBuf , 0 , sizeof ( wszBuf ) ) ;
g_IniFile . GetValue ( L " PassportImmigrator " , L " UserAgent " , wszBuf ) ;
if ( wszBuf [ 0 ] ! = ' \0 ' )
WideCharToMultiByte ( CP_ACP , NULL , wszBuf , - 1 , g_Config . szUserAgent , sizeof ( g_Config . szUserAgent ) , NULL , NULL ) ;
memset ( & wszBuf , 0 , sizeof ( wszBuf ) ) ;
g_IniFile . GetValue ( L " PassportImmigrator " , L " ServiceCode " , wszBuf ) ;
if ( wszBuf [ 0 ] ! = ' \0 ' )
WideCharToMultiByte ( CP_ACP , NULL , wszBuf , - 1 , g_Config . szServiceCode , sizeof ( g_Config . szServiceCode ) , NULL , NULL ) ;
# endif // #if defined(_US)
return true ;
}
bool CheckWorkingFolder ( const WCHAR * szFolderName )
{
WCHAR szCurrentDir [ MAX_PATH ] = L " " ;
GetCurrentDirectory ( MAX_PATH , szCurrentDir ) ;
std : : wstring wszCurrentDir ;
wszCurrentDir = szCurrentDir ;
std : : transform ( wszCurrentDir . begin ( ) , wszCurrentDir . end ( ) , wszCurrentDir . begin ( ) , towlower ) ;
if ( wszCurrentDir . find ( szFolderName ) > wszCurrentDir . size ( ) )
return false ;
return true ;
}
bool InitApp ( int argc , TCHAR * argv [ ] )
{
//if (!CheckSerial()) return false;
WCHAR wszLogName [ 128 ] ;
memset ( wszLogName , 0 , sizeof ( wszLogName ) ) ;
if ( argc > = 2 )
{
if ( IsUseCmd ( argv [ 1 ] ) )
{
int nSID = 0 ;
std : : wstring wstrTempArgv ;
if ( GetFirstRightValue ( L " sid " , argv [ 1 ] , wstrTempArgv ) )
nSID = _wtoi ( wstrTempArgv . c_str ( ) ) ;
swprintf ( wszLogName , L " MasterServer_%d " , nSID ) ;
}
else
swprintf ( wszLogName , L " MasterServer " ) ;
}
else
swprintf ( wszLogName , L " MasterServer " ) ;
# if defined(_FINAL_BUILD)
g_Log . Init ( wszLogName , LOGTYPE_FILE_HOUR ) ;
# else
g_Log . Init ( wszLogName , LOGTYPE_CRT_FILE_DAY ) ;
# endif
// 로딩 시기때문에 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 생성
CEtResourceMng : : CreateInstance ( ) ;
// 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 ( ) )
{
szResource + = szNationStr ;
szMapData + = szNationStr ;
CEtResourceMng : : GetInstance ( ) . AddResourcePath ( szResource , true ) ;
CEtResourceMng : : GetInstance ( ) . AddResourcePath ( szMapData , true ) ;
szResource = g_Config . szResourcePath + " \\ Resource " ;
szMapData = g_Config . szResourcePath + " \\ MapData " ;
}
CEtResourceMng : : GetInstance ( ) . AddResourcePath ( szResource , true ) ;
CEtResourceMng : : GetInstance ( ) . AddResourcePath ( szMapData , true ) ;
LoadPartyID ( ) ;
LoadVoiceChannelID ( ) ;
g_pIocpManager = new CDNIocpManager ;
if ( ! g_pIocpManager )
{
g_Log . Log ( LogType : : _FILELOG , L " new CDNIocpManager Fail \r \n " ) ;
return false ;
}
if ( g_pIocpManager - > Init ( 100 ) < 0 ) {
g_Log . Log ( LogType : : _FILELOG , L " Iocp Initialize Fail \r \n " ) ;
return false ;
}
else {
g_Log . Log ( LogType : : _FILELOG , L " Iocp Initialize Success(%d) \r \n " , 100 ) ;
}
// worldid, worldname을 DataManager에서 다시 세팅하게 바꿈
g_pExtManager = new CDNExtManager ;
if ( ! g_pExtManager )
{
g_Log . Log ( LogType : : _FILELOG , L " new CDNExtManager Fail \r \n " ) ;
return false ;
}
if ( ! g_pExtManager - > AllLoad ( ) )
{
g_Log . Log ( LogType : : _FILELOG , L " CDNExtManager::AllLoad Fail \r \n " ) ;
return false ;
}
g_pDivisionManager = new CDivisionManager ( ) ;
if ( ! g_pDivisionManager )
{
g_Log . Log ( LogType : : _FILELOG , L " new CDivisionManager Fail \r \n " ) ;
return false ;
}
g_pWaitUserManager = new CDNWaitUserManager ;
if ( ! g_pWaitUserManager )
{
g_Log . Log ( LogType : : _FILELOG , L " new CDNWaitUserManager Fail \r \n " ) ;
return false ;
}
g_pWaitUserManager - > Initialize ( g_pExtManager - > GetWorldMaxUser ( g_Config . nWorldSetID ) ) ;
g_pGuildWarManager = new CDNGuildWarManager ;
if ( ! g_pGuildWarManager )
{
g_Log . Log ( LogType : : _FILELOG , L " new CDNGuildWarManager Fail \r \n " ) ;
return false ;
}
# ifdef PRE_ADD_DOORS
g_pDoorsConnection = new CDNDoorsConnection ;
if ( ! g_pDoorsConnection ) return false ;
g_pDoorsConnection - > SetIp ( g_Config . DoorsInfo . szIP ) ;
g_pDoorsConnection - > SetPort ( g_Config . DoorsInfo . nPort ) ;
# endif //#ifdef PRE_ADD_DOORS
g_pLogConnection = new CDNLogConnection ;
if ( ! g_pLogConnection ) return false ;
g_pLogConnection - > SetIp ( g_Config . LogInfo . szIP ) ;
g_pLogConnection - > SetPort ( g_Config . LogInfo . nPort ) ;
if ( g_Config . nManagedID > 0 )
{
g_pServiceConnection = new CDNServiceConnection ( g_Config . nManagedID ) ;
if ( ! g_pServiceConnection ) return false ;
g_pServiceConnection - > SetIp ( g_Config . ServiceInfo . szIP ) ;
g_pServiceConnection - > SetPort ( g_Config . ServiceInfo . nPort ) ;
}
# if defined(PRE_FIX_DEBUGSET_INIT)
CDebugSet : : Initialize ( CEtResourceMng : : GetInstance ( ) . GetCurrentDirectory ( ) . c_str ( ) , true ) ;
bool bParsingComplete = true ;
std : : string strErrorString = " " ;
# endif
// UI XML String File Load
CEtUIXML : : CreateInstance ( ) ;
# if defined(PRE_ADD_MULTILANGUAGE)
std : : string strNationFileName ;
# ifdef PRE_ADD_UISTRING_DIVIDE
std : : string strNationItemFileName ;
# endif // #ifdef PRE_ADD_UISTRING_DIVIDE
for ( int i = 0 ; i < MultiLanguage : : SupportLanguage : : NationMax ; i + + )
{
strNationFileName . clear ( ) ;
strNationFileName = " uistring " ;
if ( i ! = 0 ) //0번은 디폴트
strNationFileName . append ( MultiLanguage : : NationString [ i ] ) ;
strNationFileName . append ( " .xml " ) ;
CStream * pStream = CEtResourceMng : : GetInstance ( ) . GetStream ( strNationFileName . c_str ( ) ) ;
if ( pStream = = NULL ) continue ;
# if defined(PRE_FIX_DEBUGSET_INIT)
if ( CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 , i ) = = false )
{
bParsingComplete = false ;
strErrorString . append ( " [ " + strNationFileName + " ] " ) ;
}
# else
CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 , i ) ;
# endif
SAFE_DELETE ( pStream ) ;
strNationFileName . clear ( ) ;
# ifdef PRE_ADD_UISTRING_DIVIDE
strNationItemFileName = " uistring_item " ;
if ( i ! = 0 ) //0번은 디폴트
strNationItemFileName . append ( MultiLanguage : : NationString [ i ] ) ;
strNationItemFileName . append ( " .xml " ) ;
pStream = CEtResourceMng : : GetInstance ( ) . GetStream ( strNationItemFileName . c_str ( ) ) ;
if ( pStream = = NULL ) continue ;
# if defined(PRE_FIX_DEBUGSET_INIT)
if ( CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 , i , true ) = = false )
{
bParsingComplete = false ;
strErrorString . append ( " [ " + strNationFileName + " ] " ) ;
}
# else
CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 , i , true ) ;
# endif
SAFE_DELETE ( pStream ) ;
# endif // #ifdef PRE_ADD_UISTRING_DIVIDE
}
# else //#if defined(PRE_ADD_MULTILANGUAGE)
CStream * pStream = CEtResourceMng : : GetInstance ( ) . GetStream ( " uistring.xml " ) ;
# if defined(PRE_FIX_DEBUGSET_INIT)
if ( CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 ) = = false )
{
bParsingComplete = false ;
strErrorString . append ( " [uistring.xml] " ) ;
}
# else
CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 ) ;
# endif
SAFE_DELETE ( pStream ) ;
# ifdef PRE_ADD_UISTRING_DIVIDE
CStream * pStream = CEtResourceMng : : GetInstance ( ) . GetStream ( " uistring_item.xml " ) ;
# if defined(PRE_FIX_DEBUGSET_INIT)
if ( CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 ) = = false )
{
bParsingComplete = false ;
strErrorString . append ( " [uistring_item.xml] " ) ;
}
# else
CEtUIXML : : GetInstance ( ) . Initialize ( pStream , CEtUIXML : : idCategory1 ) ;
# endif
SAFE_DELETE ( pStream ) ;
# endif // #ifdef PRE_ADD_UISTRING_DIVIDE
# endif //#if defined(PRE_ADD_MULTILANGUAGE)
# if defined(PRE_FIX_DEBUGSET_INIT)
if ( ! bParsingComplete )
{
g_Log . Log ( LogType : : _FILELOG , L " UI XML String File Load Failed : %S \r \n " , strErrorString . c_str ( ) ) ;
return false ;
}
# endif //#if defined(PRE_FIX_DEBUGSET_INIT)
if ( g_pIocpManager - > AddAcceptConnection ( CONNECTIONKEY_VILLAGE , g_Config . nVillageAcceptPort , 1000 ) < 0 ) {
g_Log . Log ( LogType : : _FILELOG , L " VillageAcceptPort Fail(%d) \r \n " , g_Config . nVillageAcceptPort ) ;
return false ;
}
else {
g_Log . Log ( LogType : : _FILELOG , L " VillageAcceptPort (%d) \r \n " , g_Config . nVillageAcceptPort ) ;
}
if ( g_pIocpManager - > AddAcceptConnection ( CONNECTIONKEY_GAME , g_Config . nGameAcceptPort , 1000 ) < 0 ) {
g_Log . Log ( LogType : : _FILELOG , L " GameAcceptPort Fail(%d) \r \n " , g_Config . nGameAcceptPort ) ;
return false ;
}
else {
g_Log . Log ( LogType : : _FILELOG , L " GameAcceptPort (%d) \r \n " , g_Config . nGameAcceptPort ) ;
}
# if defined(_KR) && defined(_FINAL_BUILD) // Nexon 인증
// pc방
g_pNexonAuth = new CDNNexonAuth ;
if ( ! g_pNexonAuth ) return false ;
# elif defined(_KRAZ) && defined(_FINAL_BUILD)
g_pActozShield = new CDNActozShield ;
if ( ! g_pActozShield )
return false ;
if ( ! g_pActozShield - > Init ( ) )
return false ;
# elif defined(_US) && defined(_FINAL_BUILD) // Nexon 인증
// PI인증
g_pNexonPI = new CDNNexonPI ;
if ( ! g_pNexonPI )
return false ;
# elif defined(_CH) && defined(_FINAL_BUILD)
g_pShandaFCM = new CDNShandaFCM ;
if ( ! g_pShandaFCM ) return false ;
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)
g_pNHNNetCafe = new CDNNHNNetCafe ;
if ( ! g_pNHNNetCafe ) return false ;
if ( g_pNHNNetCafe - > NetCafe_Initialize ( ) = = false )
{ //NHN NetCafe Module Init
g_Log . Log ( LogType : : _FILELOG , L " g_pNHNNetCafe->Initialize() Fail!! \r \n " ) ;
//return false;
}
else
g_Log . Log ( LogType : : _FILELOG , L " g_pNHNNetCafe->Initialize() OK!! \r \n " ) ;
# elif defined(_TH) && defined(_FINAL_BUILD)
g_pAsiaSoftPCCafe = new CDNAsiaSoftPCCafe ( g_Config . AsiaSoftPCCafe . szIP , g_Config . AsiaSoftPCCafe . nPort ) ;
if ( ! g_pAsiaSoftPCCafe ) return false ;
# elif defined(_ID) && defined(_FINAL_BUILD)
g_pKreonPCCafe = new CDNKreonPCCafe ;
if ( ! g_pKreonPCCafe ) return false ;
# endif // _KR, _CH
# if defined(_TW) && defined(_FINAL_BUILD)
g_pGamaniaAuthLogOut = new CDNGamaniaAuth ( CONNECTIONKEY_TW_AUTHLOGOUT , g_Config . AuthInfoTW . szIP , g_Config . AuthInfoTW . nPort ) ;
if ( ! g_pGamaniaAuthLogOut ) {
return false ;
}
# endif // #if defined(_TW)
# if defined(PRE_ADD_CHNC2C)
CProperties Properties ;
if ( Properties . ImportProperties ( " ./config/DNC2C.ini " ) < 0 )
{
g_Log . Log ( LogType : : _FILELOG , L " C2C Service DNC2C.ini file Load Fail!! \r \n " ) ;
return false ;
}
if ( Properties . GetProperty < std : : string > ( " Switch " , " Off " ) = = " On " )
{
g_pDnC2C = new CDNC2C ( ) ;
if ( ! g_pDnC2C ) return false ;
if ( ! g_pDnC2C - > Init ( Properties . GetProperty < std : : string > ( " RemoteIP " , " 127.0.0.1 " ) ,
Properties . GetProperty ( " RemotePort " , 9527 ) ,
Properties . GetProperty < std : : string > ( " MatrixID " , " 89-1-1 " ) ,
Properties . GetProperty < std : : string > ( " DeviceID " , " ServerID " ) ) )
{
g_Log . Log ( LogType : : _FILELOG , L " C2C Service Logic Init Error!! \r \n " ) ;
return false ;
}
g_Log . Log ( LogType : : _FILELOG , L " C2C ON!! \r \n " ) ;
}
else
g_Log . Log ( LogType : : _FILELOG , L " C2C OFF!! \r \n " ) ;
# endif
: : srand ( timeGetTime ( ) ) ;
g_Log . Log ( LogType : : _FILEDBLOG , L " Application Initialize Success \r \n " ) ;
return true ;
}
void ClearApp ( )
{
if ( g_pIocpManager )
{
g_pIocpManager - > CloseAcceptors ( ) ;
g_pIocpManager - > ThreadStop ( ) ;
}
# if defined(_KR) && defined(_FINAL_BUILD)
SAFE_DELETE ( g_pNexonAuth ) ;
# elif defined(_KRAZ)
SAFE_DELETE ( g_pActozShield ) ;
# elif defined(_CH) && defined(_FINAL_BUILD)
SAFE_DELETE ( g_pShandaFCM ) ;
# elif defined (_JP) && defined(_FINAL_BUILD) && defined (WIN64)
SAFE_DELETE ( g_pNHNNetCafe ) ;
# elif defined(_TH) && defined(_FINAL_BUILD)
SAFE_DELETE ( g_pAsiaSoftPCCafe ) ;
# elif defined(_ID) && defined(_FINAL_BUILD)
SAFE_DELETE ( g_pKreonPCCafe ) ;
# endif // _CH
# if defined(_TW) && defined(_FINAL_BUILD)
SAFE_DELETE ( g_pGamaniaAuthLogOut ) ;
# endif // #if defined(_TW)
SAFE_DELETE ( g_pServiceConnection ) ;
SAFE_DELETE ( g_pExtManager ) ;
SAFE_DELETE ( g_pDivisionManager ) ;
SAFE_DELETE ( g_pIocpManager ) ;
if ( CEtUIXML : : IsActive ( ) )
delete CEtUIXML : : GetInstancePtr ( ) ;
if ( CEtResourceMng : : IsActive ( ) )
delete CEtResourceMng : : GetInstancePtr ( ) ;
}
# ifndef _FINAL_BUILD
bool bIsGTest ( int argc , TCHAR * argv [ ] )
{
for ( int i = 0 ; i < argc ; + + i )
{
if ( wcswcs ( argv [ i ] , L " --gtest_filter " ) )
{
testing : : InitGoogleMock ( & argc , argv ) ;
return true ;
}
}
return false ;
}
# endif
int _tmain ( int argc , TCHAR * argv [ ] )
{
/*
# if defined(_WORK)
if ( ! g_PsUpdater )
g_PsUpdater = new ( std : : nothrow ) CPsUpdater ;
g_PsUpdater - > AsyncUpdate ( ) ;
# endif // #if defined(_WORK)
*/
# ifndef _FINAL_BUILD
if ( bIsGTest ( argc , argv ) )
return RUN_ALL_TESTS ( ) ;
# endif
# if defined(_CH)
setlocale ( LC_ALL , " chinese-simplified " ) ;
# elif defined(_TW)
setlocale ( LC_ALL , " chinese-traditional " ) ;
# elif defined(_JP)
setlocale ( LC_ALL , " japanese " ) ;
# elif defined(_US)
setlocale ( LC_ALL , " us " ) ;
# else
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)
if ( NOERROR ! = dwRetVal ) {
DWORD dwErrNo = : : GetLastError ( ) ;
DN_RETURN ( dwErrNo ) ;
}
if ( ! InitApp ( argc , argv ) ) {
g_Log . Log ( LogType : : _FILEDBLOG , L " ** InitApp Failed!!! Check!!!!! \r \n " ) ;
ClearApp ( ) ;
return 0 ;
}
wprintf ( L " exit 명령을 치면 종료 \r \n " ) ;
char szCmd [ 256 ] = { 0 } ;
while ( 1 )
{
if ( strcmp ( szCmd , " exit " ) = = 0 ) break ;
# ifdef _WORK
if ( g_pDivisionManager )
g_pDivisionManager - > Parse ( szCmd ) ;
# endif
# if defined( STRESS_TEST )
if ( strstr ( szCmd , " create " ) )
{
int iDefaultMapIndex = 15005 ;
int iDefaultCreateCount = 100 ;
int iRandomSeed = 0 ;
std : : vector < int > vDefaultMapIndex ;
vDefaultMapIndex . push_back ( 271 ) ;
vDefaultMapIndex . push_back ( 272 ) ;
vDefaultMapIndex . push_back ( 273 ) ;
vDefaultMapIndex . push_back ( 274 ) ;
vDefaultMapIndex . push_back ( 311 ) ;
vDefaultMapIndex . push_back ( 312 ) ;
vDefaultMapIndex . push_back ( 313 ) ;
vDefaultMapIndex . push_back ( 314 ) ;
vDefaultMapIndex . push_back ( 51 ) ;
vDefaultMapIndex . push_back ( 52 ) ;
vDefaultMapIndex . push_back ( 53 ) ;
vDefaultMapIndex . push_back ( 56 ) ;
vDefaultMapIndex . push_back ( 57 ) ;
vDefaultMapIndex . push_back ( 58 ) ;
vDefaultMapIndex . push_back ( 61 ) ;
vDefaultMapIndex . push_back ( 62 ) ;
vDefaultMapIndex . push_back ( 71 ) ;
vDefaultMapIndex . push_back ( 72 ) ;
vDefaultMapIndex . push_back ( 73 ) ;
vDefaultMapIndex . push_back ( 81 ) ;
vDefaultMapIndex . push_back ( 82 ) ;
vDefaultMapIndex . push_back ( 83 ) ;
vDefaultMapIndex . push_back ( 86 ) ;
vDefaultMapIndex . push_back ( 87 ) ;
vDefaultMapIndex . push_back ( 88 ) ;
vDefaultMapIndex . push_back ( 91 ) ;
vDefaultMapIndex . push_back ( 92 ) ;
vDefaultMapIndex . push_back ( 93 ) ;
vDefaultMapIndex . push_back ( 96 ) ;
vDefaultMapIndex . push_back ( 97 ) ;
vDefaultMapIndex . push_back ( 98 ) ;
vDefaultMapIndex . push_back ( 101 ) ;
vDefaultMapIndex . push_back ( 102 ) ;
vDefaultMapIndex . push_back ( 103 ) ;
vDefaultMapIndex . push_back ( 117 ) ;
vDefaultMapIndex . push_back ( 118 ) ;
vDefaultMapIndex . push_back ( 121 ) ;
vDefaultMapIndex . push_back ( 122 ) ;
vDefaultMapIndex . push_back ( 123 ) ;
vDefaultMapIndex . push_back ( 124 ) ;
vDefaultMapIndex . push_back ( 126 ) ;
vDefaultMapIndex . push_back ( 127 ) ;
vDefaultMapIndex . push_back ( 128 ) ;
vDefaultMapIndex . push_back ( 129 ) ;
vDefaultMapIndex . push_back ( 130 ) ;
vDefaultMapIndex . push_back ( 131 ) ;
vDefaultMapIndex . push_back ( 132 ) ;
vDefaultMapIndex . push_back ( 133 ) ;
vDefaultMapIndex . push_back ( 134 ) ;
vDefaultMapIndex . push_back ( 136 ) ;
vDefaultMapIndex . push_back ( 137 ) ;
vDefaultMapIndex . push_back ( 138 ) ;
vDefaultMapIndex . push_back ( 139 ) ;
vDefaultMapIndex . push_back ( 141 ) ;
vDefaultMapIndex . push_back ( 142 ) ;
vDefaultMapIndex . push_back ( 143 ) ;
vDefaultMapIndex . push_back ( 144 ) ;
vDefaultMapIndex . push_back ( 146 ) ;
vDefaultMapIndex . push_back ( 147 ) ;
vDefaultMapIndex . push_back ( 148 ) ;
vDefaultMapIndex . push_back ( 149 ) ;
vDefaultMapIndex . push_back ( 151 ) ;
vDefaultMapIndex . push_back ( 152 ) ;
vDefaultMapIndex . push_back ( 153 ) ;
vDefaultMapIndex . push_back ( 154 ) ;
vDefaultMapIndex . push_back ( 161 ) ;
vDefaultMapIndex . push_back ( 162 ) ;
vDefaultMapIndex . push_back ( 163 ) ;
vDefaultMapIndex . push_back ( 164 ) ;
vDefaultMapIndex . push_back ( 171 ) ;
vDefaultMapIndex . push_back ( 172 ) ;
vDefaultMapIndex . push_back ( 173 ) ;
vDefaultMapIndex . push_back ( 174 ) ;
vDefaultMapIndex . push_back ( 241 ) ;
vDefaultMapIndex . push_back ( 242 ) ;
vDefaultMapIndex . push_back ( 243 ) ;
vDefaultMapIndex . push_back ( 244 ) ;
vDefaultMapIndex . push_back ( 251 ) ;
vDefaultMapIndex . push_back ( 252 ) ;
vDefaultMapIndex . push_back ( 253 ) ;
vDefaultMapIndex . push_back ( 254 ) ;
vDefaultMapIndex . push_back ( 261 ) ;
vDefaultMapIndex . push_back ( 262 ) ;
vDefaultMapIndex . push_back ( 263 ) ;
vDefaultMapIndex . push_back ( 264 ) ;
vDefaultMapIndex . push_back ( 271 ) ;
vDefaultMapIndex . push_back ( 272 ) ;
vDefaultMapIndex . push_back ( 273 ) ;
vDefaultMapIndex . push_back ( 274 ) ;
vDefaultMapIndex . push_back ( 281 ) ;
vDefaultMapIndex . push_back ( 282 ) ;
vDefaultMapIndex . push_back ( 283 ) ;
vDefaultMapIndex . push_back ( 284 ) ;
vDefaultMapIndex . push_back ( 291 ) ;
vDefaultMapIndex . push_back ( 292 ) ;
vDefaultMapIndex . push_back ( 293 ) ;
vDefaultMapIndex . push_back ( 294 ) ;
vDefaultMapIndex . push_back ( 311 ) ;
vDefaultMapIndex . push_back ( 312 ) ;
vDefaultMapIndex . push_back ( 313 ) ;
vDefaultMapIndex . push_back ( 314 ) ;
UINT randVal ;
rand_s ( & randVal ) ;
iDefaultMapIndex = vDefaultMapIndex [ randVal % vDefaultMapIndex . size ( ) ] ;
std : : string strValue ( szCmd ) ;
std : : vector < std : : string > 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 < int > ( vSplit [ 1 ] ) ;
}
// 랜덤시드
if ( vSplit . size ( ) > = 3 )
{
iRandomSeed = boost : : lexical_cast < int > ( vSplit [ 2 ] ) ;
}
// 맵번호
if ( vSplit . size ( ) > = 4 )
{
iDefaultMapIndex = boost : : lexical_cast < int > ( vSplit [ 3 ] ) ;
}
static bool bLoop = true ;
static int nLoop1 = 1000 ;
static int nLoop2 = 10000 ;
static int nRandDelay = 100 ;
while ( bLoop ) {
int iAccountDBIDArray [ ] = { 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 5 , 6 , 6 , 10 , 10 , 10 , 10 , 12 , 12 , 12 , 12 , 13 , 13 , 15 , 15 , 16 , 16 , 16 , 16 , 17 , 19 , 19 , 22 , 24 , 24 , 27 , 27 , 28 , 28 , 28 , 29 , 30 , 30 , 30 , 32 , 35 , 35 , 35 , 37 , 38 , 38 , 38 , 38 , 39 , 39 , 39 , 39 , 40 , 40 , 40 , 40 , 41 , 41 , 41 , 41 , 46 , 46 , 46 , 46 , 49 , 49 , 49 , 50 , 52 , 53 , 53 , 53 , 54 , 54 , 55 , 55 , 55 , 55 , 56 , 57 , 88 , 90 , 90 , 90 , 90 , 91 , 91 , 91 , 91 , 140 , 140 , 140 , 140 , 142 , 142 , 143 , 143 , 143 , 145 , 145 , 145 , 145 , 147 , 151 , 151 , 151 , 152 , 152 , 153 , 153 , 153 , 153 , 154 , 154 , 155 , 156 , 156 , 156 , 157 , 158 , 158 , 158 , 158 , 159 , 160 , 160 , 161 , 161 , 161 , 161 , 162 , 162 , 164 , 164 , 175 , 175 , 176 , 177 , 177 , 177 , 177 , 178 , 178 , 178 , 180 , 180 , 194 , 194 , 194 , 194 , 195 , 205 , 205 , 205 , 205 , 209 , 209 , 210 , 210 , 210 , 210 , 211 , 211 , 211 , 211 , 212 , 212 , 212 , 212 , 213 , 213 , 213 , 213 , 214 , 214 , 215 , 215 , 215 , 216 , 216 , 216 , 216 , 217 , 217 , 217 , 217 , 218 , 218 , 218 , 218 , 219 , 219 , 219 , 219 , 220 , 220 , 221 , 221 , 221 , 224 , 224 , 224 , 225 , 225 , 225 , 225 , 226 , 226 , 226 , 226 , 227 , 227 , 227 , 227 , 228 , 228 , 228 , 228 , 229 , 229 , 229 , 229 , 230 , 230 , 230 , 230 , 231 , 231 , 231 , 231 , 232 , 232 , 232 , 232 , 233 , 233 , 233 , 233 , 234 , 234 , 234 , 234 , 235 , 235 , 235 , 235 , 236 , 236 , 236 , 236 , 237 , 237 , 237 , 237 , 238 , 238 , 238 , 238 , 239 , 239 , 239 , 239 , 240 , 240 , 240 , 240 , 241 , 241 , 241 , 241 , 242 , 242 , 249 , 249 , 260 , 260 , 260 , 260 , 262 , 263 , 263 , 263 , 263 , 264 , 264 , 264 , 264 , 266 , 266 , 267 , 267 , 267 , 267 , 269 , 270 , 15271 , 15272 , 15273 , 15274 , 15275 , 15276 , 15277 , 15278 , 15279 , 15279 , 15279 , 15279 , 15280 , 15280 , 15280 , 15280 , 15281 , 15281 , 15281 , 15282 , 15282 , 15282 , 15282 , 15283 , 15283 , 15283 , 15284 , 15284 , 15284 , 15285 , 15285 , 15285 , 15286 , 15288 , 15288 , 15289 , 15289 , 15289 , 15289 , 15290 , 15290 , 15290 , 15290 , 15291 , 15291 , 15291 , 15291 , 15293 , 15293 , 15293 , 15293 , 15299 , 15299 , 15299 , 15299 , 15300 , 15300 , 15300 , 15301 , 15301 , 15301 , 15301 , 15304 , 15309 , 15309 , 15309 , 15310 , 15341 , 15341 , 15341 , 15341 , 15348 , 15348 , 15348 , 15348 , 15349 , 15349 , 15349 , 15349 , 15350 , 15350 , 15350 , 15350 , 15351 , 15351 , 15351 , 15351 , 15352 , 15352 , 15352 , 15353 , 15353 , 15353 , 15354 , 15354 , 15354 , 15354 , 15355 , 15355 , 15355 , 15355 , 15356 , 15356 , 15356 , 15356 , 15357 , 15357 , 15357 , 15357 , 15358 , 15358 , 15358 , 15358 , 15359 , 15359 , 15359 , 15359 , 15360 , 15360 , 15360 , 15360 , 15361 , 15361 , 15361 , 15361 , 15362 , 15362 , 15362 , 15362 , 15363 , 15363 , 15363 , 15363 , 15364 , 15364 , 15364 , 15364 , 15365 , 15365 , 15365 , 15365 , 15366 , 15366 , 15366 , 15366 , 15367 , 15367 , 15367 , 15367 , 15368 , 15368 , 15368 , 15368 , 15369 , 15369 , 15369 , 15370 , 15370 , 15370 , 15371 , 15371 , 15371 , 15372 , 15372 , 15372 , 15373 , 15373 , 15373 , 15374 , 15374 , 15374 , 15375 , 15375 , 15375 , 15376 , 15376 , 15376 , 15377 , 15377 , 15377 , 15378 , 15378 , 15378 , 15378 , 15379 , 15379 , 15379 , 15379 , 15380 , 15380 , 15381 , 15384 , 15400 , 15442 , 15482 , 15482 , 15482 , 15483 , 15483 , 15483 , 15484 , 15484 , 15484 , 15485 , 15485 , 15485 , 15486 , 15486 , 15486 , 15487 , 15487 , 15487 , 15488 , 15488 , 15488 , 15489 , 15489 , 15489 , 15490 , 15490 , 15490 , 15491 , 15491 , 15491 , 15492 , 15492 , 15492 , 15493 , 15493 , 15493 , 15494 , 15494 , 15494 , 15495 , 15495 , 15495 , 15496 , 15496 , 15496 , 15497 , 15497 , 15497 , 15498 , 15498 , 15498 , 15499 , 15499 , 15499 , 15500 , 15500 , 15500 , 15501 , 15501 , 15501 , 15502 , 15502 , 15502 , 15503 , 15503 , 15503 , 15504 , 15504 , 15504 , 15505 , 15505 , 15505 , 15506 , 15506 , 15506 , 15507 , 15507 , 15507 , 15508 , 15508 , 15508 , 15509 , 15509 , 15509 , 15510 , 15510 , 15510 , 15511 , 15511 , 15511 , 15512 , 15512 , 15512 , 15513 , 15513 , 15513 , 15514 , 15581 , 15581 } ;
INT64 biCharacterDBIDArray [ ] = { 4 , 120 , 60432 , 5 , 60428 , 60429 , 352 , 22333 , 60598 , 60607 , 60711 , 101 , 102 , 25 , 60404 , 60635 , 60641 , 313 , 321 , 328 , 60410 , 30 , 317 , 60 , 377 , 52 , 53 , 141 , 312 , 34 , 65 , 67 , 376 , 60772 , 61489 , 111 , 60730 , 3 , 78 , 88 , 48 , 28 , 60493 , 60498 , 58 , 61 , 298 , 391 , 43 , 61079 , 61083 , 61086 , 61087 , 60539 , 60595 , 60604 , 61217 , 60542 , 60543 , 60545 , 60599 , 60549 , 60550 , 61422 , 61442 , 362 , 60398 , 60431 , 60480 , 288 , 311 , 372 , 97 , 36 , 148 , 150 , 153 , 22 , 379 , 76 , 241 , 257 , 60615 , 60773 , 61629 , 326 , 60456 , 61850 , 61852 , 61858 , 261 , 266 , 60574 , 61645 , 392 , 60587 , 60634 , 61640 , 41 , 60460 , 385 , 60828 , 60874 , 146 , 286 , 60453 , 61423 , 37 , 80 , 95 , 117 , 29 , 371 , 31 , 356 , 60412 , 60517 , 60434 , 60437 , 96 , 327 , 60475 , 60637 , 60619 , 393 , 60478 , 60487 , 60564 , 14 , 12 , 85 , 33 , 45 , 314 , 384 , 32 , 60433 , 38 , 374 , 71 , 369 , 56 , 61051 , 61053 , 61505 , 61622 , 84 , 388 , 60445 , 255 , 256 , 60804 , 60867 , 61550 , 61758 , 61564 , 74 , 60742 , 60743 , 60745 , 39 , 394 , 50 , 322 , 60423 , 60532 , 73 , 283 , 61638 , 61639 , 197 , 61553 , 61571 , 61770 , 260 , 60602 , 61462 , 61803 , 51 , 380 , 397 , 60447 , 60510 , 54 , 325 , 395 , 60435 , 61752 , 61840 , 61841 , 61842 , 61741 , 61742 , 61743 , 61746 , 303 , 60506 , 60523 , 60620 , 386 , 60399 , 61045 , 61804 , 61836 , 60457 , 61717 , 61822 , 61440 , 61725 , 61744 , 61745 , 128 , 60426 , 61427 , 61805 , 60650 , 60785 , 61636 , 61648 , 61499 , 61529 , 61655 , 61656 , 185 , 61729 , 61783 , 61810 , 61721 , 61824 , 61825 , 61835 , 61719 , 61787 , 61819 , 61826 , 184 , 60633 , 60787 , 61464 , 61637 , 61795 , 61816 , 61839 , 60626 , 61535 , 61562 , 61731 , 60797 , 61539 , 61541 , 61718 , 60798 , 61530 , 61794 , 61809 , 60799 , 61509 , 61511 , 61526 , 60800 , 61093 , 61520 , 61551 , 60801 , 61560 , 61567 , 61650 , 60802 , 61506 , 61559 , 61775 , 60803 , 61496 , 61508 , 61515 , 64 , 373 , 60581 , 60738 , 60482 , 60483 , 60488 , 60577 , 61845 , 60751 , 61428 , 61763 , 61833 , 271 , 302 , 61633 , 61747 , 59 , 258 , 216 , 60508 , 61438 , 61793 , 357 , 60489 , 61061 , 61062 , 61063 , 61064 , 61065 , 61066 , 61067 , 61554 , 61047 , 61049 , 61050 , 61691 , 61769 , 61792 , 61799 , 61800 , 61807 , 61808 , 61814 , 61605 , 61610 , 61617 , 61623 , 61621 , 61624 , 61627 , 61594 , 61596 , 61599 , 61619 , 61625 , 61626 , 61620 , 61632 , 61760 , 61677 , 61678 , 61679 , 61817 , 61671 , 61681 , 61683 , 61838 , 61672 , 61673 , 61674 , 61675 , 61658 , 61823 , 61827 , 61828 , 61684 , 61688 , 61704 , 61756 , 61703 , 61712 , 61777 , 61772 , 61773 , 61774 , 61802 , 61798 , 61705 , 61707 , 61709 , 61592 , 61686 , 61687 , 61692 , 61730 , 61501 , 61503 , 61510 , 61514 , 60822 , 60825 , 60827 , 60830 , 60832 , 60837 , 60842 , 60844 , 60846 , 60849 , 60850 , 60852 , 60853 , 60855 , 60857 , 60858 , 60859 , 60861 , 60937 , 60938 , 60939 , 60940 , 60941 , 60942 , 60943 , 60944 , 60945 , 60946 , 60947 , 60948 , 60949 , 60950 , 60951 , 60952 , 60953 , 60954 , 60955 , 60956 , 60957 , 60958 , 60959 , 60960 , 60961 , 60962 , 60963 , 60964 , 60965 , 60966 , 60967 , 60968 , 60969 , 60970 , 60971 , 60972 , 60973 , 60974 , 60975 , 60976 , 60977 , 60978 , 60979 , 60980 , 60981 , 60982 , 60983 , 60984 , 60985 , 60986 , 60987 , 60988 , 60989 , 60990 , 60991 , 60992 , 60993 , 60994 , 60995 , 60996 , 60997 , 60998 , 60999 , 61000 , 61001 , 61002 , 61003 , 61004 , 61005 , 61006 , 61007 , 61008 , 61009 , 61010 , 61011 , 61012 , 61013 , 61014 , 61015 , 61016 , 61017 , 61018 , 61019 , 61020 , 61021 , 61022 , 61023 , 61025 , 61026 , 61487 , 61493 , 61284 , 61447 , 61461 , 61481 , 61569 , 61570 , 61606 , 61659 , 61755 , 61722 , 61395 , 61396 , 61397 , 61398 , 61399 , 61400 , 61401 , 61402 , 61403 , 61404 , 61405 , 61406 , 61407 , 61408 , 61409 , 61410 , 61411 , 61412 , 61413 , 61414 , 61415 , 61416 , 61417 , 61418 , 61419 , 61420 , 61421 , 61137 , 61138 , 61139 , 61140 , 61141 , 61142 , 61143 , 61144 , 61145 , 61146 , 61147 , 61148 , 61149 , 61150 , 61151 , 61152 , 61153 , 61154 , 61155 , 61156 , 61157 , 61158 , 61159 , 61160 , 61161 , 61162 , 61163 , 61164 , 61165 , 61166 , 61167 , 61168 , 61169 , 61170 , 61171 , 61172 , 61173 , 61174 , 61175 , 61176 , 61177 , 61178 , 61179 , 61180 , 61181 , 61182 , 61183 , 61184 , 61185 , 61186 , 61187 , 61188 , 61189 , 61190 , 61191 , 61192 , 61193 , 61194 , 61195 , 61196 , 61197 , 61198 , 61199 , 61200 , 61201 , 61202 , 61203 , 61204 , 61205 , 61206 , 61732 , 61754 } ;
int nRandomSeed = rand ( ) % 593 ;
int iAccountDBID = iAccountDBIDArray [ nRandomSeed ] ;
INT64 biCharacterDBID = biCharacterDBIDArray [ nRandomSeed ] ;
g_pDivisionManager - > AddUser ( 0 , 0 , 0 , 0 , iAccountDBID , 0 , biCharacterDBID , L " test " , L " test " , false , " 127.0.0.1 " , " 127.0.0.1 " , 0 , NULL , 0 , 0 ) ;
g_pDivisionManager - > RequestGameRoom ( REQINFO_TYPE_SINGLE , iAccountDBID , 10000 , vDefaultMapIndex [ rand ( ) % vDefaultMapIndex . size ( ) ] , 0 , 2 , true , false , 0 ) ;
Sleep ( 3000 ) ;
/*
if ( rand ( ) % nRandDelay ! = 0 )
Sleep ( rand ( ) % nLoop1 ) ;
else
Sleep ( nLoop2 ) ;
*/
}
}
# endif
printf ( " CMD> " ) ;
std : : cin > > szCmd ;
}
SavePartyID ( ) ;
SaveVoiceChannelID ( ) ;
ClearApp ( ) ;
# if defined(_WORK)
SAFE_DELETE ( g_PsUpdater ) ;
# endif // #if defined(_WORK)
return 0 ;
}