Code:
///////////////////////////////////////////////////////////////////////////////
// 2013-11-25 by jhseol&bckim, °Å·¡¼Ò - ÆÐŶ ¸®½Ãºê ÇÔ¼ö ±¸Çö
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_BASE_INFO_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_BASE_INFO_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
m_nMarketRegistrationCount = 0;
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_BASE_INFO_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
// ÀÓ½Ã
{
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_BASE_INFO_HEAD, T_FC_MARKET_BASE_INFO_HEADER, pSendHeadMsg, pSendHeadBuf);
pSendHeadMsg->nSellingTime = MARKET_SELLING_MINUTES;
SendAddData(pSendHeadBuf, MSG_SIZE(MSG_FC_MARKET_BASE_INFO_HEAD));
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( MARKET_PACKET_RECV_TICK_BUY_PAGE > GetTickCount() - m_nLatelyMarketPacketRecvTick_BuyPage )
{
SendErrorMessage(T_FC_MARKET_BASE_INFO_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_BuyPage = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_BASE_INFO_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_BASE_INFO_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ¿øº» º¹»çÈÄ º¹»ç¿©ºÎ È®ÀÎ
m_CopyMarketListPtr.clear();
ms_pFieldIOCP->m_pMarketDataManager->CopyMarketList(&m_CopyMarketListPtr);
if ( TRUE == m_CopyMarketListPtr.empty() )
{
SendErrorMessage(T_FC_MARKET_BASE_INFO_REQUEST, ERR_DB_NO_SUCH_DATA, 100);
return RES_BREAK;
}
///////////////////////////////////////////////
// »óŰªÀÌ À¯¿äÇÑ °Íµé¸¸ ÃßÃâ
ATUM_DATE_TIME tmCurrentTime(TRUE);
MARKET_LIST tmMarketList;
tmMarketList.reserve(m_CopyMarketListPtr.size());
tmMarketList.clear();
tmMarketList.assign(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end());
m_CopyMarketListPtr.clear();
// ÃßÃâ ÈÄ ½Ã°£º° ³»¸²Â÷¼ø Á¤·ÄÀ» ÇÇÇϱâ À§ÇØ µÚ¿¡¼ºÎÅÍ °Ë»ö
// m_nMarketRegistrationCount = 0;
MARKET_ITR itr = tmMarketList.end();
while (itr != tmMarketList.begin())
{
itr--;
if ( MARKET_STATE_SELL == (*itr)->MarketState
&& MARKET_SELLING_MINUTES > tmCurrentTime.GetTimeDiffTimeInMinutes((*itr)->RegistTime)
#ifdef SC_MARKET_NOT_USE_NORMAL_INFL
&& (*itr)->MarketItemInfl == m_character.InfluenceType // 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ ) // µ¿Àϼ¼·Â
#endif
)
{
m_CopyMarketListPtr.push_back((*itr));
}
if ( (*itr)->CharacterUID == m_character.CharacterUniqueNumber && MARKET_STATE_DELETE != (*itr)->MarketState )
{
m_nMarketRegistrationCount++;
}
}
/* ==>> ¾Õ¿¡¼ ºÎÅÍ °Ë»öÇÏ°Ô µÇ¸é ½Ã°£º° ³»¸²Â÷¼ø Á¤·Ä±îÁö ÇØ¾ßÇÔÀ¸·Î ¸®½ºÅ©°¡ Å©´Ù ±×·¯¹Ç·Î ÁÖ¼®Ã³¸®
for ( ; itr != tmMarketList.end() ; itr++ )
{
if ( MARKET_STATE_SELL == (*itr)->MarketState && MARKET_SELLING_HOURS > tmCurrentTime.GetTimeDiffTimeInHours((*itr)->RegistTime) )
{
MARKET_INFO tmMarketInfo((*itr));
m_CopyMarketListPtr.push_back((*itr));
}
}
///////////////////////////////////////////////
// µî·Ï½Ã°£ º°·ç Á¤·Ä
// À§¿¡¼ ¿ª¼øÀ¸·Î ÃßÃâÇϸé Á¤·ÄÇÒ Çʿ䰡 ¾ø´Ù
sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_TIME_DOWN());
m_nLatelyMarketListSortingType = MARKET_SORT_TIME_DOWN;
<<== ¿©±â±îÁö */
///////////////////////////////////////////////
// ÃßÃâ°á°ú ¸®½ºÆ® È®ÀÎ
int nCopyMarketListSize = m_CopyMarketListPtr.size();
if ( 0 >= nCopyMarketListSize )
{
SendErrorMessage(T_FC_MARKET_BASE_INFO_REQUEST, ERR_DB_NO_SUCH_DATA, 101);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Ë»ö°á°ú º¸³»±â
//SendAddMessageType(T_FC_MARKET_BASE_INFO_HEADER);
//
// typedef struct
// {
// INT nSellingTime;
// } MSG_FC_MARKET_BASE_INFO_HEAD;
// INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_BASE_INFO_HEAD, T_FC_MARKET_BASE_INFO_HEADER, pSendHeadMsg, pSendHeadBuf);
// pSendHeadMsg->nSellingTime = MARKET_SELLING_MINUTES;
// SendAddData(pSendHeadBuf, MSG_SIZE(MSG_FC_MARKET_BASE_INFO_HEAD));
//
// Çì´õ´Â À§¿¡¼ º¸³À´Ï´Ù..
// °æ¸Å½Ã°£°ªÀ»
itr = m_CopyMarketListPtr.begin();
for ( int i = 0 ; i < MARKET_VIEW_LIST_COUNT ; i++, itr++ )
{
if ( itr == m_CopyMarketListPtr.end() ) // Ç׸ñÀÌ 8°Ô ¹Ì¸¸À϶§ ÇØ´ç
{
break;
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_BASE_INFO_OK, T_FC_MARKET_BASE_INFO_OK, pSendOKMsg, pSendOKBuf);
MARKET_INFO tmMarket(*itr);
memcpy(&pSendOKMsg->MarketInfo, &tmMarket, sizeof(pSendOKMsg->MarketInfo));
SendAddData(pSendOKBuf, MSG_SIZE(MSG_FC_MARKET_BASE_INFO_OK));
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_BASE_INFO_DONE, T_FC_MARKET_BASE_INFO_DONE, pSendDoneMsg, pSendDoneBuf);
pSendDoneMsg->ItemCount = nCopyMarketListSize;
pSendDoneMsg->MaxPage = (nCopyMarketListSize / MARKET_VIEW_LIST_COUNT) + (0 == (nCopyMarketListSize % MARKET_VIEW_LIST_COUNT) ? 0 : 1);
pSendDoneMsg->CurrentPage = 1;
SendAddData(pSendDoneBuf, MSG_SIZE(MSG_FC_MARKET_BASE_INFO_DONE));
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_SEARCH_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_SEARCH_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_MARKET_SEARCH_REQUEST,
MSG_FC_MARKET_SEARCH_REQUEST, pRMsg);
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_SEARCH_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( MARKET_PACKET_RECV_TICK_BUY_PAGE > GetTickCount() - m_nLatelyMarketPacketRecvTick_BuyPage )
{
SendErrorMessage(T_FC_MARKET_SEARCH_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_BuyPage = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_SEARCH_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_SEARCH_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ¿øº» º¹»çÈÄ º¹»ç¿©ºÎ È®ÀÎ
m_CopyMarketListPtr.clear();
ms_pFieldIOCP->m_pMarketDataManager->CopyMarketList(&m_CopyMarketListPtr);
if ( TRUE == m_CopyMarketListPtr.empty() )
{
SendErrorMessage(T_FC_MARKET_SEARCH_REQUEST, ERR_DB_NO_SUCH_DATA, 100);
return RES_BREAK;
}
///////////////////////////////////////////////
// Àϰý °Ë»ö push_backÀÇ ¸®½ºÅ©¸¦ ÁÙÀ̱â À§ÇØ Çѹ濡 ¸ðµçÁ¶°ÇÀ» °Ë»ö!!
ATUM_DATE_TIME tmCurrentTime(TRUE);
MARKET_LIST tmMarketList;
tmMarketList.reserve(m_CopyMarketListPtr.size());
tmMarketList.clear();
tmMarketList.assign(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end());
m_CopyMarketListPtr.clear();
MARKET_ITR itr = tmMarketList.begin();
for ( ; itr != tmMarketList.end() ; itr++ )
{
#ifdef SC_MARKET_NOT_USE_NORMAL_INFL
if ( (*itr)->MarketItemInfl == m_character.InfluenceType ) // 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ ) // µ¿Àϼ¼·Â
#endif
{
if ( pRMsg->MoneyType == (*itr)->MoneyType
&& MARKET_STATE_SELL == (*itr)->MarketState
&& MARKET_SELLING_MINUTES > tmCurrentTime.GetTimeDiffTimeInMinutes((*itr)->RegistTime)
&& ( 0 == pRMsg->Kind || IsMarketItemKindSame(pRMsg->Kind, (*itr)->ItemKind) )
&& ( 0 == pRMsg->ItemGear || IS_SAME_UNITKIND(pRMsg->ItemGear, (*itr)->ItemGear) )
&& ( 0 == pRMsg->LevelMin || pRMsg->LevelMin <= (*itr)->ItemLevel )
&& ( 0 == pRMsg->LevelMax || pRMsg->LevelMax >= (*itr)->ItemLevel )
&& ( 0 == pRMsg->EnchantMin || pRMsg->EnchantMin <= (*itr)->EnchantCount )
&& ( 0 == pRMsg->EnchantMax || pRMsg->EnchantMax >= (*itr)->EnchantCount )
)
{
if ( 0 < strlen(pRMsg->Name) ) // °Ë»ö¾î°¡ ÀÖÀ»°æ¿ì
{
char *token;
char seps[] = " ";
char buffer[MARKET_ITEM_FULL_NAME];
STRNCPY_MEMSET(buffer, pRMsg->Name, MARKET_ITEM_FULL_NAME);
token = strtok(buffer, seps);
if( NULL != token )
{
BYTE nFindNameIndex = 0;
nFindNameIndex = SearchWord((*itr)->ItemName, token, nFindNameIndex); // 1. ¾ÆÀÌÅÛ ÀÌºí¿¡¼ °Ë»öÇØ¾ß ÇÒ Ã¹¹øÂ° ´Ü¾î¸¦ ã´Â´Ù
while ( 0 < nFindNameIndex ) // 2. ´Ü¾î°¡ Æ÷ÇÔµÇÁö ¾ÊÀ¸¸é nFindNameIndex °¡ 0°ªÀ» °¡ÁüÀ¸·Î ¹Ýº¹¹®ÀÌ ¼öÇàµÇÁö ¾È´Â´Ù.
{
token = strtok(NULL, seps); // 3. ±×·¸Áö ¾Ê°í ´Ü¾î°¡ Æ÷ÇԵǾî ÀÖÀ¸¸é ÀÔ·ÂÇÑ °Ë»ö¾î Áß ´õ ã¾Æ¾ß ºÁ¾ßÇÏ´Â ´ÙÀ½ ´Ü¾î°¡ ÀÖ´ÂÁö È®ÀÎÇϰí
if ( NULL == token ) // 4. ´õÀÌ»ó ãÀ» ´Ü¾î°¡ ¾ø´Ù¸é °Ë»öÇØ¾ßÇÒ ¸ðµç ´Ü¾î°¡ Æ÷ÇÔµÈ ¾ÆÀÌÅÛ À̹ǷΠpush_back
{
m_CopyMarketListPtr.push_back((*itr));
nFindNameIndex = 0; // 5. ¹Ýº¹¹® Å»ÃâÁ¶°ÇÀÎ nFindNameIndex ¿¡ 0°ªÀ» ¼ÂÆÃ
}
else // 6. ¶Ç ã¾Æ¾ß ÇÏ´Â ´Ü¾î°¡ ÀÖ´Ù¸é
{
nFindNameIndex = SearchWord((*itr)->ItemName, token, nFindNameIndex); // 7. ´Ü¾î¸¦ ã°í 2¹øºÎÅÍ ¹Ýº¹
}
}
}
}
else // °Ë»ö¾î°¡ ¾øÀ» °æ¿ì ¹Ù·Î push_back
{
m_CopyMarketListPtr.push_back((*itr));
}
}
} // 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ ) // µ¿Àϼ¼·Â
}
///////////////////////////////////////////////
// °Ë»ö°á°ú ¸®½ºÆ® È®ÀÎ
int nCopyMarketListSize = m_CopyMarketListPtr.size();
// if ( 0 >= nCopyMarketListSize ) // Ŭ¶ó ¿äûÀ¸·Î °Ë»ö°á°ú°¡ ¾ø¾îµµ HEADER¿Í DONEÀ» º¸³»±â À§ÇØ ÁÖ¼®Ã³¸®
// {
// SendErrorMessage(T_FC_MARKET_SEARCH_REQUEST, ERR_DB_NO_SUCH_DATA, 101);
// return RES_BREAK;
// }
///////////////////////////////////////////////
// °Ë»ö°á°ú °¡°Ý º°·ç Á¤·Ä
sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_PRICE_UP());
m_nLatelyMarketListSortingType = MARKET_SORT_PRICE_UP;
///////////////////////////////////////////////
// °Ë»ö°á°ú º¸³»±â
SendAddMessageType(T_FC_MARKET_SEARCH_HEADER);
itr = m_CopyMarketListPtr.begin();
for ( int i = 0 ; i < MARKET_VIEW_LIST_COUNT ; i++, itr++ )
{
if ( itr == m_CopyMarketListPtr.end() ) // Ç׸ñÀÌ 8°Ô ¹Ì¸¸À϶§ ÇØ´ç
{
break;
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_SEARCH_OK, T_FC_MARKET_SEARCH_OK, pSendOKMsg, pSendOKBuf);
MARKET_INFO tmMarket(*itr);
memcpy(&pSendOKMsg->MarketInfo, &tmMarket, sizeof(pSendOKMsg->MarketInfo));
SendAddData(pSendOKBuf, MSG_SIZE(MSG_FC_MARKET_SEARCH_OK));
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_SEARCH_DONE, T_FC_MARKET_SEARCH_DONE, pSendDoneMsg, pSendDoneBuf);
pSendDoneMsg->ItemCount = nCopyMarketListSize;
pSendDoneMsg->MaxPage = (nCopyMarketListSize / MARKET_VIEW_LIST_COUNT) + (0 == (nCopyMarketListSize % MARKET_VIEW_LIST_COUNT) ? 0 : 1);
pSendDoneMsg->CurrentPage = 1;
SendAddData(pSendDoneBuf, MSG_SIZE(MSG_FC_MARKET_SEARCH_DONE));
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_PAGING_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_PAGING_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_MARKET_PAGING_REQUEST,
MSG_FC_MARKET_PAGING_REQUEST, pRMsg);
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_PAGING_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( 0 == pRMsg->MarketUID ) // 0°ªÀÌ¸é ¼ø¼ö ÆäÀÌÁö º¯°æ ¿äû. ¹Ý´ë·Î 0 °ªÀÌ ¾Æ´Ï¸é ±¸¸Å¿Ï·á ÈÄ ÆäÀÌÁö °»½Å ¿äûÀ̹ǷΠÅÒüũ¸¦ ÇÏÁö ¾Ê´Â´Ù.
{
if ( (MARKET_PACKET_RECV_TICK_BUY_PAGE/2) > GetTickCount() - m_nLatelyMarketPacketRecvTick_BuyPage )
{
SendErrorMessage(T_FC_MARKET_PAGING_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
}
m_nLatelyMarketPacketRecvTick_BuyPage = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_PAGING_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_PAGING_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// Á¦¿Ü½Ãų Ç׸ñÀÌ ÀÖ´ÂÁö È®ÀÎ
if ( 0 != pRMsg->MarketUID )
{
MARKET_ITR delitr = m_CopyMarketListPtr.begin();
for( ; delitr != m_CopyMarketListPtr.end() ; delitr++ )
{
if ( pRMsg->MarketUID == (*delitr)->MarketUID )
{
m_CopyMarketListPtr.erase(delitr);
break;
}
}
}
///////////////////////////////////////////////
// Ä«ÇÇÇÑ ¸®½ºÆ® È®ÀÎ
int nCopyMarketListSize = m_CopyMarketListPtr.size();
if ( 0 >= nCopyMarketListSize )
{
SendAddMessageType(T_FC_MARKET_PAGING_HEADER);
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_PAGING_DONE, T_FC_MARKET_PAGING_DONE, pSendDoneMsg, pSendDoneBuf);
SendAddData(pSendDoneBuf, MSG_SIZE(MSG_FC_MARKET_PAGING_DONE));
return RES_RETURN_TRUE;
}
///////////////////////////////////////////////
// ÆäÀÌÁö¿¡ ÀÖ´Â ¸¶Áö¸· ¾ÆÀÌÅÛÀ» ±¸¸ÅÇßÀ»°æ¿ì »ç¶óÁö´Â ÆäÀÌÁö¿¡ ´ëÇÑ ¿¹¿Üó¸® Ãß°¡
int nMaxPage = (nCopyMarketListSize / MARKET_VIEW_LIST_COUNT) + (0 == (nCopyMarketListSize % MARKET_VIEW_LIST_COUNT) ? 0 : 1);
if ( nMaxPage < pRMsg->SelectPage )
{
pRMsg->SelectPage--;
}
if ( 0 >= pRMsg->SelectPage )
{
SendAddMessageType(T_FC_MARKET_PAGING_HEADER);
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_PAGING_DONE, T_FC_MARKET_PAGING_DONE, pSendDoneMsg, pSendDoneBuf);
SendAddData(pSendDoneBuf, MSG_SIZE(MSG_FC_MARKET_PAGING_DONE));
return RES_RETURN_TRUE;
}
///////////////////////////////////////////////
// ¿Ã¹Ù¸¥ ÆäÀÌÁö ¹øÈ£ÀÎÁö È®ÀÎ
if ( FALSE == IS_IN_RANGE(1, pRMsg->SelectPage, nMaxPage) )
{
SendErrorMessage(T_FC_MARKET_PAGING_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÐÀÌ¡ °Ë»ö °á°ú º¸³»±â
int nIndex = 0;
nIndex = MARKET_VIEW_LIST_COUNT*(pRMsg->SelectPage-1);
SendAddMessageType(T_FC_MARKET_PAGING_HEADER);
for ( int i = 0 ; i < MARKET_VIEW_LIST_COUNT ; i++ )
{
if ( nIndex+i >= nCopyMarketListSize ) // ¸¶Áö¸· ÆÐÀÌÁö À϶§¸¸ ÇØ´ç
{
break;
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_PAGING_OK, T_FC_MARKET_PAGING_OK, pSendOKMsg, pSendOKBuf);
MARKET_INFO tmMarket(*m_CopyMarketListPtr[nIndex+i]);
memcpy(&pSendOKMsg->MarketInfo, &tmMarket, sizeof(pSendOKMsg->MarketInfo));
SendAddData(pSendOKBuf, MSG_SIZE(MSG_FC_MARKET_PAGING_OK));
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_PAGING_DONE, T_FC_MARKET_PAGING_DONE, pSendDoneMsg, pSendDoneBuf);
pSendDoneMsg->ItemCount = nCopyMarketListSize;
pSendDoneMsg->MaxPage = nMaxPage;
pSendDoneMsg->CurrentPage = pRMsg->SelectPage;
SendAddData(pSendDoneBuf, MSG_SIZE(MSG_FC_MARKET_PAGING_DONE));
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_SORT_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_MARKET_SORT_REQUEST,
MSG_FC_MARKET_SORT_REQUEST, pRMsg);
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( MARKET_PACKET_RECV_TICK_BUY_PAGE > GetTickCount() - m_nLatelyMarketPacketRecvTick_BuyPage )
{
SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_BuyPage = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// Ä«ÇÇÇÑ ¸®½ºÆ® È®ÀÎ
int nCopyMarketListSize = m_CopyMarketListPtr.size();
if ( 0 >= nCopyMarketListSize )
{
SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_DB_NO_SUCH_DATA, 101);
return RES_BREAK;
}
///////////////////////////////////////////////
// Áߺ¹ Á¤·Ä ¿äû¿©ºÎ È®ÀÎ
if ( pRMsg->SortingType == m_nLatelyMarketListSortingType )
{
SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, 100);
return RES_BREAK;
}
///////////////////////////////////////////////
// Á¤·Ä
switch (pRMsg->SortingType)
{
case MARKET_SORT_PRICE_UP: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_PRICE_UP()); break;
case MARKET_SORT_PRICE_DOWN: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_PRICE_DOWN()); break;
case MARKET_SORT_LEVEL_UP: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_LEVEL_UP()); break;
case MARKET_SORT_LEVEL_DOWN: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_LEVEL_DOWN()); break;
case MARKET_SORT_ENCHANT_UP: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_ENCHANT_UP()); break;
case MARKET_SORT_ENCHANT_DOWN: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_ENCHANT_DOWN()); break;
case MARKET_SORT_NAME_UP: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_NAME_UP()); break;
case MARKET_SORT_NAME_DOWN: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_NAME_DOWN()); break;
case MARKET_SORT_TIME_UP: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_TIME_UP()); break;
case MARKET_SORT_TIME_DOWN: sort(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_SORT_TIME_DOWN()); break;
default: SendErrorMessage(T_FC_MARKET_SORT_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, 101); return RES_BREAK;
}
m_nLatelyMarketListSortingType = pRMsg->SortingType;
///////////////////////////////////////////////
// Á¤·Ä°á°ú º¸³»±â
SendAddMessageType(T_FC_MARKET_SORT_HEADER);
MARKET_ITR itr = m_CopyMarketListPtr.begin();
for ( int i = 0 ; i < MARKET_VIEW_LIST_COUNT ; i++, itr++ )
{
if ( itr == m_CopyMarketListPtr.end() ) // Ç׸ñÀÌ 8°Ô ¹Ì¸¸À϶§ ÇØ´ç
{
break;
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_SORT_OK, T_FC_MARKET_SORT_OK, pSendOKMsg, pSendOKBuf);
MARKET_INFO tmMarket(*itr);
memcpy(&pSendOKMsg->MarketInfo, &tmMarket, sizeof(pSendOKMsg->MarketInfo));
SendAddData(pSendOKBuf, MSG_SIZE(MSG_FC_MARKET_SORT_OK));
}
INIT_MSG_WITH_BUFFER(MSG_FC_MARKET_SORT_DONE, T_FC_MARKET_SORT_DONE, pSendDoneMsg, pSendDoneBuf);
pSendDoneMsg->ItemCount = nCopyMarketListSize;
pSendDoneMsg->MaxPage = (nCopyMarketListSize / MARKET_VIEW_LIST_COUNT) + (0 == (nCopyMarketListSize % MARKET_VIEW_LIST_COUNT) ? 0 : 1);
pSendDoneMsg->CurrentPage = 1;
SendAddData(pSendDoneBuf, MSG_SIZE(MSG_FC_MARKET_SORT_DONE));
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_BUY_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP,101);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_MARKET_BUY_REQUEST,
MSG_FC_MARKET_BUY_REQUEST, pRMsg);
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND,102);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( MARKET_PACKET_RECV_TICK_BUY_PAGE > GetTickCount() - m_nLatelyMarketPacketRecvTick_BuyPage )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_INTERVAL_SYSTEM_SECOND,103);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_BuyPage = GetTickCount();
#ifdef SC_MARKET_NOT_USE_NORMAL_INFL // 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ )
if ( INFLUENCE_TYPE_NORMAL == IS_NORMAL_INFLUENCE_TYPE(m_character.InfluenceType) ) // ÀϹݼ¼·Â ÀÌ¿ëºÒ°¡
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_REQ_CHOOSE_INFLUENCE_TYPE,104);
return RES_BREAK;
}
#endif // End. 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ )
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// Ä«ÇÇÇÑ ¸®½ºÆ®¿¡ ÀÖ´ÂÁö È®ÀÎ
MARKET_ITR itr = find_if(m_CopyMarketListPtr.begin(), m_CopyMarketListPtr.end(), MARKET_LIST_MarketUID_Find_Object(pRMsg->MarketUID));
if(itr >= m_CopyMarketListPtr.end())
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP_ITEM, 105);
return RES_BREAK;
}
#ifdef SC_MARKET_NOT_USE_NORMAL_INFL // 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ )
// µ¿Àϼ¼·Â°£ °Å·¡ÀÎÁö È®ÀÎ
if( (*itr)->MarketItemInfl != m_character.InfluenceType )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_REQ_INFLUENCE_NOT_MATCHED,106);
return RES_BREAK;
}
#endif // End. 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ )
///////////////////////////////////////////////
// ±¸¸Å°¡ °¡´ÉÇÑ »óÅÂÀÎÁö È®ÀÎ
ATUM_DATE_TIME tmCurrentTime(TRUE);
if ( MARKET_STATE_SELL != (*itr)->MarketState || MARKET_SELLING_MINUTES < tmCurrentTime.GetTimeDiffTimeInMinutes((*itr)->RegistTime) )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP_ITEM, 107);
return RES_BREAK;
}
if ( MARKET_MONEY_TYPE_SPI == (*itr)->MoneyType )
{
ITEM_GENERAL *pItemSPI = m_ItemManager.GetFirstItemGeneralByItemNum(MONEY_ITEM_NUMBER, ITEM_IN_CHARACTER);
if ( NULL == pItemSPI )
{ // SPI ¾ÆÀÌÅÛÀÌ ¾øÀ» °æ¿ì Ãß°¡
m_ItemManager.InsertItemBaseByItemNum(MONEY_ITEM_NUMBER, 0, IUT_GENERAL);
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_NO_SUCH_ITEM_INFO, MONEY_ITEM_NUMBER);
return RES_BREAK;
}
///////////////////////////////////////////////
// º¸À¯ SPI·Î ±¸¸Å ±Ý¾× ºñ±³
if ( pItemSPI->CurrentCount < (*itr)->Price )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_NOT_ENOUGH_MONEY, pItemSPI->CurrentCount, (*itr)->Price, "SPI");
return RES_BREAK;
}
}
else if ( MARKET_MONEY_TYPE_WP == (*itr)->MoneyType )
{
///////////////////////////////////////////////
// º¸À¯ WP·Î ±¸¸Å ±Ý¾× ºñ±³
if ( m_character.WarPoint < (*itr)->Price )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_NOT_ENOUGH_MONEY, m_character.WarPoint, (*itr)->Price, "WP");
return RES_BREAK;
}
}
///////////////////////////////////////////////
// Ä«¿îÅÍºí ¾ÆÀÌÅÛÀÏ °æ¿ì ÃÖ´ë º¸À¯°¡´É ¼ö üũ
BOOL bIsCountableAndHaveItem = FALSE;
ITEM_GENERAL *pItemG = m_ItemManager.GetFirstItemGeneralByItemNum((*itr)->ItemNum, ITEM_IN_CHARACTER);
if ( NULL != pItemG )
{
//if ( IS_GENERAL_ITEM(pItemG->Kind) )
if ( IS_COUNTABLE_ITEM(pItemG->Kind) )
{
bIsCountableAndHaveItem = TRUE;
if ( MAX_ITEM_COUNTS < pItemG->CurrentCount + (*itr)->ItemCount )
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_MAX_ITEM_COUNTS_OVER);
return RES_BREAK;
}
}
}
else
{
///////////////////////////////////////////////
// Àκ¥Å丮 °ø°£È®ÀÎ
if (m_ItemManager.GetInventoryItemCounts() >= m_ItemManager.GetMaxInventoryCount())
{
SendErrorMessage(T_FC_MARKET_BUY_REQUEST, ERR_PROTOCOL_INVENTORY_FULL_ITEM, 0, m_ItemManager.GetMaxInventoryCount());
return RES_BREAK;
}
}
MARKET_INFO *pQParam = new MARKET_INFO((*itr));
ms_pFieldIOCP->m_pAtumDBManager->MakeAndEnqueueQuery(QT_Market_Buying, this, m_character.AccountUniqueNumber, pQParam, NULL, (INT64)bIsCountableAndHaveItem);
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_SELL_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_MARKET_SELL_REQUEST,
MSG_FC_MARKET_SELL_REQUEST, pRMsg);
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( MARKET_PACKET_RECV_TICK_SELL_PAGE > GetTickCount() - m_nLatelyMarketPacketRecvTick_SellPage )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_SellPage = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
#ifdef SC_MARKET_NOT_USE_NORMAL_INFL // 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ )
if ( INFLUENCE_TYPE_NORMAL == IS_NORMAL_INFLUENCE_TYPE(m_character.InfluenceType) )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_REQ_CHOOSE_INFLUENCE_TYPE);
return RES_BREAK;
}
#endif // End. 2014-06-17 by bckim, ¼¼·Â ºÒ±ÕÇü ( °Å·¡¼Ò µ¿Àϼ¼·Â°£¿¡¸¸ °Å·¡°¡ ÀÌ·ç¾îÁö°Ô ¼öÁ¤ )
///////////////////////////////////////////////
// µî·Ï °¡´É °¹¼ö¸¦ ÃʰúÇÏ´ÂÁö È®ÀÎ
if ( TRUE == m_ItemManager.IsExistPremiumCard() )
{
if ( (MARKET_SELL_ITEM_COUNT*2) <= m_nMarketRegistrationCount ) // ¸É¹ö½± À¯Àú´Â 2¹è 20°³
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_OVER_COUNT, m_nMarketRegistrationCount, 1);
return RES_BREAK;
}
}
else
{
if ( MARKET_SELL_ITEM_COUNT <= m_nMarketRegistrationCount ) // ÀÏ¹Ý À¯Àú´Â 10°³
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_OVER_COUNT, m_nMarketRegistrationCount, 0);
return RES_BREAK;
}
}
///////////////////////////////////////////////
// ÆÇ¸Å ÇÏ·Á´Â ¾ÆÀÌÅÛÀ» º¸À¯ÁßÀÎÁö È®ÀÎ
ITEM_GENERAL *pItemG = m_ItemManager.GetItemGeneralByUID(pRMsg->ItemUID, ITEM_IN_CHARACTER);
if ( NULL == pItemG )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_NO_SUCH_ITEM, pRMsg->ItemUID);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡°¡ °¡´ÉÇÑ ¾ÆÀÌÅÛÀÎÁö üũ
// 2013-12-03 by bckim, Àӽà ÁÖ¼®
/*
if ( COMPARE_BIT_FLAG(pItemG->ItemInfo->ItemAttribute, ITEM_ATTR_NO_TRANSFER|ITEM_ATTR_KILL_MARK_ITEM|ITEM_ATTR_ACCOUNT_POSSESSION)
|| POS_INVALID_POSITION >= pItemG->ItemWindowIndex )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_ITEM_CANNOT_TRANSFER, pItemG->ItemNum, pItemG->ItemWindowIndex);
return RES_BREAK;
}
*/
// End. 2013-12-03 by bckim, Àӽà ÁÖ¼®
///////////////////////////////////////////////
// ÀÌ¹Ì »ç¿ëÇÑ ¾ÆÀÌÅÛÀÎÁö üũ
if ( ITEMKIND_ACCESSORY_TIMELIMIT == pItemG->Kind && pItemG->UsingTimeStamp != ITEM_NOT_USING )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_ALREADY_USE_ITEM);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÀåÂøÁßÀÎ ¾ÆÀÌÅÛÀÎÁö È®ÀÎ
if ( WEAR_ATTACHED == pItemG->Wear )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_ATTACHED_ITEM, 101);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÇ¸Å ÇÏ·Á´Â ÈÆó ŸÀÔÀÌ ¿Ã¹Ù¸¥Áö È®ÀÎ
if ( MARKET_MONEY_TYPE_SPI != pRMsg->MoneyType && MARKET_MONEY_TYPE_WP != pRMsg->MoneyType )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, pRMsg->MoneyType, 0, "MoneyType");
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÇ¸Å±Ý¾× È®ÀÎ
if ( FALSE == IS_IN_RANGE(1, pRMsg->Price, MAX_ITEM_COUNTS) )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, pRMsg->Price, 0, "Price");
return RES_BREAK;
}
BOOL bIsCountableItem = FALSE;
if ( TRUE == IS_COUNTABLE_ITEM(pItemG->Kind))
{
bIsCountableItem = TRUE;
///////////////////////////////////////////////
// Ä«¿îÅÍºí ¾ÆÀÌÅÛÀÏ °æ¿ì ÆÇ¸Å¼ö·® È®ÀÎ
if ( FALSE == IS_IN_RANGE(1, pRMsg->Count, pItemG->CurrentCount) )
{
SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, pRMsg->Count, pItemG->CurrentCount, "CountableCount");
return RES_BREAK;
}
}
// else
// {
// ///////////////////////////////////////////////
// // Ä«¿îÅÍºí ¾ÆÀÌÅÛÀÌ ¾Æ´Ò °æ¿ì ÆÇ¸Å¼ö·® È®ÀÎ
// if ( 1 != pRMsg->Count )
// {
// SendErrorMessage(T_FC_MARKET_SELL_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, pRMsg->Count, pItemG->CurrentCount, "Count");
// return RES_BREAK;
// }
// }
///////////////////////////////////////////////
// µî·Ï °¡´É °¹¼ö Áõ°¡
m_nMarketRegistrationCount++;
MSG_FC_MARKET_SELL_REQUEST *pQParam = new MSG_FC_MARKET_SELL_REQUEST;
MEMSET_ZERO(pQParam, sizeof(MSG_FC_MARKET_SELL_REQUEST));
memcpy(pQParam, pRMsg, sizeof(MSG_FC_MARKET_SELL_REQUEST));
ms_pFieldIOCP->m_pAtumDBManager->MakeAndEnqueueQuery(QT_Market_ItemRegistration, this, m_character.AccountUniqueNumber, pQParam, NULL, (INT64)GetMarketItemKindByOriginItemKind(*pItemG->ItemInfo), (INT64)bIsCountableItem);
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_GET_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_MARKET_GET_REQUEST,
MSG_FC_MARKET_GET_REQUEST, pRMsg);
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( MARKET_PACKET_RECV_TICK_GET_REQUEST > GetTickCount() - m_nLatelyMarketPacketRecvTick_GetRequeste )
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_GetRequeste = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ¿øº» ¸®½ºÆ®¸¦ ÅëÇØ ÆÇ¸ÅÇöȲ¿¡ ÀÖ´Â Ç׸ñÀÎÁö È®ÀÎ
MARKET_INFO *pMyKarKetItem = ms_pFieldIOCP->m_pMarketDataManager->GetpMarketInfo(pRMsg->MarketUID);
if ( NULL == pMyKarKetItem )
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_NO_SUCH_ITEM);
return RES_BREAK;
}
if ( m_character.CharacterUniqueNumber != pMyKarKetItem->CharacterUID ) // ³» ¼ÒÀ¯°¡ ¸Â´ÂÁö È®ÀÎ
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, 100);
return RES_BREAK;
}
if ( MARKET_STATE_DELETE == pMyKarKetItem->MarketState ) // ȸ¼ö °¡´ÉÇÑ »óÅÂÀÎÁö È®ÀÎ
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, 101);
return RES_BREAK;
}
///////////////////////////////////////////////
// µ·À» ȸ¼öÇÒ¶§ ÃÖ´ëÄ¡ È®ÀÎ
if ( MARKET_STATE_SELL_DONE == pMyKarKetItem->MarketState )
{
if ( MARKET_MONEY_TYPE_SPI == pMyKarKetItem->MoneyType )
{
ITEM_GENERAL *pItemSPI = m_ItemManager.GetFirstItemGeneralByItemNum(MONEY_ITEM_NUMBER, ITEM_IN_CHARACTER);
if ( NULL != pItemSPI )
{ // 2014-07-24 by bckim, °Å·¡¼Ò ±Ý¾×ȸ¼ö µ¿±âÈ ¹®Á¦ º¸¿Ï
//if ( MAX_ITEM_COUNTS < (pItemSPI->CurrentCount+pMyKarKetItem->Price-GetMarketSellChargeSPI(pMyKarKetItem->Price)) )
if ( MAX_ITEM_COUNTS < (INT64)(pItemSPI->CurrentCount)+(INT64)(pMyKarKetItem->Price)-(INT64)(GetMarketSellChargeSPI(pMyKarKetItem->Price)) )
{
// 2014-07-24 by bckim, °Å·¡¼Ò ±Ý¾×ȸ¼ö µ¿±âÈ ¹®Á¦ º¸¿Ï
//SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_MAX_ITEM_COUNTS_OVER, pItemSPI->CurrentCount, pMyKarKetItem->Price, "SPI");
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_NOTIFY_MAX_ITEM_COUNTS_OVER, pItemSPI->CurrentCount, pMyKarKetItem->Price, "SPI");
return RES_BREAK;
}
}
}
else if ( MARKET_MONEY_TYPE_WP == pMyKarKetItem->MoneyType )
{ // 2014-07-24 by bckim, °Å·¡¼Ò ±Ý¾×ȸ¼ö µ¿±âÈ ¹®Á¦ º¸¿Ï
//if ( MAX_ITEM_COUNTS < (m_character.WarPoint+pMyKarKetItem->Price-GetMarketSellChargeWP(pMyKarKetItem->Price)) )
if ( MAX_ITEM_COUNTS < (INT64)(m_character.WarPoint)+(INT64)(pMyKarKetItem->Price)-(INT64)(GetMarketSellChargeWP(pMyKarKetItem->Price)) )
{
// 2014-07-24 by bckim, °Å·¡¼Ò ±Ý¾×ȸ¼ö µ¿±âÈ ¹®Á¦ º¸¿Ï
//SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_MAX_ITEM_COUNTS_OVER, m_character.WarPoint, pMyKarKetItem->Price, "WP");
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_NOTIFY_MAX_ITEM_COUNTS_OVER, m_character.WarPoint, pMyKarKetItem->Price, "WP");
return RES_BREAK;
}
}
}
///////////////////////////////////////////////
// Ä«¿îÅÍºí ¾ÆÀÌÅÛÀÏ °æ¿ì ÃÖ´ë º¸À¯°¡´É ¼ö üũ
BOOL bIsCountableAndHaveItem = FALSE;
ITEM_GENERAL *pItemG = m_ItemManager.GetFirstItemGeneralByItemNum(pMyKarKetItem->ItemNum, ITEM_IN_CHARACTER);
if ( NULL != pItemG )
{
if ( IS_COUNTABLE_ITEM(pItemG->Kind) ) // 2014-05-09 by bckim, °Å·¡¼Ò ¾ÆÀÌÅÛ º¹»ç¹ö±× ¼öÁ¤
{
bIsCountableAndHaveItem = TRUE;
if ( MAX_ITEM_COUNTS < pItemG->CurrentCount + pMyKarKetItem->ItemCount )
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_MAX_ITEM_COUNTS_OVER);
return RES_BREAK;
}
}
}
else
{
///////////////////////////////////////////////
// Àκ¥Å丮 °ø°£È®ÀÎ
if ( MARKET_STATE_SELL_DONE != pMyKarKetItem->MarketState ) // ÆÇ¸ÅµÈ ¹°Ç°ÀÇ ±Ý¾×ȸ¼öÀÏ‹š´Â Àκ¥Å丮 üũ ¾ÈÇÔ.
{
if (m_ItemManager.GetInventoryItemCounts() >= m_ItemManager.GetMaxInventoryCount())
{
SendErrorMessage(T_FC_MARKET_GET_REQUEST, ERR_PROTOCOL_INVENTORY_FULL_ITEM, 0, m_ItemManager.GetMaxInventoryCount());
return RES_BREAK;
}
}
}
///////////////////////////////////////////////
// µî·Ï °¡´É °¹¼ö °¨¼Ò
m_nMarketRegistrationCount = max(0, m_nMarketRegistrationCount-1);
MSG_FC_MARKET_GET_REQUEST *pQParam = new MSG_FC_MARKET_GET_REQUEST;
MEMSET_ZERO(pQParam, sizeof(MSG_FC_MARKET_GET_REQUEST));
memcpy(pQParam, pRMsg, sizeof(MSG_FC_MARKET_GET_REQUEST));
ms_pFieldIOCP->m_pAtumDBManager->MakeAndEnqueueQuery(QT_Market_GetTradeItem, this, m_character.AccountUniqueNumber, pQParam, NULL, (INT64)bIsCountableAndHaveItem);
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_MARKET_MY_LIST_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pMarketDataManager )
{
SendErrorMessage(T_FC_MARKET_MY_LIST_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_MARKET_MY_LIST_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// °Å·¡¼Ò °ü·Ã 2ÃÊ ÅÒ
if ( MARKET_PACKET_RECV_TICK_MY_LIST_PAGE > GetTickCount() - m_nLatelyMarketPacketRecvTick_MyListPage )
{
SendErrorMessage(T_FC_MARKET_MY_LIST_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_MyListPage = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_MARKET_MY_LIST_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_MARKET_MY_LIST_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
ms_pFieldIOCP->m_pAtumDBManager->MakeAndEnqueueQuery(QT_Market_GetSaleList, this, m_character.AccountUniqueNumber, NULL);
return RES_RETURN_TRUE;
}
// end 2013-11-25 by jhseol&bckim, °Å·¡¼Ò - ÆÐŶ ¸®½Ãºê ÇÔ¼ö ±¸Çö
// 2014-01-03 by jhseol&bckim, ÆÄ±«°æ¸ÅÀå - ÆÐŶ ¸®½Ãºê ÇÔ¼ö¼±¾ð
ProcessResult CFieldIOCPSocket::Process_FC_DESTROY_AUCTION_BASE_INFO_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pDestroyAuctionManager)
{
SendErrorMessage(T_FC_DESTROY_AUCTION_BASE_INFO_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_DESTROY_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_BASE_INFO_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÄ±«°æ¸Å°¡ ÁøÇàÁßÀÎÁö üũ
if ( FALSE == ms_pFieldIOCP->m_bDestroyAuctionInProgress || TRUE == ms_pFieldIOCP->m_pDestroyAuctionManager->GetDestroyAuctionListPtr()->empty() )
{ // 2014-07-07 by bckim, ÆÄ±«°æ¸Å°¡ ½ÃÀ۵Ǿ µî·ÏµÈ ¹°Ç°ÀÌ ¾øÀ¸¸é ½ÃÀÛ ¸Þ¼¼Áö¸¦ º¸³»Áö ¾ÊÀ½.
// ÇöÀç °æ¸ÅÁøÇàÁßÀÌ ¾Æ´Ï°Å³ª µî·ÏµÈ ¹°Ç°ÀÌ ¾øÀ»¶§,
SendErrorMessage(T_FC_DESTROY_AUCTION_BASE_INFO_REQUEST, ERR_COUNTDOWN_NOT_ENOUGH_TIME);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå °ü·Ã 0.2ÃÊ ÅÒ
if ( DESTROY_AUCTION_PACKET_RECV_TICK > GetTickCount() - m_nLatelyMarketPacketRecvTick_GetRequeste )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_BASE_INFO_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_GetRequeste = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_BASE_INFO_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_BASE_INFO_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// °æ¸Å¹°Ç° º¸³»±â
// SendAddMessageType(T_FC_DESTROY_AUCTION_BASE_INFO_HEADER);
INIT_MSG_WITH_BUFFER(MSG_FC_DESTROY_AUCTION_BASE_INFO_HEADER, T_FC_DESTROY_AUCTION_BASE_INFO_HEADER, pSendHeaderMsg, pSendHeaderBuf);
pSendHeaderMsg->DAuctionEndTime = ms_pFieldIOCP->m_pDestroyAuctionManager->GetDestroyAuctionEndTime();
SendAddData(pSendHeaderBuf, MSG_SIZE(MSG_FC_DESTROY_AUCTION_BASE_INFO_HEADER));
DESTROY_AUCTION_ITR itr = ms_pFieldIOCP->m_pDestroyAuctionManager->GetDestroyAuctionListPtr()->begin();
while( itr != ms_pFieldIOCP->m_pDestroyAuctionManager->GetDestroyAuctionListPtr()->end() )
{
INIT_MSG_WITH_BUFFER(MSG_FC_DESTROY_AUCTION_BASE_INFO_OK, T_FC_DESTROY_AUCTION_BASE_INFO_OK, pSendOKMsg, pSendOKBuf);
DESTROY_AUCTION_INFO tmDAuctionInfo(*itr);
memcpy(&pSendOKMsg->DAuctionInfo, &tmDAuctionInfo, sizeof(pSendOKMsg->DAuctionInfo));
SendAddData(pSendOKBuf, MSG_SIZE(MSG_FC_DESTROY_AUCTION_BASE_INFO_OK));
itr++;
}
SendAddMessageType(T_FC_DESTROY_AUCTION_BASE_INFO_DONE);
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_DESTROY_AUCTION_TENDER_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pDestroyAuctionManager)
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_DESTROY_AUCTION_TENDER_REQUEST,
MSG_FC_DESTROY_AUCTION_TENDER_REQUEST, pRMsg);
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_DESTROY_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÄ±«°æ¸Å°¡ ÁøÇàÁßÀÎÁö üũ
if ( FALSE == ms_pFieldIOCP->m_bDestroyAuctionInProgress || TRUE == ms_pFieldIOCP->m_pDestroyAuctionManager->GetDestroyAuctionListPtr()->empty() )
{ // 2014-07-07 by bckim, ÆÄ±«°æ¸Å°¡ ½ÃÀ۵Ǿ µî·ÏµÈ ¹°Ç°ÀÌ ¾øÀ¸¸é ½ÃÀÛ ¸Þ¼¼Áö¸¦ º¸³»Áö ¾ÊÀ½.
// ÇöÀç °æ¸ÅÁøÇàÁßÀÌ ¾Æ´Ï°Å³ª µî·ÏµÈ ¹°Ç°ÀÌ ¾øÀ»¶§,
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_COUNTDOWN_NOT_ENOUGH_TIME);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå °ü·Ã 0.2ÃÊ ÅÒ
if ( DESTROY_AUCTION_PACKET_RECV_TICK > GetTickCount() - m_nLatelyMarketPacketRecvTick_GetRequeste )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_GetRequeste = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ÀÔÂû°¡´ÉÇÑ ±Ý¾×À» ¼ÒÀ¯ÁßÀÎÁö È®ÀÎ
ITEM_GENERAL *pItemSPI = m_ItemManager.GetFirstItemGeneralByItemNum(MONEY_ITEM_NUMBER, ITEM_IN_CHARACTER);
if ( NULL == pItemSPI )
{ // SPI ¾ÆÀÌÅÛÀÌ ¾øÀ» °æ¿ì Ãß°¡
m_ItemManager.InsertItemBaseByItemNum(MONEY_ITEM_NUMBER, 0, IUT_GENERAL);
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_PROTOCOL_NO_SUCH_ITEM_INFO, MONEY_ITEM_NUMBER);
return RES_BREAK;
}
if ( pItemSPI->CurrentCount < pRMsg->TenderPrice )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_PROTOCOL_NOT_ENOUGH_MONEY, pItemSPI->CurrentCount, pRMsg->TenderPrice, "SPI");
return RES_BREAK;
}
///////////////////////////////////////////////
// ÀÔÂûÁ¶°Ç È®ÀÎ 1. ÀÔÂû±Ç
// 2014-07-04 by bckim, ¹«·áÁö±Þ ÀÔÂû±Ç ¼Ó¼º º¯°æ
//ITEM_GENERAL *pItemTenderItem = m_ItemManager.GetFirstItemGeneralByItemNum(DESTROY_AUCTION_TENDET_ITEM_NUM_LIMITED, ITEM_IN_CHARACTER);
ITEM_GENERAL *pItemTenderItem = m_ItemManager.GetItemGeneralByItemNumFirstCreateTimeInCharacter(DESTROY_AUCTION_TENDET_ITEM_NUM_LIMITED, ITEM_IN_CHARACTER);
// End. 2014-07-04 by bckim, ¹«·áÁö±Þ ÀÔÂû±Ç ¼Ó¼º º¯°æ
if ( NULL == pItemTenderItem )
{ // ¿ì¼± ±â°£Á¦ ÀÔÂû±ÇÀÌ ÀÖ´ÂÁö È®ÀÎ ¾øÀ¸¸é ¹«Á¦ÇÑ ÀÔÂû±Ç È®ÀÎ
pItemTenderItem = m_ItemManager.GetFirstItemGeneralByItemNum(DESTROY_AUCTION_TENDET_ITEM_NUM_UNLIMITED, ITEM_IN_CHARACTER);
if ( NULL == pItemTenderItem )
{
//SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_PROTOCOL_NO_SUCH_ITEM, DESTROY_AUCTION_TENDET_ITEM_NUM_LIMITED, DESTROY_AUCTION_TENDET_ITEM_NUM_UNLIMITED, "BiddingRights");
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_CANNOT_BUY_ITEM,DESTROY_AUCTION_TENDET_ITEM_NUM_LIMITED, DESTROY_AUCTION_TENDET_ITEM_NUM_UNLIMITED, "BiddingRights");
// #if defined(TEST140)
// SendString128(STRING_128_USER_POPUP, "Àӽà °æ¸ÅÀÔÂû±Ç [%d]¶Ç´Â [%d]ÀÌ ÇÊ¿äÇÕ´Ï´Ù.", DESTROY_AUCTION_TENDET_ITEM_NUM_LIMITED, DESTROY_AUCTION_TENDET_ITEM_NUM_UNLIMITED);
// #endif
return RES_BREAK;
}
}
///////////////////////////////////////////////
// ÀÔÂûÁ¶°Ç È®ÀÎ 2. °æ¸Å¹°Ç° »óÅÂ
mt_auto_lock mtA(ms_pFieldIOCP->m_pDestroyAuctionManager->GetDestroyAuctionListPtr());
DESTROY_AUCTION_INFO *pDAuctionInfo = ms_pFieldIOCP->m_pDestroyAuctionManager->GetpDestroyAuctionInfo(pRMsg->DAuctionUID);
if ( NULL == pDAuctionInfo )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_DB_NO_SUCH_DATA, pRMsg->DAuctionUID);
return RES_BREAK;
}
if ( pDAuctionInfo->CharacterUID == m_character.CharacterUniqueNumber ) // ÇöÀç ÀÚ½ÅÀÌ ÃÖ°í ÀÔÂûÀÚ ÀÌ´Ù. ÃʰúÀÔÂû ±ÝÁö
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_PROTOCOL_NO_SUCH_REQUEST_TYPE, pDAuctionInfo->CharacterUID, m_character.CharacterUniqueNumber, "CUID");
return RES_BREAK;
}
if ( pDAuctionInfo->Price >= pRMsg->TenderPrice ) // »óȸ ÀÔÂûÀÚ°¡ ÀÖ´Ù.
{
SendErrorMessage(T_FC_DESTROY_AUCTION_TENDER_REQUEST, ERR_PROTOCOL_TRADE_ERROR, pDAuctionInfo->Price, pRMsg->TenderPrice, "Price");
return RES_BREAK;
}
///////////////////////////////////////////////
// ÀÔÂû Á¤º¸ º¯°æ
ms_pFieldIOCP->m_pDestroyAuctionManager->UpdateDestroyAuctionTenderInfo(pRMsg);
///////////////////////////////////////////////
// ÀÔÂû ·Î±× ³²±â±â
INIT_MSG_WITH_BUFFER(MSG_FL_LOG_DESTROY_AUCTION_TENDER, T_FL_LOG_DESTROY_AUCTION_TENDER, pLogMsg, SendLogBuf);
memcpy(&pLogMsg->DAuctionInfo, pDAuctionInfo, sizeof(DESTROY_AUCTION_INFO));
pLogMsg->DAuctionInfo.AccountUID = m_character.AccountUniqueNumber;
pLogMsg->DAuctionInfo.CharacterUID = m_character.CharacterUniqueNumber;
pLogMsg->DAuctionInfo.Price = pRMsg->TenderPrice;
g_pFieldGlobal->SendLogFieldServer2LogServer(SendLogBuf, MSG_SIZE(MSG_FL_LOG_DESTROY_AUCTION_TENDER));
mtA.auto_unlock_cancel();
///////////////////////////////////////////////
// ÀÔÂû±Ç Â÷°¨
// 2014-07-04 by bckim, ¹«·áÁö±Þ ÀÔÂû±Ç ¼Ó¼º º¯°æ
//m_ItemManager.UpdateItemCountByPointer(pItemTenderItem, -1, IUT_AUCTION);
if ( DESTROY_AUCTION_TENDET_ITEM_NUM_LIMITED == pItemTenderItem->ItemNum ) // Ä«¿îÅÍºí ¾ÆÀÌÅÛÀÌ ¾Æ´Ô. (ÀÏ¹Ý ÆÄ±«¾ÆÀÌÅÛ )
{
m_ItemManager.DeleteItemFromCharacterByPointer(pItemTenderItem,IUT_USE_ITEM);
}
else // Ä«¿îÅÍºí ¾ÆÀÌÅÛ ( ÇÁ¸®¹Ì¾ö ¾ÆÀÌÅÛ )
{
m_ItemManager.UpdateItemCountByPointer(pItemTenderItem, -1, IUT_AUCTION);
}
// End. 2014-07-04 by bckim, ¹«·áÁö±Þ ÀÔÂû±Ç ¼Ó¼º º¯°æ
///////////////////////////////////////////////
// ÀÔÂû Á¤º¸ ÆÄ±«°æ¸ÅÀå ÀÌ¿ëÁßÀÎ ¸ðµç À¯Àú¿¡°Ô ½Ç½Ã°£ Àü¼Û
mt_auto_lock mtB(&ms_pFieldIOCP->m_mapEnterDestroyAuctionBuildingUserSocketList);
// Àӽà °ª È®ÀÎ
int tmsize = ms_pFieldIOCP->m_mapEnterDestroyAuctionBuildingUserSocketList.size();
g_pFieldGlobal->WriteSystemLogEX(TRUE, "ÆÄ±«Á¤º¸ÇöȲ Àü¼Û´ë»ó »çÀÌÁî (%d)\r\n",tmsize);
for(mtmapUID2FieldIOCPSocket::iterator itr = ms_pFieldIOCP->m_mapEnterDestroyAuctionBuildingUserSocketList.begin() ; itr != ms_pFieldIOCP->m_mapEnterDestroyAuctionBuildingUserSocketList.end() ;)
{
UID32_t temp = itr->first;
CFieldIOCPSocket *tmp = itr->second;
if ( NULL != itr->second && TRUE == itr->second->IsValidCharacter(FALSE))
{
INIT_MSG_WITH_BUFFER(MSG_FC_DESTROY_AUCTION_TENDER_OK, T_FC_DESTROY_AUCTION_TENDER_OK, pSendOKMsg, pSendOKBuf);
memcpy(pSendOKMsg, pRMsg, sizeof(MSG_FC_DESTROY_AUCTION_TENDER_OK));
itr->second->SendAddData(pSendOKBuf, MSG_SIZE(MSG_FC_DESTROY_AUCTION_TENDER_OK));
// Àӽà °ª È®ÀÎ
g_pFieldGlobal->WriteSystemLogEX(TRUE, "ÆÄ±«Á¤º¸ÇöȲ ¸®½ºÆ® (%s)\r\n",itr->second->m_character.CharacterName);
g_pFieldGlobal->WriteSystemLogEX(TRUE, "ÆÄ±«Á¤º¸ÇöȲ ¸®½ºÆ® (%d)\r\n",itr->first);
}
if(FALSE == itr->second->IsValidCharacter(FALSE))
{
// Àӽà °ª È®ÀÎ
g_pFieldGlobal->WriteSystemLogEX(TRUE, "ÆÄ±«Á¤º¸ÇöȲ IsValidCharacter (%s)\r\n",itr->second->m_character.CharacterName);
itr = ms_pFieldIOCP->m_mapEnterDestroyAuctionBuildingUserSocketList.erase(itr);
// Àӽà °ª È®ÀÎ
int tmsize2 = ms_pFieldIOCP->m_mapEnterDestroyAuctionBuildingUserSocketList.size();
g_pFieldGlobal->WriteSystemLogEX(TRUE, "ÆÄ±«Á¤º¸ÇöȲ Àü¼Û´ë»ó »çÀÌÁî (%d)\r\n",tmsize2);
continue;
}
++itr;
}
///////////////////////////////////////////////
// º¯°æµÈ ÀÔÂû Á¤º¸ DBÀúÀå
MSG_FC_DESTROY_AUCTION_TENDER_REQUEST *pQParam = new MSG_FC_DESTROY_AUCTION_TENDER_REQUEST;
MEMSET_ZERO(pQParam, sizeof(MSG_FC_DESTROY_AUCTION_TENDER_REQUEST));
memcpy(pQParam, pRMsg, sizeof(MSG_FC_DESTROY_AUCTION_TENDER_REQUEST));
ms_pFieldIOCP->m_pAtumDBManager->MakeAndEnqueueQuery(QT_DestroyAuction_UpdateBiddingInfo, this, m_character.AccountUniqueNumber, pQParam);
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_DESTROY_AUCTION_GET_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pDestroyAuctionManager)
{
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_DESTROY_AUCTION_GET_REQUEST,
MSG_FC_DESTROY_AUCTION_GET_REQUEST, pRMsg);
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_DESTROY_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
// ///////////////////////////////////////////////
// // ÆÄ±«°æ¸Å°¡ ÁøÇàÁßÀÎÁö üũ
// if ( FALSE == ms_pFieldIOCP->m_bDestroyAuctionInProgress )
// {
// SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_COUNTDOWN_NOT_ENOUGH_TIME);
// return RES_BREAK;
// }
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå °ü·Ã 0.2ÃÊ ÅÒ
if ( DESTROY_AUCTION_PACKET_RECV_TICK > GetTickCount() - m_nLatelyMarketPacketRecvTick_GetRequeste )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_GetRequeste = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ȸ¼ö°¡ °¡´ÉÇÑ »óÅÂÀÎÁö È®ÀÎ
#if defined(TEST140)
#else
ATUM_DATE_TIME tmCurrentTime(TRUE);
tmCurrentTime.AddDateTime(0,0,0,-(DESTROY_AUCTION_GET_POSSIBLE_TIME_HOUR),0,0);
if ( tmCurrentTime > pRMsg->DAuctionGetPossibleTime || AUCTION_ITEM_STATE_END != pRMsg->DAuctionStatus )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_PROTOCOL_TIME_LIMIT_ERROR, pRMsg->DAuctionStatus);
return RES_BREAK;
}
#endif
///////////////////////////////////////////////
// ³«Âû±Ý¾× ¼ÒÁö¿©ºÎ È®ÀÎ
ITEM_GENERAL *pItemSPI = m_ItemManager.GetFirstItemGeneralByItemNum(MONEY_ITEM_NUMBER, ITEM_IN_CHARACTER);
if ( NULL == pItemSPI )
{ // SPI ¾ÆÀÌÅÛÀÌ ¾øÀ» °æ¿ì Ãß°¡
m_ItemManager.InsertItemBaseByItemNum(MONEY_ITEM_NUMBER, 0, IUT_GENERAL);
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_PROTOCOL_NO_SUCH_ITEM_INFO, MONEY_ITEM_NUMBER);
return RES_BREAK;
}
if ( pItemSPI->CurrentCount < pRMsg->Price )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_GET_REQUEST, ERR_PROTOCOL_NOT_ENOUGH_MONEY, pItemSPI->CurrentCount, pRMsg->Price, "SPI");
return RES_BREAK;
}
///////////////////////////////////////////////
// DB·Î ¾ÆÅÛ È¸¼ö ¿äûÇϱâ
MSG_FC_DESTROY_AUCTION_GET_REQUEST *pQParam = new MSG_FC_DESTROY_AUCTION_GET_REQUEST;
MEMSET_ZERO(pQParam, sizeof(MSG_FC_DESTROY_AUCTION_GET_REQUEST));
memcpy(pQParam, pRMsg, sizeof(MSG_FC_DESTROY_AUCTION_GET_REQUEST));
ms_pFieldIOCP->m_pAtumDBManager->MakeAndEnqueueQuery(QT_DestroyAuction_GetAuctionItem, this, m_character.AccountUniqueNumber, pQParam);
return RES_RETURN_TRUE;
}
ProcessResult CFieldIOCPSocket::Process_FC_DESTROY_AUCTION_MY_LIST_REQUEST(const char* pPacket, int nLength, int &nBytesUsed)
{
///////////////////////////////////////////////
// ¸Å´ÏÀú Æ÷ÀÎÅÍ È®ÀÎ
if ( NULL == ms_pFieldIOCP->m_pDestroyAuctionManager)
{
SendErrorMessage(T_FC_DESTROY_AUCTION_MY_LIST_REQUEST, ERR_PROTOCOL_NO_SUCH_SHOP);
return RES_BREAK;
}
// DECLARE_MESSAGE_AND_CHECK_SIZE_SERVER(pPacket, nLength, nBytesUsed, T_FC_DESTROY_AUCTION_MY_LIST_REQUEST,
// MSG_FC_DESTROY_AUCTION_MY_LIST_REQUEST, pRMsg);
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå ÀÌ¿ëÁßÀÎÁö üũ
if ( NULL == m_pCurrentBuildingNPC || BUILDINGKIND_DESTROY_AUCTION != m_pCurrentBuildingNPC->BuildingKind )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_MY_LIST_REQUEST, ERR_COMMON_INVALID_BUILDINGKIND);
return RES_BREAK;
}
// ///////////////////////////////////////////////
// // ÆÄ±«°æ¸Å°¡ ÁøÇàÁßÀÎÁö üũ
// if ( FALSE == ms_pFieldIOCP->m_bDestroyAuctionInProgress )
// {
// SendErrorMessage(T_FC_DESTROY_AUCTION_MY_LIST_REQUEST, ERR_COUNTDOWN_NOT_ENOUGH_TIME);
// return RES_BREAK;
// }
///////////////////////////////////////////////
// ÆÄ±«°æ¸ÅÀå °ü·Ã 0.2ÃÊ ÅÒ
if ( DESTROY_AUCTION_PACKET_RECV_TICK > GetTickCount() - m_nLatelyMarketPacketRecvTick_GetRequeste )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_MY_LIST_REQUEST, ERR_INTERVAL_SYSTEM_SECOND);
return RES_BREAK;
}
m_nLatelyMarketPacketRecvTick_GetRequeste = GetTickCount();
///////////////////////////////////////////////
// ¾Æ·¹³ª ¼¹ö üũ
if ( TRUE == g_pFieldGlobal->IsArenaServer() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_MY_LIST_REQUEST, ERR_CANNOT_USE_ARENASERVER);
return RES_BREAK;
}
///////////////////////////////////////////////
// ij¸¯ÅÍ À¯È¿¼º üũ
if ( FALSE == IsValidCharacter() )
{
SendErrorMessage(T_FC_DESTROY_AUCTION_MY_LIST_REQUEST, ERR_INVALID_CHARACTER);
return RES_BREAK;
}
///////////////////////////////////////////////
// DB·Î ÀÔÂûÇöȲ ¿äûÇϱâ
ms_pFieldIOCP->m_pAtumDBManager->MakeAndEnqueueQuery(QT_DestroyAuction_GetBiddingInfo, this, m_character.AccountUniqueNumber, NULL);
return RES_RETURN_TRUE;
}
// end 2014-01-03 by jhseol&bckim, ÆÄ±«°æ¸ÅÀå - ÆÐŶ ¸®½Ãºê ÇÔ¼ö¼±¾ð
// 2014-01-28 by jhseol, ½Å±Ô Äù½ºÆ® ½ºÅ©¸³Æ® Ãß°¡ - ¾ÆÀÌÅÛ »ç¿ë È®ÀÎ
void CFieldIOCPSocket::CheckQuestUseItem(ItemNum_t i_nUseItemNum)
{
mt_auto_lock mqLock(&m_mapQuest); // lock m_mapQuest
mtmapQuestIndex2FieldCharacterQuest::iterator itrQuest= m_mapQuest.begin();
for(; itrQuest != m_mapQuest.end(); itrQuest++)
{
CFieldCharacterQuest *pFCharQuest = &itrQuest->second;
if (pFCharQuest->QuestState == QUEST_STATE_IN_PROGRESS)
{
CQuest *pQuestInfo = pFCharQuest->GetQuestInfo();
if(pQuestInfo)
{
MSG_FC_QUEST_REQUEST_SUCCESS tmQuest;
MEMSET_ZERO(&tmQuest, sizeof(MSG_FC_QUEST_REQUEST_SUCCESS));
tmQuest.QuestIndex = pQuestInfo->QuestIndex;
this->CheckQuestRequestSuccessAndSendResult(pFCharQuest, &tmQuest, FALSE, 0, 0, 0, FALSE, FALSE, i_nUseItemNum);
break; // 2005-08-17 by cmkwon, Äù½ºÆ®¸¦ Çϳª¸¸ üũÇÏ°í ºüÁ® ³ª°£´Ù
}
}
}
}
// end 2014-01-28 by jhseol, ½Å±Ô Äù½ºÆ® ½ºÅ©¸³Æ® Ãß°¡ - ¾ÆÀÌÅÛ »ç¿ë È®ÀÎ
TABLE SQL by