⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 userpackage.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -