📄 itemmanager.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 + -