#ifndef _ITEM_STRUCTURE_H_ #define _ITEM_STRUCTURE_H_ #include #include "ItemConstants.h" namespace Item { class CItem; #pragma pack(1) // ------------------------------------------------------------------------------------------ // UseLimit, ItemInfo ´Â ½ºÅ©¸³Æ®¿¡¸¸ ³Ö´Â´Ù. struct ItemPos { unsigned short m_cPos : 4; // ¾ÆÀÌÅÛ Æ÷Áö¼Ç (Equip, Inven...) (0~15) unsigned short m_cIndex : 12; // ¾ÆÀÌÅÛ À妽º (0~4095) ItemPos() : m_cPos(0), m_cIndex(0) { } ItemPos(unsigned char cPos, unsigned short usIndex) : m_cPos(cPos), m_cIndex(usIndex) { } inline void SetPos(unsigned short wIndex) { m_cIndex = wIndex; } inline void SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex); inline void GetPos(unsigned char& cXIndex, unsigned char& cYIndex, unsigned char& cZIndex) const; inline unsigned char GetXIndex(void) const { return (m_cIndex & 0x00F); } inline unsigned char GetYIndex(void) const { return (m_cIndex & 0x0F0) >> 4; } inline unsigned char GetZIndex(void) const { return (m_cIndex & 0xF00) >> 8; } inline void SetXIndex(unsigned char cXIndex) { m_cIndex = (m_cIndex & 0xFF0) + cXIndex; } inline void SetYIndex(unsigned char cYIndex) { m_cIndex = (m_cIndex & 0xF0F) + (cYIndex << 4); } inline void SetZIndex(unsigned char cZIndex) { m_cIndex = (m_cIndex & 0x0FF) + (cZIndex << 8); } inline bool operator == (const ItemPos& rhs) const { return (m_cPos == rhs.m_cPos && m_cIndex == rhs.m_cIndex); } }; inline void ItemPos::SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex) { m_cIndex = (cZIndex << 8) + (cYIndex << 4) + cXIndex; } inline void ItemPos::GetPos(unsigned char& cXIndex, unsigned char& cYIndex, unsigned char& cZIndex) const { cXIndex = (m_cIndex & 0x00F); cYIndex = (m_cIndex & 0x0F0) >> 4; cZIndex = (m_cIndex & 0xF00) >> 8; } struct ItemData { unsigned __int64 m_dwUID; // ¾ÆÀÌÅÛ UID unsigned short m_usProtoTypeID; // ¾ÆÀÌÅÛ Á¾·ù ID ItemPos m_ItemPos; // ¾ÆÀÌÅÛ À§Ä¡ unsigned char m_cItemSize; // ¾ÆÀÌÅÛ ±¸Á¶Ã¼ Å©±â unsigned char m_cNumOrDurability; // °³¼ö ȤÀº ³»±¸µµ ItemData() { m_dwUID = m_usProtoTypeID = m_cNumOrDurability = 0; m_cItemSize = sizeof(ItemData); } void DumpInfo(unsigned long dwCID, const char* szExtraString) const; }; struct ItemAttribute { unsigned short m_cType : 4; // ¼Ó¼º °³¼ö 4bit (16°¡Áö) unsigned short m_usValue : 12; // ¼Ó¼º °ª 12bit (0 ~ 4096) ItemAttribute() : m_cType(0), m_usValue(0) { } ItemAttribute(unsigned char cType, unsigned short usValue) : m_cType(cType), m_usValue(usValue) { } }; // µÚ¿¡ Socket³»¿ë¹°ÀÌ m_cSocketNum¸¸Å­, Attribute°¡ m_cDiffAttributeNum¸¸Å­ ºÙ´Â´Ù. struct EquipmentInfo { enum { MAX_UPGRADE_LEVEL = 10, // ÃÖ´ë Á¦·Ã ·¹º§ MAX_CORE_LEVEL = 5, // ÃÖ´ë ÄÚ¾î ·¹¹ú (ÄÚ¾î¶õ ÄھÀ» ¹ß¶ó Ưº°ÇÑ ´É·ÂÀ» ºÎ¿©ÇÏ´Â ½Ã½ºÅÛ) MAX_ATTRIBUTE_PER_GEM = 2, // º¸¼® Çϳª´ç °­È­µÇ´Â ÃÖ´ë ¼Ó¼º ¼ö MAX_ATTRIBUTE_PER_UPGRADE_LEVEL = 2, // ÇÑ ´Ü°è¿¡ °­È­µÇ´Â ÃÖ´ë ¼Ó¼º ¼ö MAX_UPGRADE_ATTRIBUTE = 6, // Á¦·ÃÀ¸·Î ÀÎÇØ¼­ ¾òÀ» ¼ö ÀÖ´Â ÃÖ´ë ¼Ó¼º ¼ö MAX_MINSIZE_SOCKET_NUM = 6, // Å©±â°¡ 1by1ÀÎ ¾ÆÀÌÅÛÀÇ ÃÖ´ë ¼ÒÄÏ ¼ö MAX_MINSIZE_ATTRIBUTE_NUM = 6, // Å©±â°¡ 1by1ÀÎ ¾ÆÀÌÅÛÀÇ ÃÖ´ë ¼Ó¼º ¼ö MAX_SOCKET_NUM = 8, // ÀÏ¹Ý ¾ÆÀÌÅÛÀÇ ÃÖ´ë ¼ÒÄÏ ¼ö MAX_SOCKET_ATTRIBUTE_NUM = 16, // ¼ÒÄÏ Çϳª´ç ÃÖ´ë ¼Ó¼ºÀÌ µÎ°³±îÁö ´Þ¸± ¼ö ÀÖÀ½ // edith 2009.09.16 ¼ÒÄÏ °³¼ö ¼öÁ¤ // MAX_ATTRIBUTE_NUM = 22, // ÀÏ¹Ý ¾ÆÀÌÅÛÀÇ ÃÖ´ë ¼Ó¼º ¼ö MAX_ATTRIBUTE_NUM = 15, // ÀÏ¹Ý ¾ÆÀÌÅÛÀÇ ÃÖ´ë ¼Ó¼º ¼ö MAX_RUNE_SOCKET_NUM = 2, // ÀåÂøÇÒ¼ö ÀÖ´Â ·éÀÇ ÃÖ´ë ¼ö MAX_SOCKET_AND_ATTRIBUTE_MINISIZE = (MAX_MINSIZE_SOCKET_NUM * sizeof(char) + MAX_MINSIZE_ATTRIBUTE_NUM * sizeof(ItemAttribute)), MAX_SOCKET_AND_ATTRIBUTE_SIZE = (MAX_SOCKET_NUM * sizeof(char) + MAX_ATTRIBUTE_NUM * sizeof(ItemAttribute)) }; unsigned short m_cUpgradeCnt : 2; // Àç·Ã½Ã °í´ëÀÇ µ¹À» ¿¬¼ÓÀû »ç¿ëÇÑ Ä«¿îÆ®. unsigned short m_cReserved1 : 9; // ¿¹¾à µ¥ÀÌÅÍ... (0~511) short m_cUpgradeLevel : 5; // ¾÷±×·¹ÀÌµå ´Ü°è (-16 ~ 15) char m_cDiffMaxSocket : 5; // »óÁ¡ ¾ÆÀÌÅÛ ¼ÒÄÏ ¼ö + m_cDiffMaxSocket = ÀÌ ¾ÆÀÌÅÛÀÇ ÃÖ´ë ¼ÒÄÏ ¼ö (-16 ~ 15) unsigned char m_cSeasonRecord : 3; // ¾ÆÀÌÅÛ »ý¼º ½Ã±â (0~7) (¸®¹ë·±½Ì Àü : 0, ÈÄ : 1, ¸ÅÂùÀ¸·Î ´É·ÂÁõ°¡ : 2) unsigned char m_cSocketNum : 4; // ÀÌ ¾ÆÀÌÅÛÀÇ ÇöÀç ¼ÒÄÏ ¼ö (0 ~ 15) unsigned char m_cAttributeNum : 4; // »óÁ¡ ¾ÆÀÌÅÛ¿¡ ¾ø°Å³ª, ¼öÄ¡°¡ ´Ù¸¥ ¼Ó¼º ¼ö (0 ~ 15°³) char m_cDiffMaxDurability; // »óÁ¡ ¾ÆÀÌÅÛ°úÀÇ ÃÖ´ë ³»±¸µµ Â÷ÀÌ. unsigned char m_cCoreLevel : 4; // ÄÚ¾îÀÇ ·¹º§ (0 ~ 15) unsigned char m_cReserved2 : 4; // ¿¹¾à µ¥ÀÌÅÍ...(0~124) EquipmentInfo() { m_cUpgradeCnt = m_cReserved1 = m_cUpgradeLevel = m_cDiffMaxSocket = m_cDiffMaxDurability = m_cSocketNum = m_cAttributeNum = m_cSeasonRecord = m_cCoreLevel = m_cReserved2 = 0; } }; #pragma pack() const unsigned char MAX_ITEM_SIZE = sizeof(ItemData) + sizeof(EquipmentInfo) + EquipmentInfo::MAX_SOCKET_AND_ATTRIBUTE_SIZE; struct SpriteData { enum { MAX_NAME = 64, MAX_SPRITE_NAME = 32 }; char m_szName[MAX_NAME]; char m_szSpriteName[MAX_SPRITE_NAME]; unsigned short m_nSpriteMinX; unsigned short m_nSpriteMinY; unsigned short m_nSpriteMaxX; unsigned short m_nSpriteMaxY; SpriteData(); void Initialize(); }; struct StringData { enum { MAX_FIELD_MODEL_NAME = 32, MAX_EQUIP_MODEL_NAME = 32, MAX_EFFECT_SOUND_NAME = 32, MAX_TYPE_NAME = 32, MAX_ITEM_DESCRIBE = 256 }; char m_szFieldModelName[MAX_FIELD_MODEL_NAME]; char m_szEquipModelName[MAX_EQUIP_MODEL_NAME]; char m_szEffectSoundName[MAX_EFFECT_SOUND_NAME]; char m_szTypeName[MAX_TYPE_NAME]; char m_szItemDescribe[MAX_ITEM_DESCRIBE]; StringData(); void Initialize(); }; struct DetailData { enum Flags { EQUIP = (1 << 0), // ÀåºñÇÒ¼ö ÀÖ´ÂÁö ¿©ºÎ USE_ITEM = (1 << 1), // »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö ¿©ºÎ QUICKSLOT_IN = (1 << 2), // Äü½½·Ô¿¡ µé¾î°¥ ¼ö ÀÖ´ÂÁö ¿©ºÎ STACKABLE = (1 << 3), // ½ºÅÃÇÒ ¼ö ÀÖ´ÂÁö ¿©ºÎ HELM = (1 << 4), // Åõ±¸·ù ARMOR = (1 << 5), // °©¿Ê·ù DAGGER = (1 << 6), // ´Ü°Ë·ù ONEHANDED = (1 << 7), // ÇÑ¼Õ ¹«±â·ù LONGRANGE = (1 << 8), // Àå°Å¸® ¹«±â·ù TWOHANDED = (1 << 9), // ¾ç¼Õ ¹«±â·ù STAFF = (1 << 10), // ÁöÆÎÀÌ·ù SHIELD = (1 << 11), // ¹æÆÐ·ù //--// start.. NECKLACE = (1 << 12), // ¸ñ°ÉÀÌ RING = (1 << 13), // ¹ÝÁö RUNE = (1 << 14), // ·é //--// end.. AVATA = (1 << 15) // ¾Æ¹ÙŸÇü½Ä }; unsigned long m_dwPrice; // ±âº» °¡°Ý unsigned long m_dwBlackPrice; // ¾Ï½ÃÀå¿ë ÆÇ¸Å °¡°Ý unsigned long m_dwMedalPrice; // ¸Þ´Þ»óÁ¡¿ë ÆÇ¸Å °¡°Ý unsigned short m_wDropOption; // °¡Ä¡ Ã¥Á¤À» À§ÇÑ °ª unsigned char m_cGrade; // °¡Ä¡ Ã¥Á¤°ªÀÌ 0 À϶§ Àû¿ëµÉ µî±Þ //--// unsigned char m_cCriticalType; // Å©¸®Æ¼Äà ŸÀÔ unsigned char m_cAttackRange; // °ø°Ý °Å¸® unsigned char m_cItemType; // ¾ÆÀÌÅÛ Á¾·ù( namespace Type Âü°í ) unsigned char m_cXSize; // ¾ÆÀÌÅÛ XÅ©±â unsigned char m_cYSize; // ¾ÆÀÌÅÛ YÅ©±â unsigned char m_cMaxSocketNum; // ÃÖ´ë ¼ÒÄϼö unsigned char m_cDefaultDurabilityOrStack; // ±âº» ½ºÅÃ/³»±¸µµ unsigned char m_cMaxDurabilityOrStack; // ÃÖ´ë ½ºÅÃ/³»±¸µµ unsigned char m_cMinDropLevel; // µå¶øÇÏ´Â ¸ó½ºÅÍÀÇ ÃÖ¼Ò ·¹º§ unsigned char m_cMaxDropLevel; // µå¶øÇÏ´Â ¸ó½ºÅÍÀÇ ÃÖ´ë ·¹º§ unsigned short m_wLowLimitLevel; // ÀåÂø ÇÏÇѼ±. unsigned short m_wHighLimitLevel; // ÀåÂø »óÇѼ±. bool m_bExchangeAndDrop; // ±³È¯°ú µå¶øÀÌ °¡´ÉÇѰ¡? bool m_bSell; // ÆÈ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀΰ¡? bool m_bOptionPrice; // ¿É¼ÇÀ» Âü°íÇØ¼­ °¡°Ý Ã¥Á¤À» ´Ù½Ã ÇÒ °ÍÀΰ¡? unsigned long m_dwFlags; DetailData(); void Initialize(); }; struct EquipAttribute { unsigned short m_usAttributeValue[Item::Attribute::MAX_ATTRIBUTE_NUM]; unsigned short m_nAttibuteNum; EquipAttribute(); void Initialize(); }; struct UseItemInfo { Position m_Pos; // À̵¿ ÁÂÇ¥ (¼ø°£À̵¿¼­) unsigned char m_cZone; // À̵¿ Á¸ (¼ø°£À̵¿¼­) unsigned long m_dwAmount; // ¾ç (°æÇèÄ¡ÄíÆù, ij½¬ºÏ) unsigned short m_usSkill_ID; // °ü·Ã ½ºÅ³ ¾ÆÀ̵ð (Æ÷¼Ç, ½ºÅ³ºÏ) unsigned short m_usSkill_LockCount; // °ü·Ã ½ºÅ³ ¶ôÄ«¿îÆ® (Æ÷¼Ç, ½ºÅ³ºÏ) unsigned short m_wQuestID; // ½ÃÀÛ Äù½ºÆ® ¾ÆÀ̵ð (Äù½ºÆ® ½ÃÀÛ ¾ÆÀÌÅÛ) unsigned char m_cLimitRealmPoint; // °øÇå ÈÆÀå Æ÷ÀÎÆ®º° »ç¿ë Á¦ÇÑ bool m_bForStatueWar; // ±¹°¡Àü(¼®»óÀü) ½Ã°£¿¡¸¸ »ç¿ë °¡´É UseItemInfo(); void Initialize(); }; struct UseLimit { enum DeactivatedType { STATUS_LIMIT = ( 1 << 0 ), CLASS_LIMIT = ( 1 << 1 ), BROKEN_ITEM = ( 1 << 2 ) }; unsigned long m_dwClassLimit; unsigned char m_cLimitStatus; unsigned short m_wLimitValue; UseLimit(); void Initialize(); }; #pragma pack(8) struct ItemInfo { unsigned short m_usProtoTypeID; DetailData m_DetailData; UseLimit m_UseLimit; SpriteData m_SpriteData; StringData m_StringData; EquipAttribute m_EquipAttribute; UseItemInfo m_UseItemInfo; ItemInfo(); ItemInfo(unsigned short usPrototypeID); void Initialize(); inline bool operator < (ItemInfo& rhs) { return (m_usProtoTypeID < rhs.m_usProtoTypeID); } const char* GetItemDescribe(void) const; }; #pragma pack() struct ItemGarbage { CItem* m_lpItem; unsigned long m_dwRemainNum; ItemGarbage(CItem* lpItem, unsigned long dwRemainNum); }; struct ChemicalInfo { unsigned short m_wPickkingItemID; unsigned short m_wTargetItemID; unsigned short m_wResultItemID; unsigned char m_cPickkingItemNum; unsigned char m_cTargetItemNum; unsigned char m_cResultItemNum; unsigned long m_dwItemID; // ¾ÆÀÌÅÛ ¾ÆÀ̵ð unsigned short m_usAbilityID; // Àâ¾ÆÀ̵ð unsigned char m_cAbilityLevel; unsigned short m_usQuestID; // Äù¾ÆÀ̵ð unsigned char m_cPercent; // ¼º°øÈ®À² ChemicalInfo(); ChemicalInfo(unsigned short wPickkingItemID, unsigned char cPickkingItemNum, unsigned short wTargetItemID, unsigned char cTargetItemNum, unsigned int dwItemID, unsigned short usAbilityID, unsigned char cAbilityLevel, unsigned short usQuestID, unsigned char cPercent); bool operator < (const ChemicalInfo& rhs) { if (m_wPickkingItemID == rhs.m_wPickkingItemID) { return m_wTargetItemID < rhs.m_wTargetItemID; } return m_wPickkingItemID < rhs.m_wPickkingItemID; } bool operator == (const ChemicalInfo& rhs) { return (m_wPickkingItemID == rhs.m_wPickkingItemID && m_wTargetItemID == rhs.m_wTargetItemID && m_cPickkingItemNum == rhs.m_cPickkingItemNum && m_cTargetItemNum == rhs.m_cTargetItemNum); } }; namespace Grade { struct GradeInfo { EquipType::Grade m_eItemGrade; unsigned char m_cPlus; EquipType::Grade m_aryAttributeGrade[Attribute::MAX_ATTRIBUTE_NUM]; GradeInfo(); }; enum TableType { DROP_MIN_VALUE = 0, // µå¶ø ±×·¹À̵å ÃÖ¼Ò°ª DROP_MAX_VALUE = 1, // µå¶ø ±×·¹À̵å ÃÖ´ë°ª VALUE_GRADE = 2, // °¡Ä¡ ±×·¹À̵å MAX_TABLE_TYPE = 3 }; const float GetGradeValue(Item::CItemType::ArrayType eEquipType, Grade::TableType eTableType, EquipType::Grade eGrade, Attribute::Type eType); }; }; #endif