1. #ifndef __INC_METIN_II_GAME_ITEM_H__
  2. #define __INC_METIN_II_GAME_ITEM_H__
  3. #include "entity.h"
  4. class CItem : public CEntity
  5. {
  6. protected:
  7. // override methods from ENTITY class
  8. virtual void EncodeInsertPacket(LPENTITY entity);
  9. virtual void EncodeRemovePacket(LPENTITY entity);
  10. public:
  11. CItem(DWORD dwVnum);
  12. virtual ~CItem();
  13. int GetLevelLimit();
  14. bool CheckItemUseLevel(int nLevel);
  15. bool IsPCBangItem();
  16. long FindApplyValue(BYTE bApplyType);
  17. bool IsStackable() { return (GetFlag() & ITEM_FLAG_STACKABLE)?true:false; }
  18. void Initialize();
  19. void Destroy();
  20. void Save();
  21. void SetWindow(BYTE b) { m_bWindow = b; }
  22. BYTE GetWindow() { return m_bWindow; }
  23. void SetID(DWORD id) { m_dwID = id; }
  24. DWORD GetID() { return m_dwID; }
  25. void SetProto(const TItemTable * table);
  26. TItemTable const * GetProto() { return m_pProto; }
  27. int GetGold();
  28. int GetShopBuyPrice();
  29. const char * GetName() { return m_pProto ? m_pProto->szLocaleName : NULL; }
  30. const char * GetBaseName() { return m_pProto ? m_pProto->szName : NULL; }
  31. BYTE GetSize() { return m_pProto ? m_pProto->bSize : 0; }
  32. void SetFlag(long flag) { m_lFlag = flag; }
  33. long GetFlag() { return m_lFlag; }
  34. void AddFlag(long bit);
  35. void RemoveFlag(long bit);
  36. DWORD GetWearFlag() { return m_pProto ? m_pProto->dwWearFlags : 0; }
  37. DWORD GetAntiFlag() { return m_pProto ? m_pProto->dwAntiFlags : 0; }
  38. DWORD GetImmuneFlag() { return m_pProto ? m_pProto->dwImmuneFlag : 0; }
  39. void SetVID(DWORD vid) { m_dwVID = vid; }
  40. DWORD GetVID() { return m_dwVID; }
  41. bool SetCount(DWORD count);
  42. DWORD GetCount();
  43. // GetVnum°ú GetOriginalVnum¿¡ ´ëÇÑ comment
  44. // GetVnumÀº Masking µÈ VnumÀÌ´Ù. À̸¦ »ç¿ëÇÔÀ¸·Î½á, ¾ÆÀÌÅÛÀÇ ½ÇÁ¦ VnumÀº 10ÀÌÁö¸¸, VnumÀÌ 20ÀÎ °Íó·³ µ¿ÀÛÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù.
  45. // Masking °ªÀº ori_to_new.txt¿¡¼­ Á¤ÀÇµÈ °ªÀÌ´Ù.
  46. // GetOriginalVnumÀº ¾ÆÀÌÅÛ °íÀ¯ÀÇ VnumÀ¸·Î, ·Î±× ³²±æ ¶§, Ŭ¶óÀÌ¾ğÆ®¿¡ ¾ÆÀÌÅÛ Á¤º¸ º¸³¾ ¶§, ÀúÀåÇÒ ¶§´Â ÀÌ VnumÀ» »ç¿ëÇÏ¿©¾ß ÇÑ´Ù.
  47. //
  48. DWORD GetVnum() const { return m_dwMaskVnum ? m_dwMaskVnum : m_dwVnum; }
  49. DWORD GetOriginalVnum() const { return m_dwVnum; }
  50. BYTE GetType() const { return m_pProto ? m_pProto->bType : 0; }
  51. BYTE GetSubType() const { return m_pProto ? m_pProto->bSubType : 0; }
  52. BYTE GetLimitType(DWORD idx) const { return m_pProto ? m_pProto->aLimits[idx].bType : 0; }
  53. long GetLimitValue(DWORD idx) const { return m_pProto ? m_pProto->aLimits[idx].lValue : 0; }
  54. DWORD GetRealImmuneFlag();
  55. long GetValue(DWORD idx);
  56. void SetCell(LPCHARACTER ch, WORD pos) { m_pOwner = ch, m_wCell = pos; }
  57. WORD GetCell() { return m_wCell; }
  58. LPITEM RemoveFromCharacter();
  59. bool AddToCharacter(LPCHARACTER ch, TItemPos Cell);
  60. LPCHARACTER GetOwner() { return m_pOwner; }
  61. LPITEM RemoveFromGround();
  62. bool AddToGround(long lMapIndex, const PIXEL_POSITION & pos, bool skipOwnerCheck = false);
  63. int FindEquipCell(LPCHARACTER ch, int bCandidateCell = -1);
  64. bool IsEquipped() const { return m_bEquipped; }
  65. bool EquipTo(LPCHARACTER ch, BYTE bWearCell);
  66. bool IsEquipable() const;
  67. bool CanUsedBy(LPCHARACTER ch);
  68. bool DistanceValid(LPCHARACTER ch);
  69. void UpdatePacket();
  70. void UsePacketEncode(LPCHARACTER ch, LPCHARACTER victim, struct packet_item_use * packet);
  71. void SetExchanging(bool isOn = true);
  72. bool IsExchanging() { return m_bExchanging; }
  73. bool IsTwohanded();
  74. bool IsPolymorphItem();
  75. void ModifyPoints(bool bAdd); // ¾ÆÀÌÅÛÀÇ È¿°ú¸¦ ij¸¯ÅÍ¿¡ ºÎ¿© ÇÑ´Ù. bAdd°¡ falseÀ̸é Á¦°ÅÇÔ
  76. bool CreateSocket(BYTE bSlot, BYTE bGold);
  77. const long * GetSockets() { return &m_alSockets[0]; }
  78. long GetSocket(int i) { return m_alSockets[i]; }
  79. void SetSockets(const long * al);
  80. void SetSocket(int i, long v, bool bLog = true);
  81. int GetSocketCount();
  82. bool AddSocket();
  83. const TPlayerItemAttribute* GetAttributes() { return m_aAttr; }
  84. const TPlayerItemAttribute& GetAttribute(int i) { return m_aAttr[i]; }
  85. BYTE GetAttributeType(int i) { return m_aAttr[i].bType; }
  86. short GetAttributeValue(int i){ return m_aAttr[i].sValue; }
  87. void SetAttributes(const TPlayerItemAttribute* c_pAttribute);
  88. int FindAttribute(BYTE bType);
  89. bool RemoveAttributeAt(int index);
  90. bool RemoveAttributeType(BYTE bType);
  91. bool HasAttr(BYTE bApply);
  92. bool HasRareAttr(BYTE bApply);
  93. void SetDestroyEvent(LPEVENT pkEvent);
  94. void StartDestroyEvent(int iSec=300);
  95. DWORD GetRefinedVnum() { return m_pProto ? m_pProto->dwRefinedVnum : 0; }
  96. DWORD GetRefineFromVnum();
  97. int GetRefineLevel();
  98. void SetSkipSave(bool b) { m_bSkipSave = b; }
  99. bool GetSkipSave() { return m_bSkipSave; }
  100. bool IsOwnership(LPCHARACTER ch);
  101. void SetOwnership(LPCHARACTER ch, int iSec = 10);
  102. void SetOwnershipEvent(LPEVENT pkEvent);
  103. DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; }
  104. int GetAttributeSetIndex(); // ¼Ó¼º ºÙ´Â°ÍÀ» ÁöÁ¤ÇÑ ¹è¿­ÀÇ ¾î´À À妽º¸¦ »ç¿ëÇÏ´ÂÁö µ¹·ÁÁØ´Ù.
  105. void AlterToMagicItem();
  106. void AlterToSocketItem(int iSocketCount);
  107. WORD GetRefineSet() { return m_pProto ? m_pProto->wRefineSet : 0; }
  108. void StartUniqueExpireEvent();
  109. void SetUniqueExpireEvent(LPEVENT pkEvent);
  110. void StartTimerBasedOnWearExpireEvent();
  111. void SetTimerBasedOnWearExpireEvent(LPEVENT pkEvent);
  112. void StartRealTimeExpireEvent();
  113. bool IsRealTimeItem();
  114. void StopUniqueExpireEvent();
  115. void StopTimerBasedOnWearExpireEvent();
  116. void StopAccessorySocketExpireEvent();
  117. // ÀÏ´Ü REAL_TIME°ú TIMER_BASED_ON_WEAR ¾ÆÀÌÅÛ¿¡ ´ëÇØ¼­¸¸ Á¦´ë·Î µ¿ÀÛÇÔ.
  118. int GetDuration();
  119. int GetAttributeCount();
  120. void ClearAttribute();
  121. void ChangeAttribute(const int* aiChangeProb=NULL);
  122. void AddAttribute();
  123. void AddAttribute(BYTE bType, short sValue);
  124. void ApplyAddon(int iAddonType);
  125. int GetSpecialGroup() const;
  126. bool IsSameSpecialGroup(const LPITEM item) const;
  127. // ACCESSORY_REFINE
  128. // ¾×¼¼¼­¸®¿¡ ±¤»êÀ» ÅëÇØ ¼ÒÄÏÀ» Ãß°¡
  129. bool IsAccessoryForSocket();
  130. int GetAccessorySocketGrade();
  131. int GetAccessorySocketMaxGrade();
  132. int GetAccessorySocketDownGradeTime();
  133. void SetAccessorySocketGrade(int iGrade);
  134. void SetAccessorySocketMaxGrade(int iMaxGrade);
  135. void SetAccessorySocketDownGradeTime(DWORD time);
  136. void AccessorySocketDegrade();
  137. // ¾Ç¼¼»ç¸® ¸¦ ¾ÆÀÌÅÛ¿¡ ¹Û¾ÒÀ»¶§ ŸÀÌ¸Ó µ¹¾Æ°¡´Â°Í( ±¸¸®, µî )
  138. void StartAccessorySocketExpireEvent();
  139. void SetAccessorySocketExpireEvent(LPEVENT pkEvent);
  140. bool CanPutInto(LPITEM item);
  141. // END_OF_ACCESSORY_REFINE
  142. void CopyAttributeTo(LPITEM pItem);
  143. void CopySocketTo(LPITEM pItem);
  144. int GetRareAttrCount();
  145. bool AddRareAttribute();
  146. bool ChangeRareAttribute();
  147. void AttrLog();
  148. void Lock(bool f) { m_isLocked = f; }
  149. bool isLocked() const { return m_isLocked; }
  150. private :
  151. void SetAttribute(int i, BYTE bType, short sValue);
  152. public:
  153. void SetForceAttribute(int i, BYTE bType, short sValue);
  154. protected:
  155. bool EquipEx(bool is_equip);
  156. bool Unequip();
  157. void AddAttr(BYTE bApply, BYTE bLevel);
  158. void PutAttribute(const int * aiAttrPercentTable);
  159. void PutAttributeWithLevel(BYTE bLevel);
  160. protected:
  161. friend class CInputDB;
  162. bool OnAfterCreatedItem(); // ¼­¹ö»ó¿¡ ¾ÆÀÌÅÛÀÌ ¸ğµç Á¤º¸¿Í ÇÔ²² ¿ÏÀüÈ÷ »ı¼º(·Îµå)µÈ ÈÄ ºÒ¸®¿ì´Â ÇÔ¼ö.
  163. public:
  164. bool IsRideItem();
  165. bool IsRamadanRing();
  166. void ClearMountAttributeAndAffect();
  167. bool IsNewMountItem();
  168. // µ¶ÀÏ¿¡¼­ ±âÁ¸ ij½Ã ¾ÆÀÌÅÛ°ú °°Áö¸¸, ±³È¯ °¡´ÉÇÑ Ä³½Ã ¾ÆÀÌÅÛÀ» ¸¸µç´Ù°í ÇÏ¿©,
  169. // ¿À¸®Áö³Î ¾ÆÀÌÅÛ¿¡, ±³È¯ ±İÁö Ç÷¡±×¸¸ »èÁ¦ÇÑ »õ·Î¿î ¾ÆÀÌÅÛµéÀ» »õ·Î¿î ¾ÆÀÌÅÛ ´ë¿ª¿¡ ÇÒ´çÇÏ¿´´Ù.
  170. // ¹®Á¦´Â »õ·Î¿î ¾ÆÀÌÅÛµµ ¿À¸®Áö³Î ¾ÆÀÌÅÛ°ú °°Àº È¿°ú¸¦ ³»¾ßÇϴµ¥,
  171. // ¼­¹ö°Ç, Ŭ¶ó°Ç, vnum ±â¹İÀ¸·Î µÇ¾îÀÖ¾î
  172. // »õ·Î¿î vnumÀ» ÁË´Ù ¼­¹ö¿¡ »õ·Î ´Ù ¹Ú¾Æ¾ßÇÏ´Â ¾ÈŸ±î¿î »óȲ¿¡ ¸Â´ê¾Ò´Ù.
  173. // ±×·¡¼­ »õ vnumÀÇ ¾ÆÀÌÅÛÀ̸é, ¼­¹ö¿¡¼­ µ¹¾Æ°¥ ¶§´Â ¿À¸®Áö³Î ¾ÆÀÌÅÛ vnumÀ¸·Î ¹Ù²ã¼­ µ¹°í Çϰí,
  174. // ÀúÀåÇÒ ¶§¿¡ º»·¡ vnumÀ¸·Î ¹Ù²ãÁÖµµ·Ï ÇÑ´Ù.
  175. // Mask vnumÀº ¾î¶² ÀÌÀ¯(ex. À§ÀÇ »óȲ)·Î ÀÎÇØ vnumÀÌ ¹Ù²î¾î µ¹¾Æ°¡´Â ¾ÆÀÌÅÛÀ» À§ÇØ ÀÖ´Ù.
  176. void SetMaskVnum(DWORD vnum) { m_dwMaskVnum = vnum; }
  177. DWORD GetMaskVnum() { return m_dwMaskVnum; }
  178. bool IsMaskedItem() { return m_dwMaskVnum != 0; }
  179. // ¿ëÈ¥¼®
  180. bool IsDragonSoul();
  181. int GiveMoreTime_Per(float fPercent);
  182. int GiveMoreTime_Fix(DWORD dwTime);
  183. private:
  184. TItemTable const * m_pProto; // ÇÁ·ÎÅä ŸÀÙ
  185. DWORD m_dwVnum;
  186. LPCHARACTER m_pOwner;
  187. BYTE m_bWindow; // ÇöÀç ¾ÆÀÌÅÛÀÌ À§Ä¡ÇÑ À©µµ¿ì
  188. DWORD m_dwID; // °íÀ¯¹øÈ£
  189. bool m_bEquipped; // ÀåÂø µÇ¾ú´Â°¡?
  190. DWORD m_dwVID; // VID
  191. WORD m_wCell; // À§Ä¡
  192. DWORD m_dwCount; // °³¼ö
  193. long m_lFlag; // Ãß°¡ flag
  194. DWORD m_dwLastOwnerPID; // ¸¶Áö¸· °¡Áö°í ÀÖ¾ú´ø »ç¶÷ÀÇ PID
  195. bool m_bExchanging; ///< ÇöÀç ±³È¯Áß »óÅÂ
  196. long m_alSockets[ITEM_SOCKET_MAX_NUM]; // ¾ÆÀÌÅÛ ¼ÒĹ
  197. TPlayerItemAttribute m_aAttr[ITEM_ATTRIBUTE_MAX_NUM];
  198. LPEVENT m_pkDestroyEvent;
  199. LPEVENT m_pkExpireEvent;
  200. LPEVENT m_pkUniqueExpireEvent;
  201. LPEVENT m_pkTimerBasedOnWearExpireEvent;
  202. LPEVENT m_pkRealTimeExpireEvent;
  203. LPEVENT m_pkAccessorySocketExpireEvent;
  204. LPEVENT m_pkOwnershipEvent;
  205. DWORD m_dwOwnershipPID;
  206. bool m_bSkipSave;
  207. bool m_isLocked;
  208. DWORD m_dwMaskVnum;
  209. DWORD m_dwSIGVnum;
  210. public:
  211. void SetSIGVnum(DWORD dwSIG)
  212. {
  213. m_dwSIGVnum = dwSIG;
  214. }
  215. DWORD GetSIGVnum() const
  216. {
  217. return m_dwSIGVnum;
  218. }
  219. };
  220. EVENTINFO(item_event_info)
  221. {
  222. LPITEM item;
  223. char szOwnerName[CHARACTER_NAME_MAX_LEN];
  224. item_event_info()
  225. : item( 0 )
  226. {
  227. ::memset( szOwnerName, 0, CHARACTER_NAME_MAX_LEN );
  228. }
  229. };
  230. EVENTINFO(item_vid_event_info)
  231. {
  232. DWORD item_vid;
  233. item_vid_event_info()
  234. : item_vid( 0 )
  235. {
  236. }
  237. };
  238. #endif

ITEM.H