📄 userpackage.cpp
字号:
// UserPackage.cpp: implementation of the CUserPackage class.
//
//////////////////////////////////////////////////////////////////////
#include "AllMsg.h"
#include "UserPackage.h"
#include "User.h"
#include "MapGroup.h"
MYHEAP_IMPLEMENTATION(CUserPackage, s_heap)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUserPackage::CUserPackage()
{
m_pOwner = NULL;
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
m_setItem[i] = CItemSet::CreateNew();
if (!m_setItem[i])
{
::LogSave("error create UserPackage, CItemSet::CreateNew failed.");
}
}
}
CUserPackage::~CUserPackage()
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
if (m_setItem[i])
SAFE_RELEASE (m_setItem[i]);
}
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::Create(CUser* pUser, IDatabase* pDb)
{
CHECKF(pUser);
CHECKF(pDb);
ClearAll();
m_pOwner = pUser;
SQLBUF szSQL;
sprintf(szSQL, "SELECT * FROM %s WHERE owner_id=%u && position>=%u && position<%u", _TBL_ITEM, m_pOwner->GetID(), ITEMPOSITION_PACK_BEGIN, ITEMPOSITION_PACK_END);
IRecordset* pRes = pDb->CreateNewRecordset(szSQL);
if(pRes)
{
for(int i = 0; i < pRes->RecordCount(); i++)
{
CItemPtr pItem = CItem::CreateNew();
if(pItem)
{
if(pItem->Create(pRes, pDb))
{
AddItem(pItem);
}
else
{
LOGERROR("玩家[%s]无法加载物品[%u]", m_pOwner->GetName(), pItem->GetID());
pItem->ReleaseByOwner();
}
}
pRes->MoveNext();
}
pRes->Release();
}
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::AddItem(CItem* pItem, bool bUpdate /* = false */)
{
CHECKF(pItem);
CHECKF(m_pOwner);
int nPosition = ITEMPOSITION_BACKPACK;
if (pItem->IsGhostGem())
nPosition = ITEMPOSITION_GHOSTGEM_PACK;
else if (pItem->IsEudemon())
nPosition = ITEMPOSITION_EUDEMON_PACK;
else if (pItem->IsEudemonEgg())
nPosition = ITEMPOSITION_EUDEMONEGG_PACK;
if (IsPackFull(nPosition))
return false;
int nPackType = GetPackType(nPosition);
if (nPackType < 0)
return false;
if (pItem->GetInt(ITEMDATA_POSITION) != nPosition)
{
pItem->SetInt(ITEMDATA_POSITION, nPosition, true);
}
if (m_setItem[nPackType]->AddObj(pItem))
{
if(bUpdate)
pItem->SaveInfo();
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::DelItem(OBJID idItem)
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
if (m_setItem[i]->DelObj(idItem))
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////
CItem* CUserPackage::GetItem(OBJID idItem)
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
CItemPtr pItem = m_setItem[i]->GetObj(idItem);
if (pItem)
return pItem;
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
CItem* CUserPackage::GetItemByType(OBJID idType)
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
int nSize = m_setItem[i]->GetAmount();
for (int j=nSize-1; j>=0; j--)
{
CItemPtr pItem = m_setItem[i]->GetObjByIndex(j);
if (pItem && pItem->GetInt(ITEMDATA_TYPE) == idType)
return pItem;
}
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::IsPackFull(int nPosition)
{
return (!IsPackSpare(1, nPosition));
}
//////////////////////////////////////////////////////////////////////
void CUserPackage::ClearAll()
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
DEBUG_TRY
int nSize = m_setItem[i]->GetAmount();
for (int j=nSize-1; j>=0; j--)
{
CItemPtr pItem = m_setItem[i]->GetObjByIndex(j);
if (pItem)
{
m_setItem[i]->DelObj(pItem->GetID());
}
else
::LogSave("CGameObjSet::GetObjByIndex return NULL in CUserPackage::ClearAll");
}
DEBUG_CATCH("catch error in CUserPackage::ClearAll")
}
}
//////////////////////////////////////////////////////////////////////
void CUserPackage::SaveAllInfo()
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
int nSize = m_setItem[i]->GetAmount();
for (int j=nSize-1; j>=0; j--)
{
CItemPtr pItem = m_setItem[i]->GetObjByIndex(j);
if (pItem)
pItem->SaveInfo();
}
}
}
//////////////////////////////////////////////////////////////////////
void CUserPackage::SendAllItemInfo()
{
if (!m_pOwner)
return;
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
int nSize = m_setItem[i]->GetAmount();
for (int j=0; j<nSize; j++)
{
CItemPtr pItem = m_setItem[i]->GetObjByIndex(j);
if (pItem)
{
CMsgItemInfo msg;
if(msg.Create(pItem, ITEMINFO_ADDITEM))
m_pOwner->SendMsg(&msg);
}
}
}
}
//////////////////////////////////////////////////////////////////////
CItem* CUserPackage::GetTaskItem(LPCTSTR szItemName)
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
int nSize = m_setItem[i]->GetAmount();
for (int j=nSize-1; j>=0; j--)
{
CItemPtr pItem = m_setItem[i]->GetObjByIndex(j);
if (pItem && strcmp(pItem->GetStr(ITEMDATA_NAME), szItemName) == 0)
return pItem;
}
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
CItem* CUserPackage::GetTaskItemByType(OBJID idType, int nAmount)
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
int nSize = m_setItem[i]->GetAmount();
for (int j=nSize-1; j>=0; j--)
{
CItemPtr pItem = m_setItem[i]->GetObjByIndex(j);
if (pItem && pItem->GetInt(ITEMDATA_TYPE) == idType && (!nAmount || pItem->GetInt(ITEMDATA_AMOUNT) >= nAmount))
return pItem;
}
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
CItem* CUserPackage::FindSpaceTransSpell()
{
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
int nSize = m_setItem[i]->GetAmount();
for (int j=nSize-1; j>=0; j--)
{
CItemPtr pItem = m_setItem[i]->GetObjByIndex(j);
if (pItem && pItem->IsTransSpell() && pItem->GetInt(ITEMDATA_DATA) == 0)
return pItem;
}
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
CItem* CUserPackage::PopItem(OBJID idItem)
{
if (ID_NONE == idItem)
return NULL;
for (int i=0; i<_MAX_PACK_TYPE; i++)
{
CItemPtr pItem = m_setItem[i]->PopObj(idItem);
if (pItem)
return pItem;
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::IsPackFull(CItem* pItem)
{
CHECKF(pItem);
return IsPackFull(GetItemPosition(pItem));
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::IsPackFull(OBJID idItemType, int nWeight, DWORD dwData)
{
int nItemPosition = ITEMPOSITION_BACKPACK;
if (idItemType == ID_NONE)
{
// 如果不指定itemtype,则dwData表示要检查的背包
nItemPosition = dwData;
}
else
{
if (CItem::IsGhostGem(idItemType))
nItemPosition = ITEMPOSITION_GHOSTGEM_PACK;
else if (CItem::IsEudemon(idItemType))
nItemPosition = ITEMPOSITION_EUDEMON_PACK;
else if (CItem::IsEudemonEgg(idItemType))
nItemPosition = ITEMPOSITION_EUDEMONEGG_PACK;
}
return IsPackFull(nItemPosition);
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::IsPackSpare(int nNum, OBJID idItemType, DWORD dwData)
{
int nItemPosition = ITEMPOSITION_BACKPACK;
if (idItemType == ID_NONE)
{
// 如果不指定itemtype,则dwData表示要检查的背包
nItemPosition = dwData;
}
else
{
if (CItem::IsGhostGem(idItemType))
nItemPosition = ITEMPOSITION_GHOSTGEM_PACK;
else if (CItem::IsEudemon(idItemType))
nItemPosition = ITEMPOSITION_EUDEMON_PACK;
else if (CItem::IsEudemonEgg(idItemType))
nItemPosition = ITEMPOSITION_EUDEMONEGG_PACK;
}
return IsPackSpare(nNum, nItemPosition);
}
//////////////////////////////////////////////////////////////////////
bool CUserPackage::IsPackSpare(int nNum, int nPosition)
{
CHECKF(nPosition >= ITEMPOSITION_PACK_BEGIN && nPosition < ITEMPOSITION_PACK_END);
int nPackType = GetPackType(nPosition);
if (nPackType == -1)
return false;
if (m_setItem[nPackType]->GetAmount() + nNum > _MAX_PACK_SIZES[nPackType])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -