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

📄 ggoodsarray.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:
//GGoodsArray.cc
/*/////////////////////////////////////////////////////////////////
物品阵列管理


   李亦
	liease@163.com 4040719
	2006-7-13
/*/////////////////////////////////////////////////////////////////



#include "rpg/gobjects/GGoodsArray.h"
#include "rpg/gobjects/GPlayer.h"
#include "rpg/RPGDataMan.h"


namespace RPG
{


/////////////////////////////////////////////////////////////////
// class GGoodsArray 构造函数 /析构函数
GGoodsArray::GGoodsArray(ERPGGoodsArrayTypes type)
{
	m_nArrayType = type;
}
GGoodsArray::~GGoodsArray()
{
}

//void GGoodsArray::initPersistFields()
//{
//}

//void GGoodsArray::consoleInit()
//{
//}

U32 GGoodsArray::AddGoods(GGoods* pGGoods)
{
	//暂不作重叠处理
	if(pGGoods == NULL)
		return false;

	U32 n;
	n = SearchBlankCell();
	if(n == -1)
		return -1;
	
	mArray[n] = pGGoods;
	return n;
}

U32 GGoodsArray::SearchBlankCell(U32 nAmount)
{
	U32 nCount = 0;
	U32 nHeader(-1);
	for(U32 n=0; n < mElementCount; n++)
	{
		if(mArray[n] == NULL)
		{	
			if(nHeader == -1)
				nHeader = n;
			nCount++;
			if(nCount >= nAmount)
				return nHeader;
		}//if
	}//for
	return -1;
}


U32 GGoodsArray::SearchCell(GGoods* pGGoods)
{
	for(U32 n=0; n < mElementCount; n++)
		if(mArray[n] == pGGoods)
		{	return n;}
	return -1;
}


U32 GGoodsArray::RemoveSameGoods(U32 nGoodsCode, EGGoodsKind kind, U32 nLevel,U32 nAmount)
{
	GGoods*	pGoods;
	U32 nCount = 0;

	for(U32 n=0; n < mElementCount; n++)
	{	
		pGoods = mArray[n];
		if(pGoods == NULL)
			continue;
		if(pGoods->IsTheSameGoods(nGoodsCode,  kind,  nLevel))
		{	
			g_pRPGDataMan->UnregGoods(pGoods->GetID());
			mArray[n] = NULL;
			nCount++;
			if(nAmount != -1 && nCount >= nAmount)
				break;
		}
	}
	return nCount;
}


//U32 GGoodsArray::RemoveSameGoods(const GEFFICACY& effData,GNpc* pNpc,GTaskBase* pTask)
U32 GGoodsArray::RemoveSameGoods(const GGOODSREF& ref)
{
	GGoods*	pGoods;
	U32 nCount = 0;

	if(!ref.pData)
		return 0;

	for(U32 n=0; n < mElementCount; n++)
	{	
		pGoods = mArray[n];
		if(pGoods == NULL)
			continue;
		if(pGoods->IsTheSameGoods(ref))//effData, pNpc, pTask))
		{	
//#ifdef TGE_RPGCLIENT
//			RPGChat::OutputTipF(TIP_GOODSREMOVED,pGoods->GetFullName(), n, pGoods->GetUnit() );
//#endif
			g_pRPGDataMan->UnregGoods(pGoods->GetID());
			mArray[n] = NULL;
			nCount++;
			if(ref.pData->nAmount != -1 && nCount >= ref.pData->nAmount)
				break;
		}
	}
	return nCount;
}


U32 GGoodsArray::CountSameGoods(U32 nGoodsCode, EGGoodsKind kind, U32 nLevel)
{
	U32 nCount = 0;
	for(U32 n=0; n < mElementCount; n++)
	{	
		if(mArray[n] == NULL)
			continue;
		if(mArray[n]->IsTheSameGoods(nGoodsCode,  kind,  nLevel))
		{	
			nCount++;
		}
	}
	return nCount;
}


//U32 GGoodsArray::CountSameGoods(const GEFFICACY& effData,GNpc* pNpc,GTaskBase* pTask)
U32 GGoodsArray::CountSameGoods(const GGOODSREF& ref)//const GEFFICACY& effData,GNpc* pNpc,GTaskBase* pTask)
{
	U32 nCount = 0;
	for(U32 n=0; n < mElementCount; n++)
	{	
		if(mArray[n] == NULL)
			continue;
		if(mArray[n]->IsTheSameGoods(ref))//effData, pNpc, pTask))
		{	
			nCount++;
		}
	}
	return nCount;
}



U32 GGoodsArray::CountSameGoods(GGoods* pGGoods)
{
	U32 nCount = 0;
	for(U32 n=0; n < mElementCount; n++)
	{	
		if(mArray[n] == NULL)
			continue;
		if(mArray[n]->IsTheSameGoods(pGGoods))
		{	
			nCount++;
		}
	}
	return nCount;
}


U32 GGoodsArray::SearchSameGoods(GGoods* pGGoods)
{
	for(U32 n=0; n < mElementCount; n++)
	{	
		if(mArray[n] == NULL)
			continue;
		if(mArray[n]->IsTheSameGoods(pGGoods))
			return n;
	}
	return -1;
}


U32 GGoodsArray::SearchSameGoods(U32 nGoodsCode, EGGoodsKind kind, U32 nLevel)
{
	for(U32 n=0; n < mElementCount; n++)
	{	
		if(mArray[n] == NULL)
			continue;
		if(mArray[n]->IsTheSameGoods(nGoodsCode, kind, nLevel))
			return n;
	}
	return -1;
}


//U32 GGoodsArray::SearchSameGoods(const GEFFICACY& effData,GNpc* pNpc,GTaskBase* pTask)
U32 GGoodsArray::SearchSameGoods(const GGOODSREF& ref)//const GEFFICACY& effData,GNpc* pNpc,GTaskBase* pTask)
{
	for(U32 n=0; n < mElementCount; n++)
	{	
		if(mArray[n] == NULL)
			continue;
		if(mArray[n]->IsTheSameGoods(ref))//effData,pNpc,pTask))
			return n;
	}
	return -1;
}




U32 GGoodsArray::SwapGoods(U32 uIndex,U32 uDest)
{
	GGoods* pGGoods;
	AssertWarn(uDest < size() && uIndex < size(), "uIndex超过Array范围了");

	pGGoods			= mArray[uIndex];
	if(IsEquipSlot())
	{
		if( !pGGoods->IsSubType(uDest) )
			return GPS_FAILED;
	}


	mArray[uIndex]	= mArray[uDest];
	mArray[uDest]	= pGGoods;
	return GPS_SWAP;
}

U32 GGoodsArray::PutGoodsTo(U32 uIndex, GGoodsArray* pArray,U32 uTo)
{
	if(!dynamic_cast<GPlayer*>(g_pGPlayer))
		return GPS_FAILED;

	if(pArray == NULL)
		return GPS_FAILED;

	if(uTo >= pArray->size() || uIndex >= size() )
		return GPS_FAILED;

	//if(!IsGoodsBag() && !IsEquipSlot() && !pArray->IsGoodsBag() && !pArray->IsEquipSlot())
	//	return false;
	if(	IsKeyCellBar() && !pArray->IsKeyCellBar() 
		||	IsActionBar() && !pArray->IsKeyCellBar()  )
		return false;

	GGoods*	pGGoods;
	U32		nAdd;


	pGGoods = mArray[uIndex];
	if(pGGoods == NULL)
		return GPS_FAILED;

	//背包槽 => 装备槽
	if(IsGoodsBag() && pArray->IsEquipSlot())
	{
		//装备上装  uTo须与 装备子类型一致
		//  1.背包物品 => 装备槽
		//	 2.清除背包物品
		if( pGGoods->IsGoodsType(GGT_EQUIP) && pGGoods->IsSubType(uTo) )
		{
			mArray[uIndex] = (*pArray)[uTo];
			(*pArray)[uTo] = pGGoods;
			g_pGPlayer->UpdateEquipToTShape((EGEquipTypes)uTo,pGGoods);
			return GPS_SWAP;
		}//if
		return GPS_FAILED;
	}

	// * => 背包槽
	else if(/*IsEquipSlot() &&*/ pArray->IsGoodsBag())
	{
		/// 背包uTo位置不可有物品
		if((*pArray)[uTo])
			return GPS_FAILED;
	}
	//装备槽 <=>装饰槽
	else if(IsEquipSlot() && pArray->IsEquipSlot())
		return GPS_FAILED;

	(*pArray)[uTo] = pGGoods;
	return GPS_OK;
}


U32 GGoodsArray::DiscardGoods(U32 uIndex,GGoodsInfo arRet[])
{
	GGoods*	pGGoods;
	U32		nAdd;
	GGoodsArray*  pOwnerAdd;


	arRet[0].nState = GAS_UPDATE;//GAS_OK;
	arRet[0].nIndex = uIndex;
	arRet[0].pOwner = this;


	if(IsGoodsBag())
	{
		Con::printf("暂时不提供物品掉弃功能...");
		return 0;
	}

	//装备槽处理
	else if(IsEquipSlot())
	{
		return OnGoodsApply(uIndex, arRet);
	}
	mArray[uIndex] = NULL;

	return 1;
}


BOOL GGoodsArray::RemoveGoods(U32 uIndex)
{
	if(!dynamic_cast<GPlayer*>(g_pGPlayer))
		return FALSE;

	if(uIndex >= size())
		return FALSE;
	
	if(mArray[uIndex] == NULL)
		return TRUE;

	//装备槽方面处理
	if(IsEquipSlot())
	{
		g_pGPlayer->UpdateEquipToTShape((EGEquipTypes)uIndex, NULL);
	}
	mArray[uIndex] = NULL;
	return TRUE;
}


U32 GGoodsArray::OnGoodsApply(U32 uIndex,GGoodsInfo arRet[])
{
	AssertWarn(uIndex < size(), "uIndex超过Array范围了");

	if(mArray[uIndex] == NULL)
		return 0;

	if(!dynamic_cast<GPlayer*>(g_pGPlayer))
		return 0;

	//不同物品槽,物品应用方向不一样
	//装备槽、装饰槽 => 卸装装备、清除槽中物品、并自动加到背包槽
	//背包槽 => 使用物品、上装等

	GGoodsArray*	pOwnerAdd;
	GGoods			*pGGoods;
	//GGoods			*pGGoods2;
	U32				nAdd;


	arRet[0].nState = GAS_OK;
	arRet[0].nIndex = uIndex;
	arRet[0].pOwner = this;

	pGGoods = mArray[uIndex];

	///////////////////////////////////////////////////////
	//快捷槽方面
	if(IsKeyCellBar())
	{
		U32 nSlot;
		//背包槽物品处理
		nSlot = g_pGPlayer->SearchBagGoods(pGGoods);
		if(nSlot != -1)
		{
			//装备上装
			//  0.取装备槽物品
			//  1.背包物品 => 装备槽
			//	 2.清除背包物品
			//	 3.快捷栏替换 换下的物品
			if( pGGoods->IsGoodsType(GGT_EQUIP) )
			{
				//pGGoods2 = g_pGPlayer->GetEquipment(pGGoods->GetSubType());
				nAdd		= g_pGPlayer->ApplyGoodsToEquip(pGGoods, nSlot,pOwnerAdd);
				if(nAdd != -1)
				{
					g_pGPlayer->UpdateEquipToTShape((EGEquipTypes)nAdd,pGGoods);
					if(g_pGPlayer->GetBagGoods(nSlot))
						mArray[uIndex]		= g_pGPlayer->GetBagGoods(nSlot);

					//装备槽更新信息
					arRet[1].nIndex = nAdd;
					arRet[1].pOwner = pOwnerAdd;
					arRet[1].nState = GAS_OK;

					//背包更新信息
					arRet[2].nIndex = nSlot;
					arRet[2].pOwner = &g_pGPlayer->m_arBagGoods;
					arRet[2].nState = GAS_OK;

					arRet[0].nState = GAS_UPDATE;
					return 3;
				}//if(nAdd != -1)
				return 0;
			}//if
		}
		else
		{
			//装备槽物品处理
			nSlot = g_pGPlayer->SearchEquipment(pGGoods);
			if(nSlot != -1)
			{
				//成功加到背包,否则不下装
				nAdd = g_pGPlayer->AddGoodsToBag(pGGoods,pOwnerAdd);
				if(nAdd != -1)
				{
					g_pGPlayer->RemoveEquipment(nSlot);
					g_pGPlayer->UpdateEquipToTShape((EGEquipTypes)pGGoods->GetSubType(),NULL);

					//背包更新信息
					arRet[1].nIndex = nAdd;
					arRet[1].pOwner = pOwnerAdd;
					arRet[1].nState = GAS_OK;

					//装备槽更新信息
					arRet[2].nIndex = nSlot;
					arRet[2].pOwner = &g_pGPlayer->m_arEquipments;
					arRet[2].nState = GAS_OK;

					//arRet[0].nState = GAS_OK; 处理
					return 3;
				}
			}//if(nSlot != -1)
		}//else

	}
	///////////////////////////////////////////////////////
	//装备槽方面
	else if(IsEquipSlot())
	{
		// 1.装备槽物品 => 背包
		// 2.清除装备槽物品
		nAdd = g_pGPlayer->AddGoodsToBag(pGGoods,pOwnerAdd);
		if(nAdd != -1)
		{
			mArray[uIndex]		= NULL;
			g_pGPlayer->UpdateEquipToTShape((EGEquipTypes)uIndex,NULL);

			//背包更新信息
			arRet[1].nIndex	= nAdd;
			arRet[1].pOwner	= pOwnerAdd;
			arRet[1].nState	= GAS_OK;

			//装备槽更新信息
			arRet[0].nState = GAS_UPDATE;
			return 2;
		}
		return 0;
	}

	///////////////////////////////////////////////////////////
	//背包槽方面
	else if(IsGoodsBag())
	{
		//装备上装
		//  1.背包物品 => 装备槽
		//	 2.清除背包物品
		if( pGGoods->IsGoodsType(GGT_EQUIP) )
		{
			mArray[uIndex] = NULL;
			nAdd = g_pGPlayer->ApplyGoodsToEquip(pGGoods, uIndex,pOwnerAdd);
			if(nAdd != -1)
			{
				g_pGPlayer->UpdateEquipToTShape((EGEquipTypes)nAdd,pGGoods);
				//装备槽更新信息
				arRet[1].nIndex = nAdd;
				arRet[1].pOwner = pOwnerAdd;
				arRet[1].nState = GAS_OK;

				//背包更新信息
				arRet[0].nState = GAS_UPDATE;
				return 2;
			}//if(nAdd != -1)
			return 0;
		}//if
	}//else if(IsGoodsBag())


	////////////////////////////////
	//普通物品处理
	arRet[0].nState = mArray[uIndex]->OnGoodsApply(this)?GAS_OK : GAS_FAILED;
	return 1;
}



};//namespace RPG

⌨️ 快捷键说明

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