📄 heroitem.cpp
字号:
#include "basefunc.H"
#include "hero.H"
#include "gamemsg.H"
#include "allmsg.H"
#include "GamePlayerSet.h"
#include "Shop.h"
#include "3DGameMap.h"
#include "GameDataSet.h"
//--------------------------------------------------------------
CItem* CHero::GetItem(OBJID id, BOOL bExcludeEquipment)
{
if(m_pPackageNormal && m_pPackageNormal->QueryItemByID(id))
return (CItem*)m_pPackageNormal->QueryItemByID(id);
if(m_pPackageEgg && m_pPackageEgg->QueryItemByID(id))
return (CItem*)m_pPackageEgg->QueryItemByID(id);
if(m_pPackagePet && m_pPackagePet->QueryItemByID(id))
return (CItem*)m_pPackagePet->QueryItemByID(id);
if(m_pPackageSoul && m_pPackageSoul->QueryItemByID(id))
return (CItem*)m_pPackageSoul->QueryItemByID(id);
if(!bExcludeEquipment)
{
for (int i=0; i<_MAX_EQUIPMENT; i++)
{
if(m_pEquipment[i] && m_pEquipment[i]->GetID() == id)
return m_pEquipment[i];
}
}
return NULL;
}
//--------------------------------------------------------------
int CHero::GetItemAmount(int nPackageType)
{
switch(nPackageType)
{
case PACKAGE_BAG:
return this->QueryPackageBag()->GetItemAmount();
case PACKAGE_PET:
return this->QueryPackagePet()->GetItemAmount();
case PACKAGE_EGG:
return this->QueryPackageEgg()->GetItemAmount();
case PACKAGE_SOUL:
return this->QueryPackageSoul()->GetItemAmount();
default:
return 0;
}
}
//--------------------------------------------------------------
BOOL CHero::AddItem(CItem* pItem)
{
int nPackageType = pItem->GetPackageType();
switch(nPackageType)
{
case PACKAGE_BAG:
return this->QueryPackageBag()->AddItem(pItem);
case PACKAGE_PET:
return this->QueryPackagePet()->AddItem(pItem);
case PACKAGE_EGG:
return this->QueryPackageEgg()->AddItem(pItem);
case PACKAGE_SOUL:
return this->QueryPackageSoul()->AddItem(pItem);
default:
return false;
}
}
//--------------------------------------------------------------
CItem* CHero::GetItemByIndex(UINT uIndex, int nPackageType)
{
switch(nPackageType)
{
case PACKAGE_BAG:
return (CItem*)this->QueryPackageBag()->QueryItemByIndex(uIndex);
case PACKAGE_PET:
return (CItem*)this->QueryPackagePet()->QueryItemByIndex(uIndex);
case PACKAGE_EGG:
return (CItem*)this->QueryPackageEgg()->QueryItemByIndex(uIndex);
case PACKAGE_SOUL:
return (CItem*)this->QueryPackageSoul()->QueryItemByIndex(uIndex);
default:
return NULL;
}
}
//--------------------------------------------------------------
BOOL CHero::DelItem(OBJID id, BOOL bDelete)
{
if(this->QueryPackageBag()->DeleteItemByID(id, bDelete))
return true;
if(this->QueryPackagePet()->DeleteItemByID(id, bDelete))
return true;
if(this->QueryPackageEgg()->DeleteItemByID(id, bDelete))
return true;
if(this->QueryPackageSoul()->DeleteItemByID(id, bDelete))
return true;
int nItemCount = g_objHero.m_objBoothManager.GetItemAmount();
for(int i = 0; i < nItemCount; i ++)
{
CItem* pItem = g_objHero.m_objBoothManager.GetItemByIndex(i);
if(pItem && pItem->GetID() == id)
{
if(bDelete)
SAFE_DELETE(pItem);
g_objHero.m_objBoothManager.m_dequeItem.erase(g_objHero.m_objBoothManager.m_dequeItem.begin() + i);
}
}
return false;
}
//--------------------------------------------------------------
void CHero::ClearItem(void)
{
// item in backpack
this->QueryPackageBag()->Clear(true);
this->QueryPackagePet()->Clear(true);
this->QueryPackageEgg()->Clear(true);
this->QueryPackageSoul()->Clear(true);
// equipment
for (int i=0; i<_MAX_EQUIPMENT; i++)
{
SAFE_DELETE(m_pEquipment[i]);
}
// auction item
SAFE_DELETE(m_AuctionItem);
}
//--------------------------------------------------------------
CItem* CHero::SearchItem(OBJID id)
{
/* if (m_pItemWeapon && m_pItemWeapon->GetID() == id)
return m_pItemWeapon;
if (m_pItemArmor && m_pItemArmor->GetID() == id)
return m_pItemArmor;
if (m_pItemTreasure && m_pItemTreasure->GetID() == id)
return m_pItemTreasure;
return this->GetItem(id);*/
return NULL;
}
//--------------------------------------------------------------
BOOL CHero::DropItem(OBJID id, int x, int y)
{
if(g_objGameMap.GetType() & MAPTYPE_FAMILY)
{
OBJID idCanNotDrop = 100146;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idCanNotDrop));
return false;
}
if (!this->GetItem(id))
{
OBJID idItemError = 100044;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idItemError));
return false;
}
CMyPos posCell;
g_objGameMap.Screen2Cell(x, y, posCell.x, posCell.y);
CMyPos posHero;
g_objHero.GetPos(posHero);
int nDir = g_objGameMap.GetDirection(posHero.x, posHero.y, posCell.x, posCell.y);
posCell.x = posHero.x+_DELTA_X[nDir];
posCell.y = posHero.y+_DELTA_Y[nDir];
CellInfo* pInfo = g_objGameMap.GetCell(posCell.x, posCell.y);
OBJID idItem = g_objGameMap.Get3DMapItem(posCell);
if(!pInfo || g_objGameMap.Get3DMapItem(posCell) || g_objGameMap.GetGroundMask(pInfo) != 0)
{
// 八格随机方向
int nX[8]={1, -1, 0, 1, 1, -1, -1, 0};
int nY[8]={1, -1, 1, 0, -1, 1, 0, -1};
for(int i = 0; i < 8; i ++)
{
CMyPos posItem;
posItem.x = posHero.x + nX[i];
posItem.y = posHero.y + nY[i];
CellInfo* pInfo = g_objGameMap.GetCell(posItem.x, posItem.y);
if(pInfo)
{
if(!g_objGameMap.Get3DMapItem(posItem) && g_objGameMap.GetGroundMask(pInfo) == 0 && !g_objPlayerSet.GetPlayer(posItem.x, posItem.y))
{
posCell = posItem;
break;
}
}
}
if (i >= 8)
return false;
}
/* // Play the sound
CItem *pItem = g_objHero.GetItem( id ) ;
if ( pItem != NULL )
{
switch ( pItem->GetSort() )
{
case ITEMSORT_WEAPON_SINGLE_HAND:
case ITEMSORT_WEAPON_DOUBLE_HAND:
DXPlaySound( "Sound/Dropweapon.wav" ) ;
break ;
case ITEMSORT_HELMET:
case ITEMSORT_ARMOR:
case ITEMSORT_SHIELD:
case ITEMSORT_SHOES:
DXPlaySound( "Sound/Droploricae.wav" ) ;
break ;
case ITEMSORT_NECKLACE:
case ITEMSORT_RING:
DXPlaySound( "Sound/Dropaccouterment.wav" ) ;
break ;
default:
DXPlaySound( "Sound/Dropdrug.wav" ) ;
break ;
}
}
*/
CMsgItem msg;
if(msg.Create(id, posCell.x, posCell.y, ITEMACT_DROP))
msg.Send();
return true;
}
//--------------------------------------------------------------
void CHero::PickUpItem(OBJID id, int x, int y)
{
if(this->IsMagicLock())
return;
if (id == ID_NONE)
return;
if(m_objBoothManager.IsActive())
return;
// here got player already
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(x, y);
if (pPlayer && !pPlayer->IsDead())
return;
CCommand cmd;
cmd.iType =_COMMAND_PICKUP;
cmd.iStatus =_CMDSTATUS_BEGIN;
cmd.idTarget =id;
cmd.posTarget.x =x;
cmd.posTarget.y =y;
this->SetCommand(&cmd);
}
//--------------------------------------------------------------
void CHero::BuyItem(OBJID idType)
{
int nSubType = CItem::ItemGetSubType(idType);
if((nSubType/10000)*10000 == ITEMTYPE_GHOSTGEM)
{
bool bCanBuy = FALSE;
if (g_objHero.GetItemAmount (PACKAGE_SOUL) < g_objHero.GetPackageLimit (PACKAGE_SOUL))
bCanBuy = TRUE;
else
{
int nAmount = g_objHero.GetItemAmount(PACKAGE_SOUL);
for(int i =0 ;i< nAmount ;i++)
{
CItem* pOldItem = g_objHero.GetItemByIndex(i,PACKAGE_SOUL);
if (pOldItem && pOldItem->GetTypeID() == idType
&& pOldItem->GetAmount() < pOldItem->GetAmountLimit())
{
bCanBuy = TRUE;
break;
}
}
}
if (!bCanBuy)
{
OBJID idPackageFull = 100200; //100200=宝石背包已经满了,不能再购买了
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idPackageFull));
return;
}
}
else if((nSubType/10000 )* 10000 == ITEMTYPE_EUDEMON)
{
bool bCanBuy = FALSE;
if (g_objHero.GetItemAmount (PACKAGE_PET) < g_objHero.GetPackageLimit (PACKAGE_PET))
bCanBuy = TRUE;
else
{
g_objGameMsg.AddMsg ( (char*)g_objGameDataSet.GetStr(10698) ) ;
return;
}
}
else if ((nSubType/10000)*10000 == ITEMTYPE_EUDEMONEGG)
{
bool bCanBuy = FALSE;
if (g_objHero.GetItemAmount (PACKAGE_EGG) < g_objHero.GetPackageLimit (PACKAGE_EGG))
bCanBuy = TRUE;
else
{
g_objGameMsg.AddMsg ( (char*)g_objGameDataSet.GetStr(10699) ) ;
return;
}
}
else
{
bool bCanBuy = FALSE;
if (g_objHero.GetItemAmount (PACKAGE_BAG) < g_objHero.GetPackageLimit (PACKAGE_BAG))
bCanBuy = TRUE;
else
{
int nAmount = g_objHero.GetItemAmount(PACKAGE_BAG);
for(int i =0 ;i< nAmount ;i++)
{
CItem* pOldItem = g_objHero.GetItemByIndex(i,PACKAGE_BAG);
if (pOldItem && pOldItem->GetTypeID() == idType
&& pOldItem->GetAmount() < pOldItem->GetAmountLimit())
{
bCanBuy = TRUE;
break;
}
}
}
if (!bCanBuy)
{
OBJID idPackageFull = 100045 ; //=错误:物品栏已满。
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idPackageFull));
return;
}
}
CMsgItem msg;
if (msg.Create(g_objShop.GetShopID(), idType, ITEMACT_BUY))
msg.Send();
}
//--------------------------------------------------------------
void CHero::SellItem(OBJID id)
{
if (!this->GetItem(id))
{
OBJID idItemError = 100044;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idItemError), _TXTATR_SHOP);
return;
}
CMsgItem msg;
if(msg.Create(g_objShop.GetShopID(), id, ITEMACT_SELL))
msg.Send();
}
//--------------------------------------------------------------
void CHero::RepairItem(OBJID id)
{
if (id == ID_NONE)
return;
CMsgItem msg;
if(msg.Create(id, 0, ITEMACT_REPAIR))
msg.Send();
}
//--------------------------------------------------------------
void CHero::UseItem(OBJID id, OBJID idTarget)
{
if (this->IsDead())
return;
CItem* pItem = this->GetItem(id);
if (!pItem)
{
OBJID idItemError = 100044;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idItemError));
return;
}
if (!this->TryItem(pItem))
return;
BOOL bIsMed = false;
if( pItem->GetSort() == ITEMSORT_EXPEND && ( pItem->GetLife() > 0 || pItem->GetMana() > 0 ))
bIsMed = true;
if(this->TestStatus(USERSTATUS_CANNOTMOVE) && !bIsMed)
{
return;
}
int nPosition = 0;
if(pItem->GetTypeID() == _ARROW && this->GetRWeapon()/1000%1000 != 500)
return;
else if (pItem->GetTypeID() == _ARROW && this->GetRWeapon()/1000%1000 == 500)
{
nPosition = ITEMPOSITION_WEAPONL;
CMsgItem msg;
if(msg.CreateForUseItem(id, nPosition, ITEMACT_USE, idTarget))
msg.Send();
return;
}
if(pItem->GetTypeID() == _DART && this->GetRWeapon()/1000%1000 != 501)
return;
else if (pItem->GetTypeID() == _DART && this->GetRWeapon()/1000%1000 == 501)
{
nPosition = ITEMPOSITION_WEAPONL;
CMsgItem msg;
if(msg.CreateForUseItem(id, nPosition, ITEMACT_USE, idTarget))
msg.Send();
return;
}
switch(pItem->GetSort())
{
case ITEMSORT_EXPEND:
if (!this->TryItemTarget(pItem, idTarget))
{
g_objGameMsg.AddMsg((char*)g_objGameDataSet.GetStr(100060)); //错误对象!
return;
}
if(pItem->GetLife() > 0)
{
m_objCheck.AddLife();
int n = this->GetMaxLife();
int k = this->GetLifeForeCast();
int j = pItem->GetLife();
this->SetLifeForeCast(this->GetLifeForeCast() + pItem->GetLife());
int l = this->GetLifeForeCast();
}
else if (pItem->GetMana() > 0)
m_objCheck.AddMana();
break;
case ITEMSORT_HELMET:
nPosition = ITEMPOSITION_HELMET;
break;
case ITEMSORT_NECKLACE:
nPosition = ITEMPOSITION_NECKLACE;
break;
case ITEMSORT_ARMOR:
nPosition = ITEMPOSITION_ARMOR;
break;
case ITEMSORT_WEAPON_SINGLE_HAND:
nPosition = ITEMPOSITION_WEAPONR;
break;
case ITEMSORT_WEAPON_DOUBLE_HAND:
nPosition = ITEMPOSITION_WEAPONR;
break;
case ITEMSORT_TREASURE:
nPosition = ITEMPOSITION_TREASURE;
break;
case ITEMSORT_SHIELD:
{
CItem* pItem = this->GetEquipment(ITEMPOSITION_WEAPONR);
if(!pItem)
return;
if (pItem && ITEMSORT_WEAPON_DOUBLE_HAND == pItem->GetSort())
{
const OBJID idEqumipError = 100048;
g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idEqumipError));
return;
}
}
nPosition = ITEMPOSITION_WEAPONL;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -