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

📄 user_item.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// User.cpp: implementation of the CUser class.
//
//////////////////////////////////////////////////////////////////////

#include "AllMsg.h"
#include "User.h"
#include "MapGroup.h"
#include "netmsg.h"
#include "ItemType.h"
#include "MapItem.h"
#include "Package.h"

const int	MINI_ADDLIFE_DRAG				= 100;
//const int	ADDLIFE_FIRST_PERCENT			= 40;
//const int	ADDLIFE_NEXT_PERCENT			= 20;
const int	STORAGE_NPC_ID					= 1005;		//? 信仰仓库互通
const int	_MINE_RANGE						= 1;		// 挖矿距离

//////////////////////////////////////////////////////////////////////
// item
//////////////////////////////////////////////////////////////////////
bool CUser::CreateAllItem(IDatabase* pDb)
{
	ASSERT(m_pPackage);

	// 载入背包物品
	if (!m_pPackage->Create(this, pDb))
	{
		return false;
	}

	// 载入装备物品
	SQLBUF		szSQL;
	//sprintf(szSQL, "SELECT * FROM %s WHERE owner_id=%u && position<=%u LIMIT %d", _TBL_ITEM, GetID(), ITEMPOSITION_USER_LIMIT, _MAX_ALLUSERITEMSIZE);
	sprintf(szSQL, "SELECT * FROM %s WHERE owner_id=%u && position >= %u && position<%u LIMIT %d", _TBL_ITEM, GetID(), ITEMPOSITION_EQUIPBEGIN, ITEMPOSITION_EQUIPEND, ITEMPOSITION_EQUIPEND - ITEMPOSITION_EQUIPBEGIN);
	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))
				{
					int nPosition = pItem->GetInt(ITEMDATA_POSITION);
					CItemPtr& refpEquip = GetEquipItemRef(nPosition);
					if(!refpEquip)				//? 防止两个物品的POSITION相同 paled
					{
						refpEquip = pItem;
						EquipMagicItem(pItem, nPosition);
					}
					else
					{
						char err[256];
						sprintf(err,"Found same position of user equip.The Item ID: %d",pItem->GetID());
						LOGWARNING(err);
						pItem->ReleaseByOwner();
					}
				}
				else
				{
					LOGERROR("玩家[%s]无法加载物品[%u]", GetName(), pItem->GetID());
					pItem->ReleaseByOwner();
				}
			}

			pRes->MoveNext();
		}
		pRes->Release();
	}

	UpdateWeight();
	return true;
}

//////////////////////////////////////////////////////////////////////
void CUser::SaveItemInfo()
{
	if(m_pHelmet)
		m_pHelmet->SaveInfo();
	if(m_pNecklace)
		m_pNecklace->SaveInfo();
	if(m_pArmor)
		m_pArmor->SaveInfo();
	if(m_pWeaponR)
		m_pWeaponR->SaveInfo();
	if(m_pWeaponL)
		m_pWeaponL->SaveInfo();
	if(m_pRingR)
		m_pRingR->SaveInfo();
	if(m_pRingL)
		m_pRingL->SaveInfo();
	if(m_pShoes)
		m_pShoes->SaveInfo();
	if(m_pMount)
		m_pMount->SaveInfo();
	if(m_pSprite)
		m_pSprite->SaveInfo();
	if (m_pMantle)
		m_pMantle->SaveInfo();

	m_pPackage->SaveAllInfo();
}

//////////////////////////////////////////////////////////////////////
void CUser::DeleteAllItem()
{
	SAFE_RELEASEBYOWNER(m_pHelmet);
	SAFE_RELEASEBYOWNER(m_pNecklace);
	SAFE_RELEASEBYOWNER(m_pArmor);
	SAFE_RELEASEBYOWNER(m_pWeaponR);
	SAFE_RELEASEBYOWNER(m_pWeaponL);
	SAFE_RELEASEBYOWNER(m_pRingR);
	SAFE_RELEASEBYOWNER(m_pRingL);
	SAFE_RELEASEBYOWNER(m_pShoes);
	SAFE_RELEASEBYOWNER(m_pMount);
	SAFE_RELEASEBYOWNER(m_pSprite);
	SAFE_RELEASEBYOWNER(m_pMantle);

	m_pPackage->ClearAll();

	UpdateWeight();
}

//////////////////////////////////////////////////////////////////////
void CUser::SendAllItemInfo()
{
	if(m_pHelmet)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pHelmet, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pNecklace)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pNecklace, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pArmor)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pArmor, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pWeaponR)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pWeaponR, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pWeaponL)
	{
		// auto correct (enable since arrow)
//		if (m_pWeaponR && m_pWeaponR->GetItemSort() == ITEMSORT_WEAPON2)
		{
//			ASSERT(!"auto unquiponly when error weapon, may be not backpack room.");
//			this->UnEquipOnly(ITEMPOSITION_WEAPONL);
		}
//		else
		{
			CMsgItemInfo	msg;
			if(msg.Create(m_pWeaponL, ITEMINFO_ADDITEM))
				this->SendMsg(&msg);
		}
	}
	if(m_pRingR)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pRingR, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pRingL)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pRingL, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pShoes)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pShoes, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pMount)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pMount, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pSprite)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pSprite, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}
	if(m_pMantle)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pMantle, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}

	m_pPackage->SendAllItemInfo();
}

//////////////////////////////////////////////////////////////////////
void CUser::SendAllEquipInfoTo(CUser* pRecv)
{
	CHECK(pRecv);

	if(m_pHelmet)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pHelmet, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pNecklace)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pNecklace, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pArmor)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pArmor, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pWeaponR)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pWeaponR, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pWeaponL)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pWeaponL, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pRingR)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pRingR, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pRingL)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pRingL, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pShoes)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pShoes, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pMount)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pMount, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pSprite)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pSprite, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
	if(m_pMantle)
	{
		CMsgItemInfo	msg;
		if(msg.Create(m_pMantle, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
			pRecv->SendMsg(&msg);
	}
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::GetItem(OBJID idItem)
{
	return m_pPackage->GetItem(idItem);
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::GetItemByType(OBJID idType)
{
	return m_pPackage->GetItemByType(idType);
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::GetTaskItem(LPCTSTR szItemName)
{
	return m_pPackage->GetTaskItem(szItemName);
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::GetTaskItemByType(OBJID idType, int nAmount/*=0*/)
{
	return m_pPackage->GetTaskItemByType(idType, nAmount);
}

/////////////////////////////////////////////////////////////////////////////
CItem* CUser::FindSpaceTransSpell()
{
	return m_pPackage->FindSpaceTransSpell();
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::GetEquipItem(OBJID idItem)
{
	if(m_pHelmet && m_pHelmet->GetID() == idItem)
		return m_pHelmet;
	else if(m_pNecklace && m_pNecklace->GetID() == idItem)
		return m_pNecklace;
	else if(m_pArmor && m_pArmor->GetID() == idItem)
		return m_pArmor;
	else if(m_pWeaponR && m_pWeaponR->GetID() == idItem)
		return m_pWeaponR;
	else if(m_pWeaponL && m_pWeaponL->GetID() == idItem)
		return m_pWeaponL;
	else if(m_pRingR && m_pRingR->GetID() == idItem)
		return m_pRingR;
	else if(m_pRingL && m_pRingL->GetID() == idItem)
		return m_pRingL;
	else if(m_pShoes && m_pShoes->GetID() == idItem)
		return m_pShoes;
	else if(m_pMount && m_pMount->GetID() == idItem)
		return m_pMount;
	else if(m_pSprite && m_pSprite->GetID() == idItem)
		return m_pSprite;
	else if(m_pMantle && m_pMantle->GetID() == idItem)
		return m_pMantle;

	return NULL;
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::GetEquipItemByPos(int nPosition)
{
	CItemPtr* ppEquip = this->GetEquipItemPtr(nPosition);
	if (!ppEquip)
		return NULL;
	
	return *ppEquip;
}

//////////////////////////////////////////////////////////////////////
CItemPtr* CUser::GetEquipItemPtr(int nPosition)
{
	switch(nPosition)
	{
	case	ITEMPOSITION_HELMET:
		return &m_pHelmet;
	case	ITEMPOSITION_NECKLACE:
		return &m_pNecklace;
	case	ITEMPOSITION_ARMOR:
		return &m_pArmor;
	case	ITEMPOSITION_WEAPONR:
		return &m_pWeaponR;
	case	ITEMPOSITION_WEAPONL:
		return &m_pWeaponL;
	case	ITEMPOSITION_RINGR:
		return &m_pRingR;
	case	ITEMPOSITION_RINGL:
		return &m_pRingL;
	case	ITEMPOSITION_SHOES:
		return &m_pShoes;
	case	ITEMPOSITION_MOUNT:
		return &m_pMount;
	case	ITEMPOSITION_SPRITE:
		return &m_pSprite;
	case	ITEMPOSITION_MANTLE:
		return &m_pMantle;
	}

	return NULL;
}

//////////////////////////////////////////////////////////////////////
bool CUser::DelItem	(OBJID idItem, bool bSynchro)
{
	if (m_pPackage->DelItem(idItem))
	{
		if(bSynchro)
		{
			CMsgItem msg;
			if(msg.Create(idItem, ITEMACT_DROP))
				this->SendMsg(&msg);
		}
		return true;
	}
	else
		return false;
}

//////////////////////////////////////////////////////////////////////
bool CUser::AddItem (CItem* pItem, bool bSynchro, bool bUpdate /*= true*/)
{
	CHECKF(pItem);
	
	if (pItem->GetInt(ITEMDATA_OWNERID) != GetID())
		pItem->SetInt(ITEMDATA_OWNERID, GetID());

	if (pItem->GetInt(ITEMDATA_PLAYERID) != GetID())
		pItem->SetInt(ITEMDATA_PLAYERID, GetID());
	
	if (!m_pPackage->AddItem(pItem, bUpdate))
		return false;

	if(bSynchro)
	{
		CMsgItemInfo msg;
		if(msg.Create(pItem, ITEMINFO_ADDITEM))
			this->SendMsg(&msg);
	}


	UpdateWeight();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::DelItemPt (OBJID idItem)
{
	if (m_pPackage->PopItem(idItem))
	{
		UpdateWeight();
		return true;
	}
	return false;
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::PopItem (OBJID idItem, bool bSynchro, bool bUpdate)			// 立即清除OWNER
{
	CItemPtr pItem = m_pPackage->PopItem(idItem);
	if (pItem)
	{
		pItem->SetInt(ITEMDATA_PLAYERID, ID_NONE, UPDATE_FALSE);
		pItem->SetInt(ITEMDATA_OWNERID, ID_NONE, bUpdate);			// 立即清除OWNER
		if(bSynchro)
		{
			CMsgItem msg;
			if(msg.Create(idItem, ITEMACT_DROP))
				this->SendMsg(&msg);
		}

		UpdateWeight();
		return pItem;
	}
	return NULL;
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::AwardItem(int nItemType, bool bSynchro, bool bIdentOK/*=false*/, bool bAutoCombine/*=true*/)		// 同时操作数据库
{
	ItemInfoStruct info;
	ASSERT(ItemType()->GetInfo(nItemType, &info));
	info.idOwner	= GetID();
	info.idPlayer	= GetID();
	info.nPosition	= this->QueryPackage()->GetItemPositionByType(nItemType);
	if(bIdentOK)
		info.nIdent	&= ~_ITEM_STATUS_NOT_IDENT;

	return AwardItem(&info, bSynchro, bAutoCombine);
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::AwardItem(ItemInfoStruct* pInfo, bool bSynchro, bool bAutoCombine/*=true*/)		// 同时操作数据库
{
	CHECKF (pInfo);

	// check weight
	int nItemType = pInfo->idType;
	if(GetWeight() + CItem::GetWeight(nItemType) > GetWeightLimit())
	{
		this->SendSysMsg(STR_HEAVEY_BAG);
		return NULL;
	}

	if(bAutoCombine && CItem::IsCountable(nItemType))
	{
		//CItemTypeData* pType = ItemType()->QueryItemType(pInfo->idType);
		//CHECKF(pType);
		if(!CItem::IsNeedIdent(pInfo->nIdent) && pInfo->nAmount < pInfo->nAmountLimit)
		{
			CItem* pItem = FindCombineItem(nItemType);
			if(pItem)
			{
				// check size
				if(pItem->GetInt(ITEMDATA_AMOUNT) + pInfo->nAmount > pInfo->nAmountLimit
						&& m_pPackage->IsPackFull(pItem))
				{
					if (pItem->IsGhostGem())
						this->SendSysMsg(STR_GEMBAG_FULL);
					else
						this->SendSysMsg(STR_ITEMBAG_FULL);
					return NULL;
				}

				return CombineNewItem(pItem, pInfo, bSynchro);
			}
		}
	}

	if (m_pPackage->IsPackFull(m_pPackage->GetItemPositionByType(nItemType)))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -