Guest User

item.h

a guest
Jul 30th, 2016
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.40 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.         long long       GetGold();
  42.         long long       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.         //28/03/14 - Sersemlik  Fix - Maxmi
  76.         DWORD       GetRealImmuneFlag();
  77.         //End fix immune bug
  78.  
  79.         long        GetValue(DWORD idx);
  80.  
  81.         void        SetCell(LPCHARACTER ch, WORD pos)   { m_pOwner = ch, m_wCell = pos; }
  82.         WORD        GetCell()               { return m_wCell;   }
  83.  
  84.         LPITEM      RemoveFromCharacter();
  85.         bool        AddToCharacter(LPCHARACTER ch, TItemPos Cell);
  86.         LPCHARACTER GetOwner()      { return m_pOwner; }
  87.  
  88.         LPITEM      RemoveFromGround();
  89.         bool        AddToGround(long lMapIndex, const PIXEL_POSITION & pos, bool skipOwnerCheck = false);
  90.  
  91.         int         FindEquipCell(LPCHARACTER ch, int bCandidateCell = -1);
  92.         bool        IsEquipped() const      { return m_bEquipped;   }
  93.         bool        EquipTo(LPCHARACTER ch, BYTE bWearCell);
  94.         bool        IsEquipable() const;
  95.  
  96.         bool        CanUsedBy(LPCHARACTER ch);
  97.  
  98.         bool        DistanceValid(LPCHARACTER ch);
  99.  
  100.         void        UpdatePacket();
  101.         void        UsePacketEncode(LPCHARACTER ch, LPCHARACTER victim, struct packet_item_use * packet);
  102.  
  103.         void        SetExchanging(bool isOn = true);
  104.         bool        IsExchanging()      { return m_bExchanging; }
  105.  
  106.         bool        IsTwohanded();
  107.  
  108.         bool        IsPolymorphItem();
  109.  
  110.         void        ModifyPoints(bool bAdd);    // 아이템의 효과를 캐릭터에 부여 한다. bAdd가 false이면 제거함
  111.  
  112.         bool        CreateSocket(BYTE bSlot, BYTE bGold);
  113.         const long *    GetSockets()        { return &m_alSockets[0];   }
  114.         long        GetSocket(int i)    { return m_alSockets[i];    }
  115.  
  116.         void        SetSockets(const long * al);
  117.         void        SetSocket(int i, long v, bool bLog = true);
  118.  
  119.         int     GetSocketCount();
  120.         bool        AddSocket();
  121.  
  122.         const TPlayerItemAttribute* GetAttributes()     { return m_aAttr;   }
  123.         const TPlayerItemAttribute& GetAttribute(int i) { return m_aAttr[i];    }
  124.  
  125.         BYTE        GetAttributeType(int i) { return m_aAttr[i].bType;  }
  126.         short       GetAttributeValue(int i){ return m_aAttr[i].sValue; }
  127.  
  128.         void        SetAttributes(const TPlayerItemAttribute* c_pAttribute);
  129.        
  130.         int     FindAttribute(BYTE bType);
  131.         bool        RemoveAttributeAt(int index);
  132.         bool        RemoveAttributeType(BYTE bType);
  133.  
  134.         bool        HasAttr(BYTE bApply);
  135.         bool        HasRareAttr(BYTE bApply);
  136.  
  137.         void        SetDestroyEvent(LPEVENT pkEvent);
  138.         void        StartDestroyEvent(int iSec=180);
  139.  
  140.         DWORD       GetRefinedVnum()    { return m_pProto ? m_pProto->dwRefinedVnum : 0; }
  141.         DWORD       GetRefineFromVnum();
  142.         int     GetRefineLevel();
  143.  
  144.         void        SetSkipSave(bool b) { m_bSkipSave = b; }
  145.         bool        GetSkipSave()       { return m_bSkipSave; }
  146.  
  147.         bool        IsOwnership(LPCHARACTER ch);
  148.         void        SetOwnership(LPCHARACTER ch, int iSec = 10);
  149.         void        SetOwnershipEvent(LPEVENT pkEvent);
  150.  
  151.         DWORD       GetLastOwnerPID()   { return m_dwLastOwnerPID; }
  152.  
  153.         int     GetAttributeSetIndex(); // 속성 붙는것을 지정한 배열의 어느 인덱스를 사용하는지 돌려준다.
  154.         void        AlterToMagicItem();
  155.         void        AlterToSocketItem(int iSocketCount);
  156.  
  157.         WORD        GetRefineSet()      { return m_pProto ? m_pProto->wRefineSet : 0;   }
  158.  
  159.         void        StartUniqueExpireEvent();
  160.         void        SetUniqueExpireEvent(LPEVENT pkEvent);
  161.  
  162.         void        StartTimerBasedOnWearExpireEvent();
  163.         void        SetTimerBasedOnWearExpireEvent(LPEVENT pkEvent);
  164.  
  165.         void        StartRealTimeExpireEvent();
  166.         bool        IsRealTimeItem();
  167.  
  168.         void        StopUniqueExpireEvent();
  169.         void        StopTimerBasedOnWearExpireEvent();
  170.         void        StopAccessorySocketExpireEvent();
  171.  
  172.         //          일단 REAL_TIME과 TIMER_BASED_ON_WEAR 아이템에 대해서만 제대로 동작함.
  173.         int         GetDuration();
  174.  
  175.         int     GetAttributeCount();
  176.         void        ClearAttribute();
  177.         void        ChangeAttribute(const int* aiChangeProb=NULL);
  178.         void        AddAttribute();
  179.         void        AddAttribute(BYTE bType, short sValue);
  180.  
  181.         void        ApplyAddon(int iAddonType);
  182.  
  183.         int     GetSpecialGroup() const;
  184.         bool    IsSameSpecialGroup(const LPITEM item) const;
  185.  
  186.         // ACCESSORY_REFINE
  187.         // 액세서리에 광산을 통해 소켓을 추가
  188.         bool        IsAccessoryForSocket();
  189.  
  190.         int     GetAccessorySocketGrade();
  191.         int     GetAccessorySocketMaxGrade();
  192.         int     GetAccessorySocketDownGradeTime();
  193.  
  194.         void        SetAccessorySocketGrade(int iGrade);
  195.         void        SetAccessorySocketMaxGrade(int iMaxGrade);
  196.         void        SetAccessorySocketDownGradeTime(DWORD time);
  197.  
  198.         void        AccessorySocketDegrade();
  199.  
  200.         // 악세사리 를 아이템에 밖았을때 타이머 돌아가는것( 구리, 등 )
  201.         void        StartAccessorySocketExpireEvent();
  202.         void        SetAccessorySocketExpireEvent(LPEVENT pkEvent);
  203.  
  204.         bool        CanPutInto(LPITEM item);
  205.         // END_OF_ACCESSORY_REFINE
  206.  
  207.         void        CopyAttributeTo(LPITEM pItem);
  208.         void        CopySocketTo(LPITEM pItem);
  209.  
  210.         int         GetRareAttrCount();
  211.         bool        AddRareAttribute();
  212.         bool        ChangeRareAttribute();
  213.  
  214.         void        AttrLog();
  215.  
  216.         void        Lock(bool f) { m_isLocked = f; }
  217.         bool        isLocked() const { return m_isLocked; }
  218.  
  219.     private :
  220.         void        SetAttribute(int i, BYTE bType, short sValue);
  221.     public:
  222.         void        SetForceAttribute(int i, BYTE bType, short sValue);
  223.  
  224.     protected:
  225.         bool        EquipEx(bool is_equip);
  226.         bool        Unequip();
  227.  
  228.         void        AddAttr(BYTE bApply, BYTE bLevel);
  229.         void        PutAttribute(const int * aiAttrPercentTable);
  230.         void        PutAttributeWithLevel(BYTE bLevel);
  231.  
  232.     protected:
  233.         friend class CInputDB;
  234.         bool        OnAfterCreatedItem();           // 서버상에 아이템이 모든 정보와 함께 완전히 생성(로드)된 후 불리우는 함수.
  235.  
  236.     public:
  237.         bool        IsRideItem();
  238.         bool        IsRamadanRing();
  239.  
  240.         void        ClearMountAttributeAndAffect();
  241.         bool        IsNewMountItem();
  242.  
  243. #ifdef __AUCTION__
  244.         // 경매장
  245.         bool        MoveToAuction ();
  246.         void        CopyToRawData (TPlayerItem* item);
  247. #endif
  248.         // 독일에서 기존 캐시 아이템과 같지만, 교환 가능한 캐시 아이템을 만든다고 하여,
  249.         // 오리지널 아이템에, 교환 금지 플래그만 삭제한 새로운 아이템들을 새로운 아이템 대역에 할당하였다.
  250.         // 문제는 새로운 아이템도 오리지널 아이템과 같은 효과를 내야하는데,
  251.         // 서버건, 클라건, vnum 기반으로 되어있어
  252.         // 새로운 vnum을 죄다 서버에 새로 다 박아야하는 안타까운 상황에 맞닿았다.
  253.         // 그래서 새 vnum의 아이템이면, 서버에서 돌아갈 때는 오리지널 아이템 vnum으로 바꿔서 돌고 하고,
  254.         // 저장할 때에 본래 vnum으로 바꿔주도록 한다.
  255.  
  256.         // Mask vnum은 어떤 이유(ex. 위의 상황)로 인해 vnum이 바뀌어 돌아가는 아이템을 위해 있다.
  257.         void        SetMaskVnum(DWORD vnum) {   m_dwMaskVnum = vnum; }
  258.         DWORD       GetMaskVnum()           {   return m_dwMaskVnum; }
  259.         bool        IsMaskedItem()  {   return m_dwMaskVnum != 0;   }
  260.  
  261.         // 용혼석
  262.         bool        IsDragonSoul();
  263.         int     GiveMoreTime_Per(float fPercent);
  264.         int     GiveMoreTime_Fix(DWORD dwTime);
  265.  
  266.     private:
  267.         TItemTable const * m_pProto;        // 프로토 타잎
  268.  
  269.         DWORD       m_dwVnum;
  270.         LPCHARACTER m_pOwner;
  271.  
  272.         BYTE        m_bWindow;      // 현재 아이템이 위치한 윈도우
  273.         DWORD       m_dwID;         // 고유번호
  274.         bool        m_bEquipped;    // 장착 되었는가?
  275.         DWORD       m_dwVID;        // VID
  276.         WORD        m_wCell;        // 위치
  277.         DWORD       m_dwCount;      // 개수
  278.         long        m_lFlag;        // 추가 flag
  279.         DWORD       m_dwLastOwnerPID;   // 마지막 가지고 있었던 사람의 PID
  280.  
  281.         bool        m_bExchanging;  ///< 현재 교환중 상태
  282.  
  283.         long        m_alSockets[ITEM_SOCKET_MAX_NUM];   // 아이템 소캣
  284.         TPlayerItemAttribute    m_aAttr[ITEM_ATTRIBUTE_MAX_NUM];
  285.  
  286.         LPEVENT     m_pkDestroyEvent;
  287.         LPEVENT     m_pkExpireEvent;
  288.         LPEVENT     m_pkUniqueExpireEvent;
  289.         LPEVENT     m_pkTimerBasedOnWearExpireEvent;
  290.         LPEVENT     m_pkRealTimeExpireEvent;
  291.         LPEVENT     m_pkAccessorySocketExpireEvent;
  292.         LPEVENT     m_pkOwnershipEvent;
  293.  
  294.         DWORD       m_dwOwnershipPID;
  295.  
  296.         bool        m_bSkipSave;
  297.  
  298.         bool        m_isLocked;
  299.        
  300.         DWORD       m_dwMaskVnum;
  301.         DWORD       m_dwSIGVnum;
  302.     public:
  303.         void SetSIGVnum(DWORD dwSIG)
  304.         {
  305.             m_dwSIGVnum = dwSIG;
  306.         }
  307.         DWORD   GetSIGVnum() const
  308.         {
  309.             return m_dwSIGVnum;
  310.         }
  311. };
  312.  
  313. EVENTINFO(item_event_info)
  314. {
  315.     LPITEM item;
  316.     char szOwnerName[CHARACTER_NAME_MAX_LEN];
  317.  
  318.     item_event_info()
  319.     : item( 0 )
  320.     {
  321.         ::memset( szOwnerName, 0, CHARACTER_NAME_MAX_LEN );
  322.     }
  323. };
  324.  
  325. EVENTINFO(item_vid_event_info)
  326. {
  327.     DWORD item_vid;
  328.  
  329.     item_vid_event_info()
  330.     : item_vid( 0 )
  331.     {
  332.     }
  333. };
  334.  
  335. #endif
Add Comment
Please, Sign In to add comment