1
0
forked from metin2/server
server/game/src/item.h

332 lines
9.5 KiB
C
Raw Normal View History

2022-03-05 12:44:06 +02:00
#ifndef __INC_METIN_II_GAME_ITEM_H__
#define __INC_METIN_II_GAME_ITEM_H__
#include "entity.h"
class CItem : public CEntity
{
protected:
// override methods from ENTITY class
virtual void EncodeInsertPacket(LPENTITY entity);
virtual void EncodeRemovePacket(LPENTITY entity);
public:
CItem(DWORD dwVnum);
virtual ~CItem();
int GetLevelLimit();
bool CheckItemUseLevel(int nLevel);
bool IsPCBangItem();
int FindApplyValue(BYTE bApplyType);
2022-03-05 12:44:06 +02:00
bool IsStackable() { return (GetFlag() & ITEM_FLAG_STACKABLE)?true:false; }
void Initialize();
void Destroy();
void Save();
void SetWindow(BYTE b) { m_bWindow = b; }
BYTE GetWindow() { return m_bWindow; }
void SetID(DWORD id) { m_dwID = id; }
DWORD GetID() { return m_dwID; }
void SetProto(const TItemTable * table);
TItemTable const * GetProto() { return m_pProto; }
int GetGold();
int GetShopBuyPrice();
const char * GetName() { return m_pProto ? m_pProto->szLocaleName : NULL; }
const char * GetBaseName() { return m_pProto ? m_pProto->szName : NULL; }
BYTE GetSize() { return m_pProto ? m_pProto->bSize : 0; }
void SetFlag(int flag) { m_lFlag = flag; }
int GetFlag() { return m_lFlag; }
2022-03-05 12:44:06 +02:00
void AddFlag(int bit);
void RemoveFlag(int bit);
2022-03-05 12:44:06 +02:00
DWORD GetWearFlag() { return m_pProto ? m_pProto->dwWearFlags : 0; }
DWORD GetAntiFlag() { return m_pProto ? m_pProto->dwAntiFlags : 0; }
DWORD GetImmuneFlag() { return m_pProto ? m_pProto->dwImmuneFlag : 0; }
void SetVID(DWORD vid) { m_dwVID = vid; }
DWORD GetVID() { return m_dwVID; }
bool SetCount(DWORD count);
DWORD GetCount();
// GetVnum<75><6D> GetOriginalVnum<75><6D> <20><><EFBFBD><EFBFBD> comment
// GetVnum<75><6D> Masking <20><> Vnum<75>̴<EFBFBD>. <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ν<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Vnum<75><6D> 10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Vnum<75><6D> 20<32><30> <20><>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
// Masking <20><><EFBFBD><EFBFBD> ori_to_new.txt<78><74><EFBFBD><EFBFBD> <20><><EFBFBD>ǵ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
// GetOriginalVnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Vnum<75><6D><EFBFBD><EFBFBD>, <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20>Ѵ<EFBFBD>.
//
DWORD GetVnum() const { return m_dwMaskVnum ? m_dwMaskVnum : m_dwVnum; }
DWORD GetOriginalVnum() const { return m_dwVnum; }
BYTE GetType() const { return m_pProto ? m_pProto->bType : 0; }
BYTE GetSubType() const { return m_pProto ? m_pProto->bSubType : 0; }
BYTE GetLimitType(DWORD idx) const { return m_pProto ? m_pProto->aLimits[idx].bType : 0; }
int GetLimitValue(DWORD idx) const { return m_pProto ? m_pProto->aLimits[idx].lValue : 0; }
2022-03-05 12:44:06 +02:00
int GetValue(DWORD idx);
2022-03-05 12:44:06 +02:00
void SetCell(LPCHARACTER ch, WORD pos) { m_pOwner = ch, m_wCell = pos; }
WORD GetCell() { return m_wCell; }
LPITEM RemoveFromCharacter();
bool AddToCharacter(LPCHARACTER ch, TItemPos Cell);
LPCHARACTER GetOwner() { return m_pOwner; }
LPITEM RemoveFromGround();
bool AddToGround(int lMapIndex, const PIXEL_POSITION & pos, bool skipOwnerCheck = false);
2022-03-05 12:44:06 +02:00
int FindEquipCell(LPCHARACTER ch, int bCandidateCell = -1);
bool IsEquipped() const { return m_bEquipped; }
bool EquipTo(LPCHARACTER ch, BYTE bWearCell);
bool IsEquipable() const;
bool CanUsedBy(LPCHARACTER ch);
bool DistanceValid(LPCHARACTER ch);
void UpdatePacket();
void UsePacketEncode(LPCHARACTER ch, LPCHARACTER victim, struct packet_item_use * packet);
void SetExchanging(bool isOn = true);
bool IsExchanging() { return m_bExchanging; }
bool IsTwohanded();
bool IsPolymorphItem();
void ModifyPoints(bool bAdd); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20>ο<EFBFBD> <20>Ѵ<EFBFBD>. bAdd<64><64> false<73≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CreateSocket(BYTE bSlot, BYTE bGold);
const int * GetSockets() { return &m_alSockets[0]; }
int GetSocket(int i) { return m_alSockets[i]; }
2022-03-05 12:44:06 +02:00
void SetSockets(const LONG * al);
void SetSocket(int i, int v, bool bLog = true);
2022-03-05 12:44:06 +02:00
int GetSocketCount();
bool AddSocket();
const TPlayerItemAttribute* GetAttributes() { return m_aAttr; }
const TPlayerItemAttribute& GetAttribute(int i) { return m_aAttr[i]; }
BYTE GetAttributeType(int i) { return m_aAttr[i].bType; }
short GetAttributeValue(int i){ return m_aAttr[i].sValue; }
void SetAttributes(const TPlayerItemAttribute* c_pAttribute);
int FindAttribute(BYTE bType);
bool RemoveAttributeAt(int index);
bool RemoveAttributeType(BYTE bType);
bool HasAttr(BYTE bApply);
bool HasRareAttr(BYTE bApply);
void SetDestroyEvent(LPEVENT pkEvent);
void StartDestroyEvent(int iSec=300);
DWORD GetRefinedVnum() { return m_pProto ? m_pProto->dwRefinedVnum : 0; }
DWORD GetRefineFromVnum();
int GetRefineLevel();
void SetSkipSave(bool b) { m_bSkipSave = b; }
bool GetSkipSave() { return m_bSkipSave; }
bool IsOwnership(LPCHARACTER ch);
void SetOwnership(LPCHARACTER ch, int iSec = 10);
void SetOwnershipEvent(LPEVENT pkEvent);
DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; }
int GetAttributeSetIndex(); // <20>Ӽ<EFBFBD> <20>ٴ°<D9B4><C2B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
void AlterToMagicItem();
void AlterToSocketItem(int iSocketCount);
WORD GetRefineSet() { return m_pProto ? m_pProto->wRefineSet : 0; }
void StartUniqueExpireEvent();
void SetUniqueExpireEvent(LPEVENT pkEvent);
void StartTimerBasedOnWearExpireEvent();
void SetTimerBasedOnWearExpireEvent(LPEVENT pkEvent);
void StartRealTimeExpireEvent();
bool IsRealTimeItem();
void StopUniqueExpireEvent();
void StopTimerBasedOnWearExpireEvent();
void StopAccessorySocketExpireEvent();
// <09>ϴ<EFBFBD> REAL_TIME<4D><45> TIMER_BASED_ON_WEAR <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
int GetDuration();
int GetAttributeCount();
void ClearAttribute();
void ChangeAttribute(const int* aiChangeProb=NULL);
void AddAttribute();
void AddAttribute(BYTE bType, short sValue);
void ApplyAddon(int iAddonType);
int GetSpecialGroup() const;
bool IsSameSpecialGroup(const LPITEM item) const;
// ACCESSORY_REFINE
// <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
bool IsAccessoryForSocket();
int GetAccessorySocketGrade();
int GetAccessorySocketMaxGrade();
int GetAccessorySocketDownGradeTime();
void SetAccessorySocketGrade(int iGrade);
void SetAccessorySocketMaxGrade(int iMaxGrade);
void SetAccessorySocketDownGradeTime(DWORD time);
void AccessorySocketDegrade();
// <20>Ǽ<EFBFBD><C7BC><20><> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD> Ÿ<≯<EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0>°<EFBFBD>( <20><><EFBFBD><EFBFBD>, <20><> )
void StartAccessorySocketExpireEvent();
void SetAccessorySocketExpireEvent(LPEVENT pkEvent);
bool CanPutInto(LPITEM item);
// END_OF_ACCESSORY_REFINE
void CopyAttributeTo(LPITEM pItem);
void CopySocketTo(LPITEM pItem);
int GetRareAttrCount();
bool AddRareAttribute();
bool ChangeRareAttribute();
void AttrLog();
void Lock(bool f) { m_isLocked = f; }
bool isLocked() const { return m_isLocked; }
private :
void SetAttribute(int i, BYTE bType, short sValue);
public:
void SetForceAttribute(int i, BYTE bType, short sValue);
protected:
bool EquipEx(bool is_equip);
bool Unequip();
void AddAttr(BYTE bApply, BYTE bLevel);
void PutAttribute(const int * aiAttrPercentTable);
void PutAttributeWithLevel(BYTE bLevel);
protected:
friend class CInputDB;
bool OnAfterCreatedItem(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>ε<EFBFBD>)<29><> <20><> <20>Ҹ<EFBFBD><D2B8><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>.
public:
bool IsRideItem();
bool IsRamadanRing();
void ClearMountAttributeAndAffect();
bool IsNewMountItem();
#ifdef __AUCTION__
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool MoveToAuction ();
void CopyToRawData (TPlayerItem* item);
#endif
// <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٰ<EFBFBD> <20>Ͽ<EFBFBD>,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD>, <20><>ȯ <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBBFAA> <20>Ҵ<EFBFBD><D2B4>Ͽ<EFBFBD><CFBF><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> ȿ<><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4>,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ŭ<><C5AC><EFBFBD><EFBFBD>, vnum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>־<EFBFBD>
// <20><><EFBFBD>ο<EFBFBD> vnum<75><6D> <20>˴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ھƾ<DABE><C6BE>ϴ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><>Ȳ<EFBFBD><C8B2> <20>´<EFBFBD><C2B4>Ҵ<EFBFBD>.
// <20>׷<EFBFBD><D7B7><EFBFBD> <20><> vnum<75><6D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D><EFBFBD><EFBFBD> <20>ٲ㼭 <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> vnum<75><6D><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2>ֵ<EFBFBD><D6B5><EFBFBD> <20>Ѵ<EFBFBD>.
// Mask vnum<75><6D> <20><20><><EFBFBD><EFBFBD>(ex. <20><><EFBFBD><EFBFBD> <20><>Ȳ)<29><> <20><><EFBFBD><EFBFBD> vnum<75><6D> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
void SetMaskVnum(DWORD vnum) { m_dwMaskVnum = vnum; }
DWORD GetMaskVnum() { return m_dwMaskVnum; }
bool IsMaskedItem() { return m_dwMaskVnum != 0; }
// <20><>ȥ<EFBFBD><C8A5>
bool IsDragonSoul();
int GiveMoreTime_Per(float fPercent);
int GiveMoreTime_Fix(DWORD dwTime);
private:
TItemTable const * m_pProto; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>
DWORD m_dwVnum;
LPCHARACTER m_pOwner;
BYTE m_bWindow; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD m_dwID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ
bool m_bEquipped; // <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>°<EFBFBD>?
DWORD m_dwVID; // VID
WORD m_wCell; // <20><>ġ
DWORD m_dwCount; // <20><><EFBFBD><EFBFBD>
int m_lFlag; // <20>߰<EFBFBD> flag
2022-03-05 12:44:06 +02:00
DWORD m_dwLastOwnerPID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID
bool m_bExchanging; ///< <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD>
int m_alSockets[ITEM_SOCKET_MAX_NUM]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ĺ
2022-03-05 12:44:06 +02:00
TPlayerItemAttribute m_aAttr[ITEM_ATTRIBUTE_MAX_NUM];
LPEVENT m_pkDestroyEvent;
LPEVENT m_pkExpireEvent;
LPEVENT m_pkUniqueExpireEvent;
LPEVENT m_pkTimerBasedOnWearExpireEvent;
LPEVENT m_pkRealTimeExpireEvent;
LPEVENT m_pkAccessorySocketExpireEvent;
LPEVENT m_pkOwnershipEvent;
DWORD m_dwOwnershipPID;
bool m_bSkipSave;
bool m_isLocked;
DWORD m_dwMaskVnum;
DWORD m_dwSIGVnum;
public:
void SetSIGVnum(DWORD dwSIG)
{
m_dwSIGVnum = dwSIG;
}
DWORD GetSIGVnum() const
{
return m_dwSIGVnum;
}
};
EVENTINFO(item_event_info)
{
LPITEM item;
char szOwnerName[CHARACTER_NAME_MAX_LEN];
item_event_info()
: item( 0 )
{
::memset( szOwnerName, 0, CHARACTER_NAME_MAX_LEN );
}
};
EVENTINFO(item_vid_event_info)
{
DWORD item_vid;
item_vid_event_info()
: item_vid( 0 )
{
}
};
#endif