#include "Stdafx.h" #include "DNGuildWare.h" #include "DNGuildVillage.h" #include "DNUserSession.h" #include "DNGameDataManager.h" #include "DNDBConnection.h" #include "DNDBConnectionManager.h" #include "DNMasterConnection.h" #include "DNAuthManager.h" #include "Timeset.h" extern TVillageConfig g_Config; extern CDNDBConnectionManager* g_pDBConnectionManager; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////// PUBLIC FUNCTION ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CDNGuildWare::CDNGuildWare() { Reset(); } CDNGuildWare::~CDNGuildWare() { Reset(); } void CDNGuildWare::Open(CDNGuildVillage* pGuildVillage, const TAGetGuildWareInfo* pPacket) { // DB°´Ã¼ ¾ò¾î¿À±â if(!m_pDBCon) m_pDBCon = g_pDBConnectionManager->GetDBConnection( m_cDBThreadID ); // »óÀ§ °´Ã¼ °ü¸® m_GuildOwner = pGuildVillage; // â°í ¾ÆÀÌÅÛ ¸®½ºÆ® ÀúÀå(½Ã¸®¾óº°·Î ÀúÀåÇÑ´Ù) m_MapWareItem.clear(); INT64 nSerial = 0; for(int i=0; icItemListCount; i++) { nSerial = pPacket->ItemList[i].Item.nSerial; m_MapWareItem [nSerial] = pPacket->ItemList[i]; } // ½½·Ô¹öÁ¯ ÃʱâÈ­ UpdateVersionDate(); // ÃֽŠ¿þ¾î½½·Ô ¸®½ºÆ®¸¦ ¸¶½ºÅ͸¦ ÅëÇØ °¢ ºô¸®Áö¼­¹ö¿¡ ¿äûÇÑ´Ù. g_pMasterConnection->SendGuildWareInfo(m_GuildOwner->GetUID()); } void CDNGuildWare::ReportWareSlot() { // â°í ¸®½ºÆ®¸¦ DB¿¡ ÀúÀåÇÑ´Ù. if(m_pDBCon) { TGuildWareSlot WareSlotList[GUILD_WAREHOUSE_MAX]; BYTE cSlotListCount = GetSlotList(WareSlotList); m_pDBCon->QuerySetGuildWareInfo(m_cDBThreadID, m_GuildOwner->GetUID().nDBID, g_Config.nWorldSetID, cSlotListCount, WareSlotList); } else _DANGER_POINT(); } // FROM USER // ±æµå¾ÆÀÌÅÛ bool CDNGuildWare::OnRecvMoveGuildItem(CDNUserSession* pUserSession, CSMoveGuildItem* pPacket) { int nRet = ERROR_NONE; switch(pPacket->cMoveType) { case MoveType_GuildWare: nRet = ItemInWare(pUserSession, pPacket); break; case MoveType_InvenToGuildWare: nRet = ItemInvenToWare(pUserSession, pPacket); break; case MoveType_GuildWareToInven: nRet = ItemWareToInven(pUserSession, pPacket); break; default: _DANGER_POINT(); break; } // ¿¡·¯Ã³¸® if(nRet != ERROR_NONE) { pUserSession->SendMoveGuildItem(pPacket->cMoveType, 0, 0, NULL, NULL, nRet); return false; } return true; } // ±æµåÄÚÀÎ bool CDNGuildWare::OnRecvMoveGuildCoin(CDNUserSession* pUserSession, CSMoveGuildCoin* pMove) { int nRet = ERROR_NONE; switch(pMove->cMoveType) { case MoveType_InvenToGuildWare: nRet = CoinInvenToWare(pUserSession, pMove); break; case MoveType_GuildWareToInven: nRet = CoinWareToInven(pUserSession, pMove); break; default: _DANGER_POINT(); break; } if(nRet != ERROR_NONE) { pUserSession->SendMoveGuildCoin(pMove->cMoveType, 0, 0, 0, 0, nRet); return false; } return true; } // ±æµåâ°í È÷½ºÅ丮 void CDNGuildWare::OnRecvGetWareHistory(CDNUserSession* pUserSession, CSGetGuildWareHistory* pPacket) { // DB¿¡ È÷½ºÅ丮 ¸ñ·ÏÀ» ¾ò¾î¿Â´Ù if(m_pDBCon) m_pDBCon->QueryGetGuildWareHistory(m_cDBThreadID, pUserSession->GetAccountDBID(), pUserSession->GetCharacterDBID(), m_GuildOwner->GetUID().nDBID, g_Config.nWorldSetID, pPacket->nIndex); } //FROM MASTER bool CDNGuildWare::OnRecvGuildWareInfo(const MAGuildWareInfo *pPacket) { MAGuildWareInfoResult result; memset(&result, 0, sizeof(result)); result.nFromManagedID = pPacket->nManagedID; SaveWareResultPacket(result); g_pMasterConnection->SendGuildWareInfoResult(result); return true; } bool CDNGuildWare::OnRecvGuildWareInfoResult(MAGuildWareInfoResult *pPacket) { UpdateSlotList(pPacket->VersionDate, pPacket->cSlotListCount, pPacket->WareSlotList); return true; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////// PRIVATE FUNCTION ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CDNGuildWare::Reset() { m_MapWareItem.clear(); m_pDBCon = NULL; m_GuildOwner = NULL; m_VersionDate = 0; m_cDBThreadID = 0; } BYTE CDNGuildWare::GetSlotList(TGuildWareSlot* pSlot) { BYTE cListCount = 0; // ÃʱâÈ­ memset(pSlot, 0x00, sizeof(TGuildWareSlot)*GUILD_WAREHOUSE_MAX); ScopeLock AutoLock(m_WareLock); TMapGuildWareItem::const_iterator con_iter = m_MapWareItem.begin(); for(; con_iter != m_MapWareItem.end(); con_iter++) { pSlot[cListCount].cSlotIndex = con_iter->second.cSlotIndex; pSlot[cListCount].nSerial = con_iter->second.Item.nSerial; cListCount++; if(cListCount >= GUILD_WAREHOUSE_MAX) break; } return cListCount; } void CDNGuildWare::UpdateWareSlot(BYTE cCount, TGuildWareSlot* List) { if (cCount > GUILD_WAREHOUSE_MAX) return; TMapGuildWareItem::iterator iter = m_MapWareItem.begin(); for(; iter != m_MapWareItem.end(); iter++) { for(BYTE i=0; isecond.Item.nSerial == List[i].nSerial) { iter->second.cSlotIndex = List[i].cSlotIndex; } } } } size_t CDNGuildWare::GetWareItemCount() { return m_MapWareItem.size(); } __time64_t CDNGuildWare::GetVersionDate() { return m_VersionDate; } void CDNGuildWare::UpdateVersionDate() { m_TimeSet.Reset(); m_VersionDate = m_TimeSet.GetTimeT64_LC(); } void CDNGuildWare::SetVersionDate(__time64_t tVersion) { m_VersionDate = tVersion; } BYTE CDNGuildWare::GetWareList(TItemInfo* pItemInfo) { BYTE cListCount = 0; memset(pItemInfo, 0x00, sizeof(TItemInfo)*GUILD_WAREHOUSE_MAX); ScopeLock AutoLock(m_WareLock); TMapGuildWareItem::const_iterator con_iter = m_MapWareItem.begin(); for(; con_iter != m_MapWareItem.end(); con_iter++) { if(cListCount >= GUILD_WAREHOUSE_MAX) { if (m_GuildOwner) g_Log.Log(LogType::_ERROR, L"[World:%d][DBID:%d] GetWareList - OverFlow\r\n", m_GuildOwner->GetUID().nWorldID, m_GuildOwner->GetUID().nDBID); break; } pItemInfo[cListCount] = con_iter->second; cListCount++; } return cListCount; } const TItem* CDNGuildWare::GetWareItem(INT64 biItemSerial) { if(biItemSerial <= 0) return NULL; if(m_MapWareItem.empty()) return NULL; ScopeLock AutoLock(m_WareLock); TMapGuildWareItem::iterator iter = m_MapWareItem.find(biItemSerial); if(iter == m_MapWareItem.end()) return NULL; return &(iter->second.Item); } const TItemInfo* CDNGuildWare::GetWareItemInfo(INT64 biItemSerial) { if(biItemSerial <= 0) return NULL; if(m_MapWareItem.empty()) return NULL; ScopeLock AutoLock(m_WareLock); TMapGuildWareItem::iterator iter = m_MapWareItem.find(biItemSerial); if(iter == m_MapWareItem.end()) return NULL; return &(iter->second); } int CDNGuildWare::AddWareItemInfo(TItemInfo& AddItem) { ScopeLock AutoLock(m_WareLock); INT64 nSerial = AddItem.Item.nSerial; m_MapWareItem [nSerial] = AddItem; if (m_MapWareItem.size() > GUILD_WAREHOUSE_MAX) { if (m_GuildOwner) g_Log.Log(LogType::_ERROR, L"[World:%d][DBID:%d] AddWareItemInfo - OverFlow\r\n", m_GuildOwner->GetUID().nWorldID, m_GuildOwner->GetUID().nDBID); } return ERROR_NONE; } void CDNGuildWare::UpdateWareInfo(TItemInfo& ItemInfo) { INT64 nUpdateSerial = ItemInfo.Item.nSerial; const TItemInfo* WareInfo = GetWareItemInfo(nUpdateSerial); if(WareInfo) { if(ItemInfo.Item.wCount <= 0) { // Á¤º¸ »èÁ¦ RemoveWareItem(nUpdateSerial); } else { // ¾÷µ¥ÀÌÆ® ScopeLock AutoLock(m_WareLock); *const_cast(WareInfo) = ItemInfo; } } else AddWareItemInfo(ItemInfo); } int CDNGuildWare::RemoveWareItem(INT64 nSerial) { ScopeLock AutoLock(m_WareLock); m_MapWareItem.erase(nSerial); return ERROR_NONE; } #ifdef PRE_ADD_JOINGUILD_SUPPORT void CDNGuildWare::BroadCastRefreshGuildItem(char cType, INT64 biSrcSerial, INT64 biDestSerial, const TItemInfo *pSrcInfo, const TItemInfo *pDestInfo, CDNUserSession* pSession, bool bNoUpdate) { UpdateVersionDate(); // â°í¹öÁ¯À» ¾÷µ¥ÀÌÆ® ÇÑ´Ù. // ÀÚ½ÅÀ» Á¦¿ÜÇÑ ´Ù¸¥ ±æµå¿ø »ç¶÷µé¿¡°Ô ¾Ë·ÁÁָ鼭 °³ÀΠâ°ö¹öÁ¯À» ¾÷µ¥ÀÌÆ®ÇÑ´Ù. m_GuildOwner->SendRefreshGuildItem(cType, biSrcSerial, biDestSerial, pSrcInfo, pDestInfo, pSession, bNoUpdate); g_pMasterConnection->SendRefreshGuildItem(m_GuildOwner->GetUID(), cType, biSrcSerial, biDestSerial, pSrcInfo, pDestInfo, GetVersionDate()); } #else //#ifdef PRE_ADD_JOINGUILD_SUPPORT void CDNGuildWare::BroadCastRefreshGuildItem(char cType, INT64 biSrcSerial, INT64 biDestSerial, const TItemInfo *pSrcInfo, const TItemInfo *pDestInfo, CDNUserSession* pSession) { UpdateVersionDate(); // â°í¹öÁ¯À» ¾÷µ¥ÀÌÆ® ÇÑ´Ù. // ÀÚ½ÅÀ» Á¦¿ÜÇÑ ´Ù¸¥ ±æµå¿ø »ç¶÷µé¿¡°Ô ¾Ë·ÁÁָ鼭 °³ÀΠâ°ö¹öÁ¯À» ¾÷µ¥ÀÌÆ®ÇÑ´Ù. m_GuildOwner->SendRefreshGuildItem(cType, biSrcSerial, biDestSerial, pSrcInfo, pDestInfo, pSession); g_pMasterConnection->SendRefreshGuildItem(m_GuildOwner->GetUID(), cType, biSrcSerial, biDestSerial, pSrcInfo, pDestInfo, GetVersionDate()); } #endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT void CDNGuildWare::BroadCastRefreshGuildCoin(INT64 biTotalCoin, CDNUserSession* pSession) { m_GuildOwner->SendRefreshGuildCoin(biTotalCoin, pSession); g_pMasterConnection->SendRefreshGuildCoin(m_GuildOwner->GetUID(), biTotalCoin); } // â°í¾È¿¡¼­¸¸ ¾ÆÀÌÅÛ À̵¿ int CDNGuildWare::ItemInWare(CDNUserSession* pUserSession, CSMoveGuildItem* pPacket) { if(!m_pDBCon) return ERROR_DB; if(!pUserSession) return ERROR_GENERIC_INVALIDREQUEST; CDNUserItem* pItem = pUserSession->GetItem(); if(!pItem) return ERROR_ITEM_FAIL; if(pPacket->wCount <= 0) return ERROR_ITEM_NOTFOUND; if(pPacket->cDestIndex == pPacket->cSrcIndex) return ERROR_ITEM_INDEX_UNMATCH; int nGstorage = m_GuildOwner->GetInfo()->wGuildWareSize; if( (pPacket->cSrcIndex >= nGstorage) ) return ERROR_ITEM_INDEX_UNMATCH; if( (pPacket->cDestIndex >= nGstorage) ) return ERROR_ITEM_INDEX_UNMATCH; const TItemInfo* pSrcInfo = GetWareItemInfo(pPacket->biSrcItemSerial); if(!pSrcInfo) return ERROR_ITEM_NOTFOUND; const TItem* pSrcItem = &pSrcInfo->Item; if(!pSrcItem) return ERROR_ITEM_NOTFOUND; // °¡Áö°íÀִ°ͺ¸´Ù¸¹Àº°ªÀÌ¿À¸é¿¡·¯! if(pPacket->wCount > pSrcItem->wCount) return ERROR_ITEM_OVERFLOW; // ½Ã¸®¾óÄÚµåÁ¶»ç if(pSrcItem->nSerial != pPacket->biSrcItemSerial) return ERROR_ITEM_NOTFOUND; // ¿À¹ö·¦°¡´É°¹¼öÈ®ÀÎ int nSrcWareOverlapCount = g_pDataManager->GetItemOverlapCount(pSrcItem->nItemID); if(nSrcWareOverlapCount <= 0) return ERROR_ITEM_FAIL; // ±æµåÁ¤º¸¸¦Çѹø´õÈ®ÀÎ! const TGuildUID GuildUID = pUserSession->GetGuildUID(); if(!GuildUID.IsSet()) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; if(GuildUID != m_GuildOwner->GetUID()) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; // ±æµå¿ø È®ÀÎ TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID()); if(!pGuildMember) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; // ¾ÆÀÌÅÛ º¸°ü ±ÇÇÑÀÌ ÀÖ´ÂÁö È®ÀÎ if(!m_GuildOwner->CheckGuildInfoAuth(static_cast(pGuildMember->btGuildRole), static_cast(GUILDAUTH_TYPE_TAKEITEM))) return ERROR_GUILD_HAS_NO_AUTHORITY; const TItemInfo* pDestInfo = GetWareItemInfo(pPacket->biDestItemSerial); const TItem* pDestItem = NULL; if(pDestInfo) pDestItem = &pDestInfo->Item; if(pDestItem) { if( CDNUserItem::bIsDifferentItem( pSrcItem, pDestItem) ) return pItem->NothingMoveItemInGuildWare(this, pPacket); // ¼Ò½º¾ÆÀÌÅÛÀÌ ¸ñÀû¾ÆÀÌÅÛ°ú Merge °¡´ÉÇÑÁö È®ÀÎ int nDestWareOverlapCount = g_pDataManager->GetItemOverlapCount(pDestItem->nItemID); if(nDestWareOverlapCount <= 1) return pItem->NothingMoveItemInGuildWare(this, pPacket); if(pDestItem->wCount == nDestWareOverlapCount) return pItem->NothingMoveItemInGuildWare(this, pPacket); //DB¿¡ Àü¼ÛÇÒ ÆÐŶ TQMoveItemInGuildWare Move; memset(&Move, 0, sizeof(TQMoveItemInGuildWare)); Move.nCharacterDBID = pUserSession->GetCharacterDBID(); Move.nGuildDBID = GuildUID.nDBID; Move.SrcItem.cSlotIndex = pPacket->cSrcIndex; Move.SrcItem.nItemID = pSrcItem->nItemID; Move.SrcItem.biSerial = pSrcItem->nSerial; Move.DestItem.cSlotIndex = pPacket->cDestIndex; Move.DestItem.nItemID = pDestItem->nItemID; Move.DestItem.biSerial = pDestItem->nSerial; Move.nItemID = pSrcItem->nItemID; Move.biItemSerial = pSrcItem->nSerial; Move.wItemCount = pSrcItem->wCount; Move.nMapIndex = pUserSession->GetMapIndex(); // â°í´Â splitÀÌ ¾øÀ½. merge¸¸ ½Å°æ¾²¸é µÊ // MAX°ªÀ» ³Ñ±ä °æ¿ì if(pDestItem->wCount + pPacket->wCount > nDestWareOverlapCount) { int nGapCount = nDestWareOverlapCount - pDestItem->wCount; // ¼Ò½º¾ÆÀÌÅÛÀ» °­Á¦·Î ºÐÇÒÇÏ¿© º¸³»ÁØ´Ù. Move.wSplitItemCount = nGapCount; Move.biNewItemSerial = MakeItemSerial(); Move.SrcItem.wCount = pSrcItem->wCount - nGapCount; Move.DestItem.wCount = pDestItem->wCount + nGapCount; } else{ if(pSrcItem->wCount == pPacket->wCount){ // °°Àº°æ¿ì Move.SrcItem.wCount = 0; Move.SrcItem.biNewSerial = 0; } else{ Move.SrcItem.wCount = pSrcItem->wCount - pPacket->wCount; } Move.DestItem.wCount = pDestItem->wCount + pPacket->wCount; } Move.biMergeTargetItemSerial = pDestItem->nSerial; Move.wMergeItemCount = pDestItem->wCount; m_pDBCon->QueryMoveItemInGuildWare(m_cDBThreadID, pUserSession->GetAccountDBID(), g_Config.nWorldSetID, &Move); } else { TItemInfo SrcInfo ={0,}; SrcInfo.cSlotIndex = pPacket->cSrcIndex; SrcInfo.Item.nSerial = pPacket->biSrcItemSerial; TItemInfo DestInfo; DestInfo.cSlotIndex = pPacket->cDestIndex; DestInfo.Item = *pSrcItem; RemoveWareItem(pPacket->biSrcItemSerial); AddWareItemInfo(DestInfo); pUserSession->SendMoveGuildItem(MoveType_GuildWare, pPacket->biSrcItemSerial, pPacket->biDestItemSerial, &SrcInfo, &DestInfo, ERROR_NONE); BroadCastRefreshGuildItem(MoveType_GuildWare, pPacket->biSrcItemSerial, pPacket->biDestItemSerial, &SrcInfo, &DestInfo, pUserSession); } return ERROR_NONE; } // Àκ¥ -> â°í·Î ¾ÆÀÌÅÛÀ̵¿ int CDNGuildWare::ItemInvenToWare(CDNUserSession* pUserSession, CSMoveGuildItem* pPacket) { if(!m_pDBCon) return ERROR_DB; if(!pUserSession) return ERROR_GENERIC_INVALIDREQUEST; CDNUserItem* pItem = pUserSession->GetItem(); if(!pItem) return ERROR_ITEM_FAIL; if(pPacket->wCount <= 0) return ERROR_ITEM_NOTFOUND; int nGstorage = m_GuildOwner->GetInfo()->wGuildWareSize; if((pPacket->cDestIndex >= nGstorage)) return ERROR_ITEM_INDEX_UNMATCH; if (pItem->CheckRangeInventoryIndex(pPacket->cSrcIndex) == false) return ERROR_ITEM_INDEX_UNMATCH; // Àκ¥¾ÆÀÌÅÛ Á¶»ç const TItem* pInven = pItem->GetInventory(pPacket->cSrcIndex); if(!pInven) return ERROR_ITEM_NOTFOUND; // overflow, serial, soulbound üũ int nRet = pItem->IsTradeEnableItem(ITEMPOSITION_INVEN, pPacket->cSrcIndex, pPacket->biSrcItemSerial, pPacket->wCount); if(nRet != ERROR_NONE) return nRet; // ¿À¹ö·¦ °¡´É°¹¼ö È®ÀÎ int nInvenOverlapCount = g_pDataManager->GetItemOverlapCount(pInven->nItemID); if(nInvenOverlapCount <= 0) return ERROR_ITEM_FAIL; // ±æµåÁ¤º¸¸¦ Çѹø´õ È®ÀÎ! const TGuildUID GuildUID = pUserSession->GetGuildUID(); if(!GuildUID.IsSet()) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; if(GuildUID != m_GuildOwner->GetUID()) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; // ±æµå¿ø È®ÀÎ TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID()); if(!pGuildMember) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; // ¾ÆÀÌÅÛ º¸°ü ±ÇÇÑÀÌ ÀÖ´ÂÁö È®ÀÎ if(!m_GuildOwner->CheckGuildInfoAuth(static_cast(pGuildMember->btGuildRole), static_cast(GUILDAUTH_TYPE_STOREITEM))) return ERROR_GUILD_HAS_NO_AUTHORITY; // DB¿¡ Àü¼ÛÇÒ ÆÐŶ TQMoveInvenToGuildWare Move; memset(&Move, 0, sizeof(Move)); Move.nCharacterDBID = pUserSession->GetCharacterDBID(); Move.nGuildDBID = GuildUID.nDBID; Move.InvenItem.cSlotIndex = pPacket->cSrcIndex; Move.InvenItem.nItemID = pInven->nItemID; Move.InvenItem.biSerial = pInven->nSerial; Move.GuildWareItem.cSlotIndex = pPacket->cDestIndex; Move.nItemID = pInven->nItemID; Move.biItemSerial = pInven->nSerial; Move.wItemCount = pInven->wCount; Move.wMovingItemCount = pPacket->wCount; Move.nMapIndex = pUserSession->GetMapIndex(); // Àκ¥¾ÆÀÌÅÛÀÇ Split°¡ µÇ¾î ³ª¿Â°ÇÁö È®ÀÎ if(pInven->wCount > pPacket->wCount) Move.biNewItemSerial = MakeItemSerial(); else Move.biNewItemSerial = 0; if(pInven->wCount == pPacket->wCount){ // °°Àº°æ¿ì Move.InvenItem.wCount = 0; Move.InvenItem.biNewSerial = 0; } else{ Move.InvenItem.wCount = pInven->wCount - pPacket->wCount; } // â°í¾ÆÀÌÅÛ const TItem* pWare = GetWareItem(pPacket->biDestItemSerial); // â°í¾ÆÀÌÅÛÀÌ ÀÖ´Ù¸é Merge ½Ãµµ! if(pWare) { // Àκ¥¾ÆÀÌÅÛÀÌ Ã¢°í¾ÆÀÌÅÛ°ú Merge °¡´ÉÇÑÁö È®ÀÎ if( CDNUserItem::bIsDifferentItem( pInven, pWare ) ) return pItem->NothingMoveInvenToGuildWare(this, pPacket); // Àκ¥¾ÆÀÌÅÛÀÌ Ã¢°í¾ÆÀÌÅÛ°ú Merge °¡´ÉÇÑÁö È®ÀÎ int nWareOverlapCount = g_pDataManager->GetItemOverlapCount(pWare->nItemID); if(pWare->wCount == nWareOverlapCount) return pItem->NothingMoveInvenToGuildWare(this, pPacket); Move.GuildWareItem.nItemID = pWare->nItemID; Move.GuildWareItem.biSerial = pWare->nSerial; Move.GuildWareItem.wCount = pWare->wCount; // MAX°ªÀ» ³Ñ±ä °æ¿ì if(pWare->wCount + pPacket->wCount > nWareOverlapCount) { // Àκ¥¾ÆÀÌÅÛÀ» °­Á¦·Î ºÐÇÒÇÏ¿© º¸³»ÁØ´Ù. int nGapCount = nWareOverlapCount - pWare->wCount; Move.wMovingItemCount = nGapCount; Move.biNewItemSerial = MakeItemSerial(); Move.InvenItem.wCount = pInven->wCount - nGapCount; Move.GuildWareItem.wCount = pWare->wCount + nGapCount; } else{ Move.GuildWareItem.wCount = pWare->wCount + pPacket->wCount; } Move.biMergeTargetItemSerial = pWare->nSerial; Move.wMergeItemCount = pWare->wCount; } else{ Move.GuildWareItem.nItemID = pInven->nItemID; Move.GuildWareItem.biNewSerial = (Move.biNewItemSerial > 0) ? Move.biNewItemSerial : pInven->nSerial; Move.GuildWareItem.wCount = pPacket->wCount; } m_pDBCon->QueryMoveInvenToGuildWare(m_cDBThreadID, pUserSession->GetAccountDBID(), g_Config.nWorldSetID, &Move); return ERROR_NONE; } // â°í -> Àκ¥·Î ¾ÆÀÌÅÛÀ̵¿ int CDNGuildWare::ItemWareToInven(CDNUserSession* pUserSession, CSMoveGuildItem* pPacket) { if(!m_pDBCon) return ERROR_DB; if(!pUserSession) return ERROR_GENERIC_INVALIDREQUEST; CDNUserItem* pItem = pUserSession->GetItem(); if(!pItem) return ERROR_ITEM_FAIL; if(pPacket->wCount <= 0) return ERROR_ITEM_NOTFOUND; int nGstorage = m_GuildOwner->GetInfo()->wGuildWareSize; if((pPacket->cSrcIndex >= nGstorage)) return ERROR_ITEM_INDEX_UNMATCH; if (pItem->CheckRangeInventoryIndex(pPacket->cDestIndex) == false) return ERROR_ITEM_INDEX_UNMATCH; // â°í¾ÆÀÌÅÛ Á¶»ç const TItem* pWare = GetWareItem(pPacket->biSrcItemSerial); if(!pWare) return ERROR_ITEM_NOTFOUND; // °¡Áö°í ÀÖ´Â °Íº¸´Ù ¸¹Àº °ªÀÌ ¿À¸é ¿¡·¯! if(pPacket->wCount > pWare->wCount) return ERROR_ITEM_OVERFLOW; // ½Ã¸®¾óÄÚµå Á¶»ç if(pWare->nSerial != pPacket->biSrcItemSerial) return ERROR_ITEM_NOTFOUND; // ¿À¹ö·¦°¡´É°¹¼öÈ®ÀÎ int nInvenOverlapCount = g_pDataManager->GetItemOverlapCount(pWare->nItemID); if(nInvenOverlapCount <= 0) return ERROR_ITEM_FAIL; // ±æµåÁ¤º¸¸¦Çѹø´õÈ®ÀÎ! const TGuildUID GuildUID = pUserSession->GetGuildUID(); if(!GuildUID.IsSet()) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; if(GuildUID != m_GuildOwner->GetUID()) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; // ±æµå¿ø È®ÀÎ(¾ÆÀÌÅÛ²¨³»±â) TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID()); if(!pGuildMember) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; // ¾ÆÀÌÅÛ ²¨³»±â ±ÇÇÑÀÌ ÀÖ´ÂÁö È®ÀÎ if(!m_GuildOwner->CheckGuildInfoAuth(static_cast(pGuildMember->btGuildRole), static_cast(GUILDAUTH_TYPE_TAKEITEM))) return ERROR_GUILD_HAS_NO_AUTHORITY; #if defined( PRE_ADD_CHANGEGUILDROLE ) // ÃÖ´ë ÀÌ¿ëÇÒ ¼ö ÀÖ´Â Ä«¿îÆ®¸¦ ²¨³»¿Â´Ù(±æµåÀå°ú ±æµåºÎÀåÀÌ ¾Æ´Ñ »ç¶÷¸¸ üũÇÑ´Ù) if(pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER && pGuildMember->btGuildRole != GUILDROLE_TYPE_SUBMASTER) #else // ÃÖ´ë ÀÌ¿ëÇÒ ¼ö ÀÖ´Â Ä«¿îÆ®¸¦ ²¨³»¿Â´Ù(±æµåÀåÀÌ ¾Æ´Ñ »ç¶÷¸¸ üũÇÑ´Ù) if(pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER) #endif { int nMaxItemCount = m_GuildOwner->GetInfo()->nRoleMaxItem[pGuildMember->btGuildRole]; // ÃÖ´ë°ª È®ÀÎ if(nMaxItemCount == -1) return ERROR_MAX_TAKE_GUILDITEM; // Àӽà ²¨³»±â Ä«¿îÆ®¸¦ ¸¸µé¾î º»´Ù. USHORT uTakeCount = pGuildMember->TakeWareItemCount + 1; // ÀÌ¿ëȽ¼ö Çã¿ë È®ÀÎ if(uTakeCount > nMaxItemCount) return ERROR_MAX_TAKE_GUILDITEM; } // DB¿¡ Àü¼ÛÇÒ ÆÐŶ±¸¼º TQMoveGuildWareToInven Move; memset(&Move, 0, sizeof(Move)); Move.nCharacterDBID = pUserSession->GetCharacterDBID(); Move.nGuildDBID = GuildUID.nDBID; Move.GuildWareItem.cSlotIndex = pPacket->cSrcIndex; Move.GuildWareItem.nItemID = pWare->nItemID; Move.GuildWareItem.biSerial = pWare->nSerial; Move.InvenItem.cSlotIndex = pPacket->cDestIndex; Move.nItemID = pWare->nItemID; Move.biItemSerial = pWare->nSerial; Move.wItemCount = pWare->wCount; Move.wMovingItemCount = pPacket->wCount; Move.nMapIndex = pUserSession->GetMapIndex(); #if defined( PRE_ADD_CHANGEGUILDROLE ) if( pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER && pGuildMember->btGuildRole != GUILDROLE_TYPE_SUBMASTER ) #else if(pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER) #endif Move.nMaxDailyTakeItemCount = m_GuildOwner->GetInfo()->nRoleMaxItem[pGuildMember->btGuildRole]; else { Move.nMaxDailyTakeItemCount = -1; } // â°í¾ÆÀÌÅÛÀÌ ºÐÇҵǾú´ÂÁö È®ÀÎ if(pWare->wCount > pPacket->wCount) Move.biNewItemSerial = MakeItemSerial(); else Move.biNewItemSerial = 0; if(pWare->wCount == pPacket->wCount){ // °°Àº°æ¿ì Move.GuildWareItem.wCount = 0; Move.GuildWareItem.biNewSerial = 0; } else{ Move.GuildWareItem.wCount = pWare->wCount - pPacket->wCount; } // Àκ¥¾ÆÀÌÅÛ const TItem* pInven = pItem->GetInventory(pPacket->cDestIndex); if(pInven) { // â°í¾ÆÀÌÅÛÀÌ Àκ¥¾ÆÀÌÅÛ°ú Merge°¡´ÉÇÑÁö È®ÀÎ if( CDNUserItem::bIsDifferentItem( pWare, pInven ) == true ) return pItem->NothingMoveGuildWareToInven(this, pPacket, pGuildMember->TakeWareItemCount); // MAX°ª °Ë»ç int nInvenOverlapCount = g_pDataManager->GetItemOverlapCount(pInven->nItemID); if(pInven->wCount == nInvenOverlapCount) return pItem->NothingMoveGuildWareToInven(this, pPacket, pGuildMember->TakeWareItemCount); Move.InvenItem.nItemID = pInven->nItemID; Move.InvenItem.biSerial = pInven->nSerial; Move.InvenItem.wCount = pInven->wCount; if(pInven->wCount + pPacket->wCount > nInvenOverlapCount) { // â°í¾ÆÀÌÅÛÀ» °­Á¦·Î ºÐÇÒÇÏ¿© º¸³»ÁØ´Ù. int nGapCount = nInvenOverlapCount - pInven->wCount; Move.wMovingItemCount = nGapCount; Move.biNewItemSerial = MakeItemSerial(); Move.GuildWareItem.wCount = pWare->wCount - nGapCount; Move.InvenItem.wCount = pInven->wCount + nGapCount; } else{ Move.InvenItem.wCount = pInven->wCount + pPacket->wCount; } Move.biMergeTargetItemSerial = pInven->nSerial; Move.wMergeItemCount = pInven->wCount; } else{ Move.InvenItem.nItemID = pWare->nItemID; Move.InvenItem.biNewSerial = (Move.biNewItemSerial > 0) ? Move.biNewItemSerial : pWare->nSerial; Move.InvenItem.wCount = pPacket->wCount; } m_pDBCon->QueryMoveGuildWareToInven(m_cDBThreadID, pUserSession->GetAccountDBID(), g_Config.nWorldSetID, &Move); return ERROR_NONE; } // FROM DB Server // ±æµåâ°í°£ ¾ÆÀÌÅÛ À̵¿ int CDNGuildWare::OnMoveItemInGuildWare(CDNUserSession* pUserSession, TAMoveItemInGuildWare* pResult) { CDNUserItem* pItem = pUserSession->GetItem(); if(!pItem) return ERROR_ITEM_FAIL; return pItem->InGuildWare(this, pResult); } // Àκ¥ -> ±æµåâ°í·Î ¾ÆÀÌÅÛ À̵¿°á°ú int CDNGuildWare::OnMoveInvenToGuildWare(CDNUserSession* pUserSession, TAMoveInvenToGuildWare* pResult) { CDNUserItem* pItem = pUserSession->GetItem(); if(!pItem) return ERROR_ITEM_FAIL; return pItem->FromInvenToGuildWare(this, pResult); } // ±æµåâ°í -> Àκ¥·Î ¾ÆÀÌÅÛ À̵¿ int CDNGuildWare::OnMoveGuildWareToInven(CDNUserSession* pUserSession, TAMoveGuildWareToInven* pResult) { CDNUserItem* pItem = pUserSession->GetItem(); if(!pItem) return ERROR_ITEM_FAIL; TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID()); if(pGuildMember) { pGuildMember->TakeWareItemCount = pResult->nDailyTakeItemCount; pGuildMember->LastWareUseDate = pResult->tUseDate; } return pItem->FromGuildWareToInven(this, pResult); } // Àκ¥ -> â°í ÄÚÀÎÀ̵¿ int CDNGuildWare::CoinInvenToWare(CDNUserSession* pUserSession, CSMoveGuildCoin* pPacket) { TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID()); if (!pGuildMember) return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; // ÄÚÀΰª ¹üÀ§Ã¼Å© if(pPacket->nMoveCoin <= 0) return ERROR_ITEM_INSUFFICIENCY_MONEY; if(pPacket->nMoveCoin > GUILDWARE_COINMAX) return ERROR_ITEM_INVENTOWARE02; // Àκ¥ÀÇ µ· °Ë»ç if(!pUserSession->CheckEnoughCoin(pPacket->nMoveCoin)) return ERROR_ITEM_INVENTOWARE01; // â°í¿¡ ³ÖÀ» ÀÚ¸®°¡ ¾ø´Ù. if(pPacket->nMoveCoin + GetWarehouseCoin() > GUILDWARE_COINMAX) return ERROR_ITEM_INVENTOWARE02; TQGuildWareHouseCoin Packet; Packet.cMoveType = pPacket->cMoveType; Packet.bInOutFlag = false; // ÀÔ±Ý Packet.nMoveCoin = pPacket->nMoveCoin; Packet.nGuildDBID = pUserSession->GetGuildUID().nDBID; Packet.nCharacterDBID = pUserSession->GetCharacterDBID(); Packet.nMapIndex = pUserSession->GetMapIndex(); _strcpy(Packet.szIP, _countof(Packet.szIP), pUserSession->GetIp(), (int)strlen(pUserSession->GetIp())); if(m_pDBCon) m_pDBCon->QueryGuildWarehouseCoin(m_cDBThreadID, pUserSession->GetAccountDBID(), g_Config.nWorldSetID, &Packet); return ERROR_NONE; } // â°í -> Àκ¥ ÄÚÀÎÀ̵¿ int CDNGuildWare::CoinWareToInven(CDNUserSession* pUserSession, CSMoveGuildCoin* pPacket) { // ÄÚÀΰª ¹üÀ§Ã¼Å© if((pPacket->nMoveCoin <= 0) ||(pPacket->nMoveCoin > GUILDWARE_COINMAX)) return ERROR_ITEM_INVENTOWARE01; if(pPacket->nMoveCoin > GetWarehouseCoin()) // â°í¿¡µ·À̾ø´Ù return ERROR_ITEM_WARETOINVEN01; if(!pUserSession->CheckMaxCoin(pPacket->nMoveCoin)) // Àκ¥¿¡³ÖÀ»ÀÚ¸®°¡¾ø´Ù return ERROR_ITEM_WARETOINVEN02; // ±æµå¿ø È®ÀÎ(Ãâ±Ý) TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID()); if(pGuildMember) { // Ãâ±Ý ±ÇÇÑÀÌ ÀÖ´ÂÁö È®ÀÎ if(!m_GuildOwner->CheckGuildInfoAuth(static_cast(pGuildMember->btGuildRole), static_cast(GUILDAUTH_TYPE_WITHDRAW))) return ERROR_GUILD_HAS_NO_AUTHORITY; #if defined( PRE_ADD_CHANGEGUILDROLE ) // ÃÖ´ëÀÌ¿ëÇÒ¼öÀÖ´ÂÄ«¿îÆ®¸¦²¨³»¿Â´Ù(±æµåÀå°ú ±æµåºÎÀåÀ̾ƴѻç¶÷¸¸Ã¼Å©ÇÑ´Ù) if( pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER && pGuildMember->btGuildRole != GUILDROLE_TYPE_SUBMASTER ) #else // ÃÖ´ëÀÌ¿ëÇÒ¼öÀÖ´ÂÄ«¿îÆ®¸¦²¨³»¿Â´Ù(±æµåÀåÀ̾ƴѻç¶÷¸¸Ã¼Å©ÇÑ´Ù) if(pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER) #endif { // ÃÖ´ë Ãâ±Ý¾× int nMaxCoinCount = m_GuildOwner->GetInfo()->nRoleMaxCoin[pGuildMember->btGuildRole]; // Àӽà Ãâ±Ý¾×À» »êÁ¤ÇÑ´Ù. INT64 nTotalCoin = pGuildMember->WithdrawCoin + pPacket->nMoveCoin; // Ãâ±Ý¾× Çã¿ë È®ÀÎ if(nTotalCoin > nMaxCoinCount) return ERROR_MAX_WITHDRAW_GUILDCOIN; } } else return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD; TQGuildWareHouseCoin Packet; Packet.cMoveType = pPacket->cMoveType; Packet.bInOutFlag = true; // Ãâ±Ý Packet.nMoveCoin = (int)pPacket->nMoveCoin; Packet.nGuildDBID = pUserSession->GetGuildUID().nDBID; Packet.nCharacterDBID = pUserSession->GetCharacterDBID(); Packet.nMapIndex = pUserSession->GetMapIndex(); _strcpy(Packet.szIP, _countof(Packet.szIP), pUserSession->GetIp(), (int)strlen(pUserSession->GetIp())); if(m_pDBCon) m_pDBCon->QueryGuildWarehouseCoin(m_cDBThreadID, pUserSession->GetAccountDBID(), g_Config.nWorldSetID, &Packet); return ERROR_NONE; } // ±æµå ÄÚÀÎ int CDNGuildWare::OnModGuildCoin(CDNUserSession* pUserSession, TAGuildWareHouseCoin* pResult) { if(!pUserSession) return ERROR_GENERIC_INVALIDREQUEST; INT64 nWithdrawCoin = 0; // ÀԱݰá°ú if(pResult->cMoveType == MoveType_InvenToGuildWare) { pUserSession->DelCoin(pResult->nMoveCoin, DBDNWorldDef::CoinChangeCode::DoNotDBSave, pUserSession->GetGuildUID().nDBID); } else if(pResult->cMoveType == MoveType_GuildWareToInven) // Ãâ±Ý { pUserSession->AddCoin(pResult->nMoveCoin, DBDNWorldDef::CoinChangeCode::DoNotDBSave, pUserSession->GetGuildUID().nDBID); nWithdrawCoin = m_GuildOwner->UpdateMemberCoin(pUserSession->GetCharacterDBID(), pResult->nMoveCoin, pResult->tUseDate); } else return ERROR_GENERIC_INVALIDREQUEST; SetWarehouseCoin(pResult->biTotalCoin); pUserSession->SendMoveGuildCoin(pResult->cMoveType, pResult->nMoveCoin, pUserSession->GetCoin(), GetWarehouseCoin(), nWithdrawCoin, ERROR_NONE); BroadCastRefreshGuildCoin(GetWarehouseCoin(), pUserSession); return ERROR_NONE; } #ifdef PRE_ADD_JOINGUILD_SUPPORT int CDNGuildWare::OnAddGuildCoin(CDNUserSession* pUserSession, INT64 nAddCoin) { if(!pUserSession) return ERROR_GENERIC_INVALIDREQUEST; SetWarehouseCoin(GetWarehouseCoin() + nAddCoin); BroadCastRefreshGuildCoin(GetWarehouseCoin(), pUserSession); pUserSession->SendRefreshGuildCoin(GetWarehouseCoin()); return ERROR_NONE; } int CDNGuildWare::OnAddInGuildWare(CDNUserSession * pUserSession, DBPacket::TTakeAttachInfo * pItem) { TItemInfo DestInfo; for (int i = 0; i < MAILATTACHITEMMAX; i++) { if (pItem->TakeItem[i].Item.nItemID <= 0) continue; memset(&DestInfo, 0, sizeof(TItemInfo)); DestInfo = pItem->TakeItem[i]; AddWareItemInfo(DestInfo); BroadCastRefreshGuildItem(MoveType_MailToGuildWare, 0, DestInfo.Item.nSerial, NULL, &DestInfo, pUserSession, true); } return ERROR_NONE; } #endif //#ifdef PRE_ADD_JOINGUILD_SUPPORT void CDNGuildWare::SetWarehouseCoin(INT64 biTotalCoin) { if(biTotalCoin < 0 || biTotalCoin > GUILDWARE_COINMAX) return; m_GuildOwner->SetInfo()->ui64GuildMoney = biTotalCoin; } void CDNGuildWare::ChangeWareSize(CDNUserBase* pUserObject, short wSize) { if(m_pDBCon) m_pDBCon->QueryChangeGuildWareSize(m_cDBThreadID, pUserObject->GetAccountDBID(), pUserObject->GetCharacterDBID(), m_GuildOwner->GetUID().nDBID, g_Config.nWorldSetID, wSize); } INT64 CDNGuildWare::GetWarehouseCoin() { if(m_GuildOwner->GetInfo()->ui64GuildMoney <=0) m_GuildOwner->SetInfo()->ui64GuildMoney = 0; if(m_GuildOwner->GetInfo()->ui64GuildMoney >= GUILDWARE_COINMAX) m_GuildOwner->SetInfo()->ui64GuildMoney = GUILDWARE_COINMAX; return m_GuildOwner->GetInfo()->ui64GuildMoney; } void CDNGuildWare::UpdateSlotList(__time64_t tVersion, BYTE cCount, TGuildWareSlot* List) { // ÃֽŹöÁ¯ÀÎÁö È®ÀÎÇÑ´Ù. if(m_VersionDate > tVersion) return; // ½½·Ô¸®½ºÆ® ÀúÀå UpdateWareSlot(cCount, List); // ¹öÀü ¾÷µ¥ÀÌÆ® m_VersionDate = tVersion; } void CDNGuildWare::SaveWareResultPacket(MAGuildWareInfoResult& result) { result.GuildUID = m_GuildOwner->GetUID(); // ½½·Ô¸®½ºÆ® º¹»ç result.cSlotListCount = GetSlotList(result.WareSlotList); // ¹öÁ¯ result.VersionDate = m_VersionDate; } INT64 CDNGuildWare::MakeItemSerial() { return MakeSerial( static_cast(g_pAuthManager->GetServerID())); }