Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

Urban Gaming Client/Database/Source Code Only

Custom Title Activated
Loyal Member
Joined
Jul 16, 2012
Messages
1,310
Reaction score
116
i have some problem with implementing rv on items ...there are items with rv 100+ cannot be equipped.. and other too like in the picture.. cannot be put on weapon slot... have you tried this guys? same with armors.

where to set maximum rv on source code that supports 100+ rv?
0DhmThk - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums


wcRNIh3 - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums
 

Attachments

You must be registered for see attachments list
Master Summoner
Joined
Feb 6, 2019
Messages
569
Reaction score
157
i have some problem with implementing rv on items ...there are items with rv 100+ cannot be equipped.. and other too like in the picture.. cannot be put on weapon slot... have you tried this guys? same with armors.

where to set maximum rv on source code that supports 100+ rv?
0DhmThk - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums


wcRNIh3 - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums
check the glcharinvenmsg or glcharactorreq. there is a line of code in there that restrict any item with 100+ rv or 50% rv in any item . just comment it or make the value higher .

ps:sorry for the bad english :)
 

Attachments

You must be registered for see attachments list
Custom Title Activated
Loyal Member
Joined
Jul 16, 2012
Messages
1,310
Reaction score
116
check the glcharinvenmsg or glcharactorreq. there is a line of code in there that restrict any item with 100+ rv or 50% rv in any item . just comment it or make the value higher .

ps:sorry for the bad english :)

nothing on both sir...

glcharinvenmsg
PHP:
#include "stdafx.h"
#include "./GLChar.h"
#include "./GLogicEx.h"
#include "./GLGaeaServer.h"
#include "./GLItemLMT.h"
#include "./GLItemMan.h"
#include "../enginelib/Common/StringUtils.h"
#include "RanFilter.h"
#include "./GLItemMixMan.h"
//crashfix
//#include "../../RanClientUILib/Interface/GameTextControl.h"
//#include "../../RanClientUILib/Interface/InnerInterface.h"
//#include "../../RanClientUILib/Interface/UITextControl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//	Note : Àκ¥¾ÆÀÌÅÛÀ» ¼Ò¸ð½ÃÅ´.
//		2. ¼Ò¸ð¸¦ Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë¸².
//		3. b2AGENT º¯¼ö´Â Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë¸±¶§ Çʵå¿ÍÀÇ ¿¬°á¼ºÀÌ ºÒÈ®½Ç ÇÒ °æ¿ì¸¦ ´ëºñÇÏ¿©
//			¿¡ÀÌÁ¯Æ®¸¦ ÅëÇؼ­ ¾Ë¸±¼ö ÀÖµµ·Ï ÇÔ.
bool GLChar::DoDrugInvenItem ( WORD wPosX, WORD wPosY, bool b2AGENT )
{
	//	Àκ¥ÀÇ ¾ÆÀÌÅÛ È®ÀÎ.
	SINVENITEM *pINVENITEM = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pINVENITEM )		return false;

	//	¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿È.
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( !pItem )			return false;

	if ( pItem->sDrugOp.bInstance )
	{
		if ( pINVENITEM->sItemCustom.wTurnNum > 0 )		pINVENITEM->sItemCustom.wTurnNum--;
	
		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( pINVENITEM->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, 1 );

		if ( pINVENITEM->sItemCustom.wTurnNum==0 )
		{
			//	¾ÆÀÌÅÆ Á¦°Å.
			m_cInventory.DeleteItem ( wPosX, wPosY );

			//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ Á¦°Å.
			GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
			NetMsg_Inven_Delete.wPosX = wPosX;
			NetMsg_Inven_Delete.wPosY = wPosY;
			if ( b2AGENT )	GLGaeaServer::GetInstance().SENDTOAGENT(m_dwClientID,&NetMsg_Inven_Delete);
			else			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Delete);
		}
		else
		{
			//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ðµÊ.
			GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg_Inven_Update;
			NetMsg_Inven_Update.wPosX = wPosX;
			NetMsg_Inven_Update.wPosY = wPosY;
			NetMsg_Inven_Update.wTurnNum = pINVENITEM->sItemCustom.wTurnNum;

			if ( b2AGENT )	GLGaeaServer::GetInstance().SENDTOAGENT(m_dwClientID,&NetMsg_Inven_Update);
			else			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Update);
		}
	}


	// ÄðŸÀÓ Àû¿ë
	if ( pItem->sBasicOp.IsCoolTime() ) 
	{
		SetCoolTime( pINVENITEM->sItemCustom.sNativeID , pItem->sBasicOp.emCoolType );
	}

	return true;
}

bool GLChar::DoDrugSlotItem ( EMSLOT emSLOT,  WORD wNum )
{
	if ( emSLOT >= SLOT_TSIZE )		return false;

	SITEMCUSTOM& sSLOTITEM = m_PutOnItems[emSLOT];
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sSLOTITEM.sNativeID );
	if ( !pItem )					return false;

	// ¼Ò¸ð¼º ¾ÆÀÌÅÛÀÏ °æ¿ì
	if ( pItem->ISINSTANCE() )
	{
		if ( sSLOTITEM.wTurnNum >= wNum )		sSLOTITEM.wTurnNum -= wNum;

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( sSLOTITEM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, sSLOTITEM.wTurnNum );

		if ( sSLOTITEM.wTurnNum==0 )
		{
			//	HOLD ¾ÆÀÌÅÆ Á¦°Å.
			RELEASE_SLOT_ITEM ( emSLOT );

			//	[Àڽſ¡°Ô] ½½·Ô¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
			GLMSG::SNETPC_PUTON_RELEASE NetMsg_Release(emSLOT);
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Release);
		}
		else
		{
			//	[Àڽſ¡°Ô] ¿¬¸¶Á¦ÀÇ ¿¬¸¶°¡´É Ƚ¼ö °¨¼Ò.
			GLMSG::SNETPC_PUTON_DRUG_UPDATE NetMsg_Update;
			NetMsg_Update.emSlot = emSLOT;
			NetMsg_Update.wTurnNum = sSLOTITEM.wTurnNum;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Update);
		}
	}
	else
	{
		//	±âÇÑ ¾ÆÀÌÅÛÀÏ °æ¿ì
		GLITEMLMT::GetInstance().ReqItemRoute ( sSLOTITEM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, 0 );
	}

	// ÄðŸÀÓ Àû¿ë
	if ( pItem->sBasicOp.IsCoolTime() ) 
	{
		SetCoolTime( sSLOTITEM.sNativeID , pItem->sBasicOp.emCoolType );
	}

	return true;
}

bool GLChar::IsInsertToInven ( PITEMDROP pItemDrop, bool bVietnamInven )
{
	GASSERT(pItemDrop&&"GLChar::IsItemToInven()");
	if ( !pItemDrop )	return false;

	SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemCustom.sNativeID);
	if ( !pItem )		return false;

	if ( pItem->ISPILE() )
	{
		WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
		WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

		//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
		WORD wPILENUM = pItem->sDrugOp.wPileNum;
		SNATIVEID sNID = pItem->sBasicOp.sNativeID;

		//	³Ö±â ¿äûµÈ ¾ÆÀÌÅÛ¼ö. ( ÀÜ¿©·®. )
		WORD wREQINSRTNUM = ( pItemDrop->sItemCustom.wTurnNum );

		BOOL bITEM_SPACE = TRUE;
		if( bVietnamInven )
			bITEM_SPACE = m_cVietnamInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY );
		else
			bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY );

		if ( !bITEM_SPACE )		return false;
	}
	else
	{
		WORD wPosX, wPosY;
		BOOL bOk = TRUE;
		if( bVietnamInven )
			bOk = m_cVietnamInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		else
			bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );

		if ( !bOk )				return false;
	}

	return true;
}

/* ºñÈ°¼ºÈ­ Àκ¥Å丮¿¡µµ ¹«¾ð°¡ ³ÖÀ»¼ö ÀÖ´Ù.*/
bool GLChar::IsInsertToInvenEx ( PITEMDROP pItemDrop )
{
	GASSERT(pItemDrop&&"GLChar::IsItemToInven()");
	if ( !pItemDrop )	return false;

	SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemCustom.sNativeID);
	if ( !pItem )		return false;

	if ( pItem->ISPILE() )
	{
		WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
		WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

		//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
		WORD wPILENUM = pItem->sDrugOp.wPileNum;
		SNATIVEID sNID = pItem->sBasicOp.sNativeID;

		//	³Ö±â ¿äûµÈ ¾ÆÀÌÅÛ¼ö. ( ÀÜ¿©·®. )
		WORD wREQINSRTNUM = ( pItemDrop->sItemCustom.wTurnNum );

		BOOL bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY, true );
		if ( !bITEM_SPACE )		return false;
	}
	else
	{
		WORD wPosX, wPosY;
		BOOL bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY, true );
		if ( !bOk )				return false;
	}

	return true;
}

HRESULT GLChar::InsertToVNGainInven( PITEMDROP pItemDrop )
{

	GASSERT(pItemDrop&&"GLChar::InsertToInven()");
	if ( !pItemDrop )	return E_FAIL;

	SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemCustom.sNativeID);
	if ( !pItem )		return E_FAIL;

 	bool bITEM_SPACE = IsInsertToInven ( pItemDrop, TRUE );
	if ( !bITEM_SPACE )
	{
		//	ÀιêÀÌ °¡µæÂ÷¼­ ¾ÆÀÌÅÆÀ» ³ÖÀ»¼ö ¾ø½À´Ï´Ù.
		GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
		NetMsg.emCrow = CROW_ITEM;
		NetMsg.emTakeFB = EMTAKE_FB_INVEN_ERROR;

		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
		return E_FAIL;
	}


	if ( pItem->ISPILE() )
	{
		WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
		WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

		//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
		WORD wPILENUM = pItem->sDrugOp.wPileNum;
		SNATIVEID sNID = pItem->sBasicOp.sNativeID;

		//	³Ö±â ¿äûµÈ ¾ÆÀÌÅÛ¼ö. ( ÀÜ¿©·®. )
		WORD wREQINSRTNUM = ( pItemDrop->sItemCustom.wTurnNum );



		//	Note : ´õ °ãÃÄÁú¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö °Ë»çÇÏ¿© Àκ¥¿¡ µé¾î°¡¾ßÇÏ´Â
		//		¾ÆÀÌÅÛ Á¡°Ë ¼ýÀÚ¸¦ °¨¼Ò½ÃÅ´.
		GLInventory::CELL_MAP &ItemMap = *m_cVietnamInventory.GetItemList();
		GLInventory::CELL_MAP_ITER iter = ItemMap.begin();
		for ( ; iter!=ItemMap.end(); ++iter )
		{
			SINVENITEM &sINVENITEM = *(*iter).second;
			SITEMCUSTOM &sITEMCUSTOM = sINVENITEM.sItemCustom;
			if ( sITEMCUSTOM.sNativeID != sNID )		continue;
			if ( sITEMCUSTOM.wTurnNum>=wPILENUM )		continue;

			//	±âÁ¸ ¾ÆÀÌÅÛ °ãħ ¿©À¯ºÐ.
			WORD wSURPLUSNUM = wPILENUM - sITEMCUSTOM.wTurnNum;

			if ( wREQINSRTNUM > wSURPLUSNUM )
			{
				//	Note : ±âÁ¸ ¾ÆÀÌÅÛÀÇ °ãħÀ» º¯°æ. ( ²ËÂü )
				sITEMCUSTOM.wTurnNum = wPILENUM;

				//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
				GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
				NetMsg.bVietnamInven = TRUE;
				NetMsg.wPosX = sINVENITEM.wPosX;
				NetMsg.wPosY = sINVENITEM.wPosY;
				NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

				//	Note : ÀÜ¿© ¼ö·® °¨¼Ò.
				wREQINSRTNUM -= wSURPLUSNUM;
			}
			else
			{
				//	Note : ±âÁ¸ ¾ÆÀÌÅÛ¿¡ °ãÄ¡´Â °Í ¸¸À¸·Îµµ »õ·Î ³ÖÀ» ¾ÆÀÌÅÛÀÌ ÃæºÐÈ÷ µé¾î°¨.
				sITEMCUSTOM.wTurnNum += wREQINSRTNUM;

				//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
				GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
				NetMsg.bVietnamInven = TRUE;
				NetMsg.wPosX = sINVENITEM.wPosX;
				NetMsg.wPosY = sINVENITEM.wPosY;
				NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

				//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
				//
				GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
				if ( pParty )
				{
					GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
					NetMsg.dwGaeaID = m_dwGaeaID;
					NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
					pParty->SENDMSG2NEAR ( this, &NetMsg );
				}

				//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
				m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );

				return S_OK;
			}
		}

		//	Note : »õ·ÎÀÌ Àκ¥¿¡ µé¾î°¡¾ßÇÒ ¾ÆÀÌÅÛÀÇ °¹¼ö ÆľÇÈÄ Àκ¥¿¡ µé¾î°¥ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.

		//	ÃÖ´ë°ãħ¾ÆÀÌÅÛ ¼ö·®.
		WORD wONENUM = wREQINSRTNUM / wPILENUM;
		WORD wITEMNUM = wONENUM;

		//	¿©ºÐ°ãħ¾ÆÀÌÅÛÀÇ °ãħ¼ö.
		WORD wSPLITNUM = wREQINSRTNUM % wPILENUM;
		if ( wSPLITNUM > 0 )				wITEMNUM += 1;
		if ( wSPLITNUM==0 && wITEMNUM>=1 )	wSPLITNUM = wPILENUM;

		for ( WORD i=0; i<wITEMNUM; ++i )
		{
			WORD wInsertPosX(0), wInsertPosY(0);
			BOOL bSPACE = m_cVietnamInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );
			GASSERT(bSPACE&&"³ÖÀ» °ø°£À» ¹Ì¸® üũ¸¦ ÇÏ°í ¾ÆÀÌÅÛÀ» ³Ö¾úÀ¸³ª °ø°£ÀÌ ºÎÁ·ÇÔ.");
			if ( !bSPACE )			return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

			//	Note : »õ·Î¿î ¾ÆÀÌÅÛÀ» ³Ö¾îÁÜ.
			//
			SITEMCUSTOM sITEMCUSTOM = pItemDrop->sItemCustom;
			if ( wITEMNUM==(i+1) )	sITEMCUSTOM.wTurnNum = wSPLITNUM;	//	¸¶Áö¸· ¾ÆÀÌÅÛÀº ÀÜ¿©·®.
			else					sITEMCUSTOM.wTurnNum = wPILENUM;	//	¾Æ´Ò °æ¿ì´Â ²ËÂù·®.

			//	ÀιêÅ丮¿¡ ³Ö½À´Ï´Ù.
			sITEMCUSTOM.bVietnamGainItem = true;
			m_cVietnamInventory.InsertItem ( sITEMCUSTOM, wInsertPosX, wInsertPosY );
			SINVENITEM *pInvenItem = m_cVietnamInventory.GetItem ( wInsertPosX, wInsertPosY );
			if ( !pInvenItem )		return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

			//	Àι꿡 ¾ÆÀÌÅÆ ³Ö¾îÁÖ´Â ¸Þ½ÃÁö.
			GLMSG::SNETPC_INVEN_INSERT NetMsgInven;
			NetMsgInven.bVietnamInven = TRUE;
			NetMsgInven.Data = *pInvenItem;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInven);
		}

		//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
		//
		GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
		if ( pParty )
		{
			GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
			NetMsg.dwGaeaID = m_dwGaeaID;
			NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
			pParty->SENDMSG2NEAR ( this, &NetMsg );
		}

		//	Note : ¾ÆÀÌÅÛ ½Àµæ½Ã ÀÚµ¿ Äù½ºÆ® ½ÃÀÛ Á¡°Ë.
		//  ³ªÁß¿¡ »ìÆìºÁ¾ß ÇÒ°÷ 
		//QuestStartFromGetITEM ( pItemDrop->sItemCustom.sNativeID );

		//	Note : PILE °ãħ ¾ÆÀÌÅÛÀ̹ǷΠ·Î±× ÀÛ¼º ºÒ°¡´É.
		//

		//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
		m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );
	}
	else
	{
		WORD wPosX, wPosY;
		BOOL bOk = m_cVietnamInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )			return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

		//	Note : ¾ÆÀÌÅÆ Áݱ⠼º°ø.
		pItemDrop->sItemCustom.bVietnamGainItem = true;
		m_cVietnamInventory.InsertItem ( pItemDrop->sItemCustom, wPosX, wPosY );
		SINVENITEM *pInvenItem = m_cVietnamInventory.GetItem ( wPosX, wPosY );
		if ( !pInvenItem )	return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

		//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
		//
		GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
		if ( pParty )
		{
			GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
			NetMsg.dwGaeaID = m_dwGaeaID;
			NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
			pParty->SENDMSG2NEAR ( this, &NetMsg );
		}



		//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.bVietnamInven = TRUE;
		NetMsg_Inven.Data = *pInvenItem;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);

		//	Note : ¾ÆÀÌÅÛ ½Àµæ½Ã ÀÚµ¿ Äù½ºÆ® ½ÃÀÛ Á¡°Ë.
		//  ³ªÁß¿¡ »ìÆìºÁ¾ß ÇÒ°÷ 
		//QuestStartFromGetITEM ( pItemDrop->sItemCustom.sNativeID );

		//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
		m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );
	}


	return S_OK;
}

HRESULT GLChar::InsertToInven ( PITEMDROP pItemDrop )
{
	//NeedToSaveValue _C

	GASSERT(pItemDrop&&"GLChar::InsertToInven()");
	if ( !pItemDrop )	return E_FAIL;

	SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemCustom.sNativeID);
	if ( !pItem )		return E_FAIL;

	bool bITEM_SPACE = IsInsertToInven ( pItemDrop );
	if ( !bITEM_SPACE )
	{
		//	ÀιêÀÌ °¡µæÂ÷¼­ ¾ÆÀÌÅÆÀ» ³ÖÀ»¼ö ¾ø½À´Ï´Ù.
		GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
		NetMsg.emCrow = CROW_ITEM;
		NetMsg.emTakeFB = EMTAKE_FB_INVEN_ERROR;

		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
		return E_FAIL;
	}

	if ( pItem->ISPILE() )
	{
		WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
		WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

		//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
		WORD wPILENUM = pItem->sDrugOp.wPileNum;
		SNATIVEID sNID = pItem->sBasicOp.sNativeID;

		//	³Ö±â ¿äûµÈ ¾ÆÀÌÅÛ¼ö. ( ÀÜ¿©·®. )
		WORD wREQINSRTNUM = ( pItemDrop->sItemCustom.wTurnNum );

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( pItemDrop->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pItemDrop->sItemCustom.wTurnNum );

		//	Note : ´õ °ãÃÄÁú¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö °Ë»çÇÏ¿© Àκ¥¿¡ µé¾î°¡¾ßÇÏ´Â
		//		¾ÆÀÌÅÛ Á¡°Ë ¼ýÀÚ¸¦ °¨¼Ò½ÃÅ´.
		GLInventory::CELL_MAP &ItemMap = *m_cInventory.GetItemList();
		GLInventory::CELL_MAP_ITER iter = ItemMap.begin();
		for ( ; iter!=ItemMap.end(); ++iter )
		{
			SINVENITEM &sINVENITEM = *(*iter).second;
			SITEMCUSTOM &sITEMCUSTOM = sINVENITEM.sItemCustom;
			if ( sITEMCUSTOM.sNativeID != sNID )		continue;
			if ( sITEMCUSTOM.wTurnNum>=wPILENUM )		continue;
		
			//	±âÁ¸ ¾ÆÀÌÅÛ °ãħ ¿©À¯ºÐ.
			WORD wSURPLUSNUM = wPILENUM - sITEMCUSTOM.wTurnNum;

			if ( wREQINSRTNUM > wSURPLUSNUM )
			{
				//	Note : ±âÁ¸ ¾ÆÀÌÅÛÀÇ °ãħÀ» º¯°æ. ( ²ËÂü )
				sITEMCUSTOM.wTurnNum = wPILENUM;

				//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
				GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
				NetMsg.wPosX = sINVENITEM.wPosX;
				NetMsg.wPosY = sINVENITEM.wPosY;
				NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

				//	Note : ÀÜ¿© ¼ö·® °¨¼Ò.
				wREQINSRTNUM -= wSURPLUSNUM;
			}
			else
			{
				//	Note : ±âÁ¸ ¾ÆÀÌÅÛ¿¡ °ãÄ¡´Â °Í ¸¸À¸·Îµµ »õ·Î ³ÖÀ» ¾ÆÀÌÅÛÀÌ ÃæºÐÈ÷ µé¾î°¨.
				sITEMCUSTOM.wTurnNum += wREQINSRTNUM;

				//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
				GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
				NetMsg.wPosX = sINVENITEM.wPosX;
				NetMsg.wPosY = sINVENITEM.wPosY;
				NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

				//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
				//
				GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
				if ( pParty )
				{
					GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
					NetMsg.dwGaeaID = m_dwGaeaID;
					NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
					pParty->SENDMSG2NEAR ( this, &NetMsg );
				}

				GLMSG::SNETPC_PICKUP_ITEM NetMsgPickUp;
				NetMsgPickUp.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPickUp);

				//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
				m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );

				return S_OK;
			}
		}

		//	Note : »õ·ÎÀÌ Àκ¥¿¡ µé¾î°¡¾ßÇÒ ¾ÆÀÌÅÛÀÇ °¹¼ö ÆľÇÈÄ Àκ¥¿¡ µé¾î°¥ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.

		//	ÃÖ´ë°ãħ¾ÆÀÌÅÛ ¼ö·®.
		WORD wONENUM = wREQINSRTNUM / wPILENUM;
		WORD wITEMNUM = wONENUM;

		//	¿©ºÐ°ãħ¾ÆÀÌÅÛÀÇ °ãħ¼ö.
		WORD wSPLITNUM = wREQINSRTNUM % wPILENUM;
		if ( wSPLITNUM > 0 )				wITEMNUM += 1;
		if ( wSPLITNUM==0 && wITEMNUM>=1 )	wSPLITNUM = wPILENUM;

		for ( WORD i=0; i<wITEMNUM; ++i )
		{
			WORD wInsertPosX(0), wInsertPosY(0);
			BOOL bSPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );
			GASSERT(bSPACE&&"³ÖÀ» °ø°£À» ¹Ì¸® üũ¸¦ ÇÏ°í ¾ÆÀÌÅÛÀ» ³Ö¾úÀ¸³ª °ø°£ÀÌ ºÎÁ·ÇÔ.");
			if ( !bSPACE )			return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

			//	Note : »õ·Î¿î ¾ÆÀÌÅÛÀ» ³Ö¾îÁÜ.
			//
			SITEMCUSTOM sITEMCUSTOM = pItemDrop->sItemCustom;
			if ( wITEMNUM==(i+1) )	sITEMCUSTOM.wTurnNum = wSPLITNUM;	//	¸¶Áö¸· ¾ÆÀÌÅÛÀº ÀÜ¿©·®.
			else					sITEMCUSTOM.wTurnNum = wPILENUM;	//	¾Æ´Ò °æ¿ì´Â ²ËÂù·®.

			//	ÀιêÅ丮¿¡ ³Ö½À´Ï´Ù.
			m_cInventory.InsertItem ( sITEMCUSTOM, wInsertPosX, wInsertPosY );
			SINVENITEM *pInvenItem = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );
			if ( !pInvenItem )		return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

			//	Àι꿡 ¾ÆÀÌÅÆ ³Ö¾îÁÖ´Â ¸Þ½ÃÁö.
			GLMSG::SNETPC_INVEN_INSERT NetMsgInven;
			NetMsgInven.Data = *pInvenItem;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInven);
		}

		//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
		//
		GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
		if ( pParty )
		{
			GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
			NetMsg.dwGaeaID = m_dwGaeaID;
			NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
			pParty->SENDMSG2NEAR ( this, &NetMsg );
		}

		GLMSG::SNETPC_PICKUP_ITEM NetMsgPickUp;
		NetMsgPickUp.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPickUp);

		//	Note : ¾ÆÀÌÅÛ ½Àµæ½Ã ÀÚµ¿ Äù½ºÆ® ½ÃÀÛ Á¡°Ë.
		//
		QuestStartFromGetITEM ( pItemDrop->sItemCustom.sNativeID );

		//	Note : PILE °ãħ ¾ÆÀÌÅÛÀ̹ǷΠ·Î±× ÀÛ¼º ºÒ°¡´É.
		//

		//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
		m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );
	}
	else
	{
		WORD wPosX, wPosY;
		BOOL bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )			return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

		//	Note : ¾ÆÀÌÅÆ Áݱ⠼º°ø.
		m_cInventory.InsertItem ( pItemDrop->sItemCustom, wPosX, wPosY );
		SINVENITEM *pInvenItem = m_cInventory.GetItem ( wPosX, wPosY );
		if ( !pInvenItem )	return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

		//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
		//
		GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
		if ( pParty )
		{
			GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
			NetMsg.dwGaeaID = m_dwGaeaID;
			NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
			pParty->SENDMSG2NEAR ( this, &NetMsg );
		}

		GLMSG::SNETPC_PICKUP_ITEM NetMsgPickUp;
		NetMsgPickUp.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPickUp);

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( pInvenItem->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pInvenItem->sItemCustom.wTurnNum );

		//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.Data = *pInvenItem;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);

		//	Note : ¾ÆÀÌÅÛ ½Àµæ½Ã ÀÚµ¿ Äù½ºÆ® ½ÃÀÛ Á¡°Ë.
		//
		QuestStartFromGetITEM ( pItemDrop->sItemCustom.sNativeID );

		//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
		m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );
	}

	return S_OK;
}


HRESULT GLChar::InsertToInvenEx ( PITEMDROP pItemDrop )
{
	GASSERT(pItemDrop&&"GLChar::InsertToInven()");
	if ( !pItemDrop )	return E_FAIL;

	SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemCustom.sNativeID);
	if ( !pItem )		return E_FAIL;

	bool bITEM_SPACE = IsInsertToInvenEx ( pItemDrop );
	if ( !bITEM_SPACE )
	{
		//	ÀιêÀÌ °¡µæÂ÷¼­ ¾ÆÀÌÅÆÀ» ³ÖÀ»¼ö ¾ø½À´Ï´Ù.
		GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
		NetMsg.emCrow = CROW_ITEM;
		NetMsg.emTakeFB = EMTAKE_FB_INVEN_ERROR;

		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
		return E_FAIL;
	}

	if ( pItem->ISPILE() )
	{
		WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
		WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

		//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
		WORD wPILENUM = pItem->sDrugOp.wPileNum;
		SNATIVEID sNID = pItem->sBasicOp.sNativeID;

		//	³Ö±â ¿äûµÈ ¾ÆÀÌÅÛ¼ö. ( ÀÜ¿©·®. )
		WORD wREQINSRTNUM = ( pItemDrop->sItemCustom.wTurnNum );

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( pItemDrop->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pItemDrop->sItemCustom.wTurnNum );

		//	Note : ´õ °ãÃÄÁú¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö °Ë»çÇÏ¿© Àκ¥¿¡ µé¾î°¡¾ßÇÏ´Â
		//		¾ÆÀÌÅÛ Á¡°Ë ¼ýÀÚ¸¦ °¨¼Ò½ÃÅ´.
		GLInventory::CELL_MAP &ItemMap = *m_cInventory.GetItemList();
		GLInventory::CELL_MAP_ITER iter = ItemMap.begin();
		for ( ; iter!=ItemMap.end(); ++iter )
		{
			SINVENITEM &sINVENITEM = *(*iter).second;
			SITEMCUSTOM &sITEMCUSTOM = sINVENITEM.sItemCustom;
			if ( sITEMCUSTOM.sNativeID != sNID )		continue;
			if ( sITEMCUSTOM.wTurnNum>=wPILENUM )		continue;
		
			//	±âÁ¸ ¾ÆÀÌÅÛ °ãħ ¿©À¯ºÐ.
			WORD wSURPLUSNUM = wPILENUM - sITEMCUSTOM.wTurnNum;

			if ( wREQINSRTNUM > wSURPLUSNUM )
			{
				//	Note : ±âÁ¸ ¾ÆÀÌÅÛÀÇ °ãħÀ» º¯°æ. ( ²ËÂü )
				sITEMCUSTOM.wTurnNum = wPILENUM;

				//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
				GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
				NetMsg.wPosX = sINVENITEM.wPosX;
				NetMsg.wPosY = sINVENITEM.wPosY;
				NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

				//	Note : ÀÜ¿© ¼ö·® °¨¼Ò.
				wREQINSRTNUM -= wSURPLUSNUM;
			}
			else
			{
				//	Note : ±âÁ¸ ¾ÆÀÌÅÛ¿¡ °ãÄ¡´Â °Í ¸¸À¸·Îµµ »õ·Î ³ÖÀ» ¾ÆÀÌÅÛÀÌ ÃæºÐÈ÷ µé¾î°¨.
				sITEMCUSTOM.wTurnNum += wREQINSRTNUM;

				//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
				GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
				NetMsg.wPosX = sINVENITEM.wPosX;
				NetMsg.wPosY = sINVENITEM.wPosY;
				NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

				//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
				//
				GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
				if ( pParty )
				{
					GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
					NetMsg.dwGaeaID = m_dwGaeaID;
					NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
					pParty->SENDMSG2NEAR ( this, &NetMsg );
				}

				GLMSG::SNETPC_PICKUP_ITEM NetMsgPickUp;
				NetMsgPickUp.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPickUp);

				//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
				m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );

				return S_OK;
			}
		}

		//	Note : »õ·ÎÀÌ Àκ¥¿¡ µé¾î°¡¾ßÇÒ ¾ÆÀÌÅÛÀÇ °¹¼ö ÆľÇÈÄ Àκ¥¿¡ µé¾î°¥ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.

		//	ÃÖ´ë°ãħ¾ÆÀÌÅÛ ¼ö·®.
		WORD wONENUM = wREQINSRTNUM / wPILENUM;
		WORD wITEMNUM = wONENUM;

		//	¿©ºÐ°ãħ¾ÆÀÌÅÛÀÇ °ãħ¼ö.
		WORD wSPLITNUM = wREQINSRTNUM % wPILENUM;
		if ( wSPLITNUM > 0 )				wITEMNUM += 1;
		if ( wSPLITNUM==0 && wITEMNUM>=1 )	wSPLITNUM = wPILENUM;

		for ( WORD i=0; i<wITEMNUM; ++i )
		{
			WORD wInsertPosX(0), wInsertPosY(0);

			// È°¼ºÈ­µÈ Àκ¥¿¡ ¿ì¼±Àû ¹èÄ¡...( ±âÁ¸ °Ë»ö¼ø¼­°¡ ¼¼·Î ¿ì¼±ÀÌ¶ó¼­ º¯°æ Çϱ⠾ָÅÇÔ. ) 
			BOOL bSPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );
			if ( !bSPACE )
			{
				bSPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY, true );
				
				GASSERT(bSPACE&&"³ÖÀ» °ø°£À» ¹Ì¸® üũ¸¦ ÇÏ°í ¾ÆÀÌÅÛÀ» ³Ö¾úÀ¸³ª °ø°£ÀÌ ºÎÁ·ÇÔ.");
				if ( !bSPACE )			return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.
			}

			//	Note : »õ·Î¿î ¾ÆÀÌÅÛÀ» ³Ö¾îÁÜ.
			//
			SITEMCUSTOM sITEMCUSTOM = pItemDrop->sItemCustom;
			if ( wITEMNUM==(i+1) )	sITEMCUSTOM.wTurnNum = wSPLITNUM;	//	¸¶Áö¸· ¾ÆÀÌÅÛÀº ÀÜ¿©·®.
			else					sITEMCUSTOM.wTurnNum = wPILENUM;	//	¾Æ´Ò °æ¿ì´Â ²ËÂù·®.

			//	ÀιêÅ丮¿¡ ³Ö½À´Ï´Ù.
			m_cInventory.InsertItem ( sITEMCUSTOM, wInsertPosX, wInsertPosY, true );
			SINVENITEM *pInvenItem = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );
			if ( !pInvenItem )		return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

			//	Àι꿡 ¾ÆÀÌÅÆ ³Ö¾îÁÖ´Â ¸Þ½ÃÁö.
			GLMSG::SNETPC_INVEN_INSERT NetMsgInven;
			NetMsgInven.Data = *pInvenItem;
			NetMsgInven.bAllLine = true;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInven);
		}

		//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
		//
		GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
		if ( pParty )
		{
			GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
			NetMsg.dwGaeaID = m_dwGaeaID;
			NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
			pParty->SENDMSG2NEAR ( this, &NetMsg );
		}

		GLMSG::SNETPC_PICKUP_ITEM NetMsgPickUp;
		NetMsgPickUp.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPickUp);

		//	Note : ¾ÆÀÌÅÛ ½Àµæ½Ã ÀÚµ¿ Äù½ºÆ® ½ÃÀÛ Á¡°Ë.
		//
		QuestStartFromGetITEM ( pItemDrop->sItemCustom.sNativeID );

		//	Note : PILE °ãħ ¾ÆÀÌÅÛÀ̹ǷΠ·Î±× ÀÛ¼º ºÒ°¡´É.
		//

		//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
		m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );
	}
	else
	{
		WORD wPosX = 0, wPosY = 0;

		// È°¼ºÈ­µÈ Àκ¥¿¡ ¿ì¼±Àû ¹èÄ¡...( ±âÁ¸ °Ë»ö¼ø¼­°¡ ¼¼·Î ¿ì¼±ÀÌ¶ó¼­ º¯°æ Çϱ⠾ָÅÇÔ. ) 
		BOOL bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )
		{
				bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY, true );
				
				GASSERT(bOk&&"³ÖÀ» °ø°£À» ¹Ì¸® üũ¸¦ ÇÏ°í ¾ÆÀÌÅÛÀ» ³Ö¾úÀ¸³ª °ø°£ÀÌ ºÎÁ·ÇÔ.");
				if ( !bOk )			return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.
		}

		//	Note : ¾ÆÀÌÅÆ Áݱ⠼º°ø.
		m_cInventory.InsertItem ( pItemDrop->sItemCustom, wPosX, wPosY, true );
		SINVENITEM *pInvenItem = m_cInventory.GetItem ( wPosX, wPosY );
		if ( !pInvenItem )	return E_FAIL;	//	½ÇÁ¦·Î´Â Á¡°ËÀÌ ³¡³´±â ¶§¹®¿¡ ¿À·ù¹ß»ý °¡´É¼ºÀÌ ¾øÀ½.

		//	Note : ÆÄƼ¿øÀÏ °æ¿ì ´Ù¸¥ ÆÄƼ¿ø¿¡°Ô ¾ÆÀÌÅÛ ½Àµæ ¾Ë¸².
		//
		GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
		if ( pParty )
		{
			GLMSG::SNETPC_PARTY_MBR_PICKUP_BRD NetMsg;
			NetMsg.dwGaeaID = m_dwGaeaID;
			NetMsg.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
			pParty->SENDMSG2NEAR ( this, &NetMsg );
		}

		GLMSG::SNETPC_PICKUP_ITEM NetMsgPickUp;
		NetMsgPickUp.sNID_ITEM = pItemDrop->sItemCustom.sNativeID;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPickUp);

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( pInvenItem->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pInvenItem->sItemCustom.wTurnNum );

		//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.Data = *pInvenItem;
		NetMsg_Inven.bAllLine = true;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);

		//	Note : ¾ÆÀÌÅÛ ½Àµæ½Ã ÀÚµ¿ Äù½ºÆ® ½ÃÀÛ Á¡°Ë.
		//
		QuestStartFromGetITEM ( pItemDrop->sItemCustom.sNativeID );

		//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
		m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );
	}

	return S_OK;
}

void GLChar::DisableSkillFact()
{
	EMSLOT emRHand = GetCurRHand();	
	SITEM* pRightItem = GET_SLOT_ITEMDATA(emRHand);		

	for ( int i=0; i<SKILLFACT_SIZE; ++i )
	{
		if ( m_sSKILLFACT[i].sNATIVEID == NATIVEID_NULL() ) continue;
	
        PGLSKILL pSkill = GLSkillMan::GetInstance().GetData ( m_sSKILLFACT[i].sNATIVEID );
		if ( !pSkill ) continue;

		// ½ºÅ³ ÀڽŠ¹öÇÁ
		if ( pSkill->m_sBASIC.emIMPACT_TAR != TAR_SELF || pSkill->m_sBASIC.emIMPACT_REALM != REALM_SELF ) continue;
				
		GLITEM_ATT emSKILL_RITEM = pSkill->m_sBASIC.emUSE_RITEM;

		// ½ºÅ³ µµ±¸ Á¾¼Ó ¾øÀ½
		if ( emSKILL_RITEM == ITEMATT_NOCARE )	continue;

		// ½ºÅ³ °ú ¹«±â°¡ ºÒÀÏÄ¡
		if( !pRightItem || !CHECHSKILL_ITEM(emSKILL_RITEM,pRightItem->sSuitOp.emAttack) )
		{
			DISABLESKEFF( i );
		}
	}
}

//************************************
// Method:    InsertMoney
// FullName:  GLChar::InsertMoney
// Access:    public 
// Returns:   void
// Qualifier:
// Parameter: LONGLONG lnAmount
// Explanation: ÇöÀç´Â ÆÄƼ¿¡¼­ ±Ý¾× ºÐ¹è½Ã »ç¿ëµÇ´Â ÇÔ¼öÀÌ´Ù
//************************************
void GLChar::InsertMoney ( LONGLONG lnAmount )
{
	//	µ· ½Àµæ.

	lnAmount = CalculateInsertmoney( lnAmount );

	CheckMoneyUpdate( m_lnMoney, lnAmount, TRUE, "Insert Party Money." );
	m_bMoneyUpdate = TRUE;

	m_lnMoney += lnAmount;

	//	Note : ±Ý¾× ·Î±×.
	//
	if ( lnAmount>EMMONEY_LOG )
	{
		GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, 0, ID_CHAR, m_dwCharID, lnAmount, EMITEM_ROUTE_GROUND );
		GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
	}

#if defined(_RELEASED) || defined(TW_PARAM) || defined(TH_PARAM) || defined(HK_PARAM)// ***Tracing Log print
	if ( m_bTracingUser )
	{
		NET_LOG_UPDATE_TRACINGCHAR TracingMsg;
		TracingMsg.nUserNum  = GetUserID();
		StringCchCopy( TracingMsg.szAccount, USR_ID_LENGTH+1, m_szUID );

		CString strTemp;
		strTemp.Format( "Insert Party Money, [%s][%s], Insert Amount:[%I64d], Have Money:[%I64d]",
				 m_szUID, m_szName,  lnAmount, m_lnMoney );

		StringCchCopy( TracingMsg.szLogMsg, TRACING_LOG_SIZE, strTemp.GetString() );

		m_pGLGaeaServer->SENDTOAGENT( m_dwClientID, &TracingMsg );
	}
#endif

#if defined(VN_PARAM) //vietnamtest%%%
	if( lnAmount != 0 )
#endif
	{
		//	±Ý¾× º¯È­ Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë·ÁÁÜ.
		GLMSG::SNETPC_UPDATE_MONEY NetMsg;
		NetMsg.lnMoney = m_lnMoney;
		//add money 2
		NetMsg.lnVoteP = m_lnVoteP;
		//add money 3
		NetMsg.lnPremP = m_lnPremP;
		//add contributionpoints by CNDev
		NetMsg.lnContribP = m_lnContribP;
		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
	}

#if defined(VN_PARAM) //vietnamtest%%%
	GLMSG::SNETPC_VIETNAM_GAIN_MONEY NetMsg2;
	NetMsg2.gainMoney = m_lVNGainSysMoney;
	GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg2 );
#endif
}

LONGLONG GLChar::CalculateInsertmoney( LONGLONG lnAmount )
{
	LONGLONG lnMoney = lnAmount;
	//	µ· ½Àµæ.	
	lnMoney = lnMoney * (m_pGLGaeaServer->GetMoneyGainRate(m_CHARINDEX,m_wLevel) + m_pGLGaeaServer->GetMoneyGainRate(m_wSchool) - 1);

#if defined(TH_PARAM) || defined(MYE_PARAM ) || defined(MY_PARAM) || defined(KR_PARAM)
	if( m_dwThaiCCafeClass == 1 || m_nMyCCafeClass == 1 ) // Aµî±Þ
	{
		lnMoney *= 2;
	}else if( m_dwThaiCCafeClass == 2 || m_nMyCCafeClass == 2 ) // Bµî±Þ
	{
		lnMoney *= 1.75f;
	}else if( m_dwThaiCCafeClass == 3 || m_nMyCCafeClass == 3 ) // Cµî±Þ
	{
		lnMoney *= 1.5f;
	}
#endif

#ifdef CH_PARAM_USEGAIN //chinaTest%%%
	if( m_ChinaGainType == GAINTYPE_HALF )
	{
		lnMoney /= 2;
	}else if( m_ChinaGainType == GAINTYPE_EMPTY )
	{
		lnMoney = 0;
	}
#endif

	//NeedToSaveValue_B
#if defined(VN_PARAM) //vietnamtest%%%
	if( m_dwVietnamGainType == GAINTYPE_HALF )
	{
		lnMoney /= 2;
		m_lVNGainSysMoney += lnMoney;
	}else if( m_dwVietnamGainType == GAINTYPE_EMPTY )
	{
		m_lVNGainSysMoney += lnMoney;
		lnMoney = 0;		
	}
#endif

	return lnMoney;
}

HRESULT GLChar::InsertToInven ( PMONEYDROP pMoneyDrop )
{
	//	µ· ½Àµæ.	
	if( pMoneyDrop->bDropMonster )
	{
		pMoneyDrop->lnAmount = CalculateInsertmoney( pMoneyDrop->lnAmount );
	}
	

	CheckMoneyUpdate( m_lnMoney, pMoneyDrop->lnAmount, TRUE, "Insert Money." );
	m_bMoneyUpdate = TRUE;

	m_lnMoney += pMoneyDrop->lnAmount;

	//	Note : ±Ý¾× ·Î±×.
	//
	if ( pMoneyDrop->lnAmount>EMMONEY_LOG )
	{
		GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, 0, ID_CHAR, m_dwCharID, pMoneyDrop->lnAmount, EMITEM_ROUTE_GROUND );
		GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
	}

#if defined(_RELEASED) || defined(TW_PARAM) || defined(TH_PARAM) || defined(HK_PARAM) // ***Tracing Log print
	if ( m_bTracingUser )
	{
		NET_LOG_UPDATE_TRACINGCHAR TracingMsg;
		TracingMsg.nUserNum  = GetUserID();
		StringCchCopy( TracingMsg.szAccount, USR_ID_LENGTH+1, m_szUID );

		CString strTemp;
		strTemp.Format( "Insert Money, [%s][%s], Insert Amount:[%I64d], Have Money:[%I64d]",
			m_szUID, m_szName, pMoneyDrop->lnAmount, m_lnMoney );

		StringCchCopy( TracingMsg.szLogMsg, TRACING_LOG_SIZE, strTemp.GetString() );

		m_pGLGaeaServer->SENDTOAGENT( m_dwClientID, &TracingMsg );
	}
#endif

#if defined(VN_PARAM) //vietnamtest%%%
	if( pMoneyDrop->lnAmount != 0 )
#endif
	{
		GLMSG::SNETPC_PICKUP_MONEY NetMsg;
		NetMsg.lnMoney = m_lnMoney;
		NetMsg.lnPickUp = pMoneyDrop->lnAmount;
		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
	}

#if defined(VN_PARAM) //vietnamtest%%%
	GLMSG::SNETPC_VIETNAM_GAIN_MONEY NetMsg2;
	NetMsg2.gainMoney = m_lVNGainSysMoney;
	GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg2 );
#endif

	//	µ·À» Land¿¡¼­ »èÁ¦.
	m_pLandMan->DropOutMoney ( pMoneyDrop->dwGlobID );

	return S_OK;
}

//	Note : FieldÀÇ ¾ÆÀÌÅÆ,µ·À» Inventory ¿¡ ³Ö±â ½Ãµµ.
//
HRESULT GLChar::MsgReqFieldToInven ( NET_MSG_GENERIC* nmg )
{
	if ( !m_pLandMan )	return E_FAIL;

	GLMSG::SNETPC_REQ_FIELD_TO_INVEN *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_FIELD_TO_INVEN*> ( nmg );

	

	if ( pNetMsg->emCrow==CROW_ITEM )
	{
		PITEMDROP pItemDrop = m_pLandMan->GetItem ( pNetMsg->dwID );

		if ( !pItemDrop )
		{
			//	¾ÆÀÌÅÆÀÌ »ç¶óÁ³½À´Ï´Ù.
			GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
			NetMsg.emCrow = CROW_ITEM;
			NetMsg.emTakeFB = EMTAKE_FB_OFF;

			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
			return E_FAIL;
		}

		// »ç¸ÁÈ®ÀÎ
		if ( !IsValidBody() )	return E_FAIL;

		//	°Å¸® üũ
		D3DXVECTOR3 vPos;

		if ( pNetMsg->bPet )	
		{
			PGLPETFIELD pMyPet = GLGaeaServer::GetInstance().GetPET ( m_dwPetGUID );
			if ( pMyPet )	vPos = pMyPet->m_vPos;
		}	
		else vPos = m_vPos;

		const D3DXVECTOR3 &vTarPos = pItemDrop->vPos;

		D3DXVECTOR3 vDistance = vPos - vTarPos;
		float fDistance = D3DXVec3Length ( &vDistance );

		WORD wTarBodyRadius = 4;
		WORD wTakeRange = wTarBodyRadius + GETBODYRADIUS() + 2;
		WORD wTakeAbleDis = wTakeRange + 15;

		if ( fDistance>wTakeAbleDis )
		{
			//	°Å¸®°¡ ¸Ù´Ï´Ù.
			GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
			NetMsg.emCrow = CROW_ITEM;
			NetMsg.emTakeFB = EMTAKE_FB_DISTANCE;

			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
						
			return E_FAIL;
		}

        // Çʵ忡¼­ ÁÖ¿î°æ¿ì ½ÃÈ¿¼º üũ( Ŭ·´¶ôÄ¿ ¹ö±× ´ëó )
		{	
			GLITEMLMT & glItemmt = GLITEMLMT::GetInstance();
			GLItemMan & glItemMan = GLItemMan::GetInstance();
			SITEMCUSTOM sCUSTOM = pItemDrop->sItemCustom;
			const CTime cTIME_CUR = CTime::GetCurrentTime();
			
			SITEM *pITEM = glItemMan.GetItem ( sCUSTOM.sNativeID );
			if ( !pITEM )	return E_FAIL;

			bool bDELETE(false);

			if ( pITEM->IsTIMELMT() )
			{			
				
				CTimeSpan cSPAN(pITEM->sDrugOp.tTIME_LMT);
				CTime cTIME_LMT(sCUSTOM.tBORNTIME);
				cTIME_LMT += cSPAN;

				if ( cTIME_CUR > cTIME_LMT )
				{
					//	½Ã°£ Á¦ÇÑÀ¸·Î ¾ÆÀÌÅÛ »èÁ¦ ·Î±× ³²±è.
					glItemmt.ReqItemRoute ( sCUSTOM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, sCUSTOM.wTurnNum );

					//	½Ã°£ Á¦ÇÑÀ¸·Î ¾ÆÀÌÅÛ »èÁ¦ ¾Ë¸².
					GLMSG::SNET_INVEN_DEL_ITEM_TIMELMT NetMsgInvenDelTimeLmt;
					NetMsgInvenDelTimeLmt.nidITEM = sCUSTOM.sNativeID;
					m_pGLGaeaServer->SENDTOCLIENT(m_dwClientID,&NetMsgInvenDelTimeLmt);

					bDELETE = true;				

					//	Note : ÄÚ½ºÅù º¹±¸.
					if ( sCUSTOM.nidDISGUISE!=SNATIVEID(false) )
					{
						SITEM *pONE = glItemMan.GetItem ( sCUSTOM.nidDISGUISE );
						if ( !pONE )		return E_FAIL;

						SITEMCUSTOM sITEM_NEW;
						sITEM_NEW.sNativeID = sCUSTOM.nidDISGUISE;
						CTime cTIME = CTime::GetCurrentTime();
						if ( sCUSTOM.tDISGUISE!=0 && pONE->sDrugOp.tTIME_LMT!= 0 )
						{
							cTIME = CTime(sCUSTOM.tDISGUISE);

							CTimeSpan tLMT(pONE->sDrugOp.tTIME_LMT);
							cTIME -= tLMT;
						}

						//	Note : ¾ÆÀÌÅÛ »ý¼º.
						//
						sITEM_NEW.tBORNTIME = cTIME.GetTime();
						sITEM_NEW.wTurnNum = 1;
						sITEM_NEW.cGenType = EMGEN_BILLING;
						sITEM_NEW.cChnID = (BYTE)m_pGLGaeaServer->GetServerChannel();
						sITEM_NEW.cFieldID = (BYTE)m_pGLGaeaServer->GetFieldSvrID();
						sITEM_NEW.lnGenNum = glItemmt.RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

						// »ý¼ºµÈ ÄÚ½ºÅùÀº ¹Ù´Ú¿¡¼­ ´Ù½Ã ¶³±º´Ù.
						CItemDrop cDropItem;
						cDropItem.sItemCustom = sITEM_NEW;
						m_pLandMan->DropItem ( m_vPos, &(cDropItem.sItemCustom), EMGROUP_ONE, m_dwGaeaID );

						//	Note : ºÐ¸®µÈ ÄÚ½ºÅù ·Î±×.
						glItemmt.ReqItemRoute ( sITEM_NEW, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_GROUND, sITEM_NEW.wTurnNum );												
					}
					
					m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );

					return E_FAIL;
				}
			}
			
			if ( !bDELETE && sCUSTOM.nidDISGUISE!=SNATIVEID(false) )
			{
				if ( sCUSTOM.tDISGUISE != 0 )
				{
					CTime cTIME_LMT(sCUSTOM.tDISGUISE);
					if ( cTIME_LMT.GetYear()!=1970 )
					{
						if ( cTIME_CUR > cTIME_LMT )
						{
							//	½Ã°£ Á¦ÇÑÀ¸·Î ¾ÆÀÌÅÛ »èÁ¦ ¾Ë¸².
							GLMSG::SNET_INVEN_DEL_ITEM_TIMELMT NetMsgInvenDelTimeLmt;
							NetMsgInvenDelTimeLmt.nidITEM = sCUSTOM.nidDISGUISE;
							m_pGLGaeaServer->SENDTOCLIENT(m_dwClientID,&NetMsgInvenDelTimeLmt);

							//	Note : ÄÚ½ºÅù Á¤º¸ ¸®¼Â.
							pItemDrop->sItemCustom.tDISGUISE = 0;
							pItemDrop->sItemCustom.nidDISGUISE = SNATIVEID(false);
						}
					}
				}
			}		
		}
		// ¾ÆÀÌÅÛÀÌ ÀڽŰú µ¿ÀÏÇÑ ¸Ê¿¡ ÀÖ´ÂÁö ( ¼±µµÀü Á¾·áÈÄ ºñÀÎÁõŬ·´¿øÀÌ ¼±µµ¹«±â ȹµæÇÏ´Â ¹ö±× ´ëó )
		if ( pItemDrop->sMapID != m_sMapID )	return E_FAIL;

		if ( !pItemDrop->IsTakeItem(m_dwPartyID,m_dwGaeaID) )
		{
			//	¾ÆÀÌÅÆÀÌ ´Ù¸¥ »ç¶÷¿¡°Ô ¿¹¾àµÇ¾î ÀÖ½À´Ï´Ù.
			GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
			NetMsg.emCrow = CROW_ITEM;
			NetMsg.emTakeFB = EMTAKE_FB_RESERVED;

			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
			return E_FAIL;
		}

		SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemCustom.sNativeID);
		if ( !pItem )		return E_FAIL;

		if ( pItem->sBasicOp.emItemType==ITEM_QITEM )
		{
			TourchQItem ( pNetMsg->dwID );
			return S_OK;
		}

		//	Note : ÆÄƼ¿øÀÌ°í À̺¥Æ® ¾ÆÀÌÅÛÀÌ ¾Æ´Ò¶§ ÆÄƼ ·çÆÃÀÎÁö °Ë»çÈÄ Ã³¸®.
		//
		GLPARTY_FIELD* pParty = GLGaeaServer::GetInstance().GetParty(m_dwPartyID);
		if ( pParty && !pItem->ISEVENTITEM() )
		{
			bool ballot = pParty->DOITEM_ALLOT ( this, pItemDrop );
			if ( ballot )		return S_OK;
		}

		//	Note : À̺¥Æ® ¾ÆÀÌÅÛ Áߺ¹À¸·Î °¡Á®°¡±â ¹æÁö.
		//
		/*if ( pItem->ISEVENTITEM() && m_cInventory.HaveEventItem() )
		{
			//	ÀÌ¹Ì À̺¥Æ® ¾ÆÀÌÅÛÀ» °¡Áö°í ÀÖ½À´Ï´Ù.
			GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
			NetMsg.emCrow = CROW_ITEM;
			NetMsg.emTakeFB = EMTAKE_FB_TOO_EVENT_ITEM;

			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );

			return E_FAIL;
		}*/

		//	Note : ¾ÆÀÌÅÛ Àκ¥¿¡ ³ÖÀ½ ( Àκ¥ÀÌ °¡µæ Â÷ÀÖÀ» ¶§´Â ½Àµæ ºÒ°¡´É. ) º£Æ®³²ÀÏ °æ¿ì Ž´Ð Àκ¥Å丮¿¡ ³ÖÀ» ¼öµµ ÀÖ´Ù.
		//

#if defined(VN_PARAM) //vietnamtest%%%
		if( m_dwVietnamGainType == GAINTYPE_EMPTY )
		{
 			InsertToVNGainInven( pItemDrop );
		}else{
			InsertToInven ( pItemDrop );
		}
#else
		InsertToInven ( pItemDrop );
#endif


/*
		// ȹµæÇÑ ¾ÆÀÌÅÛÀÌ ÆÖÄ«µå && »ý¼ºµÈ ÆÖÀ̶ó¸é ¼ÒÀ¯±ÇÀ» ÀÌÀüÇÑ´Ù.
		// ÆÖ¾ÆÀ̵𰡠0 ÀÌ ¾Æ´Ï¸é ÆÖÄ«µåÀ̸鼭 DB¿¡ ÆÖÀÌ »ý¼ºµÈ °ÍÀÌ´Ù.
		if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD && pItemDrop->sItemCustom.dwPetID != 0 )
		{
			CExchangePet* pDbAction = new CExchangePet ( m_dwCharID, pItemDrop->sItemCustom.dwPetID );
			GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
			if ( pDBMan ) pDBMan->AddJob ( pDbAction );
		}
*/

	}
	else if ( pNetMsg->emCrow==CROW_MONEY )
	{
		PMONEYDROP pMoneyDrop = m_pLandMan->GetMoney ( pNetMsg->dwID );

		  
		if ( !pMoneyDrop )
		{
			//	µ·ÀÌ »ç¶óÁ³½À´Ï´Ù.
			GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
			NetMsg.emCrow = CROW_MONEY;
			NetMsg.emTakeFB = EMTAKE_FB_OFF;

			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
			return E_FAIL;
		}

		// »ç¸ÁÈ®ÀÎ
		if ( !IsValidBody() )	return E_FAIL;

		//	°Å¸® üũ
		D3DXVECTOR3 vPos;

		if ( pNetMsg->bPet )	
		{
			PGLPETFIELD pMyPet = GLGaeaServer::GetInstance().GetPET ( m_dwPetGUID );
			if ( pMyPet )	vPos = pMyPet->m_vPos;
		}	
		else vPos = m_vPos;

		const D3DXVECTOR3 &vTarPos = pMoneyDrop->vPos;

		D3DXVECTOR3 vDistance = vPos - vTarPos;
		float fDistance = D3DXVec3Length ( &vDistance );

		WORD wTarBodyRadius = 4;
		WORD wTakeRange = wTarBodyRadius + GETBODYRADIUS() + 2;
		WORD wTakeAbleDis = wTakeRange + 15;

		if ( fDistance>wTakeAbleDis )
		{
			//	°Å¸®°¡ ¸Ù´Ï´Ù.
			GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
			NetMsg.emCrow = CROW_ITEM;
			NetMsg.emTakeFB = EMTAKE_FB_DISTANCE;

			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
			return E_FAIL;			
			
		}

		if ( !pMoneyDrop->IsTakeItem(m_dwPartyID,m_dwGaeaID) )
		{
			//	µ·ÀÌ ´Ù¸¥ »ç¶÷¿¡°Ô ¿¹¾àµÇ¾î ÀÖ½À´Ï´Ù.
			GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
			NetMsg.emCrow = CROW_MONEY;
			NetMsg.emTakeFB = EMTAKE_FB_RESERVED;

			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
			return E_FAIL;
		}


		//	Note : ÆÄƼ¿øÀÌ°í À̺¥Æ® ¾ÆÀÌÅÛÀÌ ¾Æ´Ò¶§ ÆÄƼ ·çÆÃÀÎÁö °Ë»çÈÄ Ã³¸®.
		//
		GLPARTY_FIELD* pParty = GLGaeaServer::GetInstance().GetParty(m_dwPartyID);
		if ( pParty )
		{
			bool ballot = pParty->DOMONEY_ALLOT ( this, pMoneyDrop, m_pLandMan );
			if ( ballot )
			{
				return S_OK;
			}
		}

		//	µ· Áݱ⠼º°ø.
		InsertToInven ( pMoneyDrop );
	}

	return S_OK;
}

//	Note : FieldÀÇ ¾ÆÀÌÅÆ,µ·À» ¼Õ¿¡ µé±â ½Ãµµ.	( ¼Õ¿¡ µç ¾ÆÀÌÅÆÀÌ ¾ø´Ù°í °¡Á¤ÇÔ. )
//
HRESULT GLChar::MsgReqFieldToHold ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_FIELD_TO_HOLD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_FIELD_TO_HOLD*> ( nmg );

	PITEMDROP pItemDrop = m_pLandMan->GetItem ( pNetMsg->dwGlobID );

	// Çʵ忡¼­ ¾ÆÀÌÅÛÀ» ¼Õ¿¡ µå´Â°æ¿ì´Â Àκ¥ÀÌ °¡µæ áÀ» °æ¿ì »ÓÀÌ´Ù.
	// º£Æ®³²Å½´ÐÀÏ °æ¿ì ¼Õ¿¡ µå´Â°É ¹æÁöÇØ¾ß ÇÑ´Ù.
#if defined(VN_PARAM) //vietnamtest%%%
	if( m_dwVietnamGainType == GAINTYPE_EMPTY )	return E_FAIL;
#endif

	if ( !pItemDrop )
	{
		//	¾ÆÀÌÅÆÀÌ »ç¶óÁ³½À´Ï´Ù.
		GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
		NetMsg.emCrow = CROW_ITEM;
		NetMsg.emTakeFB = EMTAKE_FB_OFF;

		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
		return S_FALSE;
	}

	// ¾ÆÀÌÅÛÀÌ ÀڽŰú µ¿ÀÏÇÑ ¸Ê¿¡ ÀÖ´ÂÁö ( ¼±µµÀü Á¾·áÈÄ ºñÀÎÁõŬ·´¿øÀÌ ¼±µµ¹«±â ȹµæÇÏ´Â ¹ö±× ´ëó )
	if ( pItemDrop->sMapID != m_sMapID )	return S_FALSE;

	const SITEM *pItemData = GLItemMan::GetInstance().GetItem(pItemDrop->sItemCustom.sNativeID);
	if ( !pItemData )	return S_FALSE;

	if ( !pItemDrop->IsTakeItem(m_dwPartyID,m_dwGaeaID) )
	{
		//	¾ÆÀÌÅÆÀÌ ´Ù¸¥ »ç¶÷¿¡°Ô ¿¹¾àµÇ¾î ÀÖ½À´Ï´Ù.
		GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
		NetMsg.emCrow = CROW_ITEM;
		NetMsg.emTakeFB = EMTAKE_FB_RESERVED;

		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );
		return S_FALSE;
	}

	if ( pItemData->sBasicOp.emItemType==ITEM_QITEM )
	{
		TourchQItem ( pNetMsg->dwGlobID );
		return S_OK;
	}

	//	Note : ÆÄƼ¿øÀÌ°í À̺¥Æ® ¾ÆÀÌÅÛÀÌ ¾Æ´Ò¶§ ÆÄƼ ·çÆÃÀÎÁö °Ë»çÈÄ Ã³¸®.
	//
	GLPARTY_FIELD* pParty = GLGaeaServer::GetInstance().GetParty(m_dwPartyID);
	if ( pParty && !pItemData->ISEVENTITEM() )
	{
		bool ballot = pParty->DOITEM_ALLOT ( this, pItemDrop );
		if ( ballot )		return S_OK;
	}

	//	Note : À̺¥Æ® ¾ÆÀÌÅÛ Áߺ¹À¸·Î °¡Á®°¡±â ¹æÁö.
	//
	/*if ( pItemData->ISEVENTITEM() && m_cInventory.HaveEventItem() )
	{
		//	ÀÌ¹Ì À̺¥Æ® ¾ÆÀÌÅÛÀ» °¡Áö°í ÀÖ½À´Ï´Ù.
		GLMSG::SNETPC_REQ_TAKE_FB NetMsg;
		NetMsg.emCrow = CROW_ITEM;
		NetMsg.emTakeFB = EMTAKE_FB_TOO_EVENT_ITEM;

		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsg );

		return S_FALSE;
	}*/

	//	Field¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	HOLD_ITEM ( pItemDrop->sItemCustom );

	//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
	//
	GLITEMLMT::GetInstance().ReqItemRoute ( pItemDrop->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pItemDrop->sItemCustom.wTurnNum );

	//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = SLOT_HOLD;
	NetMsg_PutOn.sItemCustom = pItemDrop->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

	//	Note : ¾ÆÀÌÅÆ Land¿¡¼­ »èÁ¦.
	m_pLandMan->DropOutItem ( pItemDrop->dwGlobID );

	return S_OK;
}

//	Note : InventoryÀÇ ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µé±â ½Ãµµ.
//
HRESULT GLChar::MsgReqInvenToHold ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_INVEN_TO_HOLD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_INVEN_TO_HOLD*> ( nmg );
	
	static GLMSG::SNETPC_REQ_HOLD_FB NetMsg_fb(NET_MSG_GCTRL_REQ_INVEN_TO_HOLD,EMHOLD_FB_OFF);

	//	¿äûÇÑ ¾ÆÀÌÅÆ À¯È¿¼º °Ë»ç.
	SINVENITEM *pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )
	{
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_fb);
		return S_FALSE;
	}

	//	¼Õ¿¡ µç ¾ÆÀÌÅÆÀÌ ÀÖÀ»¶§.
	if ( VALID_HOLD_ITEM() )
	{
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_fb);
		return S_FALSE;
	}

	SITEM* pITEM = GLItemMan::GetInstance().GetItem( pInvenItem->sItemCustom.sNativeID );
	if ( !pITEM ) return S_FALSE;
	if ( pITEM->sBasicOp.emItemType == ITEM_PET_CARD && m_bGetPetFromDB )
	{
		GLGaeaServer::GetInstance().GetConsoleMsg()->Write( "PetCard Inven to Hold Error, m_bGetPetFromDB : %d",
															 m_bGetPetFromDB );
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_fb);
		return S_FALSE;
	}

	//	Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ ¹é¾÷.
	SINVENITEM sInven_BackUp = *pInvenItem;

	//	Àι꿡¼­ »©³¾ ¾ÆÀÌÅÆÀ» »èÁ¦.
	m_cInventory.DeleteItem ( sInven_BackUp.wPosX, sInven_BackUp.wPosY );

	//	Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	HOLD_ITEM ( sInven_BackUp.sItemCustom );

	//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.	- Àι꿡¼­ ¾ÆÀÌÅÆ »èÁ¦.
	GLMSG::SNETPC_INVEN_DELETE NetMsg;
	NetMsg.wPosX = sInven_BackUp.wPosX;
	NetMsg.wPosY = sInven_BackUp.wPosY;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

	//	[Àڽſ¡°Ô] Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = SLOT_HOLD;
	NetMsg_PutOn.sItemCustom = sInven_BackUp.sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

	return S_OK;
}

HRESULT GLChar::MsgReqInvenExHold ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_INVEN_EX_HOLD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_INVEN_EX_HOLD*> ( nmg );

	if ( !VALID_HOLD_ITEM() )
	{
		return S_FALSE;
	}

	SINVENITEM *pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )
	{
		return S_FALSE;
	}

	SINVENITEM sInven_BackUp = *pInvenItem;		//	Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ ¹é¾÷.
	
	WORD wPosX = sInven_BackUp.wPosX;			//	¾ÆÀÌÅÆ À§Ä¡.
	WORD wPosY = sInven_BackUp.wPosY;

	SITEMCUSTOM sItemHold = GET_HOLD_ITEM();	//	¼Õ¿¡ µç ¾ÆÀÌÅÆ ¹é¾÷.

#if defined(VN_PARAM) //vietnamtest%%%
		if ( sItemHold.bVietnamGainItem )	return S_FALSE;
#endif

	SITEM* pInvenData = GLItemMan::GetInstance().GetItem ( sInven_BackUp.sItemCustom.sNativeID );
	SITEM* pHoldData = GLItemMan::GetInstance().GetItem ( sItemHold.sNativeID );
	if ( !pInvenData || !pHoldData )	return S_FALSE;

	//	Note : º´ÇÕ ÇÒ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö Á¡°Ë.
	bool bMERGE(false);
	bMERGE = (pInvenData->sBasicOp.sNativeID==pHoldData->sBasicOp.sNativeID);
	if (bMERGE)	bMERGE = ( pInvenData->ISPILE() );
	if (bMERGE) bMERGE = ( sItemHold.wTurnNum<pInvenData->sDrugOp.wPileNum );
	if (bMERGE) bMERGE = ( sInven_BackUp.sItemCustom.wTurnNum<pInvenData->sDrugOp.wPileNum );
	if ( bMERGE )
	{
		WORD wTurnNum = sInven_BackUp.sItemCustom.wTurnNum + sItemHold.wTurnNum;
		
		if ( wTurnNum <= pInvenData->sDrugOp.wPileNum )
		{
			//	Note : °ãħ ¼ö Á¶Á¤.
			pInvenItem->sItemCustom.wTurnNum = wTurnNum;

			//	¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
			RELEASE_HOLD_ITEM ();

			//	Note : Àκ¥ÀÇ ¾ÆÀÌÅÛ ¾÷µ¥ÀÌÆ®.
			GLMSG::SNET_INVEN_ITEM_UPDATE NetMsgInvenItem;
			NetMsgInvenItem.wPosX = pNetMsg->wPosX;
			NetMsgInvenItem.wPosY = pNetMsg->wPosY;
			NetMsgInvenItem.sItemCustom = pInvenItem->sItemCustom;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenItem);

			//	[Àڽſ¡°Ô] ¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
			GLMSG::SNETPC_PUTON_RELEASE NetMsg_ReleaseHold(SLOT_HOLD);
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_ReleaseHold);
		}
		else
		{
			WORD wSplit = wTurnNum - pInvenData->sDrugOp.wPileNum;
			
			//	±âÁ¸ ¾ÆÀÌÅÛ °¹¼ö º¯°æ.
			pInvenItem->sItemCustom.wTurnNum = pInvenData->sDrugOp.wPileNum;

			//	¼Õ¿¡ µé°í ÀÖ´ø ¾ÆÀÌÅÛ º¯°æ.
			sItemHold.wTurnNum = wSplit;
			HOLD_ITEM ( sItemHold );

			//	Note : ¼Õ¿¡µç ¾ÆÀÌÅÛ º¯°æ.
			GLMSG::SNETPC_PUTON_UPDATE NetMsgPutOn;
			NetMsgPutOn.emSlot = SLOT_HOLD;
			NetMsgPutOn.sItemCustom = sItemHold;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPutOn);

			//	Note : Àκ¥ÀÇ ¾ÆÀÌÅÛ ¾÷µ¥ÀÌÆ®.
			GLMSG::SNET_INVEN_ITEM_UPDATE NetMsgInvenItem;
			NetMsgInvenItem.wPosX = pNetMsg->wPosX;
			NetMsgInvenItem.wPosY = pNetMsg->wPosY;
			NetMsgInvenItem.sItemCustom = pInvenItem->sItemCustom;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenItem);
		}

		return S_OK;
	}

	//	Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ »èÁ¦.
	BOOL bOk = m_cInventory.DeleteItem ( sInven_BackUp.wPosX, sInven_BackUp.wPosY );

	//	Note : Á¾Àü ¼Õ¿¡µç ¾ÆÀÌÅÆ°ú µé·Á´Â ¾ÆÀÌÅÆÀÇ Å©±â°¡ Ʋ¸± °æ¿ì.
	//	µé°í ÀÖ´Â ¾ÆÀÌÅÆÀÌ µé¾î°¥ °ø°£À» ã´Â´Ù.
//	if ( !pInvenData->SAME_INVENSIZE ( *pHoldData ) )
//	{
		//	µ¿ÀÏÀ§Ä¡¿¡ ³ÖÀ»¼ö ÀÖ´ÂÁö °Ë»ç.
		bOk = m_cInventory.IsInsertable ( pHoldData->sBasicOp.wInvenSizeX, pHoldData->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )
		{
			//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ» °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ö.
			bOk = m_cInventory.FindInsrtable ( pHoldData->sBasicOp.wInvenSizeX, pHoldData->sBasicOp.wInvenSizeY, wPosX, wPosY );
			if ( !bOk )
			{
				//	roll-back : Àι꿡¼­ »èÁ¦Çß´ø ¾ÆÀÌÅÆÀ» ´Ù½Ã ³ÖÀ½.
				m_cInventory.InsertItem ( sInven_BackUp.sItemCustom, sInven_BackUp.wPosX, sInven_BackUp.wPosY, true );

				return S_FALSE;
			}
		}
//}

	//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
	m_cInventory.InsertItem ( sItemHold, wPosX, wPosY );
	SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem(wPosX,wPosY);
	if ( !pINSERT_ITEM )
	{
		GLGaeaServer::GetInstance().GetConsoleMsg()->Write ( "error MsgReqInvenExHold(), sItemHold, id(%d,%d) to pos(%d,%d)",
			sItemHold.sNativeID.wMainID, sItemHold.sNativeID.wSubID, wPosX, wPosY );
		return S_FALSE;
	}

	//	Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	HOLD_ITEM ( sInven_BackUp.sItemCustom );

	//	[Àڽſ¡°Ô] Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ »èÁ¦, ¹× ¾ÆÀÌÅÆ »ðÀÔ.
	GLMSG::SNETPC_INVEN_DEL_AND_INSERT NetMsg_Del_Insert;
	NetMsg_Del_Insert.wDelX = sInven_BackUp.wPosX;					//	»èÁ¦µÉ ¾ÆÀÌÅÆ.
	NetMsg_Del_Insert.wDelY = sInven_BackUp.wPosY;
	if ( pINSERT_ITEM )	NetMsg_Del_Insert.sInsert = *pINSERT_ITEM;	//	»ðÀԵǴ ¾ÆÀÌÅÆ.

	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Del_Insert);

	//	[Àڽſ¡°Ô] Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = SLOT_HOLD;
	NetMsg_PutOn.sItemCustom = sInven_BackUp.sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);


	//	À¯È¿±â°£ ÃÊ°ú Á¡°Ë.	
	const SINVENITEM& sINVENITEM = *pINSERT_ITEM;
	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sINVENITEM.sItemCustom.sNativeID );
	if ( pITEM && pITEM->IsTIMELMT() )
	{

		if ( pITEM->sDrugOp.tTIME_LMT != 0 )
		{
			const CTime cTIME_CUR = CTime::GetCurrentTime();

			CTimeSpan cSPAN(pITEM->sDrugOp.tTIME_LMT);
			CTime cTIME_LMT(sINVENITEM.sItemCustom.tBORNTIME);
			cTIME_LMT += cSPAN;

			WORD wInsertPosX = sINVENITEM.wPosX, wInsertPosY = sINVENITEM.wPosY;


			if ( cTIME_CUR > cTIME_LMT )
			{
				// Å»°ÍÀÏ °æ¿ì
				if ( pITEM->sBasicOp.emItemType == ITEM_VEHICLE && sINVENITEM.sItemCustom.dwVehicleID != 0 )
				{
					GLVEHICLE* pNewVehicle = new GLVEHICLE();
					CGetVehicle* pGetVehicle = new CGetVehicle ( pNewVehicle, 
												 sINVENITEM.sItemCustom.dwVehicleID, 
												 m_dwClientID, 
												 m_dwCharID, 
												 true );
					GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
					if ( pDBMan ) pDBMan->AddJob ( pGetVehicle );
				}

				// ÆÖÄ«µåÀÏ °æ¿ì
				if ( pITEM->sBasicOp.emItemType == ITEM_PET_CARD && sINVENITEM.sItemCustom.dwPetID != 0 )
				{
					CDeletePet* pDbAction = new CDeletePet ( m_dwCharID, sINVENITEM.sItemCustom.dwPetID );
					GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
					if ( pDBMan ) pDBMan->AddJob ( pDbAction );

					// È°µ¿ÁßÀÌ¸é »ç¶óÁö°Ô ÇØÁØ´Ù.
					PGLPETFIELD pMyPet = GLGaeaServer::GetInstance().GetPET ( m_dwPetGUID );
					if ( pMyPet && sINVENITEM.sItemCustom.dwPetID == pMyPet->m_dwPetID )
					{
						// ÆÖÀÇ ¾Ç¼¼»ç¸®¸¦ °Ë»çÇÑ´Ù.
						pMyPet->UpdateTimeLmtItem ( this );

						// ³Ö¾îÁÙ²¨ ³Ö¾îÁØ´Ù.
						for ( WORD i = 0; i < ACCETYPESIZE; ++i )
						{
							CItemDrop cDropItem;
							cDropItem.sItemCustom = pMyPet->m_PutOnItems[i];
							if ( IsInsertToInven ( &cDropItem ) ) InsertToInven ( &cDropItem );
							else
							{
								if ( m_pLandMan )
								{
									m_pLandMan->DropItem ( m_vPos, 
														   &(cDropItem.sItemCustom), 
														   EMGROUP_ONE, 
														   m_dwGaeaID );
								}
							}
						}

						GLGaeaServer::GetInstance().ReserveDropOutPet ( SDROPOUTPETINFO(pMyPet->m_dwGUID,true,false) );

						// ÆÖÀÌ »èÁ¦µÇ¸é ºÎÈ°Á¤º¸¸¦ Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë·ÁÁÜ.
						CGetRestorePetList *pDbAction = new CGetRestorePetList ( m_dwCharID, m_dwClientID );
						if ( pDBMan ) pDBMan->AddJob ( pDbAction );
					}
					else
					{
						// ¾Ç¼¼»ç¸®¸¦ üũÈÄ ÆÖÀ» DB¿¡¼­ »èÁ¦ÇØÁØ´Ù.
						GLPET* pNewPet = new GLPET ();
						CGetPet* pGetPet = new CGetPet ( pNewPet, 
														 sINVENITEM.sItemCustom.dwPetID, 
														 m_dwClientID, 
														 m_dwCharID,
														 sINVENITEM.wPosX,
														 sINVENITEM.wPosY,
														 true );
						GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
						if ( pDBMan ) pDBMan->AddJob ( pGetPet );
					}
				}

				//	[Àڽſ¡°Ô] ÇØ´ç ¾ÆÀÌÅÆÀ» Àι꿡¼­ »èÁ¦.
				GLMSG::SNETPC_INVEN_DELETE NetMsgInvenDel;
				NetMsgInvenDel.wPosX = sINVENITEM.wPosX;
				NetMsgInvenDel.wPosY = sINVENITEM.wPosY;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenDel);

				//	½Ã°£ Á¦ÇÑÀ¸·Î ¾ÆÀÌÅÛ »èÁ¦ ¾Ë¸².
				GLMSG::SNET_INVEN_DEL_ITEM_TIMELMT NetMsgInvenDelTimeLmt;
				NetMsgInvenDelTimeLmt.nidITEM = sINVENITEM.sItemCustom.sNativeID;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenDelTimeLmt);

				//	Note : ¾ÆÀÌÅÛ »èÁ¦.
				//
				m_cInventory.DeleteItem ( sINVENITEM.wPosX, sINVENITEM.wPosY );
			
				//	Note : ÄÚ½ºÅù º¹±¸.
				if ( sINVENITEM.sItemCustom.nidDISGUISE!=SNATIVEID(false) )
				{
					SITEM *pONE = GLItemMan::GetInstance().GetItem ( sINVENITEM.sItemCustom.nidDISGUISE );
					if ( !pONE )		return E_FAIL;

					SITEMCUSTOM sITEM_NEW;
					sITEM_NEW.sNativeID = sINVENITEM.sItemCustom.nidDISGUISE;
					CTime cTIME = CTime::GetCurrentTime();
					if ( sINVENITEM.sItemCustom.tDISGUISE!=0 && pONE->sDrugOp.tTIME_LMT!= 0 )
					{
						cTIME = CTime(sINVENITEM.sItemCustom.tDISGUISE);

						CTimeSpan tLMT(pONE->sDrugOp.tTIME_LMT);
						cTIME -= tLMT;
					}

					//	Note : ¾ÆÀÌÅÛ »ý¼º.
					//
					sITEM_NEW.tBORNTIME = cTIME.GetTime();
					sITEM_NEW.wTurnNum = 1;
					sITEM_NEW.cGenType = EMGEN_BILLING;
					sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
					sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
					sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

					//	Note : Àκ¥¿¡ µé¾î°¥ °ø°£ °Ë»ç.
					BOOL bOk = m_cInventory.IsInsertable ( pONE->sBasicOp.wInvenSizeX, pONE->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
					if ( !bOk )			return E_FAIL;

					//	Note : Àκ¥¿¡ ³ÖÀ½.
					m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
					SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

					GLMSG::SNETPC_INVEN_INSERT NetItemInsert;
					NetItemInsert.Data = *pINSERT_ITEM;
					GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemInsert);

					//	Note : ºÐ¸®µÈ ÄÚ½ºÅù ·Î±×.
					GLITEMLMT::GetInstance().ReqItemRoute ( pINSERT_ITEM->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pINSERT_ITEM->sItemCustom.wTurnNum );
				}
			}
		}
	}

	return S_OK;
}

HRESULT GLChar::MsgReqInvenToSlot ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_INVEN_TO_SLOT *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_INVEN_TO_SLOT*> ( nmg );
	if ( pNetMsg->emToSlot >= SLOT_TSIZE )	return S_FALSE;

	SINVENITEM *pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEMCUSTOM sItemCustom = pInvenItem->sItemCustom;

	BOOL bOk(FALSE);

	if( sItemCustom.nidDISGUISE!=SNATIVEID(false) )
	{
		//	ÄÚ½ºÆ¬À» ÀÔÈù ¾ÆÀÌÅÛÀÏ °æ¿ì
		bOk = ACCEPT_ITEM ( sItemCustom.sNativeID, sItemCustom.nidDISGUISE );
		if ( !bOk )	return E_FAIL;
	}
	else
	{
		//	ÀÚ°ÝÁ¶°Ç¿¡ ºÎÇÕÇÏ´ÂÁö °Ë»ç.
		bOk = ACCEPT_ITEM ( sItemCustom.sNativeID );
		if ( !bOk )	return E_FAIL;
	}

	if ( sItemCustom.IsWrap() ) return E_FAIL;

	//	ÇØ´ç ½½·Ô¿¡ ÀåÂø °¡´ÉÇÑÁö °Ë»ç.
	bOk = CHECKSLOT_ITEM ( sItemCustom.sNativeID, pNetMsg->emToSlot );
	if ( !bOk )	return E_FAIL;

	//	ÇØ´ç ½½·ÔÀÌ ºñ¿´´ÂÁö Á¡°Ë.
	bOk = ISEMPTY_SLOT ( sItemCustom.sNativeID, pNetMsg->emToSlot );
	if ( !bOk ) return E_FAIL;

	//	½½·Ô¿¡ ¾ÆÀÌÅÆ »ðÀÔ.
	SLOT_ITEM ( sItemCustom, pNetMsg->emToSlot );

	//	Àι꿡¼­ ¾ÆÀÌÅÆ »èÁ¦.
	m_cInventory.DeleteItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	[Àڽſ¡°Ô] ÇØ´ç ¾ÆÀÌÅÆÀ» Àι꿡¼­ »èÁ¦.
	GLMSG::SNETPC_INVEN_DELETE NetMsgInvenDel;
	NetMsgInvenDel.wPosX = pNetMsg->wPosX;
	NetMsgInvenDel.wPosY = pNetMsg->wPosY;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenDel);

	//	[Àڽſ¡°Ô] ÇØ´ç ¾ÆÀÌÅÆÀ» Àι꿡 ³Ö¾îÁÜ.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = pNetMsg->emToSlot;
	NetMsg_PutOn.sItemCustom = GET_SLOT_ITEM(pNetMsg->emToSlot);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

	return S_OK;
}

HRESULT GLChar::MsgReqVNGainToHold(NET_MSG_GENERIC* nmg)
{
	GLMSG::SNETPC_REQ_VNGAIN_TO_HOLD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_VNGAIN_TO_HOLD*> ( nmg );

	static GLMSG::SNETPC_REQ_HOLD_FB NetMsg_fb(NET_MSG_GCTRL_REQ_VNGAIN_TO_HOLD,EMHOLD_FB_OFF);

	//	¿äûÇÑ ¾ÆÀÌÅÆ À¯È¿¼º °Ë»ç.
	SINVENITEM *pInvenItem = m_cVietnamInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )
	{
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_fb);
		return S_FALSE;
	}

	//	¼Õ¿¡ µç ¾ÆÀÌÅÆÀÌ ÀÖÀ»¶§.
	if ( VALID_HOLD_ITEM() )
	{
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_fb);
		return S_FALSE;
	}

	//	Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ ¹é¾÷.
	SINVENITEM sInven_BackUp = *pInvenItem;

	//	Àι꿡¼­ »©³¾ ¾ÆÀÌÅÆÀ» »èÁ¦.
	m_cVietnamInventory.DeleteItem ( sInven_BackUp.wPosX, sInven_BackUp.wPosY );

	//	Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	HOLD_ITEM ( sInven_BackUp.sItemCustom );

	//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.	- Àι꿡¼­ ¾ÆÀÌÅÆ »èÁ¦.
	GLMSG::SNETPC_INVEN_DELETE NetMsg;
	NetMsg.wPosX = sInven_BackUp.wPosX;
	NetMsg.wPosY = sInven_BackUp.wPosY;
	NetMsg.bVietnamInven = TRUE;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

	//	[Àڽſ¡°Ô] Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = SLOT_HOLD;
	NetMsg_PutOn.sItemCustom = sInven_BackUp.sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);
	return S_OK;
}

HRESULT GLChar::MsgReqVNGainExHold(NET_MSG_GENERIC* nmg)
{

	GLMSG::SNETPC_REQ_VNGAIN_EX_HOLD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_VNGAIN_EX_HOLD*> ( nmg );

	if ( !VALID_HOLD_ITEM() )
	{
		return S_FALSE;
	}

	SINVENITEM *pInvenItem = m_cVietnamInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )
	{
		return S_FALSE;
	}

	SINVENITEM sInven_BackUp = *pInvenItem;		//	Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ ¹é¾÷.

	WORD wPosX = sInven_BackUp.wPosX;			//	¾ÆÀÌÅÆ À§Ä¡.
	WORD wPosY = sInven_BackUp.wPosY;

	SITEMCUSTOM sItemHold = GET_HOLD_ITEM();	//	¼Õ¿¡ µç ¾ÆÀÌÅÆ ¹é¾÷.

	SITEM* pInvenData = GLItemMan::GetInstance().GetItem ( sInven_BackUp.sItemCustom.sNativeID );
	SITEM* pHoldData = GLItemMan::GetInstance().GetItem ( sItemHold.sNativeID );
	if ( !pInvenData || !pHoldData )	return S_FALSE;

	//	Note : º´ÇÕ ÇÒ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö Á¡°Ë.
	bool bMERGE(false);
	bMERGE = (pInvenData->sBasicOp.sNativeID==pHoldData->sBasicOp.sNativeID);
	if (bMERGE)	bMERGE = ( pInvenData->ISPILE() );
	if (bMERGE) bMERGE = ( sItemHold.wTurnNum<pInvenData->sDrugOp.wPileNum );
	if (bMERGE) bMERGE = ( sInven_BackUp.sItemCustom.wTurnNum<pInvenData->sDrugOp.wPileNum );
	if ( bMERGE )
	{
		WORD wTurnNum = sInven_BackUp.sItemCustom.wTurnNum + sItemHold.wTurnNum;

		if ( wTurnNum <= pInvenData->sDrugOp.wPileNum )
		{
			//	Note : °ãħ ¼ö Á¶Á¤.
			pInvenItem->sItemCustom.wTurnNum = wTurnNum;

			//	¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
			RELEASE_HOLD_ITEM ();

			//	Note : Àκ¥ÀÇ ¾ÆÀÌÅÛ ¾÷µ¥ÀÌÆ®.
			GLMSG::SNET_INVEN_ITEM_UPDATE NetMsgInvenItem;
			NetMsgInvenItem.wPosX = pNetMsg->wPosX;
			NetMsgInvenItem.wPosY = pNetMsg->wPosY;
			NetMsgInvenItem.sItemCustom = pInvenItem->sItemCustom;
			NetMsgInvenItem.bVietnamInven = TRUE;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenItem);

			//	[Àڽſ¡°Ô] ¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
			GLMSG::SNETPC_PUTON_RELEASE NetMsg_ReleaseHold(SLOT_HOLD);
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_ReleaseHold);
		}
		else
		{
			WORD wSplit = wTurnNum - pInvenData->sDrugOp.wPileNum;

			//	±âÁ¸ ¾ÆÀÌÅÛ °¹¼ö º¯°æ.
			pInvenItem->sItemCustom.wTurnNum = pInvenData->sDrugOp.wPileNum;

			//	¼Õ¿¡ µé°í ÀÖ´ø ¾ÆÀÌÅÛ º¯°æ.
			sItemHold.wTurnNum = wSplit;
			HOLD_ITEM ( sItemHold );

			//	Note : ¼Õ¿¡µç ¾ÆÀÌÅÛ º¯°æ.
			GLMSG::SNETPC_PUTON_UPDATE NetMsgPutOn;
			NetMsgPutOn.emSlot = SLOT_HOLD;
			NetMsgPutOn.sItemCustom = sItemHold;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgPutOn);

			//	Note : Àκ¥ÀÇ ¾ÆÀÌÅÛ ¾÷µ¥ÀÌÆ®.
			GLMSG::SNET_INVEN_ITEM_UPDATE NetMsgInvenItem;
			NetMsgInvenItem.wPosX = pNetMsg->wPosX;
			NetMsgInvenItem.wPosY = pNetMsg->wPosY;
			NetMsgInvenItem.sItemCustom = pInvenItem->sItemCustom;
			NetMsgInvenItem.bVietnamInven = TRUE;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenItem);
		}

		return S_OK;
	}

	//	Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ »èÁ¦.
	BOOL bOk = m_cVietnamInventory.DeleteItem ( sInven_BackUp.wPosX, sInven_BackUp.wPosY );

	//	Note : Á¾Àü ¼Õ¿¡µç ¾ÆÀÌÅÆ°ú µé·Á´Â ¾ÆÀÌÅÆÀÇ Å©±â°¡ Ʋ¸± °æ¿ì.
	//	µé°í ÀÖ´Â ¾ÆÀÌÅÆÀÌ µé¾î°¥ °ø°£À» ã´Â´Ù.
//	if ( !pInvenData->SAME_INVENSIZE ( *pHoldData ) )
	{
		//	µ¿ÀÏÀ§Ä¡¿¡ ³ÖÀ»¼ö ÀÖ´ÂÁö °Ë»ç.
		BOOL bOk = m_cVietnamInventory.IsInsertable ( pHoldData->sBasicOp.wInvenSizeX, pHoldData->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )
		{
			//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ» °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ö.
			bOk = m_cVietnamInventory.FindInsrtable ( pHoldData->sBasicOp.wInvenSizeX, pHoldData->sBasicOp.wInvenSizeY, wPosX, wPosY );
			if ( !bOk )
			{
				//	roll-back : Àι꿡¼­ »èÁ¦Çß´ø ¾ÆÀÌÅÆÀ» ´Ù½Ã ³ÖÀ½.
				sInven_BackUp.sItemCustom.bVietnamGainItem = true;
				m_cVietnamInventory.InsertItem ( sInven_BackUp.sItemCustom, sInven_BackUp.wPosX, sInven_BackUp.wPosY, true );

				return S_FALSE;
			}
		}
	}

	//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
	sItemHold.bVietnamGainItem = true;
	m_cVietnamInventory.InsertItem ( sItemHold, wPosX, wPosY );
	SINVENITEM *pINSERT_ITEM = m_cVietnamInventory.GetItem(wPosX,wPosY);
	if ( !pINSERT_ITEM )
	{
		GLGaeaServer::GetInstance().GetConsoleMsg()->Write ( "error MsgReqInvenExHold(), sItemHold, id(%d,%d) to pos(%d,%d)",
			sItemHold.sNativeID.wMainID, sItemHold.sNativeID.wSubID, wPosX, wPosY );
		return S_FALSE;
	}

	//	Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	HOLD_ITEM ( sInven_BackUp.sItemCustom );

	//	[Àڽſ¡°Ô] Àι꿡 ÀÖ´ø ¾ÆÀÌÅÆ »èÁ¦, ¹× ¾ÆÀÌÅÆ »ðÀÔ.
	GLMSG::SNETPC_INVEN_DEL_AND_INSERT NetMsg_Del_Insert;
	NetMsg_Del_Insert.wDelX = sInven_BackUp.wPosX;					//	»èÁ¦µÉ ¾ÆÀÌÅÆ.
	NetMsg_Del_Insert.wDelY = sInven_BackUp.wPosY;
	NetMsg_Del_Insert.bVietnamInven = TRUE;
	if ( pINSERT_ITEM )	NetMsg_Del_Insert.sInsert = *pINSERT_ITEM;	//	»ðÀԵǴ ¾ÆÀÌÅÆ.

	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Del_Insert);

	//	[Àڽſ¡°Ô] Àι꿡 ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» ¼Õ¿¡ µë.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = SLOT_HOLD;
	NetMsg_PutOn.sItemCustom = sInven_BackUp.sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

	return S_OK;
}

HRESULT GLChar::MsgReqHoldToVNGain(NET_MSG_GENERIC* nmg)
{
	GLMSG::SNETPC_REQ_HOLD_TO_VNGAIN *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_HOLD_TO_VNGAIN*> ( nmg );

	if ( !VALID_HOLD_ITEM() )
	{
		return S_FALSE;
	}

	SITEM* pHoldData = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
	if ( !pHoldData )
	{
		return E_FAIL;
	}

	//	Àκ¥ À§Ä¡.
	WORD wInsertPosX = pNetMsg->wPosX, wInsertPosY = pNetMsg->wPosY;

	// ÇØÅ· ÀçÇö ( ¾ÆÀÌÅÛÀÇ »çÀÌÁî°¡ 0 À϶§ )
	//pHoldData->sBasicOp.wInvenSizeX = 0, pHoldData->sBasicOp.wInvenSizeY = 0;

	BOOL bOk = m_cVietnamInventory.IsInsertable ( pHoldData->sBasicOp.wInvenSizeX, pHoldData->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
	if ( !bOk )
	{
		//	ÀιêÀÌ °¡µæÂþÀ½.
		return E_FAIL;
	}

	//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
	SITEMCUSTOM& sITEM_NEW = m_PutOnItems[SLOT_HOLD];
	sITEM_NEW.bVietnamGainItem = true;
	bOk = m_cVietnamInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
	if ( !bOk	 ) return E_FAIL;

	SINVENITEM sINVENITEM = *m_cVietnamInventory.FindPosItem ( wInsertPosX, wInsertPosY );

	//	¼º°ø½Ã ¾ÆÀÌÅÆ Á¦°Å.
	RELEASE_HOLD_ITEM ();

	//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ »ðÀÔ.
	GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven_Insert;
	NetMsg_Inven_Insert.bVietnamInven = TRUE;
	NetMsg_Inven_Insert.Data = sINVENITEM;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Insert);

	//	[Àڽſ¡°Ô] ¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_PUTON_RELEASE NetMsg_ReleaseHold(SLOT_HOLD);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_ReleaseHold);	

	return S_OK;
}

HRESULT GLChar::MsgReqVNInvenToInven( NET_MSG_GENERIC* nmg )
{

	if ( m_dwVietnamInvenCount <= 0 ) return E_FAIL;

	GLMSG::SNETPC_REQ_VNINVEN_TO_INVEN *pNetMsg = (GLMSG::SNETPC_REQ_VNINVEN_TO_INVEN *)nmg;

	SINVENITEM* pInvenItem(NULL);
	pInvenItem = m_cVietnamInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	»ì·Á°í ÇÏ´Â ¾ÆÀÌÅÆÀÌ ¾ø½À´Ï´Ù.
	if ( !pInvenItem )											return E_FAIL;
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )												return E_FAIL;

	WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
	WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

	WORD wInsertPosX(0), wInsertPosY(0);
	BOOL bITEM_SPACE(false);
	bITEM_SPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );

	//	Àκ¥¿¡ ¿©À¯°ø°£ÀÌ ¾øÀ» °æ¿ì Ãë¼ÒµÊ.
	if ( !bITEM_SPACE )		return E_FAIL;

	SITEMCUSTOM sITEM_NEW = pInvenItem->sItemCustom;

	sITEM_NEW.bVietnamGainItem = false;
	m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
	m_cVietnamInventory.DeleteItem( pNetMsg->wPosX, pNetMsg->wPosY );

	SINVENITEM sINVENITEM = *m_cInventory.FindPosItem ( wInsertPosX, wInsertPosY );

	m_dwVietnamInvenCount--;
	GLMSG::SNETPC_INVEN_VIETNAM_ITEMGETNUM_UPDATE NetMsgFB;
	NetMsgFB.dwVietnamInvenCount = m_dwVietnamInvenCount;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	GLMSG::SNETPC_REQ_VNINVEN_TO_INVEN_FB NetMsg;
	NetMsg.wPosX    = pNetMsg->wPosX;
	NetMsg.wPosY    = pNetMsg->wPosY;
	NetMsg.wNewPosX = wInsertPosX;
	NetMsg.wNewPosY = wInsertPosY;
	NetMsg.Data		= sINVENITEM;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);	

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sINVENITEM.sItemCustom.sNativeID );
	if ( pITEM && pITEM->IsTIMELMT() )
	{

		if ( pITEM->sDrugOp.tTIME_LMT != 0 )
		{
			const CTime cTIME_CUR = CTime::GetCurrentTime();

			CTimeSpan cSPAN(pITEM->sDrugOp.tTIME_LMT);
			CTime cTIME_LMT(sINVENITEM.sItemCustom.tBORNTIME);
			cTIME_LMT += cSPAN;

			WORD wInsertPosX = sINVENITEM.wPosX, wInsertPosY = sINVENITEM.wPosY;


			if ( cTIME_CUR > cTIME_LMT )
			{
				//	[Àڽſ¡°Ô] ÇØ´ç ¾ÆÀÌÅÆÀ» Àι꿡¼­ »èÁ¦.
				GLMSG::SNETPC_INVEN_DELETE NetMsgInvenDel;
				NetMsgInvenDel.wPosX = sINVENITEM.wPosX;
				NetMsgInvenDel.wPosY = sINVENITEM.wPosY;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenDel);

				//	½Ã°£ Á¦ÇÑÀ¸·Î ¾ÆÀÌÅÛ »èÁ¦ ¾Ë¸².
				GLMSG::SNET_INVEN_DEL_ITEM_TIMELMT NetMsgInvenDelTimeLmt;
				NetMsgInvenDelTimeLmt.nidITEM = sINVENITEM.sItemCustom.sNativeID;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenDelTimeLmt);

				//	Note : ¾ÆÀÌÅÛ »èÁ¦.
				//
				m_cInventory.DeleteItem ( sINVENITEM.wPosX, sINVENITEM.wPosY );
			
				//	Note : ÄÚ½ºÅù º¹±¸.
				if ( sINVENITEM.sItemCustom.nidDISGUISE!=SNATIVEID(false) )
				{
					SITEM *pONE = GLItemMan::GetInstance().GetItem ( sINVENITEM.sItemCustom.nidDISGUISE );
					if ( !pONE )		return E_FAIL;

					SITEMCUSTOM sITEM_NEW;
					sITEM_NEW.sNativeID = sINVENITEM.sItemCustom.nidDISGUISE;
					CTime cTIME = CTime::GetCurrentTime();
					if ( sINVENITEM.sItemCustom.tDISGUISE!=0 && pONE->sDrugOp.tTIME_LMT!= 0 )
					{
						cTIME = CTime(sINVENITEM.sItemCustom.tDISGUISE);

						CTimeSpan tLMT(pONE->sDrugOp.tTIME_LMT);
						cTIME -= tLMT;
					}

					//	Note : ¾ÆÀÌÅÛ »ý¼º.
					//
					sITEM_NEW.tBORNTIME = cTIME.GetTime();
					sITEM_NEW.wTurnNum = 1;
					sITEM_NEW.cGenType = EMGEN_BILLING;
					sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
					sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
					sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

					//	Note : Àκ¥¿¡ µé¾î°¥ °ø°£ °Ë»ç.
					BOOL bOk = m_cInventory.IsInsertable ( pONE->sBasicOp.wInvenSizeX, pONE->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
					if ( !bOk )			return E_FAIL;

					//	Note : Àκ¥¿¡ ³ÖÀ½.
					m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
					SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

					GLMSG::SNETPC_INVEN_INSERT NetItemInsert;
					NetItemInsert.Data = *pINSERT_ITEM;
					GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemInsert);

					//	Note : ºÐ¸®µÈ ÄÚ½ºÅù ·Î±×.
					GLITEMLMT::GetInstance().ReqItemRoute ( pINSERT_ITEM->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pINSERT_ITEM->sItemCustom.wTurnNum );
				}
			}
		}
	}	

	return S_OK;
}

HRESULT GLChar::MsgReqVNGainInvenReset(NET_MSG_GENERIC* nmg)
{
	m_cVietnamInventory.DeleteItemAll();

	return S_OK;
}


HRESULT GLChar::MsgReqInvenSplit ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_INVEN_SPLIT *pNetMsg = (GLMSG::SNETPC_REQ_INVEN_SPLIT *)nmg;
	
	BOOL bOk(FALSE);

	//	Note : ºÐ¸® ¿äû ¾ÆÀÌÅÛ Ã£À½.
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )									return E_FAIL;

	//	Note : ¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿À±â.
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )													return E_FAIL;

	//	Note : ºÐ¸® °¡´ÉÇÑ ¾ÆÀÌÅÛÀÎÁö Á¡°Ë.
	bool bSPLIT(false);
	bSPLIT = ( pItem->ISINSTANCE() );
	if ( !bSPLIT )													return E_FAIL;
	if ( pNetMsg->wSplit < 1 )										return E_FAIL;
	if ( pInvenItem->sItemCustom.wTurnNum <= 1 )					return E_FAIL;
	if ( pInvenItem->sItemCustom.wTurnNum <= pNetMsg->wSplit  )		return E_FAIL;

	//	Note : ¿øº» ¾ÆÀÌÅÛÀÇ º¯È­µÈ °¹¼ö.
	WORD wORGIN_SPLIT = pInvenItem->sItemCustom.wTurnNum - pNetMsg->wSplit;

	//	Note : ºÐ¸®µÇ¾î »õ·Î »ý±â´Â ¾ÆÀÌÅÛ.
	SITEMCUSTOM sNEW_ITEM = pInvenItem->sItemCustom;
	sNEW_ITEM.wTurnNum = pNetMsg->wSplit;

	//	Note : »õ·Î »ý±â´Â ¾ÆÀÌÅÛ À§Ä¡ ã±â.
	WORD wInvenPosX(0), wInvenPosY(0);
	bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wInvenPosX, wInvenPosY );
	if ( !bOk )	return E_FAIL;

	//	Note : »õ·Î »ý±ä ¾ÆÀÌÅÛ ³Ö±â.
	bOk = m_cInventory.InsertItem ( sNEW_ITEM, wInvenPosX, wInvenPosY );
	if ( !bOk )											return E_FAIL;

	//	Note : »õ·Î »ý±ä ¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿À±â.
	SINVENITEM* pNewItem = m_cInventory.GetItem ( wInvenPosX, wInvenPosY );
	if ( !bOk )											return E_FAIL;

	//	Note : ¿øº» ¾ÆÀÌÅÛÀÇ °¹¼ö º¯°æ ½ÃÅ´.
	pInvenItem->sItemCustom.wTurnNum = wORGIN_SPLIT;

	//	Note : Àκ¥¿¡ »õ·Î ºÐ¸®µÇ¾î µé¾î °¡´Â ¾ÆÀÌÅÛ.
	GLMSG::SNETPC_INVEN_INSERT NetMsgNew;
	NetMsgNew.Data = *pNewItem;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgNew);

	//	Note : ¿øº» ¾ÆÀÌÅÛ °¹¼ö º¯°æ.
	GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsgInven;
	NetMsgInven.wPosX = pNetMsg->wPosX;
	NetMsgInven.wPosY = pNetMsg->wPosY;
	NetMsgInven.wTurnNum = wORGIN_SPLIT;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInven);

	return S_OK;
}

HRESULT GLChar::MsgReqHoldToInven ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_HOLD_TO_INVEN *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_HOLD_TO_INVEN*> ( nmg );

#if defined(VN_PARAM) //vietnamtest%%%
	if ( pNetMsg->bUseVietnamInven && m_dwVietnamInvenCount <= 0 ) return E_FAIL;
#endif

	if ( !VALID_HOLD_ITEM() )
	{
		return S_FALSE;
	}

	SITEM* pHoldData = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
	if ( !pHoldData )
	{
		return E_FAIL;
	}

	//	Àκ¥ À§Ä¡.
	WORD wInsertPosX = pNetMsg->wPosX, wInsertPosY = pNetMsg->wPosY;

	// ÇØÅ· ÀçÇö ( ¾ÆÀÌÅÛÀÇ »çÀÌÁî°¡ 0 À϶§ )
	//pHoldData->sBasicOp.wInvenSizeX = 0, pHoldData->sBasicOp.wInvenSizeY = 0;

	BOOL bOk = m_cInventory.IsInsertable ( pHoldData->sBasicOp.wInvenSizeX, pHoldData->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
	if ( !bOk )
	{
		//	ÀιêÀÌ °¡µæÂþÀ½.
		return E_FAIL;
	}

	//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.	
#if defined(VN_PARAM) //vietnamtest%%%   
    SITEMCUSTOM& sCustom = m_PutOnItems[SLOT_HOLD];
	if ( sCustom.bVietnamGainItem && m_dwVietnamInvenCount <= 0 ) return E_FAIL;
	
	sCustom.bVietnamGainItem = false;
#endif	

	bOk = m_cInventory.InsertItem ( GET_HOLD_ITEM(), wInsertPosX, wInsertPosY );
	if ( !bOk	 ) return E_FAIL;

	SINVENITEM sINVENITEM = *m_cInventory.FindPosItem ( wInsertPosX, wInsertPosY );

	//	¼º°ø½Ã ¾ÆÀÌÅÆ Á¦°Å.
	RELEASE_HOLD_ITEM ();

#if defined(VN_PARAM) //vietnamtest%%%
	if( pNetMsg->bUseVietnamInven )
	{
		m_dwVietnamInvenCount--;

		GLMSG::SNETPC_INVEN_VIETNAM_ITEMGETNUM_UPDATE NetMsgFB;
		NetMsgFB.dwVietnamInvenCount = m_dwVietnamInvenCount;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
	}
#endif

	//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ »ðÀÔ.
	GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven_Insert;
	NetMsg_Inven_Insert.Data = sINVENITEM;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Insert);

	//	[Àڽſ¡°Ô] ¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_PUTON_RELEASE NetMsg_ReleaseHold(SLOT_HOLD);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_ReleaseHold);


	//	À¯È¿±â°£ ÃÊ°ú Á¡°Ë.
	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sINVENITEM.sItemCustom.sNativeID );
	if ( pITEM && pITEM->IsTIMELMT() )
	{
		if ( pITEM->sDrugOp.tTIME_LMT != 0 )
		{
			const CTime cTIME_CUR = CTime::GetCurrentTime();

			CTimeSpan cSPAN(pITEM->sDrugOp.tTIME_LMT);
			CTime cTIME_LMT(sINVENITEM.sItemCustom.tBORNTIME);
			cTIME_LMT += cSPAN;

			if ( cTIME_CUR > cTIME_LMT )
			{
				// Å»°ÍÀÏ °æ¿ì
				if ( pITEM->sBasicOp.emItemType == ITEM_VEHICLE && sINVENITEM.sItemCustom.dwVehicleID != 0 )
				{
					GLVEHICLE* pNewVehicle = new GLVEHICLE();
					CGetVehicle* pGetVehicle = new CGetVehicle ( pNewVehicle, 
												 sINVENITEM.sItemCustom.dwVehicleID, 
												 m_dwClientID, 
												 m_dwCharID, 
												 true );
					GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
					if ( pDBMan ) pDBMan->AddJob ( pGetVehicle );
				}

				// ÆÖÄ«µåÀÏ °æ¿ì
				if ( pITEM->sBasicOp.emItemType == ITEM_PET_CARD && sINVENITEM.sItemCustom.dwPetID != 0 )
				{
					CDeletePet* pDbAction = new CDeletePet ( m_dwCharID, sINVENITEM.sItemCustom.dwPetID );
					GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
					if ( pDBMan ) pDBMan->AddJob ( pDbAction );

					// È°µ¿ÁßÀÌ¸é »ç¶óÁö°Ô ÇØÁØ´Ù.
					PGLPETFIELD pMyPet = GLGaeaServer::GetInstance().GetPET ( m_dwPetGUID );
					if ( pMyPet && sINVENITEM.sItemCustom.dwPetID == pMyPet->m_dwPetID )
					{
						// ÆÖÀÇ ¾Ç¼¼»ç¸®¸¦ °Ë»çÇÑ´Ù.
						pMyPet->UpdateTimeLmtItem ( this );

						// ³Ö¾îÁÙ²¨ ³Ö¾îÁØ´Ù.
						for ( WORD i = 0; i < ACCETYPESIZE; ++i )
						{
							CItemDrop cDropItem;
							cDropItem.sItemCustom = pMyPet->m_PutOnItems[i];
							if ( IsInsertToInven ( &cDropItem ) ) InsertToInven ( &cDropItem );
							else
							{
								if ( m_pLandMan )
								{
									m_pLandMan->DropItem ( m_vPos, 
														   &(cDropItem.sItemCustom), 
														   EMGROUP_ONE, 
														   m_dwGaeaID );
								}
							}
						}

						GLGaeaServer::GetInstance().ReserveDropOutPet ( SDROPOUTPETINFO(pMyPet->m_dwGUID,true,false) );

						// ÆÖÀÌ »èÁ¦µÇ¸é ºÎÈ°Á¤º¸¸¦ Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë·ÁÁÜ.
						CGetRestorePetList *pDbAction = new CGetRestorePetList ( m_dwCharID, m_dwClientID );
						if ( pDBMan ) pDBMan->AddJob ( pDbAction );
					}
					else
					{
						// ¾Ç¼¼»ç¸®¸¦ üũÈÄ ÆÖÀ» DB¿¡¼­ »èÁ¦ÇØÁØ´Ù.
						GLPET* pNewPet = new GLPET ();
						CGetPet* pGetPet = new CGetPet ( pNewPet, 
														 sINVENITEM.sItemCustom.dwPetID, 
														 m_dwClientID, 
														 m_dwCharID,
														 sINVENITEM.wPosX,
														 sINVENITEM.wPosY,
														 true );
						GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
						if ( pDBMan ) pDBMan->AddJob ( pGetPet );
					}
				}

				//	[Àڽſ¡°Ô] ÇØ´ç ¾ÆÀÌÅÆÀ» Àι꿡¼­ »èÁ¦.
				GLMSG::SNETPC_INVEN_DELETE NetMsgInvenDel;
				NetMsgInvenDel.wPosX = sINVENITEM.wPosX;
				NetMsgInvenDel.wPosY = sINVENITEM.wPosY;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenDel);

				//	½Ã°£ Á¦ÇÑÀ¸·Î ¾ÆÀÌÅÛ »èÁ¦ ¾Ë¸².
				GLMSG::SNET_INVEN_DEL_ITEM_TIMELMT NetMsgInvenDelTimeLmt;
				NetMsgInvenDelTimeLmt.nidITEM = sINVENITEM.sItemCustom.sNativeID;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInvenDelTimeLmt);

				//	Note : ¾ÆÀÌÅÛ »èÁ¦.
				//
				m_cInventory.DeleteItem ( sINVENITEM.wPosX, sINVENITEM.wPosY );
			
				//	Note : ÄÚ½ºÅù º¹±¸.
				if ( sINVENITEM.sItemCustom.nidDISGUISE!=SNATIVEID(false) )
				{
					SITEM *pONE = GLItemMan::GetInstance().GetItem ( sINVENITEM.sItemCustom.nidDISGUISE );
					if ( !pONE )		return E_FAIL;

					SITEMCUSTOM sITEM_NEW;
					sITEM_NEW.sNativeID = sINVENITEM.sItemCustom.nidDISGUISE;
					CTime cTIME = CTime::GetCurrentTime();
					if ( sINVENITEM.sItemCustom.tDISGUISE!=0 && pONE->sDrugOp.tTIME_LMT!= 0 )
					{
						cTIME = CTime(sINVENITEM.sItemCustom.tDISGUISE);

						CTimeSpan tLMT(pONE->sDrugOp.tTIME_LMT);
						cTIME -= tLMT;
					}

					//	Note : ¾ÆÀÌÅÛ »ý¼º.
					//
					sITEM_NEW.tBORNTIME = cTIME.GetTime();
					sITEM_NEW.wTurnNum = 1;
					sITEM_NEW.cGenType = EMGEN_BILLING;
					sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
					sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
					sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

					//	Note : Àκ¥¿¡ µé¾î°¥ °ø°£ °Ë»ç.
					BOOL bOk = m_cInventory.IsInsertable ( pONE->sBasicOp.wInvenSizeX, pONE->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
					if ( !bOk )			return E_FAIL;

					//	Note : Àκ¥¿¡ ³ÖÀ½.
					m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
					SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

					GLMSG::SNETPC_INVEN_INSERT NetItemInsert;
					NetItemInsert.Data = *pINSERT_ITEM;
					GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemInsert);

					//	Note : ºÐ¸®µÈ ÄÚ½ºÅù ·Î±×.
					GLITEMLMT::GetInstance().ReqItemRoute ( pINSERT_ITEM->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pINSERT_ITEM->sItemCustom.wTurnNum );
				}
			}
		}
	}

/*
	// ȹµæÇÑ ¾ÆÀÌÅÛÀÌ ÆÖÄ«µå && »ý¼ºµÈ ÆÖÀ̶ó¸é ¼ÒÀ¯±ÇÀ» ÀÌÀüÇÑ´Ù.
	// ÆÖ¾ÆÀ̵𰡠0 ÀÌ ¾Æ´Ï¸é ÆÖÄ«µåÀ̸鼭 DB¿¡ ÆÖÀÌ »ý¼ºµÈ °ÍÀÌ´Ù.
	if ( pHoldData->sBasicOp.emItemType == ITEM_PET_CARD && sINVENITEM.sItemCustom.dwPetID != 0 )
	{
		CExchangePet* pDbAction = new CExchangePet ( m_dwCharID, sINVENITEM.sItemCustom.dwPetID );
		GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
		if ( pDBMan ) pDBMan->AddJob ( pDbAction );
	}
*/


	return S_OK;
}

HRESULT GLChar::MsgReqHoldToField ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_HOLD_TO_FIELD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_HOLD_TO_FIELD*> ( nmg );

	if ( !VALID_HOLD_ITEM () )	return S_FALSE;

	D3DXVECTOR3 vCollisionPos;
	BOOL bCollision = m_pLandMan->IsCollisionNavi
		(
		pNetMsg->vPos + D3DXVECTOR3(0,+5,0),
		pNetMsg->vPos + D3DXVECTOR3(0,-5,0),
		vCollisionPos
		);

	if ( !bCollision )			return S_FALSE;

	const SITEMCUSTOM& sITEMCUSTOM = GET_HOLD_ITEM();

#if defined(VN_PARAM) //vietnamtest%%%
	if ( sITEMCUSTOM.bVietnamGainItem )
	{
		//	¾ÆÀÌÅÆ Á¦°Å.
		RELEASE_HOLD_ITEM ();

		//	[Àڽſ¡°Ô] ¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
		GLMSG::SNETPC_PUTON_RELEASE NetMsg_ReleaseHold(SLOT_HOLD);
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_ReleaseHold);

		return S_OK;
	}
#endif


    SITEMCUSTOM sCustom = GET_HOLD_ITEM();
	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sITEMCUSTOM.sNativeID );
	if ( !pITEM )		return false;

	// ¹ö¸®´Â ¾ÆÀÌÅÛÀÌ ÆÖÄ«µå && ÆÖÀÌ È°¼º»óÅÂÀÌ¸é ¹ö¸± ¼ö ¾ø´Ù
	if ( pITEM->sBasicOp.emItemType == ITEM_PET_CARD )
	{
		PGLPETFIELD pMyPet = GLGaeaServer::GetInstance().GetPET ( m_dwPetGUID );
		if ( pMyPet && pMyPet->IsValid () && sITEMCUSTOM.dwPetID == pMyPet->m_dwPetID ) return FALSE;
	}
	
	//	°Å·¡¿É¼Ç
	// 
	if ( !pITEM->sBasicOp.IsTHROW() && ( pITEM && sCustom.bWrap!=true ) )						return FALSE;

	// GMCharEdit ·Î ³ÖÀº ¾ÆÀÌÅÛÀº ¹ö¸®±â ºÒ°¡´ÉÇÏ´Ù.
	if ( sITEMCUSTOM.IsGM_GENITEM() && ( pITEM && sCustom.bWrap!=true ) )						return FALSE;

	//	Item Drop ½Ãµµ.
	BOOL bDrop = m_pLandMan->DropItem ( vCollisionPos, const_cast<SITEMCUSTOM*> ( &sITEMCUSTOM ) );
	if ( !bDrop )				return S_FALSE;

	//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
	//
	GLITEMLMT::GetInstance().ReqItemRoute ( sITEMCUSTOM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_GROUND, sITEMCUSTOM.wTurnNum );

	//	Drop ½Ã ¾ÆÀÌÅÆ Á¦°Å.
	RELEASE_HOLD_ITEM ();

	//	[Àڽſ¡°Ô] ¼Õ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_PUTON_RELEASE NetMsg_ReleaseHold(SLOT_HOLD);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_ReleaseHold);

	return S_OK;
}

BOOL ISBOTH_HANDHELD ( SITEM *pITEM )
{
	GASSERT ( pITEM );
	return ( (pITEM->sSuitOp.emSuit==SUIT_HANDHELD) && pITEM->sSuitOp.IsBOTHHAND() );
}

HRESULT GLChar::MsgReqSlotToHold ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_SLOT_TO_HOLD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_SLOT_TO_HOLD*> ( nmg );
	if ( pNetMsg->emSlot >= SLOT_TSIZE )		return S_FALSE;

	if ( VALID_HOLD_ITEM () )					return S_FALSE;
	if ( !VALID_SLOT_ITEM(pNetMsg->emSlot) )	return S_FALSE;
	if ( m_sCONFTING.IsCONFRONTING() )			return S_FALSE;

	EMSLOT emRHand = GetCurRHand();
	EMSLOT emLHand = GetCurLHand();

	SITEM *pITEM_LEFT=NULL, *pITEM_RIGHT=NULL;
	if ( VALID_SLOT_ITEM(emLHand) )	pITEM_LEFT = GLItemMan::GetInstance().GetItem(GET_SLOT_ITEM(emLHand).sNativeID);
	if ( VALID_SLOT_ITEM(emRHand) )	pITEM_RIGHT = GLItemMan::GetInstance().GetItem(GET_SLOT_ITEM(emRHand).sNativeID);

	//	¾ç¼Õ ¸ðµÎ Âø¿ë ¹«±â ÀÖÀ» °æ¿ì.	È°+È­»ì, â+ºÎÀû. ¼¼Æ®·Î µ¿ÀÛÇÏ´Â ¹«±â·ù°¡ ÀÖÀ½ À̶§ ¸ðµÎ »©³»¾ßÇÔ.
	//
	if ( pNetMsg->emSlot==emRHand )
	{
		if ( (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_BOW) || (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_SCYTHE)|| (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_SPEAR) || (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_DUAL_GUN || pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_RAIL_GUN || pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_PORTAL_GUN) ) //|| (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_RIFLE) )
		{
			if ( pITEM_LEFT )	//	È­»ì, ºÎÀû »©³»¾ß ÇÔ.
			{
				SITEMCUSTOM sITEM_LHAND = GET_SLOT_ITEM(emLHand);

				WORD wInvenPosX, wInvenPosY;
				BOOL bOk = m_cInventory.FindInsrtable ( pITEM_LEFT->sBasicOp.wInvenSizeX, pITEM_LEFT->sBasicOp.wInvenSizeY, wInvenPosX, wInvenPosY );
				if ( bOk )
				{
					//	Á¾Àü ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
					m_cInventory.InsertItem ( sITEM_LHAND, wInvenPosX, wInvenPosY );

					//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ »ðÀÔ.
					GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven_Insert;
					NetMsg_Inven_Insert.Data = *m_cInventory.GetItem(wInvenPosX, wInvenPosY);
					GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Insert);

					//	[¸ðµÎ¿¡°Ô] µð½ºÇ÷¹ÀÌ ¾ÆÀÌÅÛÀÌ ¾Æ´Ñ°É·Î °¡Á¤ÇÏ¿© ¹«½Ã.
				}
				//	Note : Àκ¥Å丮 ³Ö±â¿¡ ½ÇÆÐÇÏ¿´À» °æ¿ì.
				else
				{
					//	Item Drop ½Ãµµ.
					BOOL bDrop = m_pLandMan->DropItem ( m_vPos, &sITEM_LHAND );

					//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
					//
					GLITEMLMT::GetInstance().ReqItemRoute ( sITEM_LHAND, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_GROUND, sITEM_LHAND.wTurnNum );
				}

				//	¿ÞÂÊ ½½·Ô Áö¿öÁÜ.
				RELEASE_SLOT_ITEM(emLHand);

				//	[Àڽſ¡°Ô] SLOT¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
				GLMSG::SNETPC_PUTON_RELEASE NetMsg_PutOn_Release(emLHand);
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn_Release);
			}
		}
	}

	if ( pNetMsg->emSlot== SLOT_VEHICLE && m_bGetVehicleFromDB )
	{
		GLGaeaServer::GetInstance().GetConsoleMsg()->Write( "Vehicle Slot Release Error, m_bGetVehicleFromDB : %d",
															 m_bGetVehicleFromDB );
		return S_FALSE;
	}

	//	¼Õ¿¡ µé°Ô ÇÔ.
	HOLD_ITEM ( GET_SLOT_ITEM(pNetMsg->emSlot) );

	//	SLOT ¾ÆÀÌÅÆ Á¦°Å.
	RELEASE_SLOT_ITEM ( pNetMsg->emSlot );

	//	¾ÆÀÌÅÆ º¯°æ½Ã °ª Àç ȯ»ê ÇÊ¿äÇÔ.
	INIT_DATA ( FALSE, FALSE );

	//	[Àڽſ¡°Ô] SLOT¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_PUTON_RELEASE NetMsg_PutOn_Release(pNetMsg->emSlot);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn_Release);

	//	[¸ðµÎ¿¡°Ô] ÀÚ½ÅÀÇ Âø¿ë º¹ÀåÀÌ ¹Ù²ñÀ» ¾Ë¸².
	GLMSG::SNETPC_PUTON_RELEASE_BRD NetMsg_PutOn_Release_Brd;
	NetMsg_PutOn_Release_Brd.dwGaeaID = m_dwGaeaID;
	NetMsg_PutOn_Release_Brd.emSlot = pNetMsg->emSlot;
	SendMsgViewAround ( reinterpret_cast<NET_MSG_GENERIC*>(&NetMsg_PutOn_Release_Brd) );

	//	[Àڽſ¡°Ô] ¼Õ¿¡ ¾ÆÀÌÅÆÀ» µé°Ô.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = SLOT_HOLD;
	NetMsg_PutOn.sItemCustom = GET_HOLD_ITEM();
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);


	if ( pNetMsg->emSlot == SLOT_VEHICLE )
	{
		GLGaeaServer::GetInstance().SaveVehicle( m_dwClientID, m_dwGaeaID, false );
	}

	// ¹«±â¿¡ µû¸¥ ¹öÇÁ¸¦ ÃʱâÈ­ ÇÑ´Ù.
	DisableSkillFact();
	

	return S_OK;
}

HRESULT GLChar::MsgReqSlotExHold ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_SLOT_EX_HOLD *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_SLOT_EX_HOLD*> ( nmg );
	if ( pNetMsg->emSlot >= SLOT_TSIZE )		return S_FALSE;

	if ( !VALID_HOLD_ITEM () )					return S_FALSE;
	if ( m_sCONFTING.IsCONFRONTING() )			return S_FALSE;

	BOOL bOk(FALSE);

#if defined(VN_PARAM) //vietnamtest%%%
	if ( GET_HOLD_ITEM().bVietnamGainItem )	return S_FALSE;
#endif

	if( GET_HOLD_ITEM().nidDISGUISE!=SNATIVEID(false) )
	{
		//	ÄÚ½ºÆ¬À» ÀÔÈù ¾ÆÀÌÅÛÀÏ °æ¿ì
		bOk = ACCEPT_ITEM ( GET_HOLD_ITEM().sNativeID, GET_HOLD_ITEM().nidDISGUISE );
		if ( !bOk )	return E_FAIL;
	}
	else
	{
		//	ÀÚ°ÝÁ¶°Ç¿¡ ºÎÇÕÇÏ´ÂÁö °Ë»ç.
		bOk = ACCEPT_ITEM ( GET_HOLD_ITEM().sNativeID );
		if ( !bOk )	return E_FAIL;
	}

	//	ÇØ´ç ½½·Ô¿¡ ÀåÂø °¡´ÉÇÑÁö °Ë»ç.
	bOk = CHECKSLOT_ITEM ( GET_HOLD_ITEM().sNativeID, pNetMsg->emSlot );
	if ( !bOk )	return E_FAIL;
	
	WORD wInvenPosX, wInvenPosY;
	SITEMCUSTOM sToHoldItem(NATIVEID_NULL());
	SITEMCUSTOM sToInvenItem(NATIVEID_NULL());
	SITEMCUSTOM sToSlotItem(NATIVEID_NULL());

	SITEM *pITEM_TOSLOT = GLItemMan::GetInstance().GetItem(GET_HOLD_ITEM().sNativeID);
	if ( !pITEM_TOSLOT )	return E_FAIL;

	EMSLOT emRHand = GetCurRHand();
	EMSLOT emLHand = GetCurLHand();

	//	Note : ÀÏ¹Ý ½½·ÔÀÏ °æ¿ì.
	//
	if ( pITEM_TOSLOT->sSuitOp.emSuit!=SUIT_HANDHELD )
	{
		if ( !VALID_SLOT_ITEM(pNetMsg->emSlot) )	return S_FALSE;

		//	Á¾Àü ¾ÆÀÌÅÆ ¼Õ¿¡ µé°í ÀÖ°Ô.	#1 ¹é¾÷
		sToHoldItem = GET_SLOT_ITEM ( pNetMsg->emSlot );

		//	ÀåÂøÇÒ ¾ÆÀÌÅÛ ÁöÁ¤.
		sToSlotItem = GET_HOLD_ITEM();
	}
	//	¼Õ¿¡ µå´Â µµ±¸ÀÏ °æ¿ì.
	else
	{
		SITEM *pITEM_LEFT=NULL, *pITEM_RIGHT=NULL;
		if ( VALID_SLOT_ITEM(emLHand) )	pITEM_LEFT = GLItemMan::GetInstance().GetItem(GET_SLOT_ITEM(emLHand).sNativeID);
		if ( VALID_SLOT_ITEM(emRHand) )	pITEM_RIGHT = GLItemMan::GetInstance().GetItem(GET_SLOT_ITEM(emRHand).sNativeID);

		//	¾ç¼Õ µµ±¸¸¦ Âø¿ëÇÏ·Á ÇÏ´Â °æ¿ì.
		if ( ISBOTH_HANDHELD(pITEM_TOSLOT) )
		{
			if ( pITEM_LEFT && pITEM_RIGHT )
			{
				//	Memo :	³ÖÀ»·Á´Â ¾ÆÀÌÅÛÀÌ È°ÀÌ°í ¿ÞÂÊ¿¡ Âø¿ëÇÑ ¾ÆÀÌÅÛÀÌ È­»ìÀÌ ¾Æ´Ñ °æ¿ì.
				if( ( (pITEM_TOSLOT->sSuitOp.emAttack==ITEMATT_BOW) && (pITEM_LEFT->sBasicOp.emItemType!=ITEM_ARROW) ) ||
				//	Memo :	³ÖÀ»·Á´Â ¾ÆÀÌÅÛÀÌ ºÀÀÌ°í ¿ÞÂÊ¿¡ Âø¿ëÇÑ ¾ÆÀÌÅÛÀÌ ºÎÀûÀÌ ¾Æ´Ñ °æ¿ì.
					( (pITEM_TOSLOT->sSuitOp.emAttack==ITEMATT_SPEAR || pITEM_TOSLOT->sSuitOp.emAttack==ITEMATT_SCYTHE) && (pITEM_LEFT->sBasicOp.emItemType!=ITEM_CHARM) ) ||
				//test gun
					( (pITEM_TOSLOT->sSuitOp.emAttack==ITEMATT_DUAL_GUN || pITEM_TOSLOT->sSuitOp.emAttack==ITEMATT_RAIL_GUN || pITEM_TOSLOT->sSuitOp.emAttack==ITEMATT_PORTAL_GUN) && (pITEM_LEFT->sBasicOp.emItemType!=ITEM_BULLET) ) || //|| pITEM_TOSLOT->sSuitOp.emAttack==ITEMATT_RIFLE) && (pITEM_LEFT->sBasicOp.emItemType!=ITEM_BULLET) ) ||
				//	Memo :	³ÖÀ»·Á´Â ¾ÆÀÌÅÆÀÌ È°À̳ª ÁöÆÎÀÌ°¡ ¾Æ´Ò °æ¿ì. & test gun
					( 
					(pITEM_TOSLOT->sSuitOp.emAttack!=ITEMATT_BOW) && 
					(pITEM_TOSLOT->sSuitOp.emAttack!=ITEMATT_SPEAR) && 
					(pITEM_TOSLOT->sSuitOp.emAttack!=ITEMATT_DUAL_GUN) && 
					(pITEM_TOSLOT->sSuitOp.emAttack!=ITEMATT_RAIL_GUN )&& 
					(pITEM_TOSLOT->sSuitOp.emAttack!=ITEMATT_PORTAL_GUN)  
					) 
					) //|| pITEM_TOSLOT->sSuitOp.emAttack!=ITEMATT_RIFLE) ) )
				{
					bOk = m_cInventory.FindInsrtable ( pITEM_LEFT->sBasicOp.wInvenSizeX, pITEM_LEFT->sBasicOp.wInvenSizeY, wInvenPosX, wInvenPosY );
					if ( !bOk )	return E_FAIL;

					//	Á¾Àü ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.	#1 ¹é¾÷		//	¿ÞÂÊ ½½·Ô Áö¿öÁÜ.
					sToInvenItem = GET_SLOT_ITEM(emLHand);
				}

				//	Á¾Àü ¾ÆÀÌÅÆ ¼Õ¿¡ µé°í ÀÖ°Ô.	#2 ¹é¾÷
				sToHoldItem = GET_SLOT_ITEM(emRHand);

				//	ÀåÂøÇÒ ¾ÆÀÌÅÛ ÁöÁ¤.
				sToSlotItem = GET_HOLD_ITEM();
			}
			else
			{
				if ( !VALID_SLOT_ITEM(pNetMsg->emSlot) )	return S_FALSE;

				//	¼Õ¿¡ µé°Ô.
				sToHoldItem = GET_SLOT_ITEM(pNetMsg->emSlot);

				//	¾ÆÀÌÅÆ ÀåÂøÇÒ ¾ÆÀÌÅÛ ÁöÁ¤.
				sToSlotItem = GET_HOLD_ITEM();
			}
		}
		//	ÇÑ¼Õ µµ±¸¸¦ Âø¿ëÇÏ·Á ÇÏ´Â °æ¿ì.
		else
		{
			//	Note : Âø¿ëÇÒ·ÁÇÏ´Â µµ±¸°¡ È­»ìÀ̳ª ºÎÀûÀÇ °æ¿ì.
			// test gun
			if ( (pITEM_TOSLOT->sBasicOp.emItemType==ITEM_ARROW) || (pITEM_TOSLOT->sBasicOp.emItemType==ITEM_CHARM) || (pITEM_TOSLOT->sBasicOp.emItemType==ITEM_BULLET) )
			{
				//	¿Þ¼Õ¿¡¸¸ ÀåÂø °¡´É.
				if ( pNetMsg->emSlot != emLHand )
					return E_FAIL;

				//	Note : ¾ç¼Õ¹«±âÀÌ°í È°À̳ª È­»ìÀÏ °æ¿ì¸¸ Âø¿ë °¡´É.
				//
				if ( pITEM_RIGHT && ISBOTH_HANDHELD(pITEM_RIGHT) )
				{
					if ( (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_BOW) && (pITEM_TOSLOT->sBasicOp.emItemType!=ITEM_ARROW) )		return E_FAIL;
					if ( (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_SPEAR || pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_SCYTHE) && (pITEM_TOSLOT->sBasicOp.emItemType!=ITEM_CHARM) )	return E_FAIL;
					//test gun
					if ( (pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_DUAL_GUN || pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_RAIL_GUN || pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_PORTAL_GUN ) && (pITEM_TOSLOT->sBasicOp.emItemType!=ITEM_BULLET) )		return E_FAIL; //|| pITEM_RIGHT->sSuitOp.emAttack==ITEMATT_RIFLE) && (pITEM_TOSLOT->sBasicOp.emItemType!=ITEM_BULLET) )		return E_FAIL;
				}
				else	return E_FAIL;

				if ( !VALID_SLOT_ITEM(pNetMsg->emSlot) )	return S_FALSE;

				//	Á¾Àü ¾ÆÀÌÅÆ ¼Õ¿¡ µé°í ÀÖ°Ô.	#1 ¹é¾÷
				sToHoldItem = GET_SLOT_ITEM(pNetMsg->emSlot);

				//	ÀåÂøÇÒ ¾ÆÀÌÅÛ ÁöÁ¤.
				sToSlotItem = GET_HOLD_ITEM();
			}
			else 
			{
				//	Á¾Àü ¾ÆÀÌÅÛÀÌ ¾ç¼Õ·ùÀÏ °æ¿ì.
				if ( pITEM_RIGHT && ISBOTH_HANDHELD(pITEM_RIGHT) )
				{
					//	¾ç¼Õ ¸ðµÎ Âø¿ë ¹«±â ÀÖÀ» °æ¿ì.	È°+È­»ì, â+ºÎÀû. ¼¼Æ®·Î µ¿ÀÛÇÏ´Â ¹«±â·ù°¡ ÀÖÀ½ À̶§ ¸ðµÎ »©³»¾ßÇÔ.
					//
					if ( pITEM_LEFT )
					{
						bOk = m_cInventory.FindInsrtable ( pITEM_LEFT->sBasicOp.wInvenSizeX, pITEM_LEFT->sBasicOp.wInvenSizeY, wInvenPosX, wInvenPosY );
						if ( !bOk )	return E_FAIL;

						//	Á¾Àü ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½. #1 ¹é¾÷	//	¿ÞÂÊ ½½·Ô Áö¿öÁÜ.
						sToInvenItem = GET_SLOT_ITEM(emLHand);
					}

					//	Á¾Àü ¾ÆÀÌÅÆ ¼Õ¿¡ µé°í ÀÖ°Ô.	#2 ¹é¾÷
					sToHoldItem = GET_SLOT_ITEM(emRHand);

					//	ÀåÂøÇÒ ¾ÆÀÌÅÛ ÁöÁ¤.
					sToSlotItem = GET_HOLD_ITEM();
				}
				//	ÀϹÝÀûÀÏ °æ¿ì.
				else
				{
					if ( !VALID_SLOT_ITEM(pNetMsg->emSlot) )	return S_FALSE;

					//	Á¾Àü ¾ÆÀÌÅÆ ¼Õ¿¡ µé°í ÀÖ°Ô.	#1 ¹é¾÷
					sToHoldItem = GET_SLOT_ITEM(pNetMsg->emSlot);

					//	ÀåÂøÇÒ ¾ÆÀÌÅÛ ÁöÁ¤.
					sToSlotItem = GET_HOLD_ITEM();
				}
			}
		}
	}

	//	Note : ½ÇÁ¦·Î À̵¿ ½ÃÅ´, ¸Þ½ÃÁö ¹ß»ý
	//

	//	Note : Àκ¥¿¡ º¸³»Áú ¾ÆÀÌÅÛ.
	//
	if ( sToInvenItem.sNativeID != NATIVEID_NULL() )
	{
		m_cInventory.InsertItem ( sToInvenItem, wInvenPosX, wInvenPosY );

		//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ »ðÀÔ.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven_Insert;
		NetMsg_Inven_Insert.Data = *m_cInventory.GetItem(wInvenPosX, wInvenPosY);
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Insert);		
	}

	//	Note : ¼Õ¿¡µé±â.
	//

	if ( sToHoldItem.sNativeID != NATIVEID_NULL() )
	{
		HOLD_ITEM ( sToHoldItem );

		//	[Àڽſ¡°Ô] ¼Õ¿¡ ¾ÆÀÌÅÆÀ» µé°Ô.
		GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
		NetMsg_PutOn.emSlot = SLOT_HOLD;
		NetMsg_PutOn.sItemCustom = sToHoldItem;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

		// ¹«±â¿¡ µû¸¥ ¹öÇÁ¸¦ ÃʱâÈ­ ÇÑ´Ù.
		DisableSkillFact();
	}

	if ( pNetMsg->emSlot == SLOT_VEHICLE )
	{
		GLGaeaServer::GetInstance().SaveVehicle( m_dwClientID, m_dwGaeaID, false );		
	}

	//	Note : ½½·Ô¿¡ ³Ö±â. ½½·Ô¿¡¼­ »©³¾ ¾ÆÀÌÅÛ ÀÖÀ¸¸é Á¦°Å. (Àκ¥¿¡ º¸³»Áú ¾ÆÀÌÅÛ.)
	//
	if ( sToSlotItem.sNativeID != NATIVEID_NULL() )
	{
		//	Note : ½½·Ô¿¡¼­ Á¦°ÅÇÒ ¾ÆÀÌÅÛÀÌ ÀÖÀ» °æ¿ì.
		//
		EMSLOT emSlotRelease(SLOT_TSIZE);
		if ( sToInvenItem.sNativeID!=NATIVEID_NULL() )
		{
			emSlotRelease = emLHand;
			RELEASE_SLOT_ITEM(emLHand);		//	¿ÞÂÊ ½½·Ô Áö¿öÁÜ.
		}

		//	½½·Ô¿¡ ³ÖÀ½.
		SLOT_ITEM ( sToSlotItem, pNetMsg->emSlot );

		//	[Àڽſ¡°Ô] SLOT ¿¡ ¾ÆÀÌÅÆÀ» Âø¿ë.
		//
		GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
		NetMsg_PutOn.emSlot = pNetMsg->emSlot;
		NetMsg_PutOn.sItemCustom = sToSlotItem;
		NetMsg_PutOn.emSlotRelease = emSlotRelease;					//	¾ÆÀÌÅÛ »èÁ¦ÇÒ ½½·Ô.
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

		//	[¸ðµÎ¿¡°Ô] ÀÚ½ÅÀÇ Âø¿ë º¹ÀåÀÌ ¹Ù²ñÀ» ¾Ë¸².
		//
		GLMSG::SNETPC_PUTON_UPDATE_BRD NetMsg_PutOn_Update_Brd;
		NetMsg_PutOn_Update_Brd.dwGaeaID = m_dwGaeaID;
		NetMsg_PutOn_Update_Brd.emSlot = pNetMsg->emSlot;
		NetMsg_PutOn_Update_Brd.sItemClient.Assign ( sToSlotItem );
		NetMsg_PutOn_Update_Brd.emSlotRelease = emSlotRelease;		//	¾ÆÀÌÅÛ »èÁ¦ÇÒ ½½·Ô.
		SendMsgViewAround ( reinterpret_cast<NET_MSG_GENERIC*>(&NetMsg_PutOn_Update_Brd) );

		// ¹«±â¿¡ µû¸¥ ¹öÇÁ¸¦ ÃʱâÈ­ ÇÑ´Ù.
		DisableSkillFact();
	}

	//	Note : ¾ÆÀÌÅÆ º¯°æ½Ã °ª Àç ȯ»ê ÇÊ¿äÇÔ.
	//
	INIT_DATA ( FALSE, FALSE );

	return S_OK;
}

HRESULT GLChar::MsgReqHoldToSlot ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_HOLD_TO_SLOT *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_HOLD_TO_SLOT*> ( nmg );
	if ( pNetMsg->emSlot >= SLOT_TSIZE )	return S_FALSE;

	if ( !VALID_HOLD_ITEM () )				return S_FALSE;
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
	if ( !pItem )							return S_FALSE;
	if ( m_sCONFTING.IsCONFRONTING() )		return S_FALSE;

	const SITEMCUSTOM sItemCustom = GET_HOLD_ITEM ();

	BOOL bOk(FALSE);

#if defined(VN_PARAM) //vietnamtest%%%
	if ( sItemCustom.bVietnamGainItem )	return S_FALSE;
#endif
	
	if( sItemCustom.nidDISGUISE!=SNATIVEID(false) )
	{
		//	ÄÚ½ºÆ¬À» ÀÔÈù ¾ÆÀÌÅÛÀÏ °æ¿ì
		bOk = ACCEPT_ITEM ( sItemCustom.sNativeID, sItemCustom.nidDISGUISE );
		if ( !bOk )	return E_FAIL;
	}
	else
	{
		//	ÀÚ°ÝÁ¶°Ç¿¡ ºÎÇÕÇÏ´ÂÁö °Ë»ç.
		bOk = ACCEPT_ITEM ( sItemCustom.sNativeID );
		if ( !bOk )	return E_FAIL;
	}
	
	//	ÇØ´ç ½½·Ô¿¡ ÀåÂø °¡´ÉÇÑÁö °Ë»ç.
	bOk = CHECKSLOT_ITEM ( sItemCustom.sNativeID, pNetMsg->emSlot );
	if ( !bOk )	return E_FAIL;

	//	ÇØ´ç ½½·ÔÀÌ ºñ¿´´ÂÁö Á¡°Ë.
	bOk = ISEMPTY_SLOT ( sItemCustom.sNativeID, pNetMsg->emSlot );
	if ( !bOk ) return E_FAIL;

	//	¸¸¾à ¾ç¼Õ ¹«±âÀÏ °æ¿ì ½½·ÔÀ» "¿À¸¥¼Õ µé±â" ½½·ÔÀ¸·Î.
	if ( ISBOTH_HANDHELD(pItem) )	pNetMsg->emSlot = GetCurRHand();

	//	ÇØ´ç ½½·Ô¿¡ ¾ÆÀÌÅÆ ÀåÂø.
	SLOT_ITEM ( sItemCustom, pNetMsg->emSlot );

	//	¼Õ¿¡ µç ¾ÆÀÌÅÛ Á¦°Å
	RELEASE_HOLD_ITEM ();

	//	¾ÆÀÌÅÆ º¯°æ½Ã °ª Àç ȯ»ê ÇÊ¿äÇÔ.
	INIT_DATA ( FALSE, FALSE );

	//	[Àڽſ¡°Ô] ¼Õ¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_PUTON_RELEASE NetMsg_PutOn_Release(SLOT_HOLD);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn_Release);

	//	[Àڽſ¡°Ô] ¼Õ¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆÀ» Slot¿¡ Âø¿ë.
	GLMSG::SNETPC_PUTON_UPDATE NetMsg_PutOn;
	NetMsg_PutOn.emSlot = pNetMsg->emSlot;
	NetMsg_PutOn.sItemCustom = sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

	//	[¸ðµÎ¿¡°Ô] º¹ÀåÀÌ ¹Ù²ñÀ» ¾Ë·ÁÁÜ.
	GLMSG::SNETPC_PUTON_UPDATE_BRD NetMsg_PutOn_Brd;
	NetMsg_PutOn_Brd.dwGaeaID = m_dwGaeaID;
	NetMsg_PutOn_Brd.emSlot = pNetMsg->emSlot;
	NetMsg_PutOn_Brd.sItemClient.Assign ( sItemCustom );
	SendMsgViewAround ( reinterpret_cast<NET_MSG_GENERIC*>(&NetMsg_PutOn_Brd) );

	// ¹«±â¿¡ µû¸¥ ¹öÇÁ¸¦ ÃʱâÈ­ ÇÑ´Ù.
	DisableSkillFact();

	return S_OK;
}


HRESULT GLChar::MsgReqSlotChange ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_SLOT_CHANGE *pNetMsg = reinterpret_cast<GLMSG::SNETPC_REQ_SLOT_CHANGE*> ( nmg );

	if( IsUseArmSub() ) SetUseArmSub( FALSE ); // ÁÖ¹«±â
	else				SetUseArmSub( TRUE );  // º¸Á¶¹«±â

	//	¾ÆÀÌÅÆ º¯°æ½Ã °ª Àç ȯ»ê ÇÊ¿äÇÔ.
	INIT_DATA ( FALSE, FALSE, m_sCONFTING.sOption.fHP_RATE );

	//	[Àڽſ¡°Ô] ¹«±â ½º¿Ò
	GLMSG::SNETPC_PUTON_CHANGE NetMsg_PutOn;
	NetMsg_PutOn.bUseArmSub = IsUseArmSub();
	NetMsg_PutOn.fCONFT_HP_RATE = m_sCONFTING.sOption.fHP_RATE;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn);

	//	[¸ðµÎ¿¡°Ô] ¹«±â ½º¿ÒÀ» ¾Ë¸².
	GLMSG::SNETPC_PUTON_CHANGE_BRD NetMsg_PutOn_Brd;
	NetMsg_PutOn_Brd.dwGaeaID = m_dwGaeaID;
	NetMsg_PutOn_Brd.bUseArmSub = IsUseArmSub();
	SendMsgViewAround ( reinterpret_cast<NET_MSG_GENERIC*>(&NetMsg_PutOn_Brd) );

	GLMSG::SNETPC_PUTON_CHANGE_AG NetMsg_PutOn_AG;
	NetMsg_PutOn_AG.bUseArmSub = IsUseArmSub();
	GLGaeaServer::GetInstance().SENDTOAGENT ( m_dwClientID, &NetMsg_PutOn_AG );


	// ¹«±â¿¡ µû¸¥ ¹öÇÁ¸¦ ÃʱâÈ­ ÇÑ´Ù.
	DisableSkillFact();
	
	return S_OK;
}

bool GLChar::InsertPileItem ( const SITEMCUSTOM& sItemCustom, WORD wREQINSRTNUM )
{
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sItemCustom.sNativeID );
	if ( !pItem )				return false;
	if ( !pItem->ISPILE() )		return false;

	WORD wPILENUM = pItem->sDrugOp.wPileNum;
	WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
	WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

	//	Note : ´õ °ãÃÄÁú¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö °Ë»çÇÏ¿© Àκ¥¿¡ µé¾î°¡¾ßÇÏ´Â
	//		¾ÆÀÌÅÛ Á¡°Ë ¼ýÀÚ¸¦ °¨¼Ò½ÃÅ´.
	GLInventory::CELL_MAP &ItemMap = *m_cInventory.GetItemList();
	GLInventory::CELL_MAP_ITER iter = ItemMap.begin();
	for ( ; iter!=ItemMap.end(); ++iter )
	{
		SINVENITEM &sINVENITEM = *(*iter).second;
		SITEMCUSTOM &sITEMCUSTOM = sINVENITEM.sItemCustom;
		if ( sITEMCUSTOM.sNativeID != sItemCustom.sNativeID )	continue;
		if ( sITEMCUSTOM.wTurnNum>=wPILENUM )		continue;
	
		//	±âÁ¸ ¾ÆÀÌÅÛ °ãħ ¿©À¯ºÐ.
		WORD wSURPLUSNUM = wPILENUM - sITEMCUSTOM.wTurnNum;

		if ( wREQINSRTNUM > wSURPLUSNUM )
		{
			//	Note : ±âÁ¸ ¾ÆÀÌÅÛÀÇ °ãħÀ» º¯°æ. ( ²ËÂü )
			sITEMCUSTOM.wTurnNum = wPILENUM;

			//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
			GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
			NetMsg.wPosX = sINVENITEM.wPosX;
			NetMsg.wPosY = sINVENITEM.wPosY;
			NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

			//	Note : ÀÜ¿© ¼ö·® °¨¼Ò.
			wREQINSRTNUM -= wSURPLUSNUM;
		}
		else
		{
			//	Note : ±âÁ¸ ¾ÆÀÌÅÛ¿¡ °ãÄ¡´Â °Í ¸¸À¸·Îµµ »õ·Î ³ÖÀ» ¾ÆÀÌÅÛÀÌ ÃæºÐÈ÷ µé¾î°¨.
			sITEMCUSTOM.wTurnNum += wREQINSRTNUM;

			//	Note : Ŭ¶óÀ̾ðÆ®¿¡ °¹¼ö º¯°æÀ» ¾Ë¸².
			GLMSG::SNETPC_INVEN_DRUG_UPDATE NetMsg;
			NetMsg.wPosX = sINVENITEM.wPosX;
			NetMsg.wPosY = sINVENITEM.wPosY;
			NetMsg.wTurnNum = sITEMCUSTOM.wTurnNum;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

			//	±Ý¾× º¯È­ ¸Þ½ÃÁö.
			GLMSG::SNETPC_UPDATE_MONEY NetMsgMoney;
			NetMsgMoney.lnMoney = m_lnMoney;
			//add money 2
			NetMsgMoney.lnVoteP = m_lnVoteP;
			//add money 3
			NetMsgMoney.lnPremP = m_lnPremP;
			//add contributionpoints by CNDev
			NetMsgMoney.lnContribP = m_lnContribP;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgMoney);

			return true;
		}
	}

	//	Note : »õ·ÎÀÌ Àκ¥¿¡ µé¾î°¡¾ßÇÒ ¾ÆÀÌÅÛÀÇ °¹¼ö ÆľÇÈÄ Àκ¥¿¡ µé¾î°¥ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.

	//	ÃÖ´ë°ãħ¾ÆÀÌÅÛ ¼ö·®.
	WORD wONENUM = wREQINSRTNUM / wPILENUM;
	WORD wITEMNUM = wONENUM;

	//	¿©ºÐ°ãħ¾ÆÀÌÅÛÀÇ °ãħ¼ö.
	WORD wSPLITNUM = wREQINSRTNUM % wPILENUM;
	if ( wSPLITNUM > 0 )				wITEMNUM += 1;
	if ( wSPLITNUM==0 && wITEMNUM>=1 )	wSPLITNUM = wPILENUM;

	for ( WORD i=0; i<wITEMNUM; ++i )
	{
		WORD wInsertPosX(0), wInsertPosY(0);
		BOOL bITEM_SPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );
		GASSERT(bITEM_SPACE&&"³ÖÀ» °ø°£À» ¹Ì¸® üũ¸¦ ÇÏ°í ¾ÆÀÌÅÛÀ» ³Ö¾úÀ¸³ª °ø°£ÀÌ ºÎÁ·ÇÔ.");

		//	Note : »õ·Î¿î ¾ÆÀÌÅÛÀ» ³Ö¾îÁÜ.
		//
		SITEMCUSTOM sITEMCUSTOM(sItemCustom.sNativeID);
		sITEMCUSTOM.tBORNTIME = sItemCustom.tBORNTIME;

		sITEMCUSTOM.cGenType = sItemCustom.cGenType;
		sITEMCUSTOM.cChnID = sItemCustom.cChnID;
		sITEMCUSTOM.cFieldID = sItemCustom.cFieldID;

		if ( wITEMNUM==(i+1) )	sITEMCUSTOM.wTurnNum = wSPLITNUM;	//	¸¶Áö¸· ¾ÆÀÌÅÛÀº ÀÜ¿©·®.
		else					sITEMCUSTOM.wTurnNum = wPILENUM;	//	¾Æ´Ò °æ¿ì´Â ²ËÂù·®.

		m_cInventory.InsertItem ( sITEMCUSTOM, wInsertPosX, wInsertPosY );	//	ÀιêÅ丮¿¡ ³Ö½À´Ï´Ù.

		//	Àι꿡 ¾ÆÀÌÅÆ ³Ö¾îÁÖ´Â ¸Þ½ÃÁö.
		GLMSG::SNETPC_INVEN_INSERT NetMsgInven;
		NetMsgInven.Data = *m_cInventory.GetItem ( wInsertPosX, wInsertPosY );
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInven);
	}

	return true;
}

bool GLChar::DeletePileItem ( SNATIVEID sNID, WORD wREQDELNUM )
{
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sNID );
	if ( !pItem )				return false;
	if ( !pItem->ISPILE() )		return false;

	WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
	WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

	std::vector<SNATIVEID>	vecDEL;

	//	Note : ´õ °ãÃÄÁú¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö °Ë»çÇÏ¿© Àκ¥¿¡ µé¾î°¡¾ßÇÏ´Â
	//		¾ÆÀÌÅÛ Á¡°Ë ¼ýÀÚ¸¦ °¨¼Ò½ÃÅ´.
	GLInventory::CELL_MAP &ItemMap = *m_cInventory.GetItemList();
	GLInventory::CELL_MAP_ITER iter = ItemMap.begin();
	for ( ; iter!=ItemMap.end(); ++iter )
	{
		if ( wREQDELNUM==0 )						break;

		SINVENITEM &sINVENITEM = *(*iter).second;
		SITEMCUSTOM &sITEMCUSTOM = sINVENITEM.sItemCustom;
		if ( sITEMCUSTOM.sNativeID != sNID )		continue;

		if ( sITEMCUSTOM.wTurnNum>wREQDELNUM )
		{
			sITEMCUSTOM.wTurnNum -= wREQDELNUM;
			wREQDELNUM = 0;

			//	Note : °¹¼öº¯°æ ¸Þ½ÃÁö.
			GLMSG::SNETPC_INVEN_DRUG_UPDATE	NetMsgUpdate;
			NetMsgUpdate.wPosX = sINVENITEM.wPosX;
			NetMsgUpdate.wPosY = sINVENITEM.wPosY;
			NetMsgUpdate.wTurnNum = sITEMCUSTOM.wTurnNum;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgUpdate);
		}
		else
		{
			wREQDELNUM -= sITEMCUSTOM.wTurnNum;
			sITEMCUSTOM.wTurnNum = 0;

			vecDEL.push_back ( SNATIVEID(sINVENITEM.wPosX,sINVENITEM.wPosY) );
		}
	}

	if ( !vecDEL.size() )	return true;

	for ( DWORD i=0; i<vecDEL.size(); ++i )
	{
		m_cInventory.DeleteItem ( vecDEL[i].wMainID, vecDEL[i].wSubID );

		//	Note : »èÁ¦ ¸Þ½ÃÁö.
		GLMSG::SNETPC_INVEN_DELETE NetMsgDelete;
		NetMsgDelete.wPosX = vecDEL[i].wMainID;
		NetMsgDelete.wPosY = vecDEL[i].wSubID;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgDelete);
	}

	return true;
}

// *****************************************************
// Desc: NPC ·ÎºÎÅÍ ¾ÆÀÌÅÛ ±¸ÀÔ
// *****************************************************
HRESULT GLChar::MsgReqBuyFromNpc ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_BUY_FROM_NPC *pNetMsg = (GLMSG::SNETPC_REQ_BUY_FROM_NPC *) nmg;

	PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( pNetMsg->sNID );

	DxConsoleMsg* pConsoleMsg = GLGaeaServer::GetInstance().GetConsoleMsg();

	if ( !m_pLandMan )
	{
		return E_FAIL;
	}

	// »óÁ¡ NPC À¯È¿¼º üũ
	PGLCROW pCrow = m_pLandMan->GetCrow ( pNetMsg->dwNPCID );
	if ( !pCrow )					return E_FAIL;

	float fDist = D3DXVec3Length ( &D3DXVECTOR3(m_vPos-pCrow->GetPosition()) );
	float fTalkRange = (float) (pCrow->GetBodyRadius() + GETBODYRADIUS() + 30);
	float fTalkableDis = fTalkRange + 20;

	if ( fDist>fTalkableDis )		return E_FAIL;
	

	if ( !pCrowData )
	{
		//	»óÀÎ NPC°¡ Á¸Á¦ÇÏÁö ¾Ê½À´Ï´Ù.
		return E_FAIL;
	}

	if ( !pCrowData->m_sNpcTalkDlg.IsMARKET() )
	{
		//	»óÀÎÀÌ ¾Æ´Õ´Ï´Ù.
		return E_FAIL;
	}

	if ( pCrowData->GetSaleNum() <= pNetMsg->dwChannel )		return E_FAIL;

	GLInventory *pInven = pCrowData->GetSaleInven(pNetMsg->dwChannel);
	if ( !pInven )												return E_FAIL;

	SINVENITEM* pSaleItem(NULL);
	pSaleItem = pInven->GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	»ì·Á°í ÇÏ´Â ¾ÆÀÌÅÆÀÌ ¾ø½À´Ï´Ù.
	if ( !pSaleItem )											return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pSaleItem->sItemCustom.sNativeID );
	if ( !pItem )												return E_FAIL;

	volatile float fSHOP_RATE = GET_PK_SHOP2BUY();
	if ( fSHOP_RATE==0.0f )										return E_FAIL;

	volatile float fSHOP_2RATE = fSHOP_RATE + m_pLandMan->m_fCommissionRate;
	volatile float fSHOP_2RATE_C = fSHOP_2RATE * 0.01f;

	LONGLONG dwPrice = pCrowData->GetNpcSellPrice(pItem->sBasicOp.sNativeID.dwID);
	volatile LONGLONG llPRICE2;

	//add money 2
	//no tax for vote item
	if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM )
	{
		llPRICE2= pItem->sBasicOp.dwBuyPrice;
	}
	//add money 3
	//no tax for premium item
	else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM )
	{
		llPRICE2= pItem->sBasicOp.dwBuyPrice;
	}
	//add contributionpoint by CNDev
	//no tax for contribution item
	else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
	{
		llPRICE2= pItem->sBasicOp.dwBuyPrice;
	}
	else
	{
		if( dwPrice == 0 )
		{
			dwPrice = pItem->sBasicOp.dwBuyPrice;
			llPRICE2 = (LONGLONG)(dwPrice * fSHOP_2RATE_C);
		}
		else
		{
		llPRICE2 = dwPrice;
		}
	}

	volatile LONGLONG llPRICE3 = (LONGLONG)(llPRICE2*pNetMsg->wBuyNum);

	//add money 2
	//compare price to votepoint
	if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
	{
		if ( m_lnVoteP < llPRICE3 )
		{
		return E_FAIL;
		}
	}
	//add money 3
	//compare price to premium point
	else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM ) 
	{
		if ( m_lnPremP < llPRICE3 )
		{
		return E_FAIL;
		}
	}
	//add contributionpoint by CNDev
	else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
	{
		if ( m_lnContribP < llPRICE3 )
		{
			return E_FAIL;
		}
	}
	//compare price to gold
	else
	{
		if ( m_lnMoney < llPRICE3 )
		{
		return E_FAIL;
		}
	}
	

	WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
	WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

	//	Note : Àκ¥¿¡ ¿©À¯ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.
	//
	BOOL bITEM_SPACE(FALSE);
	if ( pItem->ISPILE() )
	{
		//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
		WORD wPILENUM = pItem->sDrugOp.wPileNum;
		SNATIVEID sNID = pItem->sBasicOp.sNativeID;

		//	³Ö±â ¿äûµÈ ¾ÆÀÌÅÛ¼ö. ( ÀÜ¿©·®. )
		WORD wREQINSRTNUM = ( pNetMsg->wBuyNum * pItem->GETAPPLYNUM() );

		bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY );

		//	Àκ¥¿¡ ¿©À¯°ø°£ÀÌ ¾øÀ» °æ¿ì Ãë¼ÒµÊ.
		if ( !bITEM_SPACE )		return E_FAIL;

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		SITEMCUSTOM sDB_ITEM(sNID);
		sDB_ITEM.cGenType = EMGEN_SHOP;
		sDB_ITEM.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
		sDB_ITEM.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
		sDB_ITEM.wTurnNum = wPILENUM;
		sDB_ITEM.tBORNTIME = CTime::GetCurrentTime().GetTime();


		//add money 2
		//log vote item purchase to db
		if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sDB_ITEM, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR_VOTE, sDB_ITEM.wTurnNum );
		}
		//add money 3
		//log premium item purchase to db
		else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM ) 
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sDB_ITEM, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR_PREMIUM, sDB_ITEM.wTurnNum );
		}
		//add cotnributionpoint by CNDev
		else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sDB_ITEM, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR_CONTRIBUTION, sDB_ITEM.wTurnNum );
		}
		else
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sDB_ITEM, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, sDB_ITEM.wTurnNum );
		}
		//add money 3
		//record vote item purchase 
		if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
		{
			CheckMoneyUpdate( m_lnVoteP, llPRICE3, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnVoteP -= llPRICE3;	

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_VOTE_PURCHASE.txt", "%s	BUY MILTIPLE VOTE ITEM [CharID: %d][CharName:%s][Point Spent:%I64d][Money Left:%I64d][ITEM MID:%d SID:%d][Number: %d] ",
			strTIME.c_str(), m_dwCharID, m_szName, llPRICE3, m_lnVoteP, sDB_ITEM.sNativeID.wMainID, sDB_ITEM.sNativeID.wSubID,pNetMsg->wBuyNum );
		}
		//add money 2
		//record premium item purchase
		else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM ) 
		{
			CheckMoneyUpdate( m_lnPremP, llPRICE3, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnPremP -= llPRICE3;	

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_PREMIUM_PURCHASE.txt", "%s	BUY MILTIPLE PREMIUM ITEM [CharID: %d][CharName:%s][Point Spent:%I64d][Money Left:%I64d][ITEM MID:%d SID:%d][Number: %d] ",
			strTIME.c_str(), m_dwCharID, m_szName, llPRICE3, m_lnPremP, sDB_ITEM.sNativeID.wMainID, sDB_ITEM.sNativeID.wSubID,pNetMsg->wBuyNum );
		}
		//add contributionpoint by CNDev
		else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
		{
			CheckMoneyUpdate( m_lnContribP, llPRICE3, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnContribP -= llPRICE3;

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_CONTRIBUTION_PURCHASE.txt", "%s	BUY MILTIPLE CONTRIBUTION ITEM [CharID: %d][CharName:%s][Point Spent:%I64d][Money Left:%I64d][ITEM MID:%d SID:%d][Number: %d] ",
			strTIME.c_str(), m_dwCharID, m_szName, llPRICE3, m_lnContribP, sDB_ITEM.sNativeID.wMainID, sDB_ITEM.sNativeID.wSubID,pNetMsg->wBuyNum );
		}
		else
		{
			CheckMoneyUpdate( m_lnMoney, llPRICE3, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnMoney -= llPRICE3;	
		}

		//add money 2 modified
		if ( llPRICE3>EMMONEY_LOG )
		{
			if ( !(pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM || pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM || pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM)  ) 
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE3), EMITEM_ROUTE_DELETE );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
			}
		}

		if ( llPRICE3>EMMONEY_LOG_PREMIUM )
		{		
			if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE3), EMITEM_ROUTE_DELETE_VOTE );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnVoteP, EMITEM_ROUTE_CHAR_VOTE );
			}
			else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM ) 
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE3), EMITEM_ROUTE_DELETE_PREMIUM );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnPremP, EMITEM_ROUTE_CHAR_PREMIUM );
			}
			//add contributionpoint by CNDev
			else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE3), EMITEM_ROUTE_DELETE_CONTRIBUTION );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnContribP, EMITEM_ROUTE_CHAR_CONTRIBUTION );
			}
		}

#if defined(_RELEASED) || defined(TW_PARAM) || defined(TH_PARAM) || defined(HK_PARAM) // ***Tracing Log print
		if ( m_bTracingUser )
		{
			NET_LOG_UPDATE_TRACINGCHAR TracingMsg;
			TracingMsg.nUserNum  = GetUserID();
			StringCchCopy( TracingMsg.szAccount, USR_ID_LENGTH+1, m_szUID );

			CString strTemp;
			strTemp.Format( "Buy From Npc, [%s][%s], Buy price:[%I64d], Have Money:[%I64d]",
					 m_szUID, m_szName,  llPRICE3, m_lnMoney );

			StringCchCopy( TracingMsg.szLogMsg, TRACING_LOG_SIZE, strTemp.GetString() );

			m_pGLGaeaServer->SENDTOAGENT( m_dwClientID, &TracingMsg );
		}
#endif

		//	Note : ¾ÆÀÌÅÛÀ» Àκ¥¿¡ ³Ö¾îÁØ´Ù.
		//
		InsertPileItem ( sDB_ITEM, wREQINSRTNUM );
	}
	else
	{
		//	ÀÏ¹Ý ¾ÆÀÌÅÛÀÇ °æ¿ì.
		WORD wInsertPosX(0), wInsertPosY(0);
		bITEM_SPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );

		//	Àκ¥¿¡ ¿©À¯°ø°£ÀÌ ¾øÀ» °æ¿ì Ãë¼ÒµÊ.
		if ( !bITEM_SPACE )		return E_FAIL;

		//	Note : »õ·Î¿î ¾ÆÀÌÅÛÀ» »ý¼ºÇÕ´Ï´Ù.
		//
		SNATIVEID sNID = pSaleItem->sItemCustom.sNativeID;
		SITEMCUSTOM sITEM_NEW = pSaleItem->sItemCustom;
		CTime cTIME = CTime::GetCurrentTime();
		sITEM_NEW.tBORNTIME = cTIME.GetTime();

		sITEM_NEW.wTurnNum = 1;
		sITEM_NEW.cGenType = (BYTE) EMGEN_SHOP;
		sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
		sITEM_NEW.cFieldID = (BYTE) GLGaeaServer::GetInstance().GetFieldSvrID();
		sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sNID, EMGEN_SHOP );

		//	·£´ý ¿É¼Ç ¹ß»ý.
		//
		//if( sITEM_NEW.GENERATE_RANDOM_OPT () )
		//{
		//	GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
		//}

		//	Note : µ·À» ÁöºÒÇÕ´Ï´Ù.
		//
		
		//add money 2
		//record vote item purchase
		if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
		{
			CheckMoneyUpdate( m_lnVoteP, llPRICE2, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnVoteP -= llPRICE2;	

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_VOTE_PURCHASE.txt", "%s	BUY SINGLE VOTE ITEM [CharID: %d][CharName:%s][Point Spent:%I64d][Money Left:%I64d][ITEM MID:%d SID:%d] ",
			strTIME.c_str(), m_dwCharID, m_szName, llPRICE3, m_lnVoteP, sITEM_NEW.sNativeID.wMainID, sITEM_NEW.sNativeID.wSubID );

			//test add regenerate random option
			if( sITEM_NEW.GENERATE_RANDOM_OPT () )
			{
				GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
			}
		}
		//add money 3
		//record premium item purchase
		else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM ) 
		{
			CheckMoneyUpdate( m_lnPremP, llPRICE2, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnPremP -= llPRICE2;	

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_PREMIUM_PURCHASE.txt", "%s	BUY SINGLE PREMIUM ITEM [CharID: %d][CharName:%s][Point Spent:%I64d][Money Left:%I64d][ITEM MID:%d SID:%d] ",
			strTIME.c_str(), m_dwCharID, m_szName, llPRICE3, m_lnPremP, sITEM_NEW.sNativeID.wMainID, sITEM_NEW.sNativeID.wSubID );

			//test add regenerate random option
			if( sITEM_NEW.GENERATE_RANDOM_OPT () )
			{
				GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
			}
		}
		//add contributionpoint by CNDev
		else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM ) 
		{
			CheckMoneyUpdate( m_lnContribP, llPRICE2, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnContribP -= llPRICE2;	

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_PREMIUM_CONTRIBUTION.txt", "%s	BUY SINGLE CONTRIBUTION ITEM [CharID: %d][CharName:%s][Point Spent:%I64d][Money Left:%I64d][ITEM MID:%d SID:%d] ",
			strTIME.c_str(), m_dwCharID, m_szName, llPRICE3, m_lnContribP, sITEM_NEW.sNativeID.wMainID, sITEM_NEW.sNativeID.wSubID );

			//test add regenerate random option
			if( sITEM_NEW.GENERATE_RANDOM_OPT () )
			{
				GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
			}
		}
		else
		{
			CheckMoneyUpdate( m_lnMoney, llPRICE2, FALSE, "Buy From Npc." );
			m_bMoneyUpdate = TRUE;
			m_lnMoney -= llPRICE2;	
		}


		//add money 2
		//add contributionpoint by CNDev
		if ( llPRICE3>EMMONEY_LOG )
		{
			if ( !(pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM || pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM || pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM) ) 
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE2), EMITEM_ROUTE_DELETE );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
			}
		}

		if ( llPRICE3>EMMONEY_LOG_PREMIUM )
		{		
			if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE2), EMITEM_ROUTE_DELETE_VOTE );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnVoteP, EMITEM_ROUTE_CHAR_VOTE );
			}
			else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM ) 
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE2), EMITEM_ROUTE_DELETE_PREMIUM );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnPremP, EMITEM_ROUTE_CHAR_PREMIUM );
			}
			//add contributionpoint by CNDev
			else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM ) 
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, -LONGLONG(llPRICE2), EMITEM_ROUTE_DELETE_CONTRIBUTION );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnContribP, EMITEM_ROUTE_CHAR_CONTRIBUTION );
			}
		}

#if defined(_RELEASED) || defined(TW_PARAM) || defined(TH_PARAM) || defined(HK_PARAM) // ***Tracing Log print
		if ( m_bTracingUser )
		{
			NET_LOG_UPDATE_TRACINGCHAR TracingMsg;
			TracingMsg.nUserNum  = GetUserID();
			StringCchCopy( TracingMsg.szAccount, USR_ID_LENGTH+1, m_szUID );

			CString strTemp;
			strTemp.Format( "Buy From Npc, [%s][%s], Buy price:[%I64d], Have Money:[%I64d]",
					 m_szUID, m_szName,  llPRICE3, m_lnMoney );

			StringCchCopy( TracingMsg.szLogMsg, TRACING_LOG_SIZE, strTemp.GetString() );

			m_pGLGaeaServer->SENDTOAGENT( m_dwClientID, &TracingMsg );
		}
#endif

		//	Note : Àκ¥Å丮¿¡ ³Ö¾îÁÝ´Ï´Ù.
		//
		BOOL bOK = m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
		if ( !bOK )		return S_OK;

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		//add money 2
		//item log
		if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sITEM_NEW, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR_VOTE, sITEM_NEW.wTurnNum );
		}
		//add money 3
		else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM ) 
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sITEM_NEW, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR_PREMIUM, sITEM_NEW.wTurnNum );
		}
		//add contributionpoint by CNDev
		else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM ) 
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sITEM_NEW, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR_CONTRIBUTION, sITEM_NEW.wTurnNum );
		}
		else
		{
			GLITEMLMT::GetInstance().ReqItemRoute ( sITEM_NEW, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, sITEM_NEW.wTurnNum );
		}

		//	Àι꿡 ¾ÆÀÌÅÆ ³Ö¾îÁÖ´Â ¸Þ½ÃÁö.
		GLMSG::SNETPC_INVEN_INSERT NetMsgInven;
		NetMsgInven.Data = *m_cInventory.GetItem ( wInsertPosX, wInsertPosY );
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgInven);
	}

	if ( pCrow->m_bNpcRecall )
	{
		volatile float fSHOP_RATE_C = fSHOP_RATE * 0.01f;
		volatile LONGLONG llPRICE1 = (LONGLONG)( dwPrice * fSHOP_RATE_C );
		volatile LONGLONG llCommission = llPRICE2 - llPRICE1;

		llCommission = LONGLONG ( llCommission * GLCONST_CHAR::fEARNING_RATE_NPC + 0.1f );

		pCrow->m_lnCommission += llCommission;
	}
	else if ( m_pLandMan->m_dwGuidClubID != CLUB_NULL )
	{
		GLGuidance *pGuid = m_pLandMan->m_pGuidance;
		if ( pGuid && !pGuid->m_bBattle )
		{
			//	Note : Ŭ·´ÀÇ ¼öÀÍ ¹ß»ý.
			volatile float fSHOP_RATE_C = fSHOP_RATE * 0.01f;
			volatile LONGLONG llPRICE1 = (LONGLONG)( dwPrice * fSHOP_RATE_C );
			volatile LONGLONG llCommission = llPRICE2 - llPRICE1;

			GLClubMan &cClubMan = GLGaeaServer::GetInstance().GetClubMan();
			GLCLUB *pCLUB = cClubMan.GetClub ( m_pLandMan->m_dwGuidClubID );
			if ( pCLUB )
			{
				pCLUB->m_lnIncomeMoney += llCommission;

				// Ŭ·´ ¼öÀÔÀÌ 1¾ï ÀÌ»óÀÏ °æ¿ì ·Î±×¸¦ ³²±ä´Ù.
				if( llCommission > 	EMCLUBINCOMEMONEY_LOG )
					GLITEMLMT::GetInstance().ReqMoneyExc( ID_CHAR, 0, 
														  ID_CLUB, pCLUB->m_dwID,
														  llCommission,
														  EMITEM_ROUTE_CLUBINCOME );

				CDebugSet::ToFile ( "club_income_char.txt", "{BuyFromNpc}, ClubID[%u], CharID[%u], Commission[%I64d], IncomeMoney[%I64d]",
									pCLUB->m_dwID, m_dwCharID, llCommission, pCLUB->m_lnIncomeMoney );
			}
		}
	}

	//	±Ý¾× º¯È­ ¸Þ½ÃÁö.
	GLMSG::SNETPC_UPDATE_MONEY NetMsgMoney;
	NetMsgMoney.lnMoney = m_lnMoney;
	//add money 2
	NetMsgMoney.lnVoteP = m_lnVoteP;
	//add money 3
	NetMsgMoney.lnPremP = m_lnPremP;
	//add contributionpoints by CNDev
	NetMsgMoney.lnContribP = m_lnContribP;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgMoney);

	return S_OK;
}

// *****************************************************
// Desc: NPC ¿¡°Ô ¾ÆÀÌÅÛ ÆǸÅ
// *****************************************************
HRESULT GLChar::MsgReqSaleToNpc ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_SALE_TO_NPC *pNetMsg = (GLMSG::SNETPC_REQ_SALE_TO_NPC *) nmg;
	
	PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( pNetMsg->sNID );

	DxConsoleMsg* pConsoleMsg = GLGaeaServer::GetInstance().GetConsoleMsg();

	// »óÁ¡ NPC À¯È¿¼º üũ
	PGLCROW pCrow = m_pLandMan->GetCrow ( pNetMsg->dwNPCID );
	if ( !pCrow )						return E_FAIL;
	

	float fDist = D3DXVec3Length ( &D3DXVECTOR3(m_vPos-pCrow->GetPosition()) );
	float fTalkRange = (float) (pCrow->GetBodyRadius() + GETBODYRADIUS() + 30);
	float fTalkableDis = fTalkRange + 20;

	if ( fDist>fTalkableDis )			return E_FAIL;
	

	if ( !pCrowData )
	{
		//	»óÀÎ NPC°¡ Á¸Á¦ÇÏÁö ¾Ê½À´Ï´Ù.
		return E_FAIL;
	}

	if ( !pCrowData->m_sNpcTalkDlg.IsMARKET() )
	{
		//	»óÀÎÀÌ ¾Æ´Õ´Ï´Ù.
		return E_FAIL;
	}

	if ( !VALID_HOLD_ITEM() )
	{
		//	ÆÈ·Á°í ÇÏ´Â ¾ÆÀÌÅÆÀÌ ¾ø½À´Ï´Ù.
		return E_FAIL;
	}

	const SITEMCUSTOM& sHOLD_ITEM = GET_HOLD_ITEM();
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sHOLD_ITEM.sNativeID );
	if ( pItem==NULL )						return E_FAIL;

	// ÆÖ¾ÆÀ̵ð(DBÁ¢±Ù¿ë)
	DWORD dwPetID = sHOLD_ITEM.dwPetID;
	DWORD dwVehicleID = sHOLD_ITEM.dwVehicleID;

	//	°Å·¡¿É¼Ç
	if ( !pItem->sBasicOp.IsSALE() )
	{
		//	Æȱ⠰¡´ÉÇÏÁö ¾ÊÀ½.
		return E_FAIL;
	}

//  Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö ¾ÆÀÌÅÛ °è»ê °ø½ÄÀÌ Æ²·Á¼­ ¼öÁ¤ÇÔ 
/* 
	volatile float fSHOP_SALE_RATE = GET_PK_SHOP2SALE();
	if ( fSHOP_SALE_RATE==0.0f )			return E_FAIL;

	volatile LONGLONG llPRICE = LONGLONG( pItem->GETPRICE(sHOLD_ITEM.wTurnNum) * GLCONST_CHAR::fDISPRICE );

	volatile float fSHOP_SALE_2RATE = fSHOP_SALE_RATE - m_pLandMan->m_fCommissionRate;
	volatile float fSHOP_SALE_2RATE_C = (DOUBLE(fSHOP_SALE_2RATE) * 0.01f );
	volatile LONGLONG llDisPRICE2 = LONGLONG( llPRICE * fSHOP_SALE_2RATE_C );
*/

	volatile float fSHOP_SALE_RATE = GET_PK_SHOP2SALE();
	if ( fSHOP_SALE_RATE==0.0f )			return E_FAIL;
	
	volatile LONGLONG dwPrice = pItem->GETSELLPRICE ( sHOLD_ITEM.wTurnNum );  

	volatile float fSHOP_SALE_2RATE = fSHOP_SALE_RATE - m_pLandMan->m_fCommissionRate;
	volatile float fSHOP_SALE_2RATE_C = fSHOP_SALE_2RATE * 0.01f;

	volatile LONGLONG llDisPRICE2 = LONGLONG( dwPrice * fSHOP_SALE_2RATE_C );


	if ( pCrow->m_bNpcRecall )
	{
		volatile float fSHOP_RATE_C = fSHOP_SALE_RATE * 0.01f;
		volatile LONGLONG llDisPRICE1 = LONGLONG ( dwPrice * fSHOP_RATE_C );
		volatile LONGLONG llCommission = llDisPRICE1-llDisPRICE2;

		llCommission = LONGLONG ( llCommission * GLCONST_CHAR::fEARNING_RATE_NPC + 0.1f );

		pCrow->m_lnCommission += llCommission;
	}
	else if ( m_pLandMan->m_dwGuidClubID != CLUB_NULL )
	{
		GLGuidance *pGuid = m_pLandMan->m_pGuidance;
		if ( pGuid && !pGuid->m_bBattle )
		{
			//	Note : Ŭ·´ÀÇ ¼öÀÍ ¹ß»ý.
			volatile float fSHOP_RATE_C = fSHOP_SALE_RATE * 0.01f;
			volatile LONGLONG llDisPRICE1 = LONGLONG ( dwPrice * fSHOP_RATE_C );
			volatile LONGLONG llCommission = llDisPRICE1-llDisPRICE2;
		
			GLClubMan &cClubMan = GLGaeaServer::GetInstance().GetClubMan();
			GLCLUB *pCLUB = cClubMan.GetClub ( m_pLandMan->m_dwGuidClubID );
			if ( pCLUB )
			{
				pCLUB->m_lnIncomeMoney += llCommission;

				// Ŭ·´ ¼öÀÔÀÌ 1¾ï ÀÌ»óÀÏ °æ¿ì ·Î±×¸¦ ³²±ä´Ù.
				if( llCommission > 	EMCLUBINCOMEMONEY_LOG )
					GLITEMLMT::GetInstance().ReqMoneyExc(	ID_CHAR, m_dwCharID, 
															ID_CLUB, pCLUB->m_dwID,
															llCommission,
															EMITEM_ROUTE_CLUBINCOME );

				CDebugSet::ToFile ( "club_income_char.txt", "{SaleToNpc}, ClubID[%u], CharID[%u], Commission[%I64d], IncomeMoney[%I64d]",
									pCLUB->m_dwID, m_dwCharID, llCommission, pCLUB->m_lnIncomeMoney );
			}
		}
	}

	//	±Ý¾× º¯È­.
	CheckMoneyUpdate( m_lnMoney, llDisPRICE2, TRUE, "Sale To Npc." );
	m_bMoneyUpdate = TRUE;

	if ( pItem->sBasicOp.IsPointRecover() )
	{//add and modified for //add point sell
		if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM )
		{
			m_lnVoteP += dwPrice;

			if ( dwPrice>EMMONEY_LOG_PREMIUM )
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, 0, ID_CHAR, m_dwCharID, dwPrice, EMITEM_ROUTE_CHAR_VOTE );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnVoteP, EMITEM_ROUTE_CHAR_VOTE );
			}

			GLITEMLMT::GetInstance().ReqItemRoute ( sHOLD_ITEM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_SHOP_VOTE, sHOLD_ITEM.wTurnNum );

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_VOTE_SELL.txt", "%s	SELL VOTE ITEM [CharID: %d][CharName:%s][Item Price:%I64d][Money After:%I64d][ITEM MID:%d SID:%d][Number: %d] ",
			strTIME.c_str(), m_dwCharID, m_szName, dwPrice, m_lnVoteP, pItem->sBasicOp.sNativeID.wMainID, pItem->sBasicOp.sNativeID.wSubID,sHOLD_ITEM.wTurnNum );
		}

		else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM )
		{
			m_lnPremP += dwPrice;

			if ( dwPrice>EMMONEY_LOG_PREMIUM )
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, 0, ID_CHAR, m_dwCharID, dwPrice, EMITEM_ROUTE_CHAR_PREMIUM );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnPremP, EMITEM_ROUTE_CHAR_PREMIUM );
			}

			GLITEMLMT::GetInstance().ReqItemRoute ( sHOLD_ITEM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_SHOP_PREMIUM, sHOLD_ITEM.wTurnNum );

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_PREMIUM_SELL.txt", "%s	SELL PREMIUM ITEM [CharID: %d][CharName:%s][Item Price:%I64d][Money After:%I64d][ITEM MID:%d SID:%d][Number: %d] ",
			strTIME.c_str(), m_dwCharID, m_szName, dwPrice, m_lnPremP, pItem->sBasicOp.sNativeID.wMainID, pItem->sBasicOp.sNativeID.wSubID,sHOLD_ITEM.wTurnNum );
		}
		//add contributionpoint by CNDev
		else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
		{
			m_lnContribP += dwPrice;

			if ( dwPrice>EMMONEY_LOG_CONTRIBUTION )
			{
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, 0, ID_CHAR, m_dwCharID, dwPrice, EMITEM_ROUTE_CHAR_CONTRIBUTION );
				GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnContribP, EMITEM_ROUTE_CHAR_CONTRIBUTION );
			}

			GLITEMLMT::GetInstance().ReqItemRoute ( sHOLD_ITEM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_SHOP_CONTRIBUTION, sHOLD_ITEM.wTurnNum );

			std::string strTIME = CDebugSet::GetCurTime ();
			CDebugSet::ToFile ( "ITEM_CONTRIBUTION_SELL.txt", "%s	SELL CONTRIBUTION ITEM [CharID: %d][CharName:%s][Item Price:%I64d][Money After:%I64d][ITEM MID:%d SID:%d][Number: %d] ",
			strTIME.c_str(), m_dwCharID, m_szName, dwPrice, m_lnContribP, pItem->sBasicOp.sNativeID.wMainID, pItem->sBasicOp.sNativeID.wSubID,sHOLD_ITEM.wTurnNum );
		}

	}
	else
	{
		m_lnMoney += llDisPRICE2;

		//	µ· ·Î±×.
		if ( llDisPRICE2>EMMONEY_LOG )
		{
			GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, 0, ID_CHAR, m_dwCharID, llDisPRICE2, EMITEM_ROUTE_CHAR );
			GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
		}

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( sHOLD_ITEM, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_SHOP, sHOLD_ITEM.wTurnNum );
	}

//#if defined(_RELEASED) || defined(TW_PARAM) || defined(TH_PARAM) || defined(HK_PARAM) // ***Tracing Log print
	if ( m_bTracingUser )
	{
		NET_LOG_UPDATE_TRACINGCHAR TracingMsg;
		TracingMsg.nUserNum  = GetUserID();
		StringCchCopy( TracingMsg.szAccount, USR_ID_LENGTH+1, m_szUID );

		CString strTemp;
		strTemp.Format( "Sale To Npc, [%s][%s], Sale price:[%I64d], Have Money:[%I64d]",
				 m_szUID, m_szName,  llDisPRICE2, m_lnMoney );

		StringCchCopy( TracingMsg.szLogMsg, TRACING_LOG_SIZE, strTemp.GetString() );

		m_pGLGaeaServer->SENDTOAGENT( m_dwClientID, &TracingMsg );
	}
//#endif

	//	¾ÆÀÌÅÆ »èÁ¦.
	RELEASE_HOLD_ITEM();

	//	±Ý¾× º¯È­ ¸Þ½ÃÁö.
	GLMSG::SNETPC_UPDATE_MONEY NetMsgMoney;
	NetMsgMoney.lnMoney = m_lnMoney;
	//add money 2
	NetMsgMoney.lnVoteP = m_lnVoteP;
	//add money 3
	NetMsgMoney.lnPremP = m_lnPremP;
	//add contributionpoints by CNDev
	NetMsgMoney.lnContribP = m_lnContribP;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgMoney);

	//	[Àڽſ¡°Ô] ¼Õ¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_PUTON_RELEASE NetMsg_PutOn_Release(SLOT_HOLD);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn_Release);

	// ÆÖÄ«µåÀÏ °æ¿ì ¾ÆÀÌÅÛÀ» »óÁ¡¿¡ Æȸé ÆÖDB »èÁ¦
	if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD && dwPetID != 0 )
	{
		// ÆÖÀ» »ç¶óÁö°Ô ÇØÁØ´Ù.
		GLGaeaServer::GetInstance().ReserveDropOutPet ( SDROPOUTPETINFO(m_dwPetGUID,true,false) );

		CDeletePet* pDbAction = new CDeletePet ( m_dwCharID, dwPetID );
		GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
		if ( pDBMan ) pDBMan->AddJob ( pDbAction );

		// ÆÖÀÌ »èÁ¦µÇ¸é ºÎÈ°Á¤º¸¸¦ Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë·ÁÁÜ.
		CGetRestorePetList *pDbAction1 = new CGetRestorePetList ( m_dwCharID, m_dwClientID );
		if ( pDBMan ) pDBMan->AddJob ( pDbAction1 );
	}

	if ( pItem->sBasicOp.emItemType == ITEM_VEHICLE && dwVehicleID != 0 )
	{
		CDeleteVehicle* pDbAction = new CDeleteVehicle ( m_dwClientID, m_dwCharID, dwVehicleID );
		GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
		if ( pDBMan ) pDBMan->AddJob ( pDbAction );		
	}

	return S_OK;
}


HRESULT GLChar::MsgReqFireCracker ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_FIRECRACKER_BRD *pNetMsg = (GLMSG::SNETPC_REQ_FIRECRACKER_BRD *) nmg;

	GLMSG::SNETPC_REQ_FIRECRACKER_FB NetMsgFB;

	if ( !VALID_HOLD_ITEM () )
	{
		NetMsgFB.emFB = EMREQ_FIRECRACKER_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	if ( m_sTrade.Valid() )
	{
		NetMsgFB.emFB = EMREQ_FIRECRACKER_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	SITEM* pITEM = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pITEM )
	{
		NetMsgFB.emFB = EMREQ_FIRECRACKER_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pITEM->sBasicOp.sNativeID ) ) return E_FAIL;

	SITEMCUSTOM &sCUSTOM = m_PutOnItems[SLOT_HOLD];

	if ( pITEM->sBasicOp.emItemType!=ITEM_FIRECRACKER )
	{
		NetMsgFB.emFB = EMREQ_FIRECRACKER_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	if ( pITEM->sBasicOp.strTargetEffect.empty() )
	{
		NetMsgFB.emFB = EMREQ_FIRECRACKER_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	Note : ÆøÁ× »ç¿ë.
	//
	GLMSG::SNETPC_REQ_FIRECRACKER_BRD NetMsgBrd;
	NetMsgBrd.nidITEM = sCUSTOM.sNativeID;
	NetMsgBrd.vPOS = pNetMsg->vPOS;
	SNDMSGAROUND ( (NET_MSG_GENERIC*) &NetMsgBrd );

	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgBrd);

	//	Note : ÆøÁ× »ç¿ëÀ» ¾Ë¸².
	//
	NetMsgFB.emFB = EMREQ_FIRECRACKER_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	//	Note : ¾ÆÀÌÅÛ ¼Ò¸ð.
	//
	DoDrugSlotItem (SLOT_HOLD );

	return S_OK;
}

HRESULT GLChar::MsgInvenVietnamGet ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;
//	if( m_dwVietnamGainType == GAINTYPE_EMPTY ) return E_FAIL;
//	if( m_dwVietnamGainType == GAINTYPE_HALF ) return E_FAIL;

	GLMSG::SNETPC_INVEN_VIETNAM_INVENGET *pNetMsg = (GLMSG::SNETPC_INVEN_VIETNAM_INVENGET *) nmg;


	SINVENITEM* pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )	return E_FAIL;

	if ( CheckCoolTime( pInvenItem->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sDrugOp.wCureVolume == 0 )	return E_FAIL;

    if( pNetMsg->bGetExp )
	{
		// È®·ü 
		if ( pItem->sDrugOp.bRatio ) 
		{
			LONGLONG lAddExp;
			LONGLONG lAddMoney;

			float fRate = (float)pItem->sDrugOp.wCureVolume / 100.0f;

			lAddExp = m_lVNGainSysExp * fRate;
			lAddMoney = m_lVNGainSysMoney * fRate;

			if ( lAddExp > m_lVNGainSysExp ) lAddExp = m_lVNGainSysExp;
			if ( lAddMoney > m_lVNGainSysMoney ) lAddMoney = m_lVNGainSysMoney;

			m_lVNGainSysExp -= lAddExp;
			m_lVNGainSysMoney -= lAddMoney;

			m_sExperience.lnNow += lAddExp;
			m_lnMoney			+= lAddMoney;

			m_bVietnamLevelUp = TRUE; 
		}
		else 
		{
			LONGLONG lAddExp;
			if( m_lVNGainSysExp < pItem->sDrugOp.wCureVolume )
			{
				lAddExp = m_lVNGainSysExp;
				m_lVNGainSysExp = 0;
			}else{
				lAddExp = pItem->sDrugOp.wCureVolume;
				m_lVNGainSysExp -= pItem->sDrugOp.wCureVolume;
			}
			m_sExperience.lnNow += lAddExp;
			m_lnMoney			+= m_lVNGainSysMoney;

			m_lVNGainSysMoney = 0;
			m_bVietnamLevelUp = TRUE; 
		}

		DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

		GLMSG::SNETPC_INVEN_VIETNAM_EXPGET_FB NetMsgFB;
		NetMsgFB.lnVnMoney = m_lVNGainSysMoney;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

		//	Note : Ŭ¶óÀ̾ðÆ®¿¡ µ· ¾×¼ö º¯È­¸¦ ¾Ë·ÁÁÜ.
		GLMSG::SNETPC_UPDATE_MONEY NetMsg;
		NetMsg.lnMoney = m_lnMoney;
		//add money 2
		NetMsg.lnVoteP = m_lnVoteP;
		//add money 3
		NetMsg.lnPremP = m_lnPremP;
		//add contributionpoints by CNDev
		NetMsg.lnContribP = m_lnContribP;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

		//	Note : ±Ý¾× ·Î±×.
		//
		/*if ( lnAmount>EMMONEY_LOG )
		{
			GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, 0, ID_CHAR, m_dwCharID, lnAmount, EMITEM_ROUTE_VNINVEN );
			GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
		}*/
	}else{
		m_dwVietnamInvenCount += pItem->sDrugOp.wCureVolume;
		DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );
		GLMSG::SNETPC_INVEN_VIETNAM_ITEMGET_FB NetMsgFB;
		NetMsgFB.dwVietnamInvenCount = m_dwVietnamInvenCount;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	}

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.


	return S_OK;
}

HRESULT GLChar::MsgReqInvenDrug ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNETPC_REQ_INVENDRUG *pNetMsg = (GLMSG::SNETPC_REQ_INVENDRUG *) nmg;

	SINVENITEM* pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )	return E_FAIL;

	if ( CheckCoolTime( pInvenItem->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sDrugOp.emDrug==ITEM_DRUG_NUNE )	return E_FAIL;

	if ( m_bAntiPot )
	{
		GLMSG::SNET_ITEM_CANNOT_POT NetMsg;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

		return E_FAIL;
	}

	if ( m_sCONFTING.IsFIGHTING() )
	{
		if ( !m_sCONFTING.IsRECOVE() )
		{
			//	Note : ȸº¹¾à »ç¿ë °¡´É °¹¼ö Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë¸².
			//
			GLMSG::SNETPC_CONFRONT_RECOVE NetMsg;
			NetMsg.wRECOVER = m_sCONFTING.wRECOVER;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

			return E_FAIL;
		}

		if ( m_sCONFTING.sOption.wRECOVER!=USHRT_MAX )
		{
			m_sCONFTING.COUNTRECOVE();

			//	Note : ȸº¹¾à »ç¿ë °¡´É °¹¼ö Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë¸².
			//
			GLMSG::SNETPC_CONFRONT_RECOVE NetMsg;
			NetMsg.wRECOVER = m_sCONFTING.wRECOVER;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);
		}
	}

	//	Note : pk µî±ÞÀÌ »ìÀθ¶ µî±Þ ÀÌ»óÀÏ °æ¿ì ȸº¹¾àÀÇ »ç¿ëÀ» ¸·´Â´Ù.
	//
	DWORD dwPK_LEVEL = GET_PK_LEVEL();
	if ( dwPK_LEVEL != UINT_MAX && dwPK_LEVEL>GLCONST_CHAR::dwPK_DRUG_ENABLE_LEVEL )
	{
		return E_FAIL;
	}

	switch ( pItem->sDrugOp.emDrug )
	{
	case ITEM_DRUG_HP:
		if ( m_sHP.dwNow == m_sHP.dwMax ) return E_FAIL;
		m_sHP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		break;

	case ITEM_DRUG_MP:
		if ( m_sMP.dwNow == m_sMP.dwMax ) return E_FAIL;
		m_sMP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		break;

	case ITEM_DRUG_SP:
		if ( m_sSP.dwNow == m_sSP.dwMax ) return E_FAIL;
		m_sSP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		break;

	case ITEM_DRUG_HP_MP:
		if ( m_sHP.dwNow == m_sHP.dwMax && m_sMP.dwNow == m_sMP.dwMax ) return E_FAIL;
		m_sHP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		m_sMP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		break;

	case ITEM_DRUG_MP_SP:
		if ( m_sMP.dwNow == m_sMP.dwMax && m_sSP.dwNow == m_sSP.dwMax ) return E_FAIL;
		m_sMP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		m_sSP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		break;

	case ITEM_DRUG_HP_MP_SP:
		if ( m_sHP.dwNow == m_sHP.dwMax && m_sMP.dwNow == m_sMP.dwMax && m_sSP.dwNow == m_sSP.dwMax ) return E_FAIL;
		m_sHP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		m_sMP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		m_sSP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
		break;

	case ITEM_DRUG_CP:
		if ( m_sCP.dwNow == m_sCP.dwMax ) return E_FAIL;
		m_sCP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio ); //add cp
		break;

	//case ITEM_DRUG_HP:
	//case ITEM_DRUG_MP:
	//case ITEM_DRUG_SP:
	//case ITEM_DRUG_HP_MP:
	//case ITEM_DRUG_MP_SP:
	//case ITEM_DRUG_HP_MP_SP:
	//	RECEIVE_DRUGFACT(pItem->sDrugOp.emDrug,pItem->sDrugOp.wCureVolume,pItem->sDrugOp.bRatio);
	//	break;

	case ITEM_DRUG_CURE:
	case ITEM_DRUG_HP_CURE:
	case ITEM_DRUG_HP_MP_SP_CURE:
		{
			BOOL bSTATEBLOW = ISSTATEBLOW();

			if( pItem->sDrugOp.emDrug == ITEM_DRUG_HP_CURE )
			{
				if ( m_sHP.dwNow == m_sHP.dwMax && !bSTATEBLOW ) return E_FAIL;
				m_sHP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
				bSTATEBLOW = TRUE;
			}

			if( pItem->sDrugOp.emDrug == ITEM_DRUG_HP_MP_SP_CURE )
			{
				if ( m_sHP.dwNow == m_sHP.dwMax && m_sMP.dwNow == m_sMP.dwMax 
					&& m_sSP.dwNow == m_sSP.dwMax && !bSTATEBLOW ) return E_FAIL;
				m_sHP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
				m_sMP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
				m_sSP.INCREASE ( pItem->sDrugOp.wCureVolume, pItem->sDrugOp.bRatio );
				bSTATEBLOW = TRUE;
			}

			if ( !bSTATEBLOW ) return E_FAIL;

			GLMSG::SNETPC_CURESTATEBLOW_BRD	NetMsgBrd;
			for ( int i=0; i<EMBLOW_MULTI; ++i )
			{
				if ( m_sSTATEBLOWS[i].emBLOW==EMBLOW_NONE )		continue;

				EMDISORDER emDIS = STATE_TO_DISORDER(m_sSTATEBLOWS[i].emBLOW);
				if ( !(pItem->sDrugOp.dwCureDISORDER&emDIS) )	continue;

				//	»óÅÂÀÌ»ó Áö¼Ó½Ã°£À» Á¾·á½ÃÅ´.
				m_sSTATEBLOWS[i].fAGE = 0.0f;
			}

			//	»óÅÂÀÌ»ó Ä¡·áµÊÀ» Àڽſ¡°Ô ¾Ë¸².
			NetMsgBrd.emCrow = CROW_PC;
			NetMsgBrd.dwID = m_dwGaeaID;
			NetMsgBrd.dwCUREFLAG = pItem->sDrugOp.dwCureDISORDER;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgBrd);

			//	»óÅÂÀÌ»ó Ä¡·áµÊÀ» ¸ðµÎ¿¡°Ô ¾Ë¸².
			SNDMSGAROUND ( (NET_MSG_GENERIC*)&NetMsgBrd );
		}
		break;

	};


	//	Note : ¾ÆÀÌÅÛ ¼Ò¸ð.
	//
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	Note : ü·Â ¼öÄ¡ º¯È­¸¦ [ÀÚ½Å,ÆÄƼ¿ø,ÁÖÀ§]ÀÇ Å¬¶óÀ̾ðÆ®µé¿¡ ¾Ë¸².
	MsgSendUpdateState ();

	return S_OK;
}

HRESULT GLChar::MsgGetPoints ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;
	GLMSG::SNETPC_RETRIEVE_POINTS_FB *pNetMsg = (GLMSG::SNETPC_RETRIEVE_POINTS_FB *) nmg;
	
	GLMSG::SNETPC_RETRIEVE_POINTS_FB pNetMsgFB;
	pNetMsgFB.emFB = pNetMsg->emFB;
	pNetMsgFB.PPoints = pNetMsg->PPoints;
	pNetMsgFB.VPoints = pNetMsg->VPoints;
	//CONSOLEMSG_WRITE ( " send MsgGetPoints ");
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&pNetMsgFB);
	return S_OK;
}
HRESULT GLChar::MsgRetrievePoints ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;
	GLMSG::SNETPC_RETRIEVE_POINTS *pNetMsg = (GLMSG::SNETPC_RETRIEVE_POINTS *) nmg;
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CGetPoints* pDbAction = new CGetPoints ( m_dwCharID, m_dwUserID , m_dwClientID );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
		//if ( pDbAction ) CONSOLEMSG_WRITE ( " send MsgRetrievePoints ");
	}

	return S_OK;
}

HRESULT GLChar::MsgReqInvenItemShopInfo ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;
	GLMSG::SNET_GET_ITEMSHOP_FROMDB* pNetMsg = (GLMSG::SNET_GET_ITEMSHOP_FROMDB*) nmg;

	CString strUID = m_szUID;
    std::vector<ITEMSHOP> vItem;

	// DB¿¡¼­ ºô¸µ¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿À±â

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CGetItemShop* pDbAction = new CGetItemShop (m_dwCharID);
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
		//if ( pDbAction ) CONSOLEMSG_WRITE ( " send MsgReqInvenItemShopInfo ");
	}
		
	return S_OK;
}


HRESULT GLChar::MsgBuyItemShop ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;
	GLMSG::SNET_ITEMSHOP_ITEM_BUY *pNetMsg = (GLMSG::SNET_ITEMSHOP_ITEM_BUY *) nmg;
	GLMSG::SNET_ITEMSHOP_ITEM_BUY NetMsg;
	NetMsg.bBuy = pNetMsg->bBuy;
	NetMsg.dwUserID = pNetMsg->dwUserID;
	//CONSOLEMSG_WRITE ( " send ");
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

	return S_OK;
}

HRESULT GLChar::MsgReqInvenItemShop ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNET_ITEMSHOP_BUY *pNetMsg = (GLMSG::SNET_ITEMSHOP_BUY *) nmg;
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CItemShop_Get *pDbAction = new CItemShop_Get( m_dwClientID, m_dwUserID, pNetMsg->szPurKey );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
		//if ( pDbAction ) CONSOLEMSG_WRITE ( " send MsgReqInvenItemShop ");
	}
	
	return S_OK;
}

HRESULT GLChar::MsgReqInvenBoxInfo ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_GET_CHARGEDITEM_FROMDB* pNetMsg = (GLMSG::SNET_GET_CHARGEDITEM_FROMDB*) nmg;

	CString strUID = m_szUID;
    std::vector<SHOPPURCHASE> vItem;

	// DB¿¡¼­ ºô¸µ¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿À±â

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CGetPurchaseItem* pDbAction = new CGetPurchaseItem ( strUID, m_dwCharID );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
	}
		
	return S_OK;
}

HRESULT GLChar::MsgReqInvenBoxOpen ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNET_INVEN_BOXOPEN *pNetMsg = (GLMSG::SNET_INVEN_BOXOPEN *) nmg;

	GLMSG::SNET_INVEN_BOXOPEN_FB NetMsgFB;

	WORD wPosX = pNetMsg->wPosX;
	WORD wPosY = pNetMsg->wPosY;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		NetMsgFB.emFB = EMREQ_BOXOPEN_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_BOX )
	{
		NetMsgFB.emFB = EMREQ_BOXOPEN_FB_NOBOX;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	if ( !pItem->sBox.VALID() )
	{
		NetMsgFB.emFB = EMREQ_BOXOPEN_FB_EMPTY;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	Note : Àκ¥ÀÇ ¿©À¯ °ø°£ ÃøÁ¤.
	//
	GLInventory cInvenTemp;
	cInvenTemp.Assign ( m_cInventory );

	for ( int i=0; i<ITEM::SBOX::ITEM_SIZE; ++i )
	{
		SITEMCUSTOM sCUSTOM;
		sCUSTOM.sNativeID = pItem->sBox.sITEMS[i].nidITEM;
		if ( sCUSTOM.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sCUSTOM.sNativeID );
		if ( !pITEM )
		{
			NetMsgFB.emFB = EMREQ_BOXOPEN_FB_INVALIDITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}

		BOOL bOK = cInvenTemp.InsertItem ( sCUSTOM );
		if ( !bOK )
		{
			//	Note : Àκ¥¿¡ °ø°£ÀÌ ¾ø´Â °ÍÀ¸·Î ÆǴܵÊ.
			//
			NetMsgFB.emFB = EMREQ_BOXOPEN_FB_NOTINVEN;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}
	}

	//	Note : »óÀھȿ¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» ²¨³»¾î¼­ ³Ö´Â´Ù.
	//
	for ( int i=0; i<ITEM::SBOX::ITEM_SIZE; ++i )
	{
		SITEMCUSTOM sITEM_NEW;
		sITEM_NEW.sNativeID = pItem->sBox.sITEMS[i].nidITEM;
		DWORD dwAMOUNT = pItem->sBox.sITEMS[i].dwAMOUNT;
		if ( sITEM_NEW.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sITEM_NEW.sNativeID );
		if ( !pITEM )											return E_FAIL;

		//	Note : ¾ÆÀÌÅÛ »ý¼º.
		//
		CTime cTIME = CTime::GetCurrentTime();
		sITEM_NEW.tBORNTIME = cTIME.GetTime();

		sITEM_NEW.wTurnNum = (WORD) dwAMOUNT;
		sITEM_NEW.cGenType = pInvenItem->sItemCustom.cGenType;
		sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
		sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
		sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

		// ¾ÆÀÌÅÛ ¿¡µðÆ®¿¡¼­ ÀÔ·ÂÇÑ °³Á¶ µî±Þ Àû¿ë ( ÁØÇõ )
		sITEM_NEW.cDAMAGE = (BYTE)pITEM->sBasicOp.wGradeAttack;
		sITEM_NEW.cDEFENSE = (BYTE)pITEM->sBasicOp.wGradeDefense;

		//	·£´ý ¿É¼Ç »ý¼º.
		if( sITEM_NEW.GENERATE_RANDOM_OPT() )
		{
			GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
		}

		//	Note : Àκ¥¿¡ ³ÖÀ» À§Ä¡ ãÀ½.
		WORD wInsertPosX, wInsertPosY;
		BOOL bOk = m_cInventory.FindInsrtable ( pITEM->sBasicOp.wInvenSizeX, pITEM->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
		if ( !bOk )		return S_OK;	//	Àκ¥ °ø°£ ºÎÁ·À¸·Î µÇµ¹¸² ½ÇÆÐ.

		//	»ý¼ºÇÑ ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
		m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
		SINVENITEM *pInsertItem = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

		GLITEMLMT::GetInstance().ReqItemRoute ( pInsertItem->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pInsertItem->sItemCustom.wTurnNum );

		//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.Data = *pInsertItem;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);
	}

	//	»óÀÚ »èÁ¦ ·Î±×.
	GLITEMLMT::GetInstance().ReqItemRoute ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, pInvenItem->sItemCustom.wTurnNum );

	//	Note : »óÀÚ ¾ÆÀÌÅÛ »èÁ¦.
	//
	m_cInventory.DeleteItem ( wPosX, wPosY );

	//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
	NetMsg_Inven_Delete.wPosX = wPosX;
	NetMsg_Inven_Delete.wPosY = wPosY;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Delete);

	//	Note : »óÀÚ¸¦ ¼º°øÀûÀ¸·Î ¿­¾úÀ½.
	//
	NetMsgFB.emFB = EMREQ_BOXOPEN_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	return S_OK;
}


HRESULT GLChar::MsgReqInvenGMItem ( NET_MSG_GENERIC* nmg ) //add itemcmd
{
	if ( !IsValidBody() )	return E_FAIL;

	if ( m_dwUserLvl < USER_MASTER ) return E_FAIL;

	GLMSG::SNET_INVEN_GMITEM *pNetMsg = (GLMSG::SNET_INVEN_GMITEM *) nmg;

	GLMSG::SNET_INVEN_GMITEM_FB NetMsgFB;

	if ( pNetMsg->wPass != GLCONST_CHAR::wGMItemPass )
	{
		NetMsgFB.emFB = EMREQ_GMITEM_FB_PASS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pNetMsg->sItemID );
	if ( !pItem  )
	{
		NetMsgFB.emFB = EMREQ_GMITEM_FB_NOTITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	if ( pNetMsg->wNum >= GLCONST_CHAR::wGMItemMax )
	{
		NetMsgFB.emFB = EMREQ_GMITEM_FB_MAX;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	GLInventory cInvenTemp;
	cInvenTemp.Assign ( m_cInventory );

	WORD	wNum =  pNetMsg->wNum;
	for ( int i=0; i<wNum; ++i )
	{
		SITEMCUSTOM sCUSTOM;
		sCUSTOM.sNativeID = pItem->sBasicOp.sNativeID;

		if ( sCUSTOM.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sCUSTOM.sNativeID );
		if ( !pITEM )
		{
			NetMsgFB.emFB = EMREQ_GMITEM_FB_FAIL;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}

		BOOL bOK = cInvenTemp.InsertItem ( sCUSTOM );
		if ( !bOK )
		{
			NetMsgFB.emFB = EMREQ_GMITEM_FB_INFAIL;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}
	}

	for ( int i=0; i<wNum; ++i )
	{
		SITEMCUSTOM sITEM_NEW;
		sITEM_NEW.sNativeID = pItem->sBasicOp.sNativeID;
		//DWORD dwAMOUNT = pItem->sBox.sITEMS[i].dwAMOUNT;
		if ( sITEM_NEW.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sITEM_NEW.sNativeID );
		if ( !pITEM )											return E_FAIL;

		CTime cTIME = CTime::GetCurrentTime();
		sITEM_NEW.tBORNTIME = cTIME.GetTime();

		//sITEM_NEW.wTurnNum = (WORD) 1;
		sITEM_NEW.cGenType = EMGEN_SYSTEM;
		sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
		sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
		sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

		sITEM_NEW.cDAMAGE = (BYTE)0; //item is +9
		sITEM_NEW.cDEFENSE = (BYTE)0;//item is +9

		//sITEM_NEW.dwOwnerID = m_dwCharID; //item have owner id of the one who request

		if( sITEM_NEW.GENERATE_RANDOM_OPT() )
		{
			GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
		}

		WORD wInsertPosX, wInsertPosY;
		BOOL bOk = m_cInventory.FindInsrtable ( pITEM->sBasicOp.wInvenSizeX, pITEM->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
		if ( !bOk )		return S_OK;	

		m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
		SINVENITEM *pInsertItem = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

		GLITEMLMT::GetInstance().ReqItemRoute ( pInsertItem->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pInsertItem->sItemCustom.wTurnNum );

		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.Data = *pInsertItem;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);
	}

	NetMsgFB.emFB = EMREQ_GMITEM_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	return S_OK;
}
HRESULT GLChar::MsgReqInvenRandomBoxOpen ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNET_INVEN_RANDOMBOXOPEN *pNetMsg = (GLMSG::SNET_INVEN_RANDOMBOXOPEN *) nmg;

	GLMSG::SNET_INVEN_RANDOMBOXOPEN_FB NetMsgFB;

	WORD wPosX = pNetMsg->wPosX;
	WORD wPosY = pNetMsg->wPosY;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		NetMsgFB.emFB = EMINVEN_RANDOMBOXOPEN_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_RANDOMITEM )
	{
		NetMsgFB.emFB = EMINVEN_RANDOMBOXOPEN_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	if ( !pItem->sRandomBox.VALID() )
	{
		NetMsgFB.emFB = EMINVEN_RANDOMBOXOPEN_FB_EMPTY;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	float fNowRate = seqrandom::getpercent();

	float fLOW = 0;
	ITEM::SRANDOMITEM sGENITEM;
	sGENITEM.nidITEM = SNATIVEID(false);
	for ( DWORD i=0; i<pItem->sRandomBox.vecBOX.size(); ++i )
	{
		ITEM::SRANDOMITEM sITEM = pItem->sRandomBox.vecBOX[i];

		if ( fLOW <= fNowRate && fNowRate < (fLOW+sITEM.fRATE) )
		{
			sGENITEM = sITEM;
			break;
		}

		fLOW += sITEM.fRATE;
	}

	if ( sGENITEM.nidITEM == SNATIVEID(false) )
	{
		//	»óÀÚ ¾ÆÀÌÅÛ »èÁ¦ ·Î±× ³²±è.
		GLITEMLMT::GetInstance().ReqItemRoute ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, pInvenItem->sItemCustom.wTurnNum );

		//	Note : »óÀÚ ¾ÆÀÌÅÛ »èÁ¦.
		//
		m_cInventory.DeleteItem ( wPosX, wPosY );

		//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ Á¦°Å.
		GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
		NetMsg_Inven_Delete.wPosX = wPosX;
		NetMsg_Inven_Delete.wPosY = wPosY;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Delete);

		//	Note : ó¸® °á°ú Àü¼Û.
		NetMsgFB.emFB = EMINVEN_RANDOMBOXOPEN_FB_MISS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	SITEM *pITEM_DATA = GLItemMan::GetInstance().GetItem ( sGENITEM.nidITEM );
	if ( !pITEM_DATA )
	{
		NetMsgFB.emFB = EMINVEN_RANDOMBOXOPEN_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	Note : ¾ÆÀÌÅÆ ¹ß»ý.
	//
	WORD wINSERTX(0), wINSERTY(0);
	BOOL bOK = m_cInventory.FindInsrtable ( pITEM_DATA->sBasicOp.wInvenSizeX, pITEM_DATA->sBasicOp.wInvenSizeY, wINSERTX, wINSERTY );
	if ( !bOK )
	{
		NetMsgFB.emFB = EMINVEN_RANDOMBOXOPEN_FB_NOINVEN;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	Note : ¾ÆÀÌÅÛ »ý¼º.
	//
	SITEMCUSTOM sITEM_NEW;
	sITEM_NEW.sNativeID = sGENITEM.nidITEM;

	CTime cTIME = CTime::GetCurrentTime();
	sITEM_NEW.tBORNTIME = cTIME.GetTime();

	sITEM_NEW.wTurnNum = pITEM_DATA->GETAPPLYNUM();
	sITEM_NEW.cGenType = pInvenItem->sItemCustom.cGenType;
	sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
	sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
	sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

	// ¾ÆÀÌÅÛ ¿¡µðÆ®¿¡¼­ ÀÔ·ÂÇÑ °³Á¶ µî±Þ Àû¿ë ( ÁØÇõ )
	sITEM_NEW.cDAMAGE = (BYTE)pITEM_DATA->sBasicOp.wGradeAttack;
	sITEM_NEW.cDEFENSE = (BYTE)pITEM_DATA->sBasicOp.wGradeDefense;

	//	·£´ý ¿É¼Ç »ý¼º.
	if( sITEM_NEW.GENERATE_RANDOM_OPT() )
	{
		GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
	}

	//	»ý¼ºÇÑ ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
	m_cInventory.InsertItem ( sITEM_NEW, wINSERTX, wINSERTY );
	SINVENITEM *pInsertItem = m_cInventory.GetItem ( wINSERTX, wINSERTY );

	if (!pInsertItem) return E_FAIL;


	//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
	GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
	NetMsg_Inven.Data = *pInsertItem;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);

	//	»óÀÚ ¾ÆÀÌÅÛ »èÁ¦ ·Î±× ³²±è.
	GLITEMLMT::GetInstance().ReqItemRoute ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, pInvenItem->sItemCustom.wTurnNum );

	//	·£´ý ¾ÆÀÌÅÛ »ý¼º ·Î±× ³²±è.
	GLITEMLMT::GetInstance().ReqItemRoute ( pInsertItem->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pInvenItem->sItemCustom.wTurnNum );

	//	Note : »óÀÚ ¾ÆÀÌÅÛ »èÁ¦.
	//
	m_cInventory.DeleteItem ( wPosX, wPosY );

	//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
	NetMsg_Inven_Delete.wPosX = wPosX;
	NetMsg_Inven_Delete.wPosY = wPosY;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Delete);

	//	Note : »óÀÚ¸¦ ¼º°øÀûÀ¸·Î ¿­¾úÀ½.
	//
	NetMsgFB.emFB = EMINVEN_RANDOMBOXOPEN_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	return S_OK;
}

HRESULT GLChar::MsgReqInvenDisJunction ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNET_INVEN_DISJUNCTION *pNetMsg = (GLMSG::SNET_INVEN_DISJUNCTION *) nmg;

	GLMSG::SNET_INVEN_DISJUNCTION_FB NetMsgFB;

	WORD wPosX = pNetMsg->wPosX;
	WORD wPosY = pNetMsg->wPosY;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )
	{
		NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) return E_FAIL;

	if ( pHold->sBasicOp.emItemType!=ITEM_DISJUNCTION )
	{
		NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	if ( pInvenItem->sItemCustom.nidDISGUISE==SNATIVEID(false) )
	{
		NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_NONEED;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	SITEMCUSTOM sITEM_NEW;
	sITEM_NEW.sNativeID = pInvenItem->sItemCustom.nidDISGUISE;
	if ( sITEM_NEW.sNativeID==SNATIVEID(false) )
	{
		NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	SITEM *pONE = GLItemMan::GetInstance().GetItem ( sITEM_NEW.sNativeID );
	if ( !pONE )
	{
		NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	CTime cTIME = CTime::GetCurrentTime();

	if ( pInvenItem->sItemCustom.tDISGUISE!=0 && pONE->sDrugOp.tTIME_LMT!= 0 )
	{
		cTIME = CTime(pInvenItem->sItemCustom.tDISGUISE);

		CTimeSpan tLMT(pONE->sDrugOp.tTIME_LMT);
		cTIME -= tLMT;
	}

	//	Note : ¾ÆÀÌÅÛ »ý¼º.
	//
	sITEM_NEW.tBORNTIME = cTIME.GetTime();

	sITEM_NEW.wTurnNum = 1;
	sITEM_NEW.cGenType = EMGEN_BILLING;
	sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
	sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
	sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

	//	Note : hold ¾ÆÀÌÅÛ Àκ¥¿¡ µÇµ¹¸².
	WORD wInsertPosX, wInsertPosY;
	BOOL bOk = m_cInventory.FindInsrtable ( pONE->sBasicOp.wInvenSizeX, pONE->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
	if ( !bOk )
	{
		NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_NOINVEN;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;	//	Àκ¥ °ø°£ ºÎÁ·À¸·Î µÇµ¹¸² ½ÇÆÐ.
	}

	//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
	m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
	SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

	//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
	GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
	NetMsg_Inven.Data = *pINSERT_ITEM;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);

	//	Note : ¸Á°¢ÀÇ ¼¼Å¹À» ÇÔ.
	//
	pInvenItem->sItemCustom.tDISGUISE = 0;
	pInvenItem->sItemCustom.nidDISGUISE = SNATIVEID(false);

	GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
	NetItemUpdate.wPosX = pNetMsg->wPosX;
	NetItemUpdate.wPosY = pNetMsg->wPosY;
	NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);

	//	Note : ºÐ¸®µÈ ÄÚ½ºÅù ·Î±×.
	GLITEMLMT::GetInstance().ReqItemRoute ( pINSERT_ITEM->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pINSERT_ITEM->sItemCustom.wTurnNum );

	//	Note : ÀÏ¹Ý º¹Àå ¾ÆÀÌÅÛÀÌ ¼¼Å¹ÇÏ´Â °ÍÀ» ·Î±× ³²±è.
	//
	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	//	Note : ¾ÆÀÌÅÛ ¼Ò¸ð.
	//
	DoDrugSlotItem ( SLOT_HOLD );

	NetMsgFB.emFB = EMINVEN_DISJUNCTION_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	return S_OK;
}


// *****************************************************
// Desc: ÄÚ½ºÆ¬ ÀÔÈû
// *****************************************************
HRESULT GLChar::MsgReqInvenDisguise ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNET_INVEN_DISGUISE *pNetMsg = (GLMSG::SNET_INVEN_DISGUISE *) nmg;

	GLMSG::SNET_INVEN_DISGUISE_FB NetMsgFB;

	WORD wPosX = pNetMsg->wPosX;
	WORD wPosY = pNetMsg->wPosY;

	// À¯È¿ÇÑ Àκ¥Å丮 ÀÎÁö °Ë»ç
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	// À¯È¿ÇÑ ¾ÆÀÌÅÛÀÎÁö °Ë»ç
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	// ¼Õ¿¡ µé°í ÀÖ´Â ¾ÆÀÌÅÛÀÌ À¯È¿ÇÑÁö °Ë»ç
	const SITEMCUSTOM& sITEM_HOLD = GET_SLOT_ITEM(SLOT_HOLD);
	if ( sITEM_HOLD.sNativeID==SNATIVEID(false) )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	// ¼Õ¿¡µç ¾ÆÀÌÅÛÀÇ Á¤º¸ °®°í ¿À±â
	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	// ¼Õ¿¡µç ¾ÆÀÌÅÛÀÌ ÄÚ½ºÆ¬ÀÎÁö °Ë»ç
	if ( !pHold->sBasicOp.IsDISGUISE() )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_NODISGUISE;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	// Àκ¥Å丮 ¾ÆÀÌÅÛÀÌ ¿¬¸¶°¡´ÉÇÑÁö °Ë»ç
	if ( pItem->sBasicOp.IsDISGUISE() )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	// °°Àº Ŭ·¡½º ÀÎÁö °Ë»ç
	if ( ( pHold->sBasicOp.dwReqCharClass & pItem->sBasicOp.dwReqCharClass ) == NULL )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_DEFSUIT;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	// º¹Àå·ùÀÎÁö °Ë»ç
	if ( pHold->sBasicOp.emItemType != ITEM_SUIT )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_NOTSUIT;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_NOTSUIT;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	// °°Àº Á¾·ùÀÇ º¹ÀåÀÎÁö °Ë»ç
	if ( pHold->sSuitOp.emSuit != pItem->sSuitOp.emSuit )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_DEFSUIT;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	// Àκ¥Å丮ÀÇ º¹ÀåÀÌ ÄÚ½ºÆ¬ÀÌ ÀÔÇôÁ® ÀÖ´ÂÁö °Ë»ç
	if ( pInvenItem->sItemCustom.nidDISGUISE!=SNATIVEID(false) )
	{
		NetMsgFB.emFB = EMREQ_DISGUISE_FB_ALREADY;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	//	Note : ½ÃÇÑ ÄÚ½ºÅùÀÏ °æ¿ì.
	//
	if ( pHold->sDrugOp.tTIME_LMT != 0 )
	{
		__time64_t &tTIME = pInvenItem->sItemCustom.tDISGUISE;

		CTime tCurTime = sITEM_HOLD.tBORNTIME;
		CTime tSeedTime(tTIME);
		CTimeSpan tLMT (pHold->sDrugOp.tTIME_LMT);
		tLMT += CTimeSpan(0,0,05,0);

		//	Note : ½Ã°£ ÃæÀü.
		tSeedTime = tCurTime + tLMT;

		tTIME = tSeedTime.GetTime();
	}

	//	Note : ÄÚ½ºÅù ½ºÅ² ÁöÁ¤.
	//
	pInvenItem->sItemCustom.nidDISGUISE = pHold->sBasicOp.sNativeID;

	GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
	NetItemUpdate.wPosX = pNetMsg->wPosX;
	NetItemUpdate.wPosY = pNetMsg->wPosY;
	NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);

	//	Note : ÀÏ¹Ý º¹Àå ¾ÆÀÌÅÛÀÌ ÄÚ½ºÅù ½ºÅ²À¸·Î º¯È¯µÇ´Â °ª ·Î±× ³²±è.
	//
	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
	//
	GLITEMLMT::GetInstance().ReqItemRoute ( GET_HOLD_ITEM(), ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, GET_HOLD_ITEM().wTurnNum );

	//	Note : ¼Õ¿¡µç ¾ÆÀÌÅÛ »èÁ¦.
	//
	RELEASE_SLOT_ITEM ( SLOT_HOLD );

	//	[Àڽſ¡°Ô] SLOT¿¡ ÀÖ¾ú´ø ¾ÆÀÌÅÆ Á¦°Å.
	GLMSG::SNETPC_PUTON_RELEASE NetMsg_PutOn_Release(SLOT_HOLD);
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_PutOn_Release);

	//	Note : ÄÚ½ºÅù ½ºÅ²À¸·Î º¯È¯ ¼º°ø ¾Ë¸².
	//
	NetMsgFB.emFB = EMREQ_DISGUISE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	return S_OK;
}

HRESULT GLChar::MsgReqInvenCleanser ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNET_INVEN_CLEANSER *pNetMsg = (GLMSG::SNET_INVEN_CLEANSER *) nmg;

	GLMSG::SNET_INVEN_CLEANSER_FB NetMsgFB;

	WORD wPosX = pNetMsg->wPosX;
	WORD wPosY = pNetMsg->wPosY;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		NetMsgFB.emFB = EMREQ_CLEANSER_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}	

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		NetMsgFB.emFB = EMREQ_CLEANSER_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )
	{
		NetMsgFB.emFB = EMREQ_CLEANSER_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) return E_FAIL;

	if ( pInvenItem->sItemCustom.nidDISGUISE==SNATIVEID(false) )
	{
		NetMsgFB.emFB = EMREQ_CLEANSER_FB_NONEED;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;
	}

	if ( pHold->sBasicOp.emItemType!=ITEM_CLEANSER )
	{
		NetMsgFB.emFB = EMREQ_CLEANSER_FB_NONEED;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_FALSE;	
	}

	//	Note : ¸Á°¢ÀÇ ¼¼Å¹À» ÇÔ.
	//
	pInvenItem->sItemCustom.tDISGUISE = 0;
	pInvenItem->sItemCustom.nidDISGUISE = SNATIVEID(false);

	GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
	NetItemUpdate.wPosX = pNetMsg->wPosX;
	NetItemUpdate.wPosY = pNetMsg->wPosY;
	NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);

	//	Note : ÀÏ¹Ý º¹Àå ¾ÆÀÌÅÛÀÌ ¼¼Å¹ÇÏ´Â °ÍÀ» ·Î±× ³²±è.
	//
	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	//	Note : ¾ÆÀÌÅÛ ¼Ò¸ð.
	//
	DoDrugSlotItem ( SLOT_HOLD );

	//	Note : ÄÚ½ºÅù ½ºÅ² ¸®¼Â º¯È¯ ¼º°ø ¾Ë¸².
	//
	NetMsgFB.emFB = EMREQ_CLEANSER_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	return S_OK;
}

HRESULT GLChar::MsgReqMoneyToField ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_REQ_MONEY_TO_FIELD *pNetMsg = (GLMSG::SNETPC_REQ_MONEY_TO_FIELD *)nmg;

	if ( !GLCONST_CHAR::bMONEY_DROP2FIELD )	return S_FALSE;
	if ( pNetMsg->lnMoney < 0 )				return S_FALSE;
	if ( m_lnMoney < pNetMsg->lnMoney )		return S_FALSE;

	D3DXVECTOR3 vCollisionPos;
	BOOL bCollision = m_pLandMan->IsCollisionNavi
	(
		pNetMsg->vPos + D3DXVECTOR3(0,+5,0),
		pNetMsg->vPos + D3DXVECTOR3(0,-5,0),
		vCollisionPos
	);

	if ( !bCollision )			return S_FALSE;

	//	Note : °¡Áö°í ÀÖ´Â µ·ÀÇ ¾×¼ö¸¦ Á¶Àý.
	CheckMoneyUpdate( m_lnMoney, pNetMsg->lnMoney, FALSE, "Drop Money." );
	m_bMoneyUpdate = TRUE;

	m_lnMoney -= pNetMsg->lnMoney;

	//	Note : ±Ý¾× ·Î±×.
	//
	if ( pNetMsg->lnMoney > EMMONEY_LOG )
	{
		GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, pNetMsg->lnMoney, EMITEM_ROUTE_GROUND );
		GLITEMLMT::GetInstance().ReqMoneyExc ( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
	}

#if defined(_RELEASED) || defined(TW_PARAM) || defined(TH_PARAM) || defined(HK_PARAM) // ***Tracing Log print
	if ( m_bTracingUser )
	{
		NET_LOG_UPDATE_TRACINGCHAR TracingMsg;
		TracingMsg.nUserNum  = GetUserID();
		StringCchCopy( TracingMsg.szAccount, USR_ID_LENGTH+1, m_szUID );

		CString strTemp;
		strTemp.Format( "DropMoney!!, [%s][%s], Drop Amount:[%I64d], Have Money:[%I64d]",
			m_szUID, m_szName,  pNetMsg->lnMoney, m_lnMoney );

		StringCchCopy( TracingMsg.szLogMsg, TRACING_LOG_SIZE, strTemp.GetString() );

		m_pGLGaeaServer->SENDTOAGENT( m_dwClientID, &TracingMsg );
	}
#endif

	//	Note : ¹Ù´Ú¿¡ ¶³¾îÆ®¸°´Ù.
	m_pLandMan->DropMoney ( vCollisionPos, pNetMsg->lnMoney, FALSE );

	//	Note : Ŭ¶óÀ̾ðÆ®¿¡ µ· ¾×¼ö º¯È­¸¦ ¾Ë·ÁÁÜ.
	GLMSG::SNETPC_UPDATE_MONEY NetMsg;
	NetMsg.lnMoney = m_lnMoney;
	//add money 2
	NetMsg.lnVoteP = m_lnVoteP;
	//add money 3
	NetMsg.lnPremP = m_lnPremP;
	//add contributionpoints by CNDev
	NetMsg.lnContribP = m_lnContribP;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);
	
	return S_OK;
}

// *****************************************************
// Desc: ¾ÆÀÌÅÛ ÀÎþƮ ¿äû ó¸®
// *****************************************************
HRESULT GLChar::MsgReqInvenGrinding ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_GRINDING *pNetMsg = (GLMSG::SNET_INVEN_GRINDING *)nmg;

	if ( !VALID_HOLD_ITEM() )							return S_FALSE;

	SITEMCUSTOM& sHOLDITEM = m_PutOnItems[SLOT_HOLD];
	SITEM* pHold = GLItemMan::GetInstance().GetItem ( sHOLDITEM.sNativeID );
	if ( !pHold )										return E_FAIL;

	if ( pHold->sBasicOp.emItemType != ITEM_GRINDING )			return S_FALSE;

	if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )									return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )										return S_FALSE;

	if ( pItem->sSuitOp.gdDamage == GLPADATA(0,0) )
	{
		if ( pHold->sGrindingOp.emCLASS != EMGRINDING_CLASS_CLOTH )	return S_FALSE;
	}
	else
	{
		if ( pHold->sGrindingOp.emCLASS != EMGRINDING_CLASS_ARM )	return S_FALSE;
	}

	BOOL bGrinding = pItem->sBasicOp.emItemType==ITEM_SUIT && pItem->sSuitOp.wReModelNum>0;
	if ( !bGrinding )									return E_FAIL;

	if ( pHold->sGrindingOp.emTYPE == EMGRINDING_DAMAGE || pHold->sGrindingOp.emTYPE == EMGRINDING_DEFENSE )
	{
		if ( pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE)>=GLCONST_CHAR::wGRADE_MAX )
		{
			return S_FALSE;
		}
	}
	else
	{
		if ( pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE)>=GLCONST_CHAR::wGRADE_MAX_REGI )
		{
			return S_FALSE;
		}
	}
	
	//	Note : ¿¬¸¶Á¦ µî±Þ, ³·Àº ¿¬¸¶Á¦·Î ³ôÀº ¿¬¸¶ ºÒ°¡´É
	//
	
	BYTE cGrade = 0;

	cGrade = pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE);

	if ( cGrade >= GRADE_HIGH && pHold->sGrindingOp.emGRINDER_TYPE != EMGRINDER_TOP )
	{
		return E_FAIL;
	}
	else if ( cGrade >=GRADE_NORMAL && pHold->sGrindingOp.emGRINDER_TYPE < EMGRINDER_HIGH )
	{
		return E_FAIL;
	}

	// ÃÖ»óÀ§ µî±Þ±îÁö ÀÎæƮ ÇÒ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö Á¡°Ë
	if ( cGrade >= GRADE_HIGH && pItem->sGrindingOp.emGRINDER_TYPE != EMGRINDER_TOP )
	{
		return S_FALSE;
	}


	//	Note : ¿¬¸¶Á¦ ¼ö·® È®ÀÎ
	WORD wGradeNum = 1;	
	
	if ( cGrade >= GRADE_HIGH )
	{
		wGradeNum = GLCONST_CHAR::wUSE_GRADE_NUM[cGrade-GRADE_HIGH];

		if ( wGradeNum > sHOLDITEM.wTurnNum )
		{
			return E_FAIL;
		}

	}

	//	Note : °í±Þ ¿¬¸¶Á¦ÀÏ °æ¿ì GRADE_NORMAL µî±Þ ¹Ì¸¸ ¿¬¸¶ ºÒ°¡´É.
	//
	//if ( pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE)<GRADE_NORMAL && pHold->sGrindingOp.bHIGH )
	//{
	//	return E_FAIL;
	//}

	//	Note : ¿¬¸¶ ¼öÇà.
	//
	bool bRESET(false), bTERMINATE(false);
	EMANTIDISAPPEAR emANTIDISAPPEAR(EMANTIDISAPPEAR_OFF);

	// ¼Ò¹æÁÖ°¡ ÀÖ´Ù¸é bANTIDISAPPEAR¸¦ 1·Î ¼ÂÆÃÇؼ­ ¾ÆÀÌÅÛÀÌ ¼Ò¸êµÇ´Â°ÍÀ» ¹æÁöÇÑ´Ù.
	SITEM* pITEM = GET_SLOT_ITEMDATA(SLOT_NECK);
	if ( pITEM && pITEM->sBasicOp.emItemType == ITEM_ANTI_DISAPPEAR )
	{
		if ( !IsCoolTime( pITEM->sBasicOp.sNativeID ) )	emANTIDISAPPEAR = EMANTIDISAPPEAR_ON;
	}

	bool bNoFail = pHold->sBasicOp.IsNoFail();//add nofailups

	BOOL bSucceeded = DOGRINDING ( pInvenItem->sItemCustom, pHold, bRESET, bTERMINATE, bNoFail, emANTIDISAPPEAR ); //add nofailups

	//	Note : ¼Ò¸ðµÈ ¿¬¸¶Á¦ ó¸®.
	//
	DoDrugSlotItem(SLOT_HOLD, wGradeNum);

	//	Note :	¼Ò¸ðµÈ ¼Ò¹æÁÖ Ã³¸®.
	//			bANTIDISAPPEAR°¡ false¸é ¼Ò¹æÁÖ°¡ »ç¿ëµÇ¾ú´Ù.
	if( emANTIDISAPPEAR == EMANTIDISAPPEAR_USE )
	{
		DoDrugSlotItem(SLOT_NECK);
	}

	//	Note : ·Î±× ±â·Ï.
	//
	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	//	Note : ¿¬¸¶ ¼º°ø ¿©ºÎ ¹Ýȯ.
	//
	GLMSG::SNET_INVEN_GRINDING_FB NetMsgFB;
	NetMsgFB.bRESET = bRESET;
	NetMsgFB.bTERMINATE = bTERMINATE;
	NetMsgFB.emANTIDISAPPEAR = emANTIDISAPPEAR;
	NetMsgFB.emGrindFB = bSucceeded ? EMGRINDING_SUCCEED : EMGRINDING_FAIL;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

	//	Note : ¾ÆÀÌÅÛÀÇ ¼Ó¼º°ª Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë¸².
	//
	if ( !bTERMINATE )
	{
		GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
		NetItemUpdate.wPosX = pNetMsg->wPosX;
		NetItemUpdate.wPosY = pNetMsg->wPosY;
		NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);

		//dmk14 | 9-22-16 | upgrade announce
		BYTE cUpgrade = 0;
		const EMGRINDING_TYPE emGRINDING = pHold->sGrindingOp.emTYPE;	
		switch( emGRINDING )
		{
			case EMGRINDING_DAMAGE:			cUpgrade = pInvenItem->sItemCustom.cDAMAGE;				break;
			case EMGRINDING_DEFENSE:		cUpgrade = pInvenItem->sItemCustom.cDEFENSE;			break;
		}
		
		if( bSucceeded && cUpgrade >= 8 )
		{
			//CInnerInterface::GetInstance().PrintConsoleText ( "%s '%s' successfully upgraded into (+%d) %s.", m_szName, pItem->GetName(), cUpgrade, COMMENT::GRINDING_TYPE[ emGRINDING ].c_str());

			CString strTEXT;
			strTEXT.Format ( "%s '%s' successfully upgraded into (+%d) %s.", m_szName, pItem->GetName(), cUpgrade, COMMENT::GRINDING_TYPE[ emGRINDING ].c_str() );

			GLMSG::SNET_SERVER_GENERALCHAT NetMsgUps;
			NetMsgUps.SETTEXT ( strTEXT.GetString() );
			//NetMsgUpsbAnnounce = true;
			GLGaeaServer::GetInstance().SENDTOALLCLIENT(&NetMsgUps);
		}
	}
	else
	{
		// ¸¸¾à ÄÚ½ºÆ¬ÀÌ ¹ß¶óÁ® ÀÖÀ¸¸é ÄÚ½ºÆ¬À» ºÐ¸®ÇÏ°í »èÁ¦ÇÑ´Ù.
		if ( pInvenItem->sItemCustom.nidDISGUISE!=SNATIVEID(false) )
		{
			GLITEMLMT & glItemmt = GLITEMLMT::GetInstance();			
			GLItemMan & glItemMan = GLItemMan::GetInstance();

			SITEM *pONE = glItemMan.GetItem ( pInvenItem->sItemCustom.nidDISGUISE );
			if ( !pONE )		return E_FAIL;

			SITEMCUSTOM sITEM_NEW;
			sITEM_NEW.sNativeID = pInvenItem->sItemCustom.nidDISGUISE;
			CTime cTIME = CTime::GetCurrentTime();
			if ( pInvenItem->sItemCustom.tDISGUISE!=0 && pONE->sDrugOp.tTIME_LMT!= 0 )
			{
				cTIME = CTime(pInvenItem->sItemCustom.tDISGUISE);

				CTimeSpan tLMT(pONE->sDrugOp.tTIME_LMT);
				cTIME -= tLMT;
			}

			//	Note : ¾ÆÀÌÅÛ »ý¼º.
			//
			sITEM_NEW.tBORNTIME = cTIME.GetTime();
			sITEM_NEW.wTurnNum = 1;
			sITEM_NEW.cGenType = EMGEN_BILLING;
			sITEM_NEW.cChnID = (BYTE)m_pGLGaeaServer->GetServerChannel();
			sITEM_NEW.cFieldID = (BYTE)m_pGLGaeaServer->GetFieldSvrID();
			sITEM_NEW.lnGenNum = glItemmt.RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

			//	Note : hold ¾ÆÀÌÅÛ Àκ¥¿¡ µÇµ¹¸².
			WORD wInsertPosX, wInsertPosY;
			BOOL bOk = m_cInventory.FindInsrtable ( pONE->sBasicOp.wInvenSizeX, pONE->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
			if ( !bOk )
			{
				// »ý¼ºµÈ ÄÚ½ºÅùÀº ¹Ù´Ú¿¡¼­ ´Ù½Ã ¶³±º´Ù.
				CItemDrop cDropItem;
				cDropItem.sItemCustom = sITEM_NEW;
				m_pLandMan->DropItem ( m_vPos, &(cDropItem.sItemCustom), EMGROUP_ONE, m_dwGaeaID );

				//	Note : ºÐ¸®µÈ ÄÚ½ºÅù ·Î±×.
				glItemmt.ReqItemRoute ( sITEM_NEW, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_GROUND, sITEM_NEW.wTurnNum );
			}else{
				//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
				m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
				SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

				//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
				GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
				NetMsg_Inven.Data = *pINSERT_ITEM;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);
			}			
		}

		//	Note :¾ÆÀÌÅÛÀÇ ¼ÒÀ¯ ÀÌÀü °æ·Î ±â·Ï.
		//
		GLITEMLMT::GetInstance().ReqItemRoute ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, 0, EMITEM_ROUTE_DELETE, pInvenItem->sItemCustom.wTurnNum );

		//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ Á¦°Å.
		GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
		NetMsg_Inven_Delete.wPosX = pNetMsg->wPosX;
		NetMsg_Inven_Delete.wPosY = pNetMsg->wPosY;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven_Delete);

		//	¾ÆÀÌÅÆ Á¦°Å.
		m_cInventory.DeleteItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	}

	return S_OK;
}

HRESULT GLChar::MsgReqInvenResetSkSt ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_RESET_SKST *pNetMsg = (GLMSG::SNET_INVEN_RESET_SKST *)nmg;

	GLMSG::SNET_INVEN_RESET_SKST_FB	MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_RESET_SKST_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;



	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_SKP_STAT_RESET )
	{
		MsgFB.emFB = EMREQ_RESET_SKST_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	// ·¹º§ Á¶°Ç È®ÀÎ
	if ( !SIMPLE_CHECK_ITEM( pITEM->sBasicOp.sNativeID ) )
	{		
		MsgFB.emFB = EMREQ_RESET_SKST_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);		
		return E_FAIL;
	}

	enum
	{
		EMGRADE				= 31,
		EMMARBLE_MID		= 104,

		EMGRADE_MIN			= 4,
	};

	WORD wNUM(0);
	WORD wGRADE[EMGRADE];
	memset(wGRADE,0,sizeof(WORD)*EMGRADE);

	SKILL_MAP_ITER pos = m_ExpSkills.begin();
	SKILL_MAP_ITER end = m_ExpSkills.end();
	for ( ; pos!=end; ++pos )
	{
		SNATIVEID sNID ( (*pos).first );

		PGLSKILL pSKILL = GLSkillMan::GetInstance().GetData ( sNID );
		if ( !pSKILL )									continue;
		if ( EMGRADE_MIN > pSKILL->m_sBASIC.dwGRADE )	continue;

		wGRADE[pSKILL->m_sBASIC.dwGRADE] += 1;
		++wNUM;
	}

	BOOL bINSERT(TRUE);
	GLInventory cInven;
	cInven.Assign ( m_cInventory );
	for ( int i=EMGRADE_MIN; i<EMGRADE; ++i )
	for ( int j=0; j<wGRADE[i]; ++j )
	{
		SITEM *pITEM_SKILL = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
		if ( !pITEM_SKILL )		continue;

		SITEMCUSTOM sITEM_NEW;
		sITEM_NEW.sNativeID = SNATIVEID(EMMARBLE_MID,i);

		//	¾ÆÀÌÅÛÀÇ »ç¿ë Ƚ¼ö Ç¥½Ã. ( ¼Ò¸ðÇ°ÀÏ °æ¿ì x °ª, ÀÏ¹Ý ¹°Ç° 1 )
		sITEM_NEW.wTurnNum = pITEM_SKILL->GETAPPLYNUM();

		BOOL bOK = cInven.InsertItem ( sITEM_NEW );
		if ( !bOK )
		{
			bINSERT = FALSE;
			break;
		}
	}

	if ( !bINSERT )
	{
		MsgFB.wITEM_NUM = wNUM;
		MsgFB.emFB = EMREQ_RESET_SKST_FB_NOINVEN;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	for ( i=EMGRADE_MIN; i<EMGRADE; ++i )
	for ( int j=0; j<wGRADE[i]; ++j )
	{
		SITEM *pITEM_SKILL = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
		if ( !pITEM_SKILL )		continue;

		SITEMCUSTOM sITEM_NEW;
		CTime cTIME = CTime::GetCurrentTime();

		//	¾ÆÀÌÅÛ ¹ß»ý.
		sITEM_NEW.sNativeID = SNATIVEID(EMMARBLE_MID,i);
		sITEM_NEW.tBORNTIME = cTIME.GetTime();

		//	¾ÆÀÌÅÛÀÇ »ç¿ë Ƚ¼ö Ç¥½Ã. ( ¼Ò¸ðÇ°ÀÏ °æ¿ì x °ª, ÀÏ¹Ý ¹°Ç° 1 )
		sITEM_NEW.wTurnNum = pITEM_SKILL->GETAPPLYNUM();

		//	¹ß»ýµÈ Á¤º¸ µî·Ï.
		sITEM_NEW.cGenType = EMGEN_INIT;
		sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
		sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
		sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, EMGEN_INIT );

		BOOL bOK;
		WORD wPosX(0), wPosY(0);
		bOK = m_cInventory.FindInsrtable ( pITEM_SKILL->sBasicOp.wInvenSizeX, pITEM_SKILL->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOK )		continue;

		bOK = m_cInventory.InsertItem ( sITEM_NEW, wPosX, wPosY );
		if ( !bOK )		continue;

		SINVENITEM *pInvenItem = m_cInventory.GetItem ( wPosX, wPosY );
		if (!pInvenItem) continue;

		//	¾ÆÀÌÅÛ È¹µæ ·Î±× ³²±è.
		GLITEMLMT::GetInstance().ReqItemRoute ( sITEM_NEW, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, sITEM_NEW.wTurnNum );

		//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.Data = *pInvenItem;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);

	}

	//	Note : ½ºÅ³, ½ºÅÝ ¸®¼Â.
	//
	RESET_STATS_SKILL ( pITEM->sDrugOp.wCureVolume );

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	Note : ¸®¼Â ¸Þ½ÃÁö º¸³¿.
	//
	MsgFB.emFB = EMREQ_RESET_SKST_FB_OK;
	MsgFB.wITEM_NUM = wNUM;
	MsgFB.wSTATS_POINT = pITEM->sDrugOp.wCureVolume;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	return S_OK;
}


HRESULT GLChar::MsgReqCharCard ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_CHARCARD *pNetMsg = (GLMSG::SNET_INVEN_CHARCARD *)nmg;

	GLMSG::SNET_INVEN_CHARCARD_FB	MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_CHARCARD_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_CHARACTER_CARD )
	{
		MsgFB.emFB = EMREQ_CHARCARD_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	Note : Äɸ¯ÅÍ »ý¼º ½½·Ô Áõ°¡.
	//
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CItemChaCreateNumIncrease *pDbAction = new CItemChaCreateNumIncrease ( m_dwUserID );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
	}

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	Note : ó¸® ¼º°ø ¾Ë¸².
	MsgFB.emFB = EMREQ_CHARCARD_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	return S_OK;
}

HRESULT GLChar::MsgReqStorageCard ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_STORAGECARD *pNetMsg = (GLMSG::SNET_INVEN_STORAGECARD *)nmg;

	GLMSG::SNET_INVEN_STORAGECARD_FB	MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_STORAGECARD_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_STORAGE_CARD )
	{
		MsgFB.emFB = EMREQ_STORAGECARD_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( pNetMsg->wSTORAGE < EMSTORAGE_CHANNEL_SPAN || pNetMsg->wSTORAGE>=(EMSTORAGE_CHANNEL_SPAN+EMSTORAGE_CHANNEL_SPAN_SIZE) )
	{
		MsgFB.emFB = EMREQ_STORAGECARD_FB_INVNUM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	Note : â°í Á¦ÇÑ ½Ã°£ º¯°æ.
	//
	int nINDEX = pNetMsg->wSTORAGE-EMSTORAGE_CHANNEL_SPAN;
	__time64_t &tTIME = m_tSTORAGE[nINDEX];

	CTime tCurTime = CTime::GetCurrentTime();
	CTime tSeedTime(tTIME);
	CTimeSpan tLMT (pITEM->sDrugOp.tTIME_LMT);
	CTimeSpan tADD(0,1,30,0);

	//	Note : ¾ÆÁ÷ ÃʱâÈ­ µÇÁö ¾Ê¾Ò°Å³ª, ÃæÀü½Ã°£ ÃÊ°úµÇ¾úÀ» °æ¿ì.
	if ( tTIME == 0 || tSeedTime < tCurTime )
	{
		tSeedTime = tCurTime + tLMT + tADD;
	}
	//	Note : ÃæÀü½Ã°£¿¡ ¾ÆÁ÷ ¿©À¯°¡ ÀÖÀ»¶§.
	else
	{
		tSeedTime = tSeedTime + tLMT + tADD;
	}

	//	Note : »ç¿ë½Ã°£ ÃæÀüµÊ, »ç¿ë °¡´ÉÀ¸·Î º¯°æ.
	tTIME = tSeedTime.GetTime();	//	m_tSTORAGE[nINDEX] = time;
	m_bSTORAGE[nINDEX] = true;

	//	Note : DB¿¡ ½ºÅ丮Áö ÃæÀü½Ã°£ ÀúÀå.
	//
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CSetChaStorageDate *pDbAction = new CSetChaStorageDate ( m_dwUserID, nINDEX+EMSTORAGE_CHANNEL_SPAN, tTIME );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
	}

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	Note : ó¸® °á°ú ¾Ë¸².
	CTimeSpan tDX = tSeedTime - tCurTime;
	MsgFB.emFB = EMREQ_STORAGECARD_FB_OK;
	MsgFB.tSTORAGE_LIMIT = tSeedTime.GetTime();
	MsgFB.tSPAN = tDX.GetTimeSpan();
	MsgFB.wSTORAGE = pNetMsg->wSTORAGE;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	return S_OK;
}

HRESULT GLChar::MsgReqInvenLine ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_INVENLINE *pNetMsg = (GLMSG::SNET_INVEN_INVENLINE *)nmg;

	GLMSG::SNET_INVEN_INVENLINE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_INVENLINE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_INVEN_CARD )
	{
		MsgFB.emFB = EMREQ_INVENLINE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( m_wINVENLINE >= (EM_INVENSIZE_Y - EM_INVEN_DEF_SIZE_Y - EM_INVEN_PREMIUM_SIZE) )
	{
		MsgFB.emFB = EMREQ_INVENLINE_FB_MAXLINE;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	Note : Àκ¥ ¶óÀÎ Áõ°¡.
	//
	m_wINVENLINE += 1;

	//	Note : ÇöÁ¦ È°¼ºÈ­µÈ Àκ¥ ¶óÀÎ ¼³Á¤.
	//
	m_cInventory.SetAddLine ( GetOnINVENLINE(), true );

	//	Note : DB¿¡ ÀúÀå.
	//
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CSetChaInvenNum *pDbAction = new CSetChaInvenNum ( m_dwCharID, m_wINVENLINE );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
	}

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÛ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	//	Note : ó¸® °á°ú ¾Ë¸².
	MsgFB.emFB = EMREQ_INVENLINE_FB_OK;
	MsgFB.wINVENLINE = m_wINVENLINE;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	return S_OK;
}

// *****************************************************
// Desc: °³Á¶ ±â´É ÀÌ¿ëÄ«µå ¿äû ( Ä«µå¸¸ ¼Ò¸ð½ÃÅ´ )
// *****************************************************
HRESULT GLChar::MsgReqInvenRemodelOpen ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_REMODELOPEN *pNetMsg = (GLMSG::SNET_INVEN_REMODELOPEN *)nmg;

	GLMSG::SNET_INVEN_REMODELOPEN_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_REMODEL )
	{
		MsgFB.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	m_ItemRemodelPosX = pNetMsg->wPosX;
	m_ItemRemodelPosY = pNetMsg->wPosY;

	MsgFB.emFB = EMREQ_REMODELOPEN_FB_OK;
	//dmk14 | 12-18-16 | rebuild test fix
	m_bUseRebuildCard = true;

	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	return S_OK;
}


HRESULT GLChar::MsgReqInvenGarbageOpen ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_GARBAGEOPEN *pNetMsg = (GLMSG::SNET_INVEN_GARBAGEOPEN *)nmg;

	GLMSG::SNET_INVEN_GARBAGEOPEN_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_GARBAGEOPEN_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_GARBAGE_CARD )
	{
		MsgFB.emFB = EMREQ_GARBAGEOPEN_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	m_ItemGarbagePosX = pNetMsg->wPosX;
	m_ItemGarbagePosY = pNetMsg->wPosY;

	MsgFB.emFB = EMREQ_GARBAGEOPEN_FB_OK;

	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	return S_OK;
}

// *****************************************************
// Desc: ±ä±Þ â°í ÀÌ¿ëÄ«µå ¿äû ( Ä«µå¸¸ ¼Ò¸ð½ÃÅ´ )
// *****************************************************
HRESULT GLChar::MsgReqInvenStorageOpen ( NET_MSG_GENERIC* nmg )
{
	// â°í¿¬°áÄ«µå¸¦ »ç¿ëÁßÀ̸é
	if ( m_bUsedStorageCard ) return E_FAIL;

	GLMSG::SNET_INVEN_STORAGEOPEN *pNetMsg = (GLMSG::SNET_INVEN_STORAGEOPEN *)nmg;

	GLMSG::SNET_INVEN_STORAGEOPEN_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_STORAGEOPEN_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_STORAGE_CONNECT )
	{
		MsgFB.emFB = EMREQ_STORAGEOPEN_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÛ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	MsgFB.emFB = EMREQ_STORAGEOPEN_FB_OK;
	MsgFB.wPosX = pNetMsg->wPosX;
	MsgFB.wPosY = pNetMsg->wPosY;

	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	// â°í¿¬°áÄ«µå »ç¿ë¿©ºÎ
	m_bUsedStorageCard = true;

	return S_OK;
}

// *****************************************************
// Desc: ±ä±Þ â°í »ç¿ë ¿Ï·á
// *****************************************************
HRESULT GLChar::MsgReqInvenStorageClose ( NET_MSG_GENERIC* nmg )
{
	// â°í¿¬°áÄ«µå »ç¿ë¿©ºÎ
	m_bUsedStorageCard = false;

	return S_OK;
}

HRESULT GLChar::MsgReqInvenPremiumSet ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_PREMIUMSET *pNetMsg = (GLMSG::SNET_INVEN_PREMIUMSET *)nmg;

	GLMSG::SNET_INVEN_PREMIUMSET_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMREQ_PREMIUMSET_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_PREMIUMSET )
	{
		MsgFB.emFB = EMREQ_PREMIUMSET_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	Note : Àκ¥ÀÇ ¿©À¯ °ø°£ ÃøÁ¤.
	//
	GLInventory cInvenTemp;
	cInvenTemp.SetAddLine ( m_cInventory.GETAddLine(), true );
	cInvenTemp.Assign ( m_cInventory );

	for ( int i=0; i<ITEM::SBOX::ITEM_SIZE; ++i )
	{
		SITEMCUSTOM sCUSTOM;
		sCUSTOM.sNativeID = pITEM->sBox.sITEMS[i].nidITEM;
		if ( sCUSTOM.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pONE = GLItemMan::GetInstance().GetItem ( sCUSTOM.sNativeID );
		if ( !pONE )
		{
			MsgFB.emFB = EMREQ_PREMIUMSET_FB_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
			return E_FAIL;
		}

		BOOL bOK = cInvenTemp.InsertItem ( sCUSTOM );
		if ( !bOK )
		{
			//	Note : Àκ¥¿¡ °ø°£ÀÌ ¾ø´Â °ÍÀ¸·Î ÆǴܵÊ.
			//
			MsgFB.emFB = EMREQ_PREMIUMSET_FB_NOTINVEN;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
			return E_FAIL;
		}
	}

	//	Note : »óÀھȿ¡ ÀÖ´Â ¾ÆÀÌÅÛÀ» ²¨³»¾î¼­ ³Ö´Â´Ù.
	//
	for ( int i=0; i<ITEM::SBOX::ITEM_SIZE; ++i )
	{
		SITEMCUSTOM sITEM_NEW;
		sITEM_NEW.sNativeID = pITEM->sBox.sITEMS[i].nidITEM;
		DWORD dwAMOUNT = pITEM->sBox.sITEMS[i].dwAMOUNT;
		if ( sITEM_NEW.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pONE = GLItemMan::GetInstance().GetItem ( sITEM_NEW.sNativeID );
		if ( !pONE )											return E_FAIL;

		//	Note : ¾ÆÀÌÅÛ »ý¼º.
		//
		CTime cTIME = CTime::GetCurrentTime();
		sITEM_NEW.tBORNTIME = cTIME.GetTime();

		sITEM_NEW.wTurnNum = (WORD) dwAMOUNT;
		sITEM_NEW.cGenType = pINVENITEM->sItemCustom.cGenType;
		sITEM_NEW.cChnID = (BYTE)GLGaeaServer::GetInstance().GetServerChannel();
		sITEM_NEW.cFieldID = (BYTE)GLGaeaServer::GetInstance().GetFieldSvrID();
		sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

		// ¾ÆÀÌÅÛ ¿¡µðÆ®¿¡¼­ ÀÔ·ÂÇÑ °³Á¶ µî±Þ Àû¿ë ( ÁØÇõ )
		sITEM_NEW.cDAMAGE = (BYTE)pONE->sBasicOp.wGradeAttack;
		sITEM_NEW.cDEFENSE = (BYTE)pONE->sBasicOp.wGradeDefense;

		//	·£´ý ¿É¼Ç »ý¼º.
		if( sITEM_NEW.GENERATE_RANDOM_OPT() )
		{
			GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
		}

		//	Note :.
		WORD wInsertPosX, wInsertPosY;
		BOOL bOk = m_cInventory.FindInsrtable ( pONE->sBasicOp.wInvenSizeX, pONE->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
		if ( !bOk )		return S_OK;	//	Àκ¥ °ø°£ ºÎÁ·À¸·Î µÇµ¹¸² ½ÇÆÐ.

		//	.
		m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
		SINVENITEM *pInvenItem = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );
		if ( !pInvenItem )	return E_FAIL;

		//	Note : ·Î±× ³²±è.
		GLITEMLMT::GetInstance().ReqItemRoute ( pInvenItem->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pInvenItem->sItemCustom.wTurnNum );

		//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.Data = *pInvenItem;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);
	}

	//	Note : ÇÁ¸®¹Ì¾ö ¼³Á¤.
	//
	CTime tPREMIUM(m_tPREMIUM);
	CTime tCurTime = CTime::GetCurrentTime();
	CTimeSpan tLMT(pITEM->sDrugOp.tTIME_LMT);
	CTimeSpan tADD(0,1,30,0);

	if ( m_tPREMIUM==0 || tPREMIUM < tCurTime )
	{
		tPREMIUM = tCurTime + tLMT + tADD;
	}
	else
	{
		tPREMIUM = tPREMIUM + tLMT + tADD;
	}

	//	Note : ÇÁ¸®¹Ì¾ö ¸ðµå ON.
	//
	m_tPREMIUM = tPREMIUM.GetTime();
	m_bPREMIUM = true;

	//	Note : ÇöÁ¦ È°¼ºÈ­µÈ Àκ¥ ¶óÀÎ ¼³Á¤.
	//
	m_cInventory.SetAddLine ( GetOnINVENLINE(), true );

	//	Note : DB¿¡ ÀúÀå.
	//
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CSetPremiumTime *pDbAction = new CSetPremiumTime ( m_dwUserID, m_tPREMIUM );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
	}

	// Note : CSetPremiumTime Ŭ·¡½º¿¡¼­ ¸ðµç °æ¿ì¸¦ ó¸®Çϵµ·Ï º¯°æµÊ
	/*
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		CDaumSetPremiumTime *pDbAction = new CDaumSetPremiumTime ( m_dwUserID, m_tPREMIUM );
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
	}
	*/
	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );


	//	Note : ¿¡ÀÌÁ¯Æ®·Î °ÅÃļ­ ¸Þ½ÃÁö Àü¼Û.
	//		( ¿¡ÀÌÁ¯Æ®¿¡ ±â·ÏµÇ¾î ÀÖ´Â ÇÁ¸®¹Ì¾ö ±â°£À» °»½Å ½ÃÄÑÁà¾ß ÇÑ´Ù. )
	//
	CTimeSpan tDX = tPREMIUM - tCurTime;
	MsgFB.emFB = EMREQ_PREMIUMSET_FB_OK;
	MsgFB.tLMT = m_tPREMIUM;
	MsgFB.tSPAN = tDX.GetTimeSpan();
	GLGaeaServer::GetInstance().SENDTOAGENT(m_dwClientID,&MsgFB);

	return S_OK;
}

HRESULT GLChar::MsgReqInvenHairChange ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_HAIR_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_HAIR_CHANGE *)nmg;

	GLMSG::SNETPC_INVEN_HAIR_CHANGE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_COOLTIME;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_HAIR )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	bool bVALIDCLASS = (NULL!=(pITEM->sBasicOp.dwReqCharClass&m_emClass));
	if ( !bVALIDCLASS )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_BADCLASS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	WORD wHAIR = pITEM->sSuitOp.wReModelNum;

	EMCHARINDEX emIndex = CharClassToIndex(m_emClass);
	const GLCONST_CHARCLASS& sCHARCONST = GLCONST_CHAR::cCONSTCLASS[emIndex];
	if ( sCHARCONST.dwHAIRNUM<=wHAIR || MAX_HAIR<=wHAIR )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( sCHARCONST.strHAIR_CPS[wHAIR].empty() )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	Note : Çì¾î¸¦ º¯È­ ½ÃÅ´.
	//
	m_wHair = wHAIR;

	//	Note : Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	MsgFB.dwID = m_wHair;
	MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	//	Note : Çì¾î º¯°æÀ» ´Ù¸¥ »ç¶÷µé¿¡°Ô ¾Ë¸².
	GLMSG::SNETPC_INVEN_HAIR_CHANGE_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	NetMsgBrd.dwID = m_wHair;
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	return S_OK;
}

HRESULT GLChar::MsgReqInvenHairStyleChange ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_HAIRSTYLE_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_HAIRSTYLE_CHANGE *)nmg;

	GLMSG::SNETPC_INVEN_HAIR_CHANGE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_COOLTIME;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	
	if ( pITEM->sBasicOp.emItemType!=ITEM_HAIR_STYLE )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}


	bool bVALIDCLASS = (NULL!=(pITEM->sBasicOp.dwReqCharClass&m_emClass));
	if ( !bVALIDCLASS )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_BADCLASS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//WORD wHAIR = pITEM->sSuitOp.wReModelNum;

	EMCHARINDEX emIndex = CharClassToIndex(m_emClass);
	const GLCONST_CHARCLASS& sCHARCONST = GLCONST_CHAR::cCONSTCLASS[emIndex];
	if ( sCHARCONST.dwHAIRNUM<=pNetMsg->wHairStyle || MAX_HAIR<=pNetMsg->wHairStyle )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	m_wHair = pNetMsg->wHairStyle;

	//	Note : Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	MsgFB.dwID = m_wHair;
	MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	//	Note : Çì¾î º¯°æÀ» ´Ù¸¥ »ç¶÷µé¿¡°Ô ¾Ë¸².
	GLMSG::SNETPC_INVEN_HAIR_CHANGE_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	NetMsgBrd.dwID = m_wHair;
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	// DB¿¡ ÀúÀå
	CSetChaHairStyle* pDBAction = new CSetChaHairStyle ( m_dwCharID, m_wHair );

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDBAction );
	}


	return S_OK;
}

HRESULT GLChar::MsgReqInvenHairColorChange ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_HAIRCOLOR_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_HAIRCOLOR_CHANGE *)nmg;

	GLMSG::SNETPC_INVEN_HAIRCOLOR_CHANGE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_COOLTIME;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );

	if ( pITEM->sBasicOp.emItemType!=ITEM_HAIR_COLOR )
	{
		MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	Note : Çì¾î¸¦ º¯È­ ½ÃÅ´.
	//
	m_wHairColor = pNetMsg->wHairColor;

	//	Note : Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	MsgFB.wHairColor = m_wHairColor;
	MsgFB.emFB = EMINVEN_HAIR_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	//	Note : Çì¾î º¯°æÀ» ´Ù¸¥ »ç¶÷µé¿¡°Ô ¾Ë¸².
	GLMSG::SNETPC_INVEN_HAIRCOLOR_CHANGE_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	NetMsgBrd.wHairColor = m_wHairColor;
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	// DB¿¡ ÀúÀå
	CSetChaHairColor* pDBAction = new CSetChaHairColor ( m_dwCharID, m_wHairColor );

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDBAction );
	}

	return S_OK;
}

HRESULT GLChar::MsgReqInvenBikeColorChange ( NET_MSG_GENERIC* nmg ) //add bike color
{
	GLMSG::SNETPC_INVEN_BIKECOLOR_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_BIKECOLOR_CHANGE *)nmg;

	GLMSG::SNETPC_INVEN_BIKECOLOR_CHANGE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_BIKE_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )
	{
		MsgFB.emFB = EMINVEN_BIKE_CHANGE_FB_COOLTIME;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );

	if ( pITEM->sBasicOp.emItemType!=ITEM_BIKE_COLOR )
	{
		MsgFB.emFB = EMINVEN_BIKE_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	m_sVehicle.m_wColor = pNetMsg->wBikeColor;

	MsgFB.wBikeColor = m_sVehicle.m_wColor;
	MsgFB.emFB = EMINVEN_BIKE_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	GLMSG::SNETPC_INVEN_BIKECOLOR_CHANGE_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	NetMsgBrd.wBikeColor = m_sVehicle.m_wColor;
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	// DB¿¡ ÀúÀå //jdev todo save color after change
	CSetVehicleColor* pDBAction = new CSetVehicleColor ( m_dwClientID, m_dwCharID, m_sVehicle.m_dwGUID ,m_sVehicle.m_wColor );

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDBAction );
	}

	return S_OK;
}


HRESULT GLChar::MsgReqInvenFaceChange ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_FACE_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_FACE_CHANGE *)nmg;

	GLMSG::SNETPC_INVEN_FACE_CHANGE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_COOLTIME;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);		
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_FACE )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	bool bVALIDCLASS = (NULL!=(pITEM->sBasicOp.dwReqCharClass&m_emClass));
	if ( !bVALIDCLASS )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_BADCLASS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	WORD wFACE = pITEM->sSuitOp.wReModelNum;

	EMCHARINDEX emIndex = CharClassToIndex(m_emClass);
	const GLCONST_CHARCLASS& sCHARCONST = GLCONST_CHAR::cCONSTCLASS[emIndex];
	if ( sCHARCONST.dwHEADNUM<=wFACE || MAX_HEAD<=wFACE )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( sCHARCONST.strHEAD_CPS[wFACE].empty() )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//	Note : ¾ó±¼À» º¯È­ ½ÃÅ´.
	//
	m_wFace = wFACE;

	//	Note : Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	MsgFB.dwID = m_wFace;
	MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	//	Note : ¾ó±¼ º¯°æÀ» ´Ù¸¥ »ç¶÷µé¿¡°Ô ¾Ë¸².
	GLMSG::SNETPC_INVEN_FACE_CHANGE_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	NetMsgBrd.dwID = m_wFace;
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	return S_OK;
}

HRESULT GLChar::MsgReqInvenFaceStyleChange ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_FACESTYLE_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_FACESTYLE_CHANGE *)nmg;

	GLMSG::SNETPC_INVEN_FACE_CHANGE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )
	{		
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_COOLTIME;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	
	if ( pITEM->sBasicOp.emItemType!=ITEM_FACE_STYLE )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}


	bool bVALIDCLASS = (NULL!=(pITEM->sBasicOp.dwReqCharClass&m_emClass));
	if ( !bVALIDCLASS )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_BADCLASS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	//WORD wHAIR = pITEM->sSuitOp.wReModelNum;

	EMCHARINDEX emIndex = CharClassToIndex(m_emClass);
	const GLCONST_CHARCLASS& sCHARCONST = GLCONST_CHAR::cCONSTCLASS[emIndex];
	if ( sCHARCONST.dwHEADNUM<=pNetMsg->wFaceStyle || MAX_HEAD<=pNetMsg->wFaceStyle )
	{
		MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	m_wFace = pNetMsg->wFaceStyle;

	//	Note : Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	MsgFB.dwID = m_wFace;
	MsgFB.emFB = EMINVEN_FACE_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	//	Note : Çì¾î º¯°æÀ» ´Ù¸¥ »ç¶÷µé¿¡°Ô ¾Ë¸².
	GLMSG::SNETPC_INVEN_FACE_CHANGE_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	NetMsgBrd.dwID = m_wFace;
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	// DB¿¡ ÀúÀå
	CSetChaFaceStyle* pDBAction = new CSetChaFaceStyle ( m_dwCharID, m_wFace );

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDBAction );
	}


	return S_OK;

}


HRESULT GLChar::MsgReqInvenGenderChange( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_GENDER_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_GENDER_CHANGE *)nmg;
	GLMSG::SNETPC_INVEN_GENDER_CHANGE_FB MsgFB;


	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_GENDER_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	
	if ( pITEM->sBasicOp.emItemType!=ITEM_GENDER_CHANGE )
	{
		MsgFB.emFB = EMINVEN_GENDER_CHANGE_FB_ITEMTYPE;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}


	//added by   | 08-07-2012 | make extreme can use gender card
	/*if ( m_emClass == GLCC_EXTREME_M || m_emClass == GLCC_EXTREME_W )
	{
		MsgFB.emFB = EMINVEN_GENDER_CHANGE_FB_BADCLASS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}*/

	//fix for proper class reverse
	EMCHARCLASS emClass;
    	
	//if ( m_emClass > GLCC_EXTREME_M &&  m_emClass < GLCC_SCIENCE_M )	emClass = (EMCHARCLASS) (m_emClass / 64 );
	//else if ( m_emClass < GLCC_EXTREME_M ) emClass = (EMCHARCLASS) (m_emClass * 64);

	if ( m_emClass == GLCC_FIGHTER_M || m_emClass == GLCC_ARMS_M || m_emClass == GLCC_ARCHER_W || m_emClass == GLCC_SPIRIT_W )  emClass = (EMCHARCLASS) (m_emClass * 64);
	else if ( m_emClass == GLCC_FIGHTER_W || m_emClass == GLCC_ARMS_W || m_emClass == GLCC_ARCHER_M || m_emClass == GLCC_SPIRIT_M )  emClass = (EMCHARCLASS) (m_emClass / 64);
	else if ( m_emClass == GLCC_EXTREME_M || m_emClass == GLCC_SCIENCE_M || m_emClass == GLCC_ASSASSIN_M )  emClass = (EMCHARCLASS) (m_emClass * 2 );
	else if ( m_emClass == GLCC_EXTREME_W || m_emClass == GLCC_SCIENCE_W || m_emClass == GLCC_ASSASSIN_W )  emClass = (EMCHARCLASS) (m_emClass / 2 );


	EMCHARINDEX emIndex = CharClassToIndex(emClass);
	const GLCONST_CHARCLASS& sCHARCONST = GLCONST_CHAR::cCONSTCLASS[emIndex];

	if ( pNetMsg->wFace >= sCHARCONST.dwHEADNUM || pNetMsg->wHair >= sCHARCONST.dwHAIRNUM_SELECT )
	{
		MsgFB.emFB = EMINVEN_GENDER_CHANGE_FB_NOTVALUE;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

    m_emClass = emClass;
	m_wHair = pNetMsg->wHair;
	m_wFace = pNetMsg->wFace;	
	m_wHairColor = HAIRCOLOR::GetHairColor( emIndex, m_wHair );

	m_wSex = m_wSex ? 0 : 1;


	//	Note : Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	MsgFB.emClass	= m_emClass;
	MsgFB.wSex		= m_wSex;
	MsgFB.wFace = m_wFace;
	MsgFB.wHair = m_wHair;
	MsgFB.wHairColor = m_wHairColor;

	MsgFB.emFB = EMINVEN_GENDER_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	// DB¿¡ ÀúÀå
	CSetChaGenderChange* pDBAction = new CSetChaGenderChange ( m_dwCharID, m_emClass, m_wSex, m_wFace, m_wHair, m_wHairColor );

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDBAction );
	}

	return S_OK;
}

HRESULT GLChar::MsgReqInvenChargedItem ( NET_MSG_GENERIC* nmg )
{
	if ( !IsValidBody() )	return E_FAIL;

	GLMSG::SNET_CHARGED_ITEM_GET *pNetMsg = (GLMSG::SNET_CHARGED_ITEM_GET *) nmg;

	GLMSG::SNET_CHARGED_ITEM_GET_FB NetMsgFB;

	MAPSHOP_ITER iter = m_mapCharged.find ( pNetMsg->szPurKey );
	if ( iter==m_mapCharged.end() )
	{
		NetMsgFB.emFB = EMCHARGED_ITEM_GET_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	SHOPPURCHASE &sPURCHASE = (*iter).second;
	
	SNATIVEID nidITEM(sPURCHASE.wItemMain,sPURCHASE.wItemSub);
	
	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( nidITEM );
	if ( !pITEM )
	{
		NetMsgFB.emFB = EMCHARGED_ITEM_GET_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	WORD wPosX, wPosY;
	BOOL bOK = m_cInventory.FindInsrtable ( pITEM->sBasicOp.wInvenSizeX, pITEM->sBasicOp.wInvenSizeY, wPosX, wPosY );
	if ( !bOK )
	{
		NetMsgFB.emFB = EMCHARGED_ITEM_GET_FB_NOINVEN;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	Note : ¾ÆÀÌÅÛ °¡Á®¿È. DB Action.
	//
	CPurchaseItem_Get *pDbAction = new CPurchaseItem_Get(m_dwClientID,
		                                                 m_dwUserID,
														 pNetMsg->szPurKey,
														 nidITEM,pNetMsg->dwID);
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDbAction );
	}

	return S_OK;
}

// *****************************************************
// Desc: À̸§º¯°æ¿äû ó¸®
// *****************************************************
HRESULT GLChar::MsgReqInvenRename ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_RENAME *pNetMsg = (GLMSG::SNETPC_INVEN_RENAME*) nmg;

	GLMSG::SNETPC_INVEN_RENAME_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_RENAME_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_RENAME )
	{
		MsgFB.emFB = EMINVEN_RENAME_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}
	
	// ij¸¯Å͸í
	CString strChaName(pNetMsg->szName);
	strChaName.Trim(_T(" ")); // ¾ÕµÚ °ø¹éÁ¦°Å

	// ½ºÆäÀ̽º ã±â, ij¸¯ÅÍÀ̸§ 4±ÛÀÚ ÀÌÇÏ ¿¡·¯, ij¸¯ÅÍ ¸¸µé ¼ö ¾øÀ½.
	if ((strChaName.FindOneOf(" ") != -1) || (strChaName.GetLength() < 4)) 
	{
		MsgFB.emFB = EMINVEN_RENAME_FB_LENGTH;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	BOOL bFILTER0 = STRUTIL::CheckString( strChaName );
	BOOL bFILTER1 = CRanFilter::GetInstance().NameFilter( strChaName );
	if ( bFILTER0 || bFILTER1 )
	{
		MsgFB.emFB = EMINVEN_RENAME_FROM_DB_BAD;
		GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &MsgFB );
		return S_FALSE;			
	}

#ifdef TH_PARAM	
	// ű¹¾î ¹®ÀÚ Á¶ÇÕ Ã¼Å© 
	if ( !m_pCheckString ) return E_FAIL;

	if ( !m_pCheckString(strChaName) )
	{
		MsgFB.emFB = EMINVEN_RENAME_FB_THAICHAR_ERROR;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}
#endif

#ifdef VN_PARAM
	// º£Æ®³² ¹®ÀÚ Á¶ÇÕ Ã¼Å© 
	if( STRUTIL::CheckVietnamString( strChaName ) )
	{
		MsgFB.emFB = EMINVEN_RENAME_FB_VNCHAR_ERROR;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

#endif 

	// DB¿¡ ÀúÀå¿äû
	CRenameCharacter* pDBAction = new CRenameCharacter(m_dwClientID, 
		                                               m_dwCharID,
													   pNetMsg->szName,
													   pNetMsg->wPosX,
													   pNetMsg->wPosY);
	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDBAction );
	}

	return S_OK;
}

// *****************************************************
// Desc: À̸§º¯°æ °á°ú ó¸®
// *****************************************************
HRESULT GLChar::MsgInvenRename ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_INVEN_RENAME_FROM_DB *pNetMsg = (GLMSG::SNETPC_INVEN_RENAME_FROM_DB *)nmg;
	
	// Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	GLMSG::SNETPC_INVEN_RENAME_FB MsgFB;

	if( pNetMsg->emFB == EMINVEN_RENAME_FROM_DB_BAD )
	{
		MsgFB.emFB = EMINVEN_RENAME_FROM_DB_BAD;
		StringCchCopy ( MsgFB.szName, CHAR_SZNAME, pNetMsg->szName );
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return S_FALSE;
	}
	else if ( pNetMsg->emFB == EMINVEN_RENAME_FROM_DB_FAIL )
	{
		MsgFB.emFB = EMINVEN_RENAME_FROM_DB_FAIL;
		StringCchCopy ( MsgFB.szName, CHAR_SZNAME, pNetMsg->szName );
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return S_FALSE;
	}

	StringCchCopy ( MsgFB.szName, CHAR_SZNAME, pNetMsg->szName );
	MsgFB.emFB = EMINVEN_RENAME_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	// ÁÖº¯¿¡ À̸§º¯°æÀ» ¾Ë¸².
	GLMSG::SNETPC_INVEN_RENAME_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	StringCchCopy ( NetMsgBrd.szName, CHAR_SZNAME, pNetMsg->szName );
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	// GLLandMan À̸§¸Ê º¯°æ.
	GLMSG::SNETPC_CHANGE_NAMEMAP NetMsgNameMap;
	NetMsgNameMap.dwGaeaID = m_dwGaeaID;
	StringCchCopy ( NetMsgNameMap.szOldName, CHAR_SZNAME, m_szName );
	StringCchCopy ( NetMsgNameMap.szNewName, CHAR_SZNAME, pNetMsg->szName );
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgNameMap );

	// À̸§º¯°æÀ» Ä£±¸¿Í Ŭ·´ ¸É¹öµé¿¡°Ô ¾Ë¸²
	GLMSG::SNETPC_INVEN_RENAME_AGTBRD NetMsgAgt;
	NetMsgAgt.dwID = m_dwGaeaID;
	StringCchCopy ( NetMsgAgt.szOldName, CHAR_SZNAME, m_szName );
	StringCchCopy ( NetMsgAgt.szNewName, CHAR_SZNAME, pNetMsg->szName );
	GLGaeaServer::GetInstance().SENDTOAGENT ( m_dwClientID, &NetMsgAgt );

	GLGaeaServer::GetInstance().ChangeNameMap ( this, m_szName, pNetMsg->szName );

	//	[Àڽſ¡°Ô] Àι꿡 ¾ÆÀÌÅÆ Á¦°Å.
	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	return S_OK;
}

HRESULT GLChar::MsgReqSendSMS( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_SEND_SMS *pNetMsg = (GLMSG::SNETPC_SEND_SMS*) nmg;

	GLMSG::SNETPC_SEND_SMS_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wItemPosX, pNetMsg->wItemPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMSMS_SEND_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	if ( pITEM->sBasicOp.emItemType!=ITEM_SMS )
	{
		MsgFB.emFB = EMSMS_SEND_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	// DB¿¡ ÀúÀå¿äû
	CSendSMS* pDBAction = new CSendSMS( m_dwClientID,
										m_dwCharID,
										pNetMsg->dwReceiveChaNum,
										pNetMsg->szPhoneNumber,
										m_szName,
										pNetMsg->szSmsMsg,
										pNetMsg->wItemPosX,
										pNetMsg->wItemPosY );

	if( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob( pDBAction );
	}

	return S_OK;
}

// *****************************************************
// Desc: SMS Àü¼Û °á°ú ó¸®
// *****************************************************
HRESULT GLChar::MsgSendSMS( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_SEND_SMS_FROM_DB *pNetMsg = (GLMSG::SNETPC_SEND_SMS_FROM_DB *)nmg;

	// Ŭ¶óÀ̾ðÆ®¿¡ ó¸® °á°ú Àü¼Û.
	GLMSG::SNETPC_SEND_SMS_FB MsgFB;

	if ( pNetMsg->emFB == EMSMS_SEND_FROM_DB_FAIL )
	{
		MsgFB.emFB = EMSMS_SEND_FROM_DB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return S_FALSE;
	}

	MsgFB.emFB = EMSMS_SEND_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	return TRUE;
}

HRESULT GLChar::MsgLoudSpeaker ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_CHAT_LOUDSPEAKER *pNetMsg = (GLMSG::SNETPC_CHAT_LOUDSPEAKER *) nmg;

	GLMSG::SNETPC_CHAT_LOUDSPEAKER_FB	NetMsgFB;

	bool bchannel_all(false);

	if ( m_dwUserLvl < USER_GM3 )
	{
		SINVENITEM *pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
		if ( !pINVENITEM )
		{
			NetMsgFB.emFB = EMCHAT_LOUDSPEAKER_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsgFB );
			return S_OK;
		}

		if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
		if ( !pITEM )
		{
			NetMsgFB.emFB = EMCHAT_LOUDSPEAKER_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsgFB );
			return S_OK;
		}

		if ( pITEM->sBasicOp.emItemType!=ITEM_LOUDSPEAKER )
		{
			NetMsgFB.emFB = EMCHAT_LOUDSPEAKER_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsgFB );
			return S_OK;
		}

		if ( IsCHATBLOCK() )	return S_FALSE;

		bchannel_all = pITEM->sBasicOp.IsCHANNEL_ALL();

		if ( m_sPMarket.IsOpen() ) 
		{
			DWORD wTurn = m_cInventory.CountTurnItem( pINVENITEM->sItemCustom.sNativeID );
			DWORD wMarketTurn = m_sPMarket.GetItemTurnNum( pINVENITEM->sItemCustom.sNativeID ) ;

			if ( wTurn <= wMarketTurn ) 
			{
				NetMsgFB.emFB = EMCHAT_LOUDSPEAKER_NOITEM;
				GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsgFB );
				return S_OK;
			}
		}

		//	[Àڽſ¡°Ô] ÀÎ¹ê ¾ÆÀÌÅÆ ¼Ò¸ð½ÃÅ´.
		DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	}

	//	Note : È®¼º±â »ç¿ë.
	//
	GLMSG::SNETPC_CHAT_LOUDSPEAKER_AGT NetMsgAgt;
	StringCbCopy( NetMsgAgt.szMSG, CHAT_MSG_SIZE+1, pNetMsg->szMSG);
	NetMsgAgt.bchannel_all = bchannel_all;
	NetMsgAgt.sITEMLINK = pNetMsg->sITEMLINK;
	GLGaeaServer::GetInstance().SENDTOAGENT ( m_dwClientID, &NetMsgAgt );

	return S_OK;
}


HRESULT GLChar::MsgReqRebuildResult( NET_MSG_GENERIC* nmg ) //sealed card 
{
	GLMSG::SNET_REBUILD_RESULT* pNetMsg = (GLMSG::SNET_REBUILD_RESULT*)nmg;

	switch( pNetMsg->emResult )
	{
	case EMREBUILD_RESULT_OPEN:
		{
			InitRebuildData();
			OpenRebuild();
		}
		break;

	case EMREBUILD_RESULT_SUCCESS:	
		{
			if( m_i64RebuildInput != m_i64RebuildCost || m_lnMoney < m_i64RebuildCost )
			{
				pNetMsg->emResult = EMREBUILD_RESULT_MONEY;
				GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, pNetMsg );
				return S_OK;
			}

			SITEMCUSTOM sRebuildItem = GET_REBUILD_ITEM();
			SITEM* pItem = GLItemMan::GetInstance().GetItem( sRebuildItem.sNativeID );
			if( !pItem )		return E_FAIL;

			SRANDOM_GEN* pRANDOM_SET = GLItemMan::GetInstance().GetItemRandomOpt( sRebuildItem.sNativeID );
			if( !pRANDOM_SET )	return E_FAIL;

			if( m_ItemRemodelPosX < EM_INVENSIZE_X && m_ItemRemodelPosY < EM_INVENSIZE_Y )
			{
				GLMSG::SNET_INVEN_REMODELOPEN_FB MsgFB;

				SINVENITEM* pINVENITEM = m_cInventory.GetItem ( m_ItemRemodelPosX, m_ItemRemodelPosY );
				if ( !pINVENITEM )
				{
					MsgFB.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
					GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
					return E_FAIL;
				}

				if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

				SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
				if ( pITEM->sBasicOp.emItemType!=ITEM_REMODEL )
				{
					MsgFB.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
					GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
					return E_FAIL;
				}

				//fix unli rando
				BOOL bEraseRando = DoDrugInvenItem ( m_ItemRemodelPosX, m_ItemRemodelPosY );
				if ( !bEraseRando )
				{
					SINVENITEM* pinvenitemrando = m_cInventory.FindItem( ITEM_REMODEL );
					if ( pinvenitemrando )
					{
						bEraseRando = DoDrugInvenItem ( pinvenitemrando->wPosX, pinvenitemrando->wPosY );
					}

					if ( !bEraseRando )
					{
						SITEM* pholditemrando = GET_SLOT_ITEMDATA ( SLOT_HOLD );
						if ( pholditemrando && pholditemrando->sBasicOp.emItemType==ITEM_REMODEL ) 
						{
							bEraseRando = DoDrugSlotItem ( SLOT_HOLD );
						}
					}

					if ( !bEraseRando )
					{
						CDebugSet::ToFileWithTime( "randobug.txt", "=============================");
						CDebugSet::ToFileWithTime( "randobug.txt", "rando bug info start char:[%d] %s", m_dwCharID, m_szName );
						CDebugSet::ToFileWithTime( "randobug.txt", "rando item not found! [%04d~%04d]",  m_ItemRemodelPosX, m_ItemRemodelPosY );
						CDebugSet::ToFileWithTime( "randobug.txt", "=============================");

						GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
						netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
						GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
						return E_FAIL;
					}
				}

				//fix unli sealed card
				if ( pNetMsg->Data1.nOption != -1 || pNetMsg->Data2.nOption != -1 )
				{
					BOOL bEraseSealed = DoDrugInvenItem( m_sRebuildSeal.wPosX, m_sRebuildSeal.wPosY );

					if ( !bEraseSealed )
					{
						SINVENITEM* pinvenitemseal = m_cInventory.FindItem( ITEM_SEALED_CARD);
						if ( pinvenitemseal )
						{
							bEraseSealed = DoDrugInvenItem ( pinvenitemseal->wPosX, pinvenitemseal->wPosY );
						}

						if ( !bEraseSealed )
						{
							SITEM* pholditemseal = GET_SLOT_ITEMDATA ( SLOT_HOLD );
							if ( pholditemseal && pholditemseal->sBasicOp.emItemType==ITEM_SEALED_CARD ) 
							{
								bEraseSealed = DoDrugSlotItem ( SLOT_HOLD );
							}
						}

						if ( !bEraseSealed )
						{
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");
							CDebugSet::ToFileWithTime( "randobug.txt", "rando bug info start char:[%d] %s", m_dwCharID, m_szName );
							CDebugSet::ToFileWithTime( "randobug.txt", "seal item not found! [%04d~%04d]",  m_sRebuildSeal.wPosX, m_sRebuildSeal.wPosY );
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");

							GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
							netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
							GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
							return E_FAIL;
						}
					}
				}

				SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( m_sRebuildSeal.wPosX, m_sRebuildSeal.wPosY );
				if ( !pInvenItem )
					m_sRebuildSeal.RESET();
			}
			else
			{
				CDebugSet::ToFileWithTime( "randobug.txt", "=============================");
				CDebugSet::ToFileWithTime( "randobug.txt", "rando bug info start char:[%d] %s", m_dwCharID, m_szName );
				CDebugSet::ToFileWithTime( "randobug.txt", "rando item invalid [%04d~%04d]",  m_ItemRemodelPosX, m_ItemRemodelPosY );
				CDebugSet::ToFileWithTime( "randobug.txt", "=============================");

				GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
				netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
				return E_FAIL;
			}
			/*else
			{
				PGLCROW pCrow = m_pLandMan->GetCrow ( pNetMsg->dwNPCID );
				if ( !pCrow )	
					return E_FAIL;

				float fDist = D3DXVec3Length ( &D3DXVECTOR3(m_vPos-pCrow->GetPosition()) );
				float fTalkRange = (float) (pCrow->GetBodyRadius() + GETBODYRADIUS() + 30);
				float fTalkableDis = fTalkRange + 20;

				if ( fDist>fTalkableDis )
					return E_FAIL;
			}*/

			{
				CheckMoneyUpdate( m_lnMoney, m_i64RebuildCost, FALSE, "Rebuild Cost." );
				m_bMoneyUpdate = TRUE;

				m_lnMoney -= m_i64RebuildCost;

				GLMSG::SNETPC_UPDATE_MONEY NetMsgMoney;
				NetMsgMoney.lnMoney = m_lnMoney;
				NetMsgMoney.lnVoteP = m_lnVoteP;
				NetMsgMoney.lnPremP = m_lnPremP;
				//add contributionpoints by CNDev
				NetMsgMoney.lnContribP = m_lnContribP;
				GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsgMoney );

				GLITEMLMT::GetInstance().ReqMoneyExc( ID_CHAR, m_dwCharID, ID_CHAR, 0, -m_i64RebuildCost, EMITEM_ROUTE_NPCREMAKE );
				GLITEMLMT::GetInstance().ReqMoneyExc( ID_CHAR, m_dwCharID, ID_CHAR, 0, m_lnMoney, EMITEM_ROUTE_CHAR );
			}

			float fDestroyRate = seqrandom::getpercent();
			if( fDestroyRate < pRANDOM_SET->fD_point )
			{
				GLITEMLMT::GetInstance().ReqItemRoute( sRebuildItem, ID_CHAR, m_dwCharID, ID_CHAR, m_dwCharID, EMITEM_ROUTE_DELETE, sRebuildItem.wTurnNum );

				m_cInventory.DeleteItem( m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );

				GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
				NetMsg_Inven_Delete.wPosX = m_sRebuildItem.wPosX;
				NetMsg_Inven_Delete.wPosY = m_sRebuildItem.wPosY;
				GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg_Inven_Delete );

				pNetMsg->emResult = EMREBUILD_RESULT_DESTROY;
				GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, pNetMsg );
			}
			else
			{
				SINVENITEM* pInvenItem = m_cInventory.GetItem( m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );
				if( pInvenItem )
				{
					SITEMSEALDATA sData1 = pNetMsg->Data1;
					SITEMSEALDATA sData2 = pNetMsg->Data2;

					if ( sData1.nOption != -1 || sData2.nOption != -1 )
					{
						if ( sData1.nOption != -1 && !pInvenItem->sItemCustom.isExistStat( (BYTE)sData1.emOpt, sData1.cDataValue ) )
						{
							CDebugSet::ToFileWithTime( "sealedbug.txt", "=============================");
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option bug info start char:[%d] %s", m_dwCharID, m_szName );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option item [%04d~%04d]", pInvenItem->sItemCustom.sNativeID.wMainID, pInvenItem->sItemCustom.sNativeID.wSubID );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option not found on base item! option:%d value:%d", sData1.emOpt, sData1.cDataValue );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 1 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE1, pInvenItem->sItemCustom.nOptVALUE1 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 2 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE2, pInvenItem->sItemCustom.nOptVALUE2 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 3 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE3, pInvenItem->sItemCustom.nOptVALUE3 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 4 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE4, pInvenItem->sItemCustom.nOptVALUE4 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "=============================");

							GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
							netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
							GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
							return E_FAIL;
						}

						if ( sData2.nOption != -1 && !pInvenItem->sItemCustom.isExistStat( (BYTE)sData2.emOpt, sData2.cDataValue ) )
						{
							CDebugSet::ToFileWithTime( "sealedbug.txt", "=============================");
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option bug info start char:[%d] %s", m_dwCharID, m_szName );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option item [%04d~%04d]", pInvenItem->sItemCustom.sNativeID.wMainID, pInvenItem->sItemCustom.sNativeID.wSubID );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option not found on base item! option:%d value:%d", sData2.emOpt, sData2.cDataValue );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 1 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE1, pInvenItem->sItemCustom.nOptVALUE1 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 2 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE2, pInvenItem->sItemCustom.nOptVALUE2 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 3 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE3, pInvenItem->sItemCustom.nOptVALUE3 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "option 4 option:%d value:%d", pInvenItem->sItemCustom.cOptTYPE4, pInvenItem->sItemCustom.nOptVALUE4 );
							CDebugSet::ToFileWithTime( "sealedbug.txt", "=============================");

							GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
							netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
							GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
							return E_FAIL;
						}

						SITEMCUSTOM sCustom = pInvenItem->sItemCustom;

						SITEMCUSTOM sITEM_NEW;
						sITEM_NEW.sNativeID 	= sCustom.sNativeID;
						sITEM_NEW.nidDISGUISE	= sCustom.nidDISGUISE;
					
						sITEM_NEW.tBORNTIME 	= sCustom.tBORNTIME;
						sITEM_NEW.tDISGUISE 	= sCustom.tDISGUISE;

						sITEM_NEW.cGenType 		= sCustom.cGenType;
						sITEM_NEW.cChnID 		= sCustom.cChnID;
						sITEM_NEW.cFieldID 		= sCustom.cFieldID;
						sITEM_NEW.lnGenNum 		= sCustom.lnGenNum;

						sITEM_NEW.cDAMAGE 		= sCustom.cDAMAGE;
						sITEM_NEW.cDEFENSE 		= sCustom.cDEFENSE;
						
						sITEM_NEW.cRESIST_FIRE 		= sCustom.cRESIST_FIRE;
						sITEM_NEW.cRESIST_ICE 		= sCustom.cRESIST_ICE;
						sITEM_NEW.cRESIST_ELEC 		= sCustom.cRESIST_ELEC;
						sITEM_NEW.cRESIST_POISON 		= sCustom.cRESIST_POISON;
						sITEM_NEW.cRESIST_SPIRIT 		= sCustom.cRESIST_SPIRIT;
						
						sITEM_NEW.dwPetID 			= sCustom.dwPetID;
						sITEM_NEW.dwVehicleID 		= sCustom.dwVehicleID;
						sITEM_NEW.bVietnamGainItem  = sCustom.bVietnamGainItem;
						sITEM_NEW.bWrap				= sCustom.bWrap;
						sITEM_NEW.bNonDrop			= sCustom.bNonDrop;
						//sITEM_NEW.dwOwnerID 		= sCustom.dwOwnerID;
						//sITEM_NEW.wColor 			= sCustom.wColor;

						if( sITEM_NEW.GENERATE_RANDOM_OPT() )
						{
							if ( sData1.nOption != -1 && pInvenItem->sItemCustom.isExistStat( (BYTE)sData1.emOpt, sData1.cDataValue ) )
							{
								sITEM_NEW.cOptTYPE1 	= sData1.emOpt;
								//sITEM_NEW.nOptVALUE1 	= sData1.fValue;
								sITEM_NEW.nOptVALUE1 	= sData1.cDataValue;

								//if( sITEM_NEW.cOptTYPE1 == EMR_OPT_DAMAGE || sITEM_NEW.cOptTYPE1 == EMR_OPT_DEFENSE || sITEM_NEW.cOptTYPE1 == EMR_OPT_HITRATE || sITEM_NEW.cOptTYPE1 == EMR_OPT_AVOIDRATE )
								//	sITEM_NEW.nOptVALUE1 = sData1.fValue * 100.0f;
								
								if( sITEM_NEW.cOptTYPE1 == sITEM_NEW.cOptTYPE2)
								{
									sITEM_NEW.cOptTYPE2 = 0;
									sITEM_NEW.nOptVALUE2 = 0;
								}
								if( sITEM_NEW.cOptTYPE1 == sITEM_NEW.cOptTYPE3)
								{
									sITEM_NEW.cOptTYPE3 = 0;
									sITEM_NEW.nOptVALUE3 = 0;
								}
								if( sITEM_NEW.cOptTYPE1 == sITEM_NEW.cOptTYPE4)
								{
									sITEM_NEW.cOptTYPE4 = 0;
									sITEM_NEW.nOptVALUE4 = 0;
								}
							}

							if ( sData2.nOption != -1 && pInvenItem->sItemCustom.isExistStat( (BYTE)sData2.emOpt, sData2.cDataValue ) )
							{
								sITEM_NEW.cOptTYPE2 	= sData2.emOpt;
								//sITEM_NEW.nOptVALUE2 	= sData2.fValue;
								sITEM_NEW.nOptVALUE2 	= sData2.cDataValue;

								//if( sITEM_NEW.cOptTYPE2 == EMR_OPT_DAMAGE || sITEM_NEW.cOptTYPE2 == EMR_OPT_DEFENSE || sITEM_NEW.cOptTYPE2 == EMR_OPT_HITRATE || sITEM_NEW.cOptTYPE2 == EMR_OPT_AVOIDRATE )
								//	sITEM_NEW.nOptVALUE2 = sData2.fValue * 100.0f;
								
								if( sITEM_NEW.cOptTYPE2 == sITEM_NEW.cOptTYPE3)
								{
									sITEM_NEW.cOptTYPE3 = 0;
									sITEM_NEW.nOptVALUE3 = 0;
								}
								if( sITEM_NEW.cOptTYPE2 == sITEM_NEW.cOptTYPE4)
								{
									sITEM_NEW.cOptTYPE4 = 0;
									sITEM_NEW.nOptVALUE4 = 0;
								}
							}

							GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
						}

						GLITEMLMT::GetInstance().ReqItemRoute( sRebuildItem, ID_CHAR, m_dwCharID, ID_CHAR, m_dwCharID, EMITEM_ROUTE_DELETE, sRebuildItem.wTurnNum );

						BOOL bDeleteOldItem = m_cInventory.DeleteItem( m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );
						if ( !bDeleteOldItem )
						{
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");
							CDebugSet::ToFileWithTime( "randobug.txt", "rando bug info start char:[%d] %s", m_dwCharID, m_szName );
							CDebugSet::ToFileWithTime( "randobug.txt", "failure to delete rebuild item [%04d~%04d]",  m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");

							GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
							netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
							GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
							return E_FAIL;
						}

						GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
						NetMsg_Inven_Delete.wPosX = m_sRebuildItem.wPosX;
						NetMsg_Inven_Delete.wPosY = m_sRebuildItem.wPosY;
						GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg_Inven_Delete );

						BOOL bInsertNewItem = m_cInventory.InsertItem ( sITEM_NEW, m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );
						if ( !bInsertNewItem )
						{
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");
							CDebugSet::ToFileWithTime( "randobug.txt", "rando bug info start char:[%d] %s", m_dwCharID, m_szName );
							CDebugSet::ToFileWithTime( "randobug.txt", "failure to insert new item [%04d~%04d] [%04d~%04d]",  sITEM_NEW.sNativeID.wMainID, sITEM_NEW.sNativeID.wSubID, m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");

							GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
							netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
							GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
							return E_FAIL;
						}

						SINVENITEM *pInsertItem = m_cInventory.GetItem ( m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );
						if ( !pInsertItem )
						{
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");
							CDebugSet::ToFileWithTime( "randobug.txt", "rando bug info start char:[%d] %s", m_dwCharID, m_szName );
							CDebugSet::ToFileWithTime( "randobug.txt", "failure to find new item [%04d~%04d]", m_sRebuildItem.wPosX, m_sRebuildItem.wPosY );
							CDebugSet::ToFileWithTime( "randobug.txt", "=============================");

							GLMSG::SNET_INVEN_REMODELOPEN_FB netmsgerror;
							netmsgerror.emFB = EMREQ_REMODELOPEN_FB_NOITEM;
							GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&netmsgerror);
							return E_FAIL;
						}

						GLITEMLMT::GetInstance().ReqItemRoute ( pInsertItem->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, m_dwCharID, EMITEM_ROUTE_CHAR, pInsertItem->sItemCustom.wTurnNum );

						GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
						NetMsg_Inven.Data = *pInsertItem;
						GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);

						pNetMsg->emResult = EMREBUILD_RESULT_SUCCESS;
						GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, pNetMsg );
					}
					else
					{
						pInvenItem->sItemCustom.GENERATE_RANDOM_OPT( false );

						GLITEMLMT::GetInstance().ReqRandomItem( sRebuildItem );

						GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
						NetItemUpdate.wPosX = m_sRebuildItem.wPosX;
						NetItemUpdate.wPosY = m_sRebuildItem.wPosY;
						NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
						GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetItemUpdate );

						pNetMsg->emResult = EMREBUILD_RESULT_SUCCESS;
						GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, pNetMsg );
					}
				}
			}
		}
		break;

	case EMREBUILD_RESULT_FAIL:
	case EMREBUILD_RESULT_DESTROY:	
	case EMREBUILD_RESULT_MONEY:	
	case EMREBUILD_RESULT_CLOSE:	
		{
			InitRebuildData();
			CloseRebuild();

			m_ItemRemodelPosX = EM_INVENSIZE_X;
			m_ItemRemodelPosY = EM_INVENSIZE_Y;
		}
		break;
	}

	return S_OK;
}

HRESULT GLChar::MsgReqGarbageResult( NET_MSG_GENERIC* nmg )	// ITEMREBUILD_MARK
{
	GLMSG::SNET_GARBAGE_RESULT* pNetMsg = (GLMSG::SNET_GARBAGE_RESULT*)nmg;

	//if( m_ItemGarbagePosX < EM_INVENSIZE_X && m_ItemGarbagePosY < EM_INVENSIZE_Y )
	{
		GLMSG::SNET_GARBAGE_RESULT_FB MsgFB;
		
		SINVENITEM* pINVENITEM_DEL = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );

		if ( !pINVENITEM_DEL )
		{
			MsgFB.emResult = EMGARBAGE_RESULT_FB_FAIL;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
			return E_FAIL;
		}

		SITEM* pItem = GLItemMan::GetInstance().GetItem( pINVENITEM_DEL->sItemCustom.sNativeID );
		if( !pItem ) //|| !pItem->sBasicOp.IsGarbage() )		
		{
			MsgFB.emResult = EMGARBAGE_RESULT_FB_ITEMTYPE;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
			return E_FAIL;
		}

		// ÆÖÄ«µåÀ̸鼭 ÆÖÀÌ È°¼ºÈ­ µÇ¾î ÀÖÀ¸¸é »èÁ¦ÇÒ¼ö ¾ø´Ù.
		if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD )
		{
			PGLPETFIELD pMyPet = GLGaeaServer::GetInstance().GetPET ( m_dwPetGUID );
			if ( pMyPet && pMyPet->IsValid () && pINVENITEM_DEL->sItemCustom.dwPetID == pMyPet->m_dwPetID ) 
			{
				MsgFB.emResult = EMGARBAGE_RESULT_FB_FAIL;
				GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
				return E_FAIL;
			}
		}
		
		/*SINVENITEM* pINVENITEM = m_cInventory.GetItem ( m_ItemGarbagePosX, m_ItemGarbagePosY );
		if ( !pINVENITEM )
		{
			MsgFB.emResult = EMGARBAGE_RESULT_FB_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
			return E_FAIL;
		}

		if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )	return E_FAIL;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
		if ( !pITEM || pITEM->sBasicOp.emItemType!=ITEM_GARBAGE_CARD )
		{
			MsgFB.emResult = EMGARBAGE_RESULT_FB_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
			return E_FAIL;
		}*/

		DoDrugInvenItem ( m_ItemGarbagePosX, m_ItemGarbagePosY );

		GLITEMLMT::GetInstance().ReqItemRoute( pINVENITEM_DEL->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, m_dwCharID, EMITEM_ROUTE_GARBAGE, pINVENITEM_DEL->sItemCustom.wTurnNum );

        
		{
			// Æê Ä«µå ÀÏ°æ¿ì
			if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD && pINVENITEM_DEL->sItemCustom.dwPetID != 0 )
			{
				PGLPETFIELD pMyPet = m_pGLGaeaServer->GetPET ( m_dwPetGUID );

				if ( pMyPet && pINVENITEM_DEL->sItemCustom.dwPetID == pMyPet->m_dwPetID ) 
				{
					m_pGLGaeaServer->ReserveDropOutPet ( SDROPOUTPETINFO(pMyPet->m_dwGUID,true,false) );

						// ÆÖÀÇ ¾Ç¼¼»ç¸®¸¦ °Ë»çÇÑ´Ù.
					pMyPet->UpdateTimeLmtItem ( this );

						// ³Ö¾îÁÙ²¨ ³Ö¾îÁØ´Ù.
					for ( WORD i = 0; i < ACCETYPESIZE; ++i )
					{
						CItemDrop cDropItem;
						cDropItem.sItemCustom = pMyPet->m_PutOnItems[i];
						if ( IsInsertToInven ( &cDropItem ) ) InsertToInven ( &cDropItem );
						else
						{
							if ( m_pLandMan )
							{
								m_pLandMan->DropItem ( m_vPos, 
														&(cDropItem.sItemCustom), 
														EMGROUP_ONE, 
														m_dwGaeaID );
							}
						}
					}

					CDeletePet* pDeletePet = new CDeletePet ( m_dwCharID, pINVENITEM_DEL->sItemCustom.dwPetID );
					GLDBMan* pDBMan = m_pGLGaeaServer->GetDBMan ();
					if ( pDBMan ) pDBMan->AddJob ( pDeletePet );
					
					// ÆÖÀÌ »èÁ¦µÇ¸é ºÎÈ°Á¤º¸¸¦ Ŭ¶óÀ̾ðÆ®¿¡ ¾Ë·ÁÁÜ.
					CGetRestorePetList *pGetRestorePetList = new CGetRestorePetList ( m_dwCharID, m_dwClientID );
					if ( pDBMan ) pDBMan->AddJob ( pGetRestorePetList );
				}
				else
				{
					// ¾Ç¼¼»ç¸®¸¦ üũÈÄ ÆÖÀ» DB¿¡¼­ »èÁ¦ÇØÁØ´Ù.
					GLPET* pNewPet = new GLPET ();
					CGetPet* pGetPet = new CGetPet ( pNewPet, 
														pINVENITEM_DEL->sItemCustom.dwPetID, 
														m_dwClientID, 
														m_dwCharID,
														pINVENITEM_DEL->wPosX,
														pINVENITEM_DEL->wPosY,
														true );
					GLDBMan* pDBMan = m_pGLGaeaServer->GetDBMan ();
					if ( pDBMan ) pDBMan->AddJob ( pGetPet );
				}
			}
			// Å»°ÍÀÏ °æ¿ì
			if ( pItem->sBasicOp.emItemType == ITEM_VEHICLE && pINVENITEM_DEL->sItemCustom.dwVehicleID != 0 )
			{
				// ¾Ç¼¼»ç¸®¸¦ üũÈÄ Å»°ÍÀ» DB¿¡¼­ »èÁ¦ÇØÁØ´Ù.
				GLVEHICLE* pNewVehicle = new GLVEHICLE();
				CGetVehicle* pGetVehicle = new CGetVehicle ( pNewVehicle, 
												pINVENITEM_DEL->sItemCustom.dwVehicleID, 
												m_dwClientID,
												m_dwCharID, 
												true );
				GLDBMan* pDBMan = m_pGLGaeaServer->GetDBMan ();
				if ( pDBMan ) pDBMan->AddJob ( pGetVehicle );		
			}
		}

		// Àκ¥Å丮¿¡¼­ ¾ÆÀÌÅÛ Á¦°Å
		m_cInventory.DeleteItem( pNetMsg->wPosX, pNetMsg->wPosY );

		MsgFB.emResult = EMGARBAGE_RESULT_FB_OK;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

		// »èÁ¦ÇÑ ¾ÆÀÌÅÛ Á¦°Å
		GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;
		NetMsg_Inven_Delete.wPosX = pNetMsg->wPosX;
		NetMsg_Inven_Delete.wPosY = pNetMsg->wPosY;
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg_Inven_Delete );	
		
		m_ItemGarbagePosX = EM_INVENSIZE_X;
		m_ItemGarbagePosY = EM_INVENSIZE_Y;

	}	

	return S_OK;
}

HRESULT GLChar::MsgReqRebuildMoveItem( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_REBUILD_MOVE_ITEM* pNetMsg = (GLMSG::SNET_REBUILD_MOVE_ITEM*)nmg;
	GLMSG::SNET_REBUILD_MOVE_ITEM NetMsg;

	m_sRebuildItem.RESET();

	if( pNetMsg->wPosX != USHRT_MAX && pNetMsg->wPosY != USHRT_MAX )
	{
		SINVENITEM* pResistItem = m_cInventory.GetItem( pNetMsg->wPosX, pNetMsg->wPosY );
		if( pResistItem )
		{
			// ÀåÂø ¾ÆÀÌÅÛÀ̾î¾ß ¹Ù²Ü ¼ö ÀÖ´Ù
			SITEM* pItem = GLItemMan::GetInstance().GetItem( pResistItem->sItemCustom.sNativeID );
			if( pItem && pItem->sBasicOp.emItemType == ITEM_SUIT )
			{
				// ·£´ý¿É¼Ç ÆÄÀÏÀÌ ÁöÁ¤µÇ¾î ÀÖ¾î¾ß °¡´ÉÇÏ´Ù
				if( strlen( pItem->sRandomOpt.szNAME ) > 3 )
				{
					NetMsg.wPosX = pNetMsg->wPosX;
					NetMsg.wPosY = pNetMsg->wPosY;

					m_sRebuildItem.SET( NetMsg.wPosX, NetMsg.wPosY );
				}
			}
		}
	}
	GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg );

	// °³Á¶ ºñ¿ë Àü¼Û
	MsgReqRebuildCostMoney();

	return S_OK;
}

HRESULT GLChar::MsgReqRebuildMoveSeal( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_REBUILD_MOVE_SEAL* pNetMsg = (GLMSG::SNET_REBUILD_MOVE_SEAL*)nmg;
	GLMSG::SNET_REBUILD_MOVE_SEAL NetMsg;

	m_sRebuildSeal.RESET();
	m_wSealType = 0;

	if( pNetMsg->wPosX != USHRT_MAX && pNetMsg->wPosY != USHRT_MAX )
	{
		SINVENITEM* pResistItem = m_cInventory.GetItem( pNetMsg->wPosX, pNetMsg->wPosY );
		if( pResistItem )
		{
			SITEM* pItem = GLItemMan::GetInstance().GetItem( pResistItem->sItemCustom.sNativeID );
			if( pItem && pItem->sBasicOp.emItemType == ITEM_SEALED_CARD )
			{
				NetMsg.wPosX = pNetMsg->wPosX;
				NetMsg.wPosY = pNetMsg->wPosY;

				m_sRebuildSeal.SET( NetMsg.wPosX, NetMsg.wPosY );
				m_wSealType = pItem->sSuitOp.wReModelNum;
			}
		}
	}

	GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg );

	return S_OK;
}
HRESULT GLChar::MsgReqRebuildCostMoney()
{
	GLMSG::SNET_REBUILD_COST_MONEY NetMsg;

	// °³Á¶ ¾ÆÀÌÅÛÀÌ ¾øÀ¸¹Ç·Î 0À» Àü¼ÛÇÑ´Ù
	if( !m_sRebuildItem.VALID() )
	{
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg );
		return S_OK;
	}

	// °³Á¶Ã¢¿¡ ¾ÆÀÌÅÛ ¿Ã¸±¶§ Á¡°ËÇßÀ¸¹Ç·Î ÀÌ·± °æ¿ì´Â ¹ß»ýÇÏÁö ¸»¾Æ¾ßÇÑ´Ù
	SITEMCUSTOM sRebuildItem = GET_REBUILD_ITEM();
	SITEM* pItem = GLItemMan::GetInstance().GetItem( sRebuildItem.sNativeID );
	if( !pItem )
	{
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg );
		return S_OK;
	}

	// °³Á¶Ã¢¿¡ ¾ÆÀÌÅÛ ¿Ã¸±¶§ Á¡°ËÇßÀ¸¹Ç·Î ÀÌ·± °æ¿ì´Â ¹ß»ýÇÏÁö ¸»¾Æ¾ßÇÑ´Ù
	SRANDOM_GEN* pRANDOM_SET = GLItemMan::GetInstance().GetItemRandomOpt( sRebuildItem.sNativeID );
	if( !pRANDOM_SET )
	{
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg );
		return S_OK;
	}

	m_i64RebuildCost = (LONGLONG)( pItem->sBasicOp.dwBuyPrice * pRANDOM_SET->fS_value );

	NetMsg.i64CostMoney = m_i64RebuildCost;

	GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg );

	return S_OK;
}

HRESULT GLChar::MsgReqRebuildInputMoney( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_REBUILD_INPUT_MONEY* pNetMsg = (GLMSG::SNET_REBUILD_INPUT_MONEY*)nmg;

	m_i64RebuildInput = (LONGLONG)max( 0, pNetMsg->i64InputMoney );
	m_i64RebuildInput = (LONGLONG)min( m_i64RebuildInput, m_lnMoney );

	pNetMsg->i64InputMoney = m_i64RebuildInput;

	GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, pNetMsg );

	return S_OK;
}

HRESULT	GLChar::MsgGiveFood ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPET_REQ_GIVEFOOD* pNetMsg = ( GLMSG::SNETPET_REQ_GIVEFOOD* ) nmg;
	
	GLMSG::SNETPET_REQ_GIVEFOOD_FB NetMsgFB;
	SNATIVEID sNativeID;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem ) 
	{
		NetMsgFB.emFB = EMPET_REQ_GIVEFOOD_FB_INVALIDCARD;
		return E_FAIL;
	}

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem ) 
	{
		NetMsgFB.emFB = EMPET_REQ_GIVEFOOD_FB_INVALIDCARD;
		return E_FAIL;
	}

	// ÆÖÄ«µå ¿©ºÎ üũ
	if ( pItem->sBasicOp.emItemType != ITEM_PET_CARD )	
	{
		NetMsgFB.emFB = EMPET_REQ_GIVEFOOD_FB_INVALIDCARD;
		return E_FAIL;
	}

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold ) 
	{
		NetMsgFB.emFB = EMPET_REQ_GIVEFOOD_FB_INVALIDFOOD;
		return E_FAIL;
	}

	if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) return E_FAIL;

	// »ç·á ¿©ºÎ üũ
	if ( pHold->sBasicOp.emItemType != ITEM_PET_FOOD )	
	{
		NetMsgFB.emFB = EMPET_REQ_GIVEFOOD_FB_INVALIDFOOD;
		return E_FAIL;
	}

	// ¾ÆÀÌÅÛ Á¤º¸°¡ ¼­·Î Ʋ¸®¸é ½ÇÇàÇÏÁö ¾Ê´Â´Ù.
	SITEM* pPutOnItem = GLItemMan::GetInstance().GetItem ( m_PutOnItems[SLOT_HOLD].sNativeID );
	if( pHold != pPutOnItem )
	{
		NetMsgFB.emFB = EMPET_REQ_GIVEFOOD_FB_INVALIDFOOD;
		return E_FAIL;
	}

	sNativeID = pHold->sBasicOp.sNativeID;

	switch ( pHold->sDrugOp.emDrug )
	{
	case ITEM_DRUG_HP:
		{
			PGLPETFIELD pMyPet = GLGaeaServer::GetInstance().GetPET ( m_dwPetGUID );

			// Logic ¿¡ ÆÖÀÌ ÀÖ´Ù¸é
			if ( pMyPet && pMyPet->m_dwPetID == pInvenItem->sItemCustom.dwPetID )
			{
				// Æê »ç·á¸Ô±â ÀÌÀü ·Î±×
				GLITEMLMT::GetInstance().ReqPetAction(	pMyPet->m_dwPetID, 
														pInvenItem->sItemCustom.sNativeID, 
														EMPET_ACTION_FOOD_BEFORE, 
														pMyPet->m_nFull );

				bool bOK = pMyPet->IncreaseFull ( pHold->sDrugOp.wCureVolume, pHold->sDrugOp.bRatio );
				if ( !bOK ) return E_FAIL;
				
				if ( pMyPet->IsValid () )	pMyPet->m_fTIMER = 0.0f;

				DoDrugSlotItem ( SLOT_HOLD );

				// Æê »ç·á¸Ô±â ÀÌÈÄ ·Î±×
				GLITEMLMT::GetInstance().ReqPetAction(	pMyPet->m_dwPetID, 
														pInvenItem->sItemCustom.sNativeID, 
														EMPET_ACTION_FOOD_AFTER, 
														pMyPet->m_nFull );

				// ÆÖ¿¡°Ô ¸ÔÀ̸¦ ÁØ´Ù.
				NetMsgFB.emFB	   = EMPET_REQ_GIVEFOOD_FB_OK;
				NetMsgFB.dwPetID   = pMyPet->m_dwPetID;
				NetMsgFB.sNativeID = sNativeID;
				NetMsgFB.nFull	   = pMyPet->m_nFull;
				GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsgFB );
			}
			// ¾ÆÁ÷ Logic ¿¡ ÆÖÀÌ ¾ø´Ù¸é
			else
			{
				// ÆÖ »ý¼º¿©ºÎ È®ÀÎ
				if (pInvenItem->sItemCustom.dwPetID <= 0 )
				{
					GLGaeaServer::GetInstance().GetConsoleMsg()->Write ( LOG_TEXT_CONSOLE, "Invalid ID, PetID %d dwClientID %d", 
						pInvenItem->sItemCustom.dwPetID, m_dwClientID );
					return E_FAIL;
				}

				// ÆÖÀÇ Æ÷¸¸°¨À» °¡Á®¿Í¼­ °»½ÅÇÏ°í ´Ù½Ã DB¿¡ ÀúÀåÇÏ´Â ÄÚµå
				CGetPetFull* pDbAction = new CGetPetFull ( m_dwCharID, 
														   pInvenItem->sItemCustom.dwPetID, 
														   m_dwClientID,
														   pHold->sDrugOp.wCureVolume, 
														   pHold->sDrugOp.bRatio,
														   sNativeID,
														   pNetMsg->emPetTYPE );

				GLDBMan* pDBMan = GLGaeaServer::GetInstance().GetDBMan ();
				if ( pDBMan ) pDBMan->AddJob ( pDbAction );
			}
		}
		break;

	default:
		break;
	}

	return S_OK;
}

HRESULT GLChar::MsgGetPetFullFromDB ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPET_REQ_GETFULL_FROMDB_FB* pIntMsg = ( GLMSG::SNETPET_REQ_GETFULL_FROMDB_FB* ) nmg;
	switch ( pIntMsg->emFB )
	{
	case EMPET_REQ_GETFULL_FROMDB_FAIL:
		{
			GLMSG::SNETPET_REQ_GIVEFOOD_FB NetMsgFB;
			NetMsgFB.emFB = EMPET_REQ_GETFULL_FROMDB_FAIL;
			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsgFB );
		}
		break;

	case EMPET_REQ_GETFULL_FROMDB_OK:
		{
			//	¼Õ¿¡ µç ¾ÆÀÌÅÛ È®ÀÎÇÑ´Ù.
			//	¾ÆÀÌÅÛÀÌ ¹Ù²î´Â °æ¿ì°¡ ÀÖ´Ù.
			SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
			if ( !pHold ) 
			{
				GLGaeaServer::GetInstance().GetConsoleMsg()->Write ( LOG_TEXT_CONSOLE, 
					"Pet Give Full Error CharID : %d", m_dwCharID );
					
				return E_FAIL;
			}

			if (  pHold->sBasicOp.emItemType != ITEM_PET_FOOD || pHold->sBasicOp.sNativeID != pIntMsg->sNativeID ) 
			{
				GLGaeaServer::GetInstance().GetConsoleMsg()->Write ( LOG_TEXT_CONSOLE, 
					"Pet Give Full Error CharID : %d, Item %d/%d", m_dwCharID,
					pHold->sBasicOp.sNativeID.wMainID, pHold->sBasicOp.sNativeID.wSubID  );
					
				return E_FAIL;

			}

			// Æê Æ÷¸¸°¨ ÀÌÀü ·Î±×
			GLITEMLMT::GetInstance().ReqPetAction(	pIntMsg->dwPetID, 
													pIntMsg->sNativeID,
													EMPET_ACTION_FOOD_BEFORE, 
													pIntMsg->nFull );

			int nFull = pIntMsg->nFull;
			int nMaxFull = GLCONST_PET::pGLPET[pIntMsg->emType]->m_nFull;
			if ( nFull >= nMaxFull ) break;

			if ( pIntMsg->bRatio )
			{
				nFull += ( nMaxFull*pIntMsg->wCureVolume )/100;
				if ( nFull > nMaxFull ) nFull = nMaxFull;
			}
			else
			{
				nFull += pIntMsg->wCureVolume;
				if ( nFull > nMaxFull ) nFull = nMaxFull;
			}

			CSetPetFull* pDbAction = new CSetPetFull( m_dwCharID, pIntMsg->dwPetID, nFull );
			GLDBMan* pDbMan = GLGaeaServer::GetInstance().GetDBMan ();
			if ( pDbMan ) pDbMan->AddJob ( pDbAction );
			DoDrugSlotItem ( SLOT_HOLD );

			// Æê Æ÷¸¸°¨ ÀÌÀü ·Î±×
			GLITEMLMT::GetInstance().ReqPetAction(	pIntMsg->dwPetID,
													pIntMsg->sNativeID,
													EMPET_ACTION_FOOD_AFTER,
													nFull );

			GLMSG::SNETPET_REQ_GIVEFOOD_FB NetMsgFB;
			NetMsgFB.emFB	   = EMPET_REQ_GIVEFOOD_FB_OK;
			NetMsgFB.dwPetID   = pIntMsg->dwPetID;
			NetMsgFB.sNativeID = pIntMsg->sNativeID;
			NetMsgFB.nFull	   = nFull;
			GLGaeaServer::GetInstance().SENDTOCLIENT ( m_dwClientID, &NetMsgFB );
		}
	}

	return S_OK;
}

HRESULT GLChar::MsgReqMGameOddEvenEvent( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNETPC_MGAME_ODDEVEN* pNetMsg = ( GLMSG::SNETPC_MGAME_ODDEVEN* )nmg;
	GLMSG::SNETPC_MGAME_ODDEVEN_FB NetMsgFB;

	// Ȧ¦°ÔÀÓNPC À¯È¿¼º üũ
	PGLCROW pCrow = m_pLandMan->GetCrow ( pNetMsg->dwNPCID );
	if ( !pCrow )
	{
		NetMsgFB.emResult = EMMGAME_ODDEVEN_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsgFB );

		return E_FAIL;
	}

	float fDist = D3DXVec3Length ( &D3DXVECTOR3(m_vPos-pCrow->GetPosition()) );
	float fTalkRange = (float) (pCrow->GetBodyRadius() + GETBODYRADIUS() + 30);
	float fTalkableDis = fTalkRange + 20;

	// Ȧ¦°ÔÀÓNPC °Å¸® üũ
	if ( fDist>fTalkableDis )
	{
		NetMsgFB.emResult = EMMGAME_ODDEVEN_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsgFB );

		return E_FAIL;
	}

	switch( pNetMsg->emEvent )
	{
	case EMMGAME_ODDEVEN_OK:		return MGOddEvenOK(pNetMsg);
	case EMMGAME_ODDEVEN_CANCEL:	return MGOddEvenCANCEL(pNetMsg);
	case EMMGAME_ODDEVEN_SELECT:	return MGOddEvenSelect(pNetMsg);
	case EMMGAME_ODDEVEN_AGAIN_OK:	return MGOddEvenAGAIN(pNetMsg);
	case EMMGAME_ODDEVEN_SHUFFLE:	return MGOddEvenShuffle(pNetMsg);
	case EMMGAME_ODDEVEN_FINISH:	return MGOddEvenFinish(pNetMsg);
	default:
		{
			// ÀûÀýÇÑ À̺¥Æ®°¡ ¾Æ´Ï¶ó¼­ °ÔÀÓ Ãë¼Ò
			NetMsgFB.emResult = EMMGAME_ODDEVEN_FB_FAIL;
			GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsgFB );

			return S_FALSE;
		}
		break;
	}

	return S_OK;
}


HRESULT GLChar::MsgReqItemMix( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_ITEM_MIX* pNetMsg = (GLMSG::SNET_INVEN_ITEM_MIX*)nmg;
	GLMSG::SNET_INVEN_ITEM_MIX_FB	NetMsgFB;


	SINVENITEM* pInvenItem[ITEMMIX_ITEMNUM];

	//	NPCÈ®ÀÎ
		// NPC üũ 
	
	
	//	Á¶ÇÕ È®ÀÎ
	const ITEM_MIX* pItemMix = GLItemMixMan::GetInstance().GetItemMix( pNetMsg->dwKey );
	if ( !pItemMix ) 
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_NOMIX;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	±Ý¾× È®ÀÎ 
	if( m_lnMoney < pItemMix->dwPrice )
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_NOMONEY;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	Àκ¥ ¾ÆÀÌÅÛ È®ÀÎ
	for ( int i =0; i < ITEMMIX_ITEMNUM; ++i ) 
	{
		if( !pNetMsg->sInvenPos[i].VALID() ) continue;
		
		pInvenItem[i] = m_cInventory.GetItem ( pNetMsg->sInvenPos[i].wPosX, pNetMsg->sInvenPos[i].wPosY );
		if ( !pInvenItem[i] ) 
		{
			NetMsgFB.emFB = EMITEM_MIX_FB_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}

		SITEM* pItem = GLItemMan::GetInstance().GetItem( pInvenItem[i]->sItemCustom.sNativeID );

		if ( !pItem ) 
		{
			NetMsgFB.emFB = EMITEM_MIX_FB_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}
	}


	for ( int i =0; i < ITEMMIX_ITEMNUM; ++i ) 
	{
		if ( pItemMix->sMeterialItem[i].sNID == NATIVEID_NULL() ) continue;

		if ( pItemMix->sMeterialItem[i].nNum != pInvenItem[i]->sItemCustom.wTurnNum )
		{
			NetMsgFB.emFB = EMITEM_MIX_FB_NOMIXNUM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}
	}


	//	°á°ú ¾ÆÀÌÅÛ Ã¼Å©
	SITEM* pItemResult = GLItemMan::GetInstance().GetItem( pItemMix->sResultItem.sNID );
	if ( !pItemResult ) 
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}


	WORD wInsertPosX, wInsertPosY;
	BOOL bOk = m_cInventory.FindInsrtable ( pItemResult->sBasicOp.wInvenSizeX, pItemResult->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );
	if ( !bOk )
	{
		//	ºÒ°¡´ÉÇÑ °æ¿ì ÀÔ´Ï´Ù.
		NetMsgFB.emFB = EMITEM_MIX_FB_NOINVEN;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;	//	Àκ¥ °ø°£ ºÎÁ·À¸·Î µÇµ¹¸² ½ÇÆÐ.
	}

	GLMSG::SNETPC_INVEN_DELETE NetMsg_Inven_Delete;

	//	Á¶ÇÕ ¾ÆÀÌÅÛ »èÁ¦
	for ( int i =0; i < ITEMMIX_ITEMNUM; ++i )
	{
		if( !pNetMsg->sInvenPos[i].VALID() ) continue;

		GLITEMLMT::GetInstance().ReqItemRoute( pInvenItem[i]->sItemCustom, ID_CHAR, m_dwCharID, ID_CHAR, 0, 
			EMITEM_ROUTE_ITEMMIX, pInvenItem[i]->sItemCustom.wTurnNum );
		
		m_cInventory.DeleteItem( pInvenItem[i]->wPosX, pInvenItem[i]->wPosY );
		
		NetMsg_Inven_Delete.wPosX = pNetMsg->sInvenPos[i].wPosX;
		NetMsg_Inven_Delete.wPosY = pNetMsg->sInvenPos[i].wPosY;
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsg_Inven_Delete );	
	}

	//	¼ÒÁö±Ý 
	if ( pItemMix->dwPrice > 0 )
	{
		CheckMoneyUpdate( m_lnMoney, pItemMix->dwPrice, FALSE, "ITEM_MIX" );
		m_bMoneyUpdate = TRUE;

		m_lnMoney -= pItemMix->dwPrice;

		GLMSG::SNETPC_UPDATE_MONEY NetMsgMoney;
		NetMsgMoney.lnMoney = m_lnMoney;
		//add money 2
		NetMsgMoney.lnVoteP = m_lnVoteP;
		//add money 3
		NetMsgMoney.lnPremP = m_lnPremP;
		//add contributionpoints by CNDev
		NetMsgMoney.lnContribP = m_lnContribP;
		GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsgMoney );
	}

	//	½ÇÆÐÇßÀ» °æ¿ì
	float fRate = (float)pItemMix->dwRate;
	if ( !RANDOM_GEN( fRate ) )
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return S_OK;	
	}

	//	°á°ú ¾ÆÀÌÅÛ »ý¼º
	SITEMCUSTOM sITEM_NEW;
	sITEM_NEW.sNativeID = pItemMix->sResultItem.sNID;
	sITEM_NEW.tBORNTIME = CTime::GetCurrentTime().GetTime();
	sITEM_NEW.wTurnNum = pItemMix->sResultItem.nNum;
	sITEM_NEW.cGenType = EMGEN_ITEMMIX;
	sITEM_NEW.cChnID = (BYTE)m_pGLGaeaServer->GetServerChannel();
	sITEM_NEW.cFieldID = (BYTE)m_pGLGaeaServer->GetFieldSvrID();
	sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

	//	·£´ý ¿É¼Ç »ý¼º.
	if( sITEM_NEW.GENERATE_RANDOM_OPT() )
	{
		GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
	}

	//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
	m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
	SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

	if ( !pINSERT_ITEM )
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_FAIL;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	GLITEMLMT::GetInstance().ReqItemRoute ( pINSERT_ITEM->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, 
		EMITEM_ROUTE_ITEMMIX, pINSERT_ITEM->sItemCustom.wTurnNum );

	//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
	GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
	NetMsg_Inven.Data = *pINSERT_ITEM;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);


	NetMsgFB.emFB = EMITEM_MIX_FB_OK;
	NetMsgFB.sNativeID	= pINSERT_ITEM->sItemCustom.sNativeID;
	NetMsgFB.wTurnNum = pINSERT_ITEM->sItemCustom.wTurnNum;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
	
	return S_OK;
}

//dmk14 | 12-9-16 | item compound
HRESULT GLChar::MsgReqItemCompound( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_ITEM_MIX* pNetMsg = (GLMSG::SNET_INVEN_ITEM_MIX*)nmg;
	GLMSG::SNET_INVEN_ITEM_MIX_FB	NetMsgFB;



	//	Á¶ÇÕ È®ÀÎ
	const ITEM_MIX* pItemMix = GLItemMixMan::GetInstance().GetItemMix( pNetMsg->dwKey );
	if ( !pItemMix ) 
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_NOMIX;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	±Ý¾× È®ÀÎ 
	if( m_lnMoney < pItemMix->dwPrice )
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_NOMONEY;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	//	Àκ¥ ¾ÆÀÌÅÛ È®ÀÎ
	for ( int i =0; i < ITEMMIX_ITEMNUM; ++i ) 
	{
		if(	pItemMix->sMeterialItem[i].sNID == NATIVEID_NULL() )	continue;

		GLInventory::CELL_MAP_ITER iter = m_cInventory.GetItemList()->begin();
		GLInventory::CELL_MAP_ITER iter_end = m_cInventory.GetItemList()->end();

		bool bFind = false;
		bool bCount = false;
		DWORD wCount = 0;
		for ( ; iter!=iter_end; ++iter )
		{
			SINVENITEM* pInvenItem = (*iter).second;
			if( pInvenItem->sItemCustom.sNativeID == pItemMix->sMeterialItem[i].sNID )
			{
				bFind = true;
				wCount += pInvenItem->sItemCustom.wTurnNum;

				SITEM* pItem = GLItemMan::GetInstance().GetItem( pInvenItem->sItemCustom.sNativeID );
				if ( !pItem ) 
				{
					NetMsgFB.emFB = EMITEM_MIX_FB_NOITEM;
					GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
					return E_FAIL;
				}
			}
		}

		bCount = ( wCount >= pItemMix->sMeterialItem[i].nNum )	?	true : false;

		if ( !bFind ) 
		{
			NetMsgFB.emFB = EMITEM_MIX_FB_NOITEM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}

		if ( !bCount )
		{
			NetMsgFB.emFB = EMITEM_MIX_FB_NOMIXNUM;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}	
	}

	SITEM* pItemResult = GLItemMan::GetInstance().GetItem( pItemMix->sResultItem.sNID );
	if ( !pItemResult ) 
	{
		NetMsgFB.emFB = EMITEM_MIX_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
		return E_FAIL;
	}

	    WORD wInsertPosX, wInsertPosY;

		BOOL bOk = m_cInventory.FindInsrtable ( pItemResult->sBasicOp.wInvenSizeX, pItemResult->sBasicOp.wInvenSizeY, wInsertPosX, wInsertPosY );

		if ( !bOk )
		{
			//	ºÒ°¡´ÉÇÑ °æ¿ì ÀÔ´Ï´Ù.
			NetMsgFB.emFB = EMITEM_MIX_FB_NOINVEN;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;	//	Àκ¥ °ø°£ ºÎÁ·À¸·Î µÇµ¹¸² ½ÇÆÐ.
		}

		for ( int i =0; i < ITEMMIX_ITEMNUM; ++i )
		{
			if(	pItemMix->sMeterialItem[i].sNID == NATIVEID_NULL() )	continue;

			GLInventory::CELL_MAP_ITER iter = m_cInventory.GetItemList()->begin();
			GLInventory::CELL_MAP_ITER iter_end = m_cInventory.GetItemList()->end();

		    
			BYTE wCount = pItemMix->sMeterialItem[i].nNum;
			for ( ; iter!=iter_end; ++iter )
			{
				SINVENITEM* pInvenItem = (*iter).second;
				SITEM* pItem = GLItemMan::GetInstance().GetItem( pItemMix->sMeterialItem[i].sNID );
				
				if( pInvenItem->sItemCustom.sNativeID == pItemMix->sMeterialItem[i].sNID ) CheckMixMaterial( TRUE );
				else continue;

				   if ( bCheckMixMaterial )
				   {
				      if( pItem->ISPILE() )  
					  {
						  try{
					      DeletePileItem( pInvenItem->sItemCustom.sNativeID, wCount );	
						  break;
						  }
						  catch( std::exception const &DebugFile )
						  {
							  CDebugSet::ToLogFile ( "DebugSet Itemix Material" );
						  }
					  }
				      else
					  {
						  DeleteItem( pInvenItem->sItemCustom.sNativeID );	
						  break;
					  }
				   }
			 }
		}

		//	¼ÒÁö±Ý 
		if ( pItemMix->dwPrice > 0 )
		{
			CheckMoneyUpdate( m_lnMoney, pItemMix->dwPrice, FALSE, "ITEM_MIX" );
			m_bMoneyUpdate = TRUE;

			m_lnMoney -= pItemMix->dwPrice;

			GLMSG::SNETPC_UPDATE_MONEY NetMsgMoney;
			NetMsgMoney.lnMoney = m_lnMoney;
			GLGaeaServer::GetInstance().SENDTOCLIENT( m_dwClientID, &NetMsgMoney );
		}

		//	½ÇÆÐÇßÀ» °æ¿ì
		float fRate = (float)pItemMix->dwRate;
		if ( !RANDOM_GEN( fRate ) )
		{
			NetMsgFB.emFB = EMITEM_MIX_FB_FAIL;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return S_OK;	
		}

		//	°á°ú ¾ÆÀÌÅÛ »ý¼º
		SITEMCUSTOM sITEM_NEW;
		sITEM_NEW.sNativeID = pItemMix->sResultItem.sNID;
		sITEM_NEW.tBORNTIME = CTime::GetCurrentTime().GetTime();
		sITEM_NEW.wTurnNum = pItemMix->sResultItem.nNum;
		sITEM_NEW.cGenType = EMGEN_ITEMMIX;
		sITEM_NEW.cChnID = (BYTE)m_pGLGaeaServer->GetServerChannel();
		sITEM_NEW.cFieldID = (BYTE)m_pGLGaeaServer->GetFieldSvrID();
		sITEM_NEW.lnGenNum = GLITEMLMT::GetInstance().RegItemGen ( sITEM_NEW.sNativeID, (EMITEMGEN)sITEM_NEW.cGenType );

		//	·£´ý ¿É¼Ç »ý¼º.
		if( sITEM_NEW.GENERATE_RANDOM_OPT() )
		{
			GLITEMLMT::GetInstance().ReqRandomItem( sITEM_NEW );
		}

		//	µé°íÀÖ´ø ¾ÆÀÌÅÆ Àι꿡 ³ÖÀ½.
		m_cInventory.InsertItem ( sITEM_NEW, wInsertPosX, wInsertPosY );
		SINVENITEM *pINSERT_ITEM = m_cInventory.GetItem ( wInsertPosX, wInsertPosY );

		if ( !pINSERT_ITEM )
		{
			NetMsgFB.emFB = EMITEM_MIX_FB_FAIL;
			GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);
			return E_FAIL;
		}

		GLITEMLMT::GetInstance().ReqItemRoute ( pINSERT_ITEM->sItemCustom, ID_CHAR, 0, ID_CHAR, m_dwCharID, 
			EMITEM_ROUTE_ITEMMIX, pINSERT_ITEM->sItemCustom.wTurnNum );

		//	[Àڽſ¡°Ô] ¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_INVEN_INSERT NetMsg_Inven;
		NetMsg_Inven.Data = *pINSERT_ITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg_Inven);


		NetMsgFB.emFB = EMITEM_MIX_FB_OK;
		NetMsgFB.sNativeID	= pINSERT_ITEM->sItemCustom.sNativeID;
		NetMsgFB.wTurnNum = pINSERT_ITEM->sItemCustom.wTurnNum;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgFB);

		CheckMixMaterial( FALSE );
		
		return S_OK;
}


bool GLChar::DeleteItem ( SNATIVEID sNID )
{
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sNID );
	if ( !pItem )				return false;
	if ( pItem->ISPILE() )		return false;

	WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
	WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

	std::vector<SNATIVEID>	vecDEL;

	//	Note : ´õ °ãÃÄÁú¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ÀÖ´ÂÁö °Ë»çÇÏ¿© Àκ¥¿¡ µé¾î°¡¾ßÇÏ´Â
	//		¾ÆÀÌÅÛ Á¡°Ë ¼ýÀÚ¸¦ °¨¼Ò½ÃÅ´.
	GLInventory::CELL_MAP &ItemMap = *m_cInventory.GetItemList();
	GLInventory::CELL_MAP_ITER iter = ItemMap.begin();
	for ( ; iter!=ItemMap.end(); ++iter )
	{
		SINVENITEM &sINVENITEM = *(*iter).second;
		SITEMCUSTOM &sITEMCUSTOM = sINVENITEM.sItemCustom;
		if ( sITEMCUSTOM.sNativeID != sNID )		continue;

		sITEMCUSTOM.wTurnNum = 0;
		vecDEL.push_back ( SNATIVEID(sINVENITEM.wPosX,sINVENITEM.wPosY) );
		break;
	}

	if ( !vecDEL.size() )	return true;

	for ( DWORD i=0; i<vecDEL.size(); ++i )
	{
		m_cInventory.DeleteItem ( vecDEL[i].wMainID, vecDEL[i].wSubID );

		//	Note : »èÁ¦ ¸Þ½ÃÁö.
		GLMSG::SNETPC_INVEN_DELETE NetMsgDelete;
		NetMsgDelete.wPosX = vecDEL[i].wMainID;
		NetMsgDelete.wPosY = vecDEL[i].wSubID;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsgDelete);
	}

	return true;
}
HRESULT GLChar::MsgReqInvenWrap ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_WRAP *pNetMsg = (GLMSG::SNET_INVEN_WRAP *)nmg;

	if ( !VALID_HOLD_ITEM() )							
		return S_FALSE;

	SITEMCUSTOM& sHOLDITEM = m_PutOnItems[SLOT_HOLD];
	
	SITEM* pHold = GLItemMan::GetInstance().GetItem ( sHOLDITEM.sNativeID );
	if ( !pHold )										
		return E_FAIL;

	if ( pHold->sBasicOp.emItemType != ITEM_WRAPPER  )			
		return S_FALSE;

	if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) 
		return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )									
		return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )										
		return S_FALSE;

	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
		return S_FALSE;

	if ( pItem->sBasicOp.emItemType == ITEM_SUIT )
	{
		if ( pItem->sSuitOp.emSuit > SUIT_HANDHELD )
			return S_FALSE;
	}

	if ( pInvenItem->sItemCustom.IsWrap() )
		return S_FALSE;

	DoDrugSlotItem( SLOT_HOLD );

	pInvenItem->sItemCustom.bWrap = true;

	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
	NetItemUpdate.wPosX = pNetMsg->wPosX;
	NetItemUpdate.wPosY = pNetMsg->wPosY;
	NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);

	return S_OK;
}
HRESULT GLChar::MsgReqInvenRemoveWrap ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_REMOVE_WRAP *pNetMsg = (GLMSG::SNET_INVEN_REMOVE_WRAP *)nmg;

	SINVENITEM* pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )									
		return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )										
		return S_FALSE;

	if ( !pInvenItem->sItemCustom.IsWrap() )
		return S_FALSE;

	pInvenItem->sItemCustom.bWrap = false;

	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
	NetItemUpdate.wPosX = pNetMsg->wPosX;
	NetItemUpdate.wPosY = pNetMsg->wPosY;
	NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);


	return S_OK;
}
//nondrop card Eduj
HRESULT GLChar::MsgReqNonDrop ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_NONDROP *pNetMsg = (GLMSG::SNET_INVEN_NONDROP *)nmg;

	if ( !VALID_HOLD_ITEM() )							
		return S_FALSE;

	SITEMCUSTOM& sHOLDITEM = m_PutOnItems[SLOT_HOLD];
	
	SITEM* pHold = GLItemMan::GetInstance().GetItem ( sHOLDITEM.sNativeID );
	if ( !pHold )										
		return E_FAIL;

	if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) 
		return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )									
		return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )										
		return S_FALSE;

	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
		return S_FALSE;


	if ( pInvenItem->sItemCustom.IsNonDrop() )
		return S_FALSE;

	DoDrugSlotItem( SLOT_HOLD );

	pInvenItem->sItemCustom.bNonDrop = true;

	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
	NetItemUpdate.wPosX = pNetMsg->wPosX;
	NetItemUpdate.wPosY = pNetMsg->wPosY;
	NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);

	GLMSG::SNET_INVEN_NONDROP_FB NetMsgBrd;
	NetMsgBrd.bNonDrop = TRUE;
    SITEM* pItemData = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	std::string strItemName = pItemData->GetName();
    StringCchCopy ( NetMsgBrd.szItemName, GLMSG::SNET_INVEN_NONDROP_FB::MAX_ITEM_NAME, strItemName.c_str() ); 
    StringCchCopy ( NetMsgBrd.szName, CHAR_SZNAME, m_szName );	
	GLGaeaServer::GetInstance().SENDTOAGENT ( &NetMsgBrd );


	return S_OK;
}

HRESULT GLChar::MsgReqRemoveNonDrop ( NET_MSG_GENERIC* nmg )
{
	GLMSG::SNET_INVEN_REMOVE_NONDROP *pNetMsg = (GLMSG::SNET_INVEN_REMOVE_NONDROP *)nmg;

	if ( !VALID_HOLD_ITEM() )							
		return S_FALSE;

	SITEMCUSTOM& sHOLDITEM = m_PutOnItems[SLOT_HOLD];
	
	SITEM* pHold = GLItemMan::GetInstance().GetItem ( sHOLDITEM.sNativeID );
	if ( !pHold )										
		return E_FAIL;

	if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) 
		return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pInvenItem )									
		return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )										
		return S_FALSE;

	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
		return S_FALSE;

	if ( !pInvenItem->sItemCustom.IsNonDrop() )
		return S_FALSE;

	DoDrugSlotItem( SLOT_HOLD );

	pInvenItem->sItemCustom.bNonDrop = false;

	GLITEMLMT::GetInstance().ReqItemConversion ( pInvenItem->sItemCustom, ID_CHAR, m_dwCharID );

	GLMSG::SNET_INVEN_ITEM_UPDATE NetItemUpdate;
	NetItemUpdate.wPosX = pNetMsg->wPosX;
	NetItemUpdate.wPosY = pNetMsg->wPosY;
	NetItemUpdate.sItemCustom = pInvenItem->sItemCustom;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetItemUpdate);

	GLMSG::SNET_INVEN_REMOVE_NONDROP_FB NetMsgBrd;
	NetMsgBrd.bNonDrop = FALSE;
    SITEM* pItemData = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	std::string strItemName = pItemData->GetName();
    StringCchCopy ( NetMsgBrd.szItemName, GLMSG::SNET_INVEN_REMOVE_NONDROP_FB::MAX_ITEM_NAME, strItemName.c_str() ); 
    StringCchCopy ( NetMsgBrd.szName, CHAR_SZNAME, m_szName );	
	GLGaeaServer::GetInstance().SENDTOAGENT ( &NetMsgBrd );


	return S_OK;
}
//Change School
HRESULT GLChar::MsgReqInvenSchoolChange ( NET_MSG_GENERIC* nmg ) //Added by Mharlon
{
	GLMSG::SNETPC_INVEN_SCHOOL_CHANGE *pNetMsg = (GLMSG::SNETPC_INVEN_SCHOOL_CHANGE *)nmg;

	GLMSG::SNETPC_INVEN_SCHOOL_CHANGE_FB MsgFB;

	SINVENITEM* pINVENITEM = m_cInventory.GetItem ( pNetMsg->wPosX, pNetMsg->wPosY );
	if ( !pINVENITEM )
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( CheckCoolTime( pINVENITEM->sItemCustom.sNativeID ) )
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_COOLTIME;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pINVENITEM->sItemCustom.sNativeID );
	
	/*if ( pITEM->sBasicOp.emItemType!=ITEM_SCHOOL_CHANGE_SG)
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}

	if ( pITEM->sBasicOp.emItemType!=ITEM_SCHOOL_CHANGE_MP)
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}
	if ( pITEM->sBasicOp.emItemType!=ITEM_SCHOOL_CHANGE_PH)
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_NOITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}*/

	GLPARTY_FIELD *pParty = GLGaeaServer::GetInstance().GetParty ( m_dwPartyID );
	if ( pParty )
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;

	}
	GLClubMan &cClubMan = m_pGLGaeaServer->GetClubMan();
	GLCLUB *pCLUB = cClubMan.GetClub ( m_dwGuild );

	if ( pCLUB )
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;

	}

	bool bVALIDCLASS = (NULL!=(pITEM->sBasicOp.dwReqCharClass&m_emClass));
	if ( !bVALIDCLASS )
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_BADCLASS;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}
/*
	const GLCHARLOGIC& sCharData = GLGaeaClient::GetInstance().GetCharacterLogic ();
	const WORD mySchool  = sCharData.m_wSchool;
	if ( mySchool == pNetMsg->wSchool )
	{
		MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_BADITEM;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);
		return E_FAIL;
	}
	*/

	m_wSchool = pNetMsg->wSchool;

	//	Note : ?????? ?? ?? ??.
	MsgFB.dwID = m_wSchool;
	MsgFB.emFB = EMINVEN_SCHOOL_CHANGE_FB_OK;
	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&MsgFB);

	//	Note : ?? ??? ?? ????? ??.
	GLMSG::SNETPC_INVEN_SCHOOL_CHANGE_BRD NetMsgBrd;
	NetMsgBrd.dwGaeaID = m_dwGaeaID;
	NetMsgBrd.dwID = m_wSchool;
	SendMsgViewAround ( (NET_MSG_GENERIC*) &NetMsgBrd );

	//	[????] ?? ??? ????.
	

	// DB? ??
	CSetChaSchool* pDBAction = new CSetChaSchool ( m_dwCharID, m_wSchool );

	if ( GLGaeaServer::GetInstance().GetDBMan() )
	{
		GLGaeaServer::GetInstance().GetDBMan()->AddJob ( pDBAction );
	}


	DoDrugInvenItem ( pNetMsg->wPosX, pNetMsg->wPosY );

	return S_OK;
}

glcharactorreq.cpp
PHP:
#include "stdafx.h"

#include "DxInputDevice.h"
#include "editmeshs.h"
#include "DxMethods.h"
#include "DxViewPort.h"
#include "DxEffectMan.h"
#include "DxShadowMap.h"
#include "EditMeshs.h"
#include "GLogicData.h"
#include "GLItemMan.h"
#include "DxGlobalStage.h"
#include "GLGaeaClient.h"
#include "stl_Func.h"
#include "DxEffGroupPlayer.h"
#include "GLPartyClient.h"
#include "GLBusStation.h"
#include "GLBusData.h"
#include "GLTaxiStation.h"
#include "RANPARAM.h"
#include "GLMaplist.h"
#include "GLFriendClient.h"
#include "RanFilter.h"
#include "DxClubMan.h"
#include "GLFactEffect.h"
#include "GLQUEST.h"
#include "GLQUESTMAN.h"
#include "GLCharacter.h"
#include "GLItemMixMan.h"
#include "GLItem.h"

#include "../RanClientUILib/Interface/OuterInterface.h"
#include "../RanClientUILib/Interface/UITextControl.h"
#include "../RanClientUILib/Interface/GameTextControl.h"
#include "../RanClientUILib/Interface/InnerInterface.h"
#include "../RanClientUILib/Interface/InventoryPage.h"
#include "../RanClientUILib/Interface/InventoryWindow.h"
#include "../RanClientUILib/Interface/BasicGameMenu.h"
#include "../RanClientUILib/Interface/QBoxButton.h"
#include "../RanClientUILib/Interface/ModalWindow.h"
#include "../RanClientUILib/Interface/ModalCallerID.h"
#include "../RanClientUILib/Interface/ItemShopIconMan.h"
#include "../RanClientUILib/Interface/PetskinMixImage.h"
#include "../RanClientUILib/Interface/MapWindow/LargeMapWindow.h" //Request Crow List NaJDeV

#include "../enginelib/Common/StringUtils.h"

//#include "./ObserverNotifyID.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

void GLCharacter::ReqToggleRun ()
{
	if ( IsSTATE(EM_ACT_RUN) )
	{
		ReSetSTATE(EM_ACT_RUN);
		CBasicGameMenu * pGameMenu = CInnerInterface::GetInstance().GetGameMenu();
		if( pGameMenu ) pGameMenu->SetFlipRunButton( FALSE );
	}
	else
	{
		SetSTATE(EM_ACT_RUN);
		CBasicGameMenu * pGameMenu = CInnerInterface::GetInstance().GetGameMenu();
		if( pGameMenu ) pGameMenu->SetFlipRunButton( TRUE );
	}

	m_actorMove.SetMaxSpeed ( GetMoveVelo() );

	PGLPETCLIENT pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
	if ( pMyPet->IsVALID () )
	{
		pMyPet->SetMoveState ( IsSTATE(EM_ACT_RUN) );
	}

	//	Note : ¸Þ¼¼Áö ¹ß»ý.
	//
	GLMSG::SNETPC_MOVESTATE NetMsg;
	NetMsg.dwActState = m_dwActState;

	NETSENDTOFIELD ( (NET_MSG_GENERIC*) &NetMsg );
}

void GLCharacter::ReqTogglePeaceMode ()
{
	if ( IsSTATE(EM_ACT_PEACEMODE) && !m_bVehicle )	ReSetSTATE(EM_ACT_PEACEMODE);
	else											SetSTATE(EM_ACT_PEACEMODE);

	//GLGaeaClient::GetInstance().GetActiveMapID();

	if ( IsSafeZone() && GLGaeaClient::GetInstance().GetActiveMap()->GetMapID().wMainID == 22 ) SetSTATE(EM_ACT_PEACEMODE);

	m_fIdleTime = 0.0f;

	//	Note : ¸Þ¼¼Áö ¹ß»ý.
	//
	GLMSG::SNETPC_ACTSTATE NetMsg;
	NetMsg.dwActState = m_dwActState;
	NETSEND ( (NET_MSG_GENERIC*) &NetMsg );
}

void GLCharacter::ReqToggleBooster () //add bike booster
{
	if ( IsSTATE(EM_ACT_BOOSTER) /*&& m_bVehicle */)	ReSetSTATE(EM_ACT_BOOSTER);
	else  if ( m_bVehicle )	SetSTATE( EM_ACT_BOOSTER );

	GLMSG::SNETPC_ACTSTATE NetMsg;
	NetMsg.dwActState = m_dwActState;
	NETSEND ( (NET_MSG_GENERIC*) &NetMsg );
}

void GLCharacter::ReqVisibleNone ()
{
	SetSTATE(EM_REQ_VISIBLENONE);

	//	Note : (¿¡ÀÌÁ¯Æ®¼­¹ö) ¸Þ¼¼Áö ¹ß»ý.
	//
	GLMSG::SNETPC_ACTSTATE NetMsg;
	NetMsg.dwActState = m_dwActState;
	NETSEND ( (NET_MSG_GENERIC*) &NetMsg );
}

void GLCharacter::ReqVisibleOff ()
{
	SetSTATE(EM_REQ_VISIBLEOFF);

	//	Note : (¿¡ÀÌÁ¯Æ®¼­¹ö) ¸Þ¼¼Áö ¹ß»ý.
	//
	GLMSG::SNETPC_ACTSTATE NetMsg;
	NetMsg.dwActState = m_dwActState;
	NETSEND ( (NET_MSG_GENERIC*) &NetMsg );
}

void GLCharacter::ReqVisibleOn ()
{
	ReSetSTATE(EM_REQ_VISIBLENONE);
	ReSetSTATE(EM_REQ_VISIBLEOFF);

	//	Note : (¿¡ÀÌÁ¯Æ®¼­¹ö) ¸Þ¼¼Áö ¹ß»ý.
	//
	GLMSG::SNETPC_ACTSTATE NetMsg;
	NetMsg.dwActState = m_dwActState;
	NETSEND ( (NET_MSG_GENERIC*) &NetMsg );
}

// *****************************************************
// Desc: Ãⱸ ³ª°¡±â ¿äû
// *****************************************************
void GLCharacter::ReqGateOut ()
{
	if ( IsSTATE(EM_REQ_GATEOUT) )							return;
	if ( IsSTATE(EM_ACT_WAITING) )							return;

	DWORD dwGateID = DetectGate ();
	if ( dwGateID==UINT_MAX )								return;

	PLANDMANCLIENT pLandMClient = GLGaeaClient::GetInstance().GetActiveMap();
	if ( !pLandMClient )								return;

	DxLandGateMan *pLandGateMan = &pLandMClient->GetLandGateMan();
	if ( !pLandGateMan )								return;

	PDXLANDGATE pLandGate = pLandGateMan->FindLandGate ( dwGateID );
	if ( !pLandGate )									return;

	SNATIVEID sMapID = pLandGate->GetToMapID();

	SMAPNODE *pMapNode = GLGaeaClient::GetInstance().FindMapNode ( sMapID );
	if ( !pMapNode )									return;


	//	TODO :  +, quest, ÆÄƼ¿ø üũ´Â ÇâÈÄ ±¸Çö, Ŭ¶óÀ̾ðÆ®¿¡¼­¸¸ ó¸®ÇÏ°í ÀÖÀ½. ¼­¹ö¿¡¼­ Á¡°ËÀº ³ªÁß¿¡.
	//
	//	TODO : Ãⱸ »ç¿ë Á¶°ÇÀ» °Ë»çÇÏ¿©¾ß ÇÏÁö¸¸ ÇöÀç ¿¡ÀÌÁ¯Æ® ¼­¹ö¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ´Â
	//		Äɸ¯ÅÍ Á¤º¸ÀÇ ÇÑ°è°¡ ÀÖÀ¸¹Ç·Î Ŭ¶óÀ̾ðÆ®¿¡¼­¸¸ È®Àεǰí ÀÖÀ½.
	//

	EMREQFAIL emReqFail(EMREQUIRE_COMPLETE);
	
	GLLevelFile cLevelFile;
	BOOL bOk = cLevelFile.LoadFile ( pMapNode->strFile.c_str(), TRUE, NULL );
	if ( !bOk )											return;

	 if ( GLGaeaClient::GetInstance().GetPetClient()->IsVALID() ) 
		{
			CInnerInterface &cINTERFACE1 = CInnerInterface::GetInstance();
			cINTERFACE1.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, "Please disable your pet first.");
			return;
		}

	SLEVEL_REQUIRE* pRequire = cLevelFile.GetLevelRequire ();
	emReqFail = pRequire->ISCOMPLETE ( this );
	if ( emReqFail != EMREQUIRE_COMPLETE )
	{
		CInnerInterface &cINTERFACE = CInnerInterface::GetInstance();
		switch ( emReqFail )
		{
		case EMREQUIRE_LEVEL:
			{
				if( pRequire->m_signLevel == EMSIGN_FROMTO )
				{
					cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
						ID2GAMEINTEXT("EMREQUIRE_LEVEL2"),
						pRequire->m_wLevel,
						pRequire->m_wLevel2 );
				}else{
					std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signLevel].c_str());
					
					if( RANPARAM::emSERVICE_TYPE == EMSERVICE_THAILAND )
					{
						cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
													ID2GAMEINTEXT("EMREQUIRE_LEVEL"),
													strSIGN.c_str(),
													pRequire->m_wLevel );
					}
					else
					{
						cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
													ID2GAMEINTEXT("EMREQUIRE_LEVEL"),
													pRequire->m_wLevel,
													strSIGN.c_str() );
					}
				}
			}
			break;

		case EMREQUIRE_ITEM:
			{
				SITEM *pItem = GLItemMan::GetInstance().GetItem ( pRequire->m_sItemID );
				if ( pItem )
				{
					cINTERFACE.PrintMsgTextDlg
					(
						NS_UITEXTCOLOR::DISABLE,
						ID2GAMEINTEXT("EMREQUIRE_ITEM"),
						pItem->GetName()
					);
				}
			}
			break;

		case EMREQUIRE_SKILL:
			{
				PGLSKILL pSkill = GLSkillMan::GetInstance().GetData ( pRequire->m_sSkillID );
				if ( pSkill )
				{
					cINTERFACE.PrintMsgTextDlg
					(
						NS_UITEXTCOLOR::DISABLE,
						ID2GAMEINTEXT("EMREQUIRE_SKILL"),
						pSkill->GetName()
					);
				}
			}
			break;

		case EMREQUIRE_LIVING:
			{
				std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signLiving].c_str());
				cINTERFACE.PrintMsgTextDlg
				(
					NS_UITEXTCOLOR::DISABLE,
					ID2GAMEINTEXT("EMREQUIRE_PREMIUM"),
					pRequire->m_nLiving,
					strSIGN.c_str() // 1
				);
			}
			break;

		case EMREQUIRE_BRIGHT:
			{
				std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signBright].c_str());
				cINTERFACE.PrintMsgTextDlg
				(
					NS_UITEXTCOLOR::DISABLE,
					ID2GAMEINTEXT("EMREQUIRE_REBORN"),
					pRequire->m_nBright,
					strSIGN.c_str()
				);
			}
			break;

		case EMREQUIRE_QUEST_COM:
			{
				CString strQUEST = "quest";
				GLQUEST *pQUEST = GLQuestMan::GetInstance().Find ( pRequire->m_sComQuestID.dwID );
				if ( pQUEST )		strQUEST = pQUEST->GetTITLE();

				cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQUIRE_QUEST_COM"), strQUEST.GetString() );
			}
			break;

		case EMREQUIRE_QUEST_ACT:
			{
				CString strQUEST = "quest";
				GLQUEST *pQUEST = GLQuestMan::GetInstance().Find ( pRequire->m_sActQuestID.dwID );
				if ( pQUEST )		strQUEST = pQUEST->GetTITLE();

				cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQUIRE_QUEST_ACT"), strQUEST.GetString() );
			}
			break;

		default:
			cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("MAP_REQUIRE_FAIL") );
			break;
		};

		//	Note : Ãⱸ »ç¿ë ±ÇÇÑÀÌ ¾ÈµÉ °æ¿ì. GM level ÀÌ»óÀÏ °æ¿ì Á¶°Ç ¹«½Ã.
		//
		if ( m_dwUserLvl < USER_GM3 )	return;
	}


	if( pMapNode->bInstantMap )
	{
		//	Note : ÀνºÅϽº ¸Ê »ý¼º ¿äû
		//
		GLMSG::SNETREQ_CREATE_INSTANT_MAP_REQ NetMsg;
		NetMsg.dwGateID = dwGateID;
		NETSENDTOFIELD ( &NetMsg );
		SetSTATE(EM_REQ_GATEOUT);
		return;
	}
	DISABLEALLLANDEFF();
	//	Note : Ãⱸ ³ª°¡±â ¿äû ¸Þ½ÃÁö ¹ß»ý.
	//
	GLMSG::SNETREQ_GATEOUT_REQ NetMsg;
	NetMsg.dwGateID = dwGateID;
	NETSENDTOFIELD ( &NetMsg );

	SetSTATE(EM_REQ_GATEOUT);

}

bool GLCharacter::ReqGESTURE ( int nMOTION, bool bCOMMAND )
{
	//	Note : ¸ð¼Ç Á¾·ù°¡ ÆòÈ­ ¸ðµåÀÏ °æ¿ì¸¸ Á¦½ºÃĸ¦ ÇÒ ¼ö ÀÖ´Ù.
	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
	BOOL bPeaceZone = pLand ? pLand->IsPeaceZone() : FALSE;

	//	Note : ¸í·É¾î·Î ±¸µ¿µÇ´Â Á¦½ºÃÄÀÏ °æ¿ì. ÆòÈ­¸ðµå·Î Á¯È¯.
	if ( bCOMMAND )
	{
		if ( !bPeaceZone && !IsSTATE(EM_ACT_PEACEMODE) )
		{
			if ( IsACTION(GLAT_IDLE) )		ReqTogglePeaceMode();
		}
	}

	if ( !bPeaceZone && IsSTATE(EM_ACT_PEACEMODE) )
	{
		bPeaceZone = TRUE;
	}

	if ( !bPeaceZone )	return false;

	// Å»°Í ž½ÂÁßÀ϶§ Á¦½ºÃÄ ±ÝÁö
	if ( m_bVehicle ) return true;

	//	Note : ÇØ´ç Á¦½ºÃÄ ¿¡´Ï¸ÞÀ̼ÇÀÌ Á¸Á¦½Ã ±¸µ¿.
	PANIMCONTNODE pNODE = m_pSkinChar->GETANI ( AN_GESTURE, EMANI_SUBTYPE(nMOTION) );
	if ( !pNODE )			return false;

	//	Note : ½Åü°¡ Á¤»óÀûÀ϶§ ±¸µ¿.
	if ( !IsValidBody() )	return false;

	//	Note : Á¦½ºÃĸ¦ ÇàÇÔ.
	m_dwANISUBGESTURE = (DWORD) nMOTION;
	TurnAction(GLAT_TALK);

	//	Note : ¼­¹ö·Î ¸Þ½ÃÁö Àü¼Û.
	GLMSG::SNETPC_REQ_GESTURE NetMsg;
	NetMsg.dwID = m_dwANISUBGESTURE;
	NETSENDTOFIELD ( &NetMsg );

	return true;
}

inline bool GLCharacter::IsInsertToInven ( PITEMCLIENTDROP pItemDrop )
{
	GASSERT(pItemDrop&&"GLChar::IsItemToInven()");
	if ( !pItemDrop )	return false;

	SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemClient.sNativeID);
	if ( !pItem )		return false;

	if ( pItem->ISPILE() )
	{
		WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
		WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

		//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
		WORD wPILENUM = pItem->sDrugOp.wPileNum;
		SNATIVEID sNID = pItem->sBasicOp.sNativeID;

		//	Note : ³Ö±â ¿äûµÈ ¾ÆÀÌÅÛ¼ö. ( ÀÜ¿©·®. )
		//
		WORD wREQINSRTNUM = ( pItemDrop->sItemClient.wTurnNum );

		BOOL bITEM_SPACE = TRUE;
#if defined(VN_PARAM) //vietnamtest%%%
		if( m_dwVietnamGainType == GAINTYPE_EMPTY )
		{
			bITEM_SPACE = m_cVietnamInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY );
		}else{
			bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY );
		}		
#else
		bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY );
#endif
		if ( !bITEM_SPACE )		return false;
	}
	else
	{
		WORD wPosX, wPosY;
		BOOL bOk = TRUE;
#if defined(VN_PARAM) //vietnamtest%%%
		if( m_dwVietnamGainType == GAINTYPE_EMPTY )
		{
			bOk = m_cVietnamInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		}else{
			bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		}
#else
		bOk = m_cInventory.FindInsrtable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
#endif
		if ( !bOk )				return false;
	}

	return true;
}

//	Note : ÇÊµå ¾ÆÀÌÅÛ(µ·) ÁÖÀ»¶§.
HRESULT GLCharacter::ReqFieldTo ( const STARGETID &sTargetID, bool bPet )
{
	if ( VALID_HOLD_ITEM () )					return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	PLANDMANCLIENT pLAND = GLGaeaClient::GetInstance().GetActiveMap();
	if ( !pLAND )	return E_FAIL;

	//if ( sTargetID.emCrow==CROW_ITEM )
	//{
	//	if ( pLAND->ISITEM_PICKDELAY ( sTargetID.dwID ) )	return E_FAIL;
	//}
	//else if ( sTargetID.emCrow==CROW_MONEY )
	//{
	//	if ( pLAND->ISMONEY_PICKDELAY ( sTargetID.dwID ) )	return E_FAIL;
	//}

	//BOOL bInventoryOpen = FALSE;
	//bInventoryOpen = CInnerInterface::GetInstance().IsInventoryWindowOpen ();
	//if ( sTargetID.emCrow==CROW_ITEM && bInventoryOpen )
	//{
	//	//	¸Þ½ÃÁö ¹ß»ý.
	//	GLMSG::SNETPC_REQ_FIELD_TO_HOLD NetMsg;
	//	NetMsg.dwGlobID = sTargetID.dwID;
	//	NETSENDTOFIELD ( &NetMsg );

	//	//	´ÙÀ½ ¸Þ½ÃÁö Áö¿¬ ÁöÁ¤.
	//	pLAND->SETITEM_PICKDELAY ( sTargetID.dwID );
	//}
	//else
	{
		//	Note : ¸Þ½ÃÁö ¼Û½ÅÀü¿¡ À¯È¿ÇÒÁö¸¦ ¹Ì¸® °Ë»çÇÔ.
		//
		// »ç¸ÁÈ®ÀÎ
		if ( !IsValidBody() )	return E_FAIL;

		//	°Å¸® üũ
		const D3DXVECTOR3 &vTarPos = sTargetID.vPos;

		//	°Å¸® üũ
		D3DXVECTOR3 vPos;

		if ( bPet )	
		{
			GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
			if ( pMyPet->IsVALID() )	vPos = pMyPet->GetPosition();
		}	
		else vPos = m_vPos;

		D3DXVECTOR3 vDistance = vPos - vTarPos;
		float fDistance = D3DXVec3Length ( &vDistance );

		WORD wTarBodyRadius = 4;
		WORD wTakeRange = wTarBodyRadius + GETBODYRADIUS() + 2;
		WORD wTakeAbleDis = wTakeRange + 15;

		if ( fDistance>wTakeAbleDis )
		{
			CInnerInterface::GetInstance().PrintMsgText( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMTAKE_FB_DISTANCE") );			
			return E_FAIL;
		}

		if ( sTargetID.emCrow==CROW_ITEM )
		{
			PITEMCLIENTDROP pItemDrop = pLAND->GetItem ( sTargetID.dwID );
			if ( !pItemDrop )		return E_FAIL;

			if( CInnerInterface::GetInstance().GetQBoxButton()->GetQBoxEnable() == FALSE )
			{
				SITEM *pItem = GLItemMan::GetInstance().GetItem(pItemDrop->sItemClient.sNativeID);
				if( pItem != NULL && pItem->sBasicOp.emItemType==ITEM_QITEM )
				{
					CInnerInterface::GetInstance().PrintMsgText( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("QBOX_OPTION_DISABLE_MSG") );
					return E_FAIL;
				}
			}

			//	Note : Àκ¥¿¡ ³ÖÀ»¼ö ÀÖ´ÂÁö °Ë»ç.
			//
			BOOL bOk = IsInsertToInven ( pItemDrop );
			if ( !bOk )
			{
#if defined(VN_PARAM) //vietnamtest%%%
				if( m_dwVietnamGainType == GAINTYPE_EMPTY )	return E_FAIL;
#endif
				//	ÀιêÀÌ °¡µæÂþÀ½.
				//	¸Þ½ÃÁö ¹ß»ý.
				GLMSG::SNETPC_REQ_FIELD_TO_HOLD NetMsg;
				NetMsg.dwGlobID = sTargetID.dwID;
				NETSENDTOFIELD ( &NetMsg );
				return S_OK;
			}

			//	´ÙÀ½ ¸Þ½ÃÁö Áö¿¬ ÁöÁ¤.
			// pLAND->SETITEM_PICKDELAY ( sTargetID.dwID );
		}
		else if ( sTargetID.emCrow==CROW_MONEY )
		{
			PMONEYCLIENTDROP pMoney = GLGaeaClient::GetInstance().GetActiveMap()->GetMoney ( sTargetID.dwID );
			if ( !pMoney )		return E_FAIL;

			//	´ÙÀ½ ¸Þ½ÃÁö Áö¿¬ ÁöÁ¤.
			// pLAND->SETMONEY_PICKDELAY ( sTargetID.dwID );
		}

		//	¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_REQ_FIELD_TO_INVEN NetMsg;
		NetMsg.emCrow = sTargetID.emCrow;
		NetMsg.dwID = sTargetID.dwID;
		NetMsg.bPet	= bPet;
		NETSENDTOFIELD ( &NetMsg );
	}

	return S_OK;
}

//	Note : Àκ¥Å丮 ¾ÆÀÌÅÛ µé¶§, ³õÀ»¶§, ±³È¯ÇÒ¶§, ÇÕÄ¥¶§.
HRESULT GLCharacter::ReqInvenTo ( WORD wPosX, WORD wPosY )
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );

	//	Note : Æ®·¡À̵å È°¼ºÈ­½Ã¿¡.
	//
	if ( GLTradeClient::GetInstance().Valid() )
	{
		if ( pInvenItem )	GLTradeClient::GetInstance().SetPreItem ( SINVEN_POS( pInvenItem->wPosX, pInvenItem->wPosY ) );
		else				GLTradeClient::GetInstance().ReSetPreItem ();
		return S_OK;
	}

	if( ValidRebuildOpen() || ValidGarbageOpen() || ValidItemMixOpen() )	// ITEMREBUILD_MARK
	{
		if( m_sPreInventoryItem.wPosX == wPosX && m_sPreInventoryItem.wPosY == wPosY )
		{
			m_sPreInventoryItem.RESET();
		}
		else
		{
			if( pInvenItem )
				m_sPreInventoryItem.SET( wPosX, wPosY );
			else
				m_sPreInventoryItem.RESET();
		}
		return S_OK;
	}

	if ( !VALID_HOLD_ITEM () && !pInvenItem )	return E_FAIL;

	if ( VALID_HOLD_ITEM () && pInvenItem )
	{
#if defined(VN_PARAM) //vietnamtest%%%
		const SITEMCUSTOM& sCustom = GET_HOLD_ITEM();
		
		if ( !sCustom.bVietnamGainItem )
#endif
		{
			GLMSG::SNETPC_REQ_INVEN_EX_HOLD NetMsg;
			NetMsg.wPosX = pInvenItem->wPosX;
			NetMsg.wPosY = pInvenItem->wPosY;
			NETSENDTOFIELD ( &NetMsg );
		}
	}
	else if ( pInvenItem )
	{
		GLMSG::SNETPC_REQ_INVEN_TO_HOLD NetMsg;
		NetMsg.wPosX = pInvenItem->wPosX;
		NetMsg.wPosY = pInvenItem->wPosY;
		NETSENDTOFIELD ( &NetMsg );
	}
	else if ( VALID_HOLD_ITEM () )
	{
#if defined(VN_PARAM) //vietnamtest%%%
		const SITEMCUSTOM& sCustom = GET_HOLD_ITEM();
		
		if ( !sCustom.bVietnamGainItem || ( sCustom.bVietnamGainItem && m_dwVietnamInvenCount > 0 ) )
#endif
		{
			//	Note : ¸Þ½ÃÁö ¼Û½ÅÀü¿¡ À¯È¿ÇÒÁö¸¦ ¹Ì¸® °Ë»çÇÔ.
			//
			SITEM* pItem = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
			GASSERT(pItem&&"¾ÆÀÌÅÆ ´ëÀÌÅÍ°¡ Á¸Á¦ÇÏÁö ¾ÊÀ½");

			BOOL bOk = m_cInventory.IsInsertable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
			if ( !bOk )
			{
				//	ÀιêÀÌ °¡µæÂþÀ½.
				return E_FAIL;
			}

			GLMSG::SNETPC_REQ_HOLD_TO_INVEN NetMsg;
			NetMsg.wPosX = wPosX;
			NetMsg.wPosY = wPosY;
#if defined(VN_PARAM) //vietnamtest%%%
			NetMsg.bUseVietnamInven = sCustom.bVietnamGainItem;
#else
			NetMsg.bUseVietnamInven = FALSE;
#endif
			NETSENDTOFIELD ( &NetMsg );

		}
#if defined(VN_PARAM) //vietnamtest%%%
		else
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_VIETNAM_ITEMGET_FAILED") );
			return E_FAIL;		
		}
#endif
	}

	return S_OK;
}

//	Note : º£Æ®³² Ž´Ð ¹æÁö Àκ¥Å丮 ¾ÆÀÌÅÛ µé¶§, ³õÀ»¶§, ±³È¯ÇÒ¶§, ÇÕÄ¥¶§.
HRESULT GLCharacter::ReqVNInvenTo ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )							return E_FAIL;
	if ( ValidWindowOpen() )						return E_FAIL;	

	SINVENITEM* pInvenItem = m_cVietnamInventory.FindPosItem ( wPosX, wPosY );
	if ( !VALID_HOLD_ITEM () && !pInvenItem )		return E_FAIL;


	const SITEMCUSTOM& sCustom = GET_HOLD_ITEM();


	if ( VALID_HOLD_ITEM () && pInvenItem )
	{
		if ( sCustom.bVietnamGainItem )
		{
			GLMSG::SNETPC_REQ_VNGAIN_EX_HOLD NetMsg;
			NetMsg.wPosX = pInvenItem->wPosX;
			NetMsg.wPosY = pInvenItem->wPosY;
			NETSENDTOFIELD ( &NetMsg );
		}
	}
	else if ( pInvenItem )
	{
		GLMSG::SNETPC_REQ_VNGAIN_TO_HOLD NetMsg;
		NetMsg.wPosX = pInvenItem->wPosX;
		NetMsg.wPosY = pInvenItem->wPosY;
		NETSENDTOFIELD ( &NetMsg );
	}
	else if ( VALID_HOLD_ITEM () && sCustom.bVietnamGainItem )
	{
		//	Note : ¸Þ½ÃÁö ¼Û½ÅÀü¿¡ À¯È¿ÇÒÁö¸¦ ¹Ì¸® °Ë»çÇÔ.
		//
		SITEM* pItem = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
		GASSERT(pItem&&"¾ÆÀÌÅÆ ´ëÀÌÅÍ°¡ Á¸Á¦ÇÏÁö ¾ÊÀ½");

		BOOL bOk = m_cVietnamInventory.IsInsertable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )
		{
			//	ÀιêÀÌ °¡µæÂþÀ½.
			return E_FAIL;
		}

		GLMSG::SNETPC_REQ_HOLD_TO_VNGAIN NetMsg;
		NetMsg.wPosX = wPosX;
		NetMsg.wPosY = wPosY;

		NETSENDTOFIELD ( &NetMsg );
	}
	return S_OK;
}

//	Note : º£Æ®³² Àκ¥Å丮¿¡¼­ ¿À¸¥ÂÊ ¹öÆ°À¸·Î ¾ÆÀÌÅÛÀ» ¿Å±æ °æ¿ì
HRESULT GLCharacter::ReqVietemInvenTo (WORD wPosX, WORD wPosY )
{

	if( m_dwVietnamInvenCount <= 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_VIETNAM_ITEMGET_FAILED") );
		return E_FAIL;
	}

	SINVENITEM* pInvenItem = m_cVietnamInventory.FindPosItem ( wPosX, wPosY );

	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			return E_FAIL;

	WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
	WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

	//	Note : Àκ¥¿¡ ¿©À¯ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.
	//
	//BOOL bITEM_SPACE(FALSE);
	//if ( pItem->ISPILE() )
	//{
	//	//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
	//	WORD wPILENUM = pItem->sDrugOp.wPileNum;
	//	WORD wREQINSRTNUM = ( wBuyNum * pItem->GETAPPLYNUM() );
	//	bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sBUYNID, wPILENUM, wINVENX, wINVENY );
	//}
	//else
	//{
	//	GASSERT(wBuyNum==1&&"°ãħÀÌ ºÒ°¡´ÉÇÑ ¾ÆÀÌÅÛÀº 1°³¾¿¸¸ ±¸ÀÔ °¡´ÉÇÕ´Ï´Ù.");

	//	//	ÀÏ¹Ý ¾ÆÀÌÅÛÀÇ °æ¿ì.
	//	WORD wInsertPosX(0), wInsertPosY(0);
	//	bITEM_SPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );
	//}

	WORD wInsertPosX(0), wInsertPosY(0);
	BOOL bITEM_SPACE(FALSE);
	bITEM_SPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );

	if ( !bITEM_SPACE )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCHARGED_ITEM_GET_FB_NOINVEN") );
		return E_FAIL;
	}

	//	±¸ÀÔ ¿äû ¸Þ½ÃÁö.
	GLMSG::SNETPC_REQ_VNINVEN_TO_INVEN NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : º£Æ®³² Àκ¥Å丮ÀÇ ¾ÆÀÌÅÛ Àüü »èÁ¦
HRESULT GLCharacter::ReqVNInveReset ()
{
	m_cVietnamInventory.DeleteItemAll();

	GLMSG::SNETPC_REQ_VNGAIN_INVEN_RESET NetMsg;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRetrievePoints ()
{
	GLMSG::SNETPC_RETRIEVE_POINTS NetMsg;
	NETSENDTOFIELD ( &NetMsg );
	return S_OK;
}
// *****************************************************
// Desc: ¾ÆÀÌÅÛ ÀÎþƮ ½Ãµµ
// *****************************************************
HRESULT GLCharacter::ReqGrinding ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;
	if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			return E_FAIL;

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	return S_FALSE;

	if ( pHold->sBasicOp.emItemType != ITEM_GRINDING )	return S_FALSE;

	BOOL bGrinding = pItem->sBasicOp.emItemType==ITEM_SUIT && pItem->sSuitOp.wReModelNum>0;
	if ( !bGrinding )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_NOITEM") );
		return S_FALSE;
	}

	if ( pHold->sGrindingOp.emTYPE == EMGRINDING_DAMAGE || pHold->sGrindingOp.emTYPE == EMGRINDING_DEFENSE )
	{
		if ( pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE)>=GLCONST_CHAR::wGRADE_MAX )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_MAX") );
			return S_FALSE;
		}
	}
	else
	{
		if ( pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE)>=GLCONST_CHAR::wGRADE_MAX_REGI )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_MAX") );
			return S_FALSE;
		}
	}



	//	Note : ¿¬¸¶Á¦ µî±Þ, ³·Àº ¿¬¸¶Á¦·Î ³ôÀº ¿¬¸¶ ºÒ°¡´É
	//
	
	BYTE cGrade = 0;

	cGrade = pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE);

	if ( cGrade >= GRADE_HIGH && pHold->sGrindingOp.emGRINDER_TYPE != EMGRINDER_TOP )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_NOT_BEST") );
		return S_FALSE;
	}
	else if ( cGrade >=GRADE_NORMAL && pHold->sGrindingOp.emGRINDER_TYPE < EMGRINDER_HIGH )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_NOT_HIGH") );
		return S_FALSE;
	}


	// ¹æ¾î±¸ ¹× ¹«±â°¡ ÃÖ»óÀ§ µî±Þ±îÁö ÀÎæƮ°¡ µÇ´ÂÁö È®ÀÎ
	if ( cGrade >= GRADE_HIGH && pItem->sGrindingOp.emGRINDER_TYPE != EMGRINDER_TOP )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_NOT_BESTITEM") );
		return S_FALSE;
	}

	//	Note : ¿¬¸¶Á¦ ¼ö·® È®ÀÎ
	if ( cGrade >= GRADE_HIGH )
	{
		if ( GLCONST_CHAR::wUSE_GRADE_NUM[cGrade-GRADE_HIGH] > GET_SLOT_ITEM(SLOT_HOLD).wTurnNum )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_NOT_NUM"), GLCONST_CHAR::wUSE_GRADE_NUM[cGrade-GRADE_HIGH]  );
			return S_FALSE;
		}

	}

	//Note : °í±Þ ¿¬¸¶Á¦ÀÏ °æ¿ìµî GRADE_NORMAL ±Þ ¹Ì¸¸ ¿¬¸¶ ºÒ°¡´É.
	//
	//if ( pInvenItem->sItemCustom.GETGRADE(pHold->sGrindingOp.emTYPE)<GRADE_NORMAL && pHold->sGrindingOp.bHIGH )
	//{
	//	CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_NOT_LOW") );
	//	return S_FALSE;
	//}

	if ( pItem->sSuitOp.gdDamage == GLPADATA(0,0) )
	{
		if ( pHold->sGrindingOp.emCLASS != EMGRINDING_CLASS_CLOTH )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_DEFCLASS") );
			return S_FALSE;
		}
	}
	else
	{
		if ( pHold->sGrindingOp.emCLASS != EMGRINDING_CLASS_ARM )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("GRINDING_DEFCLASS") );
			return S_FALSE;
		}
	}

	//	Note : ¼­¹ö¿¡ ¿¬¸¶ ½Ãµµ ¿äû.
	//
	GLMSG::SNET_INVEN_GRINDING NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqDisguise ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;
	if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			return E_FAIL;

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	return S_FALSE;

	if ( !pHold->sBasicOp.IsDISGUISE() )	return S_FALSE;

	if ( pItem->sBasicOp.IsDISGUISE() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DISGUISE_FB_FAIL") );
		return S_FALSE;
	}

	if ( ( pHold->sBasicOp.dwReqCharClass & pItem->sBasicOp.dwReqCharClass ) == NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DISGUISE_FB_DEFSUIT") );
		return S_FALSE;
	}
	
	if ( pHold->sBasicOp.emItemType != ITEM_SUIT )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DISGUISE_FB_NOTSUIT") );
		return S_FALSE;
	}

	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DISGUISE_FB_NOTSUIT") );
		return S_FALSE;
	}

	if ( pHold->sSuitOp.emSuit != pItem->sSuitOp.emSuit )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DISGUISE_FB_DEFSUIT") );
		return S_FALSE;
	}

	if ( pInvenItem->sItemCustom.nidDISGUISE!=SNATIVEID(false) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DISGUISE_FB_ALREADY") );
		return S_FALSE;
	}

	GLMSG::SNET_INVEN_DISGUISE	NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqCleanser ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;
	if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			return E_FAIL;

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	return S_FALSE;

	//if ( pHold->sBasicOp.emItemType!=ITEM_CLEANSER )
	//{
	//	CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_CLEANSER_FB_NOCLEANSER") );
	//	return S_FALSE;
	//}

	if ( pInvenItem->sItemCustom.nidDISGUISE==SNATIVEID(false) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_CLEANSER_FB_NONEED") );
		return S_FALSE;
	}

	GLMSG::SNET_INVEN_CLEANSER	NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqCharCard ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			return E_FAIL;

	//if ( pItem->sBasicOp.emItemType!=ITEM_CHARACTER_CARD )	return E_FAIL;

	GLMSG::SNET_INVEN_CHARCARD NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : â°í Ä«µå »ç¿ë.
HRESULT GLCharacter::ReqStorageCard ( WORD wPosX, WORD wPosY, WORD wSTORAGE )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )					return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_STORAGECARD_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_STORAGE_CARD )
	//{
	//	CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_STORAGECARD_FB_NOITEM") );
	//	return E_FAIL;
	//}

	if ( wSTORAGE < 1 || wSTORAGE>=(EMSTORAGE_CHANNEL-1) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_STORAGECARD_FB_INVNUM") );
		return E_FAIL;
	}

	GLMSG::SNET_INVEN_STORAGECARD NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.wSTORAGE = wSTORAGE;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqInvenLineCard ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_INVENLINE_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_INVEN_CARD )
	//{
	//	CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_INVENLINE_FB_NOITEM") );
	//	return E_FAIL;
	//}

	if ( m_wINVENLINE >= (EM_INVENSIZE_Y-EM_INVEN_DEF_SIZE_Y-1) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_INVENLINE_FB_MAXLINE") );
		return E_FAIL;
	}

	GLMSG::SNET_INVEN_INVENLINE NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRemodelOpenCard ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if ( ValidRebuildOpen() )					return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_REMODELOPEN_FB_NOITEM") );
		return E_FAIL;
	}

	GLMSG::SNET_INVEN_REMODELOPEN NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqGabargeOpenCard ( WORD wPosX, WORD wPosY )
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_REMODELOPEN_FB_NOITEM") );
		return E_FAIL;
	}

	GLMSG::SNET_INVEN_GARBAGEOPEN NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}


HRESULT GLCharacter::ReqStorageOpenCard ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	// â°í°¡ ¿­·ÁÀÖÀ¸¸é â°í ¿¬°áÄ«µå¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù.
	if ( CInnerInterface::GetInstance().IsStorageWindowOpen () ) return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_STORAGEOPEN_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_STORAGE_CONNECT )
	//{
	//	CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_STORAGEOPEN_FB_NOITEM") );
	//	return E_FAIL;
	//}

	GLMSG::SNET_INVEN_STORAGEOPEN NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqStorageCloseCard()
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;

	GLMSG::SNET_INVEN_STORAGECLOSE NetMsg;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPremiumSet ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_PREMIUMSET_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_PREMIUMSET )
	//{
	//	CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_PREMIUMSET_FB_NOITEM") );
	//	return E_FAIL;
	//}

	GLMSG::SNET_INVEN_PREMIUMSET NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqInvenHairChange ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_HAIR_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_HAIR )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_HAIR_CHANGE_FB_NOITEM") );
	//	return E_FAIL;
	//}

	GLMSG::SNETPC_INVEN_HAIR_CHANGE NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

// *****************************************************
// Desc: ¸Ó¸® ½ºÅ¸ÀÏ º¯°æ
// *****************************************************
HRESULT GLCharacter::ReqInvenHairStyleChange ( WORD wHairStyle )
{
	GLMSG::SNETPC_INVEN_HAIRSTYLE_CHANGE NetMsg;
	NetMsg.wPosX	  = m_wInvenPosX1;
	NetMsg.wPosY	  = m_wInvenPosY1;
	NetMsg.wHairStyle = wHairStyle;
	NETSENDTOFIELD ( &NetMsg );

	m_wInvenPosX1 = 0;
	m_wInvenPosY1 = 0;

	return S_OK;
}

// *****************************************************
// Desc: ¸Ó¸® ½ºÅ¸ÀÏ º¯°æ
// *****************************************************
HRESULT GLCharacter::InvenHairStyleChange ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_HAIR_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_HAIR_STYLE )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_HAIR_CHANGE_FB_NOITEM") );
	//	return E_FAIL;
	//}

	CInnerInterface::GetInstance().ShowGroupFocus( HAIRSTYLECARD_WINDOW );

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	return S_OK;
}

// *****************************************************
// Desc: ¸Ó¸® »ö±ò º¯°æ
// *****************************************************
HRESULT GLCharacter::ReqInvenHairColorChange ( WORD wHairColor )
{
	GLMSG::SNETPC_INVEN_HAIRCOLOR_CHANGE NetMsg;
	NetMsg.wPosX	  = m_wInvenPosX2;
	NetMsg.wPosY	  = m_wInvenPosY2;
	NetMsg.wHairColor = wHairColor;
	NETSENDTOFIELD ( &NetMsg );

	m_wInvenPosX2 = 0;
	m_wInvenPosY2 = 0;

	return S_OK;
}

// *****************************************************
// Desc: ¸Ó¸® »ö±ò º¯°æ
// *****************************************************
HRESULT GLCharacter::InvenHairColorChange ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_HAIR_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_HAIR_COLOR )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_HAIR_CHANGE_FB_NOITEM") );
	//	return E_FAIL;
	//}

	DoModal( ID2GAMEINTEXT("MODAL_HAIRCOLOR_INFO"), MODAL_INFOMATION, OK, MODAL_HAIRCOLOR_INFO );

	m_wInvenPosX2 = wPosX;
	m_wInvenPosY2 = wPosY;

	return S_OK;
}

HRESULT GLCharacter::InvenBikeColorChange ( WORD wPosX, WORD wPosY ) //add bike color
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_VEHICLE_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	if ( !m_bVehicle )	
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_VEHICLE_CHANGE_FB_NOVEHICLE") );
		return E_FAIL;
	}

	DoModal( ID2GAMEINTEXT("MODAL_BIKECOLOR_INFO"), MODAL_INFOMATION, OK, MODAL_BIKECOLOR_INFO );

	m_wInvenPosX2 = wPosX;
	m_wInvenPosY2 = wPosY;

	return S_OK;
}

HRESULT GLCharacter::ReqInvenBikeColorChange ( WORD wBikeColor ) //add bike color
{
	GLMSG::SNETPC_INVEN_BIKECOLOR_CHANGE NetMsg;
	NetMsg.wPosX	  = m_wInvenPosX2;
	NetMsg.wPosY	  = m_wInvenPosY2;
	NetMsg.wBikeColor = wBikeColor;
	NETSENDTOFIELD ( &NetMsg );

	m_wInvenPosX3 = 0;
	m_wInvenPosY3 = 0;

	return S_OK;
}

//	Note : ¾ó±¼½ºÅ¸ÀÏ º¯°æ.
HRESULT GLCharacter::ReqInvenFaceChange ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_FACE_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_FACE )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_FACE_CHANGE_FB_NOITEM") );
	//	return E_FAIL;
	//}

	GLMSG::SNETPC_INVEN_FACE_CHANGE NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

// *****************************************************
// Desc: ¾ó±¼ ½ºÅ¸ÀÏ º¯°æ
// *****************************************************
HRESULT GLCharacter::ReqInvenFaceStyleChange ( WORD wFaceStyle )
{
	GLMSG::SNETPC_INVEN_FACESTYLE_CHANGE NetMsg;
	NetMsg.wPosX	  = m_wInvenPosX1;
	NetMsg.wPosY	  = m_wInvenPosY1;
	NetMsg.wFaceStyle = wFaceStyle;
	NETSENDTOFIELD ( &NetMsg );

	m_wInvenPosX1 = 0;
	m_wInvenPosY1 = 0;

	return S_OK;
}

// *****************************************************
// Desc: ¾ó±¼ ½ºÅ¸ÀÏ º¯°æ
// *****************************************************
HRESULT GLCharacter::InvenFaceStyleChange ( WORD wPosX, WORD wPosY )
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_FACE_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	CInnerInterface::GetInstance().ShowGroupFocus( FACE_CHANGE_WINDOW );

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;	

	return S_OK;
}

HRESULT GLCharacter::InvenGenderChange ( WORD wPosX, WORD wPosY )
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_GENDER_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	if ( pItem->sBasicOp.emItemType != ITEM_GENDER_CHANGE )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_GENDER_CHANGE_FB_ITEMTYPE") );
		return E_FAIL;
	}

	//added by   | 08-07-2012 | make extreme can use gender card
	/*if ( m_emClass == GLCC_EXTREME_M || m_emClass == GLCC_EXTREME_W )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_GENDER_CHANGE_FB_BADCLASS") );
		return E_FAIL;
	}*/

	DoModal( ID2GAMEINTEXT("MODAL_GENDER_CHANGE"),  MODAL_INFOMATION, YESNO, MODAL_GENDER_CHANGE );	

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	return S_OK;
}

HRESULT GLCharacter::ReqInvenGenderChange ( WORD wFace, WORD wHair )
{
	GLMSG::SNETPC_INVEN_GENDER_CHANGE NetMsg;
	NetMsg.wPosX = m_wInvenPosX1;
	NetMsg.wPosY = m_wInvenPosY1;
	NetMsg.wFace = wFace;	
	NetMsg.wHair = wHair;
	NETSENDTOFIELD ( &NetMsg );

	m_wInvenPosX1 = 0;
	m_wInvenPosY1 = 0;

	return S_OK;
}


HRESULT GLCharacter::InvenRename ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_RENAME_FB_NOITEM") );
		return E_FAIL;
	}

	//if ( pItem->sBasicOp.emItemType!=ITEM_RENAME )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_RENAME_FB_BADITEM") );
	//	return E_FAIL;
	//}

	DoModal ( ID2GAMEINTEXT("INVEN_CHAR_RENAME"), MODAL_INPUT, EDITBOX, MODAL_CHAR_RENAME);

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	return S_OK;
}

HRESULT GLCharacter::ReqInvenRename ( const char* szCharName )
{
	if( !szCharName )
		return S_FALSE;

	CString strTEMP( szCharName );

#ifdef TH_PARAM	
	// ű¹¾î ¹®ÀÚ Á¶ÇÕ Ã¼Å©

	if ( !m_pCheckString ) return S_FALSE;

	if ( !m_pCheckString(strTEMP) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMINVEN_RENAME_FB_THAICHAR_ERROR"));
		return S_FALSE;
	}
#endif

#ifdef VN_PARAM
	// º£Æ®³² ¹®ÀÚ Á¶ÇÕ Ã¼Å© 
	if( STRUTIL::CheckVietnamString( strTEMP ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMINVEN_RENAME_FB_VNCHAR_ERROR"));
		return S_FALSE;
	}

#endif 


	BOOL bFILTER0 = STRUTIL::CheckString( strTEMP );
	BOOL bFILTER1 = CRanFilter::GetInstance().NameFilter( strTEMP );
	if ( bFILTER0 || bFILTER1 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEEXTEXT("CHARACTER_BADNAME") );
		return S_FALSE;
	}

	GLMSG::SNETPC_INVEN_RENAME NetMsg;
	NetMsg.wPosX = m_wInvenPosX1;
	NetMsg.wPosY = m_wInvenPosY1;
	StringCchCopy ( NetMsg.szName, CHAR_SZNAME, szCharName );
	NETSENDTOFIELD ( &NetMsg );

	m_wInvenPosX1 = 0;
	m_wInvenPosY1 = 0;
	return S_OK;
}

//	Note : ½ºÅ³ ½ºÅÝ ¸®¼Â.
HRESULT GLCharacter::ResetSkillStats ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RESET_SKST_FB_NOITEM") );
		return E_FAIL;
	}

	DoModal( ID2GAMEINTEXT("MODAL_RESET_SKILLSTATS"),  MODAL_INFOMATION, YESNO, MODAL_RESET_SKILLSTATS );

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	return S_OK;
}

HRESULT GLCharacter::ReqResetSkillStats ()
{
	GLMSG::SNET_INVEN_RESET_SKST NetMsg;
	NetMsg.wPosX = m_wInvenPosX1;
	NetMsg.wPosY = m_wInvenPosY1;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}
HRESULT GLCharacter::ReqReqBoxOpen ()
{
	GLMSG::SNET_INVEN_BOXOPEN NetMsg;
	NetMsg.wPosX = m_wInvenPosX1;
	NetMsg.wPosY = m_wInvenPosY1;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : º£Æ®³² ¾ÆÀÌÅÛ, °æÇèÄ¡ ȹµæ Ä«µå »ç¿ë
HRESULT GLCharacter::ReqInvenVietnamGet ( WORD wPosX, WORD wPosY, bool bGetExp )
{
//	if( m_dwVietnamGainType == GAINTYPE_EMPTY ) return E_FAIL;
//	if( m_dwVietnamGainType == GAINTYPE_HALF ) return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		if( bGetExp )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_VIETNAM_EXPGET_FB_NOITEM") );
		}else{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_VIETNAM_ITEMGET_FB_NOITEM") );
		}
		return E_FAIL;
	}

	GLMSG::SNETPC_INVEN_VIETNAM_INVENGET NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.bGetExp = bGetExp;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//
HRESULT GLCharacter::ReqEquipItem ( WORD wPosX, WORD wPosY )
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	SITEM* pItemData = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	EMITEM_TYPE emItemType = pItemData->sBasicOp.emItemType;
	EMSLOT J;				

	if ( pInvenItem->sItemCustom.sNativeID != NATIVEID_NULL()) 
	{
		if (pItemData)
		{
			switch ( pItemData->sSuitOp.emSuit )
			{
			case SUIT_HEADGEAR:		J = SLOT_HEADGEAR;break;
			case SUIT_UPPER:		J = SLOT_UPPER;break;
			case SUIT_LOWER:		J = SLOT_LOWER;break;
			case SUIT_HAND:			J = SLOT_HAND;break;
			case SUIT_FOOT:			J = SLOT_FOOT;break;
			case SUIT_NECK:			J = SLOT_NECK;break;
			case SUIT_WRIST:		J = SLOT_WRIST;break;
			//case SUIT_VEHICLE:		J = SLOT_VEHICLE;break;
			case SUIT_WING:			J = SLOT_WING;break;
			case SUIT_BELT:			J = SLOT_BELT;break;
			case SUIT_ACCESSORY:	J = SLOT_ACCESSORY;break;
			case SUIT_VEHICLE:		J = SLOT_VEHICLE;break;
			case SUIT_HANDHELD:	
				if ( emItemType == ITEM_ARROW || emItemType == ITEM_CHARM || emItemType == ITEM_BULLET )
				{
					if(IsUseArmSub())
					{
						J = SLOT_LHAND_S;
					}
					else
					{
						J = SLOT_LHAND;
					}
				}
				else
				{
					if(IsUseArmSub())
					{
						J = SLOT_RHAND_S;
					}
					else
					{
						J = SLOT_RHAND;
					}
				}
				break;
			case SUIT_FINGER:	
			{
				if ( m_bRingSwap )
				{
					m_bRingSwap = FALSE;
					J = SLOT_RFINGER;
				}
				else
				{
					J = SLOT_LFINGER;
					m_bRingSwap = TRUE;
				}
			}
			break;

			case SUIT_EARRING:	
			{
				if ( m_bEarringSwap )
				{
					m_bEarringSwap = FALSE;
					J = SLOT_REARRING;
				}
				else
				{
					J = SLOT_LEARRING;
					m_bEarringSwap = TRUE;
				}
			}
			break;

			};
		}					
	}

	if ( !VALID_HOLD_ITEM () && !pInvenItem )	return E_FAIL;

	if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) ||  m_sPMarket.IsOpen() )
	{
		return E_FAIL;
	}

	BOOL bOk;
	bOk = ACCEPT_ITEM ( pInvenItem->sItemCustom.sNativeID );
	if ( !bOk )
	{
		return E_FAIL;
	}

	bOk = CHECKSLOT_ITEM ( pInvenItem->sItemCustom.sNativeID, J );
	if ( !bOk )
	{
		return E_FAIL;
	}


	if ( GLTradeClient::GetInstance().Valid() )
	{
		if ( pInvenItem )	GLTradeClient::GetInstance().SetPreItem ( SINVEN_POS( pInvenItem->wPosX, pInvenItem->wPosY ) );
		else				GLTradeClient::GetInstance().ReSetPreItem ();

		return S_OK;
	}

	if( ValidRebuildOpen() || ValidGarbageOpen() || ValidItemMixOpen() )
	{
		if( m_sPreInventoryItem.wPosX == wPosX && m_sPreInventoryItem.wPosY == wPosY )
		{
			m_sPreInventoryItem.RESET();
		}
		else
		{
			if( pInvenItem )
				m_sPreInventoryItem.SET( wPosX, wPosY );
			else
				m_sPreInventoryItem.RESET();
		}
	
		return S_OK;
	}
	if ( pInvenItem->sItemCustom.IsWrap() ) // wrapper
		return S_FALSE;

	//Ocram - Operation tokhang sa mga items pag lumagpas sa max RV Hahahaha! 7-16-2017
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_ATTACK_VOL) >= 101  )//attack direct value - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_DEFENSE_VOL) >= 101  )//def direct value - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_MELEE) >= 101  )//meleee direct value - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_SHOOTING) >= 101  )//shooting direct value - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_VITALITY) >= 151)//Vit direct value - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_DAMAGE) >= 10.01  )//Damage rate percentage - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_AVOID_VOL) >= 31  )//avoid direct value - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_HIT_VOL) >= 31  )//hitrate direct value - Ocram Networks
		{	
			return S_FALSE;
		}
		if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_RESIST) >= 21  )//resist - Ocram Networks
		{	
			return S_FALSE;
		}

	GLMSG::SNETPC_REQ_INVEN_TO_HOLD NetMsg;
	NetMsg.wPosX = pInvenItem->wPosX;
	NetMsg.wPosY = pInvenItem->wPosY;
	NETSENDTOFIELD ( &NetMsg );
	
	if ( J == SLOT_RHAND )
	{
		J = GetCurRHand();
	}
	if ( J == SLOT_LHAND ) 
	{
		J = GetCurLHand();
	}

	bool bEMPTY_SLOT = ISEMPTY_SLOT(pInvenItem->sItemCustom.sNativeID,J);

	if (!bEMPTY_SLOT)
	{
		GLMSG::SNETPC_REQ_SLOT_EX_HOLD NetMsgEquip;
		NetMsgEquip.emSlot = J;
		NETSENDTOFIELD ( &NetMsgEquip );
				
		GLMSG::SNETPC_REQ_HOLD_TO_INVEN NetMsgToInven;
		NetMsgToInven.wPosX = wPosX;
		NetMsgToInven.wPosY = wPosY;

#if defined(VN_PARAM)
		NetMsgToInven.bUseVietnamInven = sCustom.bVietnamGainItem;
#else
		NetMsgToInven.bUseVietnamInven = FALSE;
#endif
		NETSENDTOFIELD ( &NetMsgToInven );
	}
	else
	{
		GLMSG::SNETPC_REQ_HOLD_TO_SLOT NetMsgEquip;
		NetMsgEquip.emSlot = J;
		NETSENDTOFIELD ( &NetMsgEquip );	
	}

	return S_OK;
}

HRESULT GLCharacter::ReqUnEquipItem ( EMSLOT emSlot )
{
	if ( !VALID_HOLD_ITEM() && !VALID_SLOT_ITEM(emSlot) )	return E_FAIL;
	if ( ValidWindowOpen() )								return E_FAIL;	

	if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) ||  m_sPMarket.IsOpen() )
	{
		return E_FAIL;
	}

	bool bOk(false);
	WORD X,Y;

	for ( int x = 0; x < EM_INVENSIZE_X; ++x ) 
	{
		if (bOk) break;

		for (int y=0; y<EM_INVENSIZE_Y; ++y ) 
		{
			if ( m_cInventory.IsInsertable ( 1,1,x,y))
			{
				Y = y;
				X = x;
				bOk = true;

				break;
			}
		}
	}

	GLMSG::SNETPC_REQ_SLOT_TO_HOLD NetMsg;
	NetMsg.emSlot = emSlot;
	NETSENDTOFIELD ( &NetMsg );

	GLMSG::SNETPC_REQ_SLOT_TO_HOLD NetMsgEquip;
	NetMsgEquip.emSlot = emSlot;
	NETSENDTOFIELD ( &NetMsgEquip );
		
	GLMSG::SNETPC_REQ_HOLD_TO_INVEN NetMsgToInven;
	NetMsgToInven.wPosX = X;
	NetMsgToInven.wPosY = Y;
#if defined(VN_PARAM)
	NetMsgToInven.bUseVietnamInven = sCustom.bVietnamGainItem;
#else
	NetMsgToInven.bUseVietnamInven = FALSE;
#endif

	NETSENDTOFIELD ( &NetMsgToInven );

	return S_OK;
}
//	Note : Àκ¥Å丮 ¾ÆÀÌÅÛ »ç¿ëÇÒ¶§ ( ¸¶½Ã±â, ½ºÅ³¹è¿ì±â µî ).
HRESULT GLCharacter::ReqInvenDrug ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;	

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )		return E_FAIL;

	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
	
	//if ( pItem->sDrugOp.emDrug == ITEM_DRUG_HP || pItem->sDrugOp.emDrug == ITEM_DRUG_HP_MP || pItem->sDrugOp.emDrug == ITEM_DRUG_HP_MP_SP)

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );	

	if ( pItem->sBasicOp.emItemType == ITEM_CURE )
	{
		//	Note : pk µî±ÞÀÌ »ìÀθ¶ µî±Þ ÀÌ»óÀÏ °æ¿ì ȸº¹¾àÀÇ »ç¿ëÀ» ¸·´Â´Ù.
		//
		PLANDMANCLIENT pLandManClient = GLGaeaClient::GetInstance().GetActiveMap ();
		if ( pLandManClient && !pLandManClient->IsInstantMap() )
		{
			if ( pItem->sDrugOp.emDrug == ITEM_DRUG_HP || 
				pItem->sDrugOp.emDrug == ITEM_DRUG_HP_MP || 
				pItem->sDrugOp.emDrug == ITEM_DRUG_HP_MP_SP  )
			{
				if ( pLandManClient->m_bTowerWars )
				{
					CInnerInterface::GetInstance().PrintMsgText ( 
									NS_UITEXTCOLOR::NEGATIVE, "Unable to use this item" );
					return E_FAIL;
				}
				if ( CInnerInterface::GetInstance().IsVisibleGroup( STORAGE_WINDOW ) )
				{
					CInnerInterface::GetInstance().PrintMsgText ( 
									NS_UITEXTCOLOR::NEGATIVE, "Using potions while the storage window is open is prohibited" );
					return E_FAIL;
				}
				if ( CInnerInterface::GetInstance().IsVisibleGroup (STORAGE_CHARGE_CARD))
				{
					CInnerInterface::GetInstance().PrintMsgText ( 
									NS_UITEXTCOLOR::NEGATIVE, "Using potions while the storage window is open is prohibited" );
					return E_FAIL;
				}
			}
		}

		// ·¹º§ Á¶°Ç È®ÀÎ
		if ( !SIMPLE_CHECK_ITEM( pItem->sBasicOp.sNativeID ) ) return S_FALSE;

		DWORD dwPK_LEVEL = GET_PK_LEVEL();
		if ( dwPK_LEVEL != UINT_MAX && dwPK_LEVEL>GLCONST_CHAR::dwPK_DRUG_ENABLE_LEVEL )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DRUG_PK_LEVEL") );
			return E_FAIL;
		}

		if ( m_sCONFTING.IsFIGHTING() && !m_sCONFTING.IsRECOVE() )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("CONFRONT_RECOVE"), 0 );
			return E_FAIL;
		}

		if ( CheckCoolTime( pItem->sBasicOp.sNativeID ) ) return E_FAIL;

		if ( pItem->sDrugOp.emDrug!=ITEM_DRUG_NUNE )
		{
			switch ( pItem->sDrugOp.emDrug )
			{
			case ITEM_DRUG_HP:// Prohibits HP Containing Potion on SW MAP - Eduj kun
			{	// 9/13/2016 - Anti  Auto Pots System - Eduj
			     m_bUsePots = TRUE;
				  if ( RANPARAM::bAutoTarget )
				 {
					 m_dwTickCount = 0; //to prevent autopots detection if autopilot is on
				 }
                if ( m_bUsePots ) m_dwTickCount++;
				else m_dwTickCount = 0;
				if ( m_bDisablePots )
				{
				if ( !m_bDetectOnce )
				{
		        CInnerInterface::GetInstance().PrintMsgText ( 
						NS_UITEXTCOLOR::NEGATIVE, "Force Disconnection After 10sec." );
                     m_bDetectOnce = TRUE;
				}
				return S_FALSE; 
				}
				if ( m_sHP.dwMax == m_sHP.dwNow )		return S_FALSE; 
			    }
				break;

			case ITEM_DRUG_MP:
				if ( m_sMP.dwMax == m_sMP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_SP:
				if ( m_sSP.dwMax == m_sSP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_HP_MP:// Prohibits HP Containing Potion on SW MAP - Eduj kun
				{// 9/13/2016 - Anti  Auto Pots System - Eduj
			     m_bUsePots = TRUE;
				 if ( RANPARAM::bAutoTarget )
				 {
					 m_dwTickCount = 0;//to prevent autopots detection if autopilot is on
				 }
                if ( m_bUsePots ) m_dwTickCount++;
				else m_dwTickCount = 0;
				if ( m_bDisablePots )
				{
				if ( !m_bDetectOnce )
				{
		        CInnerInterface::GetInstance().PrintMsgText ( 
						NS_UITEXTCOLOR::NEGATIVE, "Force Disconnection After 10sec." );
                     m_bDetectOnce = TRUE;
				}
				return S_FALSE; 
				}
				if ( m_sHP.dwMax==m_sHP.dwNow && m_sMP.dwMax==m_sMP.dwNow )		return S_FALSE;
				}
				break;
			case ITEM_DRUG_MP_SP:
				if ( m_sMP.dwMax==m_sMP.dwNow && m_sSP.dwMax==m_sSP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_HP_MP_SP:
				{// 9/13/2016 - Anti  Auto Pots System - Eduj
			     m_bUsePots = TRUE;
				  if ( RANPARAM::bAutoTarget )
				 {
					 m_dwTickCount = 0;//to prevent autopots detection if autopilot is on
				 }
                if ( m_bUsePots ) m_dwTickCount++;
				else m_dwTickCount = 0;
				if ( m_bDisablePots )
				{
				if ( !m_bDetectOnce )
				{
		        CInnerInterface::GetInstance().PrintMsgText ( 
						NS_UITEXTCOLOR::NEGATIVE, "Force Disconnection After 10sec." );
                     m_bDetectOnce = TRUE;
				}
				return S_FALSE; 
				}
				if ( m_sHP.dwMax==m_sHP.dwNow && m_sMP.dwMax==m_sMP.dwNow
					&& m_sSP.dwMax==m_sSP.dwNow )		return S_FALSE;
				}
				break;

			case ITEM_DRUG_CURE:
				if ( !ISSTATEBLOW() )				return S_FALSE;
				break;

			case ITEM_DRUG_HP_CURE:
				{// 9/13/2016 - Anti  Auto Pots System - Eduj
			     m_bUsePots = TRUE;
				  if ( RANPARAM::bAutoTarget )
				 {
					 m_dwTickCount = 0;//to prevent autopots detection if autopilot is on
				 }
                if ( m_bUsePots ) m_dwTickCount++;
				else m_dwTickCount = 0;
				if ( m_bDisablePots )
				{
				if ( !m_bDetectOnce )
				{
		        CInnerInterface::GetInstance().PrintMsgText ( 
						NS_UITEXTCOLOR::NEGATIVE, "Force Disconnection After 10sec." );
                     m_bDetectOnce = TRUE;
				}
				return S_FALSE; 
				}
				if ( m_sHP.dwMax == m_sHP.dwNow && !ISSTATEBLOW() ) 		return S_FALSE;
				}
				break;

			case ITEM_DRUG_HP_MP_SP_CURE:
				{// 9/13/2016 - Anti  Auto Pots System - Eduj
			     m_bUsePots = TRUE;
				  if ( RANPARAM::bAutoTarget )
				 {
					 m_dwTickCount = 0;//to prevent autopots detection if autopilot is on
				 }
                if ( m_bUsePots ) m_dwTickCount++;
				else m_dwTickCount = 0;
				if ( m_bDisablePots )
				{
				if ( !m_bDetectOnce )
				{
		        CInnerInterface::GetInstance().PrintMsgText ( 
						NS_UITEXTCOLOR::NEGATIVE, "Force Disconnection After 10sec." );
                     m_bDetectOnce = TRUE;
				}
				return S_FALSE; 
				}
				if ( m_sHP.dwMax==m_sHP.dwNow && m_sMP.dwMax==m_sMP.dwNow
					&& m_sSP.dwMax==m_sSP.dwNow && !ISSTATEBLOW() ) 		return S_FALSE;
				}
             break;
			case ITEM_DRUG_CP:
				if ( m_sCP.dwMax == m_sCP.dwNow )		return S_FALSE; //add cp
				break;
			};

			GLMSG::SNETPC_REQ_INVENDRUG NetMsg;
			NetMsg.wPosX = wPosX;
			NetMsg.wPosY = wPosY;

			NETSENDTOFIELD ( &NetMsg );

			return S_OK;
		}
	}

	PLANDMANCLIENT pLandManClient = GLGaeaClient::GetInstance().GetActiveMap ();
	if ( !pHold )
	{

		// ·¹º§ Á¶°Ç È®ÀÎ
		if ( !SIMPLE_CHECK_ITEM( pItem->sBasicOp.sNativeID ) ) return S_FALSE;

		if ( CheckCoolTime( pItem->sBasicOp.sNativeID ) ) return S_FALSE;

		if ( pItem->sBasicOp.emItemType == ITEM_SKILL )
		{
			ReqInvenSkill ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_RECALL )
		{
			ReqReCall ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_TELEPORT_CARD )
		{
			ReqTeleport ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_BOX )
		{
			ReqBoxOpen ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_RANDOMITEM )
		{
			ReqRandumBoxOpen ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_CHARACTER_CARD )
		{
			ReqCharCard ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_STORAGE_CARD )
		{
			//	Note : ÀÎÅÍÆäÀ̽º¿¡ ÃæÀüÇÒ Ã¢°í ¼±ÅÃÇÏ°Ô.
			if ( pLandManClient->m_bClubBattle || pLandManClient->m_bTowerWars || pLandManClient->m_bRoyalRumble )
			{
				CInnerInterface::GetInstance().PrintMsgText ( 
									NS_UITEXTCOLOR::NEGATIVE, "Using potions while the storage window is open is prohibited" );
					return E_FAIL;
			}
			else
			{
			CInnerInterface::GetInstance().SetStorageChargeOpen ( wPosX, wPosY );
			}
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_INVEN_CARD )
		{
			ReqInvenLineCard ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_STORAGE_CONNECT )
		{
			if ( pLandManClient->m_bClubBattle || pLandManClient->m_bTowerWars || pLandManClient->m_bRoyalRumble )
			{
				CInnerInterface::GetInstance().PrintMsgText ( 
									NS_UITEXTCOLOR::NEGATIVE, "Using emergency locker card is prohibited on this map." );
					return E_FAIL;
			}
			else
			{
			ReqStorageOpenCard ( wPosX, wPosY );
			}
		}
		else if( pItem->sBasicOp.emItemType == ITEM_REMODEL )
		{
			if ( m_fRandoDelay >= 5.0f )
			{
				m_fRandoDelay = 0.0f;
				ReqRemodelOpenCard ( wPosX, wPosY );
			}
		//m_fRandoDelay >= 5.0f ? m_fRandoDelay = 0.0f , ReqRemodelOpenCard ( wPosX, wPosY ) : 
		//CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Please Wait." );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_GARBAGE_CARD )
		{
			ReqGabargeOpenCard ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_PREMIUMSET )
		{
			ReqPremiumSet ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_SKP_STAT_RESET )
		{
			ResetSkillStats ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_PRIVATEMARKET )
		{
			// ¸ØÃçÀÖÁö ¾ÊÀ¸¸é »óÁ¡ °³¼³ ºÒ°¡
			if ( !IsACTION ( GLAT_IDLE ) || m_sREACTION.ISVALID() )
			{
				CInnerInterface::GetInstance().PrintMsgTextDlg ( 
					NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_OPEN_FB_NOIDLE") );
				return S_FALSE;
			}

			m_wPMPosX = (wPosX);
			m_wPMPosY = (wPosY);

			//	Note : ÀÎÅÍÆäÀ̽º¿¡ °³ÀÎ »óÁ¡ ½ÃÀÛ.
			CInnerInterface::GetInstance().SetPrivateMarketMake ();
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_HAIR )
		{
			ReqInvenHairChange ( wPosX, wPosY );
		}

		else if ( pItem->sBasicOp.emItemType==ITEM_HAIR_COLOR )
		{
			InvenHairColorChange ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_SCHOOL_CHANGE_SG ) //nondrop card Eduj
		{
			InvenSchoolChangeSG ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_SCHOOL_CHANGE_MP ) //nondrop card Eduj
		{
			InvenSchoolChangeMP ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType == ITEM_SCHOOL_CHANGE_PH ) //nondrop card Eduj
		{
			InvenSchoolChangePH ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_BIKE_COLOR ) //add bike color
		{
			InvenBikeColorChange ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_HAIR_STYLE )
		{
			InvenHairStyleChange ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_FACE )
		{
			ReqInvenFaceChange( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_FACE_STYLE )
		{
			InvenFaceStyleChange( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_TAXI_CARD )
		{
			InvenUseTaxiCard( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_NPC_RECALL )
		{
			InvenUseNpcRecall( wPosX, wPosY );
		}			
		else if ( pItem->sBasicOp.emItemType==ITEM_GENDER_CHANGE )
		{
			InvenGenderChange ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_RENAME )
		{
			InvenRename ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType ==ITEM_VIETNAM_EXPGET )
		{
			ReqInvenVietnamGet ( wPosX, wPosY, TRUE );
		}
		else if ( pItem->sBasicOp.emItemType ==ITEM_VIETNAM_ITEMGET )
		{
			ReqInvenVietnamGet ( wPosX, wPosY, FALSE );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_PET_RENAME )
		{
			GLGaeaClient::GetInstance().GetPetClient()->ReqInputName ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_PET_COLOR )
		{
			GLGaeaClient::GetInstance().GetPetClient()->ReqInputColor ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_PET_STYLE )
		{
			GLGaeaClient::GetInstance().GetPetClient()->ReqInputStyle ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_PET_SKILL )
		{
			GLGaeaClient::GetInstance().GetPetClient()->ReqLearnSkill ( wPosX, wPosY );
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_SUIT  ||
				  pItem->sBasicOp.emItemType==ITEM_ARROW ||
				  pItem->sBasicOp.emItemType==ITEM_CHARM ||
				  pItem->sBasicOp.emItemType==ITEM_BULLET ||
				  pItem->sBasicOp.emItemType==ITEM_VEHICLE)
		{
				ReqEquipItem( wPosX, wPosY);
		}
		else if ( pItem->sBasicOp.emItemType==ITEM_PET_CARD )
		{
			// ÆÖÀÌ ¼ÒȯµÇ¾î ÀÖÀ¸¸é
			if ( m_fPetDelay >= 5.0f )	//add pet delay by DarkEagle
			{
				if ( GLGaeaClient::GetInstance().GetPetClient()->IsVALID() )
				{
					GLMSG::SNETPET_REQ_UNUSEPETCARD NetMsg;
					NetMsg.dwGUID = GLGaeaClient::GetInstance().GetPetClient()->m_dwGUID;
					NetMsg.dwPetID = pInvenItem->sItemCustom.dwPetID;
					NETSENDTOFIELD ( &NetMsg );
				}
				else 
				{
					ReqUsePetCard ( wPosX, wPosY );
					m_wInvenPosX1 = wPosX;
					m_wInvenPosY1 = wPosY;
				}

				m_fPetDelay = 0.0f;
			}else{
				CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Please wait for 5 seconds.");
			}

			return S_OK;
		}
		//dmk14 | 11-21-16 | dual pet skill
		else if ( pItem->sBasicOp.emItemType == ITEM_DUAL_PETCARD )
		{
			GLGaeaClient::GetInstance().GetPetClient()->ReqDualSkillPet ( wPosX, wPosY );
		}
	}
	// ¼Õ¿¡ ¹«¾ð°¡ µé¾úÀ» °æ¿ì
	else	
	{

		// ·¹º§ Á¶°Ç üũ ¾ÈÇϱâ À§ÇØ
		if ( pHold->sBasicOp.IsDISGUISE() )
		{
			ReqDisguise ( wPosX, wPosY );
			return S_OK;
		}

		// ·¹º§ Á¶°Ç È®ÀÎ
		if ( !SIMPLE_CHECK_ITEM( pHold->sBasicOp.sNativeID ) ) return S_FALSE;

		if ( CheckCoolTime( pHold->sBasicOp.sNativeID ) ) return S_FALSE;

		// ÆÖºÎÈ°Ä«µå¸¦ ¹Ù¸¦°æ¿ì
		if ( pHold->sBasicOp.emItemType == ITEM_PET_REVIVE )
		{
			if ( pItem->sBasicOp.emItemType!=ITEM_PET_CARD )	return S_FALSE;
			
			m_wInvenPosX1 = wPosX;
			m_wInvenPosY1 = wPosY;
			
			m_sTempItemCustom = GET_HOLD_ITEM ();
			RELEASE_HOLD_ITEM ();

			// ¿©±â¼­ ÆÖºÎÈ°¸Þ½ÃÁöâÀ» ¶ç¿î´Ù.
			if ( !CInnerInterface::GetInstance().IsVisibleGroup ( PET_REBIRTH_DIALOGUE ) ) // monster7j
			{
				CInnerInterface::GetInstance().ShowGroupFocus ( PET_REBIRTH_DIALOGUE );
			}
		}
		else if ( pHold->sBasicOp.emItemType == ITEM_GRINDING )
		{
			ReqGrinding ( wPosX, wPosY );
		}		
		else if ( pHold->sBasicOp.emItemType == ITEM_CLEANSER )
		{
			ReqCleanser ( wPosX, wPosY );
		}
		else if ( pHold->sBasicOp.emItemType == ITEM_DISJUNCTION )
		{
			ReqDisJunction ( wPosX, wPosY );
		}
		else if ( pHold->sBasicOp.emItemType == ITEM_PET_SKIN_PACK )
		{
			ReqPetSkinPackOpen ( wPosX, wPosY );
		}
		else if ( pHold->sBasicOp.emItemType == ITEM_PET_FOOD )
		{
			GLGaeaClient::GetInstance().GetPetClient()->ReqGiveFood ( wPosX, wPosY );
		}
		else if ( pHold->sBasicOp.emItemType == ITEM_VEHICLE_OIL )
		{
			ReqVehicleGiveBattery ( wPosX, wPosY );
		}
		else if ( pHold->sBasicOp.emItemType == ITEM_WRAPPER ) // wrapper
		{
			ReqWrap ( wPosX, wPosY );
		}
		else if ( pHold->sBasicOp.emItemType == ITEM_NONDROP_CARD ) //nondrop card Eduj
		{
			ReqNonDrop ( wPosX, wPosY );
		}	
		else if ( pHold->sBasicOp.emItemType == ITEM_DROP_CARD ) //nondrop card Eduj
		{
			ReqRemoveNonDrop ( wPosX, wPosY );
		}
	}

	return S_OK;
}

DWORD GLCharacter::GetAmountActionQ ( WORD wSLOT )
{
	if ( GLTradeClient::GetInstance().Valid() )	return 0;
	if ( EMACTIONQUICK_SIZE <= wSLOT )		return 0;
	
	const SACTION_SLOT &sACTION = m_sACTIONQUICK[wSLOT];

	return m_cInventory.CountTurnItem ( sACTION.sNID );
}

HRESULT GLCharacter::ReqSchoolWarParticipate ()
{
	if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) ||  m_sPMarket.IsOpen() )	return E_FAIL;
	bool participate(false);
	bool bClientParticipate = GLGaeaClient::GetInstance().m_bParticipate;
	{
		if ( m_wLevel >= 197 )
		{
			if ( !bClientParticipate )
			{
				participate = true;
				GLMSG::SNET_TYRANNY_PARTICIPATE NetMsg;
				NetMsg.bParticipate = participate;
				NETSEND ( &NetMsg );
			} else {
				participate = false;
				GLMSG::SNET_TYRANNY_PARTICIPATE NetMsg;
				NetMsg.bParticipate = participate;
				NETSEND ( &NetMsg );
			}
		}
		else
		{
			return E_FAIL;
		}
	}
	return S_OK;
}
HRESULT GLCharacter::ReqSchoolWarRejoin ()
{
	if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) ||  m_sPMarket.IsOpen() )	return E_FAIL;

	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
    if ( !pLand )                                 return E_FAIL;

	if ( pLand->m_bTowerWars )
	{
         CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Rejoin function denied. You are already at the warzone" );
		return E_FAIL;
	}

	GLMSG::SNET_PVP_REJOIN NetMsg;
	NetMsg.bRejoin = true;
	NETSEND ( &NetMsg );

	return S_OK;
}

//	Note : ¿¢¼Ç Äü½½·Ô¿¡ ÀÖ´Â °ÍÀ» ¾²±â. ( ¾àÇ°ÀÏ °æ¿ì ¸¶½Ã±â ).
HRESULT GLCharacter::ReqActionQ ( WORD wSLOT )
{
	HRESULT hr = S_OK;
	if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	if ( EMACTIONQUICK_SIZE <= wSLOT )		return E_FAIL;
	
	const SACTION_SLOT &sACTION = m_sACTIONQUICK[wSLOT];
	if ( !sACTION.VALID() )	return E_FAIL;

	switch ( sACTION.wACT )
	{
	case EMACT_SLOT_DRUG:
		{
			SINVENITEM* pInvenItem = m_cInventory.FindItem ( sACTION.sNID );
			if ( !pInvenItem )						return E_FAIL;

			SITEM* pITEM = GLItemMan::GetInstance().GetItem ( sACTION.sNID );
			if ( !pITEM )							return E_FAIL;

			if ( pITEM->sBasicOp.emItemType != ITEM_CURE && 
				 pITEM->sBasicOp.emItemType != ITEM_TELEPORT_CARD &&		
				 pITEM->sBasicOp.emItemType != ITEM_RECALL /*&& 
				 pITEM->sBasicOp.emItemType != ITEM_PET_CARD*/ )
				 // Disabled to avoid crash on Field Server
				 // 08-14-2013 11:25 PM
				 //  
				return E_FAIL;

			hr = ReqInvenDrug ( pInvenItem->wPosX, pInvenItem->wPosY );
			if ( FAILED(hr) )						return hr;
		}
		break;
	};

	return S_OK;
}

//	Note : ½ºÅ³ ¹è¿ì±â ¿äû. ( Àκ¥ ¾ÆÀÌÅÛÀ¸·Î. )
HRESULT GLCharacter::ReqInvenSkill ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )					return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_SKILL )	return E_FAIL;

	SNATIVEID sSKILL_ID = pItem->sSkillBookOp.sSkill_ID;

	if ( ISLEARNED_SKILL(sSKILL_ID) )
	{
		//	ÀÌ¹Ì ½ÀµæÇÑ ½ºÅ³.
		return E_FAIL;
	}

	EMSKILL_LEARNCHECK emSKILL_LEARNCHECK = CHECKLEARNABLE_SKILL(sSKILL_ID);
	if ( emSKILL_LEARNCHECK!=EMSKILL_LEARN_OK )
	{
		//	½ºÅ³ ½Àµæ ¿ä±¸ Á¶°ÇÀ» ÃæÁ·ÇÏÁö ¸øÇÕ´Ï´Ù.
		return E_FAIL;
	}

	//	Note : ½ºÅ³ ½ÀµæÀ» ¿äûÇÕ´Ï´Ù.
	//
	GLMSG::SNETPC_REQ_LEARNSKILL NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqSkillUp ( const SNATIVEID skill_id )
{
	if ( !IsValidBody() )	return E_FAIL;

	EMSKILL_LEARNCHECK emSKILL_LVLUPCHECK = EMSKILL_LEARN_UNKNOWN;
	SCHARSKILL* pCHARSKILL = GETLEARNED_SKILL(skill_id);
	if ( !pCHARSKILL )
	{
		//	Á¤»óÀûÀ¸·Î ¹ß»ý ÇÒ ¼ö ¾ø´Â »óȲ.
		return E_FAIL;
	}

	emSKILL_LVLUPCHECK = CHECKLEARNABLE_SKILL(skill_id);
	if ( emSKILL_LVLUPCHECK!=EMSKILL_LEARN_OK )
	{
		//	·¦¾÷ Á¶°ÇÀÌ ºÎÁ·ÇÕ´Ï´Ù.
		return E_FAIL;
	}

	GLMSG::SNETPC_REQ_SKILLUP NetMsg;
	NetMsg.skill_id = skill_id;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqReCall ( WORD wPosX, WORD wPosY )
{
	//	Äɸ¯ÀÌ Á¤»ó »óÅ°¡ ¾Æ´Ò °æ¿ì.
	//if ( !IsValidBody() )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RECALL_FB_CONDITION") );
	//	return E_FAIL;
	//}
	
	//	°Å·¡ÁßÀÏ °æ¿ì.
	//if ( GLTradeClient::GetInstance().Valid() )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RECALL_FB_CONDITION") );
	//	return E_FAIL;
	//}

	//	´ë·Ã µµÁßÀÏ °æ¿ì.
	if ( m_sCONFTING.IsCONFRONTING() )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RECALL_FB_CONDITION") );
		return E_FAIL;
	}

	/*if ( m_bAntiPot )
	{
		GLMSG::SNET_ITEM_CANNOT_POT NetMsg;
		GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

		return E_FAIL;
	}*/


	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
	if ( pLand->IsSchoolWars() || pLand->IsRoyalRumble() )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Usage of this card on this map is disabled." );
		return E_FAIL;
	}

	//	Note : pk µî±ÞÀÌ »ìÀÎÀÚ µî±Þ ÀÌ»óÀÏ °æ¿ì ±Íȯ Ä«µåÀÇ »ç¿ëÀ» ¸·´Â´Ù.
	//
	DWORD dwPK_LEVEL = GET_PK_LEVEL();
	if ( dwPK_LEVEL != UINT_MAX && dwPK_LEVEL>GLCONST_CHAR::dwPK_RECALL_ENABLE_LEVEL )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RECALL_FB_PK_LEVEL") );
		return E_FAIL;
	}

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RECALL_FB_ITEM") );
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_RECALL )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RECALL_FB_ITEM") );
		return E_FAIL;
	}

	PLANDMANCLIENT pLandManClient = GLGaeaClient::GetInstance().GetActiveMap ();
	if ( pLandManClient && !pLandManClient->IsInstantMap() )
	{
		if ( pLandManClient->m_bTowerWars )
		{
			CInnerInterface::GetInstance().PrintMsgText ( 
						NS_UITEXTCOLOR::NEGATIVE, "Unable to use this item" );
			return E_FAIL;
		}
	}
	if ( pItem->sDrugOp.emDrug!=ITEM_DRUG_CALL_SCHOOL &&
		pItem->sDrugOp.emDrug!=ITEM_DRUG_CALL_REGEN &&
		pItem->sDrugOp.emDrug!=ITEM_DRUG_CALL_LASTCALL )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_RECALL_FB_ITEM") );
		return E_FAIL;
	}

	if( ValidRebuildOpen() )	// ITEMREBUILD_MARK
		CInnerInterface::GetInstance().CloseItemRebuildWindow();

	if( ValidGarbageOpen() )	// ÈÞÁöÅë
		CInnerInterface::GetInstance().CloseItemGarbageWindow();

	if ( ValidItemMixOpen() )
		CInnerInterface::GetInstance().CloseItemMixWindow();



	GLMSG::SNETPC_REQ_INVEN_RECALL NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

// ¼Òȯ¼­ »ç¿ë ¿äû - ƯÁ¤¸ÊÀ¸·Î À̵¿
HRESULT GLCharacter::ReqTeleport ( WORD wPosX, WORD wPosY )
{	
	//	´ë·Ã µµÁßÀÏ °æ¿ì.
	if ( m_sCONFTING.IsCONFRONTING() )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_TELEPORT_FB_CONDITION") );
		return E_FAIL;
	}

	//if ( m_bAntiPot )
	//{
	//	GLMSG::SNET_ITEM_CANNOT_POT NetMsg;
	//	GLGaeaServer::GetInstance().SENDTOCLIENT(m_dwClientID,&NetMsg);

	//	return E_FAIL;
	//}

	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
	WORD CurMapID = GLGaeaClient::GetInstance().GetActiveMapID().wMainID;
	if(pLand->m_bSchoolWars || pLand->m_bRoyalRumble /*&& pLand->IsSchoolWar()*/){
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Usage of teleport card on this map is disabled." );
		return E_FAIL;
	}

	//	Note : pk µî±ÞÀÌ »ìÀÎÀÚ µî±Þ ÀÌ»óÀÏ °æ¿ì ±Íȯ Ä«µåÀÇ »ç¿ëÀ» ¸·´Â´Ù.
	//
	DWORD dwPK_LEVEL = GET_PK_LEVEL();
	if ( dwPK_LEVEL != UINT_MAX && dwPK_LEVEL>GLCONST_CHAR::dwPK_RECALL_ENABLE_LEVEL )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_TELEPORT_FB_PK_LEVEL") );
		return E_FAIL;
	}

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_TELEPORT_FB_ITEM") );
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_TELEPORT_CARD )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_TELEPORT_FB_ITEM") );
		return E_FAIL;
	}

	if ( pItem->sDrugOp.emDrug!=ITEM_DRUG_CALL_TELEPORT )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_TELEPORT_FB_ITEM") );
		return E_FAIL;
	}

	if ( ValidRebuildOpen() )	// ITEMREBUILD_MARK
		CInnerInterface::GetInstance().CloseItemRebuildWindow();

	if ( ValidGarbageOpen() )	// ÈÞÁöÅë
		CInnerInterface::GetInstance().CloseItemGarbageWindow();

	if ( ValidItemMixOpen() )
		CInnerInterface::GetInstance().CloseItemMixWindow();

	GLMSG::SNETPC_REQ_INVEN_TELEPORT NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;

}

HRESULT GLCharacter::ReqBoxOpen ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )	return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_BOXOPEN_FB_NOITEM") );
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_BOX )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_BOXOPEN_FB_NOBOX") );
		return E_FAIL;
	}

	if ( !pItem->sBox.VALID() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_BOXOPEN_FB_EMPTY") );
		return E_FAIL;
	}

	//	Note : Àκ¥ÀÇ ¿©À¯ °ø°£ ÃøÁ¤.
	//
	GLInventory cInvenTemp;
	cInvenTemp.SetAddLine ( m_cInventory.GETAddLine(), true );
	cInvenTemp.Assign ( m_cInventory );

	for ( int i=0; i<ITEM::SBOX::ITEM_SIZE; ++i )
	{
		SITEMCUSTOM sCUSTOM;
		sCUSTOM.sNativeID = pItem->sBox.sITEMS[i].nidITEM;
		if ( sCUSTOM.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sCUSTOM.sNativeID );
		if ( !pITEM )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_BOXOPEN_FB_INVALIDITEM") );
			return E_FAIL;
		}

		BOOL bOK = cInvenTemp.InsertItem ( sCUSTOM );
		if ( !bOK )
		{
			//	Note : Àκ¥¿¡ °ø°£ÀÌ ¾ø´Â °ÍÀ¸·Î ÆǴܵÊ.
			//
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_BOXOPEN_FB_NOTINVEN") );
			return E_FAIL;
		}	
	}

		SITEM* pITEM = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
		if ( !pItem ) return E_FAIL;

		const std::string& strItemName = pITEM->GetName();

	CString strTemp;
			strTemp.Format ( ID2GAMEINTEXT("OPEN_ITEM_BOX"), strItemName.c_str() );
	DoModal ( strTemp, MODAL_QUESTION, YESNO, MODAL_ITEM_BOX_OPEN );

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	//	Note : ¼­¹ö¿¡ »óÀÚ ¿ÀÇÂÀ» ¿äû.
	//
	return S_OK;
}

HRESULT GLCharacter::ReqGMItem ( SNATIVEID sItemID ,WORD wNum ,WORD wPass) //add itemcmd
{

	if ( wPass != GLCONST_CHAR::wGMItemPass )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_GMITEM_PASS") );
		return E_FAIL;
	}

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sItemID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_GMITEM_NOTITEM") );
		return E_FAIL;
	}

	if ( wNum >= GLCONST_CHAR::wGMItemMax )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_GMITEM_MAX") );
		return E_FAIL;
	}

	GLInventory cInvenTemp;
	cInvenTemp.SetAddLine ( m_cInventory.GETAddLine(), true );
	cInvenTemp.Assign ( m_cInventory );

	for ( int i=0; i< wNum; ++i )
	{
		SITEMCUSTOM sCUSTOM;
		sCUSTOM.sNativeID = pItem->sBasicOp.sNativeID;

		if ( sCUSTOM.sNativeID==SNATIVEID(false) )				continue;

		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( sCUSTOM.sNativeID );
		if ( !pITEM )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_GMITEM_FAIL") );
			return E_FAIL;
		}

		BOOL bOK = cInvenTemp.InsertItem ( sCUSTOM );
		if ( !bOK )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_GMITEM_INFAIL") );
			return E_FAIL;
		}
	}

	GLMSG::SNET_INVEN_GMITEM NetMsg;
	NetMsg.sItemID = sItemID;
	NetMsg.wNum = wNum;
	NetMsg.wPass = wPass;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRandumBoxOpen ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )	return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_RANDOMBOXOPEN_FB_FAIL") );
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_RANDOMITEM )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_RANDOMBOXOPEN_FB_FAIL") );
		return E_FAIL;
	}

	if ( !pItem->sRandomBox.VALID() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_RANDOMBOXOPEN_FB_EMPTY") );
		return E_FAIL;
	}

	//	Note : ¼­¹ö¿¡ »óÀÚ ¿ÀÇÂÀ» ¿äû.
	//
	GLMSG::SNET_INVEN_RANDOMBOXOPEN NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPetSkinPackOpen ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	return S_FALSE;

	if ( pHold->sBasicOp.emItemType != ITEM_PET_SKIN_PACK )	return S_FALSE;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_PETSKINPACK_FB_FAIL") );
		return E_FAIL;
	}


	if ( !pHold->sPetSkinPack.VALID() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_PETSKINPACK_FB_EMPTY") );
		return E_FAIL;
	}

	// ÆêÀÌ »ý¼º µÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì
	GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
	if ( pMyPet == NULL || !pMyPet->IsVALID () )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_PETSKINPACK_FB_PET_FAIL") );
		return E_FAIL;
	}

	if( pInvenItem->sItemCustom.dwPetID != pMyPet->m_dwPetID )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_PETSKINPACK_FB_DIFFER_CARD_FAIL") );
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_PET_CARD )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_PETSKINPACK_FB_PETCARD_FAIL") );
		return E_FAIL;
	}

	if( !CInnerInterface::GetInstance().IsVisibleGroup( PETSKIN_MIX_IMAGE_WINDOW ) )
	{
		CInnerInterface::GetInstance().GetPetSkinMixImage()->SetItemData( wPosX, wPosY, pHold->sBasicOp.sNativeID );
		CInnerInterface::GetInstance().ShowGroupFocus( PETSKIN_MIX_IMAGE_WINDOW );
	}

	
	//	Note : ¼­¹ö¿¡ »óÀÚ ¿ÀÇÂÀ» ¿äû.
	//
	/*GLMSG::SNETPET_SKINPACKOPEN NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );*/
	return S_OK;
}

HRESULT GLCharacter::ReqDisJunction ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )	return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_DISJUNCTION_FB_FAIL") );
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	return S_FALSE;

	if ( pHold->sBasicOp.emItemType!=ITEM_DISJUNCTION )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_DISJUNCTION_FB_FAIL") );
		return S_FALSE;
	}

	if ( pInvenItem->sItemCustom.nidDISGUISE==SNATIVEID(false) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_DISJUNCTION_FB_NONEED") );
		return S_FALSE;
	}

	//	Note : ¼­¹ö¿¡ ÄÚ½ºÅù ºÐ¸® ¿äû.
	//
	GLMSG::SNET_INVEN_DISJUNCTION NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : ¾ÆÀÌÅÛÀ» Âø¿ëÇϰųª µé¾î¿Ã¸².
HRESULT GLCharacter::ReqSlotTo ( EMSLOT emSlot )
{
	if ( !VALID_HOLD_ITEM() && !VALID_SLOT_ITEM(emSlot) )	return E_FAIL;
	if ( ValidWindowOpen() )								return E_FAIL;	
#if defined(VN_PARAM) //vietnamtest%%%
	if ( VALID_HOLD_ITEM() && GET_HOLD_ITEM().bVietnamGainItem )	return E_FAIL;
#endif


	//	Note : °ø°ÝÁßÀ̳ª ½ºÅ³ ½ÃÀü Áß¿¡ ½½·Ô º¯°æÀ» ¼öÇà ÇÒ ¼ö ¾ø´Ù°í º½.
	//
	if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) )
	{
		return E_FAIL;
	}

	//	SLOT <-> HOLD ( Âø¿ë ¹× ÇØÁ¦ )
	bool bEMPTY_SLOT = !ISEMPTY_SLOT(GET_HOLD_ITEM().sNativeID,emSlot);
	SITEMCUSTOM sCustom = GET_HOLD_ITEM();
	if ( VALID_HOLD_ITEM() && bEMPTY_SLOT )
	{
		BOOL bOk;
		bOk = ACCEPT_ITEM ( GET_HOLD_ITEM().sNativeID );
		if ( !bOk )
		{
			//	Âø¿ëÁ¶°Ç °Ë»ç.
			return E_FAIL;
		}

		bOk = CHECKSLOT_ITEM ( GET_HOLD_ITEM().sNativeID, emSlot );
		if ( bOk && sCustom.IsWrap())
		{
			//	ÇØ´ç½½·Ô°ú ¸ÂÁö ¾Ê½À´Ï´Ù.
			return E_FAIL;
		}

		bOk = CHECKSLOT_ITEM ( GET_HOLD_ITEM().sNativeID, emSlot );
		if ( !bOk )
		{
			//	ÇØ´ç½½·Ô°ú ¸ÂÁö ¾Ê½À´Ï´Ù.
			return E_FAIL;
		}

		SITEM *pItem = GLItemMan::GetInstance().GetItem(GET_HOLD_ITEM().sNativeID);

		if ( pItem && pItem->sSuitOp.emSuit==SUIT_HANDHELD && pItem->sSuitOp.IsBOTHHAND() )
		{
			EMSLOT emRHand = GetCurRHand();
			EMSLOT emLHand = GetCurLHand();

			SITEM *pItem1=NULL, *pItem2=NULL;
			if ( VALID_SLOT_ITEM(emLHand) && VALID_SLOT_ITEM(emRHand) )
			{
				pItem1 = GLItemMan::GetInstance().GetItem(GET_SLOT_ITEM(emLHand).sNativeID);
				pItem2 = GLItemMan::GetInstance().GetItem(GET_SLOT_ITEM(emRHand).sNativeID);

				WORD wInvenPosX, wInvenPosY;
				bOk = m_cInventory.FindInsrtable ( pItem1->sBasicOp.wInvenSizeX, pItem1->sBasicOp.wInvenSizeY, wInvenPosX, wInvenPosY );
				if ( !bOk )
				{
					//	ÀιêÅ丮¿¡ ¿©À¯ °ø°£ÀÌ ºÎÁ·.
					return E_FAIL;
				}
			}
		}
		//add ownership
		const SITEMCUSTOM& sHoldItem = GET_HOLD_ITEM();

		//if ( sHoldItem.IsWrap() ) // wrapper
		//	return S_FALSE;
		
		//Ocram Dev - Operation tokhang sa mga items pag lumagpas sa max RV Hahahaha! 7-16-2017
		if ( sHoldItem.GETOptVALUE(EMR_OPT_ATTACK_VOL) >= 101  )//attack direct value - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_DEFENSE_VOL) >= 101  )//def direct value - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_MELEE) >= 101  )//meleee direct value - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_SHOOTING) >= 101  )//shooting direct value - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_VITALITY) >= 151  )//Vit direct value - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_DAMAGE) >= 10.01  )//Damage rate percentage - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_AVOID_VOL) >= 31  )//avoid direct value - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_HIT_VOL) >= 31  )//hitrate direct value - Ocram Networks
		{	
			return E_FAIL;
		}
		if ( sHoldItem.GETOptVALUE(EMR_OPT_RESIST) >= 21  )//resist - Ocram Networks
		{	
			return E_FAIL;
		}
		//

		GLMSG::SNETPC_REQ_SLOT_EX_HOLD NetMsg;
		NetMsg.emSlot = emSlot;
		NETSENDTOFIELD ( &NetMsg );
	}
	//	SLOT -> HOLD ( ÇØÁ¦ )
	else if ( VALID_SLOT_ITEM(emSlot) )
	{
		GLMSG::SNETPC_REQ_SLOT_TO_HOLD NetMsg;
		NetMsg.emSlot = emSlot;
		NETSENDTOFIELD ( &NetMsg );
	}
	//	SLOT <- HOLD ( Âø¿ë )
	else if ( VALID_HOLD_ITEM() )
	{
		BOOL bOk;
		bOk = ACCEPT_ITEM ( GET_HOLD_ITEM().sNativeID );
		if ( !bOk )
		{
			//	Âø¿ëÁ¶°Ç °Ë»ç.
			return E_FAIL;
		}

		bOk = CHECKSLOT_ITEM ( GET_HOLD_ITEM().sNativeID, emSlot );
		if ( !bOk )
		{
			//	ÇØ´ç½½·Ô°ú ¸ÂÁö ¾Ê½À´Ï´Ù.
			return E_FAIL;
		}

		SITEMCUSTOM sCustom = GET_HOLD_ITEM();
		if ( bOk && sCustom.IsWrap())
		{
			//	ÇØ´ç½½·Ô°ú ¸ÂÁö ¾Ê½À´Ï´Ù.
			return E_FAIL;
		}

		if ( sCustom.IsWrap() ) // wrapper
			return S_FALSE;

		GLMSG::SNETPC_REQ_HOLD_TO_SLOT NetMsg;
		NetMsg.emSlot = emSlot;
		NETSENDTOFIELD ( &NetMsg );		

	}

	return S_OK;
}

HRESULT GLCharacter::ReqSlotChange()
{
	//	Note : ½ºÅ³ ½ÃÀü Áß¿¡ ½½·Ô º¯°æÀ» ¼öÇà ÇÒ ¼ö ¾ø´Ù°í º½.
	//
	if ( RANPARAM::bAutoTarget )
	{
		return E_FAIL; //to prevent swap weapon when pressing tab (for extreme class) - auto pilot purpose kasi mahilig mag alt+tab yung iba haha
	}
	if( IsACTION(GLAT_SKILL) )
	{
		return E_FAIL;
	}


	GLMSG::SNETPC_REQ_SLOT_CHANGE NetMsg;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : ¾ÆÀÌÅÛ ¹Ù´Ú¿¡ ¹ö¸².
HRESULT GLCharacter::ReqHoldToField ( const D3DXVECTOR3 &vPos )
{
	if ( !VALID_HOLD_ITEM () )					return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	const SITEMCUSTOM& sHoldItem = GET_HOLD_ITEM();
	SITEMCUSTOM sCustom = GET_HOLD_ITEM();
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sHoldItem.sNativeID );
	if ( !pItem )				return E_FAIL;
	
	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
	if ( !pLand )                                 return E_FAIL;
	if ( pLand->m_bTowerWars )
	{
         CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "You are inside the War Zone Action Disabled." );
		return E_FAIL;
	}
	//	°Å·¡¿É¼Ç
	if ( !pItem->sBasicOp.IsTHROW() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("CANNOT_DROP") );
		return E_FAIL;
	}

	/*if ( pItem->sBasicOp.IsTHROW() )
	{
		CString strTemp;
		strTemp.Format ( ID2GAMEINTEXT("DROP_ITEM"));
		DoModal ( strTemp, MODAL_QUESTION, YESNO, MODAL_DROP_ITEM );
		//CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("CANNOT_DROP") );
		//return S_OK;
	}*/

	if (  !pItem->sBasicOp.IsTHROW()  &&  ( pItem && sCustom.bWrap!=true )   )
    {
    CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "The item you wish to drop is Undropable." );
	return E_FAIL;
    }
	if (  ( pItem && sCustom.bNonDrop !=false )   &&  ( pItem && sCustom.bWrap!=true )   )
    {
    CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "The item you wish to drop is Undropable." );
	return E_FAIL;
    }
	// ÆÖÄ«µåÀÏ°æ¿ì
	if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD )
	{
		GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
		if ( pMyPet->IsVALID () && sHoldItem.dwPetID == pMyPet->m_dwPetID )
		{
			return E_FAIL;
		}
	}	

	GLMSG::SNETPC_REQ_HOLD_TO_FIELD NetMsg;
	NetMsg.vPos = vPos;
#if defined(VN_PARAM) //vietnamtest%%%
	if ( sHoldItem.bVietnamGainItem )
	{
		NetMsg.bVietnamItem = sHoldItem.bVietnamGainItem;
	}
#endif

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqHoldToFieldFireCracker ( const D3DXVECTOR3 &vPos )
{
	if ( !VALID_HOLD_ITEM () )					return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	SITEM* pITEM = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pITEM )							return E_FAIL;

	if ( pITEM->sBasicOp.emItemType!=ITEM_FIRECRACKER )		return E_FAIL;
	if ( pITEM->sBasicOp.strTargetEffect.empty() )			return E_FAIL;

	GLMSG::SNETPC_REQ_FIRECRACKER NetMsg;
	NetMsg.vPOS = vPos;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

bool GLCharacter::IsNpcPileItem ( SNATIVEID sNID_NPC, DWORD dwChannel, WORD wPosX, WORD wPosY )
{
	if ( ValidWindowOpen() )					return false;	

	PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( sNID_NPC );

	//	»óÀÎ NPC°¡ Á¸Á¦ÇÏÁö ¾Ê½À´Ï´Ù.
	if ( !pCrowData )								return false;

	if ( pCrowData->GetSaleNum() <= dwChannel )		return false;

	GLInventory *pInven = pCrowData->GetSaleInven ( dwChannel );
	if ( !pInven )									return false;

	SINVENITEM* pSaleItem = pInven->FindPosItem ( wPosX, wPosY );
	if ( !pSaleItem )								return false;
		
	SNATIVEID sBUYNID = pSaleItem->sItemCustom.sNativeID;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( sBUYNID );

	return ( pItem->ISPILE() != FALSE );
}

bool GLCharacter::IsRestartPossible()
{
	GLMapList::FIELDMAP MapsList = GLGaeaClient::GetInstance().GetMapList ();
	GLMapList::FIELDMAP_ITER iter = MapsList.find ( GLGaeaClient::GetInstance().GetActiveMap ()->GetMapID ().dwID );
	if ( iter==MapsList.end() )					return FALSE;

	const SMAPNODE *pMapNode = &(*iter).second;

	return !pMapNode->bRestart;
}

/*void GLCharacter::SendHackingMSG ()
{
	GLMSG::SNET_REQ_SERVERTEST NetMsg;
	NETSENDTOFIELD ( &NetMsg );
}

void GLCharacter::SendHackingMSG1 ()
{
}
*/
// *****************************************************
// Desc: ¾ÆÀÌÅÛÀ» ±¸ÀÔÇϰųª/ÆȾƹö¸²
// *****************************************************
HRESULT GLCharacter::ReqNpcTo ( SNATIVEID sNID_NPC, DWORD dwChannel, WORD wPosX, WORD wPosY, WORD wBuyNum )
{
	if ( ValidWindowOpen() )						return E_FAIL;	

	PCROWDATA pCrowData = GLCrowDataMan::GetInstance().GetCrowData ( sNID_NPC );

	if ( !pCrowData )
	{
		//	»óÀÎ NPC°¡ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.
		return E_FAIL;
	}

	//	¾ÆÀÌÅÆÀ» Æȱ⠼öÇà.
	if ( VALID_HOLD_ITEM() )
	{
		SITEM* pItem = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );

		//	°Å·¡¿É¼Ç
		if ( !pItem->sBasicOp.IsSALE() )
		{
			//	Æȱ⠰¡´ÉÇÏÁö ¾ÊÀ½.
			return E_FAIL;
		}

		if ( GET_HOLD_ITEM().IsGM_GENITEM() )
		{
			//	Æȱ⠰¡´ÉÇÏÁö ¾ÊÀ½.
			return E_FAIL;
		}

		// ÆÖÄ«µåÀÏ°æ¿ì
		if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD )
		{
			const SITEMCUSTOM& sHoldItem = GET_HOLD_ITEM();
			GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
			if ( pMyPet->IsVALID () && sHoldItem.dwPetID == pMyPet->m_dwPetID )
			{
				return E_FAIL;
			}
		}

		//	Æȱ⠸޽ÃÁö.
		GLMSG::SNETPC_REQ_SALE_TO_NPC NetMsg;
		NetMsg.sNID = sNID_NPC;
		NetMsg.dwNPCID = m_dwNPCID;
		NETSENDTOFIELD ( &NetMsg );
	}
	//	¾ÆÀÌÅÆ »ç±â ¼öÇà.
	else
	{
		GASSERT(wBuyNum>0&&"¾ÆÀÌÅÛ ±¸ÀÔ ¿äû ¼ö·®Àº 1°³ ÀÌ»óÀÌ¿©¾ß ÇÑ´Ù.");

		if ( pCrowData->GetSaleNum() <= dwChannel )		return E_FAIL;

		GLInventory *pInven = pCrowData->GetSaleInven ( dwChannel );
		if ( !pInven )									return E_FAIL;

		SINVENITEM* pSaleItem = pInven->FindPosItem ( wPosX, wPosY );
		if ( !pSaleItem )
		{
			//	»ì·Á°í ÇÏ´Â ¾ÆÀÌÅÆÀÌ ¾ø½À´Ï´Ù.
			return E_FAIL;
		}
		
		SNATIVEID sBUYNID = pSaleItem->sItemCustom.sNativeID;

		SITEM* pItem = GLItemMan::GetInstance().GetItem ( sBUYNID );

		LONGLONG dwPrice = pCrowData->GetNpcSellPrice(pItem->sBasicOp.sNativeID.dwID);
		//add money 2
		//no tax for vot item
		if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM )
		{
			dwPrice = pItem->sBasicOp.dwBuyPrice;
		}
		//add money 3
		//no tax for premium item
		else if (pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM )
		{
			dwPrice = pItem->sBasicOp.dwBuyPrice;
		}
		//add contributionpoint by CNDev
		//no tax for contributionpoint item
		else if (pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
		{
			dwPrice = pItem->sBasicOp.dwBuyPrice;
		}
		else
		{	
			if( dwPrice == 0 )
			{
				dwPrice = pItem->sBasicOp.dwBuyPrice;
			}
		}

		//add money 2
		//price check for vote item
		if ( pItem->sBasicOp.emLevel == LEVEL_VOTE_ITEM ) 
		{
			if ( m_lnVoteP < (LONGLONG)dwPrice*wBuyNum )
			{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("BUYITEM_NOMONEY_2") );
			return E_FAIL;
			}
		}
		//add money 3
		//price check for premium item
		else if ( pItem->sBasicOp.emLevel == LEVEL_PREMIUM_ITEM )
		{
			if ( m_lnPremP < (LONGLONG)dwPrice*wBuyNum )
			{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("BUYITEM_NOMONEY_3") );
			return E_FAIL;
			}
		}
		//add contributionpoint by CNDev
		else if ( pItem->sBasicOp.emLevel == LEVEL_CONTRIBUTION_ITEM )
		{
			if ( m_wSchool != GLGaeaClient::GetInstance().GetActiveMap()->m_dwCTFWINNER )
			{
				CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, "Your school is not the Tyranny Winner, Unable to purchase the item." );
				return E_FAIL;
			}
			if ( m_lnContribP < (LONGLONG)dwPrice*wBuyNum )
			{
				CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("BUYITEM_NOMONEY_4") );
				return E_FAIL;
			}
		}
		//price check for gold
		else 
		{
			if ( m_lnMoney < (LONGLONG)dwPrice*wBuyNum )
			{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("BUYITEM_NOMONEY") );
			return E_FAIL;
			}
		}


		

		WORD wINVENX = pItem->sBasicOp.wInvenSizeX;
		WORD wINVENY = pItem->sBasicOp.wInvenSizeY;

		//	Note : Àκ¥¿¡ ¿©À¯ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.
		//
		BOOL bITEM_SPACE(FALSE);
		if ( pItem->ISPILE() )
		{
			//	°ãħ ¾ÆÀÌÅÛÀÏ °æ¿ì.
			WORD wPILENUM = pItem->sDrugOp.wPileNum;
			WORD wREQINSRTNUM = ( wBuyNum * pItem->GETAPPLYNUM() );
			bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sBUYNID, wPILENUM, wINVENX, wINVENY );
		}
		else
		{
			GASSERT(wBuyNum==1&&"°ãħÀÌ ºÒ°¡´ÉÇÑ ¾ÆÀÌÅÛÀº 1°³¾¿¸¸ ±¸ÀÔ °¡´ÉÇÕ´Ï´Ù.");

			//	ÀÏ¹Ý ¾ÆÀÌÅÛÀÇ °æ¿ì.
			WORD wInsertPosX(0), wInsertPosY(0);
			bITEM_SPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wInsertPosX, wInsertPosY );
		}

		if ( !bITEM_SPACE )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("BUYITEM_NOSPACE") );
			return E_FAIL;
		}

		//	±¸ÀÔ ¿äû ¸Þ½ÃÁö.
		GLMSG::SNETPC_REQ_BUY_FROM_NPC NetMsg;
		NetMsg.sNID = sNID_NPC;
		NetMsg.dwNPCID = m_dwNPCID;
		NetMsg.dwChannel = dwChannel;
		NetMsg.wPosX = pSaleItem->wPosX;
		NetMsg.wPosY = pSaleItem->wPosY;
		NetMsg.wBuyNum = wBuyNum;

		NETSENDTOFIELD ( &NetMsg );
	}

	return S_OK;
}

// *****************************************************
// Desc: ºô¸µ ¾ÆÀÌÅÛ Á¤º¸ DB¿¡¼­ °¡Á®¿À±â
// *****************************************************
HRESULT GLCharacter::ReqItemBankInfo ()
{
	GLMSG::SNET_GET_CHARGEDITEM_FROMDB NetMsg;
	NetMsg.dwCharID = m_dwCharID;
	StringCchCopy ( NetMsg.szUID, USR_ID_LENGTH+1, m_szUID );

	NETSENDTOFIELD ( &NetMsg );

	m_cInvenCharged.DeleteItemAll ();
	m_mapChargedKey.clear();

	return S_OK;
}

HRESULT GLCharacter::ReqDeducPoints ( DWORD wPoint1 , DWORD wPoint2 )
{
	//if ( wPoint1 )
	//	 COuterInterface::GetInstance().SetUserPointDeduc(wPoint1);
	//else
		// COuterInterface::GetInstance().SetUserPoint2Deduc(wPoint2);
	return S_OK;
}

HRESULT GLCharacter::ReqItemShopInfo ()
{
	for (int i=0;i<13;++i)
	{
		m_cInvenItemShopVote[i].DeleteItemAll ();
		m_mapItemShopVoteKey[i].clear();
		m_cInvenItemShopPremium[i].DeleteItemAll ();
		m_mapItemShopPremiumKey[i].clear();
		m_cInvenItemShop[i].DeleteItemAll ();
		m_mapItemShopKey[i].clear();
	}

	GLMSG::SNET_GET_ITEMSHOP_FROMDB NetMsg;
	NetMsg.dwCharID = m_dwCharID;
	StringCchCopy ( NetMsg.szUID, USR_ID_LENGTH+1, m_szUID );

	NETSENDTOFIELD ( &NetMsg );

	GLMSG::SNETPC_RETRIEVE_POINTS pNetMsg;
	NETSENDTOFIELD ( &pNetMsg );
	
	return S_OK;
}

HRESULT GLCharacter::ReqBuyItem ( const char* szPurkey )
{
	if ( !IsValidBody() )						return E_FAIL;
	
		GLMSG::SNET_ITEMSHOP_BUY NetMsg;
		StringCchCopy ( NetMsg.szPurKey, PURKEY_LENGTH+1, szPurkey  );
		NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqChargedItemTo ( WORD wPosX, WORD wPosY )
{
	SINVENITEM *pINVENITEM = m_cInvenCharged.GetItem ( wPosX, wPosY );
	if ( !pINVENITEM )						return E_FAIL;

	SNATIVEID nidPOS(wPosX,wPosY);
	MAPSHOP_KEY_ITER iter = m_mapChargedKey.find ( nidPOS.dwID );
	if ( m_mapChargedKey.end()==iter )		return E_FAIL;

	std::string strPurKey = (*iter).second;
	
	//	Note : ¾ÆÀÌÅÛ °¡Á®¿À±â ¿äû.
	//
	GLMSG::SNET_CHARGED_ITEM_GET NetMsg;
	NetMsg.dwID = nidPOS.dwID;
	StringCchCopy ( NetMsg.szPurKey, PURKEY_LENGTH+1, strPurKey.c_str() );
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

void GLCharacter::ReqLevelUp ()
{
	GLMSG::SNETPC_REQ_LEVELUP NetMsg;
	NETSENDTOFIELD ( &NetMsg );
}

//void GLCharacter::ReqStatsUp ( EMSTATS emStats )
//{
//	if ( m_wStatsPoint==0 )	return;
//
//	GLMSG::SNETPC_REQ_STATSUP NetMsg;
//	NetMsg.emStats = emStats;
//	NETSENDTOFIELD ( &NetMsg );
//}

void GLCharacter::ReqStatsUp ( SCHARSTATS sStats )
{
	if ( m_wStatsPoint==0 )	return;
	if ( sStats.GetTotal() >  m_wStatsPoint )	return;

	/*switch( sStats )
	{
		case sStats.dwPow: CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::GREENYELLOW, "Adding %d Pow. Success!" );	break;
		case sStats.dwStr: CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::GREENYELLOW, "Adding %d Vit. Success!" );	break;
		case sStats.dwSpi: CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::GREENYELLOW, "Adding %d Int. Success!" );	break;
		case sStats.dwDex: CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::GREENYELLOW, "Adding %d Dex. Success!" );	break;
		case sStats.dwSta: CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::GREENYELLOW, "Adding %d Stamina. Success!" );	break;
		
	}*/

	GLMSG::SNETPC_REQ_STATSUP NetMsg;
	NetMsg.sStats = sStats;
	NETSENDTOFIELD ( &NetMsg );
}
/*
void GLCharacter::ReqStatsUpCmd( EMSTATS emStats, DWORD value )
{
	if ( m_wStatsPoint < value)	return;

	GLMSG::SNETPC_REQ_STATSUPCMD NetMsg;
	NetMsg.emStats = emStats;
	NetMsg.dwValue = value;
	NETSENDTOFIELD ( &NetMsg );
}*/

/*void GLCharacter::ReqAllowBet ( BOOL bAllowBet ) //add duel bet
{
	GLMSG::SNETPC_REQ_ALLOW_BET NetMsg;
	NetMsg.bAllowBet = bAllowBet;
	NETSENDTOFIELD ( &NetMsg );
}*/
HRESULT GLCharacter::ReqSkillQuickSet ( const SNATIVEID skill_id, const WORD wSLOT )
{
	if ( EMSKILLQUICK_SIZE <= wSLOT )	return E_FAIL;

	//	Note : ¹è¿î ½ºÅ³ÀÌ ¾Æ´Ò °æ¿ì Ãë¼ÒµÊ.
	if ( !ISLEARNED_SKILL(skill_id) )	return E_FAIL;

	GLMSG::SNETPC_REQ_SKILLQUICK_SET NetMsg;
	NetMsg.wSLOT = wSLOT;
	NetMsg.skill_id = skill_id;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqSkillQuickReSet ( const WORD wSLOT )
{
	if ( EMSKILLQUICK_SIZE <= wSLOT )	return E_FAIL;

	//	Note : Ŭ¶óÀ̾ðÆ®ÀÇ ½½·ÔÀ» ºñ¿öÁÜ.
	//m_sSKILLQUICK[wSLOT] = NATIVEID_NULL();

	GLMSG::SNETPC_REQ_SKILLQUICK_RESET NetMsg;
	NetMsg.wSLOT = wSLOT;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : ¾ÆÀÌÅÛ ½½·Ô¿¡ µî·Ï/Á¦°Å.
HRESULT GLCharacter::ReqItemQuickSet ( const WORD wSLOT )
{
	if ( EMACTIONQUICK_SIZE <= wSLOT )	return E_FAIL;
	if ( !VALID_HOLD_ITEM() )			return S_FALSE;

	const SITEMCUSTOM& sITEM = GET_HOLD_ITEM ();
	
#if defined(VN_PARAM) //vietnamtest%%%
	if ( sITEM.bVietnamGainItem ) return S_FALSE;
#endif

	SITEM* pITEM = GLItemMan::GetInstance().GetItem ( sITEM.sNativeID );
	if ( !pITEM )						return S_FALSE;

	if ( pITEM->sBasicOp.emItemType != ITEM_CURE &&
		 pITEM->sBasicOp.emItemType != ITEM_RECALL &&
		 pITEM->sBasicOp.emItemType != ITEM_TELEPORT_CARD /*&& 
		 pITEM->sBasicOp.emItemType != ITEM_PET_CARD*/ )
			// Disabled to avoid crash on Field Server
			// 08-14-2013 11:25 PM
			//  
		 return S_FALSE;

	//	Note : Ŭ¶óÀ̾ðÆ®ÀÇ ½½·Ô¿¡ ¹Ù·Î ³Ö¾îÁÜ.
	//m_sACTIONQUICK[wSLOT].wACT = EMACT_SLOT_DRUG;
	//m_sACTIONQUICK[wSLOT].sNID = sITEM.sNativeID;

	//	Note : ¼­¹ö¿¡ ½½·Ô¿¡ µé¾î°¥ Á¤º¸ Àü¼Û.
	GLMSG::SNETPC_REQ_ACTIONQUICK_SET NetMsg;
	NetMsg.wSLOT = wSLOT;
	NetMsg.wACT = EMACT_SLOT_DRUG;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqItemQuickReSet ( const WORD wSLOT )
{
	if ( EMACTIONQUICK_SIZE <= wSLOT )	return E_FAIL;

	//m_sACTIONQUICK[wSLOT].RESET ();

	GLMSG::SNETPC_REQ_ACTIONQUICK_RESET NetMsg;
	NetMsg.wSLOT = wSLOT;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : ½ºÅ³ ½½·Ô¿¡ µî·Ï/Á¦°Å.
HRESULT GLCharacter::ReqSkillRunSet ( const WORD wSLOT )
{
	if ( EMSKILLQUICK_SIZE <= wSLOT )	return E_FAIL;

	const SNATIVEID &skill_id = m_sSKILLQUICK[wSLOT];
	if ( skill_id==NATIVEID_NULL() )	return E_FAIL;

	//	Note : ¹è¿î ½ºÅ³ÀÌ ¾Æ´Ò °æ¿ì Ãë¼ÒµÊ.
	if ( !ISLEARNED_SKILL(skill_id) )	return E_FAIL;

	m_sRunSkill = skill_id;

	GLMSG::SNETPC_REQ_SKILLQUICK_ACTIVE NetMsg;
	NetMsg.wSLOT = wSLOT;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqSkillRunReSet ()
{
	m_sRunSkill = NATIVEID_NULL();
	return S_OK;
}

// *****************************************************
// Desc: ¼­¹ö¿¡ â°í Á¤º¸ ¿äû ( ¶ôÄ¿ °ü¸®ÀÎ )
// *****************************************************
HRESULT GLCharacter::ReqGetStorage ( DWORD dwChannel, DWORD dwNPCID = 0 )
{
	if ( !IsValidBody() )						return E_FAIL;
	if ( IsVALID_STORAGE(dwChannel) )			return S_OK;

	//	Note : ¼­¹ö¿¡ ¿äû.
	//
	GLMSG::SNETPC_REQ_GETSTORAGE	NetMsg;
	NetMsg.dwChannel = dwChannel;
	NetMsg.dwNPCID   = m_dwNPCID;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}


// *****************************************************
// Desc: â°í ¾ÆÀÌÅÛ µé¶§, ³õÀ»¶§, ±³È¯ÇÒ¶§, ÇÕÄ¥¶§.
// *****************************************************
HRESULT GLCharacter::ReqStorageTo ( DWORD dwChannel, WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )							return E_FAIL;
	if ( !IsVALID_STORAGE(dwChannel) )				return S_OK;
	if ( ValidWindowOpen() )						return E_FAIL;	

	SINVENITEM* pInvenItem = m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !VALID_HOLD_ITEM () && !pInvenItem )		return E_FAIL;


	if ( VALID_HOLD_ITEM() ) 
	{
		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
		if ( !pITEM )		return false;
		
		//	°Å·¡¿É¼Ç
		if ( GET_HOLD_ITEM().bWrap!= true )
		{
		  if ( !pITEM->sBasicOp.IsEXCHANGE() )		return FALSE;
		  if ( GET_HOLD_ITEM().bNonDrop!= false )  return FALSE;
	
		}
	}


	bool bKEEP = IsKEEP_STORAGE(dwChannel);

	if ( VALID_HOLD_ITEM () && pInvenItem )
	{
#if defined(VN_PARAM) //vietnamtest%%%
		if ( !GET_HOLD_ITEM().bVietnamGainItem  )
#endif

		{
			if ( !bKEEP )
			{
				//	Note : ¾ÆÀÌÅÛÀ» ³ÖÀ» ¼ö ¾øÀ» °æ¿ì..
				CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("STORAGE_SPAN_END") );
				return E_FAIL;
			}

			GLMSG::SNETPC_REQ_STORAGE_EX_HOLD NetMsg;
			NetMsg.dwChannel = dwChannel;
			NetMsg.dwNPCID = m_dwNPCID;
			NetMsg.wPosX = pInvenItem->wPosX;
			NetMsg.wPosY = pInvenItem->wPosY;
			NETSENDTOFIELD ( &NetMsg );
		}
	}
	else if ( pInvenItem )
	{
		GLMSG::SNETPC_REQ_STORAGE_TO_HOLD NetMsg;
		NetMsg.dwChannel = dwChannel;
		NetMsg.dwNPCID = m_dwNPCID;
		NetMsg.wPosX = pInvenItem->wPosX;
		NetMsg.wPosY = pInvenItem->wPosY;
		NETSENDTOFIELD ( &NetMsg );
	}
	else if ( VALID_HOLD_ITEM () )
	{
#if defined(VN_PARAM) //vietnamtest%%%
		if ( !GET_HOLD_ITEM().bVietnamGainItem  )
#endif

		{

			if ( !bKEEP )
			{
				//	Note : ¾ÆÀÌÅÛÀ» ³ÖÀ» ¼ö ¾øÀ» °æ¿ì..
				CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("STORAGE_SPAN_END") );
				return E_FAIL;
			}

			//	Note : ¸Þ½ÃÁö ¼Û½ÅÀü¿¡ À¯È¿ÇÒÁö¸¦ ¹Ì¸® °Ë»çÇÔ.
			//
			SITEM* pItem = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
			GASSERT(pItem&&"¾ÆÀÌÅÆ ´ëÀÌÅÍ°¡ Á¸Á¦ÇÏÁö ¾ÊÀ½");

			BOOL bOk = m_cStorage[dwChannel].IsInsertable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
			if ( !bOk )
			{
				//	ÀιêÀÌ °¡µæÂþÀ½.
				return E_FAIL;
			}

			GLMSG::SNETPC_REQ_HOLD_TO_STORAGE NetMsg;
			NetMsg.dwChannel = dwChannel;
			NetMsg.dwNPCID = m_dwNPCID;
			NetMsg.wPosX = wPosX;
			NetMsg.wPosY = wPosY;

			NETSENDTOFIELD ( &NetMsg );
		}
	}

	return S_OK;
}


// *****************************************************
// Desc: ½ºÅ³ ¹è¿ì±â ¿äû. ( â°í ¾ÆÀÌÅÛÀ¸·Î. )
// *****************************************************
HRESULT GLCharacter::ReqStorageSkill ( DWORD dwChannel, WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;
	if ( !IsVALID_STORAGE(dwChannel) )			return S_OK;
	if ( ValidWindowOpen() )					return E_FAIL;	

	SINVENITEM* pInvenItem = m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType!=ITEM_SKILL )	return E_FAIL;

	SNATIVEID sSKILL_ID = pItem->sSkillBookOp.sSkill_ID;

	if ( ISLEARNED_SKILL(sSKILL_ID) )
	{
		//	ÀÌ¹Ì ½ÀµæÇÑ ½ºÅ³.
		return E_FAIL;
	}

	EMSKILL_LEARNCHECK emSKILL_LEARNCHECK = CHECKLEARNABLE_SKILL(sSKILL_ID);
	if ( emSKILL_LEARNCHECK!=EMSKILL_LEARN_OK )
	{
		//	½ºÅ³ ½Àµæ ¿ä±¸ Á¶°ÇÀ» ÃæÁ·ÇÏÁö ¸øÇÕ´Ï´Ù.
		return E_FAIL;
	}

	//	Note : ½ºÅ³ ½ÀµæÀ» ¿äûÇÕ´Ï´Ù.
	//
	GLMSG::SNETPC_REQ_LEARNSKILL_STORAGE NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.dwNPCID = m_dwNPCID;
	
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

// *****************************************************
// Desc: â°í ¾ÆÀÌÅÛ »ç¿ëÇÒ¶§ ( ¸¶½Ã±â, ½ºÅ³¹è¿ì±â µî ).
// *****************************************************
HRESULT GLCharacter::ReqStorageDrug ( DWORD dwChannel, WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;
	if ( !IsVALID_STORAGE(dwChannel) )			return S_OK;
	if ( ValidWindowOpen() )					return E_FAIL;	

	SINVENITEM* pInvenItem = m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	if ( CheckCoolTime( pInvenItem->sItemCustom.sNativeID ) ) return E_FAIL;


	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			return E_FAIL;

	// ·¹º§ Á¶°Ç È®ÀÎ
	if ( !SIMPLE_CHECK_ITEM( pItem->sBasicOp.sNativeID ) ) return S_FALSE;

	if ( pItem->sBasicOp.emItemType == ITEM_CURE )
	{
		//	Note : pk µî±ÞÀÌ »ìÀθ¶ µî±Þ ÀÌ»óÀÏ °æ¿ì ȸº¹¾àÀÇ »ç¿ëÀ» ¸·´Â´Ù.
		//
		DWORD dwPK_LEVEL = GET_PK_LEVEL();
		if ( dwPK_LEVEL != UINT_MAX && dwPK_LEVEL>GLCONST_CHAR::dwPK_DRUG_ENABLE_LEVEL )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_DRUG_PK_LEVEL") );
			return E_FAIL;
		}

		if ( m_sCONFTING.IsFIGHTING() && !m_sCONFTING.IsRECOVE() )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("CONFRONT_RECOVE"), 0 );
			return E_FAIL;
		}

		if ( pItem->sDrugOp.emDrug!=ITEM_DRUG_NUNE )
		{
			switch ( pItem->sDrugOp.emDrug )
			{
			case ITEM_DRUG_HP:
				if ( m_sHP.dwMax == m_sHP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_MP:
				if ( m_sMP.dwMax == m_sMP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_SP:
				if ( m_sSP.dwMax == m_sSP.dwNow )		return S_FALSE; //add cp
				break;

			case ITEM_DRUG_CP:
				if ( m_sCP.dwMax == m_sCP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_HP_MP:
				if ( m_sHP.dwMax==m_sHP.dwNow && m_sMP.dwMax==m_sMP.dwNow )		return S_FALSE;
				break;
			case ITEM_DRUG_MP_SP:
				if ( m_sMP.dwMax==m_sMP.dwNow && m_sSP.dwMax==m_sSP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_HP_MP_SP:
				if ( m_sHP.dwMax==m_sHP.dwNow && m_sMP.dwMax==m_sMP.dwNow
					&& m_sSP.dwMax==m_sSP.dwNow )		return S_FALSE;
				break;

			case ITEM_DRUG_CURE:
				if ( !ISSTATEBLOW() )				return S_FALSE;
				break;

			case ITEM_DRUG_HP_CURE:
				if ( m_sHP.dwMax == m_sHP.dwNow && !ISSTATEBLOW() )		return S_FALSE;
				break;

			case ITEM_DRUG_HP_MP_SP_CURE:
				if ( m_sHP.dwMax==m_sHP.dwNow && m_sMP.dwMax==m_sMP.dwNow
					&& m_sSP.dwMax==m_sSP.dwNow && !ISSTATEBLOW() )		return S_FALSE;
				break;
			};

			GLMSG::SNETPC_REQ_STORAGEDRUG NetMsg;
			NetMsg.wPosX = wPosX;
			NetMsg.wPosY = wPosY;
			NetMsg.dwNPCID = m_dwNPCID;

			NETSENDTOFIELD ( &NetMsg );
		}
	}
	else if ( pItem->sBasicOp.emItemType ==ITEM_SKILL )
	{
		ReqStorageSkill ( dwChannel, wPosX, wPosY );
	}
	else if ( pItem->sBasicOp.emItemType ==ITEM_PET_SKILL )
	{
		GLGaeaClient::GetInstance().GetPetClient()->ReqLearnSkill ( dwChannel, wPosX, wPosY );
	}
	
	return S_OK;
}

// *****************************************************
// Desc: â°í µ· ³Ö±â.
// *****************************************************
HRESULT GLCharacter::ReqStorageSaveMoney ( LONGLONG lnMoney )
{
//#if !defined(KR_PARAM) && !defined(KRT_PARAM)
//	if( m_lnMoney%UINT_MAX < lnMoney )			return E_FAIL;
//#endif
	if ( m_lnMoney < lnMoney )					return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	GLMSG::SNETPC_REQ_STORAGE_SAVE_MONEY NetMsg;
	NetMsg.lnMoney = lnMoney;
	NetMsg.dwNPCID = m_dwNPCID;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

// *****************************************************
// Desc: â°í µ· »©³»±â.
// *****************************************************
HRESULT GLCharacter::ReqStorageDrawMoney ( LONGLONG lnMoney )
{
//#if !defined(KR_PARAM) && !defined(KRT_PARAM)
//	if( m_lnStorageMoney%UINT_MAX < lnMoney )	return E_FAIL;
//#endif
	if ( m_lnStorageMoney < lnMoney )			return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	GLMSG::SNETPC_REQ_STORAGE_DRAW_MONEY NetMsg;
	NetMsg.lnMoney = lnMoney;
	NetMsg.dwNPCID = m_dwNPCID;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : µ· ¹Ù´Ú¿¡ ¹ö¸².
HRESULT GLCharacter::ReqMoneyToField ( LONGLONG lnMoney )
{
	if ( !GLCONST_CHAR::bMONEY_DROP2FIELD )		return E_FAIL;
	if ( lnMoney == 0 )							return E_FAIL;
//#if !defined(KR_PARAM) && !defined(KRT_PARAM)
//	if ( m_lnMoney%UINT_MAX < lnMoney )			return E_FAIL;
//#endif
	if ( m_lnMoney < lnMoney )					return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	D3DXVECTOR3 vDir(1,0,0);
	BOOL bCollision = FALSE;
	DWORD dwCollisionID;
	D3DXVECTOR3 vCollisionPos(0,0,0);

	srand(GetTickCount());
	float fBaseY = (rand()%32) * (D3DX_PI*2)/32.0f;

	for ( float fRotY = 0.0f; fRotY<D3DX_PI*2; fRotY += 0.2f )
	{
		D3DXMATRIX matRotY;
		D3DXMatrixRotationY ( &matRotY, fRotY+fBaseY );
		D3DXVec3TransformCoord ( &vDir, &vDir, &matRotY );

		D3DXVec3Normalize ( &vDir, &vDir );
		D3DXVECTOR3 vDropPos = GetPosition() + vDir*float(GLCONST_CHAR::wBODYRADIUS+12);

		GLGaeaClient::GetInstance().GetActiveMap()->GetNaviMesh()->IsCollision
		(
			vDropPos + D3DXVECTOR3(0,+5,0),
			vDropPos + D3DXVECTOR3(0,-5,0),
			vCollisionPos,
			dwCollisionID,
			bCollision
		);
	}

	if ( !bCollision )
	{
		GLGaeaClient::GetInstance().GetActiveMap()->GetNaviMesh()->IsCollision
		(
			GetPosition() + D3DXVECTOR3(0,+5,0),
			GetPosition() + D3DXVECTOR3(0,-5,0),
			vCollisionPos,
			dwCollisionID,
			bCollision
		);
	}

	if ( bCollision )
	{
		GLMSG::SNETPC_REQ_MONEY_TO_FIELD NetMsg;
		NetMsg.vPos = vCollisionPos;
		NetMsg.lnMoney = lnMoney;
		NETSENDTOFIELD ( &NetMsg );
	}

	return S_OK;
}

//	Note : °Å·¡ÇÒ ±Ý¾× ³Ö±â.
//HRESULT GLCharacter::ReqTradeMoney ( LONGLONG lnMoney )
//{
//	if ( !GLTradeClient::GetInstance().Valid () )	return E_FAIL;
//
//	//	Note : ¼ÒÁö ±Ý¾×ÀÌ ÃæºÐÇÑÁö °Ë»ç.
//	//
//	if ( lnMoney > m_lnMoney )		return E_FAIL;
//	
//	//	Note : ±³È¯ÇÒ ±Ý¾× ¼³Á¤ MSG.
//	//
//	GLMSG::SNET_TRADE_MONEY NetMsg;
//	NetMsg.lnMoney = lnMoney;
//	NETSENDTOFIELD(&NetMsg);
//
//	return S_OK;
//}

//	Note : °Å·¡ÇÒ ¾ÆÀÌÅÛ ³Ö±â/Á¦°Å/±³È¯.
HRESULT GLCharacter::ReqTradeBoxTo ( WORD wPosX, WORD wPosY )
{
	if ( !GLTradeClient::GetInstance().Valid () )	return E_FAIL;

	SINVENITEM* pTradeItem = GLTradeClient::GetInstance().FindPosItem ( wPosX, wPosY );	//	ÇöÀç À§Ä¡¿¡ Æ®·¡ÀÌµå ¹°Ç°ÀÌ µî·ÏµÇ¾î ÀÖÀ½.
	SINVEN_POS sPreTradeItem = GLTradeClient::GetInstance().GetPreItem();					//	¿¹ºñ µî·Ï ¾ÆÀÌÅÛÀÌ Á¸Á¦.

	//	Note : ÇØ´ç À§Ä¡¿¡ ÀÌ¹Ì µî·ÏµÈ ¾ÆÀÌÅÛÀÌ ÀÖ°í µî·ÏÇÏ°íÀÚ ÇÏ´Â ¾ÆÀÌÅÛÀÌ ÀÖÀ» °æ¿ì.
	//
	if ( sPreTradeItem.VALID() && pTradeItem )
	{
		//	µî·ÏÇÏ°íÀÚ ÇÏ´Â ¾ÆÀÌÅÛ.
		SINVENITEM* pResistItem = m_cInventory.GetItem ( sPreTradeItem.wPosX, sPreTradeItem.wPosY );
		if ( !pResistItem )		return E_FAIL;

		//	ÀÌ¹Ì µî·ÏµÇ¾î ÀÖ´ÂÁö °Ë»ç.
		SINVENITEM* pAlready = GLTradeClient::GetInstance().FindItemBack ( pResistItem->wBackX, pResistItem->wBackY );
		if ( pAlready )
		{
			GLTradeClient::GetInstance().ReSetPreItem();
			return E_FAIL;
		}

		SITEM *pItem = GLItemMan::GetInstance().GetItem ( pResistItem->sItemCustom.sNativeID );
		if ( !pItem )			return E_FAIL;

		//	°Å·¡¿É¼Ç
		if ( !pResistItem->sItemCustom.IsWrap() )
		{
		  if ( !pItem->sBasicOp.IsEXCHANGE() ) return E_FAIL;
		  if ( pResistItem->sItemCustom.IsNonDrop() ) return E_FAIL;
		}

		if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD )
		{
			// µé°íÀÖ´Â ¾ÆÀÌÅÛÀÌ ÆÖÄ«µåÀ̸ç ÆÖÀÌ È°¼ºÈ­ µÇ¾î ÀÖÀ¸¸é
			GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
			if ( pMyPet->IsVALID () && pResistItem->sItemCustom.dwPetID == pMyPet->m_dwPetID )
			{
				return E_FAIL;
			}
		}

		if ( pItem->sBasicOp.emItemType == ITEM_VEHICLE && pResistItem->sItemCustom.dwVehicleID != 0 )
		{
			return E_FAIL;
		}

		//	Note : Á¾Àü ¾ÆÀÌÅÛ°ú »õ·Î¿î ¾ÆÀÌÅÛÀ» ±³È¯ÇÏ¿© À§Ä¡¿¡ µé¾î °¥ ¼ö ÀÖ´ÂÁö °Ë»ç.
		//
		BOOL bOk = GLTradeClient::GetInstance().IsExInsertable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )				return FALSE;

		//	Note : Á¾Àü ¾ÆÀÌÅÛÀ» ¸®½ºÆ®¿¡¼­ Á¦°Å.
		//
		GLMSG::SNET_TRADE_ITEM_REMOVE NetMsgReMove;
		NetMsgReMove.wPosX = pTradeItem->wPosX;
		NetMsgReMove.wPosY = pTradeItem->wPosY;
		NETSENDTOFIELD(&NetMsgReMove);

		//	Note : »õ·Î¿î ¾ÆÀÌÅÛÀ» ¸®½ºÆ®¿¡ µî·Ï.
		GLMSG::SNET_TRADE_ITEM_REGIST NetMsgRegist;
		NetMsgRegist.wPosX = wPosX;
		NetMsgRegist.wPosY = wPosY;
		NetMsgRegist.wInvenX = sPreTradeItem.wPosX;
		NetMsgRegist.wInvenY = sPreTradeItem.wPosY;
		NETSENDTOFIELD(&NetMsgRegist);

		GLTradeClient::GetInstance().ReSetPreItem();
	}
	//	Note : µî·ÏÇÒ ¾ÆÀÌÅÛÀÌ ÀÖ´Â °æ¿ì.
	//
	else if ( sPreTradeItem.VALID() )
	{
		//	µî·ÏÇÏ°íÀÚ ÇÏ´Â ¾ÆÀÌÅÛ.
		SINVENITEM* pResistItem = m_cInventory.GetItem ( sPreTradeItem.wPosX, sPreTradeItem.wPosY );
		if ( !pResistItem )		return E_FAIL;

		//	ÀÌ¹Ì µî·ÏµÇ¾î ÀÖ´ÂÁö °Ë»ç.
		SINVENITEM* pAlready = GLTradeClient::GetInstance().FindItemBack ( sPreTradeItem.wPosX, sPreTradeItem.wPosY );
		if ( pAlready )
		{
			GLTradeClient::GetInstance().ReSetPreItem();
			return E_FAIL;
		}

		//	Note : ÇØ´çÀ§Ä¡¿¡ µé¾î °¥ ¼ö ÀÖ´ÂÁö °Ë»ç.
		//
		SITEM *pItem = GLItemMan::GetInstance().GetItem ( pResistItem->sItemCustom.sNativeID );
		if ( !pItem )			return E_FAIL;

		//	°Å·¡¿É¼Ç
		if ( !pResistItem->sItemCustom.IsWrap() )
		{
		   if ( !pItem->sBasicOp.IsEXCHANGE() ) return E_FAIL;
		   if ( pResistItem->sItemCustom.IsNonDrop()  ) return E_FAIL;
		}

		if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD )
		{
			// µé°íÀÖ´Â ¾ÆÀÌÅÛÀÌ ÆÖÄ«µåÀ̸ç ÆÖÀÌ È°¼ºÈ­ µÇ¾î ÀÖÀ¸¸é
			const SITEMCUSTOM& sHold = GET_HOLD_ITEM();
			GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
			if ( pMyPet->IsVALID () && pResistItem->sItemCustom.dwPetID == pMyPet->m_dwPetID )
			{
				return E_FAIL;
			}
		}

		if ( pItem->sBasicOp.emItemType == ITEM_VEHICLE && pResistItem->sItemCustom.dwVehicleID != 0 )
		{
			return E_FAIL;
		}

		BOOL bOk = GLTradeClient::GetInstance().IsInsertable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )				return E_FAIL;

		//	Note : »õ·Î¿î ¾ÆÀÌÅÛÀ» ¸®½ºÆ®¿¡ µî·Ï.
		GLMSG::SNET_TRADE_ITEM_REGIST NetMsgRegist;
		NetMsgRegist.wPosX = wPosX;
		NetMsgRegist.wPosY = wPosY;
		NetMsgRegist.wInvenX = sPreTradeItem.wPosX;
		NetMsgRegist.wInvenY = sPreTradeItem.wPosY;
		NETSENDTOFIELD(&NetMsgRegist);

		GLTradeClient::GetInstance().ReSetPreItem();
	}
	//	Note : ¸®½ºÆ®¿¡¼­ »èÁ¦ÇÒ ¾ÆÀÌÅÛÀÌ Àִ°æ¿ì.
	//
	else if ( pTradeItem )
	{
		GLMSG::SNET_TRADE_ITEM_REMOVE NetMsgReMove;
		NetMsgReMove.wPosX = pTradeItem->wPosX;
		NetMsgReMove.wPosY = pTradeItem->wPosY;
		NETSENDTOFIELD(&NetMsgReMove);
	}
	
	return S_OK;
}

//	Note : °Å·¡ ¼ö¶ô.
HRESULT GLCharacter::ReqTradeAgree ()
{
	if ( !GLTradeClient::GetInstance().Valid () )	return E_FAIL;

	if ( !GLTradeClient::GetInstance().IsAgreeAble() )
	{
		//	Note : Áö±ÝÀº °Å·¡ ½ÂÀÎÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù. X`s ÈÄ¾Ö ´Ù½Ã ½Ãµµ ÇÏ¿© Áֽʽÿä.
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("TRADE_AGREE_TIME") );
		return E_FAIL;
	}

	//	Note : °Å·¡½Ã µé¾î¿Ã ¾ÆÀÌÅÛµéÀÇ °ø°£ÀÇ ¿©À¯°¡ ÀÖ´ÂÁö °Ë»ç.
	//
	if ( !IsVaildTradeInvenSpace () )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("TRADE_AGREE_FAIL_MYINVEN") );
		return E_FAIL;
	}

	GLMSG::SNET_TRADE_AGREE NetMsg;
	NETSENDTOFIELD(&NetMsg);
	
	return S_OK;
}

//	Note : °Å·¡ Ãë¼Ò.
HRESULT GLCharacter::ReqTradeCancel ()
{
	if ( !GLTradeClient::GetInstance().Valid () )	return E_FAIL;
	
	GLMSG::SNET_TRADE_CANCEL NetMsg;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

//	Note : ºÎÈ° À§Ä¡ ÁöÁ¤ ¿äû.
HRESULT GLCharacter::ReqReGenGate ( DWORD dwNpcID )
{
	GLMSG::SNETPC_REQ_REGEN_GATE NetMsg;

	PLANDMANCLIENT pLandMan = GLGaeaClient::GetInstance().GetActiveMap ();
	PGLCROWCLIENT pCrow = pLandMan->GetCrow ( dwNpcID );
	if ( !pCrow )										goto _REQ_FAIL;
	if ( pCrow->GETCROW() != CROW_NPC )					goto _REQ_FAIL;

	//	Note : ºÎÈ°À§Ä¡ ÁöÁ¤ ¿äû.
	//
	NetMsg.dwNpcID = dwNpcID;
	NETSEND(&NetMsg);

	return S_OK;

_REQ_FAIL:
	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREGEN_GATE_FAIL") );
	return E_FAIL;
}

// *****************************************************
// Desc: ºÎÈ°Çϱâ
// *****************************************************
void GLCharacter::ReqReBirth ()
{
	if ( !IsACTION(GLAT_DIE) )			return;

	//	´ë±â»óÅ¿¡ µé¾î°¨.
	m_dwWAIT = 0;
	SetSTATE(EM_ACT_DIE);

	//	ºÎÈ° ¿äû.
	GLMSG::SNETPC_REQ_REBIRTH NetMsg;
	NetMsg.bRegenEntryFailed = FALSE;
	NetMsg.bCTFMAP = FALSE;

	//  ºÎÈ° ÁöÁ¡À¸·Î ÁøÀÔ ºÒ°¡½Ã ºÎÈ° ÁöÁ¡À» ÃʱâÈ­ÇÑ´Ù.
	if ( m_dwUserLvl < USER_GM3 )	
	{
		SMAPNODE *pNODE = GLGaeaClient::GetInstance().FindMapNode(m_sStartMapID);
		if ( pNODE )
		{
			EMREQFAIL emReqFail(EMREQUIRE_COMPLETE);
			GLLevelFile cLevelFile;
			BOOL bOk = cLevelFile.LoadFile ( pNODE->strFile.c_str(), TRUE, NULL );
			if( bOk )
			{
				SLEVEL_REQUIRE* pRequire = cLevelFile.GetLevelRequire ();
				emReqFail = pRequire->ISCOMPLETE ( this );

				if ( emReqFail != EMREQUIRE_COMPLETE )
				{
					m_sStartMapID = GLCONST_CHAR::nidSTARTMAP[m_wSchool];
					m_dwStartGate = GLCONST_CHAR::dwSTARTGATE[m_wSchool];
					m_vStartPos   = D3DXVECTOR3(0.0f,0.0f,0.0f);
					NetMsg.bRegenEntryFailed = TRUE;
				}
				if ( m_sStartMapID.wMainID==119 && GLGaeaClient::GetInstance().GetActiveMap()->GetMapID().wMainID != 119)
				{
					m_sStartMapID = GLCONST_CHAR::nidSTARTMAP[m_wSchool];
					m_dwStartGate = GLCONST_CHAR::dwSTARTGATE[m_wSchool];
					m_vStartPos   = D3DXVECTOR3(0.0f,0.0f,0.0f);
					NetMsg.bRegenEntryFailed = TRUE;
				}
			}
		}
	}


	PLANDMANCLIENT pLAND = GLGaeaClient::GetInstance().GetActiveMap ();
	if ( pLAND && ( pLAND->m_bTowerWars || pLAND->m_bRoyalRumble ))
	{
		NetMsg.bCTFMAP = TRUE;
		NetMsg.sCURMAPID = pLAND->GetMapID();
	}

	NETSEND ( &NetMsg );

	// ¹èƲ·Î¾â À̺¥Æ®À϶§ ¾²·¯Áö¸é Åõ¸í¸ðµå ÇØÁ¦
	if ( GLCONST_CHAR::bBATTLEROYAL )
	{
		ReSetSTATE(EM_REQ_VISIBLEOFF);

		//	Note : (¿¡ÀÌÁ¯Æ®¼­¹ö) ¸Þ¼¼Áö ¹ß»ý.
		//
		GLMSG::SNETPC_ACTSTATE NetMsg;
		NetMsg.dwActState = m_dwActState;
		NETSEND ( (NET_MSG_GENERIC*) &NetMsg );
	}
}

// *****************************************************
// Desc: ºÎÈ°Çϱâ (±ÍÈ¥ÁÖ »ç¿ë)
// *****************************************************
HRESULT GLCharacter::ReqReGenRevive ()
{
	if ( !IsACTION(GLAT_DIE) )			return E_FAIL;
	if ( !ISREVIVE () )					return E_FAIL;

	//	´ë±â»óÅ¿¡ µé¾î°¨.
	m_dwWAIT = 0;
	SetSTATE(EM_ACT_DIE);

	// ±ÍÈ¥ÁÖ »ç¿ë ¿äû
	GLMSG::SNETPC_REQ_REVIVE NetMsg;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

// °æÇèÄ¡ º¹±¸¸¦ ¿äûÇÑ´Ù.
HRESULT GLCharacter::ReqRecoveryExp ()
{
// °æÇèġȸº¹_Á¤ÀÇ_Normal
#if defined( _RELEASED ) || defined ( KRT_PARAM ) || defined ( KR_PARAM ) 
	if ( !IsACTION(GLAT_DIE) )			return E_FAIL;

	//	´ë±â»óÅ¿¡ µé¾î°¨.
	m_dwWAIT = 0;
	SetSTATE(EM_ACT_DIE);

	// °æÇèġȸº¹ ºÎÈ° ¿äû
	GLMSG::SNETPC_REQ_RECOVERY NetMsg;
	NETSENDTOFIELD(&NetMsg);
#endif
	
	return S_OK;
}

// °æÇèÄ¡ º¹±¸¸¦ ¿äûÇÑ´Ù Npc
HRESULT GLCharacter::ReqRecoveryExpNpc ( DWORD dwNpcID )
{
// °æÇèġȸº¹_Á¤ÀÇ_Npc
#if defined( _RELEASED ) || defined ( KRT_PARAM ) || defined ( KR_PARAM ) || defined ( TH_PARAM ) || defined ( MYE_PARAM ) || defined ( MY_PARAM ) || defined ( PH_PARAM ) || defined ( CH_PARAM ) || defined ( TW_PARAM ) || defined ( HK_PARAM ) || defined ( GS_PARAM )
	GLMSG::SNETPC_REQ_RECOVERY_NPC NetMsg;
	NetMsg.dwNPCID = dwNpcID;
	NETSENDTOFIELD(&NetMsg);
#endif
	return S_OK;
}


//  Note : º¹±¸ÇÒ °æÇèÄ¡¸¦ ¹¯´Â´Ù.
HRESULT GLCharacter::ReqGetReExp ()
{
// °æÇèġȸº¹_Á¤ÀÇ_Normal
#if defined( _RELEASED ) || defined ( KRT_PARAM ) || defined ( KR_PARAM )

	if ( !IsACTION(GLAT_DIE) )			return E_FAIL;	

	// º¹±¸ÇÒ °æÇèÄ¡¸¦ ¿äû
	GLMSG::SNETPC_REQ_GETEXP_RECOVERY NetMsg;
	NETSENDTOFIELD(&NetMsg);
#endif

	return S_OK;
}

HRESULT GLCharacter::ReqGetReExpNpc ( DWORD dwNpcID )
{
// °æÇèġȸº¹_Á¤ÀÇ_Npc
#if defined( _RELEASED ) || defined ( KRT_PARAM ) || defined ( KR_PARAM ) || defined ( TH_PARAM ) || defined ( MYE_PARAM ) || defined ( MY_PARAM ) || defined ( PH_PARAM ) || defined ( CH_PARAM ) || defined ( TW_PARAM ) || defined ( HK_PARAM ) || defined ( GS_PARAM )
	// º¹±¸ÇÒ °æÇèÄ¡¸¦ ¿äû
	GLMSG::SNETPC_REQ_GETEXP_RECOVERY_NPC NetMsg;
	NetMsg.dwNPCID = dwNpcID;
	NETSENDTOFIELD(&NetMsg);
#endif

	return S_OK;
}


HRESULT GLCharacter::ReqCure ( DWORD dwNpcID, DWORD dwGlobalID )
{
	GLMSG::SNETPC_REQ_CURE NetMsg;

	PLANDMANCLIENT pLandMan = GLGaeaClient::GetInstance().GetActiveMap ();
	PGLCROWCLIENT pCrow = pLandMan->GetCrow ( dwNpcID );

	if ( !pCrow )										goto _REQ_FAIL;
	if ( pCrow->GETCROW() != CROW_NPC )					goto _REQ_FAIL;

	//	Note : Ä¡·á ¿äû.
	NetMsg.dwNpcID = dwNpcID;
	NetMsg.dwGlobalID = dwGlobalID;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;

_REQ_FAIL:
	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREGEN_CURE_FAIL") );

	return S_OK;
}

//	Note : ij¸¯ÅÍ Á¤º¸ ¸®¼Â. ( stats, skill )
//
HRESULT GLCharacter::ReqCharReset ( DWORD dwNpcID )
{
	EMREGEN_CHARRESET_FB emFB = EMREGEN_CHARRESET_FAIL;
	WORD wPosX(0), wPosY(0);
	GLMSG::SNETPC_REQ_CHARRESET NetMsg;

	PLANDMANCLIENT pLandMan = GLGaeaClient::GetInstance().GetActiveMap ();
	PGLCROWCLIENT pCrow = pLandMan->GetCrow ( dwNpcID );

	if ( !pCrow )										goto _REQ_FAIL;
	if ( pCrow->GETCROW() != CROW_NPC )					goto _REQ_FAIL;


	bool bITEM = m_cInventory.GetCharResetItem ( wPosX, wPosY );
	if ( !bITEM )
	{
		emFB = EMREGEN_CHARRESET_ITEM_FAIL;
		goto _REQ_FAIL;
	}

	//	Note : ij¸¯ÅÍ Á¤º¸ ¸®¼Â.
	NetMsg.dwNpcID = dwNpcID;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;

_REQ_FAIL:
	
	switch ( emFB )
	{
	case EMREGEN_CHARRESET_FAIL:
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREGEN_CHARRESET_FAIL") );
		break;

	case EMREGEN_CHARRESET_ITEM_FAIL:
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREGEN_CHARRESET_ITEM_FAIL") );
		break;
	};

	return S_OK;
}

//	Note : NPC¿Í itemÀ» ±³È¯ A:npc¿¡°Ô Áִ°͵é, b:npc¿¡°Ô¼­ ¹Þ´Â°Í.
HRESULT GLCharacter::ReqItemTrade ( DWORD dwNpcID, DWORD dwGlobalID, DWORD *pDwA_NID, DWORD dwB_NID )
{
	EMNPC_ITEM_TRADE_FB emFB = EMNPC_ITEM_TRADE_FAIL;
	WORD wPosX(0), wPosY(0);
	GLMSG::SNETPC_REQ_NPC_ITEM_TRADE NetMsg;

	PLANDMANCLIENT pLandMan = GLGaeaClient::GetInstance().GetActiveMap ();
	PGLCROWCLIENT pCrow = pLandMan->GetCrow ( dwNpcID );

	if ( !pCrow )										goto _REQ_FAIL;
	if ( pCrow->GETCROW() != CROW_NPC )					goto _REQ_FAIL;

	// Need Add New Item Con.
	BOOL bOK[] = { FALSE, FALSE, FALSE, FALSE, FALSE };
	bOK[0] = ISHAVEITEM ( SNATIVEID(pDwA_NID[0]) );
	BYTE i;
	// MAX_NEEDITEM_COUNT 5
	for( i = 1; i < 5; i++ )
	{
		if( pDwA_NID[i] == UINT_MAX )
			bOK[i] = TRUE;
		else
			bOK[i] = ISHAVEITEM ( SNATIVEID(pDwA_NID[i]) );	
	}

	if( bOK[0] == FALSE || bOK[1] == FALSE || bOK[2] == FALSE || bOK[3] == FALSE || bOK[4] == FALSE )
	{
		emFB = EMNPC_ITEM_TRADE_ITEM_FAIL;
		goto _REQ_FAIL;
	}

	//	Note : ¾ÆÀÌÅÛ ±³È¯ ¿äû.
	//
	NetMsg.dwNpcID    = dwNpcID;
	// MAX_NEEDITEM_COUNT 5
	for( i = 0; i < 5; i++ )
	{
		NetMsg.dwA_NID[i]    = pDwA_NID[i];
	}
	NetMsg.dwB_NID    = dwB_NID;
	NetMsg.dwGlobalID = dwGlobalID;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;

_REQ_FAIL:
	switch ( emFB )
	{
	case EMNPC_ITEM_TRADE_FAIL:
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMNPC_ITEM_TRADE_FAIL") );
		break;

	case EMNPC_ITEM_TRADE_ITEM_FAIL:
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMNPC_ITEM_TRADE_ITEM_FAIL") );
		break;
	};

	return S_OK;
}

// *****************************************************
// Desc: Ä£±¸¿¡°Ô À̵¿(Ä£±¸À̵¿Ä«µå)
// *****************************************************
HRESULT	GLCharacter::Req2Friend ( const char *szNAME )
{
	SFRIEND* pFRIEND = GLFriendClient::GetInstance().GetFriend ( szNAME );
	if ( !pFRIEND )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EM2FRIEND_FB_FAIL") );
		return S_FALSE;
	}

	PLANDMANCLIENT pLAND = GLGaeaClient::GetInstance().GetActiveMap();
	if ( pLAND->m_bTowerWars )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Disable" );
		return E_FAIL;
	}
	SINVENITEM *pINVENITEM = m_cInventory.FindItem ( ITEM_2FRIEND );
	if ( !pINVENITEM )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EM2FRIEND_FB_NO_ITEM") );
		return S_FALSE;
	}

	//	Note : Ä£±¸¿¡°Ô °¡±â ¿äû.
	GLMSG::SNETPC_2_FRIEND_REQ NetMsg;
	StringCchCopy ( NetMsg.szFRIEND_NAME, CHAR_SZNAME, pFRIEND->szCharName );
	NetMsg.wItemPosX = pINVENITEM->wPosX;
	NetMsg.wItemPosY = pINVENITEM->wPosY;
	NETSEND ( &NetMsg);

	return S_OK;
}

bool GLCharacter::IsInvenSplitItem ( WORD wPosX, WORD wPosY, bool bVietnamInven )
{
	SINVENITEM* pInvenItem = NULL;
	if( bVietnamInven )
	{
		pInvenItem = m_cVietnamInventory.FindPosItem ( wPosX, wPosY );
	}else{
		pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	}
	if ( !pInvenItem )	return false;

	//	Note : ¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿À±â.
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	GASSERT(pItem&&"¾ÆÀÌÅÆ ´ëÀÌÅÍ°¡ Á¸Á¦ÇÏÁö ¾ÊÀ½");

	bool bSPLIT(false);
	bSPLIT = ( pItem->ISINSTANCE() );
	if ( !bSPLIT )					return FALSE;
	bSPLIT = ( pInvenItem->sItemCustom.wTurnNum>1 );

	return bSPLIT;
}

bool GLCharacter::IsStorageSplitItem ( DWORD dwChannel, WORD wPosX, WORD wPosY )
{
	GASSERT(EMSTORAGE_CHANNEL>dwChannel);
	if ( EMSTORAGE_CHANNEL<=dwChannel )	return false;

	SINVENITEM* pInvenItem = m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return false;

	//	Note : ¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿À±â.
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	GASSERT(pItem&&"¾ÆÀÌÅÆ ´ëÀÌÅÍ°¡ Á¸Á¦ÇÏÁö ¾ÊÀ½");

	bool bSPLIT(false);
	bSPLIT = ( pItem->ISPILE() );
	if ( !bSPLIT )					return FALSE;
	bSPLIT = ( pInvenItem->sItemCustom.wTurnNum>1 );

	return bSPLIT;
}

//	Note : Àκ¥Å丮 - °ãħ ¾ÆÀÌÅÛ ºÐ¸®.
HRESULT GLCharacter::ReqInvenSplit ( WORD wPosX, WORD wPosY, WORD wSplitNum )
{
	if ( !IsInvenSplitItem(wPosX,wPosY) )	return E_FAIL;
	
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )									return E_FAIL;

	if ( pInvenItem->sItemCustom.wTurnNum <= wSplitNum )
	{
		return E_FAIL;
	}

	//	Note : ¾ÆÀÌÅÛ ºÐ¸® ¸Þ½ÃÁö Àü¼Û.
	GLMSG::SNETPC_REQ_INVEN_SPLIT NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.wSplit = wSplitNum;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

// *****************************************************
// Desc: â°í - °ãħ ¾ÆÀÌÅÛ ºÐ¸®.
// *****************************************************
HRESULT GLCharacter::ReqStorageSplit ( DWORD dwChannel, WORD wPosX, WORD wPosY, WORD wSplitNum )
{
	if ( !IsStorageSplitItem(dwChannel,wPosX,wPosY) )	return E_FAIL;

	SINVENITEM* pInvenItem = m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return false;
	
	if ( pInvenItem->sItemCustom.wTurnNum <= wSplitNum )
	{
		return E_FAIL;
	}

	//	Note : ¾ÆÀÌÅÛ ºÐ¸® ¸Þ½ÃÁö Àü¼Û.
	GLMSG::SNETPC_REQ_STORAGE_SPLIT NetMsg;
	NetMsg.dwChannel = dwChannel;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.wSplit = wSplitNum;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

//	Note : ´ë·Ã ¿äû.
//
HRESULT GLCharacter::ReqConflict ( DWORD dwID, const SCONFT_OPTION &sOption )
{
	if ( !IsValidBody() )					return E_FAIL;

	PGLCHARCLIENT pChar = GLGaeaClient::GetInstance().GetChar ( dwID );
	if ( !pChar )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCONFRONT_FAIL") );
		return E_FAIL;
	}

	PLANDMANCLIENT pLAND = GLGaeaClient::GetInstance().GetActiveMap();
	if ( pLAND->m_bTowerWars )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Disable" );
		return E_FAIL;
	}
	if ( GLGaeaClient::GetInstance().GetActiveMap()->IsPeaceZone() )
	{
		//	Note : ÆòÈ­ Áö¿ª¿¡¼­´Â ´ë·ÃÀÌ ºÒ°¡´ÉÇÕ´Ï´Ù.
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCONFRONT_PEACE") );
		return E_FAIL;
	}

	if ( !sOption.VALID_OPT() )	
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCONFRONT_OPTION") );
		return E_FAIL;
	}

	if ( m_sCONFTING.IsCONFRONTING() )
	{
		//	Note : ÀÌ¹Ì ´ë·ÃÁßÀÌ¿©¼­ ´ë·Ã ½ÅûÀÌ ºÒ°¡´ÉÇÕ´Ï´Ù.
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCONFRONT_ALREADY_ME") );
		return E_FAIL;
	}

	GLPARTY_CLIENT* pParty = GLPartyClient::GetInstance().FindMember ( dwID );
	if ( pParty )
	{
		//	Note : °°Àº ¼Ò¼ÓÀÇ ÆÄƼ¿øÀÌ¿©¼­ ´ë·Ã ºÒ°¡´ÉÇÕ´Ï´Ù.
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCONFRONT_PARTY") );
		return E_FAIL;
	}

	//	Note : Ŭ·´ ´ë·ÃÀÏ °æ¿ì.
	if ( IsClubMaster() && pChar->IsClubMaster() )
	{
		GLMSG::SNETPC_REQ_CONFRONT NetMsg;
		NetMsg.emTYPE = EMCONFT_GUILD;
		NetMsg.dwID = dwID;
		NetMsg.sOption = sOption;
		NETSEND(&NetMsg);
	}
	//	Note : ÆÄƼ ´ë·ÃÀÏ °æ¿ì.
	else 
	if ( IsPartyMaster() && pChar->IsPartyMaster() )
	{
		GLMSG::SNETPC_REQ_CONFRONT NetMsg;
		NetMsg.emTYPE = EMCONFT_PARTY;
		NetMsg.dwID = dwID;
		NetMsg.sOption = sOption;
		NETSEND(&NetMsg);
	}
	//	Note : °³ÀÎ ´ë·ÃÀÏ °æ¿ì.
	else
	{
		if ( IsPartyMem() )
		{
			//	Note : ÆÄƼÀ常 'ÆÄƼ´ë·Ã'À» ½ÅûÇÒ ¼ö ÀÖ½À´Ï´Ù.
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCONFRONT_MENOTMASTER") );
			return E_FAIL;
		}

		GLMSG::SNETPC_REQ_CONFRONT NetMsg;
		NetMsg.emTYPE = EMCONFT_ONE;
		NetMsg.dwID = dwID;
		NetMsg.sOption = sOption;
		NETSEND(&NetMsg);
	}

	return S_OK;
}

void GLCharacter::ReqSkillReaction ( STARGETID sTID )
{
	if ( IsACTION(GLAT_SKILL) || IsACTION(GLAT_ATTACK) )	return;

	BOOL bMove(FALSE);
	D3DXVECTOR3 vMoveTo;

	m_sActiveSkill = m_sRunSkill;

	PGLSKILL pRunSkill = GLSkillMan::GetInstance().GetData ( m_sActiveSkill );
	if ( !pRunSkill )										return;
	if ( pRunSkill->m_sBASIC.emIMPACT_SIDE == SIDE_ENERMY )	return;

	SetDefenseSkill( false );

	GLCOPY* pCOPY = GLGaeaClient::GetInstance().GetCopyActor(sTID);
	if ( !pCOPY )	return;

	sTID.vPos = pCOPY->GetPosition();
	SkillReaction ( sTID, DXKEY_UP, false, bMove, vMoveTo );

	//	Note : Reaction ¿¡¼­ À̵¿À» ¿äûÇÑ °æ¿ì.
	//
	if ( bMove )
	{
		ActionMoveTo ( 0.0f, vMoveTo+D3DXVECTOR3(0,+5,0), vMoveTo+D3DXVECTOR3(0,-5,0), FALSE, TRUE );
	}
}

HRESULT GLCharacter::ReqQuestStart ( DWORD dwNpcID, DWORD dwTalkID, DWORD dwQUESTID )
{
	//	Note : Äù½ºÆ® ½ÃÀÛÀ» À§ÇÑ °Ë»ç.
	//
	GLQUEST* pQUEST = GLQuestMan::GetInstance().Find ( dwQUESTID );
	if ( !pQUEST )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMQUEST_START_FB_FAIL") );
		return S_FALSE;
	}

	//	ÀÌ¹Ì ÁøÇàÁßÀÎ Äù½ºÆ® ÀÎÁö Á¡°Ë.
	GLQUESTPROG* pQUEST_PROG = m_cQuestPlay.FindProc ( dwQUESTID );
	if ( pQUEST_PROG )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMQUEST_START_FB_ALREADY") );
		return S_FALSE;
	}

	//	ÀÌ¹Ì ¿Ï·áÇÑ Äù½ºÆ®ÀÎÁö °Ë»ç.
	GLQUESTPROG* pQUEST_END = m_cQuestPlay.FindEnd ( dwQUESTID );
	if ( pQUEST_END )
	{
		if ( !pQUEST_END->m_bCOMPLETE )
		{
			//	Æ÷±â(½ÇÆÐ)ÇÑ Äù½ºÆ®¸¦ ´Ù½Ã ½Ãµµ ºÒ°¡´ÉÇÑ °æ¿ì.
			if ( !pQUEST->IsAGAIN() )
			{
				CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMQUEST_START_FB_DONAGAIN") );
				return S_FALSE;
			}
		}
		else
		{
			//	¿©·¯¹ø ½Ãµµ °¡´ÉÇÑÁö °Ë»ç.
			if ( !pQUEST->IsREPEAT() )
			{
				CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMQUEST_START_FB_DONREPEAT") );
				return S_FALSE;
			}
		}
	}

	if ( m_lnMoney < pQUEST->m_dwBeginMoney )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMQUEST_START_FB_NEEDMONEY") );
		return S_FALSE;
	}

	//pQUEST->m_dwBeginPartyMemNum;

	//	Note : quest ½ÃÀÛ ¼­¹ö¿¡ ¿äû.
	//
	GLMSG::SNETPC_REQ_QUEST_START NetMsg;
	NetMsg.dwNpcID = dwNpcID;
	NetMsg.dwTalkID = dwTalkID;
	NetMsg.dwQuestID = dwQUESTID;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqQuestStepNpcTalk ( DWORD dwNpcID, DWORD dwTalkID, DWORD dwQUESTID, DWORD dwQUESTSTEP )
{
	//	Note : Äù½ºÆ® ÁøÇàÀ» À§ÇÑ °Ë»ç.
	//
	GLQUEST* pQUEST = GLQuestMan::GetInstance().Find ( dwQUESTID );
	if ( !pQUEST )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMQUEST_START_FB_FAIL") );
		return S_FALSE;
	}

	//	ÁøÇàÁßÀÎ Äù½ºÆ® ÀÎÁö Á¡°Ë.
	GLQUESTPROG* pQUEST_PROG = m_cQuestPlay.FindProc ( dwQUESTID );
	if ( !pQUEST_PROG )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMQUEST_START_FB_ALREADY") );
		return S_FALSE;
	}

	//	Note : quest ÁøÇà ¼­¹ö¿¡ ¿äû.
	//
	GLMSG::SNET_QUEST_STEP_NPC_TALK NetMsg;
	NetMsg.dwNpcID = dwNpcID;
	NetMsg.dwTalkID = dwTalkID;
	NetMsg.dwQUESTID = dwQUESTID;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqQuestGiveUp ( DWORD dwQUESTID )
{
	//	Note : Äù½ºÆ® ÁøÇàÀ» À§ÇÑ °Ë»ç.
	//
	GLQUEST* pQUEST = GLQuestMan::GetInstance().Find ( dwQUESTID );
	if ( !pQUEST )			return S_FALSE;

	//	ÁøÇàÁßÀÎ Äù½ºÆ® ÀÎÁö Á¡°Ë.
	GLQUESTPROG* pQUEST_PROG = m_cQuestPlay.FindProc ( dwQUESTID );
	if ( !pQUEST_PROG )		return S_FALSE;

	if ( !pQUEST->IsGIVEUP() )		return S_FALSE;

	//	Note : quest ÁøÇà ¼­¹ö¿¡ ¿äû.
	//
	GLMSG::SNET_QUEST_PROG_GIVEUP NetMsg;
	NetMsg.dwQUESTID = dwQUESTID;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqQuestREADINGReset ( DWORD dwQUESTID )
{
	//	Note : Äù½ºÆ® ÁøÇàÀ» À§ÇÑ °Ë»ç.
	//
	GLQUEST* pQUEST = GLQuestMan::GetInstance().Find ( dwQUESTID );
	if ( !pQUEST )			return S_FALSE;

	//	ÁøÇàÁßÀÎ Äù½ºÆ® ÀÎÁö Á¡°Ë.
	GLQUESTPROG* pQUEST_PROG = m_cQuestPlay.FindProc ( dwQUESTID );
	if ( !pQUEST_PROG )		return S_FALSE;

	if ( !pQUEST_PROG->IsReqREADING() )		return S_FALSE;
	pQUEST_PROG->ResetReqREADING ();

	//	Note : quest ÀоúÀ½À» ¼­¹ö¿¡ ¾Ë¸².
	//
	GLMSG::SNETPC_QUEST_PROG_READ NetMsg;
	NetMsg.dwQID = dwQUESTID;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqQuestComplete ( DWORD dwQUESTID )
{
	//	Note : Äù½ºÆ® ÁøÇàÀ» À§ÇÑ °Ë»ç.
	//
	GLQUEST* pQUEST = GLQuestMan::GetInstance().Find ( dwQUESTID );
	if ( !pQUEST )			return S_FALSE;

	//	ÁøÇàÁßÀÎ Äù½ºÆ® ÀÎÁö Á¡°Ë.
	GLQUESTPROG* pQUEST_PROG = m_cQuestPlay.FindProc ( dwQUESTID );
	if ( !pQUEST_PROG )		return S_FALSE;

	if ( !pQUEST_PROG->CheckCOMPLETE() )		return S_FALSE;

	//	Note : quest ¿Ï·á ¿äû.
	//
	GLMSG::SNETPC_REQ_QUEST_COMPLETE NetMsg;
	NetMsg.dwQID = dwQUESTID;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqBusStation ( DWORD dwNpcID, DWORD dwSTATION )
{
	PLANDMANCLIENT pLandMan = GLGaeaClient::GetInstance().GetActiveMap ();
	PGLCROWCLIENT pCrow = pLandMan->GetCrow ( dwNpcID );

	if ( !pCrow )										return S_OK;
	if ( pCrow->GETCROW() != CROW_NPC )					return S_OK;

	//	Note : Á¤·ùÀå id°¡ Á¤È®ÇÑÁö °Ë»ç.
	//
	SSTATION* pSTATION = GLBusStation::GetInstance().GetStation ( dwSTATION );
	if ( !pSTATION )									return S_OK;

	SMAPNODE *pNODE = GLGaeaClient::GetInstance().FindMapNode(SNATIVEID(pSTATION->dwMAPID));
	if ( !pNODE )										return S_OK;
	
	//	Note : pk µî±ÞÀÌ »ìÀÎÀÚ µî±Þ ÀÌ»óÀÏ °æ¿ì ¹ö½º »ç¿ëÀ» ¸·´Â´Ù.
	//
	//DWORD dwPK_LEVEL = GET_PK_LEVEL();
	//if ( dwPK_LEVEL != UINT_MAX && dwPK_LEVEL>GLCONST_CHAR::dwPK_RECALL_ENABLE_LEVEL )
	//{
	//	CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMBUS_TAKE_PK_LEVEL") );
	//	return E_FAIL;
	//}

	EMREQFAIL emReqFail(EMREQUIRE_COMPLETE);

	GLLevelFile cLevelFile;
	BOOL bOk = cLevelFile.LoadFile ( pNODE->strFile.c_str(), TRUE, NULL );
	if ( !bOk )											return S_OK;

	SLEVEL_REQUIRE* pRequire = cLevelFile.GetLevelRequire ();
	emReqFail = pRequire->ISCOMPLETE ( this );
	if ( emReqFail != EMREQUIRE_COMPLETE )
	{
		CInnerInterface &cINTERFACE = CInnerInterface::GetInstance();
		switch ( emReqFail )
		{
		case EMREQUIRE_LEVEL:
			{
				if( pRequire->m_signLevel == EMSIGN_FROMTO )
				{
					cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
						ID2GAMEINTEXT("EMREQUIRE_LEVEL2"),
						pRequire->m_wLevel,
						pRequire->m_wLevel2 );
				}else{
					std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signLevel].c_str());

					if( RANPARAM::emSERVICE_TYPE == EMSERVICE_THAILAND )
					{
						cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
							ID2GAMEINTEXT("EMREQUIRE_LEVEL"),
							strSIGN.c_str(),
							pRequire->m_wLevel );
					}
					else
					{
						cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
							ID2GAMEINTEXT("EMREQUIRE_LEVEL"),
							pRequire->m_wLevel,
							strSIGN.c_str() );
					}
				}
			}
			break;

		case EMREQUIRE_ITEM:
			{
				SITEM *pItem = GLItemMan::GetInstance().GetItem ( pRequire->m_sItemID );
				if ( pItem )
				{
					cINTERFACE.PrintMsgTextDlg
					(
						NS_UITEXTCOLOR::DISABLE,
						ID2GAMEINTEXT("EMREQUIRE_ITEM"),
						pItem->GetName()
					);
				}
			}
			break;

		case EMREQUIRE_SKILL:
			{
				PGLSKILL pSkill = GLSkillMan::GetInstance().GetData ( pRequire->m_sSkillID );
				if ( pSkill )
				{
					cINTERFACE.PrintMsgTextDlg
					(
						NS_UITEXTCOLOR::DISABLE,
						ID2GAMEINTEXT("EMREQUIRE_SKILL"),
						pSkill->GetName()
					);
				}
			}
			break;

		case EMREQUIRE_LIVING:
			{
				std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signLiving].c_str());
				cINTERFACE.PrintMsgTextDlg
				(
					NS_UITEXTCOLOR::DISABLE,
					ID2GAMEINTEXT("EMREQUIRE_PREMIUM"),
					pRequire->m_nLiving,
					strSIGN.c_str() // 2
				);
			}
			break;

		case EMREQUIRE_BRIGHT:
			{
				std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signBright].c_str());
				cINTERFACE.PrintMsgTextDlg
				(
					NS_UITEXTCOLOR::DISABLE,
					ID2GAMEINTEXT("EMREQUIRE_REBORN"),
					pRequire->m_nBright,
					strSIGN.c_str()
				);
			}
			break;

		case EMREQUIRE_QUEST_COM:
			{
				CString strQUEST = "quest";
				GLQUEST *pQUEST = GLQuestMan::GetInstance().Find ( pRequire->m_sComQuestID.dwID );
				if ( pQUEST )		strQUEST = pQUEST->GetTITLE();

				cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQUIRE_QUEST_COM"), strQUEST.GetString() );
			}
			break;

		case EMREQUIRE_QUEST_ACT:
			{
				CString strQUEST = "quest";
				GLQUEST *pQUEST = GLQuestMan::GetInstance().Find ( pRequire->m_sComQuestID.dwID );
				if ( pQUEST )		strQUEST = pQUEST->GetTITLE();

				cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQUIRE_QUEST_ACT"), strQUEST.GetString() );
			}
			break;

		default:
			cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("MAP_REQUIRE_FAIL") );
			break;
		};

		//	Note : Ãⱸ »ç¿ë ±ÇÇÑÀÌ ¾ÈµÉ °æ¿ì. GM level ÀÌ»óÀÏ °æ¿ì Á¶°Ç ¹«½Ã.
		//
		if ( m_dwUserLvl < USER_GM3 )	return S_OK;
	}

	//	Note : ¹ö½º ƼÄÏÀÌ ÀÖ´ÂÁö °Ë»ç.
	//
	SINVENITEM* pITEM_TICKET = m_cInventory.FindItem ( ITEM_TICKET );
	if ( !pITEM_TICKET )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMBUS_TAKE_TICKET") );
		return S_OK;
	}

	//	Note : ¹ö½º ½ÂÂ÷.
	//
	GLMSG::SNETPC_REQ_BUS NetMsg;
	NetMsg.wPosX = pITEM_TICKET->wPosX;
	NetMsg.wPosY = pITEM_TICKET->wPosY;
	NetMsg.dwNPC_ID = dwNpcID;
	NetMsg.dwSTATION_ID = dwSTATION;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

	//	Note : Åýà ½ÂÂ÷ ¿äû.
HRESULT GLCharacter::ReqTaxiStation ( WORD wPosX, WORD wPosY, int nSelectMap, int nSelectStop )
{
	//	Note : Á¤·ùÀå id°¡ Á¤È®ÇÑÁö °Ë»ç.
	//
	STAXI_MAP* pTaxiMap = GLTaxiStation::GetInstance().GetTaxiMap ( nSelectMap );
	if ( !pTaxiMap )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMTAXI_TAKE_MAPFAIL") );
		return S_OK;
	}

	STAXI_STATION* pStation = pTaxiMap->GetStation( nSelectStop );
	if ( !pStation )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMTAXI_TAKE_STATIONFAIL") );
		return S_OK;
	}

	SMAPNODE *pNODE = GLGaeaClient::GetInstance().FindMapNode(SNATIVEID(pStation->dwMAPID));
	if ( !pNODE )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMTAXI_TAKE_MAPFAIL") );
		return S_OK;
	}

	EMREQFAIL emReqFail(EMREQUIRE_COMPLETE);

	GLLevelFile cLevelFile;
	BOOL bOk = cLevelFile.LoadFile ( pNODE->strFile.c_str(), TRUE, NULL );
	if ( !bOk )											return S_OK;

	SLEVEL_REQUIRE* pRequire = cLevelFile.GetLevelRequire ();
	emReqFail = pRequire->ISCOMPLETE ( this );
	if ( emReqFail != EMREQUIRE_COMPLETE )
	{
		CInnerInterface &cINTERFACE = CInnerInterface::GetInstance();
		switch ( emReqFail )
		{
		case EMREQUIRE_LEVEL:
			{
				if( pRequire->m_signLevel == EMSIGN_FROMTO )
				{
					cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
						ID2GAMEINTEXT("EMREQUIRE_LEVEL2"),
						pRequire->m_wLevel,
						pRequire->m_wLevel2 );
				}else{
					std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signLevel].c_str());

					if( RANPARAM::emSERVICE_TYPE == EMSERVICE_THAILAND )
					{
						cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
							ID2GAMEINTEXT("EMREQUIRE_LEVEL"),
							strSIGN.c_str(),
							pRequire->m_wLevel );
					}
					else
					{
						cINTERFACE.PrintMsgTextDlg( NS_UITEXTCOLOR::DISABLE, 
							ID2GAMEINTEXT("EMREQUIRE_LEVEL"),
							pRequire->m_wLevel,
							strSIGN.c_str() );
					}
				}
			}
			break;

		case EMREQUIRE_ITEM:
			{
				SITEM *pItem = GLItemMan::GetInstance().GetItem ( pRequire->m_sItemID );
				if ( pItem )
				{
					cINTERFACE.PrintMsgTextDlg
					(
						NS_UITEXTCOLOR::DISABLE,
						ID2GAMEINTEXT("EMREQUIRE_ITEM"),
						pItem->GetName()
					);
				}
			}
			break;

		case EMREQUIRE_SKILL:
			{
				PGLSKILL pSkill = GLSkillMan::GetInstance().GetData ( pRequire->m_sSkillID );
				if ( pSkill )
				{
					cINTERFACE.PrintMsgTextDlg
					(
						NS_UITEXTCOLOR::DISABLE,
						ID2GAMEINTEXT("EMREQUIRE_SKILL"),
						pSkill->GetName()
					);
				}
			}
			break;

		case EMREQUIRE_LIVING:
			{
				std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signLiving].c_str());
				cINTERFACE.PrintMsgTextDlg
				(
					NS_UITEXTCOLOR::DISABLE,
					ID2GAMEINTEXT("EMREQUIRE_PREMIUM"),
					pRequire->m_nLiving,
					strSIGN.c_str() // 3
				);
			}
			break;

		case EMREQUIRE_BRIGHT:
			{
				std::string strSIGN = ID2GAMEINTEXT(COMMENT::CDT_SIGN_ID[pRequire->m_signBright].c_str());
				cINTERFACE.PrintMsgTextDlg
				(
					NS_UITEXTCOLOR::DISABLE,
					ID2GAMEINTEXT("EMREQUIRE_REBORN"),
					pRequire->m_nBright,
					strSIGN.c_str()
				);
			}
			break;

		case EMREQUIRE_QUEST_COM:
			{
				CString strQUEST = "quest";
				GLQUEST *pQUEST = GLQuestMan::GetInstance().Find ( pRequire->m_sComQuestID.dwID );
				if ( pQUEST )		strQUEST = pQUEST->GetTITLE();

				cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQUIRE_QUEST_COM"), strQUEST.GetString() );
			}
			break;

		case EMREQUIRE_QUEST_ACT:
			{
				CString strQUEST = "quest";
				GLQUEST *pQUEST = GLQuestMan::GetInstance().Find ( pRequire->m_sComQuestID.dwID );
				if ( pQUEST )		strQUEST = pQUEST->GetTITLE();

				cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQUIRE_QUEST_ACT"), strQUEST.GetString() );
			}
			break;

		default:
			cINTERFACE.PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("MAP_REQUIRE_FAIL") );
			break;
		};

		//	Note : Ãⱸ »ç¿ë ±ÇÇÑÀÌ ¾ÈµÉ °æ¿ì. GM level ÀÌ»óÀÏ °æ¿ì Á¶°Ç ¹«½Ã.
		//
		if ( m_dwUserLvl < USER_GM3 )	return S_OK;
	}

	//	Note : Åýà īµå°¡ ÀÖ´ÂÁö °Ë»ç.
	//
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem || pItem->sBasicOp.emItemType != ITEM_TAXI_CARD )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMTAXI_TAKE_TICKET") );
		return E_FAIL;
	}

	LONGLONG lnCharge = GetCalcTaxiCharge( nSelectMap, nSelectStop );

	if ( m_lnMoney < lnCharge )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMTAXI_TAKE_MONEY") );
		return S_FALSE;
	}

	//	Note : ¹ö½º ½ÂÂ÷.
	//
	GLMSG::SNETPC_REQ_TAXI NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.dwSelectMap = nSelectMap;
	NetMsg.dwSelectStop = nSelectStop;
	NetMsg.dwGaeaID = m_dwGaeaID;
	NETSEND ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqLoudSpeaker ( const char* szChat, SITEMLINK* pItemLink )
{
	WORD wPosX(0), wPosY(0);

	if ( m_dwUserLvl < USER_GM3 )
	{
		SINVENITEM* pINVENITEM = m_cInventory.FindItem ( ITEM_LOUDSPEAKER );
		if ( !pINVENITEM )
		{
			//	Note : È®¼º±â ¾ÆÀÌÅÛÀÌ Á¸Á¦ÇÏÁö ¾Ê½À´Ï´Ù.
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCHAT_LOUDSPEAKER_NOITEM") );
			return S_OK;
		}

		if ( m_sPMarket.IsOpen() ) 
		{
			DWORD wTurn = m_cInventory.CountTurnItem( pINVENITEM->sItemCustom.sNativeID );
			DWORD wMarketTurn = m_sPMarket.GetItemTurnNum( pINVENITEM->sItemCustom.sNativeID ) ;

			if ( wTurn <= wMarketTurn ) 
			{
				//	Note : È®¼º±â ¾ÆÀÌÅÛÀÌ Á¸Á¦ÇÏÁö ¾Ê½À´Ï´Ù.
				CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMCHAT_LOUDSPEAKER_NOITEM") );
				return S_OK;
			}
		}

		wPosX = pINVENITEM->wPosX;
		wPosY = pINVENITEM->wPosY;
	}

	//	Note : È®¼º±â »ç¿ë ¿äû.
	//
	GLMSG::SNETPC_CHAT_LOUDSPEAKER NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	if ( pItemLink )
		NetMsg.sITEMLINK = *pItemLink;
	StringCchCopy ( NetMsg.szMSG, CHAT_MSG_SIZE+1, szChat );
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketTitle ( const char* szTitle )
{
	if ( m_sPMarket.IsOpen() )	return S_FALSE;

	//	Note : ÃʱâÈ­¸¦ ÇàÇÑ´Ù.
	m_sPMarket.DoMarketClose();

	//	Note : ŸÀÌƲ ÁöÁ¤ ¿äû.
	//
	GLMSG::SNETPC_PMARKET_TITLE NetMsg;
	StringCchCopy ( NetMsg.szPMarketTitle, CHAT_MSG_SIZE+1, szTitle );
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketRegItem ( WORD wPosX, WORD wPosY, LONGLONG dwMoney, DWORD dwNum ) // Vend Price Max Increased | 07-27-2013 |  
{
	if ( m_sPMarket.IsOpen() )	return S_FALSE;

	SINVENITEM *pINVENITEM = m_cInventory.GetItem ( wPosX, wPosY );
	if ( !pINVENITEM )			return S_FALSE;

	//	Note : µî·ÏÇÒ ¼ö ÀÖ´Â Çѵµ¸¦ ³Ñ¾î¼­°í ÀÖ½À´Ï´Ù.
	if ( m_sPMarket.GetItemNum() >= GLPrivateMarket::EMMAX_SALE_NUM )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_REGITEM_FB_MAXNUM") );
		return S_FALSE;
	}

	SNATIVEID nidITEM = pINVENITEM->sItemCustom.sNativeID;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( nidITEM );
	if ( !pITEM )				return S_FALSE;

	//	°Å·¡¿É¼Ç
	if ( !pINVENITEM->sItemCustom.IsWrap() )
	{
	if ( !pITEM->sBasicOp.IsEXCHANGE() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( 
			NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_REGITEM_FB_NOSALE") );
		return S_FALSE;
	}
	if ( pINVENITEM->sItemCustom.IsNonDrop()  )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( 
			NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_REGITEM_FB_NOSALE") );
		return S_FALSE;
	}
	}

	// ÆÖÄ«µåÀ̸鼭 ÆÖÀÌ È°¼ºÈ­ µÇ¾î ÀÖÀ¸¸é »óÁ¡¿¡ µî·ÏÇÒ ¼ö ¾ø´Ù.
	if ( pITEM->sBasicOp.emItemType == ITEM_PET_CARD )
	{
		// µé°íÀÖ´Â ¾ÆÀÌÅÛÀÌ ÆÖÄ«µåÀ̸ç ÆÖÀÌ È°¼ºÈ­ µÇ¾î ÀÖÀ¸¸é
		GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
		if ( pMyPet->IsVALID () && pINVENITEM->sItemCustom.dwPetID == pMyPet->m_dwPetID )
		{
			return E_FAIL;
		}
	}

	if ( pITEM->sBasicOp.emItemType == ITEM_VEHICLE && pINVENITEM->sItemCustom.dwVehicleID != 0 )
	{
		return E_FAIL;
	}

	//	Note : ÀÌ¹Ì µî·ÏµÈ ¾ÆÀÌÅÛÀÎÁö °Ë»ç.
	bool bREGPOS = m_sPMarket.IsRegInvenPos ( SNATIVEID(wPosX,wPosY) );
	if ( bREGPOS )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_REGITEM_FB_REGITEM") );
		return S_FALSE;
	}

	//	Note : °ãħ °¡´ÉÀÏ °æ¿ì µ¿ÀÏÇÑ Á¾·ùÀÇ ¾ÆÀÌÅÛÀÌ ÀÌ¹Ì µî·ÏµÇ¾î ÀÖ´ÂÁö °Ë»ç.
	if ( pITEM->ISPILE() )
	{
		bool bREG = m_sPMarket.IsRegItem ( nidITEM );
		if ( bREG )
		{
			CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_REGITEM_FB_REGITEM") );
			return S_FALSE;
		}

		//	Note : ¼ÒÁöÇÏ°í ÀÖ´Â °³¼ö ¸¹Å­ ÆǸŠ°¡´É.
		DWORD dwTURN = m_cInventory.CountTurnItem ( nidITEM );
		if ( dwNum >= dwTURN )
		{
			dwNum = dwTURN;
		}
	}

	if ( !pITEM->ISPILE() )
	{
		dwNum = 1;
	}
	
	SNATIVEID sSALEPOS;
	bool bPOS = m_sPMarket.FindInsertPos ( nidITEM, sSALEPOS );
	if ( !bPOS )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_REGITEM_FB_MAXNUM") );
		return S_FALSE;
	}

	GLMSG::SNETPC_PMARKET_REGITEM NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.dwMoney = dwMoney;
	NetMsg.dwNum = dwNum;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketDisItem ( WORD wPosX, WORD wPosY )
{
	if ( m_sPMarket.IsOpen() )	return S_FALSE;

	SNATIVEID sSALEPOS(wPosX,wPosY);
	const SSALEITEM* pSALEITEM = m_sPMarket.GetItem ( sSALEPOS );
	if ( !pSALEITEM )		return S_FALSE;

	GLMSG::SNETPC_PMARKET_DISITEM NetMsg;
	NetMsg.sSALEPOS = sSALEPOS;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketOpen ()
{
	if ( m_sPMarket.IsOpen() )		return S_FALSE;

	//	Note : ÆǸſëÀ¸·Î µî·ÏÇÑ ¾ÆÀÌÅÛÀÌ 
	if ( m_sPMarket.GetItemNum() == 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_OPEN_FB_EMPTY") );
		return S_FALSE;
	}

	if ( m_wPMPosX==USHRT_MAX )		return S_FALSE;
	if ( m_wPMPosY==USHRT_MAX )		return S_FALSE;

	//	Note : °³ÀλóÁ¡ °³¼³ ¿äû.
	GLMSG::SNETPC_PMARKET_OPEN NetMsg;
	NetMsg.wPosX = m_wPMPosX;
	NetMsg.wPosY = m_wPMPosY;
	NETSENDTOFIELD ( &NetMsg );

	m_wPMPosX = (USHRT_MAX);
	m_wPMPosY = (USHRT_MAX);

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketClose ()
{
	if ( !m_sPMarket.IsOpen() )		return S_FALSE;

	m_sPMarket.DoMarketClose();

	GLMSG::SNETPC_PMARKET_CLOSE NetMsg;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketInfo ( DWORD dwGaeaID )
{
	PGLCHARCLIENT pCLIENT = GLGaeaClient::GetInstance().GetChar ( dwGaeaID );
	if ( !pCLIENT )					return S_FALSE;

	bool bOPEN = pCLIENT->m_sPMarket.IsOpen();
	if ( !bOPEN )
	{
		return S_FALSE;
	}

	//	Note : Á¤º¸ Àü¼Û ¿äûÀü Á¾Àü Á¤º¸´Â ¸®¼Â.
	pCLIENT->m_sPMarket.DoMarketInfoRelease();

	//	Note : Á¤º¸ Àü¼Û ¿äû.
	GLMSG::SNETPC_PMARKET_ITEM_INFO NetMsg;
	NetMsg.dwGaeaID = dwGaeaID;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketInfoRelease ( DWORD dwGaeaID )
{
	PGLCHARCLIENT pCLIENT = GLGaeaClient::GetInstance().GetChar ( dwGaeaID );
	if ( !pCLIENT )					return S_FALSE;

	pCLIENT->m_sPMarket.DoMarketInfoRelease();

	// ´Ù¸¥»ç¶÷ °³ÀλóÁ¡À» ´ÝÀ¸¸é Àӽà ¼ö½ÅµÈ ÆÖÄ«µå Á¤º¸µµ Á¦°ÅÇØÁØ´Ù.
	m_mapPETCardInfoTemp.clear();
	m_mapVEHICLEItemInfoTemp.clear();

	return S_OK;
}

HRESULT GLCharacter::ReqPMarketBuy ( DWORD dwGaeaID, WORD wPosX, WORD wPosY, DWORD dwNum )
{
	PGLCHARCLIENT pCLIENT = GLGaeaClient::GetInstance().GetChar ( dwGaeaID );
	if ( !pCLIENT )					return S_FALSE;

	SNATIVEID sSALEPOS(wPosX,wPosY);

	const SSALEITEM* pSALEITEM = pCLIENT->m_sPMarket.GetItem ( sSALEPOS );
	if ( !pSALEITEM )				return S_FALSE;

	SITEM *pITEM = GLItemMan::GetInstance().GetItem ( pSALEITEM->sITEMCUSTOM.sNativeID );
	if ( !pITEM )					return S_FALSE;

	if ( pSALEITEM->bSOLD )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_BUY_FB_SOLD") );
		return S_FALSE;
	}

	if ( !pITEM->ISPILE() )
	{
		dwNum = 1;
	}

	if ( pSALEITEM->dwNUMBER < dwNum )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_BUY_FB_NUM") );
		return S_FALSE;
	}

	if ( m_lnMoney < (dwNum*pSALEITEM->llPRICE) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_BUY_FB_LOWMONEY") );
		return S_FALSE;
	}

	WORD wINVENX = pITEM->sBasicOp.wInvenSizeX;
	WORD wINVENY = pITEM->sBasicOp.wInvenSizeY;

	BOOL bITEM_SPACE(FALSE);
	if ( pITEM->ISPILE() )
	{
		WORD wPILENUM = pITEM->sDrugOp.wPileNum;
		SNATIVEID sNID = pITEM->sBasicOp.sNativeID;
		WORD wREQINSRTNUM = (WORD) dwNum;

		bITEM_SPACE = m_cInventory.ValidPileInsrt ( wREQINSRTNUM, sNID, wPILENUM, wINVENX, wINVENY );
	}
	else
	{
		WORD wPosX(0), wPosY(0);
		bITEM_SPACE = m_cInventory.FindInsrtable ( wINVENX, wINVENY, wPosX, wPosY );
	}

	if ( !bITEM_SPACE )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPMARKET_BUY_FB_NOINVEN") );
		return E_FAIL;
	}

	GLMSG::SNETPC_PMARKET_BUY NetMsg;
	NetMsg.dwGaeaID = dwGaeaID;
	NetMsg.dwNum = dwNum;
	NetMsg.sSALEPOS = sSALEPOS;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqClubNew ( DWORD dwNpcID, const char* szClubName )
{
	if  ( szClubName==NULL )	return S_FALSE;

	if ( m_dwGuild!=CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_ALREADY") );
		return S_FALSE;
	}

	if ( !GLPartyClient::GetInstance().GetMaster() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( GLPartyClient::GetInstance().GetMemberNum() < GLCONST_CHAR::dwCLUB_PARTYNUM )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_NOTMEMBER"), GLCONST_CHAR::dwCLUB_PARTYNUM );
		return S_FALSE;
	}

	if ( !szClubName || (strlen(szClubName) == 0) )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_FAIL") );
		return S_FALSE;
	}

	if ( m_wLevel < GLCONST_CHAR::sCLUBRANK[0].m_dwMasterLvl )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_MASTER_LVL"), GLCONST_CHAR::sCLUBRANK[0].m_dwMasterLvl );
		return S_FALSE;
	}

	if ( m_nLiving < int ( GLCONST_CHAR::sCLUBRANK[0].m_dwLivingPoint ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_AVER_LIVING"), GLCONST_CHAR::sCLUBRANK[0].m_dwLivingPoint );
		return S_FALSE;
	}

	if ( m_lnMoney < GLCONST_CHAR::sCLUBRANK[0].m_dwPay )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_NOTMONEY"), GLCONST_CHAR::sCLUBRANK[0].m_dwPay );
		return S_FALSE;
	}


	CString strTEMP( szClubName ); 

#ifdef TH_PARAM
	// ű¹¾î ¹®ÀÚ Á¶ÇÕ Ã¼Å©

	if ( !m_pCheckString ) return S_FALSE;

	if ( !m_pCheckString(strTEMP) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_THAICHAR_ERROR"));
		return S_FALSE;
	}
#endif

#ifdef VN_PARAM
	// º£Æ®³² ¹®ÀÚ Á¶ÇÕ Ã¼Å© 
	if( STRUTIL::CheckVietnamString( strTEMP ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_VNCHAR_ERROR"));
		return S_FALSE;
	}

#endif 

	BOOL bFILTER0 = STRUTIL::CheckString( strTEMP );;
	BOOL bFILTER1 = CRanFilter::GetInstance().NameFilter ( szClubName );
	if( bFILTER0 || bFILTER1 || ( strTEMP != szClubName ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NEW_FB_BADNAME"), szClubName );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_NEW NetMsg;
	NetMsg.dwNpcID = dwNpcID;
	StringCchCopy ( NetMsg.szClubName, CHAR_SZNAME, szClubName );
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqClubRank ( DWORD dwNpcID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		return S_FALSE;
	}

	if ( m_sCLUB.m_dwRank >= (GLCONST_CHAR::dwMAX_CLUBRANK-1) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_RANK_FB_MAX") );
		return S_FALSE;
	}

	DWORD dwRANK = m_sCLUB.m_dwRank + 1;

	if ( m_wLevel < GLCONST_CHAR::sCLUBRANK[dwRANK].m_dwMasterLvl )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_RANK_FB_MASTER_LVL"), GLCONST_CHAR::sCLUBRANK[dwRANK].m_dwMasterLvl );
		return S_FALSE;
	}

	if ( m_nLiving < int ( GLCONST_CHAR::sCLUBRANK[dwRANK].m_dwLivingPoint ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_RANK_FB_AVER_LIVING"), GLCONST_CHAR::sCLUBRANK[dwRANK].m_dwLivingPoint );
		return S_FALSE;
	}

	if ( m_lnMoney < GLCONST_CHAR::sCLUBRANK[dwRANK].m_dwPay )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_RANK_FB_NOTMONEY"), GLCONST_CHAR::sCLUBRANK[dwRANK].m_dwPay );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_RANK NetMsg;
	NetMsg.dwNpcID = dwNpcID;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqClubDissolution ()
{
	if ( m_dwGuild==CLUB_NULL )
	{
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		return S_FALSE;
	}

	if ( m_sCLUB.IsAlliance() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_DIS_FB_ALLIANCE") );
		return S_FALSE;
	}

	if ( m_sCLUB.GetAllBattleNum() > 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_DIS_FB_CLUBBATTLE") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_DISSOLUTION NetMsg;
	NETSEND(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqClubDissolutionCancel ()
{
	if ( m_dwGuild==CLUB_NULL )
	{
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_DISSOLUTION NetMsg;
	NetMsg.bCANCEL = true;
	NETSEND(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqClubJoin ( DWORD dwGaeaID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMemberFlgJoin(m_dwCharID) )
	{
		return S_FALSE;
	}

	if ( m_sCLUB.GetAllBattleNum() > 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_MEMBER_REQ_FB_CLUBBATTLE") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_MEMBER_REQ NetMsg;
	NetMsg.dwGaeaID = dwGaeaID;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqClubJoinAns ( DWORD dwMaster, bool bOK )
{
	GLMSG::SNET_CLUB_MEMBER_REQ_ANS NetMsg;
	NetMsg.dwMaster = dwMaster;
	NetMsg.bOK = bOK;
	NETSENDTOFIELD(&NetMsg);
	
	return S_OK;
}

HRESULT GLCharacter::ReqClubMemberDel ( DWORD dwMember )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMemberFlgKick(m_dwCharID) )
	{
		return S_FALSE;
	}

	if ( m_sCLUB.m_dwMasterID==dwMember )
	{
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_MEMBER_DEL NetMsg;
	NetMsg.dwMember = dwMember;
	NETSEND(&NetMsg);
	
	return S_OK;
}

	//	Note : Ŭ·´ ¸¶½ºÅÍ ±ÇÇÑ À§ÀÓ
HRESULT GLCharacter::ReqClubAuthority ( DWORD dwMember )
{
	if ( m_dwGuild==CLUB_NULL )	return S_FALSE;
	if ( !m_sCLUB.IsMaster( m_dwCharID ) )	return S_FALSE;
	if ( m_sCLUB.m_dwMasterID==dwMember )	return S_FALSE;

	//	Ŭ·´¿ø È®ÀÎ
	GLCLUBMEMBER* pMember = m_sCLUB.GetMember( dwMember );
	if ( !pMember )	return S_FALSE;

	//	Á¢¼Ó ¿©ºÎ È®ÀÎ
	if ( !pMember->bONLINE ) 
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_AUTHORITY_REQ_FB_NOONLINE") );
		return S_FALSE;
	}

	//	µ¿¸Í ¿©ºÎ
	if ( m_sCLUB.IsAlliance() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_AUTHORITY_REQ_FB_ALLIANCE") );
		return S_FALSE;
	}

	//	Ŭ·´¹èƲ ¿©ºÎ
	if ( m_sCLUB.GetAllBattleNum() > 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_AUTHORITY_REQ_FB_CLUBBATTLE") );
		return S_FALSE;
	}

    //	´ë·Ã ¿©ºÎ
	if ( m_sCONFTING.emTYPE != EMCONFT_NONE )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_AUTHORITY_REQ_FB_CONFING") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_AUTHORITY_REQ NetMsg;
	NetMsg.dwMember = dwMember;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ ¸¶½ºÅÍ ±ÇÇÑ À§ÀÓ ´äº¯
HRESULT GLCharacter::ReqClubAuthorityAns ( bool bOK )
{
	GLMSG::SNET_CLUB_AUTHORITY_REQ_ANS NetMsgAns;
	NetMsgAns.bOK = bOK;
	NETSEND(&NetMsgAns);

	return S_OK;
}

HRESULT GLCharacter::ReqClubMarkInfo ( DWORD dwClubID, DWORD dwMarkVer )
{
	if ( dwMarkVer==0 )					return S_FALSE;

	//	Note : Ŭ¶óÀ̾ðÆ® ¹öÀü°ú ºñ±³.
	//
	DWORD dwServerID = GLGaeaClient::GetInstance().GetCharacter()->m_dwServerID;
	bool bVALID = DxClubMan::GetInstance().IsValidData ( dwServerID, dwClubID, dwMarkVer );
	if ( bVALID )						return S_FALSE;

	//	Note : Ŭ·´ ¸¶Å© °»½Å ¿äû.
	GLMSG::SNET_CLUB_MARK_INFO NetMsgInfo;
	NetMsgInfo.dwClubID = dwClubID;
	NETSEND(&NetMsgInfo);

	return S_OK;
}

HRESULT GLCharacter::ReqClubMarkChange ( const char* szFileName )
{
	if ( !szFileName )	return E_FAIL;

	// Note : ÆÄÀÏ¿¡¼­ Àоî¿À±â.
	LPDWORD pMarkColor(NULL);
	BOOL bOK = DxClubMan::GetInstance().LoadClubMark ( szFileName, pMarkColor );
	if ( !bOK )
	{
		CInnerInterface::GetInstance().PrintConsoleTextDlg ( ID2GAMEINTEXT("CLUB_LOADMARK_FAIL"), szFileName );
		return E_FAIL;
	}

	//	Note : Ŭ·´ ¸¶Å© °»½Å ¿äû.
	GLMSG::SNET_CLUB_MARK_CHANGE NetMsgChange;
	memcpy ( NetMsgChange.aryMark, pMarkColor, sizeof(DWORD)*EMCLUB_MARK_SX*EMCLUB_MARK_SY);
	NETSEND(&NetMsgChange);

	return S_OK;
}

HRESULT GLCharacter::ReqClubNick ( const char* szNickName )
{
	if ( !szNickName )					return S_FALSE;
	//if ( strlen(szNickName)==0 )		return S_FALSE;


	CString strTEMP = szNickName;

#ifdef TH_PARAM
	// ű¹¾î ¹®ÀÚ Á¶ÇÕ Ã¼Å©

	if ( !m_pCheckString ) return S_FALSE;

	if ( !m_pCheckString(strTEMP) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_MEMBER_NICK_FB_THAICHAR_ERROR"));
		return S_FALSE;
	}
#endif

#ifdef VN_PARAM
	// º£Æ®³² ¹®ÀÚ Á¶ÇÕ Ã¼Å© 
	if( STRUTIL::CheckVietnamString( strTEMP ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_MEMBER_NICK_FB_VNCHAR_ERROR"));
		return S_FALSE;
	}

#endif 
	
	BOOL bFILTER0 = STRUTIL::CheckString( strTEMP );
	BOOL bFILTER1 = CRanFilter::GetInstance().NameFilter ( szNickName );
	if ( bFILTER0 || bFILTER1 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_MEMBER_NICK_FB_BADNAME") );
		return S_FALSE;
	}

	//	Note : Ŭ·´ ¸â¹ö º°¸í.
	GLMSG::SNET_CLUB_MEMBER_NICK NetMsg;
	StringCchCopy ( NetMsg.szNick, CHAR_SZNAME, szNickName );
	NETSEND(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqClubSecede ()
{
	if ( m_dwGuild==CLUB_NULL )
	{
		return S_FALSE;
	}

	//	Note : Ŭ·´ÀåÀº Å»Å𸦠ÇÒ¼ö ¾ø´Ù.
	if ( m_sCLUB.IsMaster(m_dwCharID) )
	{
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_MEMBER_SECEDE NetMsg;
	NETSEND(&NetMsg);
	
	return S_OK;
}

HRESULT GLCharacter::ReqCDCertify (DWORD dwNpcID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCDCERTIFY_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMemberFlgCDCertify(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCDCERTIFY_NOTMASTER") );
		return S_FALSE;
	}

	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
	if ( !pLand )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCDCERTIFY_FAIL") );
		return S_FALSE;
	}

	PGLCROWCLIENT pCROW = pLand->GetCrow(dwNpcID);
	if ( !pCROW )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCDCERTIFY_FAIL") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_CD_CERTIFY NetMsg;
	NetMsg.dwNpcID = dwNpcID;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}
HRESULT GLCharacter::ReqDetectAP ( BOOL bDetect, DWORD dwCharID )
{

	GLMSG::SNET_AP_DT NetMsg;
	NetMsg.bDetect = bDetect;
	NetMsg.dwCharID = dwCharID;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}
HRESULT GLCharacter::ReqDetectWPE ( BOOL bDetect, DWORD dwCharID )
{
  if ( m_dwCharID!=dwCharID ) return S_FALSE;
  if ( !bDetect )  return S_FALSE;
  if  ( bDetect ) m_bDisconnect = TRUE;

  return S_OK;
}
HRESULT GLCharacter::ReqGuidCommission ( DWORD dwNPCID, float fRATE )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMGUIDCOMMISSION_FB_NOTCLUB") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMGUIDCOMMISSION_FB_NOTCLUB") );
		return S_FALSE;
	}

	PLANDMANCLIENT pLand = GLGaeaClient::GetInstance().GetActiveMap();
	if ( !pLand )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMGUIDCOMMISSION_FB_FAIL") );
		return S_FALSE;
	}

	PGLCROWCLIENT pCROW = pLand->GetCrow(dwNPCID);
	if ( !pCROW )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMGUIDCOMMISSION_FB_FAIL") );
		return S_FALSE;
	}

	if ( fRATE < 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMGUIDCOMMISSION_FB_RANGE") );
		return S_FALSE;
	}

	if ( fRATE > GLCONST_CHAR::fMAX_COMMISSION )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMGUIDCOMMISSION_FB_RANGE") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_GUID_COMMISSION NetMsg;
	NetMsg.fCommission = fRATE;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ °øÁö.
HRESULT GLCharacter::ReqClubNotice ( const char* szClubNotice )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NOTICE_FB_FAIL") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMemberFlgNotice(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_NOTICE_FB_NOTMATER") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_NOTICE_REQ NetMsg;
	StringCchCopy ( NetMsg.szNotice, EMCLUB_NOTICE_LEN+1, szClubNotice );
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ ºÎ¸¶ ¼³Á¤.
HRESULT GLCharacter::ReqClubSubMaster ( DWORD dwCharID, DWORD dwClubFlag )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUBSUBMASTER_FB_FAIL") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUBSUBMASTER_FB_NOTMASTER") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_SUBMASTER NetMsg;
	NetMsg.dwCharID = dwCharID;
	NetMsg.dwFlags = dwClubFlag;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ ¿¬ÇÕ ¿äû.
HRESULT GLCharacter::ReqClubAlliance ( DWORD dwGaeaID )
{
	PGLCHARCLIENT pCHAR_REQ = GLGaeaClient::GetInstance().GetChar ( dwGaeaID );
	if ( !pCHAR_REQ )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_REQ_FB_FAIL") );
		return S_FALSE;
	}

	DWORD dwCharID = pCHAR_REQ->GetCharData().dwCharID;

	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_REQ_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_REQ_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !pCHAR_REQ->IsClubMaster() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_REQ_FB_TARNOTMASTER") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsAlliance() && !m_sCLUB.IsChief() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_REQ_FB_NOTCHIEF") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsRegDissolution() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_REQ_FB_DISSOLUTION") );
		return S_FALSE;
	}	

	if ( m_sCLUB.GetAllBattleNum() > 0  )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_REQ_FB_CLUBBATTLE") );
		return S_FALSE;
	}	
	
	GLMSG::SNET_CLUB_ALLIANCE_REQ NetMsg;
	NetMsg.dwCharID = dwCharID;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ µ¿¸Í ¿äû ´äº¯.
HRESULT GLCharacter::ReqClubAllianceAns ( DWORD dwChiefCharID, bool bOK )
{
	GLMSG::SNET_CLUB_ALLIANCE_REQ_ANS NetMsgAns;
	NetMsgAns.dwChiefCharID = dwChiefCharID;
	NetMsgAns.bOK = bOK;
	NETSEND(&NetMsgAns);

	return S_OK;
}

//	Note : Ŭ·´ µ¿¸Í Å»Åð ¿äû.
HRESULT GLCharacter::ReqClubAllianceSec ()
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_SEC_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_SEC_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsAlliance() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_SEC_FB_ALLIANCE") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsChief() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_SEC_FB_FAIL") );
		return S_FALSE;
	}

	if ( m_sCLUB.GetAllBattleNum() > 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_SEC_FB_BATTLE") );
		return S_FALSE;		
	}

	GLMSG::SNET_CLUB_ALLIANCE_SEC_REQ NetMsg;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ µ¿¸Í Á¦¸í ¿äû.
HRESULT GLCharacter::ReqClubAllianceDel ( DWORD dwClubID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DEL_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DEL_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsAlliance() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DEL_FB_NOTCHIEF") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsChief() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DEL_FB_NOTCHIEF") );
		return S_FALSE;
	}

	if ( m_sCLUB.GetAllBattleNum() > 0 ) 
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DEL_FB_BATTLE") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_ALLIANCE_DEL_REQ NetMsg;
	NetMsg.dwDelClubID = dwClubID;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ µ¿¸Í ÇØü ¿äû.
HRESULT GLCharacter::ReqClubAllianceDis ()
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DIS_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DIS_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsAlliance() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DIS_FB_NOTCHIEF") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsChief() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DIS_FB_NOTCHIEF") );
		return S_FALSE;
	}

	if ( m_sCLUB.GetAllBattleNum() > 0 )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_ALLIANCE_DIS_FB_BATTLE") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_ALLIANCE_DIS_REQ NetMsg;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ ¹èƲ ¿äû.
HRESULT GLCharacter::ReqClubBattle ( DWORD dwGaeaID, DWORD dwTime )
{

	if ( !GLCONST_CHAR::bCLUB_BATTLE )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_FAIL") );
		return S_FALSE;
	}

	PGLCHARCLIENT pCHAR_REQ = GLGaeaClient::GetInstance().GetChar ( dwGaeaID );
	if ( !pCHAR_REQ )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_FAIL") );
		return S_FALSE;
	}

	if ( m_sCONFTING.emTYPE != EMCONFT_NONE )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_CONFT") );
		return S_FALSE;		
	}

	DWORD dwCharID = pCHAR_REQ->GetCharData().dwCharID;

	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !pCHAR_REQ->IsClubMaster() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_TARNOTMASTER") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsAllianceGuild( pCHAR_REQ->GETCLUBID() ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_ALLIANCE") );
			
		return S_FALSE;
	}

	if ( m_sCLUB.IsRegDissolution() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_DISSOLUTION") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsBattle( pCHAR_REQ->GETCLUBID() ) || m_sCLUB.IsBattleReady( pCHAR_REQ->GETCLUBID() ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_ALREADY") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsBattleAlliance( pCHAR_REQ->GETALLIANCEID() )  || m_sCLUB.IsBattleReady( pCHAR_REQ->GETALLIANCEID() )  )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_ALREADY2") );
		return S_FALSE;
	}

	if ( dwTime < GLCONST_CHAR::dwCLUB_BATTLE_TIMEMIN )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE
					, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_TIMEMIN")
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMIN / 60
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMIN % 60);
		return S_FALSE;
	}

	if ( dwTime > GLCONST_CHAR::dwCLUB_BATTLE_TIMEMAX )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE
					, ID2GAMEINTEXT("EMCLUB_BATTLE_REQ_FB_TIMEMAX")
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMAX / 60
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMAX % 60);
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_BATTLE_REQ NetMsg;
	NetMsg.dwCharID = dwCharID;
	NetMsg.dwBattleTime = dwTime;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : µ¿¸Í ¹èƲ ¿äû.
HRESULT GLCharacter::ReqAllianceBattle ( DWORD dwGaeaID, DWORD dwTime )
{

	DWORD dwCharID;
	PGLCHARCLIENT pCHAR_REQ;

	if ( !GLCONST_CHAR::bCLUB_BATTLE || !GLCONST_CHAR::bCLUB_BATTLE_ALLIANCE )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_FAIL") );
		return S_FALSE;
	}

	pCHAR_REQ = GLGaeaClient::GetInstance().GetChar ( dwGaeaID );
	if ( !pCHAR_REQ )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_FAIL") );
		return S_FALSE;
	}

	if ( m_sCONFTING.emTYPE != EMCONFT_NONE )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_CONFT") );
		return S_FALSE;		
	}

	dwCharID = pCHAR_REQ->GetCharData().dwCharID;

	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !pCHAR_REQ->IsClubMaster() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_TARNOTMASTER") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsAllianceGuild( pCHAR_REQ->GETCLUBID() ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_ALLIANCE") );
			
		return S_FALSE;
	}

	if ( !pCHAR_REQ->IsAllianceMaster() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_TARNOTMASTER") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsRegDissolution() )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_DISSOLUTION") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsBattle( pCHAR_REQ->GETCLUBID() ) || m_sCLUB.IsBattleReady( pCHAR_REQ->GETCLUBID() ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_ALREADY") );
		return S_FALSE;
	}

	if ( m_sCLUB.IsBattleAlliance( pCHAR_REQ->GETALLIANCEID() ) || m_sCLUB.IsBattleReady( pCHAR_REQ->GETALLIANCEID() ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_ALREADY2") );
		return S_FALSE;
	}

	if ( dwTime < GLCONST_CHAR::dwCLUB_BATTLE_TIMEMIN )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE
					, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_TIMEMIN")
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMIN / 60
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMIN % 60);
		return S_FALSE;
	}

	if ( dwTime > GLCONST_CHAR::dwCLUB_BATTLE_TIMEMAX )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE
					, ID2GAMEINTEXT("EMALLIANCE_BATTLE_REQ_FB_TIMEMAX")
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMAX / 60
					, GLCONST_CHAR::dwCLUB_BATTLE_TIMEMAX % 60);
		return S_FALSE;
	}

	GLMSG::SNET_ALLIANCE_BATTLE_REQ NetMsg;
	NetMsg.dwCharID = dwCharID;
	NetMsg.dwBattleTime = dwTime;
	NETSEND(&NetMsg);

	return S_OK;
}

//	Note : Ŭ·´ ¹èƲ ¿äû ´äº¯.
HRESULT GLCharacter::ReqClubBattleAns ( DWORD dwChiefCharID, bool bOK )
{

	GLMSG::SNET_CLUB_BATTLE_REQ_ANS NetMsgAns;
	NetMsgAns.dwClubCharID = dwChiefCharID;
	NetMsgAns.bOK = bOK;
	NETSEND(&NetMsgAns);

	return S_OK;
}

//	Note : Ŭ·´ ¹èƲ ¿äû ´äº¯.
HRESULT GLCharacter::ReqAllianceBattleAns ( DWORD dwChiefCharID, bool bOK )
{

	GLMSG::SNET_ALLIANCE_BATTLE_REQ_ANS NetMsgAns;
	NetMsgAns.dwClubCharID = dwChiefCharID;
	NetMsgAns.bOK = bOK;
	NETSEND(&NetMsgAns);

	return S_OK;
}

//	Note : Ŭ·´ ¹èƲ ÈÞÀü ¿äû.
HRESULT GLCharacter::ReqClubBattleArmistice( DWORD dwCLUBID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_ARMISTICE_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_ARMISTICE_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattle( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_ARMISTICE_FB_NOBATTLE") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattleStop( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_ARMISTICE_FB_DISTIME") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_BATTLE_ARMISTICE_REQ NetMsg;
	NetMsg.dwClubID = dwCLUBID;
	NETSEND(&NetMsg);	

	return S_OK;
}

HRESULT GLCharacter::ReqAllianceBattleArmistice( DWORD dwCLUBID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_ARMISTICE_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_ARMISTICE_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsAlliance() || !m_sCLUB.IsChief() ) 
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_ARMISTICE_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattleAlliance( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_ALLIANCE_ARMISTICE_FB_NOBATTLE") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattleStop( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_ARMISTICE_FB_DISTIME") );
		return S_FALSE;
	}

	GLMSG::SNET_ALLIANCE_BATTLE_ARMISTICE_REQ NetMsg;
	NetMsg.dwClubID = dwCLUBID;
	NETSEND(&NetMsg);	

	return S_OK;
}

//	Note : Ŭ·´ ¹èƲ ÈÞÀü ´äº¯.
HRESULT GLCharacter::ReqClubBattleArmisticeAns( DWORD dwCLUBID, bool bOK )
{	
	GLMSG::SNET_CLUB_BATTLE_ARMISTICE_REQ_ANS NetMsgAns;
	NetMsgAns.dwClubID = dwCLUBID;
	NetMsgAns.bOK = bOK;
	NETSEND(&NetMsgAns);

	return S_OK;
}

//	Note : µ¿¸Í ¹èƲ ÈÞÀü ´äº¯.
HRESULT GLCharacter::ReqAllianceBattleArmisticeAns( DWORD dwCLUBID, bool bOK )
{	
	GLMSG::SNET_ALLIANCE_BATTLE_ARMISTICE_REQ_ANS NetMsgAns;
	NetMsgAns.dwClubID = dwCLUBID;
	NetMsgAns.bOK = bOK;
	NETSEND(&NetMsgAns);

	return S_OK;
}


//	Note : Ŭ·´ ¹èƲ Ç׺¹ ¿äû.
HRESULT GLCharacter::ReqClubBattleSubmission ( DWORD dwCLUBID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_SUBMISSION_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_SUBMISSION_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattle( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_SUBMISSION_FB_NOBATTLE") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattleStop( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMCLUB_BATTLE_SUBMISSION_FB_DISTIME") );
		return S_FALSE;
	}

	GLMSG::SNET_CLUB_BATTLE_SUBMISSION_REQ NetMsg;
	NetMsg.dwClubID = dwCLUBID;
	NETSEND(&NetMsg);	

	return S_OK;
}

//	Note : µ¿¸Í ¹èƲ Ç׺¹ ¿äû.
HRESULT GLCharacter::ReqAllianceBattleSubmission ( DWORD dwCLUBID )
{
	if ( m_dwGuild==CLUB_NULL )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_SUBMISSION_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsMaster(m_dwCharID) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_SUBMISSION_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsAlliance() || !m_sCLUB.IsChief() ) 
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_SUBMISSION_FB_NOTMASTER") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattleAlliance( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_SUBMISSION_FB_NOBATTLE") );
		return S_FALSE;
	}

	if ( !m_sCLUB.IsBattleStop( dwCLUBID ) )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMALLIANCE_BATTLE_SUBMISSION_FB_DISTIME") );
		return S_FALSE;
	}

	GLMSG::SNET_ALLIANCE_BATTLE_SUBMISSION_REQ NetMsg;
	NetMsg.dwClubID = dwCLUBID;
	NETSEND(&NetMsg);	

	return S_OK;
}

bool GLCharacter::IsKEEP_CLUB_STORAGE ( DWORD dwCHANNEL )
{
	if ( m_sCLUB.m_dwID==CLUB_NULL )		return false;
	if ( m_sCLUB.m_dwMasterID!=m_dwCharID )	return false;

	if ( !m_sCLUB.m_bVALID_STORAGE )		return false;

	if ( m_sCLUB.m_dwRank < dwCHANNEL )		return false;

	return true;
}

//	Note : â°í Á¤º¸¸¦ ¼­¹ö¿¡ ¿äû.
HRESULT GLCharacter::ReqGetClubStorage ()
{
	if ( !IsValidBody() )					return S_FALSE;
	if ( m_sCLUB.m_dwID==CLUB_NULL )		return S_FALSE;
	if ( m_sCLUB.m_dwMasterID!=m_dwCharID )	return S_FALSE;

	//	Note : ÀÌ¹Ì Ã¢°í Á¤º¸°¡ À¯È¿ÇÏ´Ù¸é ¹«½Ã.
	if ( !m_sCLUB.m_bVALID_STORAGE )
	{
		//	Note : ¼­¹ö¿¡ ¿äû.
		//		ÀÌ ¸Þ½ÃÁö Àü¼Û ÈÄ ¼­¹öÂÊ¿¡¼­ Ŭ·´ÀÇ ¼öÀÍ °»½ÅÀ» ¿äûÇÑ´Ù.
		GLMSG::SNET_CLUB_GETSTORAGE	NetMsg;
		NETSENDTOFIELD ( &NetMsg );
	}
	else
	{
		//	Note : Ŭ·´ÀÇ ¼öÀÍ °»½Å ¿äû.
		GLMSG::SNET_CLUB_INCOME_RENEW NetMsgReNew;
		NETSENDTOFIELD ( &NetMsgReNew );
	}

	return S_OK;
}

//	Note : â°í ¾ÆÀÌÅÛ µé¶§, ³õÀ»¶§, ±³È¯ÇÒ¶§, ÇÕÄ¥¶§.
HRESULT GLCharacter::ReqClubStorageTo ( DWORD dwChannel, WORD wPosX, WORD wPosY )
{
	GASSERT(MAX_CLUBSTORAGE>dwChannel);
	if ( MAX_CLUBSTORAGE<=dwChannel )	return false;

	if ( !IsValidBody() )						return S_FALSE;
	if ( ValidWindowOpen() )					return S_FALSE;	

	if ( !IsKEEP_CLUB_STORAGE(dwChannel) )			return S_FALSE;

	//	°Å·¡ ¿É¼Ç È®ÀÎ
	if ( VALID_HOLD_ITEM () )
	{
		SITEM *pITEM = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
		if ( !pITEM )		return S_FALSE;
		if ( pITEM )		return S_FALSE;
	
		//	°Å·¡¿É¼Ç
		if ( GET_HOLD_ITEM().bWrap!= true )
		{
		if ( !pITEM->sBasicOp.IsEXCHANGE() )	return S_FALSE;
        if ( GET_HOLD_ITEM().bNonDrop!= false )	return S_FALSE;
		}
	}

	SINVENITEM* pInvenItem = m_sCLUB.m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !VALID_HOLD_ITEM () && !pInvenItem )		return E_FAIL;

	if ( VALID_HOLD_ITEM () && pInvenItem )
	{
#if defined(VN_PARAM) //vietnamtest%%%
		if ( GET_HOLD_ITEM().bVietnamGainItem  )	return E_FAIL;
#endif
		GLMSG::SNET_CLUB_STORAGE_EX_HOLD NetMsg;
		NetMsg.dwChannel = dwChannel;
		NetMsg.wPosX = pInvenItem->wPosX;
		NetMsg.wPosY = pInvenItem->wPosY;
		NETSENDTOFIELD ( &NetMsg );
	}
	else if ( pInvenItem )
	{
		GLMSG::SNET_CLUB_STORAGE_TO_HOLD NetMsg;
		NetMsg.dwChannel = dwChannel;
		NetMsg.wPosX = pInvenItem->wPosX;
		NetMsg.wPosY = pInvenItem->wPosY;
		NETSENDTOFIELD ( &NetMsg );
	}
	else if ( VALID_HOLD_ITEM () )
	{
#if defined(VN_PARAM) //vietnamtest%%%
		if ( GET_HOLD_ITEM().bVietnamGainItem  )	return E_FAIL;
#endif		

		//	Note : ¸Þ½ÃÁö ¼Û½ÅÀü¿¡ À¯È¿ÇÒÁö¸¦ ¹Ì¸® °Ë»çÇÔ.
		//
		SITEM* pItem = GLItemMan::GetInstance().GetItem ( GET_HOLD_ITEM().sNativeID );
		GASSERT(pItem&&"¾ÆÀÌÅÆ ´ëÀÌÅÍ°¡ Á¸Á¦ÇÏÁö ¾ÊÀ½");

		BOOL bOk = m_sCLUB.m_cStorage[dwChannel].IsInsertable ( pItem->sBasicOp.wInvenSizeX, pItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
		if ( !bOk )
		{
			//	ÀιêÀÌ °¡µæÂþÀ½.
			return E_FAIL;
		}

		GLMSG::SNET_CLUB_HOLD_TO_STORAGE NetMsg;
		NetMsg.dwChannel = dwChannel;
		NetMsg.wPosX = wPosX;
		NetMsg.wPosY = wPosY;

		NETSENDTOFIELD ( &NetMsg );
	}

	return E_FAIL;
}

bool GLCharacter::IsClubStorageSplitItem ( DWORD dwChannel, WORD wPosX, WORD wPosY )
{
	GASSERT(MAX_CLUBSTORAGE>dwChannel);
	if ( MAX_CLUBSTORAGE<=dwChannel )	return false;

	if ( !IsValidBody() )				return false;
	if ( ValidWindowOpen() )			return false;		
	
	if ( !IsKEEP_CLUB_STORAGE(dwChannel) )			return false;

	SINVENITEM* pInvenItem = m_sCLUB.m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return false;

	//	Note : ¾ÆÀÌÅÛ Á¤º¸ °¡Á®¿À±â.
	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	GASSERT(pItem&&"¾ÆÀÌÅÆ ´ëÀÌÅÍ°¡ Á¸Á¦ÇÏÁö ¾ÊÀ½");

	bool bSPLIT(false);
	bSPLIT = ( pItem->ISPILE() );
	if ( !bSPLIT )					return false;
	bSPLIT = ( pInvenItem->sItemCustom.wTurnNum>1 );

	return bSPLIT;
}

//	Note : â°í - °ãħ ¾ÆÀÌÅÛ ºÐ¸®.
HRESULT GLCharacter::ReqClubStorageSplit ( DWORD dwChannel, WORD wPosX, WORD wPosY, WORD wSplitNum )
{
	if ( !IsClubStorageSplitItem(dwChannel,wPosX,wPosY) )	return E_FAIL;

	SINVENITEM* pInvenItem = m_sCLUB.m_cStorage[dwChannel].FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return false;
	
	if ( pInvenItem->sItemCustom.wTurnNum <= wSplitNum )
	{
		return E_FAIL;
	}

	//	Note : ¾ÆÀÌÅÛ ºÐ¸® ¸Þ½ÃÁö Àü¼Û.
	GLMSG::SNET_CLUB_STORAGE_SPLIT NetMsg;
	NetMsg.dwChannel = dwChannel;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NetMsg.wSplit = wSplitNum;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

//	Note : â°í µ· ³Ö±â.
HRESULT GLCharacter::ReqClubStorageSaveMoney ( LONGLONG lnMoney )
{
	if( m_sCLUB.m_dwID==CLUB_NULL )				return E_FAIL;
	if( m_sCLUB.m_dwMasterID!=m_dwCharID )		return E_FAIL;
	if( !m_sCLUB.m_bVALID_STORAGE )				return E_FAIL;

//#if !defined(KR_PARAM) && !defined(KRT_PARAM)
//	if( m_lnMoney%UINT_MAX < lnMoney )			return E_FAIL;
//#endif
	if ( m_lnMoney < lnMoney )					return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;	

	GLMSG::SNET_CLUB_STORAGE_SAVE_MONEY NetMsg;
	NetMsg.lnMoney = lnMoney;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

//	Note : â°í µ· »©³»±â.
HRESULT GLCharacter::ReqClubStorageDrawMoney ( LONGLONG lnMoney )
{
	if ( m_sCLUB.m_dwID==CLUB_NULL )			return E_FAIL;
	if ( m_sCLUB.m_dwMasterID!=m_dwCharID )		return E_FAIL;

	if ( !m_sCLUB.m_bVALID_STORAGE )			return E_FAIL;

//#if !defined(KR_PARAM) && !defined(KRT_PARAM)
//	if ( m_sCLUB.m_lnStorageMoney%UINT_MAX < lnMoney )	return E_FAIL;
//#endif
	if ( m_sCLUB.m_lnStorageMoney < lnMoney )	return E_FAIL;
	if ( ValidWindowOpen() )					return E_FAIL;

	GLMSG::SNET_CLUB_STORAGE_DRAW_MONEY NetMsg;
	NetMsg.lnMoney = lnMoney;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqGarbageOpen()
{
	InitGarbageData();
	OpenGarbage();
	
    return S_OK;
}

HRESULT GLCharacter::ReqGarbageMoveItem()
{
	if( m_sPreInventoryItem.VALID() )
	{
		// ¼Õ¿¡ µç ¾ÆÀÌÅÛÀÌ ÀåÂø ¾ÆÀÌÅÛÀ̾î¾ß ¹Ù²Ü ¼ö ÀÖ´Ù
		SITEMCUSTOM sPreItem = GET_PREHOLD_ITEM();
		SITEM* pItem = GLItemMan::GetInstance().GetItem( sPreItem.sNativeID );

		// ÆÖÄ«µåÀÏ°æ¿ì
		if ( pItem->sBasicOp.emItemType == ITEM_PET_CARD )
		{
			GLPetClient* pMyPet = GLGaeaClient::GetInstance().GetPetClient ();
			if ( pMyPet && pMyPet->IsVALID () && sPreItem.dwPetID == pMyPet->m_dwPetID )
			{
				m_sPreInventoryItem.RESET();
				return E_FAIL;
			}
		}

        // disabled garbage basicop on item to make all item default deletable by garbage item
		//if( pItem && pItem->sBasicOp.IsGarbage() )
		//{
			m_sGarbageItem.SET( m_sPreInventoryItem.wPosX, m_sPreInventoryItem.wPosY );
		//}
		
		m_sPreInventoryItem.RESET();
	}
	
	return S_OK;
}

HRESULT GLCharacter::ReqGarbageResult()
{
	
	if( !m_sGarbageItem.VALID() )
		return S_FALSE;

	GLMSG::SNET_GARBAGE_RESULT NetMsg;

	NetMsg.wPosX = m_sGarbageItem.wPosX;
	NetMsg.wPosY = m_sGarbageItem.wPosY;
	
	NETSENDTOFIELD( &NetMsg );
	
	return S_OK;
}

HRESULT GLCharacter::ReqGarbageClose()
{
	InitGarbageData();
	CloseGarbage();

	return S_OK;
}

const SITEMCUSTOM& GLCharacter::GET_GARBAGE_ITEM()	// ITEMREBUILD_MARK
{
	static SITEMCUSTOM sItemCustom;
	sItemCustom.sNativeID = NATIVEID_NULL();

	if( !m_sGarbageItem.VALID() )
		return sItemCustom;

	SINVENITEM* pResistItem = m_cInventory.GetItem( m_sGarbageItem.wPosX, m_sGarbageItem.wPosY );
	if( !pResistItem )
		return sItemCustom;

	sItemCustom = pResistItem->sItemCustom;

	return sItemCustom;
}

VOID GLCharacter::InitGarbageData()
{
	m_sGarbageItem.RESET();
	m_sPreInventoryItem.RESET();
}

void GLCharacter::ReqRetrieveMobInMap() //Request Crow List NaJDeV
{
	CInnerInterface::GetInstance().GetLargeMapWindow()->ClearMobList();

	GLMSG::SNETPC_REQ_CROWLIST_FLD NetMsg;
	NetMsg.dwGaeaID = m_dwGaeaID;
	NETSEND ( &NetMsg );
}

void GLCharacter::ReqDisableSkill( DWORD dwSKILL, SNATIVEID sKILLID ) //disable skill effect NaJDeV
{
	if ( dwSKILL > SKILLFACT_SIZE ) return;

	PGLSKILL pSkill = GLSkillMan::GetInstance().GetData ( sKILLID.wMainID, sKILLID.wSubID );
	if ( !pSkill ) return;
	if ( pSkill->m_sBASIC.emIMPACT_SIDE == SIDE_ENERMY ) return;

	GLMSG::SNETPC_REQ_DISABLESKILLEFF NetMsg;
	NetMsg.dwSKILL = dwSKILL;
	NETSENDTOFIELD ( &NetMsg );
}
HRESULT GLCharacter::ReqRebuildOpen() //sealed card 
{
	InitRebuildData();
	OpenRebuild();

	GLMSG::SNET_REBUILD_RESULT NetMsg;

	NetMsg.emResult = EMREBUILD_RESULT_OPEN;

	NETSENDTOFIELD( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRebuildMoveItem() //sealed card 
{
	GLMSG::SNET_REBUILD_MOVE_ITEM NetMsg;

	if( m_sPreInventoryItem.VALID() )
	{
		SITEMCUSTOM sPreItem = GET_PREHOLD_ITEM();
		SITEM* pItem = GLItemMan::GetInstance().GetItem( sPreItem.sNativeID );
		if( pItem && pItem->sBasicOp.emItemType == ITEM_SUIT )
		{
			if( strlen( pItem->sRandomOpt.szNAME ) > 3 )
			{
				NetMsg.wPosX = m_sPreInventoryItem.wPosX;
				NetMsg.wPosY = m_sPreInventoryItem.wPosY;
			}
		}
		m_sPreInventoryItem.RESET();
	}

	NETSENDTOFIELD( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRebuildResult( SITEMSEALDATA pData1, SITEMSEALDATA pData2 ) //sealed card 
{
	if( !m_sRebuildItem.VALID() )
		return S_FALSE;

	if( m_i64RebuildInput != m_i64RebuildCost || m_lnMoney < m_i64RebuildCost )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT( "EMREBUILD_RESULT_MONEY" ) );
		return E_FAIL;
	}

	GLMSG::SNET_REBUILD_RESULT NetMsg;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.emResult = EMREBUILD_RESULT_SUCCESS;
	NetMsg.Data1 = pData1;
	NetMsg.Data2 = pData2;
	NETSENDTOFIELD( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRebuildInputMoney( LONGLONG i64InputMoney ) //sealed card 
{
	GLMSG::SNET_REBUILD_INPUT_MONEY NetMsg;

	NetMsg.i64InputMoney = (LONGLONG)max( 0, i64InputMoney );
	NetMsg.i64InputMoney = (LONGLONG)min( NetMsg.i64InputMoney, m_lnMoney );

	NETSENDTOFIELD( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRebuildClose() //sealed card 
{
	InitRebuildData();

	CloseRebuild();

	GLMSG::SNET_REBUILD_RESULT NetMsg;

	NetMsg.emResult = EMREBUILD_RESULT_CLOSE;

	NETSENDTOFIELD( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRebuildMoveSeal() //sealed card 
{
	GLMSG::SNET_REBUILD_MOVE_SEAL NetMsg;

	if( m_sPreInventoryItem.VALID() )
	{
		SITEMCUSTOM sCustom = GET_REBUILD_ITEM();
		if ( !sCustom.sNativeID.IsValidNativeID() )
		{
			CInnerInterface::GetInstance().PrintConsoleText( "Insert item first and then try again." );
			m_sPreInventoryItem.RESET();
			return E_FAIL;
		}

		SITEMCUSTOM sPreItem = GET_PREHOLD_ITEM();
		SITEM* pItem = GLItemMan::GetInstance().GetItem( sPreItem.sNativeID );
		if( pItem && pItem->sBasicOp.emItemType == ITEM_SEALED_CARD )
		{
			NetMsg.wPosX = m_sPreInventoryItem.wPosX;
			NetMsg.wPosY = m_sPreInventoryItem.wPosY;
		}
		
		m_sPreInventoryItem.RESET();
	}
			
	NETSENDTOFIELD( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqUsePetCard ( WORD wPosX, WORD wPosY )
{
	if ( !IsValidBody() )						return E_FAIL;

	// ´ë·ÃÁßÀ̸é ÆÖÀ» ¼ÒȯÇÒ ¼ö ¾ø´Ù.
	if ( m_sCONFTING.IsCONFRONTING() )			return E_FAIL;

	PLANDMANCLIENT pLandManClient = GLGaeaClient::GetInstance().GetActiveMap ();
	if ( !pLandManClient )						return E_FAIL;

	GLMapList::FIELDMAP MapsList = GLGaeaClient::GetInstance().GetMapList ();
	GLMapList::FIELDMAP_ITER iter = MapsList.find ( pLandManClient->GetMapID ().dwID );
	if ( iter==MapsList.end() )					return E_FAIL;

	const SMAPNODE *pMapNode = &(*iter).second;

	// ¸ÊÁøÀÔ°¡´É¿©ºÎ üũ
	if ( !pMapNode->bPetActivity )
	{
		CInnerInterface::GetInstance().PrintMsgText ( 
						NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("EMPET_USECARD_FB_INVALIDZONE") );
		return E_FAIL;
	}

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		// ¾ÆÀÌÅÛ ¾ø´Ù
		return E_FAIL;
	}

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		// ¾ÆÀÌÅÛ ¾ø´Ù
		return E_FAIL;
	}

	if ( pItem->sBasicOp.emItemType != ITEM_PET_CARD )
	{
		// ÆÖÄ«µå ¾Æ´Ï´Ù
		return E_FAIL;
	}
	
	m_llPetCardGenNum	  = pInvenItem->sItemCustom.lnGenNum;
	m_sPetCardNativeID    = pInvenItem->sItemCustom.sNativeID;
	m_cPetCardGenType     = pInvenItem->sItemCustom.cGenType;

	GLMSG::SNETPET_REQ_USEPETCARD NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqReGenPet ()
{
	if ( !IsValidBody() )						return E_FAIL;

	PLANDMANCLIENT pLandManClient = GLGaeaClient::GetInstance().GetActiveMap ();
	if ( !pLandManClient )						return E_FAIL;

	GLMapList::FIELDMAP MapsList = GLGaeaClient::GetInstance().GetMapList ();
	GLMapList::FIELDMAP_ITER iter = MapsList.find ( pLandManClient->GetMapID ().dwID );
	if ( iter==MapsList.end() )					return E_FAIL;

	const SMAPNODE *pMapNode = &(*iter).second;

	if ( !pMapNode->bPetActivity )				return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindItemByGenNumber ( m_llPetCardGenNum, m_sPetCardNativeID, m_cPetCardGenType );
	if ( !pInvenItem ) return E_FAIL;
	
	GLMSG::SNETPET_REQ_USEPETCARD NetMsg;
	NetMsg.wPosX = pInvenItem->wPosX;
	NetMsg.wPosY = pInvenItem->wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

// *****************************************************
// Desc: DB¿¡¼­ »èÁ¦µÈ ÆÖÀÇ Á¤º¸ ¿äû
// *****************************************************
HRESULT	GLCharacter::ReqPetReviveInfo ()
{
	GLMSG::SNETPET_REQ_PETREVIVEINFO NetMsg;
	NetMsg.dwCharID = m_dwCharID;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

// *****************************************************
// Desc: DB¿¡¼­ »èÁ¦µÈ ÆÖ º¹¿ø¿äû
// *****************************************************
HRESULT GLCharacter::ReqPetRevive ( DWORD dwPetID )
{
	GLMSG::SNETPET_REQ_REVIVE NetMsg;
	NetMsg.dwPetID = dwPetID;
	NetMsg.wPosX   = m_wInvenPosX1;
	NetMsg.wPosY   = m_wInvenPosY1;
	NETSENDTOFIELD ( &NetMsg );	

	return S_OK;
}

// *****************************************************
// Desc: ÆÖÄ«µåÀÇ Á¤º¸ ¿äû
// *****************************************************
HRESULT	GLCharacter::ReqPetCardInfo ()
{
	GLInventory::CELL_MAP* pMapItem = m_cInventory.GetItemList();
	GLInventory::CELL_MAP_CITER iter = pMapItem->begin();
	GLInventory::CELL_MAP_CITER iter_end = pMapItem->end();
	for ( ; iter!=iter_end; ++iter )
	{
		SINVENITEM* pInvenItem = (*iter).second;
		SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
		if ( pItem && pItem->sBasicOp.emItemType == ITEM_PET_CARD && pInvenItem->sItemCustom.dwPetID != 0 )
		{
			GLMSG::SNETPET_REQ_PETCARDINFO NetMsg;
			NetMsg.dwPetID = pInvenItem->sItemCustom.dwPetID;
			NETSENDTOFIELD ( &NetMsg );
		}
	}

	for ( WORD i = 0; i < EMSTORAGE_CHANNEL; ++i )
	{
		if ( m_bStorage[i] )
		{
			GLInventory::CELL_MAP* pMapItem = m_cStorage[i].GetItemList();
			GLInventory::CELL_MAP_CITER iter = pMapItem->begin();
			GLInventory::CELL_MAP_CITER iter_end = pMapItem->end();
			for ( ; iter!=iter_end; ++iter )
			{
				SINVENITEM* pInvenItem = (*iter).second;
				SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
				if ( pItem && pItem->sBasicOp.emItemType == ITEM_PET_CARD && pInvenItem->sItemCustom.dwPetID != 0  )
				{
					GLMSG::SNETPET_REQ_PETCARDINFO NetMsg;
					NetMsg.dwPetID = pInvenItem->sItemCustom.dwPetID;
					NETSENDTOFIELD ( &NetMsg );
				}
			}
		}
	}
	
	return S_OK;
}

HRESULT GLCharacter::ReqSetPhoneNumber ( const TCHAR * szPhoneNumber )
{
	if( !szPhoneNumber )	return S_FALSE;

	GLMSG::SNETPC_PHONE_NUMBER NetMsg;

	StringCchCopy ( NetMsg.szPhoneNumber, SMS_RECEIVER, szPhoneNumber );

	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqSendSMS( int nCharID, const TCHAR * szPhoneNumber, const TCHAR * szSmsMsg )
{
	if( !szPhoneNumber )	return S_FALSE;
	if( !szSmsMsg )			return S_FALSE;

	SINVENITEM *pINVENITEM = m_cInventory.FindItem ( ITEM_SMS );
	if ( !pINVENITEM )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMSMS_FB_NO_ITEM") );
		return S_FALSE;
	}

	GLMSG::SNETPC_SEND_SMS NetMsg;

	NetMsg.dwReceiveChaNum = nCharID;
	StringCchCopy ( NetMsg.szPhoneNumber, SMS_RECEIVER, szPhoneNumber );
	StringCchCopy ( NetMsg.szSmsMsg, SMS_LENGTH, szSmsMsg );
	NetMsg.wItemPosX = pINVENITEM->wPosX;
	NetMsg.wItemPosY = pINVENITEM->wPosY;

	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqMGameOddEvenBatting( UINT uiBattingMoney )
{
	// ÃÖ´ë ¹èÆà °¡´É ±Ý¾×À» üũÇÑ´Ù. ¼­¹öÂÊ¿¡¼­µµ üũ
	if( uiBattingMoney > MINIGAME_ODDEVEN::uiMaxBattingMoney )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, 
														ID2GAMEINTEXT( "EMMGAME_ODDEVEN_FB_MAXBATTING" ), 
														MINIGAME_ODDEVEN::uiMaxBattingMoney );
		return S_FALSE;
	}

	// º¸À¯±Ý¾×À» üũÇÑ´Ù. ¼­¹öÂÊ¿¡¼­µµ üũ
	if( uiBattingMoney > m_lnMoney )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT( "EMMGAME_ODDEVEN_FB_MONEY_FAIL" ) );
		return S_FALSE;
	}

	// ¹è´ç ±Ý¾×À» ¼ÂÆÃÇؼ­ ¼­¹ö·Î Àü¼ÛÇÑ´Ù.
	GLMSG::SNETPC_MGAME_ODDEVEN NetMsg;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.emEvent = EMMGAME_ODDEVEN_OK;
	NetMsg.uiBattingMoney = uiBattingMoney;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqMGameOddEvenAgain()
{
	// °ÔÀ̸Ӱ¡ °ÔÀÓ ¹Ýº¹À» ¿äû

	GLMSG::SNETPC_MGAME_ODDEVEN NetMsg;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.emEvent = EMMGAME_ODDEVEN_AGAIN_OK;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqMGameOddEvenCancel()
{
	// ¼­¹ö·Î °ÔÀÓ Ãë¼Ò¸¦ ¾Ë¸°´Ù.
	GLMSG::SNETPC_MGAME_ODDEVEN NetMsg;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.emEvent = EMMGAME_ODDEVEN_CANCEL;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqMGameOddEvenSelect( BOOL bOdd )
{
	// °ÔÀ̸Ӱ¡ Ȧ¼ö, ¦¼ö¸¦ ¼±ÅÃ
	// bOdd°¡ TRUE¸é Ȧ¼ö, FALSE¸é ¦¼ö
	GLMSG::SNETPC_MGAME_ODDEVEN NetMsg;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.emEvent = EMMGAME_ODDEVEN_SELECT;

	if( bOdd )	NetMsg.emCase = EMMGAME_ODDEVEN_ODD;
	else		NetMsg.emCase = EMMGAME_ODDEVEN_EVEN;

	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqMGameOddEvenShuffle()
{
	GLMSG::SNETPC_MGAME_ODDEVEN NetMsg;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.emEvent = EMMGAME_ODDEVEN_SHUFFLE;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqMGameOddEvenFinish()
{
	GLMSG::SNETPC_MGAME_ODDEVEN NetMsg;
	NetMsg.dwNPCID = m_dwNPCID;
	NetMsg.emEvent = EMMGAME_ODDEVEN_FINISH;
	NETSENDTOFIELD(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqFriendWindowOpen( bool bOpen )
{
	GLMSG::SNETPC_REQ_FRIEND_CLUB_OPEN NetMsg;
	NetMsg.emTYPE = EMFRIEND_WINDOW;
	NetMsg.bOpen = bOpen;

	NETSEND( &NetMsg );
	
	return S_OK;
}

HRESULT GLCharacter::ReqClubInfoUpdate( bool bUpdate )
{
	if ( !bUpdate ) 
	{
		if ( CInnerInterface::GetInstance().IsVisibleGroup( CLUB_WINDOW ) || 
			 CInnerInterface::GetInstance().IsVisibleGroup( LARGEMAP_WINDOW ) ) 
			return S_OK;
	}

	GLMSG::SNETPC_REQ_FRIEND_CLUB_OPEN NetMsg;
	NetMsg.emTYPE = EMCLUB_WINDOW;
	NetMsg.bOpen = bUpdate;

	NETSEND( &NetMsg );

	return S_OK;
}


HRESULT GLCharacter::SetVehicle ( bool bActive )
{
	// ij¸¯ÅÍÀÇ ÇöÀç »óŸ¦ Å»°Í¿¡ °ü·ÃÇؼ­ ÃʱâÈ­ ÇÑ´Ù.
 	if ( bActive )
	{
		if ( m_bVehicle ) return E_FAIL;
		m_bVehicle = TRUE;
		m_bReqVehicle = FALSE;
		
		int emType = m_sVehicle.m_emTYPE ;

		if ( emType == VEHICLE_TYPE_BOARD ) //modify vehicle anim
		{
			m_emANISUBTYPE = (EMANI_SUBTYPE) (AN_SUB_HOVERBOARD ) ;  
		}

		if ( !IsSTATE(EM_ACT_PEACEMODE) ) ReqTogglePeaceMode();

		// ž½Â ÀÌÆÑÆ® Ãß°¡
		STARGETID sTargetID(CROW_PC, m_dwGaeaID, m_vPos);
		DxEffGroupPlayer::GetInstance().NewEffGroup
		(
			GLCONST_CHAR::strVEHICLE_GEN_EFFECT.c_str(),
			m_matTrans,
			&sTargetID
		);

		SITEMCUSTOM& sItemCustom = m_PutOnItems[SLOT_VEHICLE];

		SITEM* pItem = GLItemMan::GetInstance().GetItem( sItemCustom.sNativeID );
		if ( !pItem ) return E_FAIL;

		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::IDCOLOR, ID2GAMEINTEXT("VEHICLE_SET_FB_OK"), pItem->GetName() );

		DxViewPort::GetInstance().SetVehicleCamera();

		CInnerInterface::GetInstance().SetVehicleDisplay();//add vehicleimage

	}
	else
	{
		if ( !m_bVehicle )	return E_FAIL;

		m_bVehicle = FALSE;		
		m_bReqVehicle = FALSE;

		EMSLOT emRHand = GetCurRHand();
		EMSLOT emLHand = GetCurLHand();
		m_emANISUBTYPE = CHECK_ANISUB ( m_pITEMS[emRHand], m_pITEMS[emLHand]  );

		SITEMCUSTOM& sItemCustom = m_PutOnItems[SLOT_VEHICLE];
		SITEM* pItem = GLItemMan::GetInstance().GetItem( sItemCustom.sNativeID );
		if ( pItem ) CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::IDCOLOR, ID2GAMEINTEXT("VEHICLE_RESET_FB_OK"),pItem->GetName() );
		
		DxViewPort::GetInstance().SetGameCamera();

		CInnerInterface::GetInstance().ResetVehicleDisplay();//add vehicleimage
	}


	/*Disable remove buff and Qitem when use vehicle
	// ¹öÇÁ ½ºÅ³ Á¦°Å
	for ( int i = 0; i < SKILLFACT_SIZE; ++i )
	{
		if ( m_sSKILLFACT[i].sNATIVEID == NATIVEID_NULL() ) continue;
		
		PGLSKILL pSkill = GLSkillMan::GetInstance().GetData( m_sSKILLFACT[i].sNATIVEID );

		if ( pSkill && pSkill->m_sBASIC.emIMPACT_SIDE != SIDE_ENERMY )
		{
			FACTEFF::DeleteSkillFactEffect ( STARGETID(CROW_PC,m_dwGaeaID,m_vPos), m_pSkinChar, m_sSKILLFACT[i].sNATIVEID );
			DISABLESKEFF( i );
		}	
	}	

	// Äù¼Ç ¾ÆÀÌÅÛ Á¦°Å
	m_sQITEMFACT.RESET ();
	CInnerInterface::GetInstance().RESET_KEEP_QUESTION_ITEM ();
	*/

	GLCHARLOGIC::INIT_DATA ( FALSE, FALSE );
	UpdateSuit( TRUE );
	ReSelectAnimation();

	return S_OK;

}

HRESULT GLCharacter::ReqSetVehicle(  bool bActive )
{
	// Å»°ÍÀÌ È°¼ºÈ­
	if ( bActive )
	{
		// ´ë·ÃÁßÀ̸é Å»°ÍÀ» È°¼ºÈ­ ½Ãų¼ö ¾ø´Ù.
		if ( m_sCONFTING.IsCONFRONTING() )			return E_FAIL;

		if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL)  || 
			 IsACTION(GLAT_FALLING) || IsACTION(GLAT_TALK) || 
			 IsACTION(GLAT_GATHERING) )	return E_FAIL;

		if ( !m_sVehicle.IsActiveValue() )			return E_FAIL;

		// ¸Ê üũ 
		PLANDMANCLIENT pLandManClient = GLGaeaClient::GetInstance().GetActiveMap ();
		if ( !pLandManClient )						return E_FAIL;

		GLMapList::FIELDMAP MapsList = GLGaeaClient::GetInstance().GetMapList ();
		GLMapList::FIELDMAP_ITER iter = MapsList.find ( pLandManClient->GetMapID ().dwID );
		if ( iter==MapsList.end() )					return E_FAIL;

		const SMAPNODE *pMapNode = &(*iter).second;

		// ¸ÊÁøÀÔ°¡´É¿©ºÎ üũ
		if ( !pMapNode->bVehicleActivity )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("VEHICLE_SET_FB_MAP_FAIL") );
			return S_OK;
		}


		// ¹ÙÀÌŬ ¼ÒÀ¯ ¿©ºÎ üũ 		
		SITEMCUSTOM& sItemCostom = m_PutOnItems[SLOT_VEHICLE];
		if ( sItemCostom.sNativeID == NATIVEID_NULL() )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("VEHICLE_SET_FB_NO_ITEM") );
			return E_FAIL;
		}

		SITEM* pItem = GLItemMan::GetInstance().GetItem( sItemCostom.sNativeID );
		if ( !pItem || pItem->sBasicOp.emItemType != ITEM_VEHICLE )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("VEHICLE_SET_FB_NO_ITEM") );
			return E_FAIL;		
		}

		if ( m_sVehicle.IsNotEnoughFull() )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("VEHICLE_SET_FB_NOTENOUGH_OIL") );
			return E_FAIL;	
		}

		m_sVehicleNativeID  = sItemCostom.sNativeID; //add vehicleimage

		m_bReqVehicle = TRUE;
		
		
		// ¼­¹ö¿¡ ¿äû
		GLMSG::SNETPC_ACTIVE_VEHICLE NetMsg;
		NetMsg.bActive = true;

		NETSENDTOFIELD( &NetMsg );

		return S_OK;
		
	}
	// Å»°ÍÀÌ ºñÈ°¼ºÈ­
	else 
	{
		if ( !m_sVehicle.IsActiveValue() )			return E_FAIL;

		if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) || IsACTION(GLAT_FALLING) )	return E_FAIL;

		// ¹ÙÀÌŬ ¼ÒÀ¯ ¿©ºÎ üũ 
		SITEMCUSTOM& sItemCostom = m_PutOnItems[SLOT_VEHICLE];
		if ( sItemCostom.sNativeID == NATIVEID_NULL() )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("VEHICLE_SET_FB_NO_ITEM") );
			return E_FAIL;
		}

		SITEM* pItem = GLItemMan::GetInstance().GetItem( sItemCostom.sNativeID );
		if ( !pItem || pItem->sBasicOp.emItemType != ITEM_VEHICLE )
		{
			CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::NEGATIVE, ID2GAMEINTEXT("VEHICLE_SET_FB_NO_ITEM") );
			return E_FAIL;		
		}

		// ¼­¹ö¿¡ ¿äû
		GLMSG::SNETPC_ACTIVE_VEHICLE NetMsg;
		NetMsg.bActive = false;

		m_bReqVehicle = TRUE;

		NETSENDTOFIELD( &NetMsg );

		return S_OK;		
		
	}

	return S_OK;
}

HRESULT GLCharacter::ReqVehicleUpdate()
{
	if ( m_sVehicle.IsActiveValue() ) return E_FAIL;

	// ¹ÙÀÌŬ ¼ÒÀ¯ ¿©ºÎ üũ 
	SITEMCUSTOM& sItemCostom = m_PutOnItems[SLOT_VEHICLE];
	if ( sItemCostom.sNativeID == NATIVEID_NULL() )
	{
		return E_FAIL;
	}

	GLMSG::SNETPC_GET_VEHICLE NetMsg;
	NetMsg.nItemID = sItemCostom.sNativeID;

	NETSENDTOFIELD( &NetMsg );

	return S_OK;
}

void GLCharacter::ReqVehicleChangeAccessory( EMSUIT emSUIT )
{
	if ( GLTradeClient::GetInstance().Valid() )		return;

	//	Note : °ø°ÝÁßÀ̳ª ½ºÅ³ ½ÃÀü Áß¿¡ ½½·Ô º¯°æÀ» ¼öÇà ÇÒ ¼ö ¾ø´Ù°í º½.
	//
	if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) ) return;

	SITEMCUSTOM sHoldItemCustom = GET_HOLD_ITEM ();
	SITEMCUSTOM	sSlotItemCustom = m_sVehicle.GetSlotitembySuittype ( emSUIT );

	//	SLOT <-> HOLD
	if ( sHoldItemCustom.sNativeID != NATIVEID_NULL() && sSlotItemCustom.sNativeID != NATIVEID_NULL() )
	{
		SITEM* pHoldItem = GLItemMan::GetInstance().GetItem ( sHoldItemCustom.sNativeID );
		if ( !pHoldItem ) 
		{
			// ÀÏ¹Ý ¿À·ù
			return;
		}

		if ( !m_sVehicle.CheckSlotItem( pHoldItem->sBasicOp.sNativeID, emSUIT ) ) return;
		
		SITEM* pSlotItem = GLItemMan::GetInstance().GetItem ( sSlotItemCustom.sNativeID );
		if ( !pSlotItem ) 
		{
			// ÀÏ¹Ý ¿À·ù
			return;
		}

		if ( !GLGaeaClient::GetInstance().GetCharacter()->ACCEPT_ITEM ( sHoldItemCustom.sNativeID ) )
		{
			return;
		}

		// ŸÀÔÀÌ ´Ù¸£¸é
		if ( pHoldItem->sSuitOp.emSuit != pSlotItem->sSuitOp.emSuit ) return;

		GLMSG::SNET_VEHICLE_REQ_SLOT_EX_HOLD NetMsg;
		NetMsg.emSuit = emSUIT;
		NETSENDTOFIELD ( &NetMsg );
	}
	// HOLD -> SLOT
	else if ( sHoldItemCustom.sNativeID != NATIVEID_NULL() )
	{
		SITEM* pHoldItem = GLItemMan::GetInstance().GetItem ( sHoldItemCustom.sNativeID );
		if ( !pHoldItem ) 
		{
			// ÀÏ¹Ý ¿À·ù
			return;
		}

		if ( !m_sVehicle.CheckSlotItem( pHoldItem->sBasicOp.sNativeID, emSUIT ) ) return;

		if ( !GLGaeaClient::GetInstance().GetCharacter()->ACCEPT_ITEM ( sHoldItemCustom.sNativeID ) )
		{
			return;
		}

		// ŸÀÔÀÌ ´Ù¸£¸é
		if ( pHoldItem->sSuitOp.emSuit != emSUIT ) return;

		GLMSG::SNET_VEHICLE_REQ_HOLD_TO_SLOT NetMsg;
		NetMsg.emSuit = emSUIT;
		NETSENDTOFIELD ( &NetMsg );
	}
	// SLOT -> HOLD
	else if ( sSlotItemCustom.sNativeID != NATIVEID_NULL() )
	{
		GLMSG::SNET_VEHICLE_REQ_SLOT_TO_HOLD NetMsg;
		NetMsg.emSuit = emSUIT;
		NETSENDTOFIELD ( &NetMsg );
	}

	return;

}



void GLCharacter::ReqVehicleRemoveSlotItem( EMSUIT emSUIT )
{
	WORD wPosX(0), wPosY(0);
	SITEMCUSTOM	sSlotItemCustom = m_sVehicle.GetSlotitembySuittype ( emSUIT );

	SITEM* pSlotItem = GLItemMan::GetInstance().GetItem ( sSlotItemCustom.sNativeID );
	if ( !pSlotItem ) 
	{
		// ÀÏ¹Ý ¿À·ù
		return;
	}

	BOOL bOk = m_cInventory.FindInsrtable ( pSlotItem->sBasicOp.wInvenSizeX, pSlotItem->sBasicOp.wInvenSizeY, wPosX, wPosY );
	if ( !bOk )
	{
		//	ÀιêÀÌ °¡µæÂþÀ½.
		return;
	}

	GLMSG::SNET_VEHICLE_REQ_REMOVE_SLOTITEM NetMsg;
	NetMsg.emSuit = emSUIT;

	NETSENDTOFIELD ( &NetMsg );
}

void GLCharacter::ReqVehicleGiveBattery( WORD wPosX, WORD wPosY )
{
	// ºñÈ°¼º »óÅ¿¡¼­µµ »ç·á¸¦ ÁÙ ¼ö ÀÖ´Ù.
	//if ( !IsVALID() )							return;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem ) return;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem ) return;

	// ¹ÙÀÌŬ ¾ÆÀÌÅÛ ¿©ºÎ üũ
	if ( pItem->sBasicOp.emItemType != ITEM_VEHICLE )	return;

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold ) return;

	// ¿¬·á ¿©ºÎ üũ
	if ( pHold->sBasicOp.emItemType != ITEM_VEHICLE_OIL )	return;

	// ¹ÙÀÌŬ Á¤º¸°¡ ¾ø´Ù¸é Ãë¼Ò
	if ( pInvenItem->sItemCustom.dwVehicleID == 0 ) return;



	SVEHICLEITEMINFO sVehicle;


	if ( !DxGlobalStage::GetInstance().IsEmulator() )
	{
		// ¹ÙÀÌŬ ¾ÆÀÌÅÛ Á¤º¸°¡ ¾øÀ¸¸é ¾ø´Â ¹ÙÀÌŬÀÌ´Ù.
		VEHICLEITEMINFO_MAP_ITER iter = m_mapVEHICLEItemInfo.find ( pInvenItem->sItemCustom.dwVehicleID );
		if ( iter==m_mapVEHICLEItemInfo.end() ) return;
		sVehicle = (*iter).second;
	}
	else
	{
		sVehicle.m_nFull  = m_sVehicle.m_nFull;
		sVehicle.m_emTYPE = m_sVehicle.m_emTYPE;
	}

	// ¿¬·á°¡ °¡µæÂ÷ ÀÖ´Ù¸é
	if ( sVehicle.m_nFull >= 1000 ) return;


	GLMSG::SNET_VEHICLE_REQ_GIVE_BATTERY NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;

	NETSENDTOFIELD ( &NetMsg );
}

void GLCharacter::ReqVehicleInvenUpdate()
{
	GLInventory::CELL_MAP* pMapItem = m_cInventory.GetItemList();
	GLInventory::CELL_MAP_CITER iter = pMapItem->begin();
	GLInventory::CELL_MAP_CITER iter_end = pMapItem->end();
	for ( ; iter!=iter_end; ++iter )
	{
		SINVENITEM* pInvenItem = (*iter).second;
		SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
		if ( pItem && pItem->sBasicOp.emItemType == ITEM_VEHICLE && pInvenItem->sItemCustom.dwVehicleID != 0 )
		{
			GLMSG::SNET_VEHICLE_REQ_ITEM_INFO NetMsg;
			NetMsg.dwVehicleID = pInvenItem->sItemCustom.dwVehicleID;
			NETSENDTOFIELD ( &NetMsg );
		}
	}

	// ¹ÙÀÌŬ ¼ÒÀ¯ ¿©ºÎ üũ 
	SITEMCUSTOM& sItemCustom = m_PutOnItems[SLOT_VEHICLE];
	if ( sItemCustom.sNativeID != NATIVEID_NULL() )
	{
		SITEM* pItem = GLItemMan::GetInstance().GetItem ( sItemCustom.sNativeID );
		if ( pItem && pItem->sBasicOp.emItemType == ITEM_VEHICLE && sItemCustom.dwVehicleID != 0 )
		{
			GLMSG::SNET_VEHICLE_REQ_ITEM_INFO NetMsg;
			NetMsg.dwVehicleID = sItemCustom.dwVehicleID;
			NETSENDTOFIELD ( &NetMsg );
		}
	}

	return;

}

void GLCharacter::ReqNonRebirth( BOOL bNonRebirth )
{
	GLMSG::SNET_NON_REBIRTH_REQ NetMsg;
	NetMsg.bNon_Rebirth = bNonRebirth;
	NETSENDTOFIELD ( &NetMsg );
}

void GLCharacter::ReqQBoxEnableState( bool bQboxEnable )
{
	GLMSG::SNET_QBOX_OPTION_REQ_AG NetMsg;
	NetMsg.bQBoxEnable = bQboxEnable;
	NETSEND ( &NetMsg );
}

void GLCharacter::ReqItemShopOpen( bool bOpen )		// ItemShop Open/Close Å뺸
{
//#if defined ( JP_PARAM ) || defined ( _RELEASED)	// JAPAN Item Shop //add itemshop icon
	
	if ( m_bItemShopOpen == bOpen )	return;
	
	GLMSG::SNETPC_OPEN_ITEMSHOP	NetMsg;
	NetMsg.bOpen = bOpen;
	NETSENDTOFIELD( &NetMsg );
	
	m_bItemShopOpen = bOpen;
	
	CItemShopIconMan* pShopIconMan = CInnerInterface::GetInstance().GetItemShopIconMan();
	if ( !pShopIconMan ) return;

	if ( m_bItemShopOpen )
	{
		pShopIconMan->ADD_SHOP_ICON( m_dwGaeaID );
	}
	else
	{
		pShopIconMan->DEL_SHOP_ICON( m_dwGaeaID );
	}

//#endif
	return;
}

HRESULT GLCharacter::ReqAttendList ( bool bDay )
{
	if ( m_bReqAttendList && !bDay )	return S_OK;

	m_bReqAttendList = true;

	//	Note : ¸Þ½ÃÁö Àü¼Û.
	GLMSG::SNETPC_REQ_ATTENDLIST NetMsg;
	NETSEND(&NetMsg);

	return S_OK;
}

HRESULT GLCharacter::ReqAttendance()
{
	//	°ÔÀÓÁ¢¼Ó½Ã°£ üũ
	CTime cCurTime = GLGaeaClient::GetInstance().GetCurrentTime();
	CTime cDayTime( cCurTime.GetYear(), cCurTime.GetMonth(), cCurTime.GetDay(),0,0,0 );
	CTime cLoginTime;
	if ( m_tAttendLogin < cDayTime.GetTime()  ) cLoginTime = cDayTime;
	else cLoginTime = m_tAttendLogin;

	CTimeSpan cGameTime = cCurTime - cLoginTime;
	if ( cGameTime.GetTotalMinutes() < m_dwAttendTime ) 
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_ATTEND_FB_ATTENTIME"),m_dwAttendTime );
		return S_FALSE;
	}

	//	Note : ¸Þ½ÃÁö Àü¼Û.
	GLMSG::SNETPC_REQ_ATTENDANCE NetMsg;
	NETSEND(&NetMsg);

	return S_OK;
}


HRESULT GLCharacter::InvenUseTaxiCard( WORD wPosX, WORD wPosY )
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgTextDlg ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMTAXI_TAKE_TICKET") );
		return E_FAIL;
	}

	CInnerInterface::GetInstance().OPEN_TAXI_WINDOW( wPosX, wPosY );

	return S_OK;
}

HRESULT GLCharacter::InvenUseNpcRecall( WORD wPosX, WORD wPosY )
{
	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_NPC_RECALL_FB_NOITEM") );
		return E_FAIL;
	}

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_NPC_RECALL_FB_NOITEM") );
		return E_FAIL;
	}


	//	¼­¹ö ¿äû

	GLMSG::SNET_INVEN_NPC_RECALL NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;
	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqItemMix( DWORD dwNpcID )
{
	SINVENITEM	sInvenItem[ITEMMIX_ITEMNUM];
	for ( int i =0; i < ITEMMIX_ITEMNUM; ++i )
	{
		sInvenItem[i].sItemCustom = GET_ITEM_MIX( i );
		sInvenItem[i].wPosX = m_sItemMixPos[i].wPosX;
		sInvenItem[i].wPosY = m_sItemMixPos[i].wPosY;
	}

	if ( !sInvenItem ) return E_FAIL;


	GLItemMixMan::GetInstance().SortInvenItem( sInvenItem );	

	ITEM_MIX sItemMix;
	for( int i = 0; i < ITEMMIX_ITEMNUM; ++i ) 
	{
		sItemMix.sMeterialItem[i].sNID = GET_ITEM_MIX( i ).sNativeID;
		
		if( sItemMix.sMeterialItem[i].sNID != NATIVEID_NULL() )
			sItemMix.sMeterialItem[i].nNum = GET_ITEM_MIX( i ).wTurnNum;
		if ( sItemMix.sMeterialItem[i].sNID != sInvenItem[i].sItemCustom.sNativeID ) return E_FAIL;
	}

	GLItemMixMan::GetInstance().SortMeterialItem( sItemMix );
	const ITEM_MIX* pItemMix = GLItemMixMan::GetInstance().GetItemMix( sItemMix );
	
	if ( !pItemMix ) 
	{
		//	¾ø´Â ¾ÆÀÌÅÛ Á¶ÇÕ
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMITEM_MIX_FB_NOMIX") );
		CInnerInterface::GetInstance().SetItemMixResult( ID2GAMEINTEXT("EMITEM_MIX_FB_NOMIX") );
		return E_FAIL;
	}

	if ( m_lnMoney < sItemMix.dwPrice ) 
	{
		//	±Ý¾× ¾øÀ½
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMITEM_MIX_FB_NOMONEY") );
		CInnerInterface::GetInstance().SetItemMixResult( ID2GAMEINTEXT("EMITEM_MIX_FB_NOMONEY") );
		return E_FAIL;
	}

	GLMSG::SNET_INVEN_ITEM_MIX sNetMsg;

	sNetMsg.dwKey = pItemMix->dwKey;
	for ( int i = 0; i < ITEMMIX_ITEMNUM; ++i )
	{
		sNetMsg.sInvenPos[i].wPosX = sInvenItem[i].wPosX;
		sNetMsg.sInvenPos[i].wPosY = sInvenItem[i].wPosY;
	}
	sNetMsg.dwNpcID = dwNpcID;

	NETSENDTOFIELD( &sNetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqGathering( const STARGETID& sTargetID )
{
	PLANDMANCLIENT pLAND = GLGaeaClient::GetInstance().GetActiveMap();
	if ( !pLAND )	return E_FAIL;

	{
		//	Note : ¸Þ½ÃÁö ¼Û½ÅÀü¿¡ À¯È¿ÇÒÁö¸¦ ¹Ì¸® °Ë»çÇÔ.
		//
		// »ç¸ÁÈ®ÀÎ
		if ( !IsValidBody() )	return E_FAIL;
		if ( IsACTION( GLAT_GATHERING ) )	return E_FAIL;

		//	°Å¸® üũ
		const D3DXVECTOR3 &vTarPos = sTargetID.vPos;

		//	°Å¸® üũ
		D3DXVECTOR3 vPos;
		vPos = m_vPos;

		D3DXVECTOR3 vDistance = vPos - vTarPos;
		float fDistance = D3DXVec3Length ( &vDistance );

		WORD wTarBodyRadius = 4;
		WORD wGatherRange = wTarBodyRadius + GETBODYRADIUS() + 2;
		WORD wGatherAbleDis = wGatherRange + 10;

		if ( fDistance>wGatherAbleDis )
		{
			CInnerInterface::GetInstance().PrintMsgText( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_GATHER_FB_DISTANCE") );			
			return E_FAIL;
		}

		if ( sTargetID.emCrow!=CROW_MATERIAL )	
		{
			CInnerInterface::GetInstance().PrintMsgText( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMREQ_GATHER_FB_NOTTYPE") );			
			return E_FAIL;
		}
		
		PGLMATERIALCLIENT pMaterial = pLAND->GetMaterial( sTargetID.dwID );
		if ( !pMaterial )
		{
			CInnerInterface::GetInstance().PrintMsgText( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMGATHER_FB_NOCROW") );			
			return E_FAIL;		
		}

		//	¸Þ½ÃÁö ¹ß»ý.
		GLMSG::SNETPC_REQ_GATHERING NetMsg;
		NetMsg.dwTargetID = sTargetID.dwID;
		NETSENDTOFIELD ( &NetMsg );
	}

	return S_OK;
}

HRESULT GLCharacter::ReqCancelGathering()
{

	CInnerInterface::GetInstance().HideGroup( GATHER_GAUGE );
	return S_OK;
}
HRESULT GLCharacter::ReqSortItem ()
{
	/*
	if ( ValidWindowOpen() )														return E_FAIL;	
	if ( IsACTION(GLAT_ATTACK) || IsACTION(GLAT_SKILL) ||  m_sPMarket.IsOpen() )	return E_FAIL;

	int nIndex = 0;
	GLMSG::SNETPC_REQ_HOLD_ARRAY NetMsg;
	for( int y = 0; y < 10; y++ )
	{
		for( int x = 0; x < 6; x++ )
		{
			SINVENITEM& ref_InvenItem = CInnerInterface::GetInstance().GetInventoryWindow()->GetInventoryPage()->GetItem ( x, y );
			if ( ref_InvenItem.sItemCustom.sNativeID != NATIVEID_NULL() )
			{
				SITEM* pItem = GLItemMan::GetInstance().GetItem ( ref_InvenItem.sItemCustom.sNativeID );
				if ( pItem ) 
				{
					//CInnerInterface::GetInstance().PrintMsgTextDlg(NS_UITEXTCOLOR::WHITE,"1 %d",nIndex);
					SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( x, y );
					NetMsg.wPosX[nIndex] = pInvenItem->wPosX;
					NetMsg.wPosY[nIndex] = pInvenItem->wPosY;
				}
				else
				{
					//CInnerInterface::GetInstance().PrintMsgTextDlg(NS_UITEXTCOLOR::WHITE,"2 %d",nIndex);
					
					NetMsg.wPosX[nIndex] = -1;
					NetMsg.wPosY[nIndex] = -1;
				}
				nIndex++;
				
			//CInnerInterface::GetInstance().PrintMsgTextDlg(NS_UITEXTCOLOR::WHITE,"3 %d",nIndex);
			}
			
			//CInnerInterface::GetInstance().PrintMsgTextDlg(NS_UITEXTCOLOR::WHITE,"4 %d",nIndex);		
		}
	}
	NETSENDTOFIELD ( &NetMsg );
	
	GLMSG::SNETPC_REQ_HOLDARRAY_TO_INVEN NetMsg2;
	NETSENDTOFIELD ( &NetMsg2 );

	*/
	return S_OK;
}

//link skill
void GLCharacter::ReqLinkSkill( SNATIVEID sSKILLID, WORD wLevel )
{
	if ( sSKILLID == NATIVEID_NULL())						return;

	PGLSKILL pSkill = GLSkillMan::GetInstance().GetData ( sSKILLID.wMainID, sSKILLID.wSubID );
	if ( !pSkill )											return;

	GLMSG::SNETPC_REQ_LINKSKILLEFF NetMsg;
	NetMsg.sSKILLID = sSKILLID;
	NetMsg.wSKILLLevel = wLevel;
	bool bFound = false;
	for( int i = 0; i < SKILLFACT_SIZE; i++ )
	{
		SSKILLFACT sEFF = m_sSKILLFACT[i];
		if ( sEFF.sNATIVEID == NATIVEID_NULL() || sEFF.sNATIVEID == sSKILLID )
		{
			bFound = true;
			NetMsg.dwSelect = i;
			break;
		}
	}
	if ( bFound )	NETSENDTOFIELD ( &NetMsg );
}

//dmk14 | 12-9-16 | item compound
HRESULT GLCharacter::ReqItemCompound( DWORD dwKey )
{
	const ITEM_MIX* pItemMix = GLItemMixMan::GetInstance().GetItemMix( dwKey, true );
	if ( !pItemMix ) 
	{
		//	¾ø´Â ¾ÆÀÌÅÛ Á¶ÇÕ
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMITEM_MIX_FB_NOMIX") );
		CInnerInterface::GetInstance().SetItemMixResult( ID2GAMEINTEXT("EMITEM_MIX_FB_NOMIX") );
		return E_FAIL;
	}

	if ( m_lnMoney < pItemMix->dwPrice ) 
	{
		//	±Ý¾× ¾øÀ½
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMITEM_MIX_FB_NOMONEY") );
		CInnerInterface::GetInstance().SetItemMixResult( ID2GAMEINTEXT("EMITEM_MIX_FB_NOMONEY") );
		return E_FAIL;
	}

	GLMSG::SNET_INVEN_ITEM_COMPOUND sNetMsg;

	sNetMsg.dwKey = pItemMix->dwKey;
	NETSENDTOFIELD( &sNetMsg );

	return S_OK;
}
HRESULT GLCharacter::ReqWrap( WORD wPosX, WORD wPosY ) // wrapper
{
	if ( !IsValidBody() )						
		return E_FAIL;

	if ( GLTradeClient::GetInstance().Valid() )	
		return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	
		return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			
		return E_FAIL;

	if ( pInvenItem->sItemCustom.IsWrap() )
		return S_FALSE;

	// TODO : What items can only be wrapped 
	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
		return S_FALSE;

	if ( pItem->sBasicOp.emItemType == ITEM_SUIT )
	{
		if ( pItem->sSuitOp.emSuit > SUIT_HANDHELD )
			return S_FALSE;
	}

	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	
		return S_FALSE;

	if ( pHold->sBasicOp.emItemType != ITEM_WRAPPER )	
		return S_FALSE;

	GLMSG::SNET_INVEN_WRAP NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}

HRESULT GLCharacter::ReqRemoveWrap( WORD wPosX, WORD wPosY ) // wrapper
{
	if ( !IsValidBody() )						
		return E_FAIL;

	if ( GLTradeClient::GetInstance().Valid() )	
		return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	
		return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			
		return E_FAIL;

	if ( !pInvenItem->sItemCustom.IsWrap() )
		return S_FALSE;

	GLMSG::SNET_INVEN_REMOVE_WRAP NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}
HRESULT GLCharacter::ReqNonDrop( WORD wPosX, WORD wPosY ) //nondrop card Eduj
{
	if ( !IsValidBody() )						
		return E_FAIL;

	if ( GLTradeClient::GetInstance().Valid() )	
		return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	
		return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			
		return E_FAIL;


	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
		return S_FALSE;


	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	
		return S_FALSE;

    bool bNonDrop(false);
	bool bDrop(false);

    if ( pHold->sBasicOp.emItemType == ITEM_NONDROP_CARD )  bNonDrop = true;
    //if ( pHold->sBasicOp.emItemType == ITEM_DROP_CARD ) bDrop = true;
	//if ( !bNonDrop ) return S_FALSE;

	if ( !pItem->sBasicOp.IsTHROW() ||  pInvenItem->sItemCustom.IsNonDrop() )
	{
		if ( bNonDrop )
		{
		  CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Item is already Nondropable." );
		  return S_FALSE; 
		}
    }



	GLMSG::SNET_INVEN_NONDROP NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}
HRESULT GLCharacter::ReqRemoveNonDrop( WORD wPosX, WORD wPosY ) //nondrop card Eduj
{
	if ( !IsValidBody() )						
		return E_FAIL;

	if ( GLTradeClient::GetInstance().Valid() )	
		return E_FAIL;

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	
		return E_FAIL;

	wPosX = pInvenItem->wPosX;
	wPosY = pInvenItem->wPosY;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )			
		return E_FAIL;


	if ( pItem->sBasicOp.emItemType != ITEM_SUIT )
		return S_FALSE;

	if ( !pInvenItem->sItemCustom.IsNonDrop() )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "Item is already Dropable." );
	}


	SITEM* pHold = GET_SLOT_ITEMDATA ( SLOT_HOLD );
	if ( !pHold )	
		return S_FALSE;


	GLMSG::SNET_INVEN_REMOVE_NONDROP NetMsg;
	NetMsg.wPosX = wPosX;
	NetMsg.wPosY = wPosY;

	NETSENDTOFIELD ( &NetMsg );

	return S_OK;
}
HRESULT GLCharacter::ReqInvenSchoolChange ( WORD wSchool ) // Added by mharlon
{
	GLMSG::SNETPC_INVEN_SCHOOL_CHANGE NetMsg;
	NetMsg.wPosX	  = m_wInvenPosX1;
	NetMsg.wPosY	  = m_wInvenPosY1;
	NetMsg.wSchool = wSchool;
	NETSENDTOFIELD ( &NetMsg );

	m_wInvenPosX1 = 0;
	m_wInvenPosY1 = 0;

	return S_OK;
}
//Change School
HRESULT GLCharacter::InvenSchoolChangeSG ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_SCHOOL_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	if ( pItem->sBasicOp.emItemType == ITEM_SCHOOL_CHANGE_SG && m_wSchool == 0)
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "You are already in Sacred Gate School" );
		return E_FAIL;
	}


	DoModal( "Are you sure do you want to transfer in Sacred Gate School?", MODAL_INFOMATION, YESNO, MODAL_SCHOOL_CHANGE_SG );

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	return S_OK;
}
HRESULT GLCharacter::InvenSchoolChangeMP ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_SCHOOL_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	if ( pItem->sBasicOp.emItemType == ITEM_SCHOOL_CHANGE_MP && m_wSchool == 1)
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "You are already in Mystic Peak School" );
		return E_FAIL;
	}


	DoModal( "Are you sure do you want to transfer in Mystic Peak School?", MODAL_INFOMATION, YESNO, MODAL_SCHOOL_CHANGE_MP );

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	return S_OK;
}
HRESULT GLCharacter::InvenSchoolChangePH ( WORD wPosX, WORD wPosY )
{
	//if ( !IsValidBody() )						return E_FAIL;
	//if ( GLTradeClient::GetInstance().Valid() )	return E_FAIL;
	//if( ValidRebuildOpen() )	return E_FAIL;	// ITEMREBUILD_MARK

	SINVENITEM* pInvenItem = m_cInventory.FindPosItem ( wPosX, wPosY );
	if ( !pInvenItem )	return E_FAIL;

	SITEM* pItem = GLItemMan::GetInstance().GetItem ( pInvenItem->sItemCustom.sNativeID );
	if ( !pItem )
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, ID2GAMEINTEXT("EMINVEN_SCHOOL_CHANGE_FB_NOITEM") );
		return E_FAIL;
	}

	if ( pItem->sBasicOp.emItemType == ITEM_SCHOOL_CHANGE_PH && m_wSchool == 2)
	{
		CInnerInterface::GetInstance().PrintMsgText ( NS_UITEXTCOLOR::DISABLE, "You are already in Phoenix School" );
		return E_FAIL;
	}


	DoModal( "Are you sure do you want to transfer in Phoenix School?", MODAL_INFOMATION, YESNO, MODAL_SCHOOL_CHANGE_PH );

	m_wInvenPosX1 = wPosX;
	m_wInvenPosY1 = wPosY;

	return S_OK;
}
 
Newbie Spellweaver
Joined
Feb 26, 2018
Messages
78
Reaction score
2
you need tyranny cfg at glogicserver.rcc
if you don't have it tyranny will defaul id 0,0 is id map for tyranny. use cmd to enter that map .you will see tyranny info same with tyranny at normal map

did u mean it because of my glogicserver that i cant enter SG school ?
anyone have fix this "you are unable to enter this area" please help me T_T
 
Newbie Spellweaver
Joined
Feb 1, 2019
Messages
41
Reaction score
1
Guys... How to edit the Error log.
i want to remove the urban gaming networks.
and facebook link.
and how to remove or disable the folder after closing the game?
sanaVo - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums

sanaVo - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums
 
Master Summoner
Joined
Feb 6, 2019
Messages
569
Reaction score
157
@Caspian what do you mean nothing i just saw it :3 //Ocram - Operation tokhang sa mga items pag lumagpas sa max RV Hahahaha! 7-16-2017 if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_ATTACK_VOL) >= 101 )//attack direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_DEFENSE_VOL) >= 101 )//def direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_MELEE) >= 101 )//meleee direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_SHOOTING) >= 101 )//shooting direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_VITALITY) >= 151)//Vit direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_DAMAGE) >= 10.01 )//Damage rate percentage - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_AVOID_VOL) >= 31 )//avoid direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_HIT_VOL) >= 31 )//hitrate direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_RESIST) >= 21 )//resist - Ocram Networks { return S_FALSE; } GLMSG::SNETPC_REQ_INVEN_TO_HOLD NetMsg; NetMsg.wPosX = pInvenItem->wPosX; NetMsg.wPosY = pInvenItem->wPosY; NETSENDTOFIELD ( &NetMsg ); if ( J == SLOT_RHAND ) { J = GetCurRHand(); } if ( J == SLOT_LHAND ) { J = GetCurLHand(); } bool bEMPTY_SLOT = ISEMPTY_SLOT(pInvenItem->sItemCustom.sNativeID,J); if (!bEMPTY_SLOT) { GLMSG::SNETPC_REQ_SLOT_EX_HOLD NetMsgEquip; NetMsgEquip.emSlot = J; NETSENDTOFIELD ( &NetMsgEquip ); GLMSG::SNETPC_REQ_HOLD_TO_INVEN NetMsgToInven; NetMsgToInven.wPosX = wPosX; NetMsgToInven.wPosY = wPosY; #if defined(VN_PARAM) NetMsgToInven.bUseVietnamInven = sCustom.bVietnamGainItem; #else NetMsgToInven.bUseVietnamInven = FALSE; #endif NETSENDTOFIELD ( &NetMsgToInven ); } else { GLMSG::SNETPC_REQ_HOLD_TO_SLOT NetMsgEquip; NetMsgEquip.emSlot = J; NETSENDTOFIELD ( &NetMsgEquip ); } return S_OK; }
it's in the glcharactorreq :3
 
Custom Title Activated
Loyal Member
Joined
Jul 16, 2012
Messages
1,310
Reaction score
116
Caspian what do you mean nothing i just saw it :3 //Ocram - Operation tokhang sa mga items pag lumagpas sa max RV Hahahaha! 7-16-2017 if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_ATTACK_VOL) >= 101 )//attack direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_DEFENSE_VOL) >= 101 )//def direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_MELEE) >= 101 )//meleee direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_SHOOTING) >= 101 )//shooting direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_VITALITY) >= 151)//Vit direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_DAMAGE) >= 10.01 )//Damage rate percentage - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_AVOID_VOL) >= 31 )//avoid direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_HIT_VOL) >= 31 )//hitrate direct value - Ocram Networks { return S_FALSE; } if ( pInvenItem->sItemCustom.GETOptVALUE(EMR_OPT_RESIST) >= 21 )//resist - Ocram Networks { return S_FALSE; } GLMSG::SNETPC_REQ_INVEN_TO_HOLD NetMsg; NetMsg.wPosX = pInvenItem->wPosX; NetMsg.wPosY = pInvenItem->wPosY; NETSENDTOFIELD ( &NetMsg ); if ( J == SLOT_RHAND ) { J = GetCurRHand(); } if ( J == SLOT_LHAND ) { J = GetCurLHand(); } bool bEMPTY_SLOT = ISEMPTY_SLOT(pInvenItem->sItemCustom.sNativeID,J); if (!bEMPTY_SLOT) { GLMSG::SNETPC_REQ_SLOT_EX_HOLD NetMsgEquip; NetMsgEquip.emSlot = J; NETSENDTOFIELD ( &NetMsgEquip ); GLMSG::SNETPC_REQ_HOLD_TO_INVEN NetMsgToInven; NetMsgToInven.wPosX = wPosX; NetMsgToInven.wPosY = wPosY; #if defined(VN_PARAM) NetMsgToInven.bUseVietnamInven = sCustom.bVietnamGainItem; #else NetMsgToInven.bUseVietnamInven = FALSE; #endif NETSENDTOFIELD ( &NetMsgToInven ); } else { GLMSG::SNETPC_REQ_HOLD_TO_SLOT NetMsgEquip; NetMsgEquip.emSlot = J; NETSENDTOFIELD ( &NetMsgEquip ); } return S_OK; }
it's in the glcharactorreq :3

ohh my mistake .. i check opened different .cpp .. haha thanks
 
Custom Title Activated
Loyal Member
Joined
Jul 16, 2012
Messages
1,310
Reaction score
116
In Edit Level or Map.. .every time i open page there is no back option or ok button to go back to the page set..
wb8dN0G - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums


Also cannot be edited
 

Attachments

You must be registered for see attachments list
Last edited:
Master Summoner
Joined
Feb 6, 2019
Messages
569
Reaction score
157
In Edit Level or Map.. .every time i open page there is no back option or ok button to go back to the page set..
wb8dN0G - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums


Also cannot be edited

i think the button is on the lower part just adjust it on the source .
 

Attachments

You must be registered for see attachments list
Custom Title Activated
Loyal Member
Joined
Jul 16, 2012
Messages
1,310
Reaction score
116
Bug found: No school winner if case like only Phnx captured two controllers and SG only one controller captured.. I mean no Buff for PHNX
01soBlV - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums
 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
May 4, 2017
Messages
50
Reaction score
2
Bug found: No school winner if case like only Phnx captured two controllers and SG only one controller captured.. I mean no Buff for PHNX
01soBlV - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums

what launcher did you use?
 

Attachments

You must be registered for see attachments list
Newbie Spellweaver
Joined
Dec 13, 2017
Messages
11
Reaction score
0
Bug found: No school winner if case like only Phnx captured two controllers and SG only one controller captured.. I mean no Buff for PHNX
01soBlV - Urban Gaming Client/Database/Source Code Only - RaGEZONE Forums
Have you updated to skill ep 10?
 

Attachments

You must be registered for see attachments list
Back
Top