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

📄 user_item.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	{
		if (CItem::IsGhostGem(nItemType))
			this->SendSysMsg(STR_GEMBAG_FULL);
		else
			this->SendSysMsg(STR_ITEMBAG_FULL);
		return NULL;
	}

	CItemPtr pItem = CItem::CreateNew();
	CHECKF(pItem);
	bool INSERT_TRUE = true;
	if(!pItem->Create(GameDataDefault()->GetGameItemData(), pInfo, GameDataDefault()->GetEudemonData(), INSERT_TRUE, pInfo->id))
	{
		pItem->ReleaseByOwner();

		ASSERT(!"Create");
		this->SendSysMsg(STR_FAILED_GENERATE_ITEM);
		return NULL;
	}

	if (!AddItem(pItem, bSynchro))
	{
		//如果添加物品失败!
		::LogSave("AddItem failed in CUser::AwardItem.");
		pItem->DeleteRecord();
		pItem->ReleaseByOwner();
		return NULL;
	}
	return pItem;
}

//////////////////////////////////////////////////////////////////////
bool CUser::EraseItem(OBJID idItem, bool bSynchro)		// 同时操作数据库
{
	CItemPtr pItem = m_pPackage->PopItem(idItem);
	if (pItem)
	{
		pItem->DeleteRecord();
		pItem->ReleaseByOwner();

		if(bSynchro)
		{
			CMsgItem msg;
			if(msg.Create(idItem, ITEMACT_DROP))
				this->SendMsg(&msg);
		}

		UpdateWeight();
		return true;
	}
	else
		return false;
}

//////////////////////////////////////////////////////////////////////
bool CUser::EraseEquip(int nPosition, bool bSynchro)		// 同时操作数据库
{
	CItemPtr& refpEquip = GetEquipItemRef(nPosition);
	CHECKF(refpEquip);

	OBJID idItem = refpEquip->GetID();
	refpEquip->DeleteRecord();
	refpEquip->ReleaseByOwner();
	refpEquip = NULL;

	if(bSynchro)
	{
		CMsgItem msg;
		if(msg.Create(idItem, ITEMACT_DROPEQUIPMENT, nPosition))
			this->SendMsg(&msg);

		if(nPosition == ITEMPOSITION_HELMET
				|| nPosition == ITEMPOSITION_ARMOR
				|| nPosition == ITEMPOSITION_WEAPONR
				|| nPosition == ITEMPOSITION_WEAPONL
				|| nPosition == ITEMPOSITION_MANTLE )
		{
			CMsgPlayer msgPlayer;
			if (msgPlayer.Create(this->QueryRole()))
				this->BroadcastRoomMsg(&msgPlayer, EXCLUDE_SELF);
		}
	}

//	UnequipMagicItem(nPosition);				// 在下次 SetAtkTarget()时删除
	UpdateWeight();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::EquipItem(CItem* pItem, int nPosition, bool bSynchro)
{
	CHECKF(pItem);

	if (QueryMagic())
		QueryMagic()->AbortMagic();

	OBJID idItem = pItem->GetID();
	if (!this->TryItem(idItem, nPosition))
		return false;

	// 双击,自动安排
	if(nPosition >= ITEMPOSITION_PACK_BEGIN && nPosition < ITEMPOSITION_PACK_END)
	{
		if (this->IsWing())
			return false;

		if(pItem->IsHelmet())
		{
			nPosition	= ITEMPOSITION_HELMET;
		}
		else if(pItem->IsNecklace())
		{
			nPosition	= ITEMPOSITION_NECKLACE;
		}
		else if(pItem->IsArmor())
		{
			nPosition	= ITEMPOSITION_ARMOR;
		}
		else if(pItem->IsHoldEnable())
		{
			if(pItem->IsArrowSort())
			{
				nPosition	= ITEMPOSITION_WEAPONL;
			}
			else if(pItem->IsWeapon2())
			{
				nPosition	= ITEMPOSITION_WEAPONR;
			}
			else if(pItem->IsWeapon1() && (!m_pWeaponR || m_pWeaponL))
			{
				nPosition	= ITEMPOSITION_WEAPONR;
			}
			else // if(pItem->IsWeapon1() && !m_pWeaponL || pItem->IsShield())
			{
				nPosition	= ITEMPOSITION_WEAPONL;
			}
		}
		else if(pItem->IsRing())
		{
			nPosition	= ITEMPOSITION_RINGR;
		}
		else if (pItem->IsBangle())
		{
			nPosition	= ITEMPOSITION_RINGL;
		}
		else if(pItem->IsShoes())
		{
			nPosition	= ITEMPOSITION_SHOES;
		}
		else if(pItem->IsMount())
		{
			nPosition	= ITEMPOSITION_MOUNT;
		}
		else if(pItem->IsSprite())
		{
			nPosition	= ITEMPOSITION_SPRITE;
		}
		else if(pItem->IsMantle())
		{
			nPosition	= ITEMPOSITION_MANTLE;
		}
	}

	// 冗错
	//if(m_setItem.size() > _MAX_USERITEMSIZE)
/*
	if (m_pPackage->IsPackFull(pItem))
	{
		CItem* pEquip = GetEquipItemByPos(nPosition);
		if(pEquip)
			return false;
	}
*/

	// 先取出,以空出背包。
	CHECKF(DelItemPt(idItem));				// VVVVVVVVVVVVVVVVVVVVVVVVVVVV
	bool	bRet	= false;
	switch(nPosition)
	{
	case	ITEMPOSITION_HELMET:
		{
			if(pItem->IsHelmet())
			{
				UnEquipOnly(nPosition);
				m_pHelmet = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_HELMET);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_NECKLACE:
		{
			if(pItem->IsNecklace())
			{
				UnEquipOnly(nPosition);
				m_pNecklace = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_NECKLACE);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_ARMOR:
		{
			if(pItem->IsArmor())
			{
				UnEquipOnly(nPosition);
				m_pArmor = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_ARMOR);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_WEAPONR:
		{
			if(pItem->IsHoldEnable())
			{
				if(pItem->IsWeapon2())
				{
					if(!( m_pWeaponR && m_pWeaponL && !IsBackPackSpare(2, 0, ID_NONE, ITEMPOSITION_BACKPACK) ))
					{
						UnEquipOnly(ITEMPOSITION_WEAPONR);
						if(m_pWeaponL && !(m_pWeaponL->IsArrow() && pItem->IsBow() || m_pWeaponL->IsDart() && pItem->IsCrossBow()))
							UnEquipOnly(ITEMPOSITION_WEAPONL);

						m_pWeaponR = pItem;
						pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_WEAPONR);
						bRet	= true;
					}
				}
				else if(pItem->IsWeapon1())
				{
					if(!(m_pWeaponL && (m_pWeaponL->IsArrow() || m_pWeaponL->IsDart()) && !IsBackPackSpare(2, 0, ID_NONE, ITEMPOSITION_BACKPACK) ))
					{
						UnEquipOnly(ITEMPOSITION_WEAPONR);
						if(m_pWeaponL && m_pWeaponL->IsArrowSort())
							UnEquipOnly(ITEMPOSITION_WEAPONL);

						m_pWeaponR = pItem;
						pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_WEAPONR);
						bRet	= true;
					}
				}
			}
		}
		break;
	case	ITEMPOSITION_WEAPONL:
		{
			if(pItem->IsHoldEnable())
			{
				if(m_pWeaponR)
				{
					if( m_pWeaponR->IsWeapon1() && (pItem->IsWeapon1()||pItem->IsShield())
						|| m_pWeaponR->IsBow() && pItem->IsArrow() || m_pWeaponR->IsCrossBow() && pItem->IsDart() )
					{
						UnEquipOnly(nPosition);
						m_pWeaponL = pItem;
						pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_WEAPONL);
						UnequipMagicItem(ITEMPOSITION_WEAPONL);		//paled: need not
						bRet	= true;
					}
				}
			}
		}
		break;
	case	ITEMPOSITION_RINGR:
		{
			if(pItem->IsRing())
			{
				UnEquipOnly(nPosition);
				m_pRingR = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_RINGR);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_RINGL:
		{
			if(pItem->IsBangle())
			{
				UnEquipOnly(nPosition);
				m_pRingL = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_RINGL);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_SHOES:
		{
			if(pItem->IsShoes())
			{
				UnEquipOnly(nPosition);
				m_pShoes = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_SHOES);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_MOUNT:
		{
			if(pItem->IsMount())
			{
				UnEquipOnly(nPosition);
				m_pMount = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_MOUNT);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_SPRITE:	// add by zlong 2003-11-27
		{
			if (pItem->IsSprite())
			{
				UnEquipOnly(nPosition);
				m_pSprite = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_SPRITE);
				bRet	= true;
			}
		}
		break;
	case	ITEMPOSITION_MANTLE:
		{
			if (pItem->IsMantle())
			{
				UnEquipOnly(nPosition);
				m_pMantle = pItem;
				pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_MANTLE);
				bRet	= true;
			}
		}
		break;
	default:
		ASSERT(!"switch");
	} // switch
	if(!bRet)
		AddItem(pItem, SYNCHRO_FALSE);		// 恢复物品 AAAAAAAAAAAAAAAAAAAAAAA

	if(bRet)
	{


		//---jinggy---2004-11-19--启动设备经验值记数器---begin		
		if(pItem->GetWarGhostLevel()==MAX_LEVEL_WARLEVEL-1)
			UpdateEquipmentExp_Startup(nPosition,EQUIPMENT_EXP_ADD_SECS_AFTER9);
		else if(pItem->GetWarGhostLevel()<MAX_LEVEL_WARLEVEL-1)
			UpdateEquipmentExp_Startup(nPosition,EQUIPMENT_EXP_ADD_SECS);
		//---jinggy---2004-11-19--启动设备经验值记数器---end


		if(bSynchro)
		{
			CMsgItem msg;
			if(msg.Create(idItem, ITEMACT_EQUIP, nPosition))
				this->SendMsg(&msg);

			if(nPosition == ITEMPOSITION_HELMET
					|| nPosition == ITEMPOSITION_ARMOR
					|| nPosition == ITEMPOSITION_WEAPONR
					|| nPosition == ITEMPOSITION_WEAPONL
					|| nPosition == ITEMPOSITION_MANTLE
					|| nPosition == ITEMPOSITION_MOUNT )
			{
				CMsgPlayer msgPlayer;
				if (msgPlayer.Create(this->QueryRole()))
					this->BroadcastRoomMsg(&msgPlayer, EXCLUDE_SELF);
			}
		}

//		UpdateWeight();
		CalcFightRate();
		EquipMagicItem(pItem, nPosition);
		return true;
	}
	else
	{
		return false;
	}
}

//////////////////////////////////////////////////////////////////////
bool CUser::TryItem(OBJID idItem, int nPosition)
{
	CItemPtr pItem = GetItem(idItem);
	if(!pItem)
		return false;

	if (pItem->IsTaskItem())
		return false;

	if (pItem->GetInt(ITEMDATA_REQ_LEVEL) && pItem->GetInt(ITEMDATA_REQ_LEVEL) > GetLev())		// 综合等级
		return false;

	if (pItem->IsNeedIdent())
		return false;

	if (pItem->GetInt(ITEMDATA_REQ_SEX) && 
			(pItem->GetInt(ITEMDATA_REQ_SEX) & (1<<GetSex())) == 0)
		return false;

	if(pItem->IsMount() && pItem->GetInt(ITEMDATA_AMOUNT) == 0)
		return false;

	// rebirth ------------------------------------------------
	if(this->GetMetempsychosis() && GetLev() >= 70)
		return true;		//!

	if (pItem->GetInt(ITEMDATA_REQ_PROF) != 0)
	{
		int nRequireProfSort	= (pItem->GetInt(ITEMDATA_REQ_PROF)%1000)/10;
		int nRequireProfLevel	= pItem->GetInt(ITEMDATA_REQ_PROF)%10;

		int nProfSort  = this->GetProfessionSort();
		int nProfLevel = this->GetProfessionLevel();
		if (nRequireProfSort == 19)	// 道士通用
		{
			if (nProfSort < 10)	// 不是道士
				return false;
			else 
			{
				if (ITEMPOSITION_WEAPONL == nPosition)
					return false;
			}
		}
		else
		{
			if (nRequireProfSort != nProfSort)
				return false;
		}

		if (nProfLevel < nRequireProfLevel)
			return false;
	}

//	if (pItem->GetInt(ITEMDATA_REQ_SKILL) && pItem->IsWeapon() && 
//				pItem->GetInt(ITEMDATA_REQ_SKILL) > GetWeaponSkillLev(pItem->GetInt(ITEMDATA_TYPE)))
//		return false;

	if ((pItem->GetInt(ITEMDATA_REQ_FORCE) && pItem->GetInt(ITEMDATA_REQ_FORCE) > GetForce())
		|| (pItem->GetInt(ITEMDATA_REQ_DEX) && pItem->GetInt(ITEMDATA_REQ_DEX) > GetDex())
		|| (pItem->GetInt(ITEMDATA_REQ_HEALTH) && pItem->GetInt(ITEMDATA_REQ_HEALTH) > GetHealth())
		|| (pItem->GetInt(ITEMDATA_REQ_SOUL) && pItem->GetInt(ITEMDATA_REQ_SOUL) > GetSoul()))
	{
		return false;
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::ChkUseItem(CItem* pItem, IRole* pTarget)
{
	CHECKF (pItem);
	CHECKF (pTarget);

	USHORT	usTarget = pItem->GetInt(ITEMDATA_TARGET);
	if (usTarget == TARGET_NONE)
	{
		if (pTarget->GetID() == this->GetID())
			return true;
		else
			return false;
	}

	if (usTarget&TARGET_FORBIDDEN)
		return false;

	// PK模式由判断提示由客户端完成

	CUser* pUser = NULL;
	if (pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)))
	{
		// 限制使用对象
		if ((usTarget&TARGET_SELF) && pUser->GetID() != this->GetID()
			|| (usTarget&TARGET_OTHERS) && pUser->GetID() == this->GetID())
			return false;

		// 是否对尸体使用的限制
		if (((usTarget&TARGET_BODY) && pUser->IsAlive())
			|| (!(usTarget&TARGET_BODY) && !pUser->IsAlive()))
			return false;
	}
	else
	{
		CMonster* pMonster = NULL;
		if (!pTarget->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)))
			return false;

		// 判断目标类型
		if (!((usTarget&TARGET_MONSTER) && pMonster->IsMonster())
			&& !((usTarget&TARGET_EUDEMON) && pMonster->IsEudemon()))
			return false;

		// 判断限制条件
		CUser* pOwner = pMonster->QueryOwnerUser();
		if (pOwner)
		{
			if ((usTarget&TARGET_SELF) && pOwner->GetID() != this->GetID()
				|| (usTarget&TARGET_OTHERS) && pOwner->GetID() == this->GetID())
				return false;
		}

		if (((usTarget&TARGET_BODY) && pMonster->IsAlive())
			|| (!(usTarget&TARGET_BODY) && !pMonster->IsAlive()))
			return false;
	}

	return true;
}

//////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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