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

📄 itemmanager.h

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 H
字号:
#ifndef __ITEM_MANAGER_H__
#define __ITEM_MANAGER_H__

//=======================================================================================================================
/// ItemManager
/**
	@author
			Kim Min Wook < taiyo@webzen.co.kr >	
	@since
			2004. 8. 11~
	@history
			- 2004. 12. 28 : Drop, Pick, Link, Unlink 备泅
			- 2006/1/17 : 珐农狼 扁瓷己 窃荐 盒府 (ItemRankUp(), GetRankOptionItemType(), CreateRankItemSocketHole() )
							寇何俊辑 荤侩窍扁 困秦 static贸府 
*/
//=======================================================================================================================


#pragma once

#include <ResultCode.h>
#include <SCSlotHeader.h>
#include <SCItemSlot.h>
#include <SCSkillSlot.h>

class Player;
class SCSlotContainer;
class SCItemSlotContainer;
class SlotManager;

struct POS_INFO
{
	POSTYPE m_pos;		//< 酒捞袍阑 持阑 困摹x
	POSTYPE m_num;		//< m_pos[x]俊 持阑 俺荐
};

class ItemManager
{	
public:
	ItemManager();
	~ItemManager();

	VOID					Init( SlotManager * pMGR );
	VOID					Release();

	SCItemSlotContainer *	GetItemSlotContainer( SLOTIDX Index );
	BOOL					ValidPos( SLOTIDX atIndex, POSTYPE atPos, BOOL bEmptyCheck = TRUE );
	BOOL					ValidState();
	BOOL					ValidContainer( SLOTIDX atIndex );
	BOOL					IsEmpty( SLOTIDX Index, POSTYPE pos );

	/// --- 阿辆 酒捞袍 贸府 牢磐其捞胶 窃荐甸 ---
	RC::eITEM_RESULT		Move( SLOTIDX fromIndex, POSTYPE fromPos, SLOTIDX toIndex, POSTYPE toPos );				// Slot埃(Slot郴) 捞悼
	RC::eITEM_RESULT		Drop( SLOTIDX atIndex, POSTYPE atPos );												// Slot -> Field 滚府扁
	RC::eITEM_RESULT		Pick( DWORD dwItemObjectKey, INVENTORY_TOTAL_INFO * OUT pTotalInfo );
	RC::eITEM_RESULT		Pick( POSTYPE NumberOfItems, SCItemSlot & rItemSlot, INVENTORY_TOTAL_INFO * OUT pTotalInfo );

	RC::eITEM_RESULT		Combine( SLOTIDX fromIndex, POSTYPE fromPos, SLOTIDX toIndex, POSTYPE toPos );		// 家葛侩 酒捞袍 钦摹扁
	RC::eITEM_RESULT		Divide();																			// 家葛侩 酒捞袍 唱穿扁
	RC::eITEM_RESULT		Use( SLOTIDX atIndex, POSTYPE atPos );												// 家葛侩 酒捞袍 荤侩窍扁
	RC::eITEM_RESULT		Sell( SLOTIDX atIndex, POSTYPE atPos );
	RC::eITEM_RESULT		Buy( DWORD dwShopListID, BYTE ShopTabIndex,	BYTE ShopItemIndex, INVENTORY_TOTAL_INFO * pTotalInfo );

	RC::eITEM_RESULT		Lose( SLOTCODE ItemCode, BOOL bAllOfItem );
	VOID					Lose( SCSlotContainer * pContainer, POSTYPE pos, BYTE num );
	RC::eITEM_RESULT		DropMoney( MONEY Money );

	VOID					UpdateAttrForEquipItem();
	
	VOID					SerializeItemStream( SLOTIDX Index, POSTYPE pos, ITEMSTREAMEX * IN pStream, eSERIALIZE eType = SERIALIZE_LOAD );
	VOID					SerializeItemStream( SLOTIDX Index, POSTYPE pos, ITEMSTREAM * IN pStream, eSERIALIZE eType = SERIALIZE_LOAD );

	// 烙矫 捞亥飘 酒捞袍 荤侩
	VOID					SkillExecute( WORD SkillCode );

	// 酒捞袍 粮犁 咯何 眉农
	// 荤侩矫 林狼痢 : SLITIDX狼 葛电 浇吩阑 iterate窍扁 锭巩俊 加档啊 蠢副 堪妨啊 乐澜
	BOOL					IsExistItem( SLOTIDX Index, SLOTCODE code );


	// 可记贸府
	RC::eITEM_RESULT		EnchantEx( POSTYPE TargetPos, BYTE SuccessRateIndex );
	RC::eITEM_RESULT		Enchant( POSTYPE TargetPos, BYTE & OUT ResultEnchant );
	RC::eITEM_RESULT		RankUpEx( POSTYPE TargetPos1, POSTYPE TargetPos2, POSTYPE & OUT RankUpItemPos, POSTYPE & OUT DeletedItemPos, MONEY & OUT RankUpFare, BOOL & OUT bCreatedSocket );
	//RC::eITEM_RESULT		RankUp( POSTYPE TargetPos1, POSTYPE TargetPos2, POSTYPE & OUT RankUpItemPos, POSTYPE & OUT DeletedItemPos );
	RC::eITEM_RESULT		FillSocket( POSTYPE SocketItemPos, POSTYPE TargetPos );
	RC::eITEM_RESULT		ExtractSocket( POSTYPE TargetPos );
	RC::eITEM_RESULT		AddSocket( POSTYPE TargetPos );
	RC::eITEM_RESULT		CreateAccessory( BYTE Type, POSTYPE SocketItemPos, INVENTORY_TOTAL_INFO * OUT pTotalInfo );

	// 炼钦狼 扁瓷己 皋辑靛
	// 珐农矫 荤侩
	static BOOL				ItemRankUp( SCItemSlot * pItemSlot );
	static BOOL				CreateRankItemSocketHole( SCItemSlot * pItemSlot, BYTE byCurRank );

	// 漂沥酒捞袍俺荐啊 粮犁窍绰瘤 咯何 眉农
	BOOL					IsExistItemDup( SLOTIDX idx, SLOTCODE code, BYTE num,
											POSTYPE * OUT pPosArray, POSTYPE & INOUT posNum );
	BOOL					IsExistItem( SLOTIDX idx, SLOTCODE code, DURATYPE dur,/*吝汗登绰巴父秦寸,郴备档(X)*/
										 POSTYPE * OUT pPosArray, POSTYPE & INOUT posNum );

	VOID					Obtain( SLOTIDX SlotIdx, SLOTCODE ItemCode, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo, BYTE & OUT byCount, ITEMSLOTEX * OUT pItemSlot );
	VOID					Obtain( SLOTIDX SlotIdx, SCItemSlot & IN slot, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo, BYTE & OUT byCount, ITEMSLOTEX * OUT pItemSlot );
	//VOID					Obtain( SLOTIDX SlotIdx, SLOTCODE ItemCode, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo, INVENTORY_TOTAL_INFO * OUT pTotalInfo );
	//VOID					Obtain( SLOTIDX SlotIdx, SCItemSlot & IN slot, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo, INVENTORY_TOTAL_INFO * OUT pTotalInfo );
	BOOL					CheckInsertItem( SCSlotContainer * pContainer, POSTYPE & INOUT need_num );
	BOOL					CheckInsertItemDup( SCSlotContainer * pContainer, SLOTCODE ItemCode, const INT MAX_DUP_NUM, POSTYPE & INOUT need_num, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo );
	VOID					CanInsertOverlappedItem( SCSlotContainer * pContainer, SLOTCODE ItemCode, POSTYPE & INOUT need_num, POSTYPE * OUT PosArray, POSTYPE & OUT PosNum );
	VOID					CanInsertItem( SCSlotContainer * pContainer, POSTYPE MAX_DUP_NUM, POSTYPE & INOUT need_num, POSTYPE * OUT PosArray, POSTYPE & OUT PosNum );

	// 吝汗登绰 酒捞袍阑 裙垫且 锭
	RC::eITEM_RESULT		ObtainDup( SLOTCODE ItemCode, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo );
	RC::eITEM_RESULT		ObtainDup( SCItemSlot & IN slot, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo );

	// 吝汗登瘤 臼绰 酒捞袍阑 裙垫且 锭
	// 促父, 吝汗登绰 酒捞袍档 后傍埃俊 持绊磊 且锭绰 捞巴阑 荤侩!
	RC::eITEM_RESULT		Obtain( SLOTCODE ItemCode, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo );
	RC::eITEM_RESULT		Obtain( SCItemSlot & IN slot, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo );

	template <class FUNCTOR>
	BOOL					ForeachSlot( SLOTIDX idx, FUNCTOR & opr );
	template <class FUNCTOR>
	BOOL					Foreach( SLOTIDX idx, FUNCTOR & opr );

	// eFUNCTIONALTYPE_ITEM扁瓷 力芭
	VOID					FunctionalStop( DWORD FunctionalBit )			{ m_FunctionalType &= ~FunctionalBit; }
	// eFUNCTIONALTYPE_ITEM扁瓷 眠啊
	VOID					FunctionalResume( DWORD FunctionalBit )			{ m_FunctionalType |= FunctionalBit; }
	BOOL					IsPossibleFunction( eFUNCTIONALTYPE_ITEM type ) { return (m_FunctionalType&type); }
	// 吝汗 矫府倔 眉农 困茄 内靛
	BOOL					IsDupSerialCode( DBSERIAL serial )				{ return FALSE;}//(NULL != m_SerialCodeCheck.GetData(serial)); }
	VOID					AddSerialCode( SLOTIDX Index, DBSERIAL serial );
	VOID					RemoveSerialCode( DBSERIAL serial )				{ }//m_SerialCodeCheck.Remove( serial ); }
private:
	VOID					AddAttrForPassiveSkill( WORD wSkillCode );

	// 八祸窍扁 困秦 荤侩茄绰 烙矫 蔼
	POSTYPE					m_SlotPos[MAX_WAREHOUSE_SLOT_NUM];	//< MAX_WAREHOUSE_SLOT_NUM弥措 农扁捞骨肺
	DWORD					m_FunctionalType;					//< eFUNCTIONALTYPE_ITEM狼 厚飘楷魂贸府
	Player *				m_pPlayer;
	SlotManager *			m_pSlotMGR;
	SCSlotContainer **		m_ppSlotContainer;
	util::SolarHashTable<DWORD> m_SerialCodeCheck;
};

template <class FUNCTOR>
BOOL ItemManager::ForeachSlot( SLOTIDX idx, FUNCTOR & opr )
{
	return m_pSlotMGR->ForeachSlot(idx, opr);
}

template <class FUNCTOR>
BOOL ItemManager::Foreach( SLOTIDX idx, FUNCTOR & opr )
{
	return m_pSlotMGR->Foreach(idx, opr);
}


template<class PACKET_TYPE>
class SharingItem
{
	float				m_limitDistance;
	Player *			m_pStandardPlayer;
	POSTYPE				m_SharingItemNum;
	SCItemSlot &		m_SharingItemSlot;
	PACKET_TYPE			m_packet;
public:
	SharingItem( SCItemSlot & rSharingItemSlot, POSTYPE SharingItemNum, Player * pStandardPlayer ):m_SharingItemSlot(rSharingItemSlot),m_SharingItemNum(SharingItemNum),m_limitDistance(0.0f),m_pStandardPlayer(pStandardPlayer){}
	~SharingItem(){}

	inline VOID	SetDistance(  float limitDistance ) { m_limitDistance = limitDistance;	}

	VOID operator()( Player * pTargetPlayer )
	{
		if( pTargetPlayer->GetObjectKey() == m_pStandardPlayer->GetObjectKey() ) return;

		if( m_limitDistance == 0.0f )
		{
			if( RC::RC_ITEM_SUCCESS == pTargetPlayer->GetItemManager()->Pick( m_SharingItemNum, m_SharingItemSlot, &m_packet.m_ItemInfo ) )
				pTargetPlayer->SendPacket( &m_packet, m_packet.GetSize() );
		}
		else
		{
			if( pTargetPlayer->GetDist(m_pStandardPlayer) < m_limitDistance )
			{
				if( RC::RC_ITEM_SUCCESS == pTargetPlayer->GetItemManager()->Pick( m_SharingItemNum, m_SharingItemSlot, &m_packet.m_ItemInfo ) )
					pTargetPlayer->SendPacket( &m_packet, m_packet.GetSize() );
			}
		}
	}
};



#endif // __ITEM_MANAGER_H__

⌨️ 快捷键说明

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