#ifndef _CITEM_CLASS_H_ #define _CITEM_CLASS_H_ #include #include #include #include #include "item/ItemMgr.h" #include "item/ItemStructure.h" // Àü¹æ ÂüÁ¶ class CCharacter; #define DELITEMLOG(x) (void*)0 //#define DELITEMLOG(x) x namespace Item { class CItem { public: CItem(); CItem(const ItemInfo& itemInfo); // ½ºÅ©¸³Æ®·ÎºÎÅÍ ·ÎµåÇÑ ¾ÆÀÌÅÛ µ¥ÀÌÅ͸¦ ¾ò¾î ¿Â´Ù. const ItemInfo& GetItemInfo() const { return m_ItemInfo; } // Desc : ¾ÆÀÌÅÛ Á¤º¸¸¦ char¹öÆÛ·Î ±â·ÏÇÑ´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - ±â·ÏÇÑ Å©±â virtual bool SerializeOut(char* lpSerializeItem_Out, size_t& nBufferLength_InOut); // Desc : char¹öÆÛ·ÎºÎÅÍ ¾ÆÀÌÅÛ Á¤º¸¸¦ ÀÐ¾î ¿Â´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - »ç¿ëÇÑ ¹öÆÛ Å©±â virtual bool SerializeIn(const char* lpSerializeItem_In, size_t& nBufferLength_InOut); inline void MoveItem(ItemPos itemPos); inline unsigned __int64 GetUID(void) const { return m_ItemData.m_dwUID; } inline ItemPos GetPos(void) const { return m_ItemData.m_ItemPos; } inline ItemPos GetRealPos(void) const { return m_itemPos_Real; } inline void SwapPos(void) { std::swap(m_ItemData.m_ItemPos, m_itemPos_Real); } inline unsigned short GetPrototypeID(void) const { return m_ItemData.m_usProtoTypeID; } inline unsigned char GetNumOrDurability(void) const { return m_ItemData.m_cNumOrDurability; } inline unsigned char GetMaxNumOrDurability(void) const { return m_cMaxNumOrDurability; } inline void SetNumOrDurability(unsigned char cNumOrDurability) { m_ItemData.m_cNumOrDurability = cNumOrDurability; } inline void SetMaxNumOrDurability(unsigned char cNumOrDurability) { m_cMaxNumOrDurability = cNumOrDurability; } inline void SetStallPrice(unsigned long dwStallPrice) { m_dwStallPrice = dwStallPrice; } inline unsigned long GetStallPrice(void) const { return m_dwStallPrice; } inline unsigned long GetBuyBlackPrice(void) const { return m_ItemInfo.m_DetailData.m_dwBlackPrice; } inline unsigned long GetBuyMedalPrice(void) const { return m_ItemInfo.m_DetailData.m_dwMedalPrice; } virtual unsigned long GetBuyPrice(void) const; virtual unsigned long GetSellPrice(void) const; virtual unsigned long GetRepairPrice(void) const; virtual unsigned long GetUpgradePrice(void) const; virtual unsigned long GetGraftPrice(void) const; inline const char* GetItemTypeName(void) const { return m_ItemInfo.m_StringData.m_szTypeName; } inline bool IsSet(unsigned long dwDetailDataFlag) const { return dwDetailDataFlag == (m_ItemInfo.m_DetailData.m_dwFlags & dwDetailDataFlag); } inline bool GetEnableRepair(void); inline bool GetEnableStack(void); inline bool GetSocketItem(void); inline bool GetRuneItem(void); inline bool GetTwohandItem(void); inline bool GetEnableEquip(void); inline void SetItemPos(unsigned short wItemPos) { m_ItemData.m_ItemPos.m_cPos = wItemPos; } inline unsigned short GetItemPos(void) { return m_ItemData.m_ItemPos.m_cPos; } inline void SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex) { m_ItemData.m_ItemPos.SetPos(cXIndex, cYIndex, cZIndex); } inline void SetXIndex(unsigned char cXIndex) { m_ItemData.m_ItemPos.SetXIndex(cXIndex); } inline void SetYIndex(unsigned char cYIndex) { m_ItemData.m_ItemPos.SetYIndex(cYIndex); } inline void SetZIndex(unsigned char cZIndex) { m_ItemData.m_ItemPos.SetZIndex(cZIndex); } inline void SetPos(unsigned short wIndex) { m_ItemData.m_ItemPos.SetPos(wIndex); } // SetUID´Â ¾Æ¹«¶§³ª ÇԺηΠ»ç¿ëÇÏÁö ¸¶½Ã¿À! inline void SetUID(unsigned __int64 dwItemUID) { m_ItemData.m_dwUID = dwItemUID; } // S ±×·¹À̵å Á¦ÇѰª º¸Á¤(S ±×·¹À̵å À̿ܿ¡´Â ¾²Áö ¸¶¼¼¿ä. °ø½ÄÀÌ Á¤È®ÇÏÁö ¾Ê½À´Ï´Ù. - by hackermz) virtual void RevisionLimit() { } virtual void RevisionLimit(short* lpattrLimit) { } virtual void RevisionLimit(Item::Attribute::Type eAttributeType, short& attrLImit) { } protected: virtual ~CItem(); const ItemInfo& m_ItemInfo; // ½ºÅ©¸³Æ®·ÎºÎÅÍ ·ÎµåÇÑ ¾ÆÀÌÅÛ µ¥ÀÌÅÍ ItemData m_ItemData; // DB¿¡ ÀúÀåµÇ´Â ¾ÆÀÌÅÛ µ¥ÀÌÅÍ ItemPos m_itemPos_Real; // Àӽà °ø°£ÀÌ ¾Æ´Ñ ¾ÆÀÌÅÛ À§Ä¡ unsigned char m_cMaxNumOrDurability; // ÃÖ´ë ³»±¸µµ unsigned long m_dwStallPrice; // ³ëÁ¡»ó¿¡¼­ÀÇ °¡°Ý unsigned long m_dwPrice; // ¾ÆÀÌÅÛ °¡°Ý (¿É¼Ç¿¡ ÀÇÇØ °»½ÅµÇÁö¸¸ ³»±¸µµ¸¦ °í·ÁÇÏÁö´Â ¾ÊÀº °ª) friend class CItemFactory; }; class CEquipment : public CItem { public: enum EQUIPMENT_ERROR { // ¼ÒÄÏ ¹Ú±â S_SUCCESS = 0, // ¼º°ø E_SERVER_ERROR = 1, // ¼­¹ö ¿¡·¯ E_GET_EQUIP_FAILED = 2, // Àåºñ ¾ò±â ½ÇÆÐ E_GET_GEM_FAILED = 3, // Áª ¾ò±â ½ÇÆÐ E_NOT_EQUIP = 4, // ¾÷±×·¹ÀÌµå °¡´ÉÇÑ ¾ÆÀÌÅÛ ¾Æ´Ô E_NOT_GEM = 5, // Áª ¾ÆÀÌÅÛ ¾Æ´Ô E_REMOVE_GEM_FAILED = 6, // Áª Á¦°Å ½ÇÆÐ E_SOCKET_IS_FULL = 7, // ¼ÒÄÏ ½½·Ô Ãʰú E_OVER_MAX_SOCKET = 8, // ÃÖ´ë ¼ÒÄÏ Ãʰú E_SOCKET_NOT_MAX = 9, // ¼ÒÄÏ °³¼ö°¡ 7°³°¡ ¾Æ´Ï´Ù. E_SOCKET_NOT_INST = 10, // ¼ÒÄÏ¿¡ ÀνºÅçµÈ º¸¼®ÀÌ ¾ø´Ù. // ·é ¼³Ä¡/Á¦°Å R_SUCCESS = 0, // ·é ¼³Ä¡/Á¦°Å ¼º°ø. E_GET_RUNE_FAILED = 9, // ·é °³¼ö°¡ ¾øÀ»¶§. E_NOT_RUNE = 10, // ·éÀÌ ¾øÀ»¶§. E_NOT_RUNE_SLOT = 11, // ·é¿¡ ºó ¼ÒÄÏÀÌ ¾øÀ»¶§. E_NOT_RUNE_LEVEL_LIMIT = 12, // ·é¿¡ ·¹º§Á¦ÇѶ§ ¹®Á¦¿¡ ¼³Ä¡ÇÒ ¼ö ¾øÀ»¶§. E_USED_RUNE_SKILL_POINT = 13, // ·é¿¡ Ãß°¡ ½ºÅ³ Æ÷ÀÎÆ®¸¦ »ç¿ëÇϰí À־ Á¦°Å ÇÒ ¼ö ¾øÀ»¶§. E_NOT_RUNE_SCRIPT_INFO = 14, // ·é¿¡ ½ºÅ©¸³Æ® Á¤º¸¸¦ ¾ò¾î¿Ã¼ö ¾øÀ»¶§. // °­È­ E_GET_MINERAL_FAILED = 3, // ±¤¹° ¾ò±â ½ÇÆÐ E_NOT_MINERAL = 5, // ±¤¹°ÀÌ ¾Æ´Ô E_NOT_MATCH_MINERAL_TYPE = 6, // ±¤¹° ŸÀÔ Æ²¸² E_NOT_ENOUGH_MINERAL = 7, // ±¤¹° ºÎÁ· E_REMOVE_EQUIP_FAILED = 8, // Àåºñ Á¦°Å ½ÇÆÐ E_CREATE_SCRAP_FAILED = 9, // °íö »ý¼º ½ÇÆÐ E_SET_SCRAP_FAILED = 10, // °íö ³õ±â ½ÇÆÐ E_REMOVE_MINERAL_FAILED = 11, // ±¤¹° Á¦°Å ½ÇÆÐ E_UPGRADE_LEVEL_IS_FULL = 12, // ´õ ÀÌ»ó ¾÷±×·¹À̵带 ÇÒ ¼ö ¾øÀ½ E_NOT_ENOUGH_MONEY = 13, // µ·ÀÌ ºÎÁ·Çؼ­ ¾÷±×·¹À̵å ÇÒ ¼ö ¾øÀ½ S_BROKEN_EQUIP = 14, // ¼º°øÇßÀ¸³ª ¹«±â ºÎ¼­Áü (Ŭ¶óÀÌ¾ðÆ®·Î º¸³»Áö´Â ¾Ê´Â´Ù.) E_NOT_UPGRADE_LEVEL = 15, // ¿É¼Ç ÀÌ½Ä °¡´ÉÇÑ Á¦·Ã ¾÷±×·¹ÀÌµå ·¹º§ÀÌ ¾Æ´Ô. E_NOT_UPGRADE_AS_OVER = 16, // °í´ëÀÇ µ¹ ÀÌ¿ë ȸ¼ö Ãʰú. E_NOT_UPGRADE_ENDURANCE = 17, // ³»±¸µµ ȸº¹ ¾ÆÀÌÅÛ »ç¿ë ºÒ°¡. E_NOT_UPGRADE_MINENDURANCE = 18, // Á¦·Ã°¡´ÉÇÑ ³»±¸µµ 10ÀÌ µÇÁö ¾Ê½À´Ï´Ù. // ¿É¼Ç ÀÌ½Ä E_WRONG_ATTRIBUTE = 2, // ÀÌ½Ä ºÒ°¡´ÉÇÑ ¿É¼Ç E_NOT_EQUAL_KIND = 3, // ´Ù¸¥ Á¾·ùÀÇ Àåºñ E_HIGH_GRADE_ORIGINAL = 4, // ¿øº»ÀÇ ±×·¹À̵尡 ³ôÀ½ E_GRAFE_FAILD = 5, // ¿É¼ÇÀÌ½Ä ½ÇÆÐ // º¸»ó ÆÇ¸Å E_WRONG_TYPE = 2, // º¸»ó ÆÇ¸Å ´ë»óÀÌ ¾Æ´Ô E_NEW_SEASON_EQUIP = 3, // »õ·Î µå¶ø‰ç°Å³ª ÀÌ¹Ì º¸»óµÈ Àåºñ E_LOW_STATUS_EQUIP = 4 // ³Ê¹« ³·Àº ¼öÁØÀÇ Àåºñ }; enum PASSIVE_TYPE { PASSIVE_ALWAYS = 0, // ¹«±â¿¡ »ó°ü¾øÀÌ Ç×»ó ¹ß»ýÇÏ´Â ÆÐ½Ãºê PASSIVE_THIS_WEAPON = 1, // ÇØ´ç ¹«±â¿¡ ¹ß»ýÇÏ´Â ÆÐ½Ãºê NONE_PASSIVE_THIS_WEAPON = 2 // ÇØ´ç ¹«±â¿¡ ¹ß»ýÇÏÁö ¾Ê´Â ÆÐ½Ãºê }; enum RuneApplyType { RUNE_NONE = 0, RUNE_INDEX = (1 << 0), // Çϳª¿¡ ¼Ó¼º. RUNE_ALL = (1 << 1), // ¸ðµç ¼Ó¼º. RUNE_APPLY = (1 << 2), // ¼Ó¼ºÀ» Ãß°¡. RUNE_REMOVE = (1 << 3) // ¼Ó¼ºÀ» »èÁ¦. }; // ¾ÆÀÌÅÛÀ» Àåºñ·Î DowncastÇÑ´Ù. inline static CEquipment* DowncastToEquipment(CItem* lpItem); // Desc : ¾ÆÀÌÅÛ Á¤º¸¸¦ char¹öÆÛ·Î ±â·ÏÇÑ´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - ±â·ÏÇÑ Å©±â virtual bool SerializeOut(char* lpSerializeItem_Out, size_t& nBufferLength_InOut); // Desc : char¹öÆÛ·ÎºÎÅÍ ¾ÆÀÌÅÛ Á¤º¸¸¦ ÀÐ¾î ¿Â´Ù. // In : ¹öÆÛ, ¹öÆÛ Å©±â // Out : (Return)¼º°ø ¿©ºÎ, nBufferLength_InOut - »ç¿ëÇÑ ¹öÆÛ Å©±â virtual bool SerializeIn(const char* lpSerializeItem_In, size_t& nBufferLength_InOut); // ¾ÆÀÌÅÛ ¼Ó¼º Ãß°¡ (¼Ó¼º º¯°æ ÈÄ¿¡´Â ¹Ýµå½Ã °¡°Ý/±×·¹ÀÌµå °è»êÀ» ´Ù½Ã ÇØÁݽôÙ.) inline void AddAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue); inline void SetAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue); // 3Â÷ ¹ë·±½º ÆÐÄ¡(¼ÒÄÏ, ¾÷±×·¹ÀÌµå °ª Á¦°Å)0 inline void RemoveUpgradeAttribute(Item::Attribute::Type eAttributeType); inline void RemoveGemAttribute(Item::Attribute::Type eAttributeType); // ¾ÆÀÌÅÛ ¼Ó¼ºÀ» ¾ò¾î ¿Â´Ù. inline short GetAttribute(Item::Attribute::Type eAttributeType); inline void GetAttribute(short* lpAttributeArray_Out, unsigned short nArraySize); // ¿É¼Çº° ÇѰ谪¿¡ µµ´ÞÇß´ÂÁö üũÇÑ´Ù. bool CheckAttributeLimit(Item::Attribute::Type eAttributeType, unsigned char cType = 0); inline bool AddSocket(unsigned char cSocket); inline void GetSocket(unsigned char* cSockets, unsigned char cArraySize); unsigned char GetSocket(unsigned char cIndex) { return m_cSocket[cIndex]; } const Grade::GradeInfo& GetItemGrade(void) const { return m_GradeInfo; } inline void InitializeAttribute(void); // ¾ÆÀÌÅÛ Á¤º¸¸¦ »óÁ¡°ªÀ¸·Î ÃʱâÈ­ BOOL AddRandomOption(Item::EquipType::Grade eGrade, unsigned char cBaseNum, int iMagicChance = 0); // ¼ÒÄÏ ¼³Á¤ BOOL AddRandomSocket(); // ¿É¼Ç ÀÌ½Ä EQUIPMENT_ERROR OptionGraft(CEquipment* lpSacrifice, bool bUpgradeLevelLimit, unsigned char cAttributeType, unsigned long dwCurrentGold, unsigned long& dwUsedGold); bool CanOptionGraft(Item::CItemType::ArrayType eItemType, Item::Attribute::Type eAttributeType); // º¸»ó ÆÇ¸Å EQUIPMENT_ERROR Compensation(unsigned char cClass, unsigned char cLevel, CharacterStatus status, CEquipment** lppResultEquip, long& lCompensationGold); unsigned char GetUpgradeLevel(void) const { return m_cUpgradeLevel; } unsigned char GetCurrentSocketNum(void) const { return m_cSocketNum; } unsigned char GetMaxSocketNum(void) const { return m_cMaxSocket; } // ¸®¹ë·±½Ì ÀÌÈÄ »ý¼ºµÇ´Â Àåºñ´Â ÀÌ ÇÔ¼ö¸¦ È£ÃâÇØÁØ´Ù. void SetNewEquip(char cStrong = 0) { if(cStrong == 2) m_cSeasonRecord = 3; else if(cStrong == 1) m_cSeasonRecord = 2; else if(m_cSeasonRecord == 0) m_cSeasonRecord = 1; } unsigned char GetSeasonRecord(void) { return m_cSeasonRecord; } unsigned long GetBuyPrice(void) const; unsigned long GetSellPrice(void) const; unsigned long GetRepairPrice(void) const; unsigned long GetUpgradePrice(void) const; unsigned long GetGraftPrice(void) const; unsigned char GetUpgradeCnt(void) { return m_cUpgradeCnt; } void SetUpgradeCnt(unsigned char cUpgradeCnt) { m_cUpgradeCnt = cUpgradeCnt; } // ¾÷±×·¹ÀÌµå °¡´É ¿©ºÎ ¸®ÅÏ bool IsUpgradable(void) const; // ÀåÂø¾ÆÀÌÅÛ¿¡ ·é ¼ÒÄÏ °³¼ö üũ inline unsigned char GetMaxRuneSocket(); // ·éÀ» ¾ÆÀÌÅÛ¿¡ ÀåÂø °¡´ÉÇÑÁö üũ inline unsigned char GetRuneEquipable(); // ÀåÂø ¾ÆÀÌÅÛ¿¡ ÀåÂøÁ¦ÇÑ¿¡ ·¹º§À» ¾ò¾î¿Â´Ù. inline unsigned short GetRuneEquipLimitLevel(void) const; // ·é ¾ÆÀÌÅÛÀ» Á¦°Å(¼Ó¼ºµµ °°ÀÌ Á¦°Å) inline bool SubRuneAttribute(void); // ¼³Ä¡ µÇ¾î ÀÖ´Â ·é ¼ÒÄϰªÀ» ³Ñ°ÜÁØ´Ù. inline unsigned short GetRuneSocket(unsigned char cIndex) { if (cIndex >= EquipmentInfo::MAX_RUNE_SOCKET_NUM) { return 0; } return m_usRuneSocket[cIndex]; } // ·é ¼Ó¼ºÀ» »èÁ¦ÇÑ ¾ÆÀÌÅÛ ¼Ó¼º º¹»çº»À» ³Ñ°ÜÁØ´Ù. inline void GetSubRuneAttribute(short* psAttribute); inline void GetSubRuneAttribute(Item::Attribute::Type eAttributeType, short& sAttribute); // ¿ÜºÎ¿¡¼­ »ç¿ëÇÒ ·é ¼Ó¼º »èÁ¦/Ãß°¡ inline void SetRuneAttribute(RuneApplyType enRuneApplyType, unsigned char ucIndex); // ÀåÂø ¾ÆÀÌÅÛ¿¡ ÀÖ´Â ¸ðµç ·é ¾ÆÀÌÅÛ¿¡ ¼Ó¼ºÁß ½ºÅ³Æ÷ÀÎÆ® ¸®ÅÏÇØÁØ´Ù. unsigned short GetAllRuneSkillPointCheck(); // ·é ¾ÆÀÌÅÛÀÌ ÀåÂø µÇ¾î ÀÖÀ¸¸é ½ºÅ³ Æ÷ÀÎÆ® üũ bool GetRuneCheckSkill(CCharacter* lpCharacter, Item::ItemPos itemPos, bool bChk = true); // ------------------------------------------------------------------------------------------------------------ // ConvertTool¿¡¼­¸¸ »ç¿ëµÇ´Â ÇÔ¼öµé - RebalanceOverItem.cpp ¿¡¼­ »ç¿ë inline void Repair(); inline void InitEquip(); inline void SetEquip(); // ------------------------------------------------------------------------------------------------------------ // ¼­¹ö¿¡¼­¸¸ »ç¿ëµÇ´Â ÇÔ¼öµé - ItemServerFunc.cpp ¿¡¼­ º°µµ ±¸Çö EQUIPMENT_ERROR InstallSocket(CItem& Gem); EQUIPMENT_ERROR UpgradeItem(CItem& Mineral_InOut, unsigned long dwCurrentGold_In, unsigned long& dwUsedGold_Out, unsigned char& cMaxDur_Out); EQUIPMENT_ERROR InstallRuneSocket(CItem& Rune, bool bEquip, unsigned char cLevel); // ÀåÂø ¾ÆÀÌÅÛ¿¡ ·é ¼ÒÄÏ ¼³Ä¡. EQUIPMENT_ERROR UnInstallRuneSocket(CItem& Rune, bool bEquip, unsigned char cLevel, unsigned short usSkillPoint); // ÀåÂø ¾ÆÀÌÅÛ¿¡ ·é ¼ÒÄÏ Á¦°Å. // ------------------------------------------------------------------------------------------------------------ // 3Â÷ ¹ë·±½º ÆÐÄ¡ °ü·Ã ÇÔ¼ö // S ±×·¹À̵å Á¦ÇѰª ±¸Çϱâ bool GetLimitValue(short* lpattrLimit); bool GetLimitValue(Item::Attribute::Type eAttributeType, short& attrLimit); // S ±×·¹À̵å Á¦ÇѰª º¸Á¤(S ±×·¹À̵å À̿ܿ¡´Â ¾²Áö ¸¶¼¼¿ä. °ø½ÄÀÌ Á¤È®ÇÏÁö ¾Ê½À´Ï´Ù. - by hackermz) void RevisionLimit(); void RevisionLimit(short* lpattrLimit); void RevisionLimit(Item::Attribute::Type eAttributeType, short& attrLImit); // ±×·¹À̵å Ã¥Á¤ void CalculateItemGrade(void); protected: enum ApplyType { APPLY = 1, // °ª ¹Ù²ÙÁö ¸» °Í REMOVE = -1 // °ª ¹Ù²ÙÁö ¸» °Í }; CEquipment(const ItemInfo& itemInfo); virtual ~CEquipment(); inline void InitializeGemAttribute(void); // ¼ÒÄÏ Á¤º¸·Î ¼ÒÄÏ ¼Ó¼ºÀ» ÃʱâÈ­ inline void InitializeUpgradeAttribute(void); // ¾÷±×·¹ÀÌµå ´Ü°è·Î ¾÷±×·¹ÀÌµå ¼Ó¼ºÀ» ÃʱâÈ­ inline void ApplyGemAttribute(ApplyType eApplyType); // ¼ÒÄÏ ¼Ó¼ºÀ» Àû¿ë inline void ApplyUpgradeAttribute(ApplyType eApplyType); // ¾÷±×·¹ÀÌµå ¼Ó¼ºÀ» Àû¿ë inline void ApplyRuneAttribute(ApplyType eApplyType); // ·é ¾ÆÀÌÅÛ ¼Ó¼ºÀ» Àû¿ë void CalculateItemPrice(void); // °¡°Ý Ã¥Á¤ unsigned char m_cSocket[EquipmentInfo::MAX_SOCKET_NUM]; // ¾ÆÀÌÅÛ ¼ÒÄÏ Á¤º¸ ItemAttribute m_SocketAttribute[EquipmentInfo::MAX_SOCKET_ATTRIBUTE_NUM]; // ¾ÆÀÌÅÛ ¼ÒÄÏÀ¸·Î ¹ÚÀº ¼Ó¼º ItemAttribute m_UpgradeAttribute[EquipmentInfo::MAX_UPGRADE_ATTRIBUTE]; // ¾ÆÀÌÅÛ ¾÷±×·¹À̵å½Ã ºÙ´Â ¼Ó¼º unsigned short m_usRuneSocket[EquipmentInfo::MAX_RUNE_SOCKET_NUM]; // ·é ¼ÒÄÏ short m_wAttribute[Attribute::MAX_ATTRIBUTE_NUM]; // ÃÖÁ¾ÀûÀ¸·Î °è»êµÈ ¾ÆÀÌÅÛ ¼Ó¼º (½ºÅ©¸³Æ® + DB + ...) unsigned char m_cUpgradeLevel; // ¾÷±×·¹ÀÌµå ´Ü°è unsigned char m_cSocketNum; // ÇöÀç ¼ÒÄÏ °³¼ö unsigned char m_cMaxSocket; // ÃÖ´ë ¼ÒÄÏ °³¼ö unsigned char m_cMaxAttribute; // ÃÖ´ë ¼Ó¼º °³¼ö unsigned char m_cSeasonRecord; // ¾ÆÀÌÅÛ »ý¼º ½Ã±â Grade::GradeInfo m_GradeInfo; // ±×·¹À̵å Á¤º¸ unsigned char m_cUpgradeCnt; friend class CItemFactory; friend class CItemType; }; class CUseItem : public CItem { public: inline static CUseItem* DowncastToUseItem(CItem* lpItem); // ------------------------------------------------------------------------------------------------------------ // ¼­¹ö¿¡¼­¸¸ »ç¿ëµÇ´Â ÇÔ¼öµé - ItemServerFunc.cpp ¿¡¼­ º°µµ ±¸Çö bool Use(CCharacter* lpSender, CCharacter* lpRecver, unsigned short& wError); protected: CUseItem(const ItemInfo& itemInfo); virtual ~CUseItem(); bool UsePotion(CCharacter* lpSender, CCharacter* lpRecver); friend class CItemFactory; }; }; inline void Item::CItem::MoveItem(ItemPos itemPos) { if (TakeType::TS_STALL == itemPos.m_cPos) { m_itemPos_Real = itemPos; } else { m_ItemData.m_ItemPos = itemPos; if (TakeType::TS_TEMP != itemPos.m_cPos) { m_itemPos_Real = itemPos; } } } inline Item::CEquipment* Item::CEquipment::DowncastToEquipment(Item::CItem* lpItem) { if (NULL == lpItem) { return NULL; } return lpItem->IsSet(DetailData::EQUIP) ? static_cast(lpItem) : NULL; } inline void Item::CEquipment::AddAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue) { /* // ·é¾ÆÀÌÅÛ¿¡ ¼Ó¼º Ãß°¡ if (eAttributeType == Attribute::RUNE && 0 != nAttributeValue) { unsigned short usRuneID = nAttributeValue + EtcItemID::RUNE_START_ID; const ItemInfo* lpRuneInfo = CItemMgr::GetInstance().GetItemInfo(usRuneID); if (NULL != lpRuneInfo) { for (unsigned char cIndex = 0; cIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ++cIndex) { if (0 != m_usRuneSocket[cIndex]) { m_usRuneSocket[cIndex] = usRuneID; for (int nIndex = 0; nIndex < Item::Attribute::MAX_ATTRIBUTE_NUM; ++nIndex) { if (Item::EquipType::S_GRADE != GetItemGrade().m_aryAttributeGrade[nIndex]) { m_wAttribute[nIndex] += lpRuneInfo->m_EquipAttribute.m_usAttributeValue[nIndex]; } } return; } } } } else */ { if (Item::EquipType::S_GRADE != GetItemGrade().m_aryAttributeGrade[eAttributeType]) { m_wAttribute[eAttributeType] += nAttributeValue; } } } inline void Item::CEquipment::SetAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue) { /* // ·é¾ÆÀÌÅÛ¿¡ ¼Ó¼º Ãß°¡ if (eAttributeType == Attribute::RUNE && 0 != nAttributeValue) { unsigned short usRuneID = nAttributeValue + EtcItemID::RUNE_START_ID; const ItemInfo* lpRuneInfo = CItemMgr::GetInstance().GetItemInfo(usRuneID); if (NULL != lpRuneInfo) { for (unsigned char cIndex = 0; cIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ++cIndex) { if (0 != m_usRuneSocket[cIndex]) { m_usRuneSocket[cIndex] = usRuneID; for (int nIndex = 0; nIndex < Item::Attribute::MAX_ATTRIBUTE_NUM; ++nIndex) { m_wAttribute[nIndex] = lpRuneInfo->m_EquipAttribute.m_usAttributeValue[nIndex]; } return; } } } } else */ { m_wAttribute[eAttributeType] = nAttributeValue; } } inline void Item::CEquipment::RemoveUpgradeAttribute(Item::Attribute::Type eAttributeType) { ItemAttribute* first = m_UpgradeAttribute; ItemAttribute* last = m_UpgradeAttribute + EquipmentInfo::MAX_UPGRADE_ATTRIBUTE; for (;first != last; ++first) { if(eAttributeType == static_cast(first->m_cType)) { first->m_usValue = 0; } } } inline void Item::CEquipment::RemoveGemAttribute(Item::Attribute::Type eAttributeType) { ItemAttribute* first = m_SocketAttribute; ItemAttribute* last = m_SocketAttribute + EquipmentInfo::MAX_UPGRADE_ATTRIBUTE; for (;first != last; ++first) { if(eAttributeType == static_cast(first->m_cType)) { first->m_usValue = 0; } } } inline bool Item::CEquipment::SubRuneAttribute(void) { // ·é ¾ÆÀÌÅÛ Á¦°Å for (unsigned char cRune = 0; cRune <= EquipmentInfo::MAX_RUNE_SOCKET_NUM; ++cRune) { if (m_usRuneSocket[cRune]) { unsigned short usItemId = m_usRuneSocket[cRune]; const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(usItemId); if (itemInfo) { for (unsigned char cIndex = 0; cIndex < Item::Attribute::MAX_ATTRIBUTE_NUM; ++cIndex) { m_wAttribute[cIndex] -= itemInfo->m_EquipAttribute.m_usAttributeValue[cIndex]; } } m_usRuneSocket[cRune] = 0; } } return true; } inline short Item::CEquipment::GetAttribute(Item::Attribute::Type eAttributeType) { return m_wAttribute[eAttributeType]; } inline void Item::CEquipment::GetAttribute(short* lpAttributeArray_Out, unsigned short nArraySize) { unsigned short nCopyNum = nArraySize < Item::Attribute::MAX_ATTRIBUTE_NUM ? nArraySize : Item::Attribute::MAX_ATTRIBUTE_NUM; for (int nIndex = 0; nIndex < nCopyNum; ++nIndex) { *(lpAttributeArray_Out + nIndex) = GetAttribute(static_cast(nIndex)); } } inline bool Item::CEquipment::AddSocket(unsigned char cSocket) { if (m_cSocketNum < m_cMaxSocket && 0 == m_cSocket[m_cSocketNum]) { m_cSocket[m_cSocketNum] = cSocket; ++m_cSocketNum; return true; } return false; } inline void Item::CEquipment::GetSocket(unsigned char* cSockets, unsigned char cArraySize) { unsigned short nCopyNum = cArraySize < Item::EquipmentInfo::MAX_SOCKET_NUM ? cArraySize : Item::EquipmentInfo::MAX_SOCKET_NUM; unsigned char* lpSocketPastEnd = m_cSocket + nCopyNum; std::copy(m_cSocket, lpSocketPastEnd , cSockets); } inline void Item::CEquipment::InitializeAttribute(void) { for (unsigned int nIndex = 0; nIndex < Item::Attribute::MAX_ATTRIBUTE_NUM; ++nIndex) { m_wAttribute[nIndex] = m_ItemInfo.m_EquipAttribute.m_usAttributeValue[nIndex]; } } inline void Item::CEquipment::InitializeGemAttribute(void) { std::fill_n(m_SocketAttribute, int(EquipmentInfo::MAX_SOCKET_ATTRIBUTE_NUM), ItemAttribute()); // ¼³Ä¡µÈ ¼ÒÄÏÀ» °¡Áö°í ¼Ó¼º°ú °ªÀ» ¼³Á¤ CItemType::SetInstallGemAttribute(this); } inline void Item::CEquipment::InitializeUpgradeAttribute(void) { std::fill_n(m_UpgradeAttribute, int(EquipmentInfo::MAX_UPGRADE_ATTRIBUTE), ItemAttribute()); // ¾ÆÀÌÅÛ ¾÷±×·¹ÀÌµå ´Ü°è°ªÀ» °¡Áö°í ¼Ó¼º°ú °ªÀ» ¼³Á¤ CItemType::SetUpgradeItemAttribute(this); } inline void Item::CEquipment::ApplyGemAttribute(ApplyType eApplyType) { ItemAttribute* first = m_SocketAttribute; ItemAttribute* last = m_SocketAttribute + EquipmentInfo::MAX_SOCKET_ATTRIBUTE_NUM; for (;first != last; ++first) { AddAttribute(static_cast(first->m_cType), first->m_usValue * eApplyType); } } inline unsigned char Item::CEquipment::GetMaxRuneSocket() { // ÀåÂø¾ÆÀÌÅÛ¿¡ ·é ¼ÒÄÏ °³¼ö üũ return Item::CItemMgr::GetInstance().GetMaxRuneSocket(static_cast(GetItemInfo().m_DetailData.m_cItemType)); } inline unsigned char Item::CEquipment::GetRuneEquipable() { // ÀåÂø¾ÆÀÌÅÛ¿¡ ·é ¼ÒÄÏ ºó°ø°£ üũ unsigned char cRuneSocketCnt = Item::CItemMgr::GetInstance().GetMaxRuneSocket(static_cast(GetItemInfo().m_DetailData.m_cItemType)); if (!cRuneSocketCnt) { return 0; } if (!m_usRuneSocket[0]) { return 1; } if (!m_usRuneSocket[1] && cRuneSocketCnt == EquipmentInfo::MAX_RUNE_SOCKET_NUM) { return 2; } return 0; } inline void Item::CEquipment::ApplyUpgradeAttribute(ApplyType eApplyType) { ItemAttribute* first = m_UpgradeAttribute; ItemAttribute* last = m_UpgradeAttribute + EquipmentInfo::MAX_UPGRADE_ATTRIBUTE; for (;first != last; ++first) { AddAttribute(static_cast(first->m_cType), first->m_usValue * eApplyType); } } inline void Item::CEquipment::ApplyRuneAttribute(ApplyType eApplyType) { // ·é¾ÆÀÌÅÛ¿¡ ¼Ó¼º Ãß°¡/»èÁ¦ for (unsigned char cIndex = 0; cIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ++cIndex) { if (m_usRuneSocket[cIndex]) { unsigned short usItemId = m_usRuneSocket[cIndex]; const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(usItemId); if (itemInfo) { for (unsigned char cAttribute = 0; cAttribute < Item::Attribute::MAX_ATTRIBUTE_NUM; ++cAttribute) { m_wAttribute[cAttribute] += itemInfo->m_EquipAttribute.m_usAttributeValue[cAttribute]*eApplyType; } } } } } inline void Item::CEquipment::GetSubRuneAttribute(short* psAttribute) { // ·é ¼Ó¼ºÀ» »èÁ¦ÇÑ ¾ÆÀÌÅÛ ¼Ó¼º º¹»çº»À» ³Ñ°ÜÁØ´Ù. memcpy(psAttribute, m_wAttribute, sizeof(m_wAttribute)); for (unsigned char cIndex = 0; cIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ++cIndex) { if (m_usRuneSocket[cIndex]) { const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(m_usRuneSocket[cIndex]); if (itemInfo) { for (unsigned char cAttribute = 0; cAttribute < Item::Attribute::MAX_ATTRIBUTE_NUM; ++cAttribute) { psAttribute[cAttribute] -= itemInfo->m_EquipAttribute.m_usAttributeValue[cAttribute]; } } } } } inline void Item::CEquipment::GetSubRuneAttribute(Item::Attribute::Type eAttributeType, short& sAttribute) { sAttribute = m_wAttribute[eAttributeType]; for (unsigned char cIndex = 0; cIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ++cIndex) { if (m_usRuneSocket[cIndex]) { const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(m_usRuneSocket[cIndex]); if (itemInfo) { sAttribute -= itemInfo->m_EquipAttribute.m_usAttributeValue[eAttributeType]; } } } } inline void Item::CEquipment::SetRuneAttribute(RuneApplyType enRuneApplyType, unsigned char ucIndex) { // ¿ÜºÎ¿¡¼­ »ç¿ëÇÒ ·é ¼Ó¼º »èÁ¦/Ãß°¡. if (enRuneApplyType&RuneApplyType::RUNE_INDEX && enRuneApplyType&RuneApplyType::RUNE_REMOVE) { for (unsigned char ucRuneIndex = 0; ucRuneIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ucRuneIndex++) { if (m_usRuneSocket[ucRuneIndex]) { const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(m_usRuneSocket[ucRuneIndex]); if (itemInfo) { m_wAttribute[ucIndex] -= itemInfo->m_EquipAttribute.m_usAttributeValue[ucIndex]; } } } } else if (enRuneApplyType&RuneApplyType::RUNE_ALL && enRuneApplyType&RuneApplyType::RUNE_REMOVE) { ApplyRuneAttribute(REMOVE); } else if (enRuneApplyType&RuneApplyType::RUNE_INDEX && enRuneApplyType&RuneApplyType::RUNE_APPLY) { for (unsigned char ucRuneIndex = 0; ucRuneIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ucRuneIndex++) { if (m_usRuneSocket[ucRuneIndex]) { const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(m_usRuneSocket[ucRuneIndex]); if (itemInfo) { m_wAttribute[ucIndex] += itemInfo->m_EquipAttribute.m_usAttributeValue[ucIndex]; } } } } else if (enRuneApplyType&RuneApplyType::RUNE_ALL && enRuneApplyType&RuneApplyType::RUNE_APPLY) { ApplyRuneAttribute(APPLY); } } inline unsigned short Item::CEquipment::GetRuneEquipLimitLevel(void) const { // ÀåÂø ¾ÆÀÌÅÛ¿¡ ÀåÂøÁ¦ÇÑ¿¡ ·¹º§À» ¾ò¾î¿Â´Ù. unsigned short usResult = 0; for (unsigned char cIndex = 0; cIndex < EquipmentInfo::MAX_RUNE_SOCKET_NUM; ++cIndex) { if (m_usRuneSocket[cIndex]) { unsigned short usItemId = m_usRuneSocket[cIndex]; const ItemInfo* itemInfo = CItemMgr::GetInstance().GetItemInfo(usItemId); if (itemInfo) { if (itemInfo->m_UseLimit.m_cLimitStatus==Item::StatusLimit::LEVEL) { if (usResultm_UseLimit.m_wLimitValue) { usResult = itemInfo->m_UseLimit.m_wLimitValue; } } } } } return usResult; } inline Item::CUseItem* Item::CUseItem::DowncastToUseItem(CItem* lpItem) { if (NULL == lpItem) { return NULL; } return lpItem->IsSet(DetailData::USE_ITEM) ? static_cast(lpItem) : NULL; } inline bool Item::CItem::GetEnableRepair(void) { unsigned long dwFlags = GetItemInfo().m_DetailData.m_dwFlags; return ((dwFlags & Item::DetailData::EQUIP) && !(dwFlags & Item::DetailData::STACKABLE)); } inline bool Item::CItem::GetEnableStack(void) { return (GetItemInfo().m_DetailData.m_dwFlags & Item::DetailData::STACKABLE) ? true : false; } inline bool Item::CItem::GetEnableEquip(void) { return (GetItemInfo().m_DetailData.m_dwFlags & Item::DetailData::EQUIP); } inline bool Item::CItem::GetSocketItem(void) { return (GetItemInfo().m_DetailData.m_cItemType == Item::ItemType::GEM); } inline bool Item::CItem::GetRuneItem(void) { return (GetItemInfo().m_DetailData.m_cItemType == Item::ItemType::RUNE); } inline bool Item::CItem::GetTwohandItem(void) { unsigned char cItemType = GetItemInfo().m_DetailData.m_cItemType; return (cItemType == Item::ItemType::BOW || cItemType == Item::ItemType::CROSSBOW || cItemType == Item::ItemType::STAFF || cItemType == Item::ItemType::TWOHANDED_AXE || cItemType == Item::ItemType::TWOHANDED_BLUNT || cItemType == Item::ItemType::TWOHANDED_SWORD || cItemType == Item::ItemType::OPP_SYTHE); } // ------------------------------------------------------------------------------------------------------------ // ConvertTool¿¡¼­¸¸ »ç¿ëµÇ´Â ÇÔ¼öµé - RebalanceOverItem.cpp ¿¡¼­ »ç¿ë inline void Item::CEquipment::Repair() { SetNumOrDurability(GetMaxNumOrDurability()); CalculateItemPrice(); } inline void Item::CEquipment::InitEquip() { // ¿É¼Ç À̽ÄÀ» ÇϱâÀü¿¡ ·é Ãß°¡ ¿É¼ÇÀ» »èÁ¦ÇÑ´Ù. RuneApplyType enRuneApplyType = static_cast(RUNE_ALL | RUNE_REMOVE); SetRuneAttribute(enRuneApplyType, 0); // Á¦·Ã ´Ü°è´Â ÃʱâÈ­µÈ´Ù. (¿É¼ÇÀº ³²´Â´Ù.) m_cUpgradeLevel = 0; InitializeUpgradeAttribute(); // ¼ÒÄϵµ ÃʱâÈ­µÈ´Ù. (º¸¼®Àº ¸ðµÎ Á¦°ÅµÇÁö¸¸ ¿É¼ÇÀº ³²´Â´Ù.) m_cSocketNum = 0; std::fill_n(m_cSocket, unsigned char(Item::EquipmentInfo::MAX_SOCKET_NUM), 0); InitializeGemAttribute(); m_cMaxSocket = m_ItemInfo.m_DetailData.m_cMaxSocketNum; } inline void Item::CEquipment::SetEquip() { // ·é ¼Ó¼ºÀ» ´Ù½Ã Ãß°¡ÇÑ´Ù. RuneApplyType enRuneApplyType = static_cast(RUNE_ALL | RUNE_APPLY); SetRuneAttribute(enRuneApplyType, 0); } #endif