Advertisement
Guest User

item.h

a guest
Dec 31st, 2014
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.34 KB | None | 0 0
  1. #ifndef __INC_METIN_II_GAME_ITEM_H__
  2. #define __INC_METIN_II_GAME_ITEM_H__
  3.  
  4. #include "entity.h"
  5.  
  6. class CItem : public CEntity
  7. {
  8. protected:
  9. // override methods from ENTITY class
  10. virtual void EncodeInsertPacket(LPENTITY entity);
  11. virtual void EncodeRemovePacket(LPENTITY entity);
  12.  
  13. public:
  14. CItem(DWORD dwVnum);
  15. virtual ~CItem();
  16.  
  17. int GetLevelLimit();
  18.  
  19. bool CheckItemUseLevel(int nLevel);
  20.  
  21. bool IsPCBangItem();
  22.  
  23. long FindApplyValue(BYTE bApplyType);
  24.  
  25. bool IsStackable() { return (GetFlag() & ITEM_FLAG_STACKABLE)?true:false; }
  26.  
  27. void Initialize();
  28. void Destroy();
  29.  
  30. void Save();
  31.  
  32. void SetWindow(BYTE b) { m_bWindow = b; }
  33. BYTE GetWindow() { return m_bWindow; }
  34.  
  35. void SetID(DWORD id) { m_dwID = id; }
  36. DWORD GetID() { return m_dwID; }
  37.  
  38. void SetProto(const TItemTable * table);
  39. TItemTable const * GetProto() { return m_pProto; }
  40.  
  41. int GetGold();
  42. int GetShopBuyPrice();
  43. const char * GetName() { return m_pProto ? m_pProto->szLocaleName : NULL; }
  44. const char * GetBaseName() { return m_pProto ? m_pProto->szName : NULL; }
  45. BYTE GetSize() { return m_pProto ? m_pProto->bSize : 0; }
  46.  
  47. void SetFlag(long flag) { m_lFlag = flag; }
  48. long GetFlag() { return m_lFlag; }
  49.  
  50. void AddFlag(long bit);
  51. void RemoveFlag(long bit);
  52.  
  53. DWORD GetWearFlag() { return m_pProto ? m_pProto->dwWearFlags : 0; }
  54. DWORD GetAntiFlag() { return m_pProto ? m_pProto->dwAntiFlags : 0; }
  55. DWORD GetImmuneFlag() { return m_pProto ? m_pProto->dwImmuneFlag : 0; }
  56.  
  57. void SetVID(DWORD vid) { m_dwVID = vid; }
  58. DWORD GetVID() { return m_dwVID; }
  59.  
  60. bool SetCount(DWORD count);
  61. DWORD GetCount();
  62.  
  63. // GetVnum과 GetOriginalVnum에 대한 comment
  64. // GetVnum은 Masking 된 Vnum이다. 이를 사용함으로써, 아이템의 실제 Vnum은 10이지만, Vnum이 20인 것처럼 동작할 수 있는 것이다.
  65. // Masking 값은 ori_to_new.txt에서 정의된 값이다.
  66. // GetOriginalVnum은 아이템 고유의 Vnum으로, 로그 남길 때, 클라이언트에 아이템 정보 보낼 때, 저장할 때는 이 Vnum을 사용하여야 한다.
  67. //
  68. DWORD GetVnum() const { return m_dwMaskVnum ? m_dwMaskVnum : m_dwVnum; }
  69. DWORD GetOriginalVnum() const { return m_dwVnum; }
  70. BYTE GetType() const { return m_pProto ? m_pProto->bType : 0; }
  71. BYTE GetSubType() const { return m_pProto ? m_pProto->bSubType : 0; }
  72. BYTE GetLimitType(DWORD idx) const { return m_pProto ? m_pProto->aLimits[idx].bType : 0; }
  73. long GetLimitValue(DWORD idx) const { return m_pProto ? m_pProto->aLimits[idx].lValue : 0; }
  74.  
  75. DWORD GetRealImmuneFlag();
  76.  
  77. long GetValue(DWORD idx);
  78.  
  79. void SetCell(LPCHARACTER ch, WORD pos) { m_pOwner = ch, m_wCell = pos; }
  80. WORD GetCell() { return m_wCell; }
  81.  
  82. LPITEM RemoveFromCharacter();
  83. bool AddToCharacter(LPCHARACTER ch, TItemPos Cell);
  84. LPCHARACTER GetOwner() { return m_pOwner; }
  85.  
  86. LPITEM RemoveFromGround();
  87. bool AddToGround(long lMapIndex, const PIXEL_POSITION & pos, bool skipOwnerCheck = false);
  88.  
  89. int FindEquipCell(LPCHARACTER ch, int bCandidateCell = -1);
  90. bool IsEquipped() const { return m_bEquipped; }
  91. bool EquipTo(LPCHARACTER ch, BYTE bWearCell);
  92. bool IsEquipable() const;
  93.  
  94. bool CanUsedBy(LPCHARACTER ch);
  95.  
  96. bool DistanceValid(LPCHARACTER ch);
  97.  
  98. void UpdatePacket();
  99. void UsePacketEncode(LPCHARACTER ch, LPCHARACTER victim, struct packet_item_use * packet);
  100.  
  101. void SetExchanging(bool isOn = true);
  102. bool IsExchanging() { return m_bExchanging; }
  103.  
  104. bool IsTwohanded();
  105.  
  106. bool IsPolymorphItem();
  107.  
  108. void ModifyPoints(bool bAdd); // 아이템의 효과를 캐릭터에 부여 한다. bAdd가 false이면 제거함
  109.  
  110. bool CreateSocket(BYTE bSlot, BYTE bGold);
  111. const long * GetSockets() { return &m_alSockets[0]; }
  112. long GetSocket(int i) { return m_alSockets[i]; }
  113.  
  114. void SetSockets(const long * al);
  115. void SetSocket(int i, long v, bool bLog = true);
  116.  
  117. int GetSocketCount();
  118. bool AddSocket();
  119.  
  120. const TPlayerItemAttribute* GetAttributes() { return m_aAttr; }
  121. const TPlayerItemAttribute& GetAttribute(int i) { return m_aAttr[i]; }
  122.  
  123. BYTE GetAttributeType(int i) { return m_aAttr[i].bType; }
  124. short GetAttributeValue(int i){ return m_aAttr[i].sValue; }
  125.  
  126. void SetAttributes(const TPlayerItemAttribute* c_pAttribute);
  127.  
  128. int FindAttribute(BYTE bType);
  129. bool RemoveAttributeAt(int index);
  130. bool RemoveAttributeType(BYTE bType);
  131.  
  132. bool HasAttr(BYTE bApply);
  133. bool HasRareAttr(BYTE bApply);
  134.  
  135. void SetDestroyEvent(LPEVENT pkEvent);
  136. void StartDestroyEvent(int iSec=300);
  137.  
  138. DWORD GetRefinedVnum() { return m_pProto ? m_pProto->dwRefinedVnum : 0; }
  139. DWORD GetRefineFromVnum();
  140. int GetRefineLevel();
  141.  
  142. void SetSkipSave(bool b) { m_bSkipSave = b; }
  143. bool GetSkipSave() { return m_bSkipSave; }
  144.  
  145. bool IsOwnership(LPCHARACTER ch);
  146. void SetOwnership(LPCHARACTER ch, int iSec = 10);
  147. void SetOwnershipEvent(LPEVENT pkEvent);
  148.  
  149. DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; }
  150.  
  151. int GetAttributeSetIndex(); // 속성 붙는것을 지정한 배열의 어느 인덱스를 사용하는지 돌려준다.
  152. void AlterToMagicItem();
  153. void AlterToSocketItem(int iSocketCount);
  154.  
  155. WORD GetRefineSet() { return m_pProto ? m_pProto->wRefineSet : 0; }
  156.  
  157. void StartUniqueExpireEvent();
  158. void SetUniqueExpireEvent(LPEVENT pkEvent);
  159.  
  160. void StartTimerBasedOnWearExpireEvent();
  161. void SetTimerBasedOnWearExpireEvent(LPEVENT pkEvent);
  162.  
  163. void StartRealTimeExpireEvent();
  164. bool IsRealTimeItem();
  165.  
  166. void StopUniqueExpireEvent();
  167. void StopTimerBasedOnWearExpireEvent();
  168. void StopAccessorySocketExpireEvent();
  169.  
  170. // 일단 REAL_TIME과 TIMER_BASED_ON_WEAR 아이템에 대해서만 제대로 동작함.
  171. int GetDuration();
  172.  
  173. int GetAttributeCount();
  174. void ClearAttribute();
  175. void ChangeAttribute(const int* aiChangeProb=NULL);
  176. void AddAttribute();
  177. void AddAttribute(BYTE bType, short sValue);
  178.  
  179. void ApplyAddon(int iAddonType);
  180.  
  181. int GetSpecialGroup() const;
  182. bool IsSameSpecialGroup(const LPITEM item) const;
  183.  
  184. // ACCESSORY_REFINE
  185. // 액세서리에 광산을 통해 소켓을 추가
  186. bool IsAccessoryForSocket();
  187.  
  188. int GetAccessorySocketGrade();
  189. int GetAccessorySocketMaxGrade();
  190. int GetAccessorySocketDownGradeTime();
  191.  
  192. void SetAccessorySocketGrade(int iGrade);
  193. void SetAccessorySocketMaxGrade(int iMaxGrade);
  194. void SetAccessorySocketDownGradeTime(DWORD time);
  195.  
  196. void AccessorySocketDegrade();
  197.  
  198. // 악세사리 를 아이템에 밖았을때 타이머 돌아가는것( 구리, 등 )
  199. void StartAccessorySocketExpireEvent();
  200. void SetAccessorySocketExpireEvent(LPEVENT pkEvent);
  201.  
  202. bool CanPutInto(LPITEM item);
  203. // END_OF_ACCESSORY_REFINE
  204.  
  205. void CopyAttributeTo(LPITEM pItem);
  206. void CopySocketTo(LPITEM pItem);
  207.  
  208. int GetRareAttrCount();
  209. bool AddRareAttribute();
  210. bool ChangeRareAttribute();
  211.  
  212. void AttrLog();
  213.  
  214. void Lock(bool f) { m_isLocked = f; }
  215. bool isLocked() const { return m_isLocked; }
  216.  
  217. private :
  218. void SetAttribute(int i, BYTE bType, short sValue);
  219. public:
  220. void SetForceAttribute(int i, BYTE bType, short sValue);
  221.  
  222. protected:
  223. bool EquipEx(bool is_equip);
  224. bool Unequip();
  225.  
  226. void AddAttr(BYTE bApply, BYTE bLevel);
  227. void PutAttribute(const int * aiAttrPercentTable);
  228. void PutAttributeWithLevel(BYTE bLevel);
  229.  
  230. protected:
  231. friend class CInputDB;
  232. bool OnAfterCreatedItem(); // 서버상에 아이템이 모든 정보와 함께 완전히 생성(로드)된 후 불리우는 함수.
  233.  
  234. public:
  235. bool IsRideItem();
  236. bool IsRamadanRing();
  237.  
  238. void ClearMountAttributeAndAffect();
  239. bool IsNewMountItem();
  240.  
  241. #ifdef __AUCTION__
  242. // 경매장
  243. bool MoveToAuction ();
  244. void CopyToRawData (TPlayerItem* item);
  245. #endif
  246. // 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
  247. // 오리지널 아이템에, 교환 금지 플래그만 삭제한 새로운 아이템들을 새로운 아이템 대역에 할당하였다.
  248. // 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
  249. // 서버건, 클라건, vnum 기반으로 되어있어
  250. // 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
  251. // 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
  252. // 저장할 때에 본래 vnum으로 바꿔주도록 한다.
  253.  
  254. // Mask vnum은 어떤 이유(ex. 위의 상황)로 인해 vnum이 바뀌어 돌아가는 아이템을 위해 있다.
  255. void SetMaskVnum(DWORD vnum) { m_dwMaskVnum = vnum; }
  256. DWORD GetMaskVnum() { return m_dwMaskVnum; }
  257. bool IsMaskedItem() { return m_dwMaskVnum != 0; }
  258.  
  259. // 용혼석
  260. bool IsDragonSoul();
  261. int GiveMoreTime_Per(float fPercent);
  262. int GiveMoreTime_Fix(DWORD dwTime);
  263.  
  264. private:
  265. TItemTable const * m_pProto; // 프로토 타잎
  266.  
  267. DWORD m_dwVnum;
  268. LPCHARACTER m_pOwner;
  269.  
  270. BYTE m_bWindow; // 현재 아이템이 위치한 윈도우
  271. DWORD m_dwID; // 고유번호
  272. bool m_bEquipped; // 장착 되었는가?
  273. DWORD m_dwVID; // VID
  274. WORD m_wCell; // 위치
  275. DWORD m_dwCount; // 개수
  276. long m_lFlag; // 추가 flag
  277. DWORD m_dwLastOwnerPID; // 마지막 가지고 있었던 사람의 PID
  278.  
  279. bool m_bExchanging; ///< 현재 교환중 상태
  280.  
  281. long m_alSockets[ITEM_SOCKET_MAX_NUM]; // 아이템 소캣
  282. TPlayerItemAttribute m_aAttr[ITEM_ATTRIBUTE_MAX_NUM];
  283.  
  284. LPEVENT m_pkDestroyEvent;
  285. LPEVENT m_pkExpireEvent;
  286. LPEVENT m_pkUniqueExpireEvent;
  287. LPEVENT m_pkTimerBasedOnWearExpireEvent;
  288. LPEVENT m_pkRealTimeExpireEvent;
  289. LPEVENT m_pkAccessorySocketExpireEvent;
  290. LPEVENT m_pkOwnershipEvent;
  291.  
  292. DWORD m_dwOwnershipPID;
  293.  
  294. bool m_bSkipSave;
  295.  
  296. bool m_isLocked;
  297.  
  298. DWORD m_dwMaskVnum;
  299. DWORD m_dwSIGVnum;
  300. public:
  301. void SetSIGVnum(DWORD dwSIG)
  302. {
  303. m_dwSIGVnum = dwSIG;
  304. }
  305. DWORD GetSIGVnum() const
  306. {
  307. return m_dwSIGVnum;
  308. }
  309. };
  310.  
  311. EVENTINFO(item_event_info)
  312. {
  313. LPITEM item;
  314. char szOwnerName[CHARACTER_NAME_MAX_LEN];
  315.  
  316. item_event_info()
  317. : item( 0 )
  318. {
  319. ::memset( szOwnerName, 0, CHARACTER_NAME_MAX_LEN );
  320. }
  321. };
  322.  
  323. EVENTINFO(item_vid_event_info)
  324. {
  325. DWORD item_vid;
  326.  
  327. item_vid_event_info()
  328. : item_vid( 0 )
  329. {
  330. }
  331. };
  332.  
  333. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement