Files
Leviathan/Client/Game/game/GameSystem/SInventoryMgr.h
T
2026-06-01 12:46:52 +02:00

383 lines
16 KiB
C++

#pragma once
#include <Windows.h>
//#include <vector>
#include <string>
#include <mmo/ArType.h>
#include "SNetMessage.h"
#include "SGameUIMgr.h"
using std::vector;
struct TS_ITEM_INFO;
class KViewportObject;
enum EQUIPMENT_INFO
{
EQUIPMENT_NONE,
EQUIPMENT_NORMAL, // 일반아이템.
EQUIPMENT_UPPER, // 상급아이템.
EQUIPMENT_DECORATE, // 꾸미기아이템.
EQUIPMENT_MAX
};
// Item 의 요청상태.
enum RQ_ITEM_STATE
{
RQ_ITEM_STATE_NONE = 0,
RQ_ITEM_STATE_DROP = 1, // 버리기.
RQ_ITEM_STATE_ERASE = 2, // 파괴( 파괴창 ).
RQ_ITEM_STATE_MAX,
};
//------------------------------------------------------------------------------------------------------------
// Shop slot information
//------------------------------------------------------------------------------------------------------------
class SShopSlot
{
public:
SShopSlot( void );
~SShopSlot( void );
void SetPrice( money_t nPrice ) { m_nPrice = nPrice; };
void SetHuntaHolicPoint( money_t nPoint ) { m_nHuntaHolicPoint = nPoint; } // #2.1.2.11.1
void SetArenaPoint(money_t point) { m_arenaPoint = point; }
void SetItemCode( int nItemCode );
void SetNpcHandle( AR_HANDLE handle ) { m_hNpc = handle; };
void SetRank( int nItemRank ) { m_nItemRank = nItemRank; }
const money_t GetPrice( void ) const { return m_nPrice; };
const money_t GetHuntaHolicPoint( void ) const { return m_nHuntaHolicPoint; }; // #2.1.2.11.1
const money_t GetArenaPoint( void ) const { return m_arenaPoint; }
const int GetItemCode( void ) const { return m_nItemCode; };
const int GetIconID( void ) const { return m_nIconID; };
const AR_HANDLE GetNpcHandle( void ) const { return m_hNpc; };
const int GetItemRank( void ) const { return m_nItemRank; };
private:
AR_HANDLE m_hNpc;
int m_nIconID;
int m_nItemCode;
int m_nItemRank;
money_t m_nPrice;
money_t m_nHuntaHolicPoint;
money_t m_arenaPoint;
};
//------------------------------------------------------------------------------------------------------------
// 인벤토리 슬롯 정보
//------------------------------------------------------------------------------------------------------------
class SInventorySlot
{
public:
enum { NONEITEM = -9, SOKETNULL = -99, NONESOKET = -999, ENDURANCE_SUCCESS = -9999 };
SInventorySlot( void );
~SInventorySlot( void );
public:
TS_ITEM_INFO* GetItem( void ) { return &m_ItemInfo; }
const AR_HANDLE GetHandle( void ) const { return m_ItemInfo.handle; }
const int GetItemCode( void ) const { return m_ItemInfo.Code; }
const count_t GetItemCount( void ) const { return count_t( m_ItemInfo.count ); }
const short GetPosition( void ) const { return m_ItemInfo.wear_position; }
const AR_HANDLE GetWearHandle( void ) const { return m_ItemInfo.own_summon_handle; }
const unsigned int GetEndurance( void ) const { return m_ItemInfo.endurance; }
const int* GetSocketInfo( void ) const { return m_ItemInfo.socket; }
const int GetEnhance( void ) const { return m_ItemInfo.enhance; }
const int GetIconID( void ) const { return m_nIconID; }
const int GetLevel( void ) const { return m_ItemInfo.level; }
const int GetRemainTime( void ) const { return m_ItemInfo.remain_time; }
const XFlag<int> GetXFlag( void ) const { return m_xFlg; }
const ItemInstance::ItemUID GetUID( void ) const { return m_ItemInfo.uid; }
const char GetEET( void ) const { return m_ItemInfo.elemental_effect_type; }
const int GetEERT( void ) const { return m_ItemInfo.elemental_effect_remain_time; }
const int GetEEAP( void ) const { return m_ItemInfo.elemental_effect_attack_point; }
const int GetEEMP( void ) const { return m_ItemInfo.elemental_effect_magic_point; }
const int GetEtherealDurability( void ) const { return m_ItemInfo.ethereal_durability; }
TS_ITEM_BASE_INFO::AwakenOption* const GetAwakening( void ) { return &(m_ItemInfo.awakenoption); }
const DWORD* GetAwakeningType( void ) const { return m_ItemInfo.awakenoption.nValue; }
const int* GetAwakeningValue( void ) const { return m_ItemInfo.awakenoption.nData; }
TS_ITEM_BASE_INFO::LPRANDOM_OPTION const GetRandomOption( void ) { return &(m_ItemInfo.random_option); }
const int GetSummonID( void ) const { return m_ItemInfo.summon_id; }
const int GetJewelSlotCount( void );
int getMaxEtherealDurability( void ) const;
// Fraun Sky Accessories 7/12/2025
int GetAdditionalItemEffect(void) const { return m_ItemInfo.nAdditionalItemEffect; }
static const int GetCrrEndurancePer( TS_ITEM_BASE_INFO* item, unsigned int& rEndurance );
const int GetCrrEndurancePer( unsigned int& rEndurance );
static const unsigned int GetMaxEndurance( TS_ITEM_BASE_INFO* item );
const unsigned int GetMaxEndurance( void );
const count_t GetUpdateCount( void ) const { return m_nGetItemCount; }
bool GetShowDecoration( void ) { return m_bShowDecoration; }
const int GetItemAppearance( void ) const { return m_ItemInfo.appearance_code; }
void SetItem( TS_ITEM_INFO* pItemInfo );
void SetUpdateCount( count_t nNewCount, bool bDestroy = false );
void SetItemCount( count_t nItemCount ) { m_ItemInfo.count = nItemCount.getAmount(); }
void SetPosition( short position ) { m_ItemInfo.wear_position = position; }
void SetIconID( int nIconID ) { m_nIconID = nIconID; }
void SetXFlag( XFlag<int> xFlag ) { m_xFlg = xFlag; }
void SetWearHandle( AR_HANDLE hCreature ) { m_ItemInfo.own_summon_handle = hCreature; }
void SetToggleShowDecoration( void ) { m_bShowDecoration ^= true; } // 꾸미기아이템 보임,숨김 토글.
void SetShowDecoration( bool flag ) { m_bShowDecoration = flag; } // 꾸미기아이템 보임,숨김 설정.
void SetExistence( bool bExistence ) { m_bIsExistence = bExistence; }
void SetAppendDecomposeWnd( bool bAppend ) { m_bIsAppendedDecomposeWnd = bAppend; }
bool IsAwakeningItem( void );
bool IsAwakeningItem( TS_ITEM_BASE_INFO* pItemBaseInfo );
bool isExhausted( void ) const;
bool IsExistence( void ) { return m_bIsExistence; }
bool IsAppendedDecomposeWnd( void ) const { return m_bIsAppendedDecomposeWnd; }
const bool IsSummonEquip( void ) const { return (m_ItemInfo.own_summon_handle != NULL); }
const bool IsStorageItem( void ) const { return (m_ItemInfo.wear_position == ItemBase::WEAR_STORAGE); }
const bool IsPlayerEquipItem( int nPos ) const { return (m_ItemInfo.wear_position == nPos && m_ItemInfo.own_summon_handle==NULL); }
const bool IsEquipItem( void ) const { return (m_ItemInfo.wear_position != ItemBase::WEAR_CANTWEAR && m_ItemInfo.wear_position != ItemBase::WEAR_NONE && m_ItemInfo.wear_position != ItemBase::WEAR_STORAGE); }
public:
int m_nLastDurabilityCheckPercent; // 마지막으로 출력한 메시지를 보여주고,
int m_nLastDurabilityValue; // 마지막으로 메시지 출력시 내구도의 값.
protected:
TS_ITEM_INFO m_ItemInfo;
count_t m_nGetItemCount; // 몇개 추가되었나 업뎃
int m_nIconID;
XFlag<int> m_xFlg;
bool m_bIsExistence;
bool m_bShowDecoration; // 꾸미기 아이템 보임,안보임.
bool m_bIsAppendedDecomposeWnd; // 분해 창에 등록 된 아이템 인가?
};
bool IsInstanceUnstackable( SInventorySlot* pSlot );
bool IsInstanceUnstackable( const XFlag<int>& rFlag );
bool IsInstanceUnstackable( const int nFlag );
//------------------------------------------------------------------------------------------------------------
// 인벤토리 매니져
//------------------------------------------------------------------------------------------------------------
namespace nsInventoryMgr
{
const static int NO_HANDLE( 0 );
const static int INVENTORY_SET_COUNT( 5 ); // Set 수
const static int INVENTORY_SET_SIZE( 13 ); // Set 의 Item 수
const static int CHECK_LENDING_TIME( 1000 );
const static int c_BeltSlotCnt( 8 );
};
using namespace nsInventoryMgr;
class SInventoryMgr : public SGameUIMgr
{
public:
enum
{
SET_INDEX_01 = 0,
SET_INDEX_02,
SET_INDEX_03,
SET_INDEX_04,
SET_INDEX_05,
};
SInventoryMgr();
~SInventoryMgr();
void SortItemList();
void Process( DWORD time );
void SetItemCoolTime( int nIndex, DWORD dwCoolTime );
int GetItemMaxCoolTime( int nIndex );
int GetItemCurCoolTime( int nIndex );
std::vector<SInventorySlot*> & GetInvenList() { return m_vInventory; };
/// 2010.11.24 편성된 크리처 카드 인지도 검사하도록 - prodongi
void GetInvenDataList( int nCategory, std::vector<SInventorySlot*>& vecInvenList, class SCreatureSlotMgr const& creatureSlotMgr, bool bExceptEquipItem = false, bool bExceptDontBuyItem = false );
//void GetInvenDataList( int nCategory, std::vector<SInventorySlot*>& vecInvenList, bool bExceptEquipItem = false, bool bExceptDontBuyItem = false );
bool GetInvenDataList2( int nCategory, std::vector< SInventorySlot*>& vecInvenList );
SInventorySlot* GetItemInfo( AR_HANDLE hItem );
SInventorySlot* GetItemInfo( int nWearPos );
SInventorySlot* GetItemInfo( ItemInstance::ItemUID itemUID );
void GetItemInfo( std::vector<SInventorySlot*>& rItemList, ItemBase::ItemCode code, int level=0, int enhance=0 );
SInventorySlot* GetCodeItemInfo( ItemBase::ItemCode code );
SInventorySlot* GetComparableEquipItemInfo( SInventorySlot* pItem, bool second_equip );
SInventorySlot* GetComparableEquipItemInfo( ItemBase::ItemCode code, bool second_equip );
SInventorySlot* GetItemInfoCreatureUID( int nUID );
AR_HANDLE GetItemHandle( int nIndex );
AR_HANDLE GetItemHandleForCode( int nItemCode );
const int GetItemSetIndex() const { return m_nCurSetIndex; };
const bool IsEndurance(int nResult) { return (nResult!=SInventorySlot::NONEITEM && nResult!=SInventorySlot::SOKETNULL && nResult!=SInventorySlot::NONESOKET); }
void CheckWeapon( const struct ItemBaseEx_info* pItemBase, int item_handle, ItemBase::ItemWearType MainWearType, ItemBase::ItemWearType SubWearType, unsigned int& a, int& nPosition, BOOL& bPut );
void Rq_UseItem( int nRace, AR_HANDLE item_handle, AR_HANDLE target_handle, AR_HANDLE item_target_handle, const char* lpText=NULL );
void Rq_CreatureUseItem( AR_HANDLE item_handle, AR_HANDLE target_handle );
/// Item 추가
int AddItem( TS_ITEM_INFO* pItemInfo );
/// Item 떨굼
int DropItem( AR_HANDLE item_handle );
/// Item 파괴
int DestroyItem( AR_HANDLE item_handle );
// 아이템 삭제 후 처리 (인덱스 밀기)
void _onEraseItem( std::vector<SInventorySlot*>::iterator it );
// 아이템파괴.
//int EraseItem( ItemBase::ItemCode itemCode, __int64 count );
int EraseItem( AR_HANDLE handle, __int64 count );
void SendDestroyMsg(int count, int itemCode);
bool GetIsRquestDestroyState()const { return m_rqItemState == RQ_ITEM_STATE::RQ_ITEM_STATE_ERASE; }
/// Item 수량 변경
int UpdateItemCount( AR_HANDLE item_handle, count_t nItemCount, bool fromDestory = false );
void UpdateWear( struct SMSG_ITEM_WEAR* pMsg );
void UpdateWearInfo( struct SMSG_ITEM_WEAR_INFO* pMsg, bool bCreature = false );
void ItemSet( int nItemSetIndex ) { m_nCurSetIndex = nItemSetIndex; };
/// 스킬 카드 장착 유무
void AddEquipCard( AR_HANDLE target_handle, AR_HANDLE hItem );
void DelEquipCard( AR_HANDLE target_handle, AR_HANDLE hItem );
bool IsEquipCard( AR_HANDLE hItem ) const; /// 2010.12.29 const 추가
/// 벨트 슬롯 장착 유무
void SetBeltSlotCard( struct SMSG_BELT_SLOT_INFO* pMsg );
bool IsBeltSlotCard( AR_HANDLE hItem ) const; /// 2010.12.29 const 추가
int GetBeltSlotIndex( AR_HANDLE hItem );
int GetEmptyBeltSlotIndex();
AR_HANDLE GetBeltSlot( int nIndex );
// 아이템의 장착여부 반환.
bool IsEquip( AR_HANDLE handle );
// 2010.08.17 - prodongi
//void Rq_BeltCardPut( bool bPutOn, AR_HANDLE hItem );
void Rq_BeltCardPut( bool bPutOn, AR_HANDLE hItem, int putSlot = 0 );
// shop list
void AddShopItem( struct SMSG_MARKET* pMsg );
void GetShopDataList( int nCategory, std::vector<SShopSlot*>& vecShopList );
SShopSlot* GetShopItem( int nItemCode );
SInventorySlot* GetUpdateItemInfo( AR_HANDLE handle );
void SetUpdateItemInfo( SInventorySlot* pSlot );
int GetLendingItemTime( AR_HANDLE item_handle );
// Cash Item
void SetCashDragItem( unsigned int itemUID ) { m_hCashDragItem = itemUID; }
const unsigned int GetCashDragItem() { return m_hCashDragItem; }
std::vector<TS_SC_COMMERCIAL_STORAGE_LIST::CommercialItemInfo> & GetCashItemList() { return m_vCashItemList; };
void UpdateCashItem( TS_SC_COMMERCIAL_STORAGE_LIST::CommercialItemInfo * pCashItemInfo );
void ClearCashItem();
/// 현재 아이템 소유 하고 하는가?
bool IsExistItem( int nItemCode );
bool IsExistItem( AR_HANDLE hItem );
bool IsExistItem( AR_HANDLE hItem, count_t nItemCount );
/// 창고에 인벤토리에 해당 코드의 아이템이 있는가?
bool IsExistInvenItem( int nItemCode );
bool IsAwakeningItem(SInventorySlot* pSlot);
AR_HANDLE GetFirstFindItem( int nItemCode );
count_t GetItemCount( int nItemCode );
void GetEquipItemList( std::vector<SInventorySlot*>& vecInvenList );
// 2010.07.22 - prodongi
void getCreatureEquipItemList(std::vector<SInventorySlot*>& vecInvenList, AR_HANDLE creatureHandle);
void Clear();
void ResetInfo();
void CheckDurabilityMsg(SInventorySlot* pSlot);
// Item 의 요청상태.
void SetItemRqState( RQ_ITEM_STATE state ){
m_rqItemState = state;
}
protected:
bool enableSellItem(bool exceptEquipItem, bool exceptDontBuyItem, SInventorySlot const* slot,
SCreatureSlotMgr const& creatureSlotMgr, ItemBaseEx_info const* item) const;
protected:
DWORD m_dwTime;
DWORD m_dwCheckLendingTime;
unsigned int m_nCheckCount;
void _addLendingItem( SInventorySlot* pItemSlot );
void _delLendingItem( SInventorySlot* pItemSlot );
int m_nCurSetIndex;
SInventorySlot m_nSet[INVENTORY_SET_COUNT][INVENTORY_SET_SIZE]; ///< Set에는 Only Link
struct EQUIP_CARD
{
AR_HANDLE item_handle;
AR_HANDLE target_handle;
};
std::vector< EQUIP_CARD > m_vEquipCareList;
struct CRETURE_REMAIN_TIME
{
int nRemainTime;
AR_HANDLE hCreatureCard;
};
std::vector<SInventorySlot*> m_vLendingItem; ///< 대여 아이템 핸들
std::vector<SInventorySlot*> m_vInventory; ///< Inventory List
std::vector<SShopSlot*> m_vecShopList; ///< shop list
//현재 장착하고 있는 정보
ItemBase::ItemCode m_itemCode[ItemBase::MAX_ITEM_WEAR]; ///< 장착된 아이템 코드
AR_HANDLE m_itemHandle[ItemBase::MAX_ITEM_WEAR]; ///< 장착된 아이템 핸들
SInventorySlot* m_pUpdateItemInfo;
std::vector< TS_SC_COMMERCIAL_STORAGE_LIST::CommercialItemInfo > m_vCashItemList;
unsigned int m_hCashDragItem;
int m_dwCool_time[TS_SC_ITEM_COOL_TIME::MAX_ITEM_COOLTIME_GROUP]; ///< 아이템 그룹 쿨타임
DWORD m_dwCur_time[TS_SC_ITEM_COOL_TIME::MAX_ITEM_COOLTIME_GROUP];
int m_dwRemain_time[TS_SC_ITEM_COOL_TIME::MAX_ITEM_COOLTIME_GROUP];
AR_HANDLE handle_BeltSlot[6]; ///< Belt Slot Info
// Item 의 요청상태.
int m_rqItemState;
};