1071 lines
31 KiB
C++
1071 lines
31 KiB
C++
|
|
#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()));
|
|||
|
|
}
|