DragonNest/Server/DNVillageServer/DNGuildWare.cpp

1071 lines
31 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
#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<44><42>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!m_pDBCon)
m_pDBCon = g_pDBConnectionManager->GetDBConnection( m_cDBThreadID );
// <20><><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD>
m_GuildOwner = pGuildVillage;
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>(<28>ø<EFBFBD><C3B8>󺰷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>)
m_MapWareItem.clear();
INT64 nSerial = 0;
for(int i=0; i<pPacket->cItemListCount; i++)
{
nSerial = pPacket->ItemList[i].Item.nSerial;
m_MapWareItem [nSerial] = pPacket->ItemList[i];
}
// <20><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD> <20>ʱ<EFBFBD>ȭ
UpdateVersionDate();
// <20>ֽ<EFBFBD> <20><><EFBFBD><EFBFBD><EEBDBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD>Ѵ<EFBFBD>.
g_pMasterConnection->SendGuildWareInfo(m_GuildOwner->GetUID());
}
void CDNGuildWare::ReportWareSlot()
{
// â<><C3A2> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
// <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
if(nRet != ERROR_NONE)
{
pUserSession->SendMoveGuildItem(pPacket->cMoveType, 0, 0, NULL, NULL, nRet);
return false;
}
return true;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
// <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>
void CDNGuildWare::OnRecvGetWareHistory(CDNUserSession* pUserSession, CSGetGuildWareHistory* pPacket)
{
// DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>
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;
// <20>ʱ<EFBFBD>ȭ
memset(pSlot, 0x00, sizeof(TGuildWareSlot)*GUILD_WAREHOUSE_MAX);
ScopeLock<CSyncLock> 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; i<cCount; i++)
{
if(iter->second.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<CSyncLock> 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<CSyncLock> 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<CSyncLock> 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<CSyncLock> 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)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
RemoveWareItem(nUpdateSerial);
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
ScopeLock<CSyncLock> AutoLock(m_WareLock);
*const_cast<TItemInfo*>(WareInfo) = ItemInfo;
}
}
else
AddWareItemInfo(ItemInfo);
}
int CDNGuildWare::RemoveWareItem(INT64 nSerial)
{
ScopeLock<CSyncLock> 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(); // â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
// <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1> <20>˷<EFBFBD><CBB7>ָ鼭 <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
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(); // â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
// <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9BFA1> <20>˷<EFBFBD><CBB7>ָ鼭 <20><><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
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);
}
// â<><C3A2><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ°ͺ<C2B0><CDBA>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD><CCBF><EFBFBD><E9BFA1>!
if(pPacket->wCount > pSrcItem->wCount)
return ERROR_ITEM_OVERFLOW;
// <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
if(pSrcItem->nSerial != pPacket->biSrcItemSerial)
return ERROR_ITEM_NOTFOUND;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD><C9B0><EFBFBD>Ȯ<EFBFBD><C8AE>
int nSrcWareOverlapCount = g_pDataManager->GetItemOverlapCount(pSrcItem->nItemID);
if(nSrcWareOverlapCount <= 0) return ERROR_ITEM_FAIL;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>Ȯ<EFBFBD><C8AE>!
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID());
if(!pGuildMember)
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if(!m_GuildOwner->CheckGuildInfoAuth(static_cast<eGuildRoleType>(pGuildMember->btGuildRole), static_cast<eGuildAuthType>(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);
// <20>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> Merge <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
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<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
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();
// â<><C3A2><EFBFBD><EFBFBD> split<69><74> <20><><EFBFBD><EFBFBD>. merge<67><65> <20>Ű澲<C5B0><E6BEB2> <20><>
// MAX<41><58><EFBFBD><EFBFBD> <20>ѱ<EFBFBD> <20><><EFBFBD><EFBFBD>
if(pDestItem->wCount + pPacket->wCount > nDestWareOverlapCount)
{
int nGapCount = nDestWareOverlapCount - pDestItem->wCount;
// <20>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
Move.wSplitItemCount = nGapCount;
Move.biNewItemSerial = MakeItemSerial();
Move.SrcItem.wCount = pSrcItem->wCount - nGapCount;
Move.DestItem.wCount = pDestItem->wCount + nGapCount;
}
else{
if(pSrcItem->wCount == pPacket->wCount){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
// <20>κ<EFBFBD> -> â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
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;
// <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɰ<EFBFBD><C9B0><EFBFBD> Ȯ<><C8AE>
int nInvenOverlapCount = g_pDataManager->GetItemOverlapCount(pInven->nItemID);
if(nInvenOverlapCount <= 0)
return ERROR_ITEM_FAIL;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> Ȯ<><C8AE>!
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID());
if(!pGuildMember)
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if(!m_GuildOwner->CheckGuildInfoAuth(static_cast<eGuildRoleType>(pGuildMember->btGuildRole), static_cast<eGuildAuthType>(GUILDAUTH_TYPE_STOREITEM)))
return ERROR_GUILD_HAS_NO_AUTHORITY;
// DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ
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();
// <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Split<69><74> <20>Ǿ<EFBFBD> <20><><EFBFBD>°<EFBFBD><C2B0><EFBFBD> Ȯ<><C8AE>
if(pInven->wCount > pPacket->wCount)
Move.biNewItemSerial = MakeItemSerial();
else
Move.biNewItemSerial = 0;
if(pInven->wCount == pPacket->wCount){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Move.InvenItem.wCount = 0;
Move.InvenItem.biNewSerial = 0;
}
else{
Move.InvenItem.wCount = pInven->wCount - pPacket->wCount;
}
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const TItem* pWare = GetWareItem(pPacket->biDestItemSerial);
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> Merge <20>õ<EFBFBD>!
if(pWare)
{
// <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> Merge <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if( CDNUserItem::bIsDifferentItem( pInven, pWare ) )
return pItem->NothingMoveInvenToGuildWare(this, pPacket);
// <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> Merge <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
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<41><58><EFBFBD><EFBFBD> <20>ѱ<EFBFBD> <20><><EFBFBD><EFBFBD>
if(pWare->wCount + pPacket->wCount > nWareOverlapCount)
{
// <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
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;
}
// â<><C3A2> -> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
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;
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const TItem* pWare = GetWareItem(pPacket->biSrcItemSerial);
if(!pWare)
return ERROR_ITEM_NOTFOUND;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>ͺ<EFBFBD><CDBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>!
if(pPacket->wCount > pWare->wCount)
return ERROR_ITEM_OVERFLOW;
// <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
if(pWare->nSerial != pPacket->biSrcItemSerial)
return ERROR_ITEM_NOTFOUND;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɰ<EFBFBD><C9B0><EFBFBD>Ȯ<EFBFBD><C8AE>
int nInvenOverlapCount = g_pDataManager->GetItemOverlapCount(pWare->nItemID);
if(nInvenOverlapCount <= 0)
return ERROR_ITEM_FAIL;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>Ȯ<EFBFBD><C8AE>!
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>(<28><><EFBFBD><EFBFBD><EFBFBD>۲<EFBFBD><DBB2><EFBFBD><EFBFBD><EFBFBD>)
TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID());
if(!pGuildMember)
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if(!m_GuildOwner->CheckGuildInfoAuth(static_cast<eGuildRoleType>(pGuildMember->btGuildRole), static_cast<eGuildAuthType>(GUILDAUTH_TYPE_TAKEITEM)))
return ERROR_GUILD_HAS_NO_AUTHORITY;
#if defined( PRE_ADD_CHANGEGUILDROLE )
// <20>ִ<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><> <20>ִ<EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>)
if(pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER &&
pGuildMember->btGuildRole != GUILDROLE_TYPE_SUBMASTER)
#else
// <20>ִ<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><> <20>ִ<EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>)
if(pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER)
#endif
{
int nMaxItemCount = m_GuildOwner->GetInfo()->nRoleMaxItem[pGuildMember->btGuildRole];
// <20>ִ밪 Ȯ<><C8AE>
if(nMaxItemCount == -1)
return ERROR_MAX_TAKE_GUILDITEM;
// <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
USHORT uTakeCount = pGuildMember->TakeWareItemCount + 1;
// <20>̿<EFBFBD>Ƚ<EFBFBD><C8BD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
if(uTakeCount > nMaxItemCount)
return ERROR_MAX_TAKE_GUILDITEM;
}
// DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
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;
}
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ҵǾ<D2B5><C7BE><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if(pWare->wCount > pPacket->wCount)
Move.biNewItemSerial = MakeItemSerial();
else
Move.biNewItemSerial = 0;
if(pWare->wCount == pPacket->wCount){ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Move.GuildWareItem.wCount = 0;
Move.GuildWareItem.biNewSerial = 0;
}
else{
Move.GuildWareItem.wCount = pWare->wCount - pPacket->wCount;
}
// <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const TItem* pInven = pItem->GetInventory(pPacket->cDestIndex);
if(pInven)
{
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> Merge<67><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>
if( CDNUserItem::bIsDifferentItem( pWare, pInven ) == true )
return pItem->NothingMoveGuildWareToInven(this, pPacket, pGuildMember->TakeWareItemCount);
// MAX<41><58> <20>˻<EFBFBD>
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)
{
// â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
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
// <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
int CDNGuildWare::OnMoveItemInGuildWare(CDNUserSession* pUserSession, TAMoveItemInGuildWare* pResult)
{
CDNUserItem* pItem = pUserSession->GetItem();
if(!pItem)
return ERROR_ITEM_FAIL;
return pItem->InGuildWare(this, pResult);
}
// <20>κ<EFBFBD> -> <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD>
int CDNGuildWare::OnMoveInvenToGuildWare(CDNUserSession* pUserSession, TAMoveInvenToGuildWare* pResult)
{
CDNUserItem* pItem = pUserSession->GetItem();
if(!pItem)
return ERROR_ITEM_FAIL;
return pItem->FromInvenToGuildWare(this, pResult);
}
// <20><><EFBFBD><EFBFBD>â<EFBFBD><C3A2> -> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
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);
}
// <20>κ<EFBFBD> -> â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
int CDNGuildWare::CoinInvenToWare(CDNUserSession* pUserSession, CSMoveGuildCoin* pPacket)
{
TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID());
if (!pGuildMember)
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
// <20><><EFBFBD>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD>üũ
if(pPacket->nMoveCoin <= 0)
return ERROR_ITEM_INSUFFICIENCY_MONEY;
if(pPacket->nMoveCoin > GUILDWARE_COINMAX)
return ERROR_ITEM_INVENTOWARE02;
// <20>κ<EFBFBD><CEBA><EFBFBD> <20><> <20>˻<EFBFBD>
if(!pUserSession->CheckEnoughCoin(pPacket->nMoveCoin))
return ERROR_ITEM_INVENTOWARE01;
// â<><C3A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD>.
if(pPacket->nMoveCoin + GetWarehouseCoin() > GUILDWARE_COINMAX)
return ERROR_ITEM_INVENTOWARE02;
TQGuildWareHouseCoin Packet;
Packet.cMoveType = pPacket->cMoveType;
Packet.bInOutFlag = false; // <20>Ա<EFBFBD>
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;
}
// â<><C3A2> -> <20>κ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
int CDNGuildWare::CoinWareToInven(CDNUserSession* pUserSession, CSMoveGuildCoin* pPacket)
{
// <20><><EFBFBD>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD>üũ
if((pPacket->nMoveCoin <= 0) ||(pPacket->nMoveCoin > GUILDWARE_COINMAX))
return ERROR_ITEM_INVENTOWARE01;
if(pPacket->nMoveCoin > GetWarehouseCoin()) // â<><C3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD>
return ERROR_ITEM_WARETOINVEN01;
if(!pUserSession->CheckMaxCoin(pPacket->nMoveCoin)) // <20>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ERROR_ITEM_WARETOINVEN02;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>(<28><><EFBFBD><EFBFBD>)
TGuildMember* pGuildMember = m_GuildOwner->GetMemberInfo(pUserSession->GetCharacterDBID());
if(pGuildMember)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if(!m_GuildOwner->CheckGuildInfoAuth(static_cast<eGuildRoleType>(pGuildMember->btGuildRole), static_cast<eGuildAuthType>(GUILDAUTH_TYPE_WITHDRAW)))
return ERROR_GUILD_HAS_NO_AUTHORITY;
#if defined( PRE_ADD_CHANGEGUILDROLE )
// <20>ִ<EFBFBD><D6B4>̿<EFBFBD><CCBF>Ҽ<EFBFBD><D2BC>ִ<EFBFBD>ī<EFBFBD><C4AB>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾ƴѻ<C6B4><D1BB><EFBFBD><EFBFBD><EFBFBD>üũ<C3BC>Ѵ<EFBFBD>)
if( pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER &&
pGuildMember->btGuildRole != GUILDROLE_TYPE_SUBMASTER )
#else
// <20>ִ<EFBFBD><D6B4>̿<EFBFBD><CCBF>Ҽ<EFBFBD><D2BC>ִ<EFBFBD>ī<EFBFBD><C4AB>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾ƴѻ<C6B4><D1BB><EFBFBD><EFBFBD><EFBFBD>üũ<C3BC>Ѵ<EFBFBD>)
if(pGuildMember->btGuildRole != GUILDROLE_TYPE_MASTER)
#endif
{
// <20>ִ<EFBFBD> <20><><EFBFBD>ݾ<EFBFBD>
int nMaxCoinCount = m_GuildOwner->GetInfo()->nRoleMaxCoin[pGuildMember->btGuildRole];
// <20>ӽ<EFBFBD> <20><><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
INT64 nTotalCoin = pGuildMember->WithdrawCoin + pPacket->nMoveCoin;
// <20><><EFBFBD>ݾ<EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
if(nTotalCoin > nMaxCoinCount)
return ERROR_MAX_WITHDRAW_GUILDCOIN;
}
}
else
return ERROR_GUILD_YOUR_NOT_BELONGANYGUILD;
TQGuildWareHouseCoin Packet;
Packet.cMoveType = pPacket->cMoveType;
Packet.bInOutFlag = true; // <20><><EFBFBD><EFBFBD>
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;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int CDNGuildWare::OnModGuildCoin(CDNUserSession* pUserSession, TAGuildWareHouseCoin* pResult)
{
if(!pUserSession)
return ERROR_GENERIC_INVALIDREQUEST;
INT64 nWithdrawCoin = 0;
// <20>Աݰ<D4B1><DDB0><EFBFBD>
if(pResult->cMoveType == MoveType_InvenToGuildWare)
{
pUserSession->DelCoin(pResult->nMoveCoin, DBDNWorldDef::CoinChangeCode::DoNotDBSave, pUserSession->GetGuildUID().nDBID);
}
else if(pResult->cMoveType == MoveType_GuildWareToInven) // <20><><EFBFBD><EFBFBD>
{
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)
{
// <20>ֽŹ<D6BD><C5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
if(m_VersionDate > tVersion)
return;
// <20><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
UpdateWareSlot(cCount, List);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
m_VersionDate = tVersion;
}
void CDNGuildWare::SaveWareResultPacket(MAGuildWareInfoResult& result)
{
result.GuildUID = m_GuildOwner->GetUID();
// <20><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
result.cSlotListCount = GetSlotList(result.WareSlotList);
// <20><><EFBFBD><EFBFBD>
result.VersionDate = m_VersionDate;
}
INT64 CDNGuildWare::MakeItemSerial()
{
return MakeSerial( static_cast<short>(g_pAuthManager->GetServerID()));
}