#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;
}