📄 ggoodsarray.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 + -