bool CCMatchLocale::PostLoginInfoToDBAgent(const CCUID& uidComm, const char* szCN, const char* szPW, bool bFreeLoginIP, unsigned long nChecksumPack, int nTotalUserCount)
{
//	if (m_nCountry != CCC_JAPAN)
	{
		cclog( "country code is not JPN.\n" );
		return false;
	}

	if (m_pDBAgentClient)
	{
		if (!m_pDBAgentClient->GetSock()->IsActive())
		{
			if (!m_pDBAgentClient->IsConnected())
			{
				cclog( "Retry connect to DBAgent.\n" );
				ConnectToDBAgent();
				return false;
			}
		}

		if (m_pDBAgentClient->IsConnected())
		{
			m_pDBAgentClient->Send(uidComm, szCN, szPW, bFreeLoginIP, nChecksumPack, nTotalUserCount);
			return true;
		}

		cclog( "DBAgent not connect.\n" );
	}
	
	cclog( "DBAgentClient NULL.\n" );
	
	return false;
}
int RMain(const char *AppName, HINSTANCE this_inst, HINSTANCE prev_inst, LPSTR cmdline, int cmdshow, RMODEPARAMS *pModeParams, WNDPROC winproc, WORD nIconResID )
{
	g_WinProc=winproc ? winproc : DefWindowProc;
#ifdef _INDEPTH_DEBUG_
	cclog("Creating window.\n");
#endif
	// make a window
    WNDCLASS    wc;
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = sizeof(DWORD);
    wc.hInstance = this_inst;
	wc.hIcon = LoadIcon( this_inst, MAKEINTRESOURCE(nIconResID));
    wc.hCursor = 0;//LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = NULL;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "RealSpace2";
	if(!RegisterClass(&wc)) return FALSE;

	DWORD dwStyle = pModeParams->bFullScreen ? WS_POPUP | WS_SYSMENU : WS_POPUP | WS_CAPTION | WS_SYSMENU ;
    g_hWnd = CreateWindow( "RealSpace2", AppName , dwStyle, CW_USEDEFAULT, CW_USEDEFAULT, 
			pModeParams->nWidth, pModeParams->nHeight, NULL, NULL, this_inst , NULL );

	// initialize realspace2

	RAdjustWindow(pModeParams);

	while(ShowCursor(false)>0);
#ifdef _INDEPTH_DEBUG_
	cclog("EXIT RMain()\n");
#endif
	return 0;
}
Example #3
0
int get_ca_ip(char *host, int type, const char *uri, struct in_addr * addr)
{
	if(good_ip_num <= 0)
	{
//		if(init_host_ip_from_host(host))
		if(init_ca_host_ip(host, type))
		{
			cclog(1, "can not get ca ip for: %s", host);
			abort();
		}
	}

	int i;
	int n = 0;
	while(1)
	{
		i = get_pos(uri);


		if(n++ == ip_num)
			break;
		if(host_ip[i].good_ip)
		{
			*addr = host_ip[i].m_addr;
			cclog(8, "get ca ip %s in pos: %d", inet_ntoa(*addr), i);
		}
		return 0;
	}

	return -1;
}
bool CreateDirect3D9()
{
	if (!g_pD3D)
	{
		g_hD3DLibrary = LoadLibrary( "d3d9.dll" );

		if (!g_hD3DLibrary)
		{
			cclog("Error, could not load d3d9.dll");
			return false;
		}

		typedef IDirect3D9 * (__stdcall *D3DCREATETYPE)(UINT);
		D3DCREATETYPE d3dCreate = (D3DCREATETYPE) GetProcAddress(g_hD3DLibrary, "Direct3DCreate9");

		if (!d3dCreate)
		{
			cclog("Error, could not get proc adress of Direct3DCreate9.");
			return false;
		}


		//just like pID3D = Direct3DCreate9(D3D_SDK_VERSION);
		g_pD3D = (*d3dCreate)(D3D_SDK_VERSION);

		if (!g_pD3D)
		{
			cclog("Error initializing D3D.");
			return false;
		}
	}
Example #5
0
static void get_name_real(char *host)
{
	struct hostent *he;
	char ** p;
	struct in_addr addr;

	int i = 0;
	he = gethostbyname(host);

	p = he->h_addr_list;
	while(*p!=NULL)
	{
		addr.s_addr = *((unsigned int *)*p);
		cclog(3, "address is %s", inet_ntoa(addr));

		host_ip[i].m_addr = addr;
		host_ip[i].good_ip = 1;
		ip_num++;
		good_ip_num++;
		p++;

		if(i++ == MAX_CA_IP)
			break;
	}

	cclog(3, "we get %d address for %s", ip_num, host);
} 
Example #6
0
bool ZTips::Initialize(CCZFileSystem* pfs, const CCLanguage LangID )
{
	CCZFile mzf;
	if(!mzf.Open(FILENAME_TIPS,pfs)) return false;

	char *buffer;
	buffer=new char[mzf.GetLength()+1];
	mzf.Read(buffer,mzf.GetLength());
	buffer[mzf.GetLength()]=0;

//	LANGID LangID = LANG_KOREAN;			/* Korean : 이거 정말 하드코딩 박기 싫었는디... 쩝... -_-;;; */
//#ifdef LOCALE_JAPAN
//	LangID = LANG_JAPANESE;					/* Japanese */
//#elif  LOCALE_US
//	LangID = LANG_ENGLISH;					/* International */
//#elif  LOCALE_BRAZIL
//	LangID = LANG_PORTUGUESE;				/* Brazil */
//#elif  LOCALE_INDIA
//	LangID = LANG_ENGLISH;					/* India */
//#endif

	cclog( "Load XML from memory : %s(0x%04X)", FILENAME_TIPS, LangID);

	CCXmlDocument aXml;
	aXml.Create();
	if(!aXml.LoadFromMemory(buffer, LangID))
	{
		cclog( "- FAIL\n");
		delete buffer;
		return false;
	}
	delete buffer;
	cclog( "- SUCCESS\n");

	int iCount, i;
	CCXmlElement		aParent, aChild;
	aParent = aXml.GetDocumentElement();
	iCount = aParent.GetChildNodeCount();

	char szTagName[256]="";
	
	for (i = 0; i < iCount; i++)
	{
		aChild = aParent.GetChildNode(i);
		aChild.GetTagName(szTagName);
		if(stricmp(szTagName,ZTOK_TIPS)==0)
		{
			if (szTagName[0] == '#') continue;
			ParseTips(&aChild);
		}
	}

	return true;
}
Example #7
0
void dump_ca_host_ip()
{
	if(ip_num <= 0)
	{
		cclog(0, "ca host ip num is <= 0  exit");
		abort();
	}

	int i;
	for(i = 0; i < ip_num; i++)	
		cclog(1, inet_ntoa(host_ip[i].m_addr)?inet_ntoa(host_ip[i].m_addr):null_string);
}
void _ZChangeGameState(int nIndex)
{
	GunzState state = GunzState(nIndex);
	cclog("Setting GunzState to %d\n", state);
	if (ZApplication::GetGameInterface())
	{
		ZApplication::GetGameInterface()->SetState(state);
	}
}
//////////////////////////////////////////////////////////////////////////
// SetLight
//////////////////////////////////////////////////////////////////////////
bool RLenzFlare::SetLight( rvector& pos_ )
{
	if( miNumLight >= MAX_LENZFLARE_NUMBER )
	{
		cclog("Can't Set Light...: Light Buffer for LenzFlare is Full already..\n" );
        return false;
	}
	mLightList[miNumLight++] = pos_;
	return true;
}
Example #10
0
BOOL CALLBACK EnumLoadedModulesCallback(LPSTR pModuleName, ULONG ulModuleBase,  ULONG ulModuleSize,  PVOID pUserContext)
{
    if (!g_pfnSymLoadModule((HANDLE)pUserContext, 0, pModuleName, 0, ulModuleBase, ulModuleSize))
    {
//		::MessageBox(NULL,"SymLoadModule failed","error",MB_OK);
		cclog("SymLoadModule failed %d ( module = %s ) \n",GetLastError(),pModuleName);
		return false;
    }
    return TRUE;
}
void RFrame_Render()
{
	if (!RIsActive() && RIsFullScreen()) return;

	RRESULT isOK=RIsReadyToRender();
	if(isOK==R_NOTREADY)
		return;
	else
	if(isOK==R_RESTORED)
	{
		RMODEPARAMS ModeParams={ RGetScreenWidth(),RGetScreenHeight(),RIsFullScreen(),RGetPixelFormat() };
		RResetDevice(&ModeParams);
		cclog("devices Restored. \n");
	}

	if(timeGetTime() > g_last_mouse_move_time + RTOOLTIP_GAP)
		g_tool_tip = true;

	if(g_pFunctions[RF_RENDER])
		g_pFunctions[RF_RENDER](NULL);

	RGetDevice()->SetStreamSource(0,NULL,0,0);
	RGetDevice()->SetIndices(0);
	RGetDevice()->SetTexture(0,NULL);
	RGetDevice()->SetTexture(1,NULL);


//	Draw FPS

//	60fps 가 100점

	/*
	char buf[256];
	float fMs = 1000.f/g_fFPS;
	float fScore = 100-(fMs-(1000.f/60.f))*2;

	sprintf(buf, "FPS : %3.3f , %d triangles, %4.1f ms,score %4.1f 점",g_fFPS,gNumTrisRendered,fMs,fScore);
	RECT drawRect;
	SetRect(&drawRect, 0, 0, RGetScreenWidth(), RGetScreenHeight());
	g_lpFont->DrawText(buf, -1, &drawRect, DT_LEFT | DT_TOP, D3DCOLOR_RGBA(255, 255, 255, 255));
//
*/


/*
	for(int i=0;i<CCGetLogHistoryCount();i++)
	{
		drawRect.top=(i+1)*20;
		g_lpFont->DrawText(CCGetLogHistory(i), -1, &drawRect, DT_LEFT | DT_TOP, D3DCOLOR_RGBA(255, 255, 255, 255));
	}

*/
}
void RFrame_Destroy()
{
	if(g_pFunctions[RF_DESTROY])
		g_pFunctions[RF_DESTROY](NULL);

	cclog("Rframe_destory::closeDisplay\n");
	RCloseDisplay();

#ifdef _USE_GDIPLUS
	Gdiplus::GdiplusShutdown(g_gdiplusToken);
#endif
}
bool ZGameOnJPAuthInfo::ParseVersion()
{
	ZLocatorList* pLocatorList = ZGetConfiguration()->GetLocatorList();
	if ( pLocatorList == NULL)
		return false;


	// Launch mode
	char szTestLaunch[ 64];
	GetPrivateProfileString( "SERVER", "TESTLAUNCH", "FALSE", szTestLaunch, 64, VERSION_CONFIG_FILENAME );

	if ( stricmp( szTestLaunch, "TRUE") == 0)
		m_bAlpha = true;

#ifdef _DEBUG
	if ( m_bAlpha == true)
		cclog( "%s : Launch mode = Alpha\n", __FUNCTION__);
	else
		cclog( "%s : Launch mode = Real\n", __FUNCTION__);
#else
	if ( m_bAlpha == true)
		cclog( "Alpha launch mode\n");
#endif


	// Server list
	int nCount = 0;
	nCount = GetPrivateProfileInt( "SERVER", "COUNT", 0, VERSION_CONFIG_FILENAME);

	if ( nCount == 0)
	{
		cclog( "ERROR : The count of locator is ZERO.\n");
		ASSERT( 0);
		return false;
	}

#ifdef _DEBUG
		cclog( "%s : Server count = %d\n", __FUNCTION__, nCount);
#endif


	for ( int i = 0;  i < nCount;  i++)
	{
		char szKeyName[ 64];
		sprintf( szKeyName, "IP%d", i + 1);

		char szIP[ 64];
		GetPrivateProfileString( "SERVER", szKeyName, "", szIP, 64, VERSION_CONFIG_FILENAME );

		pLocatorList->AddIP( szIP);

#ifdef _DEBUG
		cclog( "%s : Server IP = %s\n", __FUNCTION__, szIP);
#endif
	}


	return true;
}
Example #14
0
File: main.c Project: selecli/squid
static int set_process_rlimit(void)
{
    struct rlimit rlmt;
    /* no need anymore, was used for open masses of socket
     * in order to use valgrind
     */
    return 0;

    getrlimit(RLIMIT_NOFILE, &rlmt);
    if (rlmt.rlim_max < FD_MAX) {
        rlmt.rlim_max = FD_MAX;
        rlmt.rlim_cur = rlmt.rlim_max;
    } else if (rlmt.rlim_cur < rlmt.rlim_max) {
        rlmt.rlim_cur = rlmt.rlim_max;
    }
    if (0 != setrlimit(RLIMIT_NOFILE, &rlmt)) {
        cclog(0, "set process resouce limit failed");
        return -1;
    }
    cclog(0, "set rlim_cur = rlim_max: rlim_cur->%ld, rlim_max->%ld", rlmt.rlim_cur, rlmt.rlim_max);
    return 0;
}
RRESULT OnDestroy(void *pParam)
{
	cclog("Destroy gunz\n");

	g_App.OnDestroy();

	SAFE_DELETE(g_pDefFont); 

	g_Core.Finalize();

	cclog("interface finalize.\n");

	SAFE_DELETE(g_pInput);
	g_DInput.Destroy();

	cclog("game input destroy.\n");

//	RGetShaderMgr()->Release();

	ZGetConfiguration()->Destroy();

	cclog("game gonfiguration destroy.\n");

	delete g_pDC;

	struct _finddata_t c_file;
	intptr_t hFile;
	char szFileName[256];
#define FONT_DIR	"Font/"
#define FONT_EXT	"ttf"
	if( (hFile = _findfirst(FONT_DIR"*."FONT_EXT, &c_file )) != -1L ){
		do{
			strcpy(szFileName, FONT_DIR);
			strcat(szFileName, c_file.name);
			RemoveFontResource(szFileName);
		}while( _findnext( hFile, &c_file ) == 0 );
		_findclose(hFile);
	}

	CCFontManager::Destroy();
	CCBitmapManager::Destroy();
	CCBitmapManager::DestroyAniBitmap();

	cclog("Bitmap manager destroy Animation bitmap.\n");


//	ZBasicInfoItem::Release(); 
//	ZGetStencilLight()->Destroy();
//	LightSource::Release();
	RBspObject::DestroyShadeMap();
	RDestroyLenzFlare();
	RAnimationFileMgr::GetInstance()->Destroy();
	ZStringResManager::ResetInstance();
	cclog("destroy gunz finish.\n");

	return R_OK;
}
int RRun()
{
	if(g_pFunctions[RF_CREATE])
	{
		if(g_pFunctions[RF_CREATE](NULL)!=R_OK)
		{
			RFrame_Destroy();
			return -1;
		}
	}
	cclog("Init RFrame_Init().\n");
	RFrame_Init();

	// message loop
    // Now we're ready to recieve and process Windows messages.
    BOOL bGotMsg;
    MSG  msg;
//    PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );

    do
    {
        // Use PeekMessage() if the app is active, so we can use idle time to
        // render the scene. Else, use GetMessage() to avoid eating CPU time.
//        if( g_bActive )
            bGotMsg = PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE );
//        else
//            bGotMsg = GetMessage( &msg, NULL, 0U, 0U );

		if( bGotMsg )
		{
			// WM_USER 이상의 메시지는 처리하지 않는다. 이것은 일본어 IME의 팝업메뉴 호출을 막기 위한 처리다.
			// (팝업메뉴가 코드진행을 멈추게하는 특성을 유저들이 무적어뷰즈로 악용하기 때문)
			// WM_USER+25는 건즈내부에서 사용하고 있으므로 WM_USER+25가 넘어간 메시지부터는 버린다.
			if (msg.message <= WM_USER +25)
			{
				TranslateMessage( &msg );
				DispatchMessage( &msg );
			}
        }
		else
		{
			RFrame_UpdateRender();
		}

		if(!g_bActive)
			Sleep(10);
    }while( WM_QUIT != msg.message  );
    return (INT)msg.wParam;
}
void CCMatchShutdown::Notify(int nIndex)
{
	char* pszMsg = m_ShutdownNotifyArray[nIndex]->GetString();
	CCMatchServer* pServer = CCMatchServer::GetInstance();
	
	CCCommand* pCmd = pServer->CreateCommand(MC_ADMIN_ANNOUNCE, CCUID(0,0));
	pCmd->AddParameter(new CCCmdParamCCUID(CCUID(0,0)));
	pCmd->AddParameter(new CCCmdParamStr(pszMsg));
	pCmd->AddParameter(new CCCmdParamUInt(ZAAT_CHAT));
	pServer->RouteToAllClient(pCmd);

#ifdef _DEBUG
	cclog( "CCMatchShutdown::Notify - Notify : %s\n", pszMsg );
#endif
}
Example #18
0
bool ZLocale::CreateAuthInfo()
{
//	if (m_pAuthInfo) delete m_pAuthInfo;
//	m_pAuthInfo = NULL;
#ifdef _INDEPTH_DEBUG_
	cclog("ZLocale::CreateAuthInfo() returning NULL since authentication is not a issue.\n");
#endif
/*	switch (m_iCountry)
	{
	case CCC_KOREA:
		{
#ifdef LOCALE_KOREA
			m_pAuthInfo = new ZNetmarbleAuthInfo();
#endif // LOCALE_KOREA
		}
		break;
	case CCC_JAPAN:
		{
#ifdef LOCALE_JAPAN
			m_pAuthInfo = new ZGameOnJPAuthInfo();
#endif // LOCALE_JAPAN
		}
		break;

	case CCC_NHNUSA :
		{
#ifdef LOCALE_NHNUSA
			m_pAuthInfo = new ZNHN_USAAuthInfo();
			if( 0 == m_pAuthInfo ) return false;
			//if( !((ZNHN_USAAuthInfo*)m_pAuthInfo)->InitAuth() )
			//{
			//	delete m_pAuthInfo;
			//	m_pAuthInfo = 0;
			//	return false;
			//}

			return true;
#endif 
		}
		break;
	default:
		{

		}
	};
*/
	return true;
}
Example #19
0
int mark_bad_ip(struct in_addr addr)
{
	int i;
	for(i = 0; i < ip_num; i++)
	{
		if(memcmp(&host_ip[i].m_addr, &addr, sizeof(struct in_addr)) == 0)
		{
			host_ip[i].good_ip = 0;
			good_ip_num--;
			return 0;
		}
	}

	cclog(2, "in mark_bad_ip, can't find addr of %s", inet_ntoa(addr));
	return -1;
}
Example #20
0
int rf_epoll_mod(int fd,int flag){ 
	rf_client *rfc = &fd_table[fd];

	struct epoll_event cevent;
	memset(&cevent, 0, sizeof(struct epoll_event));
	cevent.events = flag;
	cevent.data.fd = fd;

	rfc->epoll_flag = flag;

	if( epoll_ctl(kdpfd, EPOLL_CTL_MOD, fd, &cevent) == -1 ) {
		cclog(2,"epoll_ctl fail: %s,fd:%d\n", strerror(errno),fd);
		return RF_ERR_EPOLL;
	}

	return RF_OK;
}
int RInitD3D( RMODEPARAMS* pModeParams )
{
	RFrame_Create();

	ShowWindow(g_hWnd,SW_SHOW);
	if(!RInitDisplay(g_hWnd,pModeParams))
	{
		cclog("can't init display\n");
		return -1;
	}

	//RBeginScene();
	RGetDevice()->Clear(0 , NULL, D3DCLEAR_TARGET, 0x00000000, 1.0f, 0 );
//	REndScene();
	RFlip();

	return 0;
}
RRESULT OnError(void *pParam)
{
	cclog("RealSpace::OnError(%d) \n", RGetLastError());

	switch (RGetLastError())
	{
	case RERROR_INVALID_DEVICE:
		{
			D3DADAPTER_IDENTIFIER9 *ai=RGetAdapterID();
			char szLog[512];
			ZTransMsg( szLog, MSG_DONOTSUPPORT_GPCARD, 1, ai->Description);

			int ret=MessageBox(NULL, szLog, ZMsg( MSG_WARNING), MB_YESNO);
			if(ret!=IDYES)
				return R_UNKNOWN;
		}
		break;
	case RERROR_CANNOT_CREATE_D3D:
		{
			ShowCursor(TRUE);

			char szLog[512];
			sprintf(szLog, ZMsg( MSG_DIRECTX_NOT_INSTALL));

			int ret=MessageBox(NULL, szLog, ZMsg( MSG_WARNING), MB_YESNO);
			if(ret==IDYES)
			{
				ShellExecute(g_hWnd, "open", ZMsg( MSG_DIRECTX_DOWNLOAD_URL), NULL, NULL, SW_SHOWNORMAL); 
			}
		}
		break;

	};

	return R_OK;
}
Example #23
0
static int init_host_ip_from_file(char *file)
{

	FILE *fp;
	static char addrbuf[32];
	int a1 = 0, a2 = 0, a3 = 0, a4 = 0;
	struct in_addr A;
	char x;


	memset(host_ip, 0, sizeof(host_ip));
	ip_num = 0;
	good_ip_num = 0;
	pos = 0;

	assert(file);

	if((fp = fopen(file, "r")) == NULL)
	{
		cclog(0, "can not open file: %s", file);
		abort();
	}

	int i = 0;
	while(fgets(addrbuf, 32 - 1, fp))
	{
		if(addrbuf[strlen(addrbuf) - 1] == '\n')
			addrbuf[strlen(addrbuf) - 1] = '\0';

		if(strlen(addrbuf) == 0)
			continue;

		if(sscanf(addrbuf, "%d.%d.%d.%d%c", &a1, &a2, &a3, &a4, &x) == 4)
		{
			if (a1 < 0 || a1 > 255)
				goto out1;
			if (a2 < 0 || a2 > 255)
				goto out1;
			if (a3 < 0 || a3 > 255)
				goto out1;
			if (a4 < 0 || a4 > 255)
				goto out1;

			snprintf(addrbuf, 32, "%d.%d.%d.%d", a1, a2, a3, a4);
			A.s_addr = inet_addr(addrbuf);

			host_ip[i].m_addr = A;
			host_ip[i].good_ip = 1;



			if(i <= MAX_CA_IP - 1)
			{
				i++;
				ip_num++;
				good_ip_num++;
				continue;
			}
			else
			{
				cclog(1, "ca ip list full, out now!");
				break;
			}

out1:
			cclog(1, "error host ip format of: %s", addrbuf);
			continue;
		}
		else
		{
			cclog(1, "error host ip format of: %s", addrbuf);
			continue;
		}

	}

	if(fp)
		fclose(fp);

	cclog(3, "after init ca ip table, we get %d ip", ip_num);

	if(ip_num > 0)
                return 0;
        else
	{
		cclog(1, "get ca ip failed");
		abort();
	}
}
void CCQuestLevel::InitCurrSector(CCMATCH_GAMETYPE eGameType)
{
	// npc queue 세팅
	CCMatchQuest* pQuest = CCMatchServer::GetInstance()->GetQuest();
	
	int nNPCSetID = 0;

	if( m_DynamicInfo.nCurrSectorIndex < (int)m_StaticInfo.pScenario->Maps[m_StaticInfo.nDice].vecNPCSetArray.size() )
	{
		nNPCSetID = m_StaticInfo.pScenario->Maps[m_StaticInfo.nDice].vecNPCSetArray[m_DynamicInfo.nCurrSectorIndex];
	}
	else
	{
		_ASSERT( 0 && "NPC set의 크기에 문제가 있음. 리소스 검사가 필요함." );
		cclog( "NPC set의 크기에 문제가 있음. 리소스 검사가 필요함.\n" );
		return;
	}

	CCQuestNPCSetInfo* pNPCSetInfo = pQuest->GetNPCSetInfo(nNPCSetID);

	m_NPCQueue.Clear();

	m_DynamicInfo.bCurrBossSector = false;

	if (CCGetGameTypeMgr()->IsQuestOnly(eGameType))
	{
		// 만약 키 NPC가 있고, 마지막 섹터이면 키 NPC 세팅
		if ((m_StaticInfo.pScenario->Maps[m_StaticInfo.nDice].nKeyNPCID != 0) &&
			(m_DynamicInfo.nCurrSectorIndex == GetMapSectorCount() - 1))
		{
			m_NPCQueue.Make(m_StaticInfo.nQLD, pNPCSetInfo, CCQUEST_NPC(m_StaticInfo.pScenario->Maps[m_StaticInfo.nDice].nKeyNPCID));
			if (m_StaticInfo.pScenario->Maps[m_StaticInfo.nDice].bKeyNPCIsBoss)
			{
				m_DynamicInfo.bCurrBossSector = true;
			}
		}
		else
		{
			m_NPCQueue.Make(m_StaticInfo.nQLD, pNPCSetInfo);
		}
	}
	else if (CCGetGameTypeMgr()->IsSurvivalOnly(eGameType))
	{
		const int nCurrSector = m_DynamicInfo.nCurrSectorIndex;
		const std::vector<int>& vecKeyNpc = m_StaticInfo.pScenario->Maps[m_StaticInfo.nDice].vecKeyNPCArray;

		// 이 섹터의 키NPC를 세팅
		int keyNpcID = NPC_NONE;
		if (nCurrSector < (int)vecKeyNpc.size())
		{
			keyNpcID = vecKeyNpc[nCurrSector];
		}

		if (keyNpcID != NPC_NONE)
		{
			m_NPCQueue.Make(m_StaticInfo.nQLD, pNPCSetInfo, CCQUEST_NPC(keyNpcID));
			m_DynamicInfo.bCurrBossSector = false;	// 서바이벌엔 보스가 없다(몹은 보스용 몹이지만 퀘스트에서의 보스처럼 다루지 않음)
		}
		else
		{
			m_NPCQueue.Make(m_StaticInfo.nQLD, pNPCSetInfo);
		}
	}
	else
		_ASSERT(0);

	// spawn index 세팅
	memset(m_SpawnInfos, 0, sizeof(m_SpawnInfos));

	int nSectorID = m_StaticInfo.SectorList[m_DynamicInfo.nCurrSectorIndex].nSectorID;

	if (CCGetGameTypeMgr()->IsQuestOnly(eGameType))
		m_DynamicInfo.pCurrSector = pQuest->GetSectorInfo(nSectorID);
	else if (CCGetGameTypeMgr()->IsSurvivalOnly(eGameType))
		m_DynamicInfo.pCurrSector = pQuest->GetSurvivalSectorInfo(nSectorID);
	else
		ASSERT(0);
}
Example #25
0
int rf_parse_dir(xmlNodePtr cur,rf_cli_session *sess){
	if(sess->params == NULL){
		sess->params = cc_malloc(sizeof(rf_cli_dir_params));
	}

	rf_cli_dir_params *dir_params = (rf_cli_dir_params *)sess->params;

	bool b_action = false;
	bool b_dir = false;

	while (cur != NULL) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)"action"))){
			xmlChar *key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
			dir_params->action = strtol((const char *)key, (char **)NULL, 10);
			b_action = true;

			cclog(4,"action : %s", key);
			xmlFree(key);
		}

		if ((!xmlStrcmp(cur->name, (const xmlChar *)"report_address"))){
			xmlChar *key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
			if(dir_params->report_address == NULL){
				dir_params->report_address = strdup((const char *)key);
			}

			cclog(4,"report_address: %s", dir_params->report_address);
			xmlFree(key);
		}

		if ((!xmlStrcmp(cur->name, (const xmlChar *)"dir"))){
			xmlChar *key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
			cclog(4,"dir : %s", key);

			if(xmlStrlen(key) > strlen("http://")){
				rf_url_list * url = cc_malloc(sizeof(rf_url_list));
				url->buffer = cc_malloc(xmlStrlen(key) + 1);
				strcpy(url->buffer,(char *)key);
				url->len = xmlStrlen(key);

				assert(sess->url_list == NULL);
				sess->url_list = url;
				b_dir = true;
			}
			else{
				cclog(1,"invalid url : %s",key);
				xmlFree(key);
				return RF_ERR_XML_INVALID_URL;
			}

			xmlFree(key);
		}

		cur = cur->next;
	}

	if(!(b_action && b_dir)){
		return RF_ERR_XML_PARSE;
	}

	return RF_OK;
}
Example #26
0
int rf_xml_parse(rf_cli_session *sess,const char *buffer,int size){
	int ret = RF_OK;
	if(NULL == (doc = xmlParseMemory(buffer,size))){
		cclog(3,"Document not parsed successfully.[%s]", buffer);
		return RF_ERR_XML_PARSE;
	}

	if(NULL == (cur = xmlDocGetRootElement(doc))){
		cclog(1,"empty document.");
		ret = RF_ERR_XML_PARSE;
		goto OUT;
	}

	if (xmlStrcmp(cur->name, (const xmlChar *) "method")) {
		cclog(1,"document of the wrong type, root node != method.");
		ret = RF_ERR_XML_PARSE;
		goto OUT;
	}

	xmlChar *method_name , *sessid;
	if(NULL == (method_name = xmlGetProp(cur,(const xmlChar *)"name"))){
		cclog(1,"get method name error!");
		ret = RF_ERR_XML_PARSE;
		goto OUT;
	}

	if(NULL == (sessid = xmlGetProp(cur,(const xmlChar *)"sessionid"))){
		cclog(1,"get sessionid error!");
		xmlFree(method_name);
		ret = RF_ERR_XML_PARSE;
		goto OUT;
	}

	cclog(4,"method name : %s,session id : %s",method_name,sessid);

	sess->method = action_atoi((char *)method_name);
	strcpy(sess->sessionid,(char *)sessid);

	xmlFree(method_name);
	xmlFree(sessid);

	cur = cur->xmlChildrenNode;
	switch (sess->method){
		case RF_FC_ACTION_URL_PURGE :
		case RF_FC_ACTION_URL_EXPIRE:
			ret = rf_parse_url(cur,sess);
			break;
		case RF_FC_ACTION_DIR_PURGE:
			if(!config.enable_dir_purge)
			{
				cclog(1,"Do not support dir purge!");
				ret = RF_ERR_XML_PARSE;
				break;
			}
		case RF_FC_ACTION_DIR_EXPIRE:
			ret = rf_parse_dir(cur,sess);
			break;
		default:
			cclog(1,"can not process method : %s",action_itoa(sess->method));
			break;
	};

OUT:
	xmlFreeDoc(doc);
	doc = NULL;
	return ret;
}
Example #27
0
bool ZWorld::Create(ZLoadingProgress *pLoading )
{
	if(m_bCreated) return true;
	
	m_pBsp = new RBspObject;
#ifndef _DEBUG
	const char* descExt = "xml.mef";
#else
	const char* descExt = "xml";
#endif
	if(!m_pBsp->Open(m_szBspName, descExt, RBspObject::ROF_RUNTIME,ZWorldProgressCallBack,pLoading))
	{
		CCLog("error while loading %s \n",m_szName);
		// 맵로딩에 실패하면 저장해둔 맵정보를 모두 지워준다.(버그수정:로딩에 실패할경우 실패된 맵정보를 그냥 저장 했었다)
		ZGetWorldManager()->Clear();
		return false;
	}

	m_pBsp->OptimizeBoundingBox();


	char szMapPath[64] = "";
	ZGetCurrMapPath(szMapPath);

	ZWater*		water_instance;
	RMapObjectList* map_object_list		= m_pBsp->GetMapObjectList();
	RMeshMgr* mesh_mgr					= m_pBsp->GetMeshManager();

	for( RMapObjectList::iterator iter = map_object_list->begin(); iter != map_object_list->end(); )
	{
		ROBJECTINFO* object_info		= *iter;
		RMesh* pMesh						= mesh_mgr->GetFast( object_info->nMeshID );
		if( pMesh->m_data_num <= 0 )
		{
			++iter;
			continue;
		}
		RMeshNode* pMeshNode		= pMesh->m_data[0];

		char* object_name = (char*)object_info->name.c_str();

//		m_pBsp->m_filename.c_str()
		int len = int(strlen(m_szName)+1);
		object_name += len;
/*
		while(1) {
			if( object_name[0] == '_' ) {
				++object_name;
				break;
			}
			++object_name;
		}
*/
		if( pMeshNode->m_point_color_num > 0 ) // 맵에서 칼라값을 하나 이상 갖는 놈은 깃발이다.. 현재..
		{
			ZClothEmblem* new_instance	= new ZClothEmblem;
			new_instance->CreateFromMeshNode( pMeshNode , this );
			m_flags.Add( new_instance, object_name );
			iter	= map_object_list->Delete( iter );
			continue;
		}

		// Sky Box...
		if( m_pSkyBox == NULL )
		{
			if( strncmp(object_name,"obj_sky_", 8) == 0  || 
				strncmp(object_name,"obj_ef_sky", 10) == 0 )
//			if( strncmp(object_name,"obj_sky_", 8) == 0 ) 
			{
				m_pSkyBox	= new ZSkyBox;
				m_pSkyBox->Create( pMesh->m_pVisualMesh );
//				iter = map_object_list->Delete( iter );
				ROBJECTINFO *info=*iter;
				delete info;
				iter = map_object_list->erase( iter );
				continue;
			}
		}

		// Water
//		if( g_pGame->m_bReflection )
		{
			// 임시....
			int nWater = 0;

			if( !strncmp( object_name, "obj_water", 9 ) )	nWater = 1;
			if( !strncmp( object_name, "obj_water2", 10 ) )	nWater = 3;//일렁임은 제거..
			if( !strncmp( object_name, "obj_sea", 7 ) )		nWater = 2;

			if( nWater ) {
				m_bWaterMap = true;
				m_fWaterHeight = pMeshNode->m_mat_base._42;
			}
			else {
				m_bWaterMap = false;
				m_fWaterHeight = 0.f;
			}

			if(nWater)	
//			if( !strncmp( object_name, "obj_water", 9 ) )
			{
				int id = object_info->nMeshID;

				RMesh* mesh = mesh_mgr->GetFast(id);
				RMeshNode* node = mesh->m_data[0];

				water_instance = new ZWater;

				water_instance->SetMesh(node);
				m_waters.push_back( water_instance );

					 if(nWater==1) water_instance->m_nWaterType = WaterType1;
//				else if(nWater==2) water_instance->m_nWaterType = WaterType1;
				else if(nWater==3) water_instance->m_nWaterType = WaterType2;
	

				if(nWater==2) 
				{ // 물 예외 처리 가능할때 통합..
//					water_instance->m_nWaterType = 1;//sea
					water_instance->m_isRender = false; // 안 그리고 오브젝트로 그린다..
					pMesh->m_LitVertexModel = true;		// 바다는 라이트 영향을 안받는다..
					++iter;
				}
				else 
				{
					iter = map_object_list->Delete( iter );
				}

//				iter = map_object_list->Delete( iter );

				continue;
			}
		}

		++iter;
	}

	char szBuf[128];
	
	if(  m_flags.size() > 0 )
	{
		sprintf( szBuf, "%s%s/flag.xml", szMapPath, ZGetGameClient()->GetMatchStageSetting()->GetMapName());
		m_flags.InitEnv(szBuf);

		// cclog("ZGame::Create() m_flags.InitEnv \n");
		cclog( "create game enrvironment.\n" );
	}

	m_pMapDesc = new ZMapDesc;
	m_pMapDesc->Open(m_pBsp);

	sprintf( szBuf, "%s%s/smoke.xml", szMapPath, ZGetGameClient()->GetMatchStageSetting()->GetMapName());
	m_pMapDesc->LoadSmokeDesc(szBuf);

	// cclog("ZGame::Create() pMapDesc->LoadSmokeDesc \n");

	// 맵레벨의 전역값 설정
	FogInfo finfo = GetBsp()->GetFogInfo();
	m_bFog = finfo.bFogEnable;
	m_fFogNear = finfo.fNear;
	m_fFogFar = finfo.fFar;
	m_dwFogColor = finfo.dwFogColor;

	m_bCreated = true;

	cclog( "game world create success.\n" );

	return true;
}
Example #28
0
int parse_url_list(xmlNodePtr cur,char *token,rf_cli_session *sess){
	xmlChar *key,*id;
	cur = cur->xmlChildrenNode;

	bool b_find = false;

	while (cur != NULL) {
		if ((!xmlStrcmp(cur->name, (const xmlChar *)token))) {
			key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
			if(! (key && xmlStrlen(key))){
					xmlFree(key);
					goto NEXT;
			}

			id = xmlGetProp(cur,(const xmlChar *)"id");
			if(! (id && xmlStrlen(id))){
					xmlFree(id);
					xmlFree(key);
					goto NEXT;
			}

			b_find = true;

			rf_url_list * url = cc_malloc(sizeof(rf_url_list));
			url->buffer = cc_malloc(xmlStrlen(key) + 1);
			strcpy(url->buffer,(char *)key);

			/*
			//here we don't want to decode '&'
			char *c,*d;
			while((c = strstr(url->buffer,"%26")) != NULL){
			 *c++ = '&';
			 d = c + 2;
			 while((*d) != '\0') *c++ = *d++;
			 *c = '\0';
			 }
			 */

			url->len = xmlStrlen(key);
			url->id = strtoll((const char *)id, (char **)NULL, 10);

			xmlFree(key);
			xmlFree(id);

			/* Add Start: url remove host, by xin.yao, 2012-03-04 */
			urlRemoveHost(url);
			/* Add Ended: by xin.yao */

			cclog(4,"url: %s,id : %"PRINTF_UINT64_T, url->buffer,url->id);

			//add to url list
			if(sess->url_list == NULL){
				sess->url_list = url;
			}else{
				url->next = sess->url_list;
				sess->url_list = url;
			}

			sess->url_number++;
		}

NEXT:
		cur = cur->next;
	}

	return b_find ? RF_OK : RF_ERR_XML_PARSE;
}
bool ZGameClient::OnCommand(CCCommand* pCommand)
{
	bool ret;
	ret = CCMatchClient::OnCommand(pCommand);

#ifdef _LOG_ENABLE_CLIENT_COMMAND_
	char buf[256];
	sprintf(buf,"[ID:%d]: %s\n", pCommand->GetID(), pCommand->GetDescription());
	OutputDebugString(buf);
#endif

	switch(pCommand->GetID()){
		case MC_NET_ONDISCONNECT:
			{

			}
			break;
		case MC_NET_ONERROR:
			{

			}
			break;
		case ZC_CHANGESKIN:
			{
				char szSkinName[256];
				pCommand->GetParameter(szSkinName, 0, MPT_STR, sizeof(szSkinName) );
				if(ZApplication::GetGameInterface()->ChangeInterfaceSkin(szSkinName))
				{
					CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Change Skin To %s", szSkinName);
				}
				else
				{
					CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Change Skin Failed");
				}
			}
			break;
		case MC_ADMIN_TERMINAL:
			{
				#ifndef _PUBLISH
					char szText[65535]; szText[0] = 0;
					CCUID uidChar;

					pCommand->GetParameter(&uidChar, 0, MPT_UID);
					pCommand->GetParameter(szText, 1, MPT_STR, sizeof(szText) );
					OutputToConsole(szText);
				#endif
			}
			break;
		case MC_NET_CHECKPING:
			{
				CCUID uid;
				if (pCommand->GetParameter(&uid, 0, MPT_UID)==false) break;
				CCCommand* pNew = new CCCommand(m_CommandManager.GetCommandDescByID(MC_NET_PING), uid, m_This);
				pNew->AddParameter(new CCCommandParameterUInt(timeGetTime()));
				Post(pNew);
				return true;
			}
		case MC_NET_PING:
			{
				unsigned int nTimeStamp;
				if (pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT)==false) break;
				CCCommand* pNew = new CCCommand(m_CommandManager.GetCommandDescByID(MC_NET_PONG), pCommand->m_Sender, m_This);
				pNew->AddParameter(new CCCommandParameterUInt(nTimeStamp));
				Post(pNew);
				return true;
			}
		case MC_NET_PONG:
			{
				int nTimeStamp;
				pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT);

				CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Ping from (%u:%u) = %d", pCommand->GetSenderUID().High, pCommand->GetSenderUID().Low, timeGetTime()-nTimeStamp);
			}
			break;
		case MC_UDP_PONG:
			{
				unsigned int nIp, nTimeStamp;
				pCommand->GetParameter(&nIp, 0, MPT_UINT);
				pCommand->GetParameter(&nTimeStamp, 1, MPT_UINT);

				ZApplication::GetGameInterface()->SetAgentPing(nIp, nTimeStamp);
			}
			break;
		case MC_HSHIELD_PING:
			{
			/*	unsigned int nTimeStamp;

				if(pCommand->GetParameter(&nTimeStamp, 0, MPT_UINT) == false) break;
				
				CCCommandParameter* pParam = pCommand->GetParameter(1);
				if(pParam->GetType() != MPT_BLOB) 	break;
				void* pBlob = pParam->GetPointer();
				int nCount = CCGetBlobArrayCount(pBlob);

				unsigned char* pReqMsg = (unsigned char*)CCGetBlobArrayElement(pBlob, 0);
				
				DWORD dwRet = _AhnHS_MakeAckMsg(pReqMsg, ZGetMyInfo()->GetSystemInfo()->pbyAckMsg);

				if(dwRet != ERROR_SUCCESS)
					cclog("Making Ack Msg Failed. (Error code = %x)\n", dwRet);

				CCCommand* pNew = new CCCommand(m_CommandManager.GetCommandDescByID(MC_HSHIELD_PONG), pCommand->m_Sender, m_This);
				pNew->AddParameter(new CCCommandParameterUInt(nTimeStamp));
				void* pBlob2 = CCMakeBlobArray(sizeof(unsigned char), SIZEOF_ACKMSG);
				unsigned char* pCmdBlock = (unsigned char*)CCGetBlobArrayElement(pBlob2, 0);
				CopyMemory(pCmdBlock, ZGetMyInfo()->GetSystemInfo()->pbyAckMsg, SIZEOF_ACKMSG);

				pNew->AddParameter(new CCCmdParamBlob(pBlob2, CCGetBlobArraySize(pBlob2)));
//				CCEraseBlobArray(pBlob);
				CCEraseBlobArray(pBlob2);
				Post(pNew);
			*/
				return true;
			}
			break;
		case ZC_CON_CONNECT:
			{
				char szBuf[256];
				sprintf(szBuf, "Net.Connect %s:%d", ZGetConfiguration()->GetServerIP(), 
													ZGetConfiguration()->GetServerPort());
				ConsoleInputEvent(szBuf);
				SetServerAddr(ZGetConfiguration()->GetServerIP(), ZGetConfiguration()->GetServerPort());
			}
			break;
		case ZC_CON_DISCONNECT:
			{
				ConsoleInputEvent("Net.Disconnect");
			}
			break;
		case ZC_CON_CLEAR:
			{
				if (ZGetConsole()) ZGetConsole()->ClearMessage();
			}
			break;
		case ZC_CON_HIDE:
			{
				if (ZGetConsole()) ZGetConsole()->Show(false);
			}
			break;
		case ZC_CON_SIZE:
			{
				if (ZGetConsole())
				{
					int iConWidth, iConHeight;
					pCommand->GetParameter(&iConWidth, 0, MPT_INT);
					pCommand->GetParameter(&iConHeight, 1, MPT_INT);
					if ((iConWidth > 30) && (iConHeight > 30))
					{
						sPoint point = ZGetConsole()->GetPosition();
						ZGetConsole()->SetBounds(point.x, point.y, iConWidth, iConHeight);
					}
				}
			}
			break;
		case MC_CLOCK_SYNCHRONIZE:
			{
				unsigned long int nGlobalClock;
				pCommand->GetParameter(&nGlobalClock, 0, MPT_UINT);


				unsigned long int nLocalClock = GetClockCount();

				if (nGlobalClock > nLocalClock) m_bIsBigGlobalClock = true;
				else m_bIsBigGlobalClock = false;
				m_nClockDistance = ZGetClockDistance(nGlobalClock, nLocalClock);
			}
			break;
#ifdef _DEBUG
		case ZC_TEST_SETCLIENT1:
			{
				char szBuf[256];
				sprintf(szBuf, "peer.setport 10000");
				ConsoleInputEvent(szBuf);
				sprintf(szBuf, "peer.addpeer 127.0.0.1 10001");
				ConsoleInputEvent(szBuf);

				CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Done SetClient1");
			}
			break;
		case ZC_TEST_SETCLIENT2:
			{
				char szBuf[256];
				sprintf(szBuf, "peer.setport 10001");
				ConsoleInputEvent(szBuf);
				sprintf(szBuf, "peer.addpeer 127.0.0.1 10000");
				ConsoleInputEvent(szBuf);

				CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Done SetClient2");
			}
			break;
		case ZC_TEST_SETCLIENTALL:
			{
				char szMyIP[256];
				pCommand->GetParameter(szMyIP, 0, MPT_STR, sizeof(szMyIP) );

				
				char szBuf[256];
				char szIPs[][256] = { "192.168.0.100", "192.168.0.111", "192.168.0.10", 
					                  "192.168.0.11", "192.168.0.16", "192.168.0.20",
				                      "192.168.0.25", "192.168.0.30", "192.168.0.32",
										"192.168.0.200", "192.168.0.15", "192.168.0.17"};
				sprintf(szBuf, "peer.setport 10000");
				ConsoleInputEvent(szBuf);

				for (int i = 0; i < 12; i++)
				{
					if (!strcmp(szMyIP, szIPs[i])) continue;
					sprintf(szBuf, "peer.addpeer %s 10000", szIPs[i]);
					ConsoleInputEvent(szBuf);
				}

				CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Done SetClient All");
			}
			break;
#endif
#ifndef _PUBLISH
		case ZC_TEST_BIRD1:
			{
				OnBirdTest();
			}
			break;
#endif
		case MC_MATCH_NOTIFY:
			{
				unsigned int nMsgID = 0;
				if (pCommand->GetParameter(&nMsgID, 0, MPT_UINT) == false) break;

				OnMatchNotify(nMsgID);
			}
			break;
		case MC_MATCH_BRIDGEPEER_ACK:
			{
				CCUID uidChar;
				int nCode;
				pCommand->GetParameter(&uidChar, 0, MPT_UID);
				pCommand->GetParameter(&nCode, 1, MPT_INT);
				OnBridgePeerACK(uidChar, nCode);
			}
			break;
		case MC_MATCH_STAGE_RESPONSE_FORCED_ENTRY:			// 난입
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				if (nResult == MOK)
				{
					OnForcedEntryToGame();
				}
				else
				{
					ZApplication::GetGameInterface()->ShowMessage("난입할 수 없습니다.");
				}
			}
			break;
		case MC_MATCH_STAGE_JOIN:
			{
				CCUID uidChar, uidStage;
				unsigned int nRoomNo=0;
				char szStageName[256]="";

				pCommand->GetParameter(&uidChar, 0, MPT_UID);
				pCommand->GetParameter(&uidStage, 1, MPT_UID);
				pCommand->GetParameter(&nRoomNo, 2, MPT_UINT);
				pCommand->GetParameter(szStageName, 3, MPT_STR, sizeof(szStageName) );

				OnStageJoin(uidChar, uidStage, nRoomNo, szStageName);
			}
			break;
		case MC_MATCH_STAGE_LEAVE:
			{
				CCUID uidChar, uidStage;

				pCommand->GetParameter(&uidChar, 0, MPT_UID);
				pCommand->GetParameter(&uidStage, 1, MPT_UID);

				OnStageLeave(uidChar, uidStage);
			}
			break;
		case MC_MATCH_STAGE_START:
			{
				CCUID uidChar, uidStage;
				int nCountdown;

				pCommand->GetParameter(&uidChar, 0, MPT_UID);
				pCommand->GetParameter(&uidStage, 1, MPT_UID);
				pCommand->GetParameter(&nCountdown, 2, MPT_INT);

				OnStageStart(uidChar, uidStage, nCountdown);
			}
			break;

		case MC_MATCH_STAGE_LAUNCH:
			{
				CCUID uidStage;
				char szMapName[_MAX_DIR];

				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) );
				OnStageLaunch(uidStage, szMapName);
			}
			break;

		case MC_MATCH_STAGE_RELAY_LAUNCH :
			{
				CCUID uidStage;
				bool bIsIgnore;
				char szMapName[_MAX_DIR];

				pCommand->GetParameter(&uidStage,	0, MPT_UID);
				pCommand->GetParameter(szMapName,	1, MPT_STR, sizeof(szMapName) );
				pCommand->GetParameter(&bIsIgnore,	2, MPT_BOOL);

				if( !bIsIgnore ) OnStageLaunch(uidStage, szMapName);
				else {
					m_bForcedEntry = true;
					ZApplication::GetGameInterface()->SerializeStageInterface();
				}				
			}
			break;

		case MC_MATCH_STAGE_FINISH_GAME:
			{
				bool bIsRelayMapUnFinish;
				CCUID uidStage;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				pCommand->GetParameter(&bIsRelayMapUnFinish, 1, MPT_BOOL);
				
				OnStageFinishGame(uidStage, bIsRelayMapUnFinish);
			}
			break;

		case MC_MATCH_STAGE_MAP:
			{
				CCUID uidStage;
				char szMapName[_MAX_DIR];

				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) );

				OnStageMap(uidStage, szMapName);
			}
			break;

		case MC_MATCH_STAGE_RELAY_MAP_INFO_UPDATE:
			{
				CCUID uidStage;
				int nRelayMapType = 0;
				int nRelayMapRepeatCount = 0;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				pCommand->GetParameter(&nRelayMapType, 1, MPT_INT );
				pCommand->GetParameter(&nRelayMapRepeatCount, 2, MPT_INT );
				CCCommandParameter* pParam = pCommand->GetParameter(3);
				if (pParam->GetType() != MPT_BLOB)	break;
				void* pRelayMapListBlob = pParam->GetPointer();
				if( NULL == pRelayMapListBlob )	break;

				OnStageRelayMapListUpdate(nRelayMapType, nRelayMapRepeatCount, pRelayMapListBlob);
			}
			break;

		case MC_MATCH_STAGE_RELAY_MAP_ELEMENT_UPDATE:
			{
				CCUID uidStage;
				int nRelayMapType = 0;
				int nRelayMapRepeatCount = 0;

				pCommand->GetParameter(&uidStage, 0, MPT_UID );
				pCommand->GetParameter(&nRelayMapType, 1, MPT_INT );
				pCommand->GetParameter(&nRelayMapRepeatCount, 2, MPT_INT );

				OnStageRelayMapElementUpdate(nRelayMapType, nRelayMapRepeatCount);
			}
			break;

		case MC_MATCH_STAGE_TEAM:
			{
				CCUID uidChar, uidStage;
				unsigned int nTeam;
				pCommand->GetParameter(&uidChar, 0, MPT_UID);
				pCommand->GetParameter(&uidStage, 1, MPT_UID);
				pCommand->GetParameter(&nTeam, 2, MPT_UINT);
				OnStageTeam(uidChar, uidStage, nTeam);
			}
			break;

		case MC_MATCH_STAGE_PLAYER_STATE:
			{
				CCUID uidChar, uidStage;
				int nObjectStageState;
				pCommand->GetParameter(&uidChar, 0, MPT_UID);
				pCommand->GetParameter(&uidStage, 1, MPT_UID);
				pCommand->GetParameter(&nObjectStageState, 2, MPT_INT);
				OnStagePlayerState(uidChar, uidStage, CCMatchObjectStageState(nObjectStageState));
			}
			break;
		case MC_MATCH_STAGE_MASTER:
			{
				CCUID uidChar, uidStage;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				pCommand->GetParameter(&uidChar, 1, MPT_UID);

				OnStageMaster(uidStage, uidChar);
			}
			break;
		case MC_MATCH_STAGE_CHAT:
			{
				CCUID uidStage, uidChar;
				static char szChat[512];
				pCommand->GetParameter(&uidChar, 0, MPT_UID);
				pCommand->GetParameter(&uidStage, 1, MPT_UID);
				pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat) );
				//check Chatting Message..jintriple3 줄 바꿈 문자 필터링
				CheckMsgAboutChat(szChat);
				OnStageChat(uidChar, uidStage, szChat);
			}
			break;
		case MC_MATCH_STAGE_LIST:
			{
				char nPrevStageCount, nNextStageCount;
				pCommand->GetParameter(&nPrevStageCount, 0, MPT_CHAR);
				pCommand->GetParameter(&nNextStageCount, 1, MPT_CHAR);

				CCCommandParameter* pParam = pCommand->GetParameter(2);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();
				int nCount = CCGetBlobArrayCount(pBlob);

				OnStageList((int)nPrevStageCount, (int)nNextStageCount, pBlob, nCount);
			}
			break;
		case MC_MATCH_CHANNEL_RESPONSE_PLAYER_LIST:
			{
				unsigned char nTotalPlayerCount, nPage;

				pCommand->GetParameter(&nTotalPlayerCount,	0, MPT_UCHAR);
				pCommand->GetParameter(&nPage,				1, MPT_UCHAR);

				CCCommandParameter* pParam = pCommand->GetParameter(2);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();
				int nCount = CCGetBlobArrayCount(pBlob);

				OnChannelPlayerList((int)nTotalPlayerCount, (int)nPage, pBlob, nCount);

			}
			break;
		case MC_MATCH_CHANNEL_RESPONSE_ALL_PLAYER_LIST:
			{
				CCUID uidChannel;

				pCommand->GetParameter(&uidChannel, 0, MPT_UID);

				CCCommandParameter* pParam = pCommand->GetParameter(1);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();
				int nCount = CCGetBlobArrayCount(pBlob);

				OnChannelAllPlayerList(uidChannel, pBlob, nCount);
			}
			break;
		case MC_MATCH_RESPONSE_FRIENDLIST:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();
				int nCount = CCGetBlobArrayCount(pBlob);

				OnResponseFriendList(pBlob, nCount);
			}
			break;
		case MC_MATCH_RESPONSE_STAGESETTING:
			{
				CCUID uidStage;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);

				CCCommandParameter* pStageParam = pCommand->GetParameter(1);
				if(pStageParam->GetType()!=MPT_BLOB) break;
				void* pStageBlob = pStageParam->GetPointer();
				int nStageCount = CCGetBlobArrayCount(pStageBlob);

				CCCommandParameter* pCharParam = pCommand->GetParameter(2);
				if(pCharParam->GetType()!=MPT_BLOB) break;
				void* pCharBlob = pCharParam->GetPointer();
				int nCharCount = CCGetBlobArrayCount(pCharBlob);

				int nStageState;
				pCommand->GetParameter(&nStageState, 3, MPT_INT);

				CCUID uidMaster;
				pCommand->GetParameter(&uidMaster, 4, MPT_UID);

				OnResponseStageSetting(uidStage, pStageBlob, nStageCount, pCharBlob, nCharCount, STAGE_STATE(nStageState), uidMaster);

				ChangeQuestStage();
			}
			break;
		case MC_MATCH_RESPONSE_PEER_RELAY:
			{
				CCUID uidPeer;
				if (pCommand->GetParameter(&uidPeer, 0, MPT_UID) == false) break;

				OnResponsePeerRelay(uidPeer);			
			}
			break;
		case MC_MATCH_LOADING_COMPLETE:
			{
				CCUID uidChar;
				int nPercent;

				if (pCommand->GetParameter(&uidChar, 0, MPT_UID) == false) break;
				if (pCommand->GetParameter(&nPercent, 1, MPT_INT) == false) break;

				OnLoadingComplete(uidChar, nPercent);
			}
			break;
		case MC_MATCH_ANNOUNCE:
			{
				unsigned int nType;
				char szMsg[256];
				pCommand->GetParameter(&nType, 0, MPT_UINT);
				pCommand->GetParameter(szMsg, 1, MPT_STR, sizeof(szMsg) );
				OnAnnounce(nType, szMsg);
			}
			break;
		case MC_MATCH_CHANNEL_RESPONSE_JOIN:
			{
				CCUID uidChannel;
				int nChannelType;
				char szChannelName[256];
				bool bEnableInterface;

				pCommand->GetParameter(&uidChannel,			0, MPT_UID);
				pCommand->GetParameter(&nChannelType,		1, MPT_INT);
				pCommand->GetParameter(szChannelName,		2, MPT_STR, sizeof(szChannelName) );
				pCommand->GetParameter(&bEnableInterface,	3, MPT_BOOL);

				const char* szChannelNameTranslated = ZGetStringResManager()->GetStringFromXml(szChannelName);

				OnChannelResponseJoin(uidChannel, (CCCHANNEL_TYPE)nChannelType, szChannelNameTranslated, bEnableInterface);
			}
			break;
		case MC_MATCH_CHANNEL_CHAT:
			{
				CCUID uidChannel, uidChar;
				char szChat[512];
				char szName[256];
				int nGrade;

				pCommand->GetParameter(&uidChannel, 0, MPT_UID);
				pCommand->GetParameter(szName, 1, MPT_STR, sizeof(szName) );
				pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat) );
				pCommand->GetParameter(&nGrade,3, MPT_INT);

				//jintriple3 줄 바꿈 문자 필터링
				//check chatting Message
				CheckMsgAboutChat(szChat);

				OnChannelChat(uidChannel, szName, szChat, nGrade);
			}
			break;
		case MC_MATCH_CHANNEL_LIST:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();
				int nCount = CCGetBlobArrayCount(pBlob);
				OnChannelList(pBlob, nCount);
			}
			break;
		case MC_MATCH_CHANNEL_RESPONSE_RULE:
			{
				CCUID uidChannel;
				pCommand->GetParameter(&uidChannel, 0, MPT_UID);
				char szRuleName[128];
				pCommand->GetParameter(szRuleName, 1, MPT_STR, sizeof(szRuleName) );

				OnChannelResponseRule(uidChannel, szRuleName);
			}
			break;
		case MC_MATCH_RESPONSE_RECOMMANDED_CHANNEL:
			{
				CCUID uidChannel;
				pCommand->GetParameter(&uidChannel, 0, MPT_UID);

				OnResponseRecommandedChannel(uidChannel);
			}
			break;
		case MC_ADMIN_ANNOUNCE:
			{
				char szChat[512];
				unsigned long int nMsgType = 0;

				pCommand->GetParameter(szChat, 1, MPT_STR, sizeof(szChat) );
				pCommand->GetParameter(&nMsgType, 2, MPT_UINT);

				OnAdminAnnounce(ZGetStringResManager()->GetStringFromXml(szChat), ZAdminAnnounceType(nMsgType));
			}
			break;
		case MC_MATCH_GAME_LEVEL_UP:
			{
				CCUID uidChar;
				pCommand->GetParameter(&uidChar, 0, MPT_UID);

				OnGameLevelUp(uidChar);
			}
			break;
		case MC_MATCH_GAME_LEVEL_DOWN:
			{
				CCUID uidChar;
				pCommand->GetParameter(&uidChar, 0, MPT_UID);

				OnGameLevelDown(uidChar);
			}
			break;
		case MC_MATCH_RESPONSE_GAME_INFO:
			{
				CCUID uidStage;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);

				CCCommandParameter* pParam = pCommand->GetParameter(1);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pGameInfoBlob = pParam->GetPointer();

				pParam = pCommand->GetParameter(2);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pRuleInfoBlob = pParam->GetPointer();

				pParam = pCommand->GetParameter(3);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pPlayerInfoBlob = pParam->GetPointer();

				OnResponseGameInfo(uidStage, pGameInfoBlob, pRuleInfoBlob, pPlayerInfoBlob);
			}
			break;
		case MC_MATCH_OBTAIN_WORLDITEM:
			{
				CCUID uidPlayer;
				int nIteCCUID;

				pCommand->GetParameter(&uidPlayer, 0, MPT_UID);
				pCommand->GetParameter(&nIteCCUID, 1, MPT_INT);

				OnObtainWorldItem(uidPlayer, nIteCCUID);
			}
			break;
		case MC_MATCH_SPAWN_WORLDITEM:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if (pParam->GetType()!=MPT_BLOB) break;

				void* pSpawnInfoBlob = pParam->GetPointer();

				OnSpawnWorldItem(pSpawnInfoBlob);
			}
			break;
		case MC_MATCH_REMOVE_WORLDITEM:
			{
				int nIteCCUID;

				pCommand->GetParameter(&nIteCCUID, 0, MPT_INT);

				OnRemoveWorldItem(nIteCCUID);
			}
			break;

		case MC_MATCH_USER_WHISPER:
			{
				char szSenderName[128]="";
				char szTargetName[128]="";
				char szMessage[1024]="";
				
				pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName) );
				pCommand->GetParameter(szTargetName, 1, MPT_STR, sizeof(szTargetName) );
				pCommand->GetParameter(szMessage, 2, MPT_STR, sizeof(szMessage) );

				//jintriple3 줄 바꿈 문자 필터링
				//check chatting Message
				CheckMsgAboutChat(szMessage);

				OnUserWhisper(szSenderName, szTargetName, szMessage);
			}
			break;
		case MC_MATCH_CHATROOM_JOIN:
			{
				char szPlayerName[128]="";
				char szChatRoomName[128]="";

				pCommand->GetParameter(szPlayerName, 0, MPT_STR, sizeof(szPlayerName) );
				pCommand->GetParameter(szChatRoomName, 1, MPT_STR, sizeof(szChatRoomName) );

				OnChatRoomJoin(szPlayerName, szChatRoomName);
			}
			break;
		case MC_MATCH_CHATROOM_LEAVE:
			{
				char szPlayerName[128]="";
				char szChatRoomName[128]="";

				pCommand->GetParameter(szPlayerName, 0, MPT_STR, sizeof(szPlayerName) );
				pCommand->GetParameter(szChatRoomName, 1, MPT_STR, sizeof(szChatRoomName) );

				OnChatRoomLeave(szPlayerName, szChatRoomName);
			}
			break;
		case MC_MATCH_CHATROOM_SELECT_WRITE:
			{
				char szChatRoomName[128]="";
				pCommand->GetParameter(szChatRoomName, 0, MPT_STR, sizeof(szChatRoomName) );

				OnChatRoomSelectWrite(szChatRoomName);
			}
			break;
		case MC_MATCH_CHATROOM_INVITE:
			{
				char szSenderName[64]="";
				char szTargetName[64]="";
				char szRoomName[128]="";

				pCommand->GetParameter(szSenderName, 0, MPT_STR, sizeof(szSenderName) );
				pCommand->GetParameter(szTargetName, 1, MPT_STR, sizeof(szTargetName) );
				pCommand->GetParameter(szRoomName, 2, MPT_STR, sizeof(szRoomName) );

				OnChatRoomInvite(szSenderName, szRoomName);
			}
			break;
		case MC_MATCH_CHATROOM_CHAT:
			{
				char szChatRoomName[128]="";
				char szPlayerName[128]="";
				char szChat[128]="";

				pCommand->GetParameter(szChatRoomName, 0, MPT_STR, sizeof(szChatRoomName) );
				pCommand->GetParameter(szPlayerName, 1, MPT_STR, sizeof(szPlayerName) );
				pCommand->GetParameter(szChat, 2, MPT_STR, sizeof(szChat) );

				//jintriple3 줄 바꿈 문자 필터링
				//check chatting Message
				CheckMsgAboutChat(szChat);

				OnChatRoomChat(szChatRoomName, szPlayerName, szChat);
			}
			break;
		case ZC_REPORT_119:
			{
				OnLocalReport119();
			}
			break;
		case ZC_MESSAGE:
			{
				int iMessageID;
				pCommand->GetParameter(&iMessageID, 0, MPT_INT);
				ZGetGameInterface()->ShowMessage(iMessageID);
			}break;
		case MC_TEST_PEERTEST_PING:
			{
				CCUID uidSender = pCommand->GetSenderUID();
				char szLog[128];
				sprintf(szLog, "PEERTEST_PING: from (%d%d)", uidSender.High, uidSender.Low);
				ZChatOutput(szLog, ZChat::CMT_SYSTEM);
			}
			break;
		case MC_TEST_PEERTEST_PONG:
			{
			}
			break;

		// 클랜관련
		case MC_MATCH_CLAN_RESPONSE_CREATE_CLAN:
			{
				int nResult, nRequestID;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				pCommand->GetParameter(&nRequestID, 1, MPT_INT);

				OnResponseCreateClan(nResult, nRequestID);

			}
			break;
		case MC_MATCH_CLAN_RESPONSE_AGREED_CREATE_CLAN:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);

				OnResponseAgreedCreateClan(nResult);
			}
			break;
		case MC_MATCH_CLAN_ASK_SPONSOR_AGREEMENT:
			{
				int nRequestID;
				char szClanName[256];
				CCUID uidMasterObject;
				char szMasterName[256];


				pCommand->GetParameter(&nRequestID,			 0, MPT_INT);
				pCommand->GetParameter(szClanName,			1, MPT_STR, sizeof(szClanName) );
				pCommand->GetParameter(&uidMasterObject,	2, MPT_UID);
				pCommand->GetParameter(szMasterName,		3, MPT_STR, sizeof(szMasterName) );

				OnClanAskSponsorAgreement(nRequestID, szClanName, uidMasterObject, szMasterName);
			}
			break;
		case MC_MATCH_CLAN_ANSWER_SPONSOR_AGREEMENT:
			{
				CCUID uidClanMaster;
				int nRequestID;
				bool bAnswer;
				char szCharName[256];

				pCommand->GetParameter(&nRequestID,		0, MPT_INT);
				pCommand->GetParameter(&uidClanMaster,	1, MPT_UID);
				pCommand->GetParameter(szCharName,		2, MPT_STR, sizeof(szCharName) );
				pCommand->GetParameter(&bAnswer,		3, MPT_BOOL);

				OnClanAnswerSponsorAgreement(nRequestID, uidClanMaster, szCharName, bAnswer);
			}
			break;
		case MC_MATCH_CLAN_RESPONSE_CLOSE_CLAN:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);

				OnClanResponseCloseClan(nResult);
			}
			break;
		case MC_MATCH_CLAN_RESPONSE_JOIN_CLAN:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				OnClanResponseJoinClan(nResult);
			}
			break;
		case MC_MATCH_CLAN_ASK_JOIN_AGREEMENT:
			{
				char szClanName[256], szClanAdmin[256];
				CCUID uidClanAdmin;

				pCommand->GetParameter(szClanName,		0, MPT_STR, sizeof(szClanName) );
				pCommand->GetParameter(&uidClanAdmin,	1, MPT_UID);
				pCommand->GetParameter(szClanAdmin,		2, MPT_STR, sizeof(szClanAdmin) );

				OnClanAskJoinAgreement(szClanName, uidClanAdmin, szClanAdmin);
			}
			break;
		case MC_MATCH_CLAN_ANSWER_JOIN_AGREEMENT:
			{
				CCUID uidClanAdmin;
				bool bAnswer;
				char szJoiner[256];

				pCommand->GetParameter(&uidClanAdmin,	0, MPT_UID);
				pCommand->GetParameter(szJoiner,		1, MPT_STR, sizeof(szJoiner) );
				pCommand->GetParameter(&bAnswer,		2, MPT_BOOL);

				OnClanAnswerJoinAgreement(uidClanAdmin, szJoiner, bAnswer);
			}
			break;
		case MC_MATCH_CLAN_RESPONSE_AGREED_JOIN_CLAN:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				OnClanResponseAgreedJoinClan(nResult);
			}
			break;
		case MC_MATCH_CLAN_UPDATE_CHAR_CLANINFO:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();

				OnClanUpdateCharClanInfo(pBlob);
			}
			break;
		case MC_MATCH_CLAN_RESPONSE_LEAVE_CLAN:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				OnClanResponseLeaveClan(nResult);
			}
			break;
		case MC_MATCH_CLAN_MASTER_RESPONSE_CHANGE_GRADE:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				OnClanResponseChangeGrade(nResult);
			}
			break;
		case MC_MATCH_CLAN_ADMIN_RESPONSE_EXPEL_MEMBER:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				OnClanResponseExpelMember(nResult);
			}
			break;
		case MC_MATCH_CLAN_MSG:
			{
				char szSenderName[256];
				char szMsg[512];

				pCommand->GetParameter(szSenderName,	0, MPT_STR, sizeof(szSenderName) );
				pCommand->GetParameter(szMsg,			1, MPT_STR, sizeof( szMsg) );

				//jintriple3 줄 바꿈 문자 필터링
				//check chatting Message
				CheckMsgAboutChat(szMsg);

				OnClanMsg(szSenderName, szMsg);
			}
			break;
		case MC_MATCH_CLAN_RESPONSE_MEMBER_LIST:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();

				OnClanMemberList(pBlob);

			}
			break;
		case MC_MATCH_CLAN_RESPONSE_CLAN_INFO:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();

				OnClanResponseClanInfo(pBlob);
			}
			break;
		case MC_MATCH_CLAN_RESPONSE_EMBLEMURL:
			{
				int nCLID=0;
				int nEmblemChecksum=0;
				char szURL[4096]="";

				pCommand->GetParameter(&nCLID, 0, MPT_INT);
				pCommand->GetParameter(&nEmblemChecksum, 1, MPT_INT);
				pCommand->GetParameter(szURL, 2, MPT_STR, sizeof(szURL) );
				
				OnClanResponseEmblemURL(nCLID, nEmblemChecksum, szURL);
			}
			break;
		case MC_MATCH_CLAN_LOCAL_EMBLEMREADY:
			{
				int nCLID=0;
				char szURL[4096]="";

				pCommand->GetParameter(&nCLID, 0, MPT_INT);
				pCommand->GetParameter(szURL, 1, MPT_STR, sizeof(szURL) );
				
				OnClanEmblemReady(nCLID, szURL);
			}
			break;
		case MC_MATCH_RESPONSE_RESULT:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				if (nResult != MOK)
				{
					ZApplication::GetGameInterface()->ShowErrorMessage( nResult );
				}
			}
			break;
		case MC_MATCH_RESPONSE_CHARINFO_DETAIL:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if (pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();

				OnResponseCharInfoDetail(pBlob);
			}
			break;
		case MC_MATCH_RESPONSE_PROPOSAL:
			{
				int nResult, nProposalMode, nRequestID;

				pCommand->GetParameter(&nResult,		0, MPT_INT);
				pCommand->GetParameter(&nProposalMode,	1, MPT_INT);
				pCommand->GetParameter(&nRequestID,		2, MPT_INT);

				OnResponseProposal(nResult, CCMatchProposalMode(nProposalMode), nRequestID);
			}
			break;
		case MC_MATCH_ASK_AGREEMENT:
			{
				CCUID uidProposer;
//				char szProposerCharName[256];
				int nProposalMode, nRequestID;
				
				

				pCommand->GetParameter(&uidProposer,		0, MPT_UID);
//				pCommand->GetParameter(szProposerCharName,	1, MPT_STR);

				CCCommandParameter* pParam = pCommand->GetParameter(1);
				void* pMemberNamesBlob = pParam->GetPointer();

				pCommand->GetParameter(&nProposalMode,		2, MPT_INT);
				pCommand->GetParameter(&nRequestID,			3, MPT_INT);

				OnAskAgreement(uidProposer, pMemberNamesBlob, CCMatchProposalMode(nProposalMode), nRequestID);
			}
			break;
		case MC_MATCH_REPLY_AGREEMENT:
			{
				CCUID uidProposer, uidChar;
				char szReplierName[256];
				int nProposalMode, nRequestID;
				bool bAgreement;

				pCommand->GetParameter(&uidProposer,		0, MPT_UID);
				pCommand->GetParameter(&uidChar,			1, MPT_UID);
				pCommand->GetParameter(szReplierName,		2, MPT_STR, sizeof(szReplierName) );
				pCommand->GetParameter(&nProposalMode,		3, MPT_INT);
				pCommand->GetParameter(&nRequestID,			4, MPT_INT);
				pCommand->GetParameter(&bAgreement,			5, MPT_BOOL);

				OnReplyAgreement(uidProposer, uidChar, szReplierName, CCMatchProposalMode(nProposalMode),
					             nRequestID, bAgreement);

			}

			break;

		// 레더 커맨드
		case MC_MATCH_LADDER_SEARCH_RIVAL:	// 검색 시작
			{
				ZGetGameInterface()->OnArrangedTeamGameUI(true);
			}break;
		case MC_MATCH_LADDER_CANCEL_CHALLENGE:
			{
				ZGetGameInterface()->OnArrangedTeamGameUI(false);
				
				char szCharName[MATCHOBJECT_NAME_LENGTH];
				pCommand->GetParameter(szCharName, 0, MPT_STR, sizeof(szCharName) );
				
				if(szCharName[0]!=0) {
					char szOutput[256];
					ZTransMsg(szOutput,MSG_LADDER_CANCEL,1,szCharName);
					ZChatOutput(sColor(ZCOLOR_CHAT_SYSTEM), szOutput);

				}else	 // 이름이 없으면 실패한경우다.
				{
					ZChatOutput(sColor(ZCOLOR_CHAT_SYSTEM), 
						ZMsg(MSG_LADDER_FAILED) );
				}
			}break;
		case MC_MATCH_LADDER_RESPONSE_CHALLENGE:
			{
				int nResult;
				pCommand->GetParameter(&nResult, 0, MPT_INT);
				OnLadderResponseChallenge(nResult);
			}
			break;
		case MC_MATCH_LADDER_PREPARE:
			{
				CCUID uidStage;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				int nTeam;
				pCommand->GetParameter(&nTeam, 1, MPT_INT);

				OnLadderPrepare(uidStage, nTeam);
			}break;
		case MC_MATCH_LADDER_LAUNCH:		// 게임 시작
			{
				CCUID uidStage;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				char szMapName[128];
				pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) );

				OnLadderLaunch(uidStage, szMapName);
			}break;
		case MC_MATCH_CLAN_STANDBY_CLAN_LIST:
			{
				int nPrevStageCount, nNextStageCount;
				pCommand->GetParameter(&nPrevStageCount, 0, MPT_INT);
				pCommand->GetParameter(&nNextStageCount, 1, MPT_INT);

				CCCommandParameter* pParam = pCommand->GetParameter(2);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();

				OnClanStandbyClanList(nPrevStageCount, nNextStageCount, pBlob);
			}
			break;
		case MC_MATCH_CLAN_MEMBER_CONNECTED:
			{
				char szMember[256];

				pCommand->GetParameter(szMember, 0, MPT_STR, sizeof(szMember) );
				OnClanMemberConnected(szMember);
			}
			break;
		case MC_MATCH_NOTIFY_CALLVOTE:
			{
				char szDiscuss[128] = "";
				char szArg[256] = "";

				pCommand->GetParameter(szDiscuss, 0, MPT_STR, sizeof(szDiscuss) );
				pCommand->GetParameter(szArg, 1, MPT_STR, sizeof(szArg) );
				OnNotifyCallVote(szDiscuss, szArg);
			}
			break;
		case MC_MATCH_NOTIFY_VOTERESULT:
			{
				char szDiscuss[128];
				int nResult = 0;

				pCommand->GetParameter(szDiscuss, 0, MPT_STR, sizeof(szDiscuss) );
				pCommand->GetParameter(&nResult, 1, MPT_INT);
				OnNotifyVoteResult(szDiscuss, nResult);
			}
			break;
		case MC_MATCH_VOTE_RESPONSE:
			{
				int nMsgCode = 0;
				pCommand->GetParameter( &nMsgCode, 0, MPT_INT );
				OnVoteAbort( nMsgCode );
			}
			break;
		case MC_MATCH_BROADCAST_CLAN_RENEW_VICTORIES:
			{
				char szWinnerClanName[256], szLoserClanName[256];
				int nVictories;

				pCommand->GetParameter(szWinnerClanName,	0, MPT_STR, sizeof(szWinnerClanName) );
				pCommand->GetParameter(szLoserClanName,		1, MPT_STR, sizeof(szLoserClanName) );
				pCommand->GetParameter(&nVictories,			2, MPT_INT);
				OnBroadcastClanRenewVictories(szWinnerClanName, szLoserClanName, nVictories);
			}
			break;
		case MC_MATCH_BROADCAST_CLAN_INTERRUPT_VICTORIES:
			{
				char szWinnerClanName[256], szLoserClanName[256];
				int nVictories;

				pCommand->GetParameter(szWinnerClanName,	0, MPT_STR, sizeof(szWinnerClanName) );
				pCommand->GetParameter(szLoserClanName,		1, MPT_STR, sizeof(szLoserClanName) );
				pCommand->GetParameter(&nVictories,			2, MPT_INT);
				OnBroadcastClanInterruptVictories(szWinnerClanName, szLoserClanName, nVictories);
			}
			break;
		case MC_MATCH_BROADCAST_DUEL_RENEW_VICTORIES:
			{
				char szChannelName[256], szChampionName[256];
				int nVictories, nRoomNo;

				pCommand->GetParameter(szChampionName,		0, MPT_STR, sizeof(szChampionName) );
				pCommand->GetParameter(szChannelName,		1, MPT_STR, sizeof(szChannelName) );
				pCommand->GetParameter(&nRoomNo,			2, MPT_INT);
				pCommand->GetParameter(&nVictories,			3, MPT_INT);
				OnBroadcastDuelRenewVictories(szChampionName, szChannelName, nRoomNo, nVictories);
			}
			break;
		case MC_MATCH_BROADCAST_DUEL_INTERRUPT_VICTORIES:
			{
				char szChampionName[256], szInterrupterName[256];
				int nVictories;

				pCommand->GetParameter(szChampionName,		0, MPT_STR, sizeof(szChampionName) );
				pCommand->GetParameter(szInterrupterName,	1, MPT_STR, sizeof(szInterrupterName) );
				pCommand->GetParameter(&nVictories,			2, MPT_INT);
				OnBroadcastDuelInterruptVictories(szChampionName, szInterrupterName, nVictories);
			}
			break;
		case MC_MATCH_RESPONSE_STAGE_FOLLOW:
			{
				int nMsgID;
				pCommand->GetParameter( &nMsgID, 0, MPT_INT );
				OnFollowResponse( nMsgID );
			}
			break;
		case MC_MATCH_SCHEDULE_ANNOUNCE_SEND :
			{
				char cAnnounce[ 512 ] = {0};
				pCommand->GetParameter( cAnnounce, 0, MPT_STR , sizeof(cAnnounce) );
				ZChatOutput( cAnnounce );
			}
			break;
		case MC_MATCH_EXPIRED_RENT_ITEM:
			{
				CCCommandParameter* pParam = pCommand->GetParameter(0);
				if(pParam->GetType()!=MPT_BLOB) break;
				void* pBlob = pParam->GetPointer();

				OnExpiredRentItem(pBlob);
			}
			break;
		case MC_MATCH_FIND_HACKING:
			{
			}
			break;
		case MC_MATCH_REWARD_BATTLE_TIME:
			{
				CCUID uidOwner;
				char szRewardName[256], szRewardResetDesc[256];
				int nRemainReward;
				unsigned int nItemId, nItemCnt;
				unsigned int nRentHourPeriod;

				pCommand->GetParameter(&uidOwner,			0, MPT_UID);
				pCommand->GetParameter(szRewardName,		1, MPT_STR, sizeof(szRewardName) );
				pCommand->GetParameter(szRewardResetDesc,	2, MPT_STR, sizeof(szRewardResetDesc) );				
				pCommand->GetParameter(&nItemId,			3, MPT_UINT);
				pCommand->GetParameter(&nItemCnt,			4, MPT_UINT);
				pCommand->GetParameter(&nRentHourPeriod,	5, MPT_UINT);
				pCommand->GetParameter(&nRemainReward,		6, MPT_INT);

				const char* szCharName = "-";
				const char* szItemName = "-";

				if (ZGetCharacterManager())
				{
					ZCharacter* pChar = ZGetCharacterManager()->Find(uidOwner);
					if (pChar)
						szCharName = pChar->GetUserName();
				}

				CCMatchItemDesc* pItemDesc = CCGetMatchItemDescMgr()->GetItemDesc(nItemId);
				if (pItemDesc)
					szItemName = pItemDesc->m_pMItemName->Ref().m_szItemName;
				else
				{
					const ZGambleItemDefine* pGItemDef = ZGetGambleItemDefineMgr().GetGambleItemDefine(nItemId);
					if (pGItemDef)
						szItemName = pGItemDef->GetName().c_str();
				}

				// 이 커맨드는 
				// 1. 보상을 실제로 받은 경우
				// 2. 보상을 받을 수 있지만 기회가 남지 않아서 받을 수 없는 경우
				// 두 경우 모두 전송받는다. 따라서 상황에 맞게 적절한 처리가 필요하다

				bool bRewardReally = (nItemId != 0);
				bool bMyReward = (ZGetMyUID() == uidOwner);

				if (bRewardReally)
				{
					TimeReward_ShowCharEffect(uidOwner);	// 캐릭터 머리 위에 이펙트 출력
					TimeReward_ChatOutput_RewardGet(szRewardName, szCharName, szItemName);	// '누가 무엇을 받았다' 출력

					if (bMyReward)	// 나 자신을 위한 커맨드라면
					{
						if (nRemainReward >= 1)
							TimeReward_ChatOutput_RemainChance(nRemainReward);		// 남은 기회를 출력
						else if (nRemainReward == 0)
							TimeReward_ChatOutput_ResetChance(szRewardResetDesc);	// 이번에 받은 것이 마지막 기회였다면 재충전 시각 공지
						else if (nRemainReward == -1)
							int a=0;// 이 경우는 별도의 기회 제한이 없는 이벤트를 나타낸다, 특별히 기회에 대한 출력문을 보여주지 않는다
					}
				}
				else	// 조건은 충족했으나 남은 기회가 없어 받지 못한 경우
				{
					if (bMyReward)
					{
						TimeReward_ChatOutput_NoChance(szRewardName);				// 기회가 없어서 받지 못함을 알려주고
						TimeReward_ChatOutput_ResetChance(szRewardResetDesc);		// 재충전 시각을 공지
					}
				}
			}
			break;

		// 듀얼 토너먼트
#ifdef _DUELTOURNAMENT
		case MC_MATCH_DUELTOURNAMENT_RESPONSE_JOINGAME:
			{
				int nResult;
				pCommand->GetParameter(&nResult,	0, MPT_INT);

				switch (nResult)
				{
				case MERR_DT_WRONG_CHANNEL:
					ZApplication::GetGameInterface()->ShowErrorMessage( nResult );
					cclog("Error: Illegal request to join game, This isn't a duel tournament channel.\n");
					break;
				case MERR_DT_CANNOT_CHALLENGE:
					ZApplication::GetGameInterface()->ShowErrorMessage( nResult );
					cclog("Error: failed to challenge a duel tournament game.\n");
					break;
				case MERR_DT_ALREADY_JOIN:
					ZApplication::GetGameInterface()->ShowErrorMessage( nResult );
					cclog("Error: already trying to join a duel tournament game.\n");
					break;
				}
			}
			break;

		case MC_MATCH_DUELTOURNAMENT_PREPARE_MATCH:
			{
				CCUID uidStage = CCUID(0,0);
				int nType;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				pCommand->GetParameter(&nType, 1, MPT_INT);
				CCCommandParameter* pParam = pCommand->GetParameter(2);
				void* pBlobPlayerInfo = pParam->GetPointer();

				OnDuelTournamentPrepare((CCDUELTOURNAMENTTYPE)nType, uidStage, pBlobPlayerInfo);
			}
			break;
		case MC_MATCH_DUELTOURNAMENT_LAUNCH_MATCH:
			{
				CCUID uidStage;
				pCommand->GetParameter(&uidStage, 0, MPT_UID);
				char szMapName[128];
				pCommand->GetParameter(szMapName, 1, MPT_STR, sizeof(szMapName) );


				ZIDLResource* pResource = ZApplication::GetGameInterface()->GetIDLResource();
				CCWidget* pWidget = pResource->FindWidget("DuelTournamentWaitMatchDialog");
				if(pWidget!=NULL)
					pWidget->Show(false);

				OnDuelTournamentLaunch(uidStage, szMapName);
			}
			break;
		case MC_MATCH_DUELTOURNAMENT_NOT_SERVICE_TIME:
			{
				int nOpenStartTime;
				int nOpenEndTime;
				pCommand->GetParameter(&nOpenStartTime,	0, MPT_INT);
				pCommand->GetParameter(&nOpenEndTime,	1, MPT_INT);

				// 듀얼토너먼트 신청이 서비스 시간에 따라 취소 되었음.
				ZApplication::GetGameInterface()->OnDuelTournamentGameUI(false); // 참가 신청 박스 닫아준다.
				const char *strFormat = ZErrStr( MERR_DT_NOT_SERVICE_TIME );
				if(strFormat)
				{
					char text[1024];
					sprintf(text, strFormat, nOpenStartTime, nOpenEndTime);
					ZApplication::GetGameInterface()->ShowErrorMessage(text, MERR_DT_NOT_SERVICE_TIME);
				}
			}
			break;
		case MC_MATCH_DUELTOURNAMENT_CHAR_INFO:
			{
				pCommand->GetParameter(&m_dtCharInfo.tournamentPoint,	0, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfo.wins,				1, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfo.losses,			2, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfo.ranking,			3, MPT_INT);
				//pCommand->GetParameter(&rankingFructuation,	4, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfo.winners,			5, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfo.lastWeekGrade,		6, MPT_INT);

				ZGetGameInterface()->UpdateDuelTournamantMyCharInfoUI();
			}
			break;

		case MC_MATCH_DUELTOURNAMENT_CHAR_INFO_PREVIOUS:
			{
				pCommand->GetParameter(&m_dtCharInfoPrev.tournamentPoint,	0, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfoPrev.wins,				1, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfoPrev.losses,			2, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfoPrev.ranking,			3, MPT_INT);
				pCommand->GetParameter(&m_dtCharInfoPrev.winners,			4, MPT_INT);

				ZGetGameInterface()->UpdateDuelTournamantMyCharInfoPreviousUI();
			}
			break;

#endif //_DUELTOURNAMENT

		// Gamble 아이템
		case MC_MATCH_RESPONSE_GAMBLE:
			{
				unsigned int nRecvItem;
				unsigned int nCnt;
				unsigned int nTime;

				pCommand->GetParameter(&nRecvItem,	0, MPT_UINT);
				pCommand->GetParameter(&nCnt,		1, MPT_UINT);
				pCommand->GetParameter(&nTime,		2, MPT_UINT);

				OnRecieveGambleItem( nRecvItem, nCnt, nTime);
			}
			break;

		case MC_QUEST_NPCLIST :
			{
				CCCommandParameter* pParam = pCommand->GetParameter( 0 );
				if( MPT_BLOB != pParam->GetType() ) 
				{
					break;
				}

				void* pBlobNPCList = pParam->GetPointer();
				if( NULL == pBlobNPCList )
				{
					return false;
				}

				int gameType;
				if (!pCommand->GetParameter(&gameType, 1, MPT_INT))
				{
					ASSERT(0);
					return false;
				}

				OnQuestNPCList( pBlobNPCList, (CCMATCH_GAMETYPE)gameType );
			}
			break;


		case MC_REQUEST_RESOURCE_CRC32 :
			{
				DWORD dwKey = 0;
				pCommand->GetParameter( &dwKey, 0, MPT_UINT );

				DWORD dwCrc32, dwXor;
				ZGetGame()->MakeResourceCRC32(dwKey, dwCrc32, dwXor);
				ZPostResponseResourceCRC32( dwCrc32, dwXor );
			}
			break;

		case MC_MATCH_ROUTE_UPDATE_STAGE_EQUIP_LOOK :
			{
				CCUID uidPlayer;
				int nParts;
				int nItemID;

				pCommand->GetParameter( &uidPlayer, 0, MPT_UID );
				pCommand->GetParameter( &nParts, 1, MPT_INT );
				pCommand->GetParameter( &nItemID, 2, MPT_INT );

				OnResponseUpdateStageEquipLook( uidPlayer, nParts, nItemID );
			}
			break;

		case MC_ADMIN_RESPONSE_KICK_PLAYER:
			{
				int nResult;
				pCommand->GetParameter( &nResult, 0, MPT_INT );
				OnAdminResponseKickPlayer(nResult);				
			}
			break;

		case MC_ADMIN_RESPONSE_BLOCK_PLAYER:
			{
				int nResult;
				pCommand->GetParameter( &nResult, 0, MPT_INT );
				OnAdminResponseBlockPlayer(nResult);
			}
			break;

		case MC_ADMIN_RESPONSE_MUTE_PLAYER:
			{
				int nResult;
				pCommand->GetParameter( &nResult, 0, MPT_INT );
				OnAdminResponseMutePlayer(nResult);
			}
			break;

		default:
			if (!ret)
			{
//				CCClient::OutputMessage(CCZMOM_LOCALREPLY, "Command(%s) handler not found", pCommand->m_pCommandDesc->GetName());
//				return false;
			}
			break;
	}

	if (m_fnOnCommandCallback) ret = m_fnOnCommandCallback(pCommand);


	return ret;
}
bool CCMatchConfig::Create()
{
	int nTemp = 0;

	GetPrivateProfileString("DB", "DNS", "gunzdb", m_szDB_DNS, 64, SERVER_CONFIG_FILENAME);
	GetPrivateProfileString("DB", "USERNAME", "gunzdb", m_szDB_UserName, 64, SERVER_CONFIG_FILENAME);
	GetPrivateProfileString("DB", "PASSWORD", "gunzdb", m_szDB_Password, 64, SERVER_CONFIG_FILENAME);

	m_nMaxUser = GetPrivateProfileInt("SERVER", "MAXUSER", 1500, SERVER_CONFIG_FILENAME);
	m_nServerID = GetPrivateProfileInt("SERVER", "SERVERID", 1500, SERVER_CONFIG_FILENAME);
	GetPrivateProfileString("SERVER", "SERVERNAME", "matchserver", m_szServerName, 256, SERVER_CONFIG_FILENAME);
	m_nServerPort = GetPrivateProfileInt("SERVER", "SERVERPORT", 6000, SERVER_CONFIG_FILENAME);
	m_nServerUDPPort = GetPrivateProfileInt("SERVER", "SERVERUDPPORT", 7777, SERVER_CONFIG_FILENAME);

	char szServerMode[128] = "";
	GetPrivateProfileString("SERVER", "MODE", SERVER_CONFIG_SERVERMODE_NORMAL, szServerMode, 128, SERVER_CONFIG_FILENAME);

	if (!stricmp(szServerMode, SERVER_CONFIG_SERVERMODE_NORMAL)) m_nServerMode = CSM_NORMAL;
	else if (!stricmp(szServerMode, SERVER_CONFIG_SERVERMODE_CLAN)) m_nServerMode = CSM_CLAN;
	else if (!stricmp(szServerMode, SERVER_CONFIG_SERVERMODE_LADDER)) m_nServerMode = CSM_LADDER;
	else if (!stricmp(szServerMode, SERVER_CONFIG_SERVERMODE_EVENT)) m_nServerMode = CSM_EVENT;
	else if (!stricmp(szServerMode, SERVER_CONFIG_SERVERMODE_TEST)) m_nServerMode = CSM_TEST;
	else { _ASSERT(0); }

	m_bEnabledSurvivalMode = (0 != GetPrivateProfileInt("SERVER", "SURVIVALENABLE", 1, SERVER_CONFIG_FILENAME));

	m_dwSurvivalRankingDailyRequestHour = GetPrivateProfileInt("SERVER", "SURVIVALRANKING_DAILY_REQUEST_HOUR", 5, SERVER_CONFIG_FILENAME);
	m_dwSurvivalRankingDailyRequestMin = GetPrivateProfileInt("SERVER", "SURVIVALRANKING_DAILY_REQUEST_MINUTE", 0, SERVER_CONFIG_FILENAME);
	if (m_dwSurvivalRankingDailyRequestHour < 0 || m_dwSurvivalRankingDailyRequestHour >= 24) {
		cclog("[ASSERTION FAILED!] %s : SURVIVALRANKING_DAILY_REQUEST_HOUR invalid!\n", SERVER_CONFIG_FILENAME);
		_ASSERT(0);
	}
	if (m_dwSurvivalRankingDailyRequestMin < 0 || m_dwSurvivalRankingDailyRequestMin >= 60) {
		cclog("[ASSERTION FAILED!] %s : SURVIVALRANKING_DAILY_REQUEST_MINUTE invalid!\n", SERVER_CONFIG_FILENAME);
		_ASSERT(0);
	}

	m_dwDuelTournamentMatchMakingInterval = GetPrivateProfileInt("SERVER", "DUELTOURNAMENT_MATCHMAKING_INTERVAL", 1000, SERVER_CONFIG_FILENAME);
	m_dwDuelTournamentMatchMaingAcceptableTpGap = GetPrivateProfileInt("SERVER", "DUELTOURNAMENT_MATCHMAKING_ACCEPTABLE_TP_GAP", 10, SERVER_CONFIG_FILENAME);
	m_dwDuelTournamentMatchMaingWaitLimit = GetPrivateProfileInt("SERVER", "DUELTOURNAMENT_MATCHMAKING_WAIT_LIMIT", 10000, SERVER_CONFIG_FILENAME);
	if (m_dwDuelTournamentMatchMakingInterval > 10000)
		cclog("[WARNING] %s : DUELTOURNAMENT_MATCHMAKING_INTERVAL is too big.\n", SERVER_CONFIG_FILENAME);
	if (m_dwDuelTournamentMatchMaingAcceptableTpGap > 1000)
		cclog("[WARNING] %s : DUELTOURNAMENT_MATCHMAKING_ACCEPTABLE_TP_GAP is too big.\n", SERVER_CONFIG_FILENAME);
	if (m_dwDuelTournamentMatchMaingWaitLimit > 60000)
		cclog("[WARNING] %s : DUELTOURNAMENT_MATCHMAKING_WAIT_LIMIT is too big.\n", SERVER_CONFIG_FILENAME);

	m_dwDuelTournamentServiceStartTime = GetPrivateProfileInt("SERVER", "DUELTOURNAMENT_SERVICE_START_TIME ", 0, SERVER_CONFIG_FILENAME);
	m_dwDuelTournamentServiceEndTime = GetPrivateProfileInt("SERVER", "DUELTOURNAMENT_SERVICE_END_TIME ", 23, SERVER_CONFIG_FILENAME);
	if(m_dwDuelTournamentServiceStartTime > 23) {
		m_dwDuelTournamentServiceStartTime = 23;
		cclog("[WARNING] %s : DUELTOURNAMENT_SERVICE_START_TIME is too big. max is 23.\n", SERVER_CONFIG_FILENAME);_ASSERT(0);
	}
	if(m_dwDuelTournamentServiceEndTime > 23) {
		m_dwDuelTournamentServiceEndTime = 23;
		cclog("[WARNING] %s : DUELTOURNAMENT_SERVICE_END_TIME is too big. max is 23.\n", SERVER_CONFIG_FILENAME);_ASSERT(0);
	}
	if( 0 > m_dwDuelTournamentServiceStartTime) {
		m_dwDuelTournamentServiceStartTime = 0;
		cclog("[WARNING] %s : DUELTOURNAMENT_SERVICE_START_TIME must be a positive value.\n", SERVER_CONFIG_FILENAME);_ASSERT(0);
	}
	if( 0 > m_dwDuelTournamentServiceEndTime)	{
		m_dwDuelTournamentServiceEndTime = 0;
		cclog("[WARNING] %s : DUELTOURNAMENT_SERVICE_END_TIME must be a positive value.\n", SERVER_CONFIG_FILENAME);_ASSERT(0);
	}

	m_bSendLoginUserToDuelTournamentChannel = (0 != GetPrivateProfileInt("SERVER", "SEND_LOGINUSER_TO_DUELTOURNAMENT_CHANNEL", 1, SERVER_CONFIG_FILENAME));

	m_bEnabledDuelTournament = (0 != GetPrivateProfileInt("SERVER", "DUELTOURNAMENT_ENABLE", 1, SERVER_CONFIG_FILENAME));

	m_dwBRDescriptionRefreshInterval = GetPrivateProfileInt("BATTLETIMEREWARD", "BATTLETIMEREWARD_REFRESH_INTERVAL", 5, SERVER_CONFIG_FILENAME);
	m_dwBRDescriptionRefreshInterval = m_dwBRDescriptionRefreshInterval * 60 * 1000;

	// 인원제한 무시하는 허용IP
	char szAllowIP[1024] = "";
	char* pNextArg = szAllowIP;
	GetPrivateProfileString("SERVER", "FREELOGINIP", "", szAllowIP, 1024, SERVER_CONFIG_FILENAME);
	CCLex lex;
	while(true) {
		char szIP[128] = "";
		pNextArg = lex.GetOneArg(pNextArg, szIP);
		if (*szIP == NULL)
			break;
		AddFreeLoginIP(szIP);
	}

	char szDebug[4] = {0,};
	GetPrivateProfileString( "SERVER", "DEBUG", SERVER_CONFIG_DEBUG_DEFAULT, szDebug, 4, SERVER_CONFIG_FILENAME );
	if( 0 == stricmp("0", szDebug) )
		m_bIsDebugServer = false;
	else
		m_bIsDebugServer = true;

	// Debug ip.
	char szDebugIP[ 1024 ] = {0,};
	char* pNextDbgIP = szDebugIP;
	GetPrivateProfileString( "SERVER", "DEBUGIP", "", szDebugIP, 1024, SERVER_CONFIG_FILENAME );
	while(true) {
		char szIP[128] = "";
		pNextDbgIP = lex.GetOneArg(pNextDbgIP, szIP);
		if (*szIP == NULL)
			break;
		AddDebugLoginIP(szIP);
	}

	if( !LoadMonitorIPnPort() )
	{
		cclog( "server.ini - monitor ip not setting\n" );
		return false;
	}

	if( !LoadKeeperIP() )
	{
		cclog( "server.ini - Keeper ip not setting\n" );
		return false;
	}
	
	
	// 프리미엄 IP 체크
	int nCheckPremiumIP = GetPrivateProfileInt("SERVER", "CheckPremiumIP", 0, SERVER_CONFIG_FILENAME);
	if (nCheckPremiumIP != 0) m_bCheckPremiumIP = true;

	char szCountry[ 32 ] = "";
	GetPrivateProfileString( "SERVER", "COUNTRY", "", szCountry, 31, SERVER_CONFIG_FILENAME );
	if( 0 != strlen(szCountry) )
		m_strCountry = szCountry;
	else
	{
		ASSERT( 0 );
		cclog( "server.ini - Invalid country type.\n" );
		return false;
	}

	char szLanguage[ 32 ] = "";
	GetPrivateProfileString( "SERVER", "LANGUAGE", "", szLanguage, 31, SERVER_CONFIG_FILENAME );
	if( 0 != strlen(szLanguage) )
		m_strLanguage = szLanguage;
	else
	{
		ASSERT( 0 );
		cclog( "server.ini - Invalid language type.\n" );
		return false;
	}

	char szIsUseTicket[ 2 ] = "";
	GetPrivateProfileString( "SERVER", "USETICKET", SERVER_CONFIG_USE_TICKET, szIsUseTicket, 2, SERVER_CONFIG_FILENAME );
	if( 0 != strlen(szIsUseTicket) )
		m_bIsUseTicket = static_cast< bool >( atoi(szIsUseTicket) );
	else
	{
		ASSERT( 0 );
		cclog( "server.ini - invalid ticket setting.\n" );
		return false;
	}
	
	
	char szGameguard[ 2 ] = "";
	GetPrivateProfileString( "SERVER", "GAMEGUARD", "1", szGameguard, 2, SERVER_CONFIG_FILENAME );
	if( 1 == atoi(szGameguard) )
		 m_bIsUseGameguard = true;
	else
	{
		cclog( "gameguard not running\n" );
		m_bIsUseGameguard = false;
	}

	char szNHNUSAAuth[ 2 ] = "";
	GetPrivateProfileString( "SERVER", "NHNUSA_AUTH", "1", szNHNUSAAuth, 2, SERVER_CONFIG_FILENAME );
	if( 1 == atoi(szNHNUSAAuth) )
		m_bIsUseNHNUSAAuth = true;
	else
	{
		m_bIsUseNHNUSAAuth = false;
		cclog( "nhn usa auth not running.\n" );
	}

	char szNHNServerMode[ 2 ] = "";
	GetPrivateProfileString( "SERVER", "NHN_SERVERMODE", "r", szNHNServerMode, 2, SERVER_CONFIG_FILENAME );
	if( 0 == stricmp("r", szNHNServerMode) )
	{
		m_NHNServerMode = NSM_REAL;
		//cclog( "nhn server mode is real\n" );
	}
	else if( 0 == stricmp("a", szNHNServerMode) )
	{
		m_NHNServerMode = NSM_ALPHA;
		//cclog( "nhn server mode is alpha\n" );
	}

	// 일본 넷마블 전용
	GetPrivateProfileString("LOCALE", "DBAgentIP",						SERVER_CONFIG_DEFAULT_NJ_DBAGENT_IP, m_NJ_szDBAgentIP, 64, SERVER_CONFIG_FILENAME);
	m_NJ_nDBAgentPort = GetPrivateProfileInt("LOCALE", "DBAgentPort",	SERVER_CONFIG_DEFAULT_NJ_DBAGENT_PORT, SERVER_CONFIG_FILENAME);
	m_NJ_nGameCode = GetPrivateProfileInt("LOCALE", "GameCode",			SERVER_CONFIG_DEFAULT_NJ_DBAGENT_GAMECODE, SERVER_CONFIG_FILENAME);


	ReadEnableMaps();

	// filer.
	char szUse[ 2 ] = {0,};
	GetPrivateProfileString( "FILTER", "USE", "0", szUse, 2, SERVER_CONFIG_FILENAME );
	SetUseFilterState( atoi(szUse) );
	
	char szAccept[ 2 ] = {0,};
	GetPrivateProfileString( "FILTER", "ACCEPT_INVALID_IP", "1", szAccept, 2, SERVER_CONFIG_FILENAME );
	SetAcceptInvalidIPState( atoi(szAccept) );

	// environment
	char szUseHShield[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "USE_HSHIELD", SERVER_CONFIG_DEFAULT_USE_HSHIELD, szUseHShield, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szUseHShield) );
	if( 0 == stricmp("1", szUseHShield) )
		m_bIsUseHShield = true;
	else
		m_bIsUseHShield = false;

	char szUseXTrap[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "USE_XTRAP", SERVER_CONFIG_DEFAULT_USE_XTRAP, szUseXTrap, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szUseXTrap) );
	if( 0 == stricmp("1", szUseXTrap) )
		m_bIsUseXTrap = true;
	else
		m_bIsUseXTrap = false;

	char szUseEvent[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "USE_EVENT", SERVER_CONFIG_DEFAULT_USE_EVENT, szUseEvent, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szUseEvent) );
	if( 0 == stricmp("1", szUseEvent) )
		m_bIsUseEvent = true;
	else
		m_bIsUseEvent = false;

	char szUseFileCrc[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "USE_FILECRC", SERVER_CONFIG_DEFAULT_USE_FILECRC, szUseFileCrc, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szUseFileCrc) );
	if( 0 == stricmp("1", szUseFileCrc) )
		m_bIsUseFileCrc = true;
	else
		m_bIsUseFileCrc = false;

	char szUseMD5[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "USE_MD5", SERVER_CONFIG_DEFAULT_USE_FILECRC, szUseMD5, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szUseMD5) );
	if( 0 == stricmp("1", szUseMD5) )
		m_bIsUseMD5 = true;
	else
		m_bIsUseMD5 = false;

	char szBlockFlooding[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "BLOCK_FLOODING", SERVER_CONFIG_DEFAULT_BLOCK_FLOODING, szBlockFlooding, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szBlockFlooding) );
	if( 0 == stricmp("1", szBlockFlooding) )
		m_bBlockFlooding = true;
	else
		m_bBlockFlooding = false;

	if( m_bIsUseHShield && m_bIsUseXTrap )
	{
		ASSERT( 0 && "hackshield와 x-trap은 같이 사용할 수 없다." );
		cclog( "server.ini - HackShield and XTrap is duplicated\n" );
		return false;
	}

	char szBlockHacking[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "USE_BLOCKHACKING", 0, szBlockHacking, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szBlockHacking) );
	if( 0 == stricmp("1", szBlockHacking) )
		m_bIsUseBlockHancking = true;
	else
		m_bIsUseBlockHancking = false;


	// 새로운 아이템 정책1. 아이템의 일치성 보장
	// Added By 홍기주(2010-04-07)
	char szItemConsistency[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT", "USE_ITEM_CONSISTENCY", 0, szItemConsistency, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szItemConsistency) );
	if( 0 == stricmp("1", szItemConsistency) )	m_bIsUseItemConsistency = true;
	else										m_bIsUseItemConsistency = false;
	
	
	InitKillTrackerConfig();
	InitPowerLevelingConfig();

	char szUseResourceCRC32CacheCheck[ 2 ] = {0,};
	GetPrivateProfileString("ENVIRONMENT"
		, "USE_RESOURCECRC32CACHECKECK"
		, SERVER_CONFIG_DEFAULT_USE_RESOURCECRC32CACHECHECK
		, szUseResourceCRC32CacheCheck, 2, SERVER_CONFIG_FILENAME);
	ASSERT( 0 != strlen(szUseResourceCRC32CacheCheck) );
	if( 0 == stricmp("1", szUseResourceCRC32CacheCheck) )
		m_bIsUseResourceCRC32CacheCheck = true;
	else
		m_bIsUseResourceCRC32CacheCheck = false;

	InitLoopLogConfig();

	m_bIsComplete = true;
	return m_bIsComplete;
}