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

📄 itemmanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			else
			{
				pPosInfo[PosInfoNum].m_num = need_num;
				need_num = 0;
			}
			++PosInfoNum;
			if( need_num == 0 ) return TRUE;
		}
	}
	ASSERT( need_num != 0 );

	return FALSE;
}

// 肯傈茄 蔼捞 牢磊肺 甸绢客具 茄促!!
// 窃荐狼 角菩绰 绝促!
VOID ItemManager::Obtain( SLOTIDX SlotIdx, 
						 SLOTCODE ItemCode, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo,
						 BYTE & OUT byCount, ITEMSLOTEX * OUT pItemSlot )
{
	SCItemSlot ItemSlot;
	ItemSlot.SetCode( ItemCode );
	return Obtain( SlotIdx, ItemSlot, PosInfoNum, pPosInfo, byCount, pItemSlot );
}

VOID ItemManager::Obtain( SLOTIDX SlotIdx, 
							SCItemSlot & IN slot, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo,
							BYTE & OUT byCount, ITEMSLOTEX * OUT pItemSlot )
{
	ASSERT( SlotIdx == SI_INVENTORY || SlotIdx == SI_TEMPINVENTORY );
	SCSlotContainer * pContainer = GetItemSlotContainer( SlotIdx );

	MSG_DG_ITEM_SERIAL_SYN msg;
	msg.m_dwKey = m_pPlayer->GetUserKey();

	INT total = 0;
	for( POSTYPE i = 0 ; i < PosInfoNum ; ++i )
	{
		POSTYPE pos = pPosInfo[i].m_pos;
		SCItemSlot & ItemSlot = (SCItemSlot &)pContainer->GetSlot(pos);
		if( pContainer->IsEmpty(pos) )
		{
			// 厚绢乐促.
			ASSERT( pPosInfo[i].m_num <= slot.GetMaxNum() );
			slot.SetNum(pPosInfo[i].m_num);
			// ------------- 牢亥配府 酒捞袍 惯鞭 夸没 -------------
			slot.SetSerial(TEMP_DBSERIAL_VALUE);
			pContainer->InsertSlot( pos, slot );
			pContainer->SetLock( pos, TRUE );
			msg.m_SlotIdx = SlotIdx;
			msg.m_ItemPos = pos;
			m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
			// ------------- 牢亥配府 酒捞袍 惯鞭 夸没 -------------
		}
		else
		{
			ASSERT( ItemSlot.GetCode() == slot.GetCode() );
			ASSERT( ItemSlot.GetNum() < ItemSlot.GetMaxNum() );
			ASSERT( pPosInfo[i].m_num + ItemSlot.GetNum() <= ItemSlot.GetMaxNum() );
			ItemSlot.SetNum( ItemSlot.GetNum()+pPosInfo[i].m_num );
			//pContainer->UpdateSlot( pos, ST_NONE, 0, 0, 0, ItemSlot.GetNum()+pPosInfo[i].m_num, 0, UB_DURA );
		}

		if( pItemSlot )
		{
			pItemSlot[total].m_ItemPos	= pos;
			ItemSlot.CopyOut(pItemSlot[total].m_Stream);
			++total;
		}
	}

	byCount += total;
}


// 般摹绰 酒捞袍
// SLOTCODE ItemCode : 掘绊磊 窍绰 酒捞袍 内靛
// WORD num : 掘绊磊 窍绰 酒捞袍 俺荐
RC::eITEM_RESULT ItemManager::ObtainDup( SLOTCODE ItemCode, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
	SCItemSlot ItemSlot;
	ItemSlot.SetCode( ItemCode );
	return ObtainDup( ItemSlot, num, pTotalInfo );
}

RC::eITEM_RESULT ItemManager::ObtainDup( SCItemSlot & IN slot, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;
	if( !slot.IsOverlap() )
		return RC::RC_ITEM_INVALIDSTATE;

	ASSERT( num > 0 );

	SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
	SCSlotContainer * pTmpInventory = GetItemSlotContainer( SI_TEMPINVENTORY );

	ASSERT( slot.GetNum() == 1 );

	const int MAX_DUP_NUM = slot.GetMaxNum();
	//--------------------------------------------------------------------------------
	// 后傍埃捞 乐绰瘤 咯何 眉农
	//--------------------------------------------------------------------------------
	// static栏肺 荤侩!
	static POSTYPE InPos[MAX_INVENTORY_SLOT_NUM];
	static POSTYPE InPosTmp[MAX_TEMPINVENTORY_SLOT_NUM];
	POSTYPE InPosNum = 0;
	POSTYPE InPosTmpNum = 0;
	// 牢亥配府 般磨荐 乐绰瘤 眉农
	POSTYPE need_num = num;

	CanInsertOverlappedItem( pInventory, slot.GetCode(), need_num, InPos, InPosNum );
	CanInsertItem( pInventory, MAX_DUP_NUM, need_num, InPos, InPosNum );

	CanInsertOverlappedItem( pTmpInventory, slot.GetCode(), need_num, InPosTmp, InPosTmpNum );
	CanInsertItem( pTmpInventory, MAX_DUP_NUM, need_num, InPosTmp, InPosTmpNum );

	if( need_num != 0 )
		return RC::RC_ITEM_NOSPACEININVENTORY;

	BYTE total = 0;
	if( pTotalInfo )
	{
		pTotalInfo->m_InvenCount	= 0;
		pTotalInfo->m_TmpInvenCount	= 0;
	}

	
	MSG_DG_ITEM_SERIAL_SYN msg;
	BOOL bAyncSerial = FALSE;
	// 矫府倔捞 乐绊 俺荐啊 1捞搁 弊措肺 荤侩!
	if( slot.GetSerial() == 0 || num != 1 )
	{
		msg.m_dwKey = m_pPlayer->GetUserKey();
		// 持阑 困摹俊 遏阑 吧绊 矫府倔捞 绝绰 酒捞袍阑 持绊! + 矫府倔 惯鞭 夸没
		slot.SetSerial( TEMP_DBSERIAL_VALUE ); //< 烙矫 蔼 持扁
		bAyncSerial = TRUE;
	}
	need_num = num;
	// 牢亥配府
	for( POSTYPE i = 0 ; i < InPosNum ; ++i )
	{
		POSTYPE pos = InPos[i];
		SCItemSlot & ItemSlot = (SCItemSlot &)pInventory->GetSlot(pos);
		if( pInventory->IsEmpty(pos) )
		{
			if( need_num <= MAX_DUP_NUM )
			{
				slot.SetNum( need_num );
				need_num = 0;
			}
			else
			{
				slot.SetNum( MAX_DUP_NUM );
				need_num -= MAX_DUP_NUM;
			}
			
			pInventory->InsertSlot( pos, slot );
			if( bAyncSerial )
			{
				ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
				pInventory->SetLock( pos, TRUE );
				// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
				msg.m_SlotIdx = SI_INVENTORY;
				msg.m_ItemPos = pos;
				m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
				// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
			}
		}
		else
		{
			ASSERT( ItemSlot.GetCode() == slot.GetCode() );
			ASSERT( ItemSlot.GetNum() < ItemSlot.GetMaxNum() );
			if( need_num + ItemSlot.GetNum() > MAX_DUP_NUM )
			{
				need_num -= MAX_DUP_NUM - ItemSlot.GetNum();
				ItemSlot.SetNum( MAX_DUP_NUM );
				//pInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, MAX_DUP_NUM, 0, UB_DURA );
			}
			else
			{
				ItemSlot.SetNum( need_num + ItemSlot.GetNum() );
				//pInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, need_num + ItemSlot.GetNum(), 0, UB_DURA );
				need_num = 0;
			}
			
		}

		if( pTotalInfo )
		{
			pTotalInfo->m_Slot[total].m_ItemPos	= pos;
			ItemSlot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
			++total; ++pTotalInfo->m_InvenCount;
		}
	}
	// 烙矫 牢亥配府
	if( need_num != 0 )
	{
		for( POSTYPE i = 0 ; i < InPosTmpNum ; ++i )
		{
			POSTYPE pos = InPosTmp[i];
			SCItemSlot & ItemSlot = (SCItemSlot &)pTmpInventory->GetSlot(pos);
			if( pTmpInventory->IsEmpty(pos) )
			{
				if( need_num <= MAX_DUP_NUM )
				{
					slot.SetNum( need_num );
					need_num = 0;
				}
				else
				{
					slot.SetNum( MAX_DUP_NUM );
					need_num -= MAX_DUP_NUM;
				}
				pTmpInventory->InsertSlot( pos, slot );
				if( bAyncSerial )
				{
					ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
					pTmpInventory->SetLock( pos, TRUE );
					// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
					msg.m_SlotIdx = SI_TEMPINVENTORY;
					msg.m_ItemPos = pos;
					m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
					// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
				}
			}
			else
			{
				ASSERT( ItemSlot.GetCode() == slot.GetCode() );
				ASSERT( ItemSlot.GetNum() < ItemSlot.GetMaxNum() );
				if( need_num + ItemSlot.GetNum() > MAX_DUP_NUM )
				{
					need_num -= MAX_DUP_NUM - ItemSlot.GetNum();
					//pTmpInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, MAX_DUP_NUM, 0, UB_DURA );
					ItemSlot.SetNum(MAX_DUP_NUM);
				}
				else
				{
					//pTmpInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, need_num + ItemSlot.GetNum(), 0, UB_DURA );
					ItemSlot.SetNum(need_num + ItemSlot.GetNum());
					need_num = 0;
				}
			}
			if( pTotalInfo )
			{
				pTotalInfo->m_Slot[total].m_ItemPos	= pos;
				ItemSlot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
				++total; ++pTotalInfo->m_TmpInvenCount;
			}
		}
	}

	ASSERT( need_num == 0 );

	return RC::RC_ITEM_SUCCESS;
}

// 般摹瘤 臼绰 酒捞袍
// SLOTCODE ItemCode : 掘绊磊 窍绰 酒捞袍 内靛
// WORD num : 掘绊磊 窍绰 酒捞袍 俺荐
RC::eITEM_RESULT ItemManager::Obtain( SLOTCODE ItemCode, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
	SCItemSlot ItemSlot;
	ItemSlot.SetCode( ItemCode );
	return Obtain( ItemSlot, num, pTotalInfo );
}
// 可记捞 嘿篮 酒捞袍档 掘阑 荐 乐促.
RC::eITEM_RESULT ItemManager::Obtain( SCItemSlot & IN slot, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
	if( pTotalInfo )
	{
		pTotalInfo->m_InvenCount	= 0;
		pTotalInfo->m_TmpInvenCount	= 0;
	}

	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;
	// 般磨 荐 乐绰 酒捞袍档 贸府窍扁 困秦! 林籍!
	//if( slot.IsOverlap() )
	//	return RC::RC_ITEM_INVALIDSTATE;

	SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
	SCSlotContainer * pTmpInventory = GetItemSlotContainer( SI_TEMPINVENTORY );

	ASSERT( num > 0 );
	//ASSERT( slot.GetSerial() != TEMP_DBSERIAL_VALUE );

	// 持阑 傍埃捞 乐绰瘤 眉农
	int need_num = num;
	need_num -= pInventory->GetMaxSlotNum() - pInventory->GetSlotNum();
	if( need_num > 0 )
	{
		// 牢亥配府狼 后傍埃捞 何练窍促.
		need_num -= pTmpInventory->GetMaxSlotNum() - pTmpInventory->GetSlotNum();
		if( need_num > 0 )
			return RC::RC_ITEM_NOSPACEININVENTORY;
	}

	BYTE total = 0;

	MSG_DG_ITEM_SERIAL_SYN msg;
	BOOL bAyncSerial = FALSE;
	if( slot.GetSerial() == 0 || num != 1 )	//< 俺荐啊 1啊 酒聪芭唱 矫府倔捞 绝芭唱
	{
		msg.m_dwKey = m_pPlayer->GetUserKey();
		// 持阑 困摹俊 遏阑 吧绊 矫府倔捞 绝绰 酒捞袍阑 持绊! + 矫府倔 惯鞭 夸没
		slot.SetSerial( TEMP_DBSERIAL_VALUE ); //< 烙矫 蔼 持扁
		bAyncSerial = TRUE;
	}

	need_num = num;
	for( POSTYPE pos = 0 ; pos < pInventory->GetMaxSlotNum() ; ++pos )
	{
		if( pInventory->IsEmpty(pos) )
		{
			pInventory->InsertSlot( pos, slot );
			if( bAyncSerial )
			{
				ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
				pInventory->SetLock( pos, TRUE );
				// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
				msg.m_SlotIdx = SI_INVENTORY;
				msg.m_ItemPos = pos;
				m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
				// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
			}
			--need_num;
			if( pTotalInfo )
			{
				pTotalInfo->m_Slot[total].m_ItemPos	= pos;
				slot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
				++total; ++pTotalInfo->m_InvenCount;
			}
			if( need_num == 0 ) break;
		}
	}
	if( need_num != 0 )
	{
		for( POSTYPE pos = 0 ; pos < pTmpInventory->GetMaxSlotNum() ; ++pos )
		{
			if( pTmpInventory->IsEmpty(pos) )
			{
				pTmpInventory->InsertSlot( pos, slot );
				if( bAyncSerial )
				{
					ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
					pTmpInventory->SetLock( pos, TRUE );
					// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
					msg.m_SlotIdx = SI_TEMPINVENTORY;
					msg.m_ItemPos = pos;
					m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
					// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
				}
				if( pTotalInfo )
				{
					pTotalInfo->m_Slot[total].m_ItemPos	= pos;
					slot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
					++total; ++pTotalInfo->m_TmpInvenCount;
				}
				--need_num;
				if( need_num == 0 ) break;
			}
		}
	}

	ASSERT( need_num == 0 );

	return RC::RC_ITEM_SUCCESS;
}

RC::eITEM_RESULT ItemManager::Pick( POSTYPE NumberOfItems, SCItemSlot & rItemSlot, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
	RC::eITEM_RESULT rt = RC::RC_ITEM_SUCCESS;
	if( rItemSlot.IsOverlap() )
	{
		ASSERT( rItemSlot.GetNum() !=  0 );
		BYTE num = rItemSlot.GetNum();
		rItemSlot.SetNum(1);
		rt = ObtainDup( rItemSlot, NumberOfItems*num, pTotalInfo );
	}
	else
	{
		rt = Obtain( rItemSlot, NumberOfItems, pTotalInfo );
	}

	if( rt == RC::RC_ITEM_SUCCESS )
	{
		// 酒捞袍 凛扁 肺弊
		GAMELOG->WriteItemOwner( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &rItemSlot );
		// 酒捞袍 凛扁 肺弊 场
	}

	return rt;
}
// Field俊 乐绰 酒捞袍阑 笼菌促.
// 酒捞袍阑 牢亥配府狼 后傍埃 趣篮 烙矫 牢亥配府俊 茫酒辑 持绢霖促.
// 般磨 荐 乐绰 酒捞袍篮 般摹霸 贸府窍绊 ACK甫 焊辰促.
// 般摹瘤 臼绰 酒捞袍篮 厚悼扁利栏肺 DBP肺 何磐 矫府倔阑 惯鞭罐绊 ACK甫 焊辰促.
RC::eITEM_RESULT ItemManager::Pick( DWORD dwItemObjectKey, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{	
	if( !ValidState() ) 
		return RC::RC_ITEM_INVALIDSTATE;
	if( !ValidContainer(SI_INVENTORY) ) 
		return RC::RC_ITEM_INVALIDSTATE;


	ObjectFinder<Item> finder( dwItemObjectKey );
	if( !m_pPlayer->GetField()->SearchNeighborFieldItemAt( m_pPlayer->GetSectorIndex(), finder ) )
	{
		return RC::RC_ITEM_NOTEXISTITEMATFIELD;
	}
	Item * pItem = finder.GetTargetObject();
	SCItemSlot & rItemSlot = pItem->GetItemSlot();
	DURATYPE num = 1;

	RC::eITEM_RESULT rt = RC::RC_ITEM_SUCCESS;
	rt = Pick( num, rItemSlot, pTotalInfo );

⌨️ 快捷键说明

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