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

📄 user_item.cpp

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

			pItem->GetInfo(&info);
			bDropItem	= pItem->IsExchangeEnable();

			if (pItem->IsNonsuchItem())
			{
				::MyLogSave("gmlog/drop_item", "%s(%u) drop equip:[id=%u, type=%u], dur=%d, max_dur=%d", 
						this->GetName(),
						this->GetID(),
						pItem->GetID(), 
						pItem->GetInt(ITEMDATA_TYPE),
						pItem->GetInt(ITEMDATA_AMOUNT),
						pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
			}

			pItem->DeleteRecord();				//??? 防作弊,提前删除
			pItem->ReleaseByOwner();
			pItem = NULL;
			break;
		}
	}
	if(i >= ITEMPOSITION_EQUIPEND)
	{
		pItem = GetItem(idItem);
		if (pItem)
		{
			if (pItem->IsNonsuchItem())
			{
				::MyLogSave("gmlog/drop_item", "%s(%u) drop item:[id=%u, type=%u], dur=%d, max_dur=%d", 
						this->GetName(),
						this->GetID(),
						pItem->GetID(), 
						pItem->GetInt(ITEMDATA_TYPE),
						pItem->GetInt(ITEMDATA_AMOUNT),
						pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
			}

			if (pItem->IsDiscardable())
			{
				// 丢弃幻兽要扣亲密度
				if (pItem->IsEudemon())
				{
					CallBackEudemon(pItem->GetID());
					DetachEudemon(pItem);
					int nFidelity = __max(0, pItem->GetInt(ITEMDATA_FIDELITY) - EUDEMON_DEC_FIDELITY_WHEN_DEAL);
					pItem->SetInt(ITEMDATA_FIDELITY, nFidelity);
				}
				//丢弃物品重新设置战魂经验值
				pItem->WarGhostLevelReset();

				pItem->GetInfo(&info);
				bDropItem	= pItem->IsExchangeEnable();
				char szPrompt[255];
				sprintf(szPrompt,STR_DROPITEM_PROMPT,pItem->GetStr(ITEMDATA_NAME));			
				this->SendSysMsg(szPrompt);
				EraseItem(idItem, SYNCHRO_TRUE);			//??? 防作弊,提前删除
				pItem = NULL;
			}
			else
			{
				this->SendSysMsg(STR_NOT_DISCARDABLE);
				return false;				
			}
		}
	}

	if(bDropItem)
	{
		POINT	pos;
		pos.x	= x;
		pos.y	= y;
		CMapItem* pMapItem = CMapItem::CreateNew();
		if(pMapItem)
		{
			IF_OK(pMapItem->Create(MapManager()->SpawnMapItemID(), GetMap(), pos, &info))
			{
				MapManager()->QueryMapItemSet()->AddObj(pMapItem);
			}
			else
			{
				this->SendSysMsg(STR_MAKE_ITEM_FAILED, pMapItem->GetInfo()->idType);
				pMapItem->ReleaseByOwner();
			}
		}
	}

	UpdateWeight();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::DropMoney (DWORD dwMoney, int x, int y)
{
//	CHECKF(nMoney > 0);
	CHECKF(GetMap()->IsLayItemEnable(x, y));
	if(this->GetMoney() < dwMoney)
		return false;

	POINT	pos;
	pos.x	= x;
	pos.y	= y;
	CMapItem* pMapItem = CMapItem::CreateNew();
	if(pMapItem)
	{
		if(pMapItem->CreateMoney(MapManager()->SpawnMapItemID(), GetMap(), pos, dwMoney))
		{
			this->SpendMoney(dwMoney, SYNCHRO_TRUE);				// 先删除,防止作弊
			MapManager()->QueryMapItemSet()->AddObj(pMapItem);
			if (this->IsAlive())
				this->SendSysMsg(STR_DROP_MONEY_SUCC, dwMoney);
			else
				this->SendSysMsg(STR_DIE_DROP_MONEY, dwMoney);
		}
		else
		{
			this->SendSysMsg(STR_MAKE_MONEY_FAILED, dwMoney);
			pMapItem->ReleaseByOwner();
		}
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::SplitItem		(OBJID idItem, int nNum)
{
//	if(IsItemFull(0))
//		return false;

	CItemPtr pItem = GetItem(idItem);
	if(!pItem || !pItem->IsPileEnable() || nNum <= 0 || nNum >= pItem->GetInt(ITEMDATA_AMOUNT))
		return false;

	// 检查背包是否满
	if (this->IsItemFull(0, pItem->GetInt(ITEMDATA_TYPE), pItem->GetInt(ITEMDATA_AMOUNTLIMIT)))
	{
		return false;
	}


	CItemPtr pOther = pItem->Split(nNum);
	CHECKF(pOther);
	AddItem(pOther, SYNCHRO_TRUE);

	{
		CMsgItem	msg;
		IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
			SendMsg(&msg);
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::CombineItem		(OBJID idItem, OBJID idOther)
{
	CItemPtr pItem = GetItem(idItem);
	CItemPtr pOther = GetItem(idOther);
	if(!pItem || !pOther || !pItem->IsPileEnable() || pItem->GetInt(ITEMDATA_TYPE) != pOther->GetInt(ITEMDATA_TYPE))
		return false;

	int nNewNum		= pItem->GetInt(ITEMDATA_AMOUNT) + pOther->GetInt(ITEMDATA_AMOUNT);
	if(nNewNum > pItem->GetInt(ITEMDATA_AMOUNTLIMIT))
	{
		pOther->SetInt(ITEMDATA_AMOUNT, nNewNum - pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pOther->GetID(), ITEMACT_SYNCHRO_AMOUNT, pOther->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}
		pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}
	}
	else
	{
		EraseItem(idOther, SYNCHRO_TRUE);
		pItem->SetInt(ITEMDATA_AMOUNT, nNewNum);
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}
	}

	return true;
}

//////////////////////////////////////////////////////////////////////
CItem* CUser::CombineNewItem	(CItem* pItem, ItemInfoStruct* pInfo, bool bSynchro)
{
	CHECKF(CItem::IsCountable(pInfo->idType));
	CHECKF(pItem->GetInt(ITEMDATA_TYPE) == pInfo->idType);

	int nNewNum		= pItem->GetInt(ITEMDATA_AMOUNT) + pInfo->nAmount;
	if(nNewNum > pItem->GetInt(ITEMDATA_AMOUNTLIMIT))
	{
		// other
		pInfo->nAmount	= nNewNum - pItem->GetInt(ITEMDATA_AMOUNTLIMIT);

		CItemPtr pOther = CItem::CreateNew();
		CHECKF(pOther);
		if(!pOther->Create(GameDataDefault()->GetGameItemData(), pInfo, GameDataDefault()->GetEudemonData()))
		{
			pOther->ReleaseByOwner();
			return NULL;
		}

		this->AddItem(pOther, bSynchro);

		// item
		pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
		if(bSynchro)
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}

		return pOther;
	}
	else
	{
		pItem->SetInt(ITEMDATA_AMOUNT, nNewNum);
		if(bSynchro)
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}

		return pItem;
	}
}

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

//////////////////////////////////////////////////////////////////////
bool CUser::SpendArrow()
{
	CItem* pArrow = GetEquipItemByPos(ITEMPOSITION_WEAPONL);
	if(!pArrow)
		return false;
	CHECKF(pArrow->IsArrowSort());

	// spend one
	return SpendItem(pArrow, 1, ITEMPOSITION_WEAPONL);
}

//////////////////////////////////////////////////////////////////////
bool CUser::SpendItem(CItem* pItem, int nNum/*=1*/, int nPosition/*=ITEMPOSITION_BACKPACK*/, bool bSynchro/*=true*/)	// may be erase
{
	if(pItem->IsPileEnable() && pItem->GetInt(ITEMDATA_AMOUNT) > nNum)
	{
		pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT) - nNum);

		if(bSynchro)
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}
	}
	else
	{
		if(pItem->IsPileEnable())
			ASSERT(pItem->GetInt(ITEMDATA_AMOUNT) == nNum);

		if(nPosition >= ITEMPOSITION_PACK_BEGIN && nPosition < ITEMPOSITION_PACK_END)
			EraseItem(pItem->GetID(), bSynchro);
		else
		{
			ASSERT(nPosition >= ITEMPOSITION_EQUIPBEGIN && nPosition < ITEMPOSITION_EQUIPEND);
			EraseEquip(nPosition, bSynchro);
		}
	}

	UpdateWeight();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::SpendItemByType(OBJID idType, bool bSynchro)
{
	CHECKF(idType);

	CItem* pItem = GetTaskItemByType(idType);
	if(!pItem)
		return false;

	if(pItem->IsExpend() && pItem->GetInt(ITEMDATA_AMOUNT) > 1)
	{
		pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT) - 1);

		if(bSynchro)
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}
	}
	else
	{
		if (pItem->IsNonsuchItem())
		{
			::MyLogSave("gmlog/SpendItemByType", "%s(%u) Spend item:[id=%u, type=%u], dur=%d, max_dur=%d", 
					this->GetName(),
					this->GetID(),
					pItem->GetID(), 
					pItem->GetInt(ITEMDATA_TYPE),
					pItem->GetInt(ITEMDATA_AMOUNT),
					pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
		}

		EraseItem(pItem->GetID(), bSynchro);
	}

	UpdateWeight();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::SpendEquipItem(int nSubType, int nNum, bool bSynchro)
{
	CHECKF(nNum > 0);

	CItem* pItem = NULL;
	if (m_pWeaponR && m_pWeaponR->GetItemSubType() == nSubType && m_pWeaponR->GetInt(ITEMDATA_AMOUNT) >= nNum)
		pItem = m_pWeaponR;
	else if (m_pWeaponL && m_pWeaponL->GetItemSubType() == nSubType && m_pWeaponL->GetInt(ITEMDATA_AMOUNT) >= nNum)
		pItem = m_pWeaponL;
	IF_NOT(pItem)
		return false;

	//ASSERT(!pItem->IsExpend() || pItem->GetInt(ITEMDATA_AMOUNT) >= nNum);
	ASSERT(pItem->IsExpend() && pItem->GetInt(ITEMDATA_AMOUNT) >= nNum);

	if(pItem->IsExpend() && pItem->GetInt(ITEMDATA_AMOUNT) > nNum)
	{
		pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT) - nNum);

		if(bSynchro)
		{
			CMsgItem	msg;
			IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
				SendMsg(&msg);
		}
	}
	else
	{
		if (pItem->IsNonsuchItem())
		{
			::MyLogSave("gmlog/SpendEquipItem", "%s(%u) Spend item:[id=%u, type=%u], dur=%d, max_dur=%d", 
					this->GetName(),
					this->GetID(),
					pItem->GetID(), 
					pItem->GetInt(ITEMDATA_TYPE),
					pItem->GetInt(ITEMDATA_AMOUNT),
					pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
		}

		this->EraseEquip(pItem->GetInt(ITEMDATA_POSITION), bSynchro);
	}

	UpdateWeight();
	return true;
}

//////////////////////////////////////////////////////////////////////
bool CUser::RepairItem		(OBJID idItem, bool bSynchro)
{
	CHECKF(idItem);
	CItemPtr pItem = GetEquipItem(idItem);
	if(!pItem)
		pItem = GetItem(idItem);

	if(!( pItem && pItem->IsRepairEnable() && pItem->GetInt(ITEMDATA_AMOUNTLIMIT) > pItem->GetInt(ITEMDATA_AMOUNT) ))
	{
		this->SendSysMsg(STR_REPAIR_FAILED);	
		return false;
	}

	int nMoney		= pItem->CalcRepairMoney();
	int	nRepair		= pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - pItem->GetInt(ITEMDATA_AMOUNT);
	if(nMoney <= 0 || nRepair <= 0)
		return true;

	//---jinggy如果玩家的武器或装备的耐久<=10%才修理,则战魂经验减3点---begin
	if(pItem->IsEquipment()||pItem->IsWeapon())
	{
		int nScale = pItem->GetInt(ITEMDATA_AMOUNT)*100/pItem->GetInt(ITEMDATA_AMOUNTLIMIT);
		if(nScale<=10)
		{
			pItem->WarGhostLevelDec(DEC_WARGHOSTEXP_FORREPAIR);
			//通知客户端 设备属性更新
			CMsgItemInfo msg;			
			IF_OK (msg.Create(pItem))
				SendMsg(&msg);
		}
	}
	//---jinggy如果玩家的武器或装备的耐久<=10%才修理,则战魂经验减3点---end
	
	//---jinggy---过是向帮派NPC买,修理东西,帮派成员有优惠---begin
	/*CGameMap * pSynMap = this->GetMap();
	if(pSynMap->IsSynMap())
	{
		if(pSynMap->GetSynID() == this->GetSynID())
		{
			int nSynMemLevel = this->QuerySynAttr()->GetSynMemberLevel();			
			nPrice = MulDiv(nPrice, __max(0, (100-5*nSynMemLevel)), 100);
		}
	}*/
	//---jinggy---过是向帮派NPC买,修理东西,帮派成员有优惠---end



	if (!this->SpendMoney(nMoney, SYNCHRO_TRUE))
	{
		this->SendSysMsg(STR_REPAIR_NO_MONEY_d, nMoney);	
		return false;	// not enough money
	}

/*	// 圣战要求修理装备不降低最大耐久度
	// max durability changed
	CHECKF(pItem->IsEquipment());

	if (pItem->GetInt(ITEMDATA_AMOUNT) < pItem->GetInt(ITEMDATA_AMOUNTLIMIT) / 2)
	{
		if(::RandGet(100) < 5)
			pItem->SetInt(ITEMDATA_AMOUNTLIMIT, ::CutTrail(1, pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - 1));
	}
	else if(pItem->GetInt(ITEMDATA_AMOUNT) < pItem->GetInt(ITEMDATA_AMOUNTLIMIT) / 10)
	{
		if(::RandGet(100) < 10)
			pItem->SetInt(ITEMDATA_AMOUNTLIMIT, ::CutTrail(1, pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - 1));
	}
	else
	{
		if(::RandGet(100) < 80)
			pItem->SetInt(ITEMDATA_AMOUNTLIMIT, ::CutTrail(1, pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - 1));
	}
*/

	pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNTLIMIT), true);

	if (bSynchro)
	{
		CMsgItemInfo msg;
		CHECKF(msg.Create(pItem, ITEMINFO_UPDATE));
		SendMsg(&msg);
	}

	return true;
}


//////////////////////////////////////////////////////////////////////
bool CUser::RepairAll		(bool bSynchro)
{
	/*
	int nMoney = 0;
	for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
	{
		CItem* pEquip = GetEquipItemByPos(i);
		if(pEquip)
			nMoney	+= pEquip->CalcRepairMoney();
	}

	if(GetMoney() < nMoney)
		return false;

	for( i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
	{
		CItem* pEquip = GetEquipItemByPos(i);
		if(pEquip && pEquip->CalcRepairMoney() > 0)
			pEquip->SetInt(ITEMDATA_AMOUNT, pEquip->GetInt(ITEMDATA_AMOUNTLIMIT), UPDATE_FALSE);
	}

	if(bSynchro)
	{
		CMsgItem	msg;
		CHECKF(msg.Create(ID_NONE, ITEMACT_REPAIRALL));
		SendMsg(&msg);
	}

	return true;
	*/

	// 暂时去掉
	return false;
}

//////////////////////////////////////////////////////////////////////
bool CUser::IdentItem		(OBJID idItem, bool bSynchro)
{
	CHECKF(idItem);
	CItemPtr pItem = GetEquipItem(idItem);
	if(!pItem)
		pItem = GetItem(idItem);
	if(!( pItem && pItem->IsNeedIdent() ))
		return false;

⌨️ 快捷键说明

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