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

📄 heroitem.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -