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

📄 itemmanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if( rt == RC::RC_ITEM_SUCCESS )
	{
		// 清泼捞衬 固记捞衬
		// 付阑
		if( pItem->GetFromMonsterKey() != 0 )
		{	
			Field * pField = m_pPlayer->GetField();
			SharingItem<MSG_CG_ITEM_PICK_ACK> sp(rItemSlot,num,m_pPlayer);
			if( pField->GetMap()->GetZoneType() == eZONETYPE_MISSION )
			{
				// 固记
				m_pPlayer->GetField()->ForeachPlayer(sp);
			}
			else
			{
				// 付阑, 清泼
				sp.SetDistance( 15.0f );
				m_pPlayer->GetField()->ForeachNeighborPlayerAt(m_pPlayer->GetSectorIndex(), sp);
			}
		}

		m_pPlayer->GetField()->LeaveField( pItem );
		ObjectFactory::Instance()->FreeObject( pItem );
	}
	return rt;
}

RC::eITEM_RESULT ItemManager::Combine( SLOTIDX fromIndex, POSTYPE fromPos, SLOTIDX toIndex, POSTYPE toPos )
{
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;

	if( !ValidPos( fromIndex, fromPos ) )
		return RC::RC_ITEM_INVALIDPOS;
	if( !ValidPos( toIndex, toPos ) )
		return RC::RC_ITEM_INVALIDPOS;

	if( toIndex == SI_WAREHOUSE )
		return RC::RC_ITEM_INVALIDSTATE;
	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	// 阿辆 抗寇 贸府
	if( fromIndex == toIndex && fromPos == toPos )
		return RC::RC_ITEM_INVALIDPOS;

	

	SCSlotContainer * pFromContainer	= GetItemSlotContainer( fromIndex );
	SCSlotContainer * pToContainer		= GetItemSlotContainer( toIndex );

	SCItemSlot & rFromSlot	= (SCItemSlot &)pFromContainer->GetSlot( fromPos );
	SCItemSlot & rToSlot	= (SCItemSlot &)pToContainer->GetSlot( toPos );

	if( rFromSlot.GetCode() != rToSlot.GetCode() )
	{
		return RC::RC_ITEM_ITEMCODENOTEQUAL;
	}

	//BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( rFromSlot.GetCode() );
	if( !rFromSlot.GetItemInfo() || (rFromSlot.GetItemInfo() && rFromSlot.GetItemInfo()->m_wType != eITEMTYPE_WASTE ) )
		return RC::RC_ITEM_ITEMCODENOTEQUAL;


	//BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( pFromSlot->GetCode() );
	DURATYPE MAX_COMBINE_NUM = rFromSlot.GetMaxNum();

	DURATYPE CombineNum = rFromSlot.GetNum() + rToSlot.GetNum();

	if( CombineNum > MAX_COMBINE_NUM )
	{
		// to slot 俺荐 函版茄促.
		//pFromContainer->UpdateSlot( fromPos, ST_NONE, 0, 0, 0, CombineNum - MAX_COMBINE_NUM, 0, UB_DURA );
		rFromSlot.SetNum( CombineNum - MAX_COMBINE_NUM );

		// to slot 俺荐 函版茄促.
		//pToContainer->UpdateSlot( toPos, ST_NONE, 0, 0, 0, MAX_COMBINE_NUM, 0, UB_DURA );
		rToSlot.SetNum( MAX_COMBINE_NUM );
	}
	else
	{
		// from slot 瘤款促.
		//SCSlot * pDelSlot = NULL;
		pFromContainer->DeleteSlot( fromPos, NULL );

		// to slot 俺荐 函版茄促.
		//pToContainer->UpdateSlot( toPos, ST_NONE, 0, 0, 0, CombineNum, 0, UB_DURA );
		rToSlot.SetNum( CombineNum );
	}
	return RC::RC_ITEM_SUCCESS;
}

RC::eITEM_RESULT ItemManager::Divide()
{


	return RC::RC_ITEM_SUCCESS;
}

#include <SkillInfoParser.h>
#include "SkillFactory.h"

RC::eITEM_RESULT ItemManager::Use( SLOTIDX atIndex, POSTYPE atPos )
{
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;

	if( !ValidPos( atIndex, atPos ) )
		return RC::RC_ITEM_INVALIDPOS;

	SCSlotContainer * pAtContainer		= GetItemSlotContainer( atIndex );
	SCItemSlot & rAtSlot				= (SCItemSlot &)pAtContainer->GetSlot( atPos );
	if( !rAtSlot.GetItemInfo() || ( rAtSlot.GetItemInfo() && rAtSlot.GetItemInfo()->m_wType != eITEMTYPE_WASTE) )
	{
		return RC::RC_ITEM_ISNOTWASTEITEM;
	}

	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	// 辆幅俊 蝶扼 瓤苞甫 利侩茄促.
	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	BASE_ITEMINFO * pInfo = rAtSlot.GetItemInfo();
	sSWITCH( pInfo->m_byWasteType )
	CASE(eITEMWASTE_HPPOTION)

		// can use item ?
		RC::eITEM_RESULT rcResult = m_pPlayer->CanUseItem( rAtSlot.GetItemInfo() );
		if( rcResult != RC::RC_ITEM_SUCCESS )
		{
			return rcResult;
		}

		int iPeriodicTime = 0;
		WORD wHeal = 0;
		if( pInfo->m_wTimes )	
		{
			iPeriodicTime = pInfo->m_wHealHPTime/pInfo->m_wTimes;
			wHeal = pInfo->m_wHealHP/pInfo->m_wTimes;
		}
		m_pPlayer->PeriodicRecover( eCHAR_STATE_ETC_ITEM_RECOVER_HP, wHeal, 0, pInfo->m_wHealHPTime, iPeriodicTime );	
	CASE(eITEMWASTE_MPPOTION)
		// can use item ?
		RC::eITEM_RESULT rcResult = m_pPlayer->CanUseItem( rAtSlot.GetItemInfo() );
		if( rcResult != RC::RC_ITEM_SUCCESS )
		{
			return rcResult;
		}

		int iPeriodicTime = 0;
		WORD wHeal = 0;
		if( pInfo->m_wTimes )	
		{
			iPeriodicTime = pInfo->m_wHealHPTime/pInfo->m_wTimes;
			wHeal = pInfo->m_wHealHP/pInfo->m_wTimes;
		}
		m_pPlayer->PeriodicRecover( eCHAR_STATE_ETC_ITEM_RECOVER_MP, 0, wHeal, pInfo->m_wHealHPTime, iPeriodicTime );	
	CASE(eITEMWASTE_MOVE_SPEED_INC)
		// 捞加
		SkillExecute( 40001 );
	CASE(eITEMWASTE_BASE_PHYSICAL_ATTACKPWR_INC)
		// 拱傍
		SkillExecute( 40031 );
	CASE(eITEMWASTE_BASE_MAGICAL_ATTACKPWR_INC)
		// 付傍
		SkillExecute( 40021 );
	CASE(eITEMWASTE_BASE_PHYSICAL_DEFENSEPWR_INC)
		// 拱傍
		SkillExecute( 40011 );
	CASE(eITEMWASTE_BASE_MAGICAL_DEFENSEPWR_INC)
	
	DEFAULT
		SASSERT( NULL, "肋给等 家葛己 酒捞袍 鸥涝" );
	eSWITCH

	DURATYPE curNum = rAtSlot.GetNum();
	if( curNum > 1 )
	{
		rAtSlot.SetNum( curNum - 1 );
	}
	else
	{
		pAtContainer->DeleteSlot( atPos, NULL );	
	}

	return RC::RC_ITEM_SUCCESS;
}

VOID ItemManager::SkillExecute( WORD SkillCode )
{
	// 货肺款 胶懦俊 措秦 皋葛府甫 且寸罐绊 胶懦沥焊甫 悸泼茄促.
	SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
	if( !pBaseSkillInfo  )
	{
		SUNLOG( eCRITICAL_LOG, "[ItemManager::SkillExecute]Invalid SkillCode[%d]", SkillCode);
		return;
	}

	Skill* pNewSkill = (Skill*)SkillFactory::Instance()->AllocSkill( SKILL_TYPE_ACTIVE, pBaseSkillInfo );
	if(!pNewSkill)
	{
		return;
	}

	WzVector wvResultCurPos;
	m_pPlayer->GetPos( &wvResultCurPos );

	SkillInfo SkillInfoData;
	SkillInfoData.m_SkillCode			= SkillCode;
	SkillInfoData.m_dwClientSerial		= 0;
	SkillInfoData.m_wvCurPos			= wvResultCurPos;
	SkillInfoData.m_wvDestPos			= wvResultCurPos;
	SkillInfoData.m_dwMainTargetKey		= 0;
	SkillInfoData.m_wvMainTargetPos		= wvResultCurPos;

	pNewSkill->Init( m_pPlayer, &SkillInfoData, pBaseSkillInfo );
	m_pPlayer->AddSkill( pNewSkill );
}

RC::eITEM_RESULT ItemManager::Sell( SLOTIDX atIndex, POSTYPE atPos )
{
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;

	if( !ValidPos( atIndex, atPos ) )
		return RC::RC_ITEM_INVALIDPOS;

	SCSlotContainer * pAtContainer	= GetItemSlotContainer( atIndex );
	SCItemSlot & rItemSlot	= (SCItemSlot &)pAtContainer->GetSlot( atPos );
	BASE_ITEMINFO * pInfo = rItemSlot.GetItemInfo();
	
	LEVELTYPE DropLV = pInfo->m_DropLV;
	if( rItemSlot.GetSet() == 1 &&
		( pInfo->IsArmor() || pInfo->IsWeapon() )  )
	{
		DropLV = CalcDropLVForDivine(pInfo->m_DropLV);
		if( DropLV > MAX_LEVEL ) DropLV = MAX_LEVEL;
	}

	MONEY PriceOfGoods = rItemSlot.GetPriceForSell();
//	m_pPlayer->SetMoney( m_pPlayer->GetMoney() + PriceOfGoods );
	m_pPlayer->PlusMoney( PriceOfGoods );	// SetMoney肺 捣 冈绰 何盒 傈何 PlusMoney()肺 背眉吝(泅芒)

	DEBUG_CODE( if( PriceOfGoods == 0 && 
					rItemSlot.GetItemInfo()->m_wType != eITEMTYPE_WASTE ) SUNLOG( eFULL_LOG, "[ItemManager::Sell] 酒捞袍(%s)颇绰啊拜捞%I64u=0捞促.", pInfo->m_pszName, PriceOfGoods); );

	// ItemManager狼 Sell篮 npc客狼 芭贰俊辑父 荤侩等促.
	// NPC俊霸 迫扁 肺弊
	GAMELOG->WriteItemTradeWithNPC( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &rItemSlot, (DWORD)PriceOfGoods );
	// NPC俊霸 迫扁 肺弊 场

	pAtContainer->DeleteSlot( atPos, NULL );


	return RC::RC_ITEM_SUCCESS;
}

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// @praram 
//			byNumberOfItemToBuy : m_byDupNum阑 逞阑 荐 绝促.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
RC::eITEM_RESULT ItemManager::Buy( DWORD dwShopListID, BYTE ShopTabIndex, BYTE ShopItemIndex, INVENTORY_TOTAL_INFO * pTotalInfo )
{
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;
	if( !ValidContainer(SI_INVENTORY) ) 
		return RC::RC_ITEM_INVALIDSTATE;

	SHOPINFO * pShopInfo = ShopInfoParser::Instance()->GetShopList(dwShopListID);
	if( !pShopInfo )
	{
		return RC::RC_ITEM_INVALIDSHOPLISTID;
	}
	if( ShopTabIndex >= SHOPINFO::_MAX_TAB_NUM ||
		ShopItemIndex >= SHOPINFO::_MAX_SELLITEM_NUM )
	{
		return RC::RC_ITEM_OUTOFSHOPITEMINDEX;
	}
	SHOPINFO::SHOP_ITEM * pShopItem = pShopInfo->GetItemForIndex( ShopTabIndex, ShopItemIndex );
	if( !pShopItem )
	{
		return RC::RC_ITEM_OUTOFSHOPITEMINDEX;
	}

	SLOTCODE buyItemCode = pShopItem->m_SellItemCode;
	BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( buyItemCode );
	if( !pInfo ) return RC::RC_ITEM_OUTOFSHOPITEMINDEX;

	//!烙矫啊拜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	//!烙矫啊拜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	// 捣捞 乐绰瘤 眉农

	DURATYPE num = pShopItem->m_SellItemNum;
	SCItemSlot slot;
	slot.SetCode(buyItemCode);
	MONEY PriceOfGoods = slot.GetPriceForBuy()*num;
	DEBUG_CODE( if( PriceOfGoods == 0 ) SUNLOG( eFULL_LOG, "[ItemManager::Buy] 版绊!!备涝啊拜捞0捞促."); );	

	// 捣拌魂
	if( m_pPlayer->GetMoney() < PriceOfGoods )
	{
		return RC::RC_ITEM_HAVENOTMONEY;
	}

	RC::eITEM_RESULT rt = RC::RC_ITEM_SUCCESS;
	if( SCItemSlot::IsOverlap(buyItemCode) )
	{
		rt = ObtainDup( buyItemCode, num, pTotalInfo );
	}
	else
	{
		rt = Obtain( buyItemCode, num, pTotalInfo );
	}

	if( rt == RC::RC_ITEM_SUCCESS )
	{
//		m_pPlayer->SetMoney( m_pPlayer->GetMoney() - PriceOfGoods );
		m_pPlayer->MinusMoney( PriceOfGoods );	// SetMoney肺 捣 静绰 何盒 傈何 MinusMoney()肺 背眉吝(泅芒)


		// ItemManager狼 Sell篮 npc客狼 芭贰俊辑父 荤侩等促.
		// NPC俊霸 迫扁 肺弊
		GAMELOG->WriteItemTradeWithNPC( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &slot, (DWORD)PriceOfGoods );
		// NPC俊霸 迫扁 肺弊 场
	}

	return rt;
}

RC::eITEM_RESULT ItemManager::Lose( SLOTCODE ItemCode, BOOL bAllOfItem )
{
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;

	SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
	for(POSTYPE i = 0 ; i < pInventory->GetMaxSlotNum() ; ++i )
	{
		if( pInventory->IsEmpty(i) ) continue;
		const SCSlot & rSlot = pInventory->GetSlot(i);
		if( rSlot.GetCode() != ItemCode ) continue;
		pInventory->DeleteSlot(i, NULL);

		// 菩哦 焊晨
		MSG_CG_ITEM_LOSE_ACK msg;
		msg.m_ItemPos = i;
		m_pPlayer->SendPacket( &msg, sizeof(msg) );

		if( bAllOfItem ) return RC::RC_ITEM_SUCCESS;
	}

	return RC::RC_ITEM_SUCCESS;
}

// 荤侩惑 林狼痢!!!
// 馆靛矫 己傍窍绰 牢磊蔼父阑 持绢具 茄促.
// 溜, 蜡瓤己 眉农甫 茄 牢磊父 持绢具 茄促.
VOID ItemManager::Lose( SCSlotContainer * pContainer, POSTYPE pos, BYTE num )
{
	SCItemSlot & rSlotItem = (SCItemSlot &)pContainer->GetSlot(pos);
	if( rSlotItem.GetNum() > num )
	{
		//pContainer->UpdateSlot( rSlotItem.GetPos(), ST_NONE,0,0,0,rSlotItem.GetDura()-1,0, UB_DURA );
		rSlotItem.SetNum( rSlotItem.GetNum() - num );
	}
	else
	{
		pContainer->DeleteSlot( rSlotItem.GetPos(), NULL );
	}
}


BOOL ItemManager::IsExistItemDup( SLOTIDX idx, SLOTCODE code, BYTE num,
								 POSTYPE * OUT pPosArray, POSTYPE & INOUT posNum )
{
	posNum = 0;
	POSTYPE maxPos = posNum;
	SCSlotContainer * pContainer = GetItemSlotContainer( idx );
	for( POSTYPE i = 0 ; i < pContainer->GetMaxSlotNum() ; ++i )
	{
		if( !pContainer->IsEmpty(i) )
		{
			SCSlot & slot = pContainer->GetSlot(i);
			if( slot.GetCode() == code )
			{
				if( maxPos < posNum ) return FALSE;
				pPosArray[posNum++] = i;
				if( posNum == num ) return TRUE;
			}
		}
	}
	return FALSE;
}

BOOL ItemManager::IsExistItem( SLOTIDX idx, SLOTCODE code, DURATYPE dupNum,/*吝汗登绰巴父秦寸,郴备档(X)*/
							 POSTYPE * OUT pPosArray, POSTYPE & INOUT posNum )
{
	posNum = 0;
	BYTE InsufficientNum = dupNum;
	POSTYPE maxPos = posNum;
	SCSlotContainer * pContainer = GetItemSlotContainer( idx );
	for( POSTYPE i = 0 ; i < pContainer->GetMaxSlotNum() ; ++i )
	{
		if( !pContainer->IsEmpty(i) )
		{
			SCSlot & slot = pContainer->GetSlot(i);
			if( slot.GetCode() == code )
			{
				if( maxPos < posNum ) return FALSE;
				pPosArray[posNum++] = i;
				ASSERT( slot.GetNum()!= 0 );

				if( InsufficientNum <= slot.GetNum() ) return TRUE;

				InsufficientNum -= slot.GetNum();
			}
		}
	}

	return FALSE;
}

⌨️ 快捷键说明

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