Restructure repository to include all source folders

Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,38 @@
#ifndef _RYL_GAME_LIB_CONTAINER_CONSTANTS_H_
#define _RYL_GAME_LIB_CONTAINER_CONSTANTS_H_
namespace ContainerConstant
{
enum Const
{
QUEST_INVENTORY_TAB = 3 // <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (4<><34>° <20><>)
};
enum Size
{
// -------------------------------------
// ij<><C4B3><EFBFBD><EFBFBD>
INVENTORY_WIDTH = 6,
INVENTORY_HEIGHT = 6,
MAX_INVENTORY_TAB = 4, // <20>κ<EFBFBD><CEBA>
EXCHANGE_WIDTH = 8,
EXCHANGE_HEIGHT = 4, // <20><>ȯâ
DEPOSIT_WIDTH = 8,
DEPOSIT_HEIGHT = 12,
MAX_DEPOSIT_TAB = 4, // â<><C3A2>
STALL_WIDTH = 10,
STALL_HEIGHT = 8, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// -------------------------------------
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CAMPSHOP_WIDTH = 10,
CAMPSHOP_HEIGHT = 8, // <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>
};
};
#endif

View File

@@ -0,0 +1,330 @@
#include "stdafx.h"
#include <Network/Stream/SendStream.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/PacketStruct/CharItemPacket.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Creature/Character/Character.h>
#include <Item/Item.h>
#include <Item/ItemFactory.h>
#include "DepositContainer.h"
Item::CDepositContainer::CDepositContainer()
: m_lpArrayContainer(NULL),
m_lpOwner(NULL),
m_dwTabFlag(0),
m_dwGold(0),
m_nXSize(0),
m_nYSize(0),
m_nTabNum(0),
m_bLoginSuccess(false)
{
memset(m_szPassword, 0, Deposit::PASSWORD_LENGTH);
}
Item::CDepositContainer::~CDepositContainer()
{
DestroyDepositContainer();
}
bool Item::CDepositContainer::Initialize(CCharacter* lpCharacter, unsigned char nXSize,
unsigned char nYSize, unsigned char nTabNum)
{
m_lpOwner = lpCharacter;
m_dwCID = lpCharacter->GetCID();
m_nXSize = nXSize;
m_nYSize = nYSize;
m_nTabNum = nTabNum;
m_lpArrayContainer = new Item::CArrayContainer[nTabNum];
if(NULL != m_lpArrayContainer)
{
for(int nCount = 0; nCount < m_nTabNum; ++nCount)
{
if(!m_lpArrayContainer[nCount].Initialize(m_dwCID, nXSize, nYSize, 1))
{
return false;
}
}
return true;
}
return false;
}
void Item::CDepositContainer::DestroyDepositContainer()
{
if(NULL != m_lpArrayContainer)
{
delete [] m_lpArrayContainer;
m_lpArrayContainer = NULL;
}
}
Item::CItem* Item::CDepositContainer::GetItem(ItemPos itemPos)
{
unsigned char cTabNum = itemPos.GetZIndex();
if(cTabNum < m_nTabNum && NULL != m_lpArrayContainer)
{
itemPos.SetZIndex(0);
return m_lpArrayContainer[cTabNum].GetItem(itemPos);
}
return NULL;
}
bool Item::CDepositContainer::SetItem(ItemPos itemPos, CItem* lpItem)
{
unsigned char cTabNum = itemPos.GetZIndex();
bool bResult = false;
if(NULL != m_lpArrayContainer && NULL != lpItem &&
cTabNum < m_nTabNum && (0 != (m_dwTabFlag & (1 << cTabNum))))
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǿ<EFBFBD><C7BF><EFBFBD> Setting<6E><67> <20><> <20>ִ<EFBFBD>.
itemPos.SetZIndex(0);
bResult = m_lpArrayContainer[cTabNum].SetItem(itemPos, lpItem);
itemPos.SetZIndex(cTabNum);
lpItem->MoveItem(itemPos);
}
else
{
ERRLOG4(g_Log, "CID:0x%10u â<><C3A2> <20>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20><> <20>÷<EFBFBD><C3B7><EFBFBD> : 0x%08x, <20><>ġ(%d, 0x%04x)",
m_dwCID, m_dwTabFlag, itemPos.m_cPos, itemPos.m_cIndex);
}
return bResult;
}
bool Item::CDepositContainer::RemoveItem(ItemPos itemPos)
{
unsigned char cTabNum = itemPos.GetZIndex();
if(NULL != m_lpArrayContainer &&
cTabNum < m_nTabNum && (0 != (m_dwTabFlag & (1 << cTabNum))))
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǿ<EFBFBD><C7BF><EFBFBD> Remove<76><65> <20><> <20>ִ<EFBFBD>.
itemPos.SetZIndex(0);
return m_lpArrayContainer[cTabNum].RemoveItem(itemPos);
}
return false;
}
bool Item::CDepositContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
size_t nBufferSize = static_cast<size_t>(dwBufferSize_In);
size_t nUsed = 0;
Item::CItemFactory& ItemFactory = CItemFactory::GetInstance();
while(nBufferSize > 0)
{
size_t nItemSize = nBufferSize;
Item::CItem* lpItem = ItemFactory.CreateItem(szItemBuffer_In + nUsed, nItemSize);
if(NULL == lpItem)
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
ERRLOG1(g_Log, "CID:0x%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
}
else if(!CDepositContainer::SetItem(lpItem->GetPos(), lpItem))
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
ERRLOG4(g_Log, "CID:0x%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. (%d, 0x%x) TabFlag : 0x%08x",
m_dwCID, lpItem->GetPos().m_cPos, lpItem->GetPos().m_cIndex, m_dwTabFlag);
DELETE_ITEM(lpItem);
}
nUsed += nItemSize;
nBufferSize -= nItemSize;
}
return true;
}
bool Item::CDepositContainer::ClientUpdate(CSendStream& ClientSendStream)
{
char szData[PktDeposit::MIN_DATA_SIZE];
memset(szData, 0, sizeof(PktDeposit::MIN_DATA_SIZE));
*reinterpret_cast<unsigned long*>(szData) = m_dwGold;
*reinterpret_cast<unsigned char*>(szData + sizeof(unsigned long)) = IsPasswordSaved() ? 1 : 0;
// <20><><EFBFBD>ϰ<EFBFBD> <20>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(GameClientSendPacket::SendCharDepositCmd(ClientSendStream, PktDeposit::SAVED_PASS,
szData, PktDeposit::MIN_DATA_SIZE, 0))
{
return Update(ClientSendStream);
}
return false;
}
bool Item::CDepositContainer::DBUpdate(CSendStream& AgentSendStream)
{
if(GameClientSendPacket::SendCharDepositGoldToDBAgent(AgentSendStream, m_lpOwner->GetUID(), m_dwGold))
{
return Update(AgentSendStream);
}
return false;
}
bool Item::CDepositContainer::Update(CSendStream& SendStream)
{
const int MAX_ITEM_BUFFER = 8000;
const int MAX_BUFFER = MAX_ITEM_BUFFER + sizeof(PktDepositUpdateDB);
char szBuffer[MAX_BUFFER];
PktDepositUpdateDB* lpPktDepositUpdateDB = reinterpret_cast<PktDepositUpdateDB*>(szBuffer);
char* szItemBuffer = szBuffer + sizeof(PktDepositUpdateDB);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
lpPktDepositUpdateDB->m_dwUID = m_lpOwner->GetUID();
lpPktDepositUpdateDB->m_dwCID = m_dwCID;
lpPktDepositUpdateDB->m_dwTabFlag = m_dwTabFlag; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> bitset
// <20><> <20>Ǿ<EFBFBD> Serialize<7A>Ѵ<EFBFBD>.
for(unsigned int nSerializeIndex = 0; nSerializeIndex < m_nTabNum; ++nSerializeIndex)
{
unsigned long dwUsedSize = 0;
unsigned long dwBufferSize = MAX_ITEM_BUFFER;
// <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD>Ǿ<EFBFBD> Serialize<7A>Ѵ<EFBFBD>. ¦<><C2A6><EFBFBD><EFBFBD> Serialize.
if(m_lpArrayContainer[nSerializeIndex].SerializeOut(szItemBuffer, dwBufferSize))
{
dwUsedSize += dwBufferSize;
}
else
{
const Item::ItemData* lpItemData = reinterpret_cast<Item::ItemData*>(szItemBuffer);
lpItemData->DumpInfo(m_dwCID, __FUNCTION__ " <20><> ù<><C3B9>° <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>");
}
// Ȧ<><C8A6><EFBFBD><EFBFBD> Serialize.
++nSerializeIndex;
if(nSerializeIndex < m_nTabNum)
{
dwBufferSize = MAX_ITEM_BUFFER - dwUsedSize;
if(m_lpArrayContainer[nSerializeIndex].SerializeOut(szItemBuffer + dwUsedSize, dwBufferSize))
{
dwUsedSize += dwBufferSize;
}
else
{
const Item::ItemData* lpItemData = reinterpret_cast<Item::ItemData*>(szItemBuffer);
lpItemData->DumpInfo(m_dwCID, __FUNCTION__ " <20><> <20>ι<EFBFBD>° <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>");
}
}
lpPktDepositUpdateDB->m_usDataSize = static_cast<unsigned short>(dwUsedSize);
lpPktDepositUpdateDB->m_cTabNum = nSerializeIndex / 2;
lpPktDepositUpdateDB->m_bUpdateComplete = (nSerializeIndex + 1 < m_nTabNum) ? false : true;
if(!SendStream.WrapCompress(szBuffer,
static_cast<unsigned short>(sizeof(PktDepositUpdateDB) + dwUsedSize), CmdDepositUpdate, 0, 0))
{
return false;
}
}
return true;
}
bool Item::CDepositContainer::ChangePassword(const char* szCurrentPassword, size_t nCurrentPasswordLength,
const char* szChangePassword, size_t nChangePasswordLength)
{
if(0 == memcmp(m_szPassword, szCurrentPassword,
(Deposit::PASSWORD_LENGTH < nCurrentPasswordLength) ? Deposit::PASSWORD_LENGTH : nCurrentPasswordLength))
{
SetPassword(szChangePassword, nChangePasswordLength);
return true;
}
return false;
}
bool Item::CDepositContainer::AddGold(unsigned long dwGold)
{
if(m_dwGold <= ULONG_MAX - dwGold)
{
m_dwGold += dwGold;
return true;
}
ERRLOG2(g_Log, "CID:0x%10u â<><C3A2> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>÷ο<20>߻<EFBFBD><DFBB>߽<EFBFBD><DFBD>ϴ<EFBFBD>. : %dGold", m_dwCID, dwGold);
return false;
}
bool Item::CDepositContainer::DeductGold(unsigned long dwGold)
{
if(dwGold <= m_dwGold)
{
m_dwGold -= dwGold;
return true;
}
ERRLOG1(g_Log, "CID:0x%10u â<><C3A2> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>÷ο<20>߻<EFBFBD><DFBB>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
return false;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
void Item::CDepositContainer::DumpItemInfo()
{
for(int nCount = 0; nCount < m_nTabNum; ++nCount)
{
m_lpArrayContainer[nCount].DumpItemInfo();
}
}
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׷<CEB1> <20><><EFBFBD><EFBFBD>.
bool Item::CDepositContainer::LogUpdate(char* szLogBuffer_Out, unsigned long& dwBufferSize_InOut)
{
char* szBufferOut = szLogBuffer_Out;
unsigned long dwUsed = 0;
unsigned long dwRemain = dwBufferSize_InOut;
for(int nIndex = 0; nIndex < m_nTabNum; ++nIndex)
{
if(!m_lpArrayContainer[nIndex].SerializeOut(szBufferOut + dwUsed, dwRemain))
{
ERRLOG1(g_Log, "CID:0x%10u â<><C3A2> <20>α<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", m_dwCID);
dwBufferSize_InOut = dwUsed;
return false;
}
dwUsed += dwRemain;
dwRemain = dwBufferSize_InOut - dwUsed;
}
dwBufferSize_InOut = dwUsed;
return true;
}

View File

@@ -0,0 +1,148 @@
#ifndef _DEPOSIT_CONTAINER_H_
#define _DEPOSIT_CONTAINER_H_
#include <climits>
#include "ItemContainer.h"
#include <Network/Packet/PacketStruct/CharItemPacket.h>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CSendStream;
class CCharacter;
namespace Item
{
class CDepositContainer : public CItemContainer
{
public:
CDepositContainer();
virtual ~CDepositContainer();
bool Initialize(CCharacter* lpCharacter,
unsigned char nXSize, unsigned char nYSize, unsigned char nTabNum);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
inline bool Login(const char* szPassword, size_t nPasswordLength, char bSavePassword);
inline bool IsLogin() { return m_bLoginSuccess; }
inline void Logout() { if(m_bLoginSuccess) { m_bLoginSuccess = false; } }
inline bool IsPasswordSaved() { return (0 != (m_dwTabFlag & PktDepositUpdateDB::SAVED_PASSWORD)); }
inline void SetPassword(const char* szPassword, size_t nPasswordLength);
bool ChangePassword(const char* szCurrentPassword, size_t nCurrentPasswordLength,
const char* szChangePassword, size_t nChangePasswordLength);
// NULL-Terminated<65><64> <20>ƴ<EFBFBD>!
inline const unsigned char* GetPassword() const { return m_szPassword; }
// <20><> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
inline unsigned long GetGold() const { return m_dwGold; }
bool AddGold(unsigned long dwGold);
bool DeductGold(unsigned long dwGold);
// Flag<61><67><EFBFBD><EFBFBD> <20>Լ<EFBFBD>. Tab1<62><31> <20>׻<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
inline void SetTabFlag(unsigned long dwTabFlag);
inline unsigned long GetTabFlag() const { return m_dwTabFlag; }
// <20><> <20><><EFBFBD><EFBFBD>.
inline bool BuyTab(unsigned char cTabNum);
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
inline CItemContainer* GetTab(unsigned char nTabNum);
inline unsigned char GetMaxTabNum() const { return m_nTabNum; }
// Serialize In.
virtual bool SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
virtual void DumpItemInfo();
// â<><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
bool ClientUpdate(CSendStream& ClientSendStream);
bool DBUpdate(CSendStream& AgentSendStream);
bool LogUpdate(char* szLogBuffer_Out, unsigned long& dwBufferSize_InOut);
private:
bool Update(CSendStream& SendStream);
void DestroyDepositContainer();
// Serialize Out<75><74> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>, <20>Ǻ<EFBFBD><C7BA><EFBFBD> SerializeOut<75>Ѵ<EFBFBD>.
virtual bool SerializeOut(char* szItemBuffer_Out, unsigned long& dwBufferSize_InOut) const { return false; }
CArrayContainer* m_lpArrayContainer;
CCharacter* m_lpOwner;
unsigned long m_dwTabFlag;
unsigned long m_dwGold;
unsigned char m_szPassword[Deposit::PASSWORD_LENGTH];
unsigned char m_nXSize;
unsigned char m_nYSize;
unsigned char m_nTabNum;
bool m_bLoginSuccess;
};
};
Item::CItemContainer* Item::CDepositContainer::GetTab(unsigned char nTabNum)
{
return (nTabNum < m_nTabNum && NULL != m_lpArrayContainer) ?
&m_lpArrayContainer[nTabNum] : NULL;
}
inline void Item::CDepositContainer::SetTabFlag(unsigned long dwTabFlag)
{
m_dwTabFlag = dwTabFlag | PktDepositUpdateDB::ITEM_TAB1;
if(0 == memcmp(m_szPassword, "0000", Deposit::PASSWORD_LENGTH) && 0 == (m_dwTabFlag & PktDepositUpdateDB::USED_DEPOSIT))
{
m_dwTabFlag &= ~PktDepositUpdateDB::USED_DEPOSIT;
}
else
{
m_dwTabFlag |= PktDepositUpdateDB::USED_DEPOSIT;
}
}
inline void Item::CDepositContainer::SetPassword(const char* szPassword, size_t nPasswordLength)
{
memcpy(m_szPassword, szPassword,
(Deposit::PASSWORD_LENGTH < nPasswordLength) ? Deposit::PASSWORD_LENGTH : nPasswordLength);
}
inline bool Item::CDepositContainer::Login(const char* szPassword, size_t nPasswordLength, char bSavePassword)
{
if(0 == memcmp(m_szPassword, szPassword,
(Deposit::PASSWORD_LENGTH < nPasswordLength) ? Deposit::PASSWORD_LENGTH : nPasswordLength))
{
m_bLoginSuccess = true;
if(0 != bSavePassword)
{
m_dwTabFlag |= PktDepositUpdateDB::SAVED_PASSWORD;
}
m_dwTabFlag |= PktDepositUpdateDB::USED_DEPOSIT;
}
return m_bLoginSuccess;
}
inline bool Item::CDepositContainer::BuyTab(unsigned char cTabNum)
{
if(cTabNum < m_nTabNum)
{
m_dwTabFlag |= (1 << cTabNum);
return true;
}
return false;
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,88 @@
#ifndef _EQUIPMENTS_CONTAINER_H_
#define _EQUIPMENTS_CONTAINER_H_
#include <Item/Item.h>
#include "ItemContainer.h"
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CCharacter;
namespace Item
{
class CEquipmentsContainer : public CListContainer
{
protected:
CCharacter* m_lpOwner;
unsigned char m_cRightHand;
unsigned char m_cLeftHand;
unsigned char m_cRideFlag;
public:
CEquipmentsContainer();
virtual ~CEquipmentsContainer();
bool Initialize(CCharacter* lpCharacter, unsigned short nMaxSize);
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
void GetEquipmentView(unsigned short* usProtoTypeArray, unsigned int nStartPos = 0,
int nCopyNum = Item::EquipmentPos::MAX_EQUPMENT_POS);
void ChangeWeaponAndShield() { m_cRightHand = GetExtraRightHandIndex(); m_cLeftHand = GetExtraLeftHandIndex(); }
void ChangeRide(char cRide)
{
m_cRideFlag = cRide;
}
unsigned char GetRightHandIndex(void) const { return m_cRightHand; }
unsigned char GetLeftHandIndex(void) const { return m_cLeftHand; }
unsigned char GetExtraRightHandIndex() const
{
return (m_cRightHand == Item::EquipmentPos::WEAPON_HAND1) ?
Item::EquipmentPos::WEAPON_HAND2 : Item::EquipmentPos::WEAPON_HAND1;
}
unsigned char GetExtraLeftHandIndex() const
{
return (m_cLeftHand == Item::EquipmentPos::SHIELD_HAND1) ?
Item::EquipmentPos::SHIELD_HAND2 : Item::EquipmentPos::SHIELD_HAND1;
}
Item::CEquipment* GetRightHand(void) const { return static_cast<CEquipment*>(m_lppItems[m_cRightHand]); }
Item::CEquipment* GetLeftHand(void) const { return static_cast<CEquipment*>(m_lppItems[m_cLeftHand]); }
void GetEquipList(Item::CEquipment** ppEquip);
bool CheckEquipPos(ItemPos itemPos, const CEquipment* lpEquip);
bool CheckEquipInitPos(ItemPos itemPos, const CEquipment* lpEquip);
virtual bool SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In);
};
};
inline void Item::CEquipmentsContainer::GetEquipmentView(unsigned short* usProtoTypeArray, unsigned int nStartPos, int nCopyNum)
{
int nPastEnd = nStartPos + nCopyNum;
nPastEnd = Item::EquipmentPos::MAX_EQUPMENT_POS < nPastEnd ? Item::EquipmentPos::MAX_EQUPMENT_POS : nPastEnd;
for (int nDstIndex = 0, nSrcIndex = nStartPos; nSrcIndex < nPastEnd; ++nSrcIndex, ++nDstIndex)
{
if (NULL == m_lppItems[nSrcIndex])
{
usProtoTypeArray[nDstIndex] = 0;
continue;
}
usProtoTypeArray[nDstIndex] = m_lppItems[nSrcIndex]->GetPrototypeID();
}
}
#endif

View File

@@ -0,0 +1,279 @@
#include "stdafx.h"
#include <Item/Item.h>
#include "ExchangeContainer.h"
#include <Log/LogCommands.h>
#include <Log/ItemLog.h>
#include <Creature/Character/Character.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharCommunity.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Network/Packet/PacketStruct/CharItemPacket.h>
using namespace Item;
Item::CExchangeContainer::CExchangeContainer()
: m_dwGold(0), m_bLock(false), m_bAccept(false), m_lpOwner(NULL), m_lpExchangeCharacter(NULL)
{
}
Item::CExchangeContainer::~CExchangeContainer()
{
}
Item::CItem* Item::CExchangeContainer::GetItem(Item::ItemPos itemPos)
{
return Item::CArrayContainer::GetItem(itemPos);
}
bool Item::CExchangeContainer::SetItem(Item::ItemPos itemPos, Item::CItem* lpItem)
{
if (false == CheckLock())
{
ERRLOG1(g_Log, "CID:0x%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><>ȯâ<C8AF><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>մϴ<D5B4>.", m_dwCID);
}
else
{
if (Item::CArrayContainer::SetItem(itemPos, lpItem))
{
if (NULL != m_lpExchangeCharacter)
{
CGameClientDispatch* lpGameClientDispatch = m_lpExchangeCharacter->GetDispatcher();
if (NULL != lpGameClientDispatch)
{
GameClientSendPacket::SendCharExchangeItem(lpGameClientDispatch->GetSendStream(),
m_lpOwner->GetCID(), 0, GetItem(itemPos), itemPos, false, false);
}
}
return true;
}
}
return false;
}
bool Item::CExchangeContainer::RemoveItem(Item::ItemPos itemPos)
{
if (false == CheckLock())
{
ERRLOG1(g_Log, "CID:0x%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><>ȯâ<C8AF><C3A2> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>.", m_dwCID);
return false;
}
if (NULL != m_lpExchangeCharacter)
{
CGameClientDispatch* lpGameClientDispatch = m_lpExchangeCharacter->GetDispatcher();
if (NULL != lpGameClientDispatch)
{
GameClientSendPacket::SendCharExchangeItem(lpGameClientDispatch->GetSendStream(),
m_dwCID, 0, GetItem(itemPos), itemPos, false, true);
}
}
return Item::CArrayContainer::RemoveItem(itemPos);
}
bool Item::CExchangeContainer::AddGold(unsigned long dwGold)
{
if (false == CheckLock())
{
ERRLOG1(g_Log, "CID:0x%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><>ȯâ<C8AF><C3A2> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>մϴ<D5B4>.", m_dwCID);
}
else if(m_dwGold <= ULONG_MAX - dwGold)
{
m_dwGold += dwGold;
if(NULL != m_lpExchangeCharacter)
{
CGameClientDispatch* lpExchangerDispatch = m_lpExchangeCharacter->GetDispatcher();
if(NULL != lpExchangerDispatch)
{
GameClientSendPacket::SendCharExchangeItem(lpExchangerDispatch->GetSendStream(),
m_dwCID, m_dwGold, NULL, Item::ItemPos(), false, false);
}
}
return true;
}
else
{
ERRLOG2(g_Log, "CID:0x%10u <20><>ȯ <20><> <20><><EFBFBD><EFBFBD><EFBFBD>÷ο<20>߻<EFBFBD><DFBB>߽<EFBFBD><DFBD>ϴ<EFBFBD>. : %dGold", m_dwCID, dwGold);
}
return false;
}
bool Item::CExchangeContainer::DeductGold(unsigned long dwGold)
{
if (false == CheckLock())
{
ERRLOG1(g_Log, "CID:0x%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20><>ȯâ<C8AF><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>մϴ<D5B4>.", m_dwCID);
}
else if (m_dwGold < dwGold)
{
ERRLOG1(g_Log, "CID:0x%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݾ׺<DDBE><D7BA><EFBFBD> Ů<>ϴ<EFBFBD>.", m_dwCID);
}
else
{
m_dwGold -= dwGold;
if(NULL != m_lpExchangeCharacter)
{
CGameClientDispatch* lpExchangerDispatch = m_lpExchangeCharacter->GetDispatcher();
if(NULL != lpExchangerDispatch)
{
GameClientSendPacket::SendCharExchangeItem(lpExchangerDispatch->GetSendStream(),
m_dwCID, m_dwGold, NULL, Item::ItemPos(), false, false);
}
}
return true;
}
return false;
}
inline bool Item::CExchangeContainer::CheckLock(void)
{
if (m_bLock)
{
return false;
}
if (NULL == m_lpOwner || NULL == m_lpExchangeCharacter)
{
return true;
}
if (m_lpExchangeCharacter->GetExchange().GetLock())
{
CGameClientDispatch* lpOwnerDispatch = m_lpOwner->GetDispatcher();
CGameClientDispatch* lpExchangerDispatch = m_lpExchangeCharacter->GetDispatcher();
m_lpExchangeCharacter->GetExchange().SetLock(false);
if(NULL != lpOwnerDispatch)
{
GameClientSendPacket::SendCharExchangeCmd(lpOwnerDispatch->GetSendStream(), m_lpExchangeCharacter->GetCID(),
m_dwCID, PktExC::EXC_UNLOCK, PktExC::NO_SERVER_ERR);
}
if(NULL != lpExchangerDispatch)
{
GameClientSendPacket::SendCharExchangeCmd(lpExchangerDispatch->GetSendStream(), m_lpExchangeCharacter->GetCID(),
m_dwCID, PktExC::EXC_UNLOCK, PktExC::NO_SERVER_ERR);
}
}
return true;
}
bool Item::CExchangeContainer::ExchangeOK(bool bOK)
{
bool bResult = true;
if (NULL == m_lpExchangeCharacter)
{
bResult = false;
ERRLOG1(g_Log, "CID:0x%10u <20>ŷ<EFBFBD><C5B7>ϴ<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD>µ<EFBFBD> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>.", m_dwCID);
}
else
{
Item::CExchangeContainer& ExchangerContainer = m_lpExchangeCharacter->GetExchange();
if (bOK)
{
unsigned long dwExchangerCID = m_lpExchangeCharacter->GetCID();
// <20><>ȯ <20><> <20>α<EFBFBD>.
GAMELOG::LogExchangeItem(*m_lpOwner, dwExchangerCID, *this, GAMELOG::CMD::BEFORE_EXCHANGE_ITEM);
GAMELOG::LogExchangeItem(*m_lpExchangeCharacter, m_dwCID, ExchangerContainer, GAMELOG::CMD::BEFORE_EXCHANGE_ITEM);
// <20><>ȯ
std::swap(m_lppItems, ExchangerContainer.m_lppItems);
std::swap(m_dwGold, ExchangerContainer.m_dwGold);
// <20><>ȯ <20><> <20>α<EFBFBD>.
GAMELOG::LogExchangeItem(*m_lpOwner, dwExchangerCID, *this, GAMELOG::CMD::AFTER_EXCHANGE_ITEM);
GAMELOG::LogExchangeItem(*m_lpExchangeCharacter, m_dwCID, ExchangerContainer, GAMELOG::CMD::AFTER_EXCHANGE_ITEM);
}
m_lpExchangeCharacter->AddGold(ExchangerContainer.GetGold(), false);
ExchangerContainer.Clear();
m_lpExchangeCharacter->DBUpdateForce(DBUpdateData::UPDATE);
}
m_lpOwner->AddGold(m_dwGold, false);
Clear();
m_lpOwner->DBUpdateForce(DBUpdateData::UPDATE);
return bResult;
}
void Item::CExchangeContainer::ExchangeCancel(void)
{
if (NULL == m_lpExchangeCharacter)
{
return;
}
CGameClientDispatch* lpOwnerDispatch = m_lpOwner->GetDispatcher();
CGameClientDispatch* lpExchangerDispatch = m_lpExchangeCharacter->GetDispatcher();
unsigned long m_dwExchangerCID = m_lpExchangeCharacter->GetCID();
Item::CExchangeContainer& ExchangerExchageContainer = m_lpExchangeCharacter->GetExchange();
if (m_bAccept)
{
m_bAccept = false;
if(NULL != lpOwnerDispatch)
{
GameClientSendPacket::SendCharExchangeCmd(lpOwnerDispatch->GetSendStream(),
m_dwCID, m_dwExchangerCID, PktExC::EXC_CANCEL, PktExC::NO_SERVER_ERR);
}
if(NULL != lpExchangerDispatch)
{
GameClientSendPacket::SendCharExchangeCmd(lpExchangerDispatch->GetSendStream(),
m_dwCID, m_dwExchangerCID, PktExC::EXC_CANCEL, PktExC::NO_SERVER_ERR);
}
}
if (ExchangerExchageContainer.GetAccept())
{
ExchangerExchageContainer.SetAccept(false);
if(NULL != lpOwnerDispatch)
{
GameClientSendPacket::SendCharExchangeCmd(lpOwnerDispatch->GetSendStream(),
m_dwExchangerCID, m_dwCID, PktExC::EXC_CANCEL, PktExC::NO_SERVER_ERR);
}
if(NULL != lpExchangerDispatch)
{
GameClientSendPacket::SendCharExchangeCmd(lpExchangerDispatch->GetSendStream(),
m_dwExchangerCID, m_dwCID, PktExC::EXC_CANCEL, PktExC::NO_SERVER_ERR);
}
}
}
bool Item::CExchangeContainer::Initialize(CCharacter* lpCharacter,
unsigned char cExchangeWidth, unsigned char cExchangeHeight)
{
m_lpOwner = lpCharacter;
return CArrayContainer::Initialize(lpCharacter->GetCID(), cExchangeWidth, cExchangeHeight, 1);
}

View File

@@ -0,0 +1,64 @@
#ifndef _EXCHANGE_CONTAINER_H_
#define _EXCHANGE_CONTAINER_H_
#include "ItemContainer.h"
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CCharacter;
namespace Item
{
class CExchangeContainer : public CArrayContainer
{
public:
CExchangeContainer();
virtual ~CExchangeContainer();
bool Initialize(CCharacter* lpCharacter, unsigned char cExchangeWidth, unsigned char cExchangeHeight);
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
void SetExchangeCharacter(CCharacter *pCharacter) { m_lpExchangeCharacter = pCharacter; }
CCharacter* GetExchangeCharacter(void) { return m_lpExchangeCharacter; }
bool ExchangeOK(bool bOK);
void ExchangeCancel(void);
bool AddGold(unsigned long dwGold);
bool DeductGold(unsigned long dwGold);
unsigned long GetGold() const { return m_dwGold; }
void SetLock(bool bLock) { m_bLock = bLock; }
bool GetLock(void) { return m_bLock; }
void SetAccept(bool bAccept) { m_bAccept = bAccept; }
bool GetAccept(void) { return m_bAccept; }
protected:
inline bool CheckLock();
inline void Clear();
CCharacter* m_lpOwner;
CCharacter* m_lpExchangeCharacter;
unsigned long m_dwGold;
bool m_bLock;
bool m_bAccept;
unsigned char m_cPadding[2]; // 4 byte alignment...
};
};
void Item::CExchangeContainer::Clear()
{
m_dwGold = 0;
m_lpExchangeCharacter = NULL;
m_bLock = false;
m_bAccept = false;
}
#endif

View File

@@ -0,0 +1,336 @@
#include "stdafx.h"
#include <Creature/Character/Character.h>
#include <Item/Container/ContainerConstant.h>
#include "InventoryContainer.h"
using namespace Item;
CInventoryContainer::CInventoryContainer()
: m_bAdminToolFlag(false)
{
}
CInventoryContainer::~CInventoryContainer()
{
}
bool CInventoryContainer::SetItem(ItemPos itemPos, CItem* lpItem)
{
if (false == m_bAdminToolFlag)
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_dwCID);
if (NULL == lpCharacter)
{
return false;
}
// <20><><EFBFBD><EFBFBD>Ʈ Ʈ<><C6AE><EFBFBD><EFBFBD> <20>ߵ<EFBFBD>
short wCount = (true == lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
lpCharacter->CheckTrigger(Quest::TRIGGER_PICK, lpItem->GetPrototypeID(), Position(), wCount);
}
if (NULL == lpItem)
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL<4C>Դϴ<D4B4>.", m_dwCID);
return false;
}
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
// <20><><EFBFBD><EFBFBD>Ʈ <20><> üũ
unsigned char cItemType = lpItem->GetItemInfo().m_DetailData.m_cItemType;
/*
// edith 2008.06.04 <20>κ<EFBFBD><CEBA><20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
if ((Item::ItemType::QUEST_ITEM == cItemType && ContainerConstant::QUEST_INVENTORY_TAB != cTab) ||
(Item::ItemType::QUEST_ITEM != cItemType && ContainerConstant::QUEST_INVENTORY_TAB == cTab))
{
ERRLOG4(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>´<EFBFBD> <20>ùٸ<C3B9> <20><><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>. ItemType:%d, Tab:%d/%d",
m_dwCID, cItemType, cTab, m_nTabNum);
return false;
}
*/
unsigned char cXSize = lpItem->GetItemInfo().m_DetailData.m_cXSize;
unsigned char cYSize = lpItem->GetItemInfo().m_DetailData.m_cYSize;
if (m_nXSize < static_cast<size_t>(cX + cXSize) ||
m_nYSize < static_cast<size_t>(cY + cYSize) || m_nTabNum <= cTab)
{
ERRLOG9(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. "
"X:%d/%d, Y:%d/%d, Tab:%d/%d, Xũ<58><C5A9>:%d, Yũ<59><C5A9>:%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum, cXSize, cYSize);
return false;
}
CItem** lppItemYIndexPastEnd = m_lppItems + m_nSizePerTab * cTab + m_nXSize * (cY + cYSize);
CItem **lppItemYIndex, **lppItemXIndex, **lppItemXIndexPastEnd;
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
if (0 != *lppItemXIndex)
{
ERRLOG4(g_Log, "CID:%10u (%d,%d,%d) <20>̹<EFBFBD> <20><> <20><><EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.",
m_dwCID, cX, cY, cTab);
return false;
}
}
}
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
*lppItemXIndex = m_lpNullItem;
}
}
m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX] = lpItem;
lpItem->MoveItem(itemPos);
return true;
}
bool CInventoryContainer::TestItem(ItemPos itemPos, unsigned short usProtoTypeID, unsigned char cNum)
{
const Item::ItemInfo* lpItemInfo = CItemMgr::GetInstance().GetItemInfo(usProtoTypeID);
if (NULL == lpItemInfo)
{
ERRLOG2(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. usProtoTypeID:%d",
m_dwCID, usProtoTypeID);
return false;
}
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
// <20><><EFBFBD><EFBFBD>Ʈ <20><> üũ
unsigned char cItemType = lpItemInfo->m_DetailData.m_cItemType;
/*
// edith 2008.06.04 <20>κ<EFBFBD><CEBA><20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
if ((Item::ItemType::QUEST_ITEM == cItemType && ContainerConstant::QUEST_INVENTORY_TAB != cTab) ||
(Item::ItemType::QUEST_ITEM != cItemType && ContainerConstant::QUEST_INVENTORY_TAB == cTab))
{
ERRLOG4(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>´<EFBFBD> <20>ùٸ<C3B9> <20><><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>. ItemType:%d, Tab:%d/%d",
m_dwCID, cItemType, cTab, m_nTabNum);
return false;
}
*/
unsigned char cXSize = lpItemInfo->m_DetailData.m_cXSize;
unsigned char cYSize = lpItemInfo->m_DetailData.m_cYSize;
if (m_nXSize < static_cast<size_t>(cX + cXSize) ||
m_nYSize < static_cast<size_t>(cY + cYSize) || m_nTabNum <= cTab)
{
ERRLOG9(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. "
"X:%d/%d, Y:%d/%d, Tab:%d/%d, Xũ<58><C5A9>:%d, Yũ<59><C5A9>:%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum, cXSize, cYSize);
return false;
}
CItem** lppItemYIndexPastEnd = m_lppItems + m_nSizePerTab * cTab + m_nXSize * (cY + cYSize);
CItem **lppItemYIndex, **lppItemXIndex, **lppItemXIndexPastEnd;
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
CItem* lpPreItem = *lppItemXIndex;
if (NULL != lpPreItem)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (true == lpPreItem->IsSet(DetailData::STACKABLE))
{
if (lpPreItem->GetItemInfo().m_usProtoTypeID == usProtoTypeID)
{
if (lpPreItem->GetNumOrDurability() + cNum <= lpPreItem->GetMaxNumOrDurability())
{
return true;
}
}
}
ERRLOG4(g_Log, "CID:%10u (%d,%d,%d) <20>̹<EFBFBD> <20><> <20><><EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
m_dwCID, cX, cY, cTab);
return false;
}
}
}
return true;
}
bool CInventoryContainer::RemoveItem(ItemPos itemPos)
{
CItem* lpItem = GetItem(itemPos);
if (NULL == lpItem)
{
return false;
}
if (false == m_bAdminToolFlag)
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_dwCID);
if (NULL == lpCharacter)
{
return false;
}
// <20><><EFBFBD><EFBFBD>Ʈ Ʈ<><C6AE><EFBFBD><EFBFBD> <20>ߵ<EFBFBD>
short wCount = (true == lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() * (-1) : -1;
lpCharacter->CheckTrigger(Quest::TRIGGER_PICK, lpItem->GetPrototypeID(), Position(), wCount);
}
return CArrayContainer::RemoveItem(itemPos);
}
ItemPos CInventoryContainer::GetBlankPos(unsigned short wProtoTypeID, unsigned char cNum, bool bStack, CItem** ppPrevItem)
{
Item::ItemPos DstPos;
DstPos.m_cPos = TakeType::TS_NONE;
const Item::ItemInfo* lpItemInfo = Item::CItemMgr::GetInstance().GetItemInfo(wProtoTypeID);
if (NULL != lpItemInfo)
{
unsigned char cHeight, cWidth, cTab;
unsigned char cXSize = lpItemInfo->m_DetailData.m_cXSize;
unsigned char cYSize = lpItemInfo->m_DetailData.m_cYSize;
// <20><><EFBFBD><EFBFBD>Ʈ <20><> üũ
unsigned char cItemType = lpItemInfo->m_DetailData.m_cItemType;
unsigned char cStartTab = 0;
unsigned char cEndTab = m_nTabNum;
/*
// edith 2008.06.04 <20>κ<EFBFBD><CEBA><20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
unsigned char cEndTab = m_nTabNum - 1;
if (Item::ItemType::QUEST_ITEM == cItemType)
{
cStartTab = m_nTabNum - 1;
cEndTab = m_nTabNum;
}
*/
if (DetailData::STACKABLE == (lpItemInfo->m_DetailData.m_dwFlags & DetailData::STACKABLE) && true == bStack)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4> ã<>´<EFBFBD>.
for (cTab = cStartTab; cTab < cEndTab; ++cTab)
{
for (cHeight = 0; cHeight < m_nYSize; ++cHeight)
{
if (cHeight + cYSize> m_nYSize)
{
// YSize<7A><65> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EEB3AA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
break;
}
for (cWidth = 0; cWidth < m_nXSize; ++cWidth)
{
if (cWidth + cXSize > m_nXSize)
{
// XSize<7A><65> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EEB3AA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
break;
}
CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cHeight + cWidth];
if (NULL != lpItem)
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
if (false == lpItem->IsSet(DetailData::EQUIP))
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>, ȹ<><C8B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD>, Max <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>,
// <20>ش<EFBFBD> <20>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD>ý<EFBFBD>Ų<EFBFBD><C5B2>.
if (lpItem->GetItemInfo().m_usProtoTypeID == wProtoTypeID)
{
if (lpItem->GetNumOrDurability() + cNum <= lpItem->GetMaxNumOrDurability())
{
*ppPrevItem = lpItem;
DstPos.m_cPos = TakeType::TS_INVEN;
DstPos.SetPos(cWidth, cHeight, cTab);
return DstPos;
}
}
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ų<EFBFBD>, <20>ٸ<EFBFBD><D9B8>ų<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>.
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>´<EFBFBD>.
for (cTab = cStartTab; cTab < cEndTab; ++cTab)
{
for (cHeight = 0; cHeight < m_nYSize; ++cHeight)
{
if (cHeight + cYSize> m_nYSize)
{
// YSize<7A><65> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EEB3AA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
break;
}
for (cWidth = 0; cWidth < m_nXSize; ++cWidth)
{
if (cWidth + cXSize > m_nXSize)
{
// XSize<7A><65> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EEB3AA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
break;
}
CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cHeight + cWidth];
if (NULL == lpItem)
{
unsigned char cX, cY;
lpItem = NULL;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ĭ<≯<EFBFBD> ũ<><20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD> üũ
for (cX = cWidth; cX < cWidth + cXSize; ++cX)
{
for (cY = cHeight; cY < cHeight + cYSize; ++cY)
{
lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX];
if (NULL != lpItem)
{
break;
}
}
if (NULL != lpItem)
{
break;
}
}
if (NULL == lpItem)
{
DstPos.m_cPos = TakeType::TS_INVEN;
DstPos.SetPos(cWidth, cHeight, cTab);
return DstPos;
}
}
}
}
}
}
return DstPos;
}

View File

@@ -0,0 +1,32 @@
#ifndef _INVENTORY_CONTAINER_H_
#define _INVENTORY_CONTAINER_H_
#include "ItemContainer.h"
namespace Item
{
class CItem;
class CInventoryContainer : public CArrayContainer
{
public:
CInventoryContainer();
virtual ~CInventoryContainer();
ItemPos GetBlankPos(unsigned short wProtoTypeID, unsigned char cNum, bool bStack, CItem** ppPrevItem);
bool TestItem(ItemPos itemPos, unsigned short usProtoTypeID, unsigned char cNum);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
void SetAdminTool(void) { m_bAdminToolFlag = true; }
private:
bool m_bAdminToolFlag;
};
};
#endif

View File

@@ -0,0 +1,769 @@
#include "stdafx.h"
#include <Pattern/Singleton.h>
#include <Utility/Math/Math.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Creature/CreatureManager.h>
#include <Creature/Character/Character.h>
#include <Item/Item.h>
#include <Item/ItemMgr.h>
#include <Item/ItemFactory.h>
#include "ItemContainer.h"
namespace Item
{
class CNullItem : public CItem, public CSingleton<CNullItem>
{
public:
virtual ~CNullItem() { }
private:
CNullItem(const ItemInfo& itemInfo) : CItem(itemInfo) { }
static ItemInfo ms_thisiteminfo;
static CNullItem ms_this;
};
};
Item::ItemInfo Item::CNullItem::ms_thisiteminfo(0xFFFF);
Item::CNullItem Item::CNullItem::ms_this(Item::CNullItem::ms_thisiteminfo);
size_t LogErrorItem(unsigned long dwCID, const char* szDetail, const char* szBuffer)
{
const int MIN_BUFFER = 64;
char szItemUID[MIN_BUFFER];
const Item::ItemData* lpItemData = reinterpret_cast<const Item::ItemData*>(szBuffer);
Math::Convert::Hex64ToStr(szItemUID, lpItemData->m_dwUID);
ERRLOG4(g_Log, "CID:%10u %s. UID:%s, ProtoTypeID:%d",
dwCID, szDetail, szItemUID, lpItemData->m_usProtoTypeID);
return lpItemData->m_cItemSize;
}
// ----------------------------------------------------------------------------------------
// CItemContainer
Item::CItemContainer::CItemContainer()
: m_dwCID(0), m_nMaxSize(0), m_lpNullItem(&CNullItem::GetInstance()),
m_lppItems(NULL), m_usFlags(0)
{
}
Item::CItemContainer::~CItemContainer()
{
Destroy();
}
bool Item::CItemContainer::Initialize(unsigned long dwCID, unsigned short nMaxSize)
{
Destroy();
m_dwCID = dwCID;
m_nMaxSize = nMaxSize;
m_lppItems = new CItem*[m_nMaxSize];
if(NULL != m_lppItems)
{
std::fill_n(m_lppItems, m_nMaxSize, reinterpret_cast<CItem*>(NULL));
return true;
}
return false;
}
void Item::CItemContainer::ClearItems()
{
if(NULL != m_lppItems)
{
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
// edith 2010.01.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// for (; lppItem != lppItemPastEnd; ++lppItem)
for (int i = 0; i < m_nMaxSize; ++i, ++lppItem)
{
CItem* lpItem = *lppItem;
if(NULL != lpItem && m_lpNullItem != lpItem)
{
DELETE_ITEM(lpItem);
}
}
std::fill_n(m_lppItems, m_nMaxSize, reinterpret_cast<CItem*>(NULL));
}
}
void Item::CItemContainer::Destroy()
{
if(NULL != m_lppItems)
{
ClearItems();
delete [] m_lppItems;
m_lppItems = NULL;
}
}
void Item::CItemContainer::DumpItemInfo()
{
const int MIN_BUFFER = 32;
const int MAX_BUFFER = 256;
char szUID[MIN_BUFFER];
char szBuffer[MAX_BUFFER];
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
// edith 2010.01.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// for (; lppItem != lppItemPastEnd; ++lppItem)
for (int i = 0; i < m_nMaxSize; ++i, ++lppItem)
{
const CItem* lpItem = *lppItem;
if(NULL != lpItem && m_lpNullItem != lpItem)
{
Math::Convert::Hex64ToStr(szUID, lpItem->GetUID());
const ItemPos itemPos = lpItem->GetPos();
const DetailData& detailData = lpItem->GetItemInfo().m_DetailData;
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
_snprintf(szBuffer, MAX_BUFFER, "CID:%10u <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>. UID: %s <20><><EFBFBD><EFBFBD>ID : %5d,"
" <20><>ǥ:(%d - %2d,%2d,%2d), ũ<><C5A9>:(%2d, %2d), <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>):%2d",
m_dwCID, szUID, lpItem->GetPrototypeID(), itemPos.m_cIndex, cX, cY, cTab,
detailData.m_cXSize, detailData.m_cXSize, lpItem->GetNumOrDurability());
ERRLOG1(g_Log, "%s", szBuffer);
}
}
}
void Item::CItemContainer::DumpMoneyInfo(unsigned long dwDepositMoney)
{
}
bool Item::CItemContainer::SerializeOut(char* szItemBuffer_Out, unsigned long& dwBufferSize_InOut) const
{
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
size_t nRemainBufferSize = static_cast<size_t>(dwBufferSize_InOut);
size_t nWritten = 0;
// edith 2010.01.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// for (; lppItem != lppItemPastEnd; ++lppItem)
for (int i = 0; i < m_nMaxSize; ++i, ++lppItem)
{
CItem* lpItem = *lppItem;
if(NULL != lpItem && m_lpNullItem != lpItem)
{
size_t nItemSize = nRemainBufferSize;
// 3<><33> <20><EFBFBD><EBB7B1> <20><>ġ (S<>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѽ<EFBFBD> <20><><EFBFBD><EFBFBD>)
lpItem->RevisionLimit();
if(!lpItem->SerializeOut(szItemBuffer_Out + nWritten, nItemSize))
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SerializeOut<75><74> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><> ũ<><C5A9>:%d, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>:%d",
m_dwCID, nWritten, nRemainBufferSize);
return false;
}
nWritten += nItemSize;
nRemainBufferSize -= nItemSize;
}
}
dwBufferSize_InOut = static_cast<unsigned long>(nWritten);
return true;
}
// ----------------------------------------------------------------------------------------
// CArrayContainer
Item::CArrayContainer::CArrayContainer()
{
}
Item::CArrayContainer::~CArrayContainer()
{
}
bool Item::CArrayContainer::Initialize(unsigned long dwCID, unsigned char nXSize, unsigned char nYSize, unsigned char nTabNum)
{
m_dwCID = dwCID;
m_nXSize = nXSize;
m_nYSize = nYSize;
m_nTabNum = nTabNum;
m_nSizePerTab = nXSize * nYSize;
return CItemContainer::Initialize(dwCID, nXSize * nYSize * nTabNum);
}
Item::CItem* Item::CArrayContainer::GetItem(Item::ItemPos itemPos)
{
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
if(m_nXSize <= cX || m_nYSize <= cY || m_nTabNum <= cTab)
{
ERRLOG7(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. X:%d/%d, Y:%d/%d, Tab:%d/%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum);
return NULL;
}
CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX];
return (lpItem != m_lpNullItem) ? lpItem : NULL;
}
bool Item::CArrayContainer::SetItem(Item::ItemPos itemPos, Item::CItem* lpItem)
{
if(NULL == lpItem)
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL<4C>Դϴ<D4B4>.", m_dwCID);
return false;
}
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
unsigned char cXSize = lpItem->GetItemInfo().m_DetailData.m_cXSize;
unsigned char cYSize = lpItem->GetItemInfo().m_DetailData.m_cYSize;
if(m_nXSize < static_cast<size_t>(cX + cXSize) ||
m_nYSize < static_cast<size_t>(cY + cYSize) || m_nTabNum <= cTab)
{
ERRLOG9(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. "
"X:%d/%d, Y:%d/%d, Tab:%d/%d, Xũ<58><C5A9>:%d, Yũ<59><C5A9>:%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum, cXSize, cYSize);
return false;
}
CItem** lppItemYIndexPastEnd = m_lppItems + m_nSizePerTab * cTab + m_nXSize * (cY + cYSize);
CItem **lppItemYIndex, **lppItemXIndex, **lppItemXIndexPastEnd;
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
if(0 != *lppItemXIndex)
{
ERRLOG4(g_Log, "CID:%10u (%d,%d,%d) <20>̹<EFBFBD> <20><> <20><><EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>.",
m_dwCID, cX, cY, cTab);
return false;
}
}
}
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
*lppItemXIndex = m_lpNullItem;
}
}
m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX] = lpItem;
lpItem->MoveItem(itemPos);
return true;
}
bool Item::CArrayContainer::RemoveItem(Item::ItemPos itemPos)
{
unsigned char cX, cY, cTab;
itemPos.GetPos(cX, cY, cTab);
if(m_nXSize <= cX || m_nYSize <= cY || m_nTabNum <= cTab)
{
ERRLOG7(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. X:%d/%d, Y:%d/%d, Tab:%d/%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum);
return false;
}
CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cY + cX];
if(NULL == lpItem || m_lpNullItem == lpItem)
{
ERRLOG4(g_Log, "CID:%10u <20><> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. X:%d, Y:%d, Tab:%d", m_dwCID, cX, cY, cTab);
return false;
}
unsigned char cXSize = lpItem->GetItemInfo().m_DetailData.m_cXSize;
unsigned char cYSize = lpItem->GetItemInfo().m_DetailData.m_cYSize;
if(m_nXSize < static_cast<size_t>(cX + cXSize) ||
m_nYSize < static_cast<size_t>(cY + cYSize))
{
ERRLOG9(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ <20><> ũ<><20>ùٸ<C3B9><D9B8><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. "
"X:%d/%d, Y:%d/%d, Tab:%d/%d, Xũ<58><C5A9>:%d, Yũ<59><C5A9>:%d",
m_dwCID, cX, m_nXSize, cY, m_nYSize, cTab, m_nTabNum, cXSize, cYSize);
return false;
}
CItem** lppItemYIndexPastEnd = m_lppItems + m_nSizePerTab * cTab + m_nXSize * (cY + cYSize);
CItem **lppItemYIndex, **lppItemXIndex, **lppItemXIndexPastEnd;
for (lppItemYIndex = m_lppItems + m_nSizePerTab * cTab + cY * m_nXSize;
lppItemYIndex != lppItemYIndexPastEnd; lppItemYIndex += m_nXSize)
{
lppItemXIndexPastEnd = lppItemYIndex + cX + cXSize;
for (lppItemXIndex = lppItemYIndex + cX;
lppItemXIndex != lppItemXIndexPastEnd; ++lppItemXIndex)
{
*lppItemXIndex = NULL;
}
}
return true;
}
unsigned short Item::CArrayContainer::GetItemNum(unsigned short usProtoTypeID)
{
unsigned short wCount = 0;
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
const CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL == lpItem) { continue; }
if (usProtoTypeID == lpItem->GetPrototypeID())
{
wCount += (lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
}
}
}
}
return wCount;
}
bool Item::CArrayContainer::DisappearItem(unsigned short wItemID, unsigned short wItemNum,
vector<Item::ItemGarbage>& vecItemGarbage)
{
unsigned short tempItemNum = GetItemNum(wItemID);
if (wItemNum > tempItemNum)
{
DETLOG3(g_Log, "DisappearItem = <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. ItemID:%d, ItemNum:%d/%d", wItemID, tempItemNum, wItemNum);
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> short <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ
short itemNum = static_cast<short>(wItemNum);
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL == lpItem) { continue; }
if (wItemID == lpItem->GetPrototypeID())
{
itemNum -= (lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
if (0 < itemNum)
{
vecItemGarbage.push_back(ItemGarbage(lpItem, 0));
}
else if (0 == itemNum)
{
vecItemGarbage.push_back(ItemGarbage(lpItem, 0));
return true;
}
else if (0 > itemNum)
{
unsigned char cRemainNum = static_cast<unsigned char>( -itemNum );
vecItemGarbage.push_back(ItemGarbage(lpItem, cRemainNum));
return true;
}
}
}
}
}
return false;
}
bool Item::CArrayContainer::DisappearItem(unsigned short wItemID, unsigned short wItemNum)
{
if (wItemNum > GetItemNum(wItemID))
{
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> short <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ
short itemNum = static_cast<short>(wItemNum);
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL == lpItem) { continue; }
if (wItemID == lpItem->GetPrototypeID())
{
itemNum -= (lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
CCharacter* lpOwner = CCreatureManager::GetInstance().GetCharacter(m_dwCID);
if (NULL == lpOwner) { return false; }
CGameClientDispatch* lpDispatch = lpOwner->GetDispatcher();
if (0 < itemNum)
{
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDisappearItem(lpDispatch->GetSendStream(),
m_dwCID, lpItem->GetPos(), 0, PktDisappearItem::DIC_LINKED_QUEST, PktBase::NO_SERVER_ERR);
}
RemoveItem(lpItem->GetPos());
DELETE_ITEM(lpItem);
}
else if (0 == itemNum)
{
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDisappearItem(lpDispatch->GetSendStream(),
m_dwCID, lpItem->GetPos(), 0, PktDisappearItem::DIC_LINKED_QUEST, PktBase::NO_SERVER_ERR);
}
RemoveItem(lpItem->GetPos());
DELETE_ITEM(lpItem);
return true;
}
else if (0 > itemNum)
{
unsigned char cRemainNum = static_cast<unsigned char>( -itemNum );
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharDisappearItem(lpDispatch->GetSendStream(),
m_dwCID, lpItem->GetPos(), cRemainNum, PktDisappearItem::DIC_LINKED_QUEST, PktBase::NO_SERVER_ERR);
}
lpItem->SetNumOrDurability(cRemainNum);
return true;
}
}
}
}
}
return false;
}
void Item::CArrayContainer::DumpItemInfo()
{
const int MAX_LINE = 1024;
char szLine[MAX_LINE];
int nBufferPos = 0;
ERRLOG1(g_Log, "CID:%10u <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α׸<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", m_dwCID);
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
ERRLOG2(g_Log, "CID:%10u <20><> <20><> %d<><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.", m_dwCID, nTab);
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
nBufferPos = _snprintf(szLine, MAX_LINE, "CID:%10u <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>. ", m_dwCID);
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
const CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
nBufferPos += _snprintf(szLine + nBufferPos, MAX_LINE, " %5d ",
((0 != lpItem) ? lpItem->GetPrototypeID() : 0));
}
ERRLOG0(g_Log, szLine);
}
}
CItemContainer::DumpItemInfo();
}
void Item::CArrayContainer::DumpMoneyInfo(unsigned long dwDepositMoney)
{
CItemContainer::DumpMoneyInfo(dwDepositMoney);
}
bool Item::CArrayContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
size_t nBufferSize = static_cast<size_t>(dwBufferSize_In);
size_t nUsed = 0;
Item::CItemFactory& ItemFactory = CItemFactory::GetInstance();
while(nBufferSize > 0)
{
size_t nItemSize = nBufferSize;
Item::CItem* lpItem = ItemFactory.CreateItem(szItemBuffer_In + nUsed, nItemSize);
// edith 2008.08.26 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if(NULL == lpItem)
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
break; // <20>ּ<EFBFBD>..
}
else if(!CArrayContainer::SetItem(lpItem->GetPos(), lpItem))
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
DELETE_ITEM(lpItem);
break;
}
nUsed += nItemSize;
nBufferSize -= nItemSize;
}
return true;
}
// ----------------------------------------------------------------------------------------
// CListContainer
Item::CListContainer::CListContainer()
{
}
Item::CListContainer::~CListContainer()
{
}
Item::CItem* Item::CListContainer::GetItem(Item::ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
CItem* lpItem = m_lppItems[itemPos.m_cIndex];
return (lpItem != m_lpNullItem) ? lpItem : NULL;
}
return NULL;
}
bool Item::CListContainer::SetItem(Item::ItemPos itemPos, Item::CItem* lpItem)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL == m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = lpItem;
lpItem->MoveItem(itemPos);
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", m_dwCID);
}
}
return false;
}
bool Item::CListContainer::RemoveItem(Item::ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL != m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = NULL;
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.", m_dwCID);
}
}
return false;
}
bool Item::CListContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
size_t nBufferSize = static_cast<size_t>(dwBufferSize_In);
size_t nUsed = 0;
Item::CItemFactory& ItemFactory = CItemFactory::GetInstance();
while(nBufferSize > 0)
{
size_t nItemSize = nBufferSize;
Item::CItem* lpItem = ItemFactory.CreateItem(szItemBuffer_In + nUsed, nItemSize);
if(NULL == lpItem)
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
}
else if(!CListContainer::SetItem(lpItem->GetPos(), lpItem))
{
nItemSize = LogErrorItem(m_dwCID, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>", szItemBuffer_In + nUsed);
DELETE_ITEM(lpItem);
}
nUsed += nItemSize;
nBufferSize -= nItemSize;
}
return true;
}
// ----------------------------------------------------------------------------------------
// CSEQListContainer
Item::CSEQListContainer::CSEQListContainer() : m_ListCount(0)
{
}
Item::CSEQListContainer::~CSEQListContainer()
{
}
Item::CItem* Item::CSEQListContainer::GetItem(ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
CItem* lpItem = m_lppItems[itemPos.m_cIndex];
return (lpItem != m_lpNullItem) ? lpItem : NULL;
}
return NULL;
}
bool Item::CSEQListContainer::SetItem(ItemPos itemPos, Item::CItem* lpItem)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL == m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = lpItem;
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.", m_dwCID);
}
}
return false;
}
bool Item::CSEQListContainer::RemoveItem(Item::ItemPos itemPos)
{
if(itemPos.m_cIndex < m_nMaxSize)
{
if(NULL != m_lppItems[itemPos.m_cIndex])
{
m_lppItems[itemPos.m_cIndex] = NULL;
return true;
}
else
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.", m_dwCID);
}
}
return false;
}
bool Item::CSEQListContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
size_t nBufferSize = static_cast<size_t>(dwBufferSize_In);
size_t nUsed = 0;
Item::CItemFactory& ItemFactory = CItemFactory::GetInstance();
m_ListCount = 0;
while(nBufferSize > 0)
{
size_t nItemSize = nBufferSize;
// ȭ<><C8AD>/<2F><>Ʈ
unsigned short ProtoTypeID = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_usProtoTypeID;
if(ProtoTypeID >= 4001 && ProtoTypeID <= 4033)
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
if(20 != nItemSize)
{
ERRLOG1(g_Log, "CID:%10u <20>̻<EFBFBD><CCBB><EFBFBD> ȭ<><C8AD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
nUsed += nItemSize;
nBufferSize -= nItemSize;
continue;
}
}
Item::CItem* lpItem = ItemFactory.CreateItem(szItemBuffer_In + nUsed, nItemSize);
if(NULL == lpItem)
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
}
else if(!CSEQListContainer::SetItem(ItemPos(0, m_ListCount), lpItem))
{
nItemSize = reinterpret_cast<const Item::ItemData*>(szItemBuffer_In + nUsed)->m_cItemSize;
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.", m_dwCID);
DELETE_ITEM(lpItem);
}
nUsed += nItemSize;
nBufferSize -= nItemSize;
++m_ListCount;
}
return true;
}

View File

@@ -0,0 +1,145 @@
#ifndef _ITEM_CONTAINER_H_
#define _ITEM_CONTAINER_H_
#include <vector>
#include <Item/ItemStructure.h>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
namespace Item
{
class CItem;
class CItemContainer
{
public:
CItemContainer();
virtual ~CItemContainer();
bool Initialize(unsigned long dwCID, unsigned short nMaxSize);
void SetCID(unsigned long dwCID) { m_dwCID = dwCID; }
void ClearItems();
virtual CItem* GetItem(ItemPos itemPos) = 0;
virtual bool SetItem(ItemPos itemPos, CItem* lpItem) = 0;
virtual bool RemoveItem(ItemPos itemPos) = 0;
virtual bool SerializeOut(char* szItemBuffer_Out, unsigned long& dwBufferSize_InOut) const;
virtual bool SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_InOut) = 0;
virtual void DumpItemInfo();
virtual void DumpMoneyInfo(unsigned long dwDepoistMoney);
class iterator
{
public:
iterator(CItem** lppItem, CItem* lpNull_Item, unsigned short usOffset) : m_lppItems(lppItem), m_lpNullItem(lpNull_Item), m_nCurrentPos(usOffset) { }
iterator() : m_lppItems(NULL), m_lpNullItem(NULL), m_nCurrentPos(0) { }
CItem* operator*() { return (m_lpNullItem != *(m_lppItems + m_nCurrentPos)) ? *(m_lppItems + m_nCurrentPos) : NULL; }
iterator& operator++() { ++m_nCurrentPos; return (*this); }
bool operator==(const iterator& _Right) const
{ // test for iterator equality
return (m_nCurrentPos == _Right.m_nCurrentPos && m_lppItems == _Right.m_lppItems
&& m_lpNullItem == _Right.m_lpNullItem);
}
bool operator!=(const iterator& _Right) const
{ // test for iterator inequality
return (!(*this == _Right));
}
private:
CItem** m_lppItems;
CItem* m_lpNullItem;
unsigned short m_nCurrentPos;
};
iterator begin() const { return iterator(m_lppItems, m_lpNullItem, 0); }
iterator end() const { return iterator(m_lppItems, m_lpNullItem, m_nMaxSize); }
protected:
virtual void Destroy();
CItem** m_lppItems;
CItem* m_lpNullItem;
unsigned long m_dwCID;
unsigned short m_nMaxSize;
unsigned short m_usFlags;
friend class iterator;
};
class CArrayContainer : public CItemContainer
{
public:
CArrayContainer();
virtual ~CArrayContainer();
bool Initialize(unsigned long dwCID, unsigned char nXSize, unsigned char nYSize, unsigned char nTabNum);
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
virtual unsigned short GetItemNum(unsigned short usProtoTypeID);
virtual bool SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In);
virtual void DumpItemInfo();
virtual void DumpMoneyInfo(unsigned long dwDepoistMoney);
bool DisappearItem(unsigned short wItemID, unsigned short wItemNum, std::vector<Item::ItemGarbage>& vecItemGarbage);
bool DisappearItem(unsigned short wItemID, unsigned short wItemNum);
protected:
unsigned char m_nXSize;
unsigned char m_nYSize;
unsigned char m_nTabNum;
unsigned char m_nSizePerTab;
};
class CListContainer : public CItemContainer
{
public:
CListContainer();
virtual ~CListContainer();
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
virtual bool SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In);
};
class CSEQListContainer : public CItemContainer
{
public:
CSEQListContainer();
virtual ~CSEQListContainer();
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
virtual bool SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In);
private:
unsigned short m_ListCount;
public:
unsigned short GetListCount(void) { return m_ListCount; }
};
};
#endif

View File

@@ -0,0 +1,775 @@
#include "stdafx.h"
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
#include <Network/Packet/WrapPacket.h>
#include <Network/Packet/PacketCommand.h>
#include <Network/Packet/ChatPacket.h>
#include <Network/Stream/SendStream.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharCommunity.h>
#include <Creature/Character/Character.h>
#include <Creature/Siege/CampShop.h>
#include <Community/Guild/Guild.h>
#include <Community/Guild/GuildMgr.h>
#include <Item/Item.h>
#include <Item/ItemFactory.h>
#include <Map/FieldMap/Cell.h>
#include <Log/ItemLog.h>
#include <Utility/Math/Math.h>
#include "StallContainer.h"
#include "ContainerConstant.h"
using namespace Item;
// ------------------------------------------------------------------------------------------
// CShopContainer
CShopContainer::CShopContainer()
{
Clear();
}
CShopContainer::~CShopContainer()
{
Destroy();
}
bool CShopContainer::Initialize(unsigned long dwCID, unsigned char cWidth, unsigned char cHeight)
{
return CArrayContainer::Initialize(dwCID, cWidth, cHeight, 1);
}
void CShopContainer::Clear(void)
{
std::fill_n(m_aryCustomerID, int(MAX_CUSTOMER_NUM), 0);
}
void CShopContainer::Destroy(void)
{
if (NULL != m_lppItems)
{
delete [] m_lppItems;
m_lppItems = NULL;
}
}
CItem* CShopContainer::GetItem(ItemPos itemPos)
{
return CArrayContainer::GetItem(itemPos);
}
bool CShopContainer::RemoveItem(ItemPos itemPos)
{
CItem* lpItem = GetItem(itemPos);
if (NULL != lpItem)
{
lpItem->SetStallPrice(0);
if (true == CArrayContainer::RemoveItem(itemPos))
{
lpItem->MoveItem(lpItem->GetPos());
return true;
}
}
return false;
}
bool CShopContainer::Enter(CCharacter* lpCustomer)
{
if (NULL != lpCustomer && 0 != m_dwCID)
{
for (int nIndex = 0; nIndex < MAX_CUSTOMER_NUM; nIndex++)
{
if (0 == m_aryCustomerID[nIndex])
{
m_aryCustomerID[nIndex] = lpCustomer->GetCID();
lpCustomer->GetStall().SetOtherOwner(m_dwCID);
SendCharStallItemInfo(lpCustomer);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD>(<28>մ<EFBFBD>CID)
CAggresiveCreature* lpCreature = CCreatureManager::GetInstance().GetAggresiveCreature(m_dwCID);
if (NULL != lpCreature)
{
GAMELOG::LogStallEnterLeave(*lpCreature, lpCustomer->GetCID(), true);
}
return true;
}
}
}
return false;
}
bool CShopContainer::Leave(CCharacter* lpCustomer)
{
if (NULL != lpCustomer && 0 != m_dwCID)
{
for (int nIndex = 0; nIndex < MAX_CUSTOMER_NUM; nIndex++)
{
if (m_aryCustomerID[nIndex] == lpCustomer->GetCID())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD>(<28>մ<EFBFBD>CID)
CAggresiveCreature* lpCreature = CCreatureManager::GetInstance().GetAggresiveCreature(m_dwCID);
if (NULL != lpCreature)
{
GAMELOG::LogStallEnterLeave(*lpCreature, lpCustomer->GetCID(), false);
}
lpCustomer->GetStall().SetOtherOwner(0);
std::copy(m_aryCustomerID + nIndex + 1, m_aryCustomerID + MAX_CUSTOMER_NUM, m_aryCustomerID + nIndex);
m_aryCustomerID[MAX_CUSTOMER_NUM - 1] = 0;
return true;
}
}
}
return false;
}
unsigned char CShopContainer::GetCurrentCustomerNum(void)
{
unsigned char cCurrentNum = 0;
for (int nIndex = 0; nIndex < MAX_CUSTOMER_NUM; ++nIndex)
{
if (0 != m_aryCustomerID[nIndex])
{
++cCurrentNum;
}
}
return cCurrentNum;
}
void CShopContainer::SwapPosAllItem(void)
{
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
for (; lppItem != lppItemPastEnd; ++lppItem)
{
CItem* lpItem = *lppItem;
if (NULL != lpItem && m_lpNullItem != lpItem)
{
lpItem->SwapPos();
}
}
}
bool CShopContainer::StallPriceOut(unsigned long* szStallPriceBuffer_Out, unsigned char& cItemNum_Out) const
{
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
for (; lppItem != lppItemPastEnd; ++lppItem)
{
CItem* lpItem = *lppItem;
if (NULL != lpItem && m_lpNullItem != lpItem)
{
szStallPriceBuffer_Out[cItemNum_Out] = lpItem->GetBuyPrice();
cItemNum_Out++;
}
}
return true;
}
bool CShopContainer::Close(void)
{
for (int nIndex = 0; nIndex < MAX_CUSTOMER_NUM && 0 != m_aryCustomerID[0]; ++nIndex)
{
CCharacter* lpCustomer = CCreatureManager::GetInstance().GetCharacter(m_aryCustomerID[0]);
if (NULL != lpCustomer)
{
// Leave <20>Լ<EFBFBD> <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> 0<><30> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>մ<EFBFBD><D5B4><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
Leave(lpCustomer);
CGameClientDispatch* lpDispatch = lpCustomer->GetDispatcher();
if (NULL != lpDispatch)
{
GameClientSendPacket::SendCharStallEnter(lpDispatch->GetSendStream(), lpCustomer->GetCID(), 0, 0);
}
}
}
Clear();
return true;
}
bool CShopContainer::SendAllCustomer(const char* szPacket, const unsigned long dwPacketSize,
bool bIncludeOwner, unsigned char cCMD_In)
{
for (int nIndex = 0; nIndex < MAX_CUSTOMER_NUM; nIndex++)
{
if (0 == m_aryCustomerID[nIndex]) { break; }
CCharacter* lpCustomer = CCreatureManager::GetInstance().GetCharacter(m_aryCustomerID[nIndex]);
if (NULL != lpCustomer)
{
CGameClientDispatch* lpDispatch = lpCustomer->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(szPacket, dwPacketSize, cCMD_In);
}
}
}
return true;
}
bool CShopContainer::SendRemoveItem(TakeType takeType, unsigned char cCmd, const char* strBuyUser)
{
PktStRI pktStRI;
pktStRI.m_dwCharID = m_dwCID;
pktStRI.m_dwShopID = m_dwCID;
pktStRI.m_TakeType = takeType;
pktStRI.m_dwPrice = 0;
pktStRI.m_cCmd = cCmd;
strcpy(pktStRI.m_BuyUser, strBuyUser);
char* szPacket = reinterpret_cast<char*>(&pktStRI);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktStRI), CmdCharStallRegisterItem, 0, PktBase::NO_SERVER_ERR))
{
return SendAllCustomer(szPacket, sizeof(PktStRI), true, CmdCharStallRegisterItem);
}
return false;
}
bool CShopContainer::SendCharStallEnter(unsigned long dwCustomerID, unsigned long dwOwnerID)
{
PktStE pktStE;
pktStE.m_dwCustomerID = dwCustomerID;
pktStE.m_dwOwnerID = dwOwnerID;
char* szPacket = reinterpret_cast<char*>(&pktStE);
if (PacketWrap::WrapCrypt(szPacket, sizeof(PktStE), CmdCharStallEnter, 0, 0))
{
return SendAllCustomer(szPacket, sizeof(PktStE), true, CmdCharStallEnter);
}
return false;
}
// ------------------------------------------------------------------------------------------
// CCharacterShopContainer
CCharacterShopContainer::CCharacterShopContainer()
: m_dwOtherOwnerID(0)
{
Clear();
}
CCharacterShopContainer::~CCharacterShopContainer()
{
Destroy();
}
void CCharacterShopContainer::Clear(void)
{
std::fill_n(m_strStallName, int(MAX_STALL_NAME_LEN), 0);
CShopContainer::Clear();
}
void CCharacterShopContainer::RollBackAllItem(void)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
const unsigned short nHeightPos = m_nXSize * nHeight;
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
CItem* lpItem = m_lppItems[nHeightPos + nWidth];
if (NULL == lpItem || m_lpNullItem == lpItem) { continue; }
lpItem->MoveItem(lpItem->GetPos());
lpItem->SetStallPrice(0);
}
}
std::fill_n(m_lppItems, int(m_nXSize*m_nYSize), reinterpret_cast<CItem*>(NULL));
}
bool CCharacterShopContainer::SetItem(ItemPos itemPos, CItem* lpItem)
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_dwCID);
if (NULL != lpCharacter)
{
if (false == lpCharacter->GetInventory().SetItem(lpItem->GetPos(), lpItem))
{
SERLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͻ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
lpCharacter->GetCID());
return false;
}
if (false == CArrayContainer::SetItem(itemPos, lpItem))
{
SERLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", lpCharacter->GetCID());
if (false == lpCharacter->GetInventory().RemoveItem(lpItem->GetPos()))
{
SERLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><> <20><>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.",
lpCharacter->GetCID());
}
return false;
}
const int MAX_BUFFER = sizeof(PktStIInfo) + MAX_ITEM_SIZE + sizeof(unsigned long);
char szBuffer[MAX_BUFFER];
lpItem->SwapPos();
size_t nItemSize = MAX_ITEM_SIZE;
lpItem->SerializeOut(szBuffer + sizeof(PktStIInfo), nItemSize);
if (0 == nItemSize) { return false; }
lpItem->SwapPos();
unsigned long* dwStallPrice = reinterpret_cast<unsigned long*>(szBuffer + sizeof(PktStIInfo) + nItemSize);
*dwStallPrice = lpItem->GetBuyPrice();
PktStIInfo* lpPktStIInfo = reinterpret_cast<PktStIInfo*>(szBuffer);
lpPktStIInfo->m_dwOwnerID = m_dwCID;
std::copy(m_aryCustomerID, m_aryCustomerID + MAX_CUSTOMER_NUM, lpPktStIInfo->m_dwCustomerID);
lpPktStIInfo->m_dwItemSize = static_cast<unsigned long>(nItemSize);
lpPktStIInfo->m_cItemNum = 1;
if (PacketWrap::WrapCrypt(szBuffer, static_cast<unsigned short>(sizeof(PktStIInfo) + nItemSize + sizeof(unsigned long)),
CmdCharStallItemInfo, 0, 0))
{
return SendAllCustomer(szBuffer,
static_cast<unsigned long>(sizeof(PktStIInfo) + nItemSize + sizeof(unsigned long)),
false, CmdCharStallItemInfo);
}
}
return false;
}
bool CCharacterShopContainer::Open(char *strStallName)
{
if (0 != strcmp(m_strStallName, "") || 0 == m_dwCID) { return false; }
strncpy(m_strStallName, strStallName, MAX_STALL_NAME_LEN);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD> : <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>)
CAggresiveCreature* lpCreature = CCreatureManager::GetInstance().GetAggresiveCreature(m_dwCID);
if (NULL != lpCreature)
{
GAMELOG::LogStallOpenClose(*lpCreature, m_strStallName, true);
}
return true;
}
bool CCharacterShopContainer::Close(void)
{
CShopContainer::Close();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD> : <20>ݱ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>)
CAggresiveCreature* lpCreature = CCreatureManager::GetInstance().GetAggresiveCreature(m_dwCID);
if (NULL != lpCreature)
{
GAMELOG::LogStallOpenClose(*lpCreature, m_strStallName, false);
}
RollBackAllItem();
return true;
}
bool CCharacterShopContainer::SendCharStallItemInfo(CCharacter *lpCustomer)
{
const int MAX_BUFFER = sizeof(PktStIInfo) +
((MAX_ITEM_SIZE + sizeof(unsigned long)) * ContainerConstant::STALL_WIDTH * ContainerConstant::STALL_HEIGHT);
char szBuffer[MAX_BUFFER];
SwapPosAllItem();
unsigned long dwItemSize = MAX_ITEM_SIZE * m_nXSize * m_nYSize;
SerializeOut(szBuffer + sizeof(PktStIInfo), dwItemSize);
SwapPosAllItem();
unsigned char cItemNum = 0;
StallPriceOut(reinterpret_cast<unsigned long*>(szBuffer + sizeof(PktStIInfo) + dwItemSize), cItemNum);
CGameClientDispatch* lpDispatch = lpCustomer->GetDispatcher();
if (NULL != lpDispatch)
{
return GameClientSendPacket::SendCharStallItemInfo(lpDispatch->GetSendStream(),
m_dwCID, m_aryCustomerID, 0, 0, szBuffer, dwItemSize, cItemNum);
}
return false;
}
bool CCharacterShopContainer::SendCharStallOpen(char *strStallName)
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_dwCID);
if (NULL != lpCharacter)
{
CCell* lpCell = lpCharacter->GetCellPos().m_lpCell;
if (NULL == lpCell)
{
ERRLOG1(g_Log, "CID:%10u <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", m_dwCID);
return false;
}
PktStO pktStO;
memset(&pktStO, 0, sizeof(PktStO));
pktStO.m_dwCharID = m_dwCID;
strncpy(pktStO.m_StallName, strStallName, PktStO::MAX_STALL_NAME_LEN);
pktStO.m_StallName[PktStO::MAX_STALL_NAME_LEN - 1] = 0;
lpCell->SendAllNearCellCharacter(&pktStO, sizeof(PktStO), CmdCharStallOpen);
return true;
}
return false;
}
bool CCharacterShopContainer::SendAllCustomer(const char* szPacket, const unsigned long dwPacketSize,
bool bIncludeOwner, unsigned char cCMD_In)
{
if (true == bIncludeOwner)
{
CCharacter* lpCharacter = CCreatureManager::GetInstance().GetCharacter(m_dwCID);
if (NULL != lpCharacter)
{
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
if (NULL != lpDispatch)
{
lpDispatch->GetSendStream().PutBuffer(szPacket, dwPacketSize, cCMD_In);
}
}
}
return CShopContainer::SendAllCustomer(szPacket, dwPacketSize, bIncludeOwner, cCMD_In);
}
// ------------------------------------------------------------------------------------------
// CCampShopContainer
CCampShopContainer::CCampShopContainer(void)
: m_cUpdateCount(0)
{
}
CCampShopContainer::~CCampShopContainer(void)
{
}
bool CCampShopContainer::SetItem(ItemPos itemPos, CItem* lpItem)
{
if (false == CArrayContainer::SetItem(itemPos, lpItem))
{
SERLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", m_dwCID);
return false;
}
const int MAX_BUFFER = sizeof(PktStIInfo) + MAX_ITEM_SIZE + sizeof(unsigned long);
char szBuffer[MAX_BUFFER];
size_t nItemSize = MAX_ITEM_SIZE;
lpItem->SerializeOut(szBuffer + sizeof(PktStIInfo), nItemSize);
if (0 == nItemSize) { return false; }
unsigned long* dwStallPrice = reinterpret_cast<unsigned long*>(szBuffer + sizeof(PktStIInfo) + nItemSize);
*dwStallPrice = lpItem->GetBuyPrice();
PktStIInfo* lpPktStIInfo = reinterpret_cast<PktStIInfo*>(szBuffer);
lpPktStIInfo->m_dwOwnerID = m_dwCID;
CCampShop* lpShop =
reinterpret_cast<CCampShop*>(CCreatureManager::GetInstance().GetSiegeObject(m_dwCID));
if (NULL != lpShop)
{
lpPktStIInfo->m_dwTempSafe = lpShop->GetTempSafe();
lpPktStIInfo->m_cTax = lpShop->GetTax();
}
std::copy(m_aryCustomerID, m_aryCustomerID + MAX_CUSTOMER_NUM, lpPktStIInfo->m_dwCustomerID);
lpPktStIInfo->m_dwItemSize = static_cast<unsigned long>(nItemSize);
lpPktStIInfo->m_cItemNum = 1;
if (PacketWrap::WrapCrypt(szBuffer, static_cast<unsigned short>(sizeof(PktStIInfo) + nItemSize + sizeof(unsigned long)),
CmdCharStallItemInfo, 0, 0))
{
IncreaseUpdateCount();
return SendAllCustomer(szBuffer,
static_cast<unsigned long>(sizeof(PktStIInfo) + nItemSize + sizeof(unsigned long)),
false, CmdCharStallItemInfo);
}
return false;
}
bool CCampShopContainer::RemoveItem(ItemPos itemPos)
{
IncreaseUpdateCount();
return CShopContainer::RemoveItem(itemPos);
}
void CCampShopContainer::DropItem(CCell* lpCell, const Position& currentPos, unsigned long dwOffencerGID)
{
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL != lpItem)
{
RemoveItem(lpItem->GetPos());
// <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD>̽<EFBFBD><CCBD>̹Ƿ<CCB9> <20>ȸ<EFBFBD> <20><>ó<EFBFBD><C3B3> <20><><EFBFBD>δ<EFBFBD>.
unsigned char cNum = (lpItem->IsSet(DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
SendRemoveItem(TakeType::TakeType(lpItem->GetPos(), ItemPos(), cNum), PktStRI::SC_CAMP_SELL, "");
CCell::ItemInfo itemInfo;
const Position Pos(currentPos.m_fPointX + Math::Random::ComplexRandom(40) - 20,
currentPos.m_fPointY,
currentPos.m_fPointZ + Math::Random::ComplexRandom(40) - 20);
lpCell->SetItem(Pos, lpItem, 0, dwOffencerGID,
(0 == dwOffencerGID) ? CCell::NONE : CCell::GUILD, itemInfo);
}
}
}
}
}
bool CCampShopContainer::StallPriceIn(const unsigned long* szStallPriceBuffer_In, unsigned char cItemNum_In)
{
CItem** lppItem = m_lppItems;
CItem** lppItemPastEnd = m_lppItems + m_nMaxSize;
unsigned char cItemIndex = 0;
for (; lppItem != lppItemPastEnd; ++lppItem)
{
CItem* lpItem = *lppItem;
if (NULL != lpItem && m_lpNullItem != lpItem)
{
if (cItemIndex >= cItemNum_In)
{
ERRLOG1(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.", m_dwCID);
return false;
}
lpItem->SetStallPrice(szStallPriceBuffer_In[cItemIndex]);
++cItemIndex;
}
}
return true;
}
bool CCampShopContainer::SendCharStallItemInfo(CCharacter *lpCustomer)
{
CGameClientDispatch* lpDispatch = lpCustomer->GetDispatcher();
if (NULL != lpDispatch)
{
return SendCharStallItemInfo(lpDispatch->GetSendStream());
}
return false;
}
CItem* CCampShopContainer::RegisterCancelItem(CCharacter* lpCharacter, TakeType takeType, unsigned long dwPrice, unsigned char cCmd)
{
CCampShop* lpShop =
reinterpret_cast<CCampShop*>(CCreatureManager::GetInstance().GetSiegeObject(m_dwCID));
if (NULL != lpShop)
{
if (lpCharacter->GetGID() != lpShop->GetGID())
{
ERRLOG4(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>. "
"SenderID:%10u, SenderGID:%10u, CampID:%10u, CampGID:%10u",
lpCharacter->GetCID(), lpCharacter->GetGID(), m_dwCID, lpShop->GetGID());
return NULL;
}
Guild::CGuild* lpGuild = Guild::CGuildMgr::GetInstance().GetGuild(lpCharacter->GetGID());
if (NULL == lpGuild)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. SenderID:%10u, SenderGID:%10u",
lpCharacter->GetCID(), lpCharacter->GetGID());
return NULL;
}
if (lpGuild->GetMaster().m_dwCID != lpCharacter->GetCID())
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><E5B8B6><EFBFBD>Ͱ<EFBFBD> <20>ƴմϴ<D5B4>. SenderID:%10u, SenderGID:%10u",
lpCharacter->GetCID(), lpCharacter->GetGID());
return NULL;
}
switch (cCmd)
{
case PktStRI::SC_CAMP_REGISTER:
{
if (takeType.m_dstPos.m_cPos != TakeType::TS_CAMPSHOP)
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD> <20>÷<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD>ϴ<EFBFBD>."
"RegisterPacket<EFBFBD><EFBFBD> DstPos<6F><73> Stall<6C><6C> <20>ƴմϴ<D5B4>.", lpCharacter->GetCID());
return NULL;
}
if (NULL != GetItem(takeType.m_dstPos))
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20><>ġ:(%d, 0x%04x)",
lpCharacter->GetCID(), takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex);
return NULL;
}
CItem* lpItem = lpCharacter->GetItem(takeType.m_srcPos);
if (NULL != lpItem)
{
if (false == lpItem->GetItemInfo().m_DetailData.m_bExchangeAndDrop )
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD> <20>÷<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD>ϴ<EFBFBD>."
"ExchangeAndDrop<EFBFBD><EFBFBD> TRUE<55><45> <20>ƴմϴ<D5B4>.", lpCharacter->GetCID());
return NULL;
}
if (true == lpCharacter->RemoveItem(takeType.m_srcPos))
{
lpItem->SetStallPrice(dwPrice);
if (true == SetItem(takeType.m_dstPos, lpItem))
{
return lpItem;
}
else
{
lpItem->SetStallPrice(0);
if (false == lpCharacter->SetItem(takeType.m_srcPos, lpItem))
{
SERLOG3(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : (%d, 0x%04x) <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.",
lpCharacter->GetCID(), takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex);
DELETE_ITEM(lpItem);
}
}
}
}
break;
}
case PktStRI::SC_CAMP_CANCEL:
{
if (takeType.m_srcPos.m_cPos != TakeType::TS_CAMPSHOP)
{
ERRLOG1(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>."
"CancelPacket<EFBFBD><EFBFBD> SrcPos<6F><73> Stall<6C><6C> <20>ƴմϴ<D5B4>.", lpCharacter->GetCID());
return NULL;
}
if (NULL != lpCharacter->GetItem(takeType.m_dstPos))
{
ERRLOG3(g_Log, "CID:%10u <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20><>ġ:(%d, 0x%04x)",
lpCharacter->GetCID(), takeType.m_dstPos.m_cPos, takeType.m_dstPos.m_cIndex);
return NULL;
}
CItem* lpItem = GetItem(takeType.m_srcPos);
if (NULL != lpItem)
{
if (true == RemoveItem(takeType.m_srcPos))
{
SendRemoveItem(takeType, PktStRI::SC_CAMP_CANCEL, "");
if (true == lpCharacter->SetItem(takeType.m_dstPos, lpItem))
{
return lpItem;
}
else
{
if (false == SetItem(takeType.m_srcPos, lpItem))
{
SERLOG3(g_Log, "CID:0x%08x <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD> : (%d, 0x%04x) <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.",
lpCharacter->GetCID(), takeType.m_srcPos.m_cPos, takeType.m_srcPos.m_cIndex);
DELETE_ITEM(lpItem);
}
}
}
}
break;
}
}
}
return NULL;
}
bool CCampShopContainer::CheckUpdateCount(void)
{
if (UPDATE_COUNT <= m_cUpdateCount)
{
m_cUpdateCount = 0;
return true;
}
return false;
}
bool CCampShopContainer::SendCharStallItemInfo(CSendStream& SendStream)
{
CCampShop* lpShop =
reinterpret_cast<CCampShop*>(CCreatureManager::GetInstance().GetSiegeObject(m_dwCID));
if (NULL != lpShop)
{
const int MAX_BUFFER = sizeof(PktStIInfo) +
((Item::MAX_ITEM_SIZE + sizeof(unsigned long)) *
ContainerConstant::CAMPSHOP_WIDTH * ContainerConstant::CAMPSHOP_HEIGHT);
char szBuffer[MAX_BUFFER];
unsigned long dwItemSize = Item::MAX_ITEM_SIZE * m_nXSize * m_nYSize;
SerializeOut(szBuffer + sizeof(PktStIInfo), dwItemSize);
unsigned char cItemNum = 0;
StallPriceOut(reinterpret_cast<unsigned long*>(szBuffer + sizeof(PktStIInfo) + dwItemSize), cItemNum);
return GameClientSendPacket::SendCharStallItemInfo(SendStream, m_dwCID, m_aryCustomerID,
lpShop->GetTempSafe(), lpShop->GetTax(), szBuffer, dwItemSize, cItemNum);
}
return false;
}
bool CCampShopContainer::IsEmpty() const
{
for (unsigned short nTab = 0; nTab < m_nTabNum; ++nTab)
{
for (unsigned short nHeight = 0; nHeight < m_nYSize; ++nHeight)
{
for (unsigned short nWidth = 0; nWidth < m_nXSize; ++nWidth)
{
const CItem* lpItem = m_lppItems[m_nSizePerTab * nTab + m_nXSize * nHeight + nWidth];
if (NULL != lpItem)
{
return false;
}
}
}
}
return true;
}

View File

@@ -0,0 +1,137 @@
#ifndef _STALL_CONTAINER_H_
#define _STALL_CONTAINER_H_
#include "ItemContainer.h"
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CChatPacket;
class CSendStream;
class CAggresiveCreature;
class CCharacter;
class CCell;
namespace Item
{
class CShopContainer : public CArrayContainer
{
public:
enum
{
MAX_CUSTOMER_NUM = 10
};
CShopContainer();
virtual ~CShopContainer();
bool Initialize(unsigned long dwCID, unsigned char cWidth, unsigned char cHeight);
virtual void Clear(void);
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem) = 0;
virtual bool RemoveItem(ItemPos itemPos);
void SwapPosAllItem(void);
bool StallPriceOut(unsigned long* szStallPriceBuffer_Out, unsigned char& cItemNum_Out) const;
bool Enter(CCharacter *lpCustomer);
bool Leave(CCharacter *lpCustomer);
unsigned char GetCurrentCustomerNum(void);
virtual bool Close(void);
virtual bool SendCharStallItemInfo(CCharacter *lpCustomer) = 0;
virtual bool SendAllCustomer(const char* szPacket, const unsigned long dwPacketSize,
bool bIncludeOwner, unsigned char cCMD_In);
bool SendRemoveItem(TakeType takeType, unsigned char cCmd, const char* strBuyUser);
bool SendCharStallEnter(unsigned long dwCustomerID, unsigned long dwOwnerID);
protected:
void Destroy();
unsigned long m_aryCustomerID[MAX_CUSTOMER_NUM]; // <20>մԵ<D5B4><D4B5><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20>
};
class CCharacterShopContainer : public CShopContainer
{
public:
enum
{
MAX_STALL_NAME_LEN = 32
};
CCharacterShopContainer();
virtual ~CCharacterShopContainer();
virtual void Clear(void);
void RollBackAllItem(void);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
void SetOtherOwner(unsigned long dwCID) { m_dwOtherOwnerID = dwCID; }
unsigned long GetOtherOwner(void) { return m_dwOtherOwnerID; }
char* GetStallName(void) { return m_strStallName; }
bool Open(char *strStallName);
virtual bool Close(void);
virtual bool SendCharStallItemInfo(CCharacter *lpCustomer);
virtual bool SendAllCustomer(const char* szPacket, const unsigned long dwPacketSize,
bool bIncludeOwner, unsigned char cCMD_In);
bool SendCharStallOpen(char *strStallName);
protected:
unsigned long m_dwOtherOwnerID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
char m_strStallName[MAX_STALL_NAME_LEN]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
};
class CCampShopContainer : public CShopContainer
{
public:
CCampShopContainer(void);
virtual ~CCampShopContainer(void);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
void DropItem(CCell* lpCell, const Position& currentPos, unsigned long dwOffencerGID);
bool StallPriceIn(const unsigned long* szStallPriceBuffer_In, unsigned char cItemNum_In);
virtual bool SendCharStallItemInfo(CCharacter *lpCustomer);
CItem* RegisterCancelItem(CCharacter* lpCharacter, TakeType takeType, unsigned long dwPrice, unsigned char cCmd);
bool CheckUpdateCount(void);
void IncreaseUpdateCount(void) { ++m_cUpdateCount; }
bool SendCharStallItemInfo(CSendStream& SendStream);
bool IsEmpty() const;
protected:
enum Const
{
UPDATE_COUNT = 1
};
unsigned char m_cUpdateCount; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ ī<><C4AB>Ʈ (UPDATE_COUNT<4E><54> <20>Ѿ<D1BE><EEBCAD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.)
};
};
#endif

View File

@@ -0,0 +1,138 @@
#include "stdafx.h"
#include <Item/Item.h>
#include <Item/Container/ItemContainer.h>
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
#include <Network/Dispatch/GameClient/SendCharItem.h>
#include <Creature/Character/Character.h>
#include <Log/ItemLog.h>
#include "TempInvenContainer.h"
Item::CTempInvenContainer::CTempInvenContainer()
: m_lpOwner(NULL), m_cItemNum(0)
{
}
Item::CTempInvenContainer::~CTempInvenContainer()
{
}
bool Item::CTempInvenContainer::Initialize(CCharacter* lpCharacter, unsigned short nMaxSize)
{
m_lpOwner = lpCharacter;
return Item::CListContainer::Initialize(lpCharacter->GetCID(), nMaxSize);
}
Item::CItem* Item::CTempInvenContainer::GetItem(Item::ItemPos itemPos)
{
CItem* lpItem = m_lppItems[0];
return (lpItem != m_lpNullItem) ? lpItem : NULL;
}
bool Item::CTempInvenContainer::SetItem(Item::ItemPos itemPos, Item::CItem* lpItem)
{
CGameClientDispatch* lpDispatch = m_lpOwner->GetDispatcher();
if (true == IsFull())
{
CCell::ItemInfo itemInfo;
CCell* lpCell = m_lpOwner->GetCellPos().m_lpCell;
if (NULL == lpCell)
{
ERRLOG1(g_Log, "CID:%10u / <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", m_lpOwner->GetCID());
return false;
}
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Item::CItem* lpItem = m_lppItems[0];
ItemPos itemPos(TakeType::TS_TEMPINVEN, 0);
// <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (false == RemoveItem(itemPos))
{
ERRLOG1(g_Log, "CID:%10u / <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>. (<28>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)",
m_lpOwner->GetCID());
return false;
}
// <20>ʵ忡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
lpCell->SetItem(m_lpOwner->GetCurrentPos(), lpItem, 0, m_lpOwner->GetCID(), CCell::NONE, itemInfo);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
GAMELOG::LogDropItem(*m_lpOwner, itemPos, itemInfo.m_lpItem, 0, 0);
if (0 != lpDispatch)
{
GameClientSendPacket::SendCharPullDown(lpDispatch->GetSendStream(),
m_lpOwner->GetCID(), itemPos, itemInfo, PktBase::NO_SERVER_ERR);
}
}
itemPos.m_cIndex = m_cItemNum;
if (!Item::CListContainer::SetItem(itemPos, lpItem))
{
ERRLOG1(g_Log, "CID:%10u / <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", m_lpOwner->GetCID());
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
++m_cItemNum;
if (0 != lpDispatch)
{
unsigned char cNum = (lpItem->IsSet(Item::DetailData::STACKABLE)) ? lpItem->GetNumOrDurability() : 1;
GameClientSendPacket::SendCharPickUp(lpDispatch->GetSendStream(), m_lpOwner->GetCID(),
0, 0, lpItem, itemPos, cNum, PktBase::NO_SERVER_ERR);
}
return true;
}
bool Item::CTempInvenContainer::RemoveItem(Item::ItemPos itemPos)
{
if (NULL == m_lppItems[0])
{
ERRLOG1(g_Log, "CID:%10u / <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>ϴ<EFBFBD>.", m_dwCID);
return false;
}
for (unsigned char cIndex = 0; cIndex < m_nMaxSize - 1; ++cIndex)
{
m_lppItems[cIndex] = m_lppItems[cIndex + 1];
if (NULL != m_lppItems[cIndex])
{
m_lppItems[cIndex]->MoveItem(ItemPos(TakeType::TS_TEMPINVEN, cIndex));
}
}
m_lppItems[m_nMaxSize - 1] = NULL;
--m_cItemNum;
return true;
}
bool Item::CTempInvenContainer::SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In)
{
if (false == CListContainer::SerializeIn(szItemBuffer_In, dwBufferSize_In))
{
return false;
}
for (unsigned char cIndex = 0; cIndex < m_nMaxSize; ++cIndex)
{
if (NULL == m_lppItems[cIndex])
{
break;
}
++m_cItemNum;
}
return true;
}

View File

@@ -0,0 +1,34 @@
#ifndef _TEMP_INVEN_CONTAINER_H_
#define _TEMP_INVEN_CONTAINER_H_
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CCharacter;
namespace Item
{
class CTempInvenContainer : public CListContainer
{
protected:
CCharacter* m_lpOwner; // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD>
unsigned char m_cItemNum; // <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
public:
CTempInvenContainer();
virtual ~CTempInvenContainer();
bool Initialize(CCharacter* lpCharacter, unsigned short nMaxSize);
virtual CItem* GetItem(ItemPos itemPos);
virtual bool SetItem(ItemPos itemPos, CItem* lpItem);
virtual bool RemoveItem(ItemPos itemPos);
virtual bool SerializeIn(const char* szItemBuffer_In, unsigned long dwBufferSize_In);
bool IsFull(void) { return (m_cItemNum == m_nMaxSize); }
};
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,897 @@
#ifndef _CITEM_CLASS_H_
#define _CITEM_CLASS_H_
#include <limits>
#include <vector>
#include <algorithm>
#include <Network/Packet/PacketStruct/CharItemPacketStruct.h>
#include "ItemMgr.h"
#include "ItemStructure.h"
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CCharacter;
#define DELITEMLOG(x) (void*)0
//#define DELITEMLOG(x) x
namespace Item
{
class CItem
{
public:
CItem();
CItem(const ItemInfo& itemInfo);
// <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.
const ItemInfo& GetItemInfo() const { return m_ItemInfo; }
// Desc : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> char<61><72><EFBFBD>۷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// In : <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> ũ<><C5A9>
// Out : (Return)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, nBufferLength_InOut - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
virtual bool SerializeOut(char* lpSerializeItem_Out, size_t& nBufferLength_InOut);
// Desc : char<61><72><EFBFBD>۷κ<DBB7><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD> <20>´<EFBFBD>.
// In : <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> ũ<><C5A9>
// Out : (Return)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, nBufferLength_InOut - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>
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(bool bStallOn = true) 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<49><44> <20>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD> <20>Ժη<D4BA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ÿ<EFBFBD>!
inline void SetUID(unsigned __int64 dwItemUID) { m_ItemData.m_dwUID = dwItemUID; }
// S <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD>Ѱ<EFBFBD> <20><><EFBFBD><EFBFBD>(S <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20>̿ܿ<CCBF><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. - 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; // <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ItemData m_ItemData; // DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ItemPos m_itemPos_Real; // <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ
unsigned char m_cMaxNumOrDurability; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned long m_dwStallPrice; // <20><><EFBFBD><EFBFBD><EFBFBD>󿡼<EFBFBD><F3BFA1BC><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwPrice; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>ɼǿ<C9BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>)
friend class CItemFactory;
};
class CEquipment : public CItem
{
public:
enum EQUIPMENT_ERROR
{
// <20><><EFBFBD><EFBFBD> <20>ڱ<EFBFBD>
S_SUCCESS = 0, // <20><><EFBFBD><EFBFBD>
E_SERVER_ERROR = 1, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_GET_EQUIP_FAILED = 2, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_GET_GEM_FAILED = 3, // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_NOT_EQUIP = 4, // <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
E_NOT_GEM = 5, // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
E_REMOVE_GEM_FAILED = 6, // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_SOCKET_IS_FULL = 7, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>
E_OVER_MAX_SOCKET = 8, // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>
E_SOCKET_NOT_MAX = 9, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 7<><37><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>.
E_SOCKET_NOT_INST = 10, // <20><><EFBFBD>Ͽ<EFBFBD> <20>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <20><> <20><>ġ/<2F><><EFBFBD><EFBFBD>
R_SUCCESS = 0, // <20><> <20><>ġ/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
E_GET_RUNE_FAILED = 9, // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
E_NOT_RUNE = 10, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
E_NOT_RUNE_SLOT = 11, // <20><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
E_NOT_RUNE_LEVEL_LIMIT = 12, // <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
E_USED_RUNE_SKILL_POINT = 13, // <20><20>߰<EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־ <20><><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
E_NOT_RUNE_SCRIPT_INFO = 14, // <20><20><>ũ<EFBFBD><C5A9>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20><>ȭ
E_GET_MINERAL_FAILED = 3, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_NOT_MINERAL = 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
E_NOT_MATCH_MINERAL_TYPE = 6, // <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> Ʋ<><C6B2>
E_NOT_ENOUGH_MINERAL = 7, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_REMOVE_EQUIP_FAILED = 8, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_CREATE_SCRAP_FAILED = 9, // <20><>ö <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_SET_SCRAP_FAILED = 10, // <20><>ö <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_REMOVE_MINERAL_FAILED = 11, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_UPGRADE_LEVEL_IS_FULL = 12, // <20><> <20>̻<EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵带 <20><> <20><> <20><><EFBFBD><EFBFBD>
E_NOT_ENOUGH_MONEY = 13, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>
S_BROKEN_EQUIP = 14, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>μ<EFBFBD><CEBC><EFBFBD><><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.)
E_NOT_UPGRADE_LEVEL = 15, // <20>ɼ<EFBFBD> <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>.
E_NOT_UPGRADE_AS_OVER = 16, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>̿<EFBFBD> ȸ<><C8B8> <20>ʰ<EFBFBD>.
E_NOT_UPGRADE_ENDURANCE = 17, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȸ<><C8B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>.
E_NOT_UPGRADE_MINENDURANCE = 18, // <20><><EFBFBD>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10<31><30> <20><><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.
E_NOT_UPGRADE_AWAKEN = 19, // <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ھ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// <20>ɼ<EFBFBD> <20>̽<EFBFBD>
E_WRONG_ATTRIBUTE = 2, // <20>̽<EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD>
E_NOT_EQUAL_KIND = 3, // <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_HIGH_GRADE_ORIGINAL = 4, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7>̵尡 <20><><EFBFBD><EFBFBD>
E_GRAFE_FAILD = 5, // <20>ɼ<EFBFBD><C9BC>̽<EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD>
E_WRONG_TYPE = 2, // <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>
E_NEW_SEASON_EQUIP = 3, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ų<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
E_LOW_STATUS_EQUIP = 4 // <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
};
enum PASSIVE_TYPE
{
PASSIVE_ALWAYS = 0, // <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׻<EFBFBD> <20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20>нú<D0BD>
PASSIVE_THIS_WEAPON = 1, // <20>ش<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20>нú<D0BD>
NONE_PASSIVE_THIS_WEAPON = 2 // <20>ش<EFBFBD> <20><><EFBFBD><20>߻<EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>нú<D0BD>
};
enum RuneApplyType
{
RUNE_NONE = 0,
RUNE_INDEX = (1 << 0), // <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>Ӽ<EFBFBD>.
RUNE_ALL = (1 << 1), // <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD>.
RUNE_APPLY = (1 << 2), // <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>߰<EFBFBD>.
RUNE_REMOVE = (1 << 3) // <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD>.
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Downcast<73>Ѵ<EFBFBD>.
inline static CEquipment* DowncastToEquipment(CItem* lpItem);
// Desc : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> char<61><72><EFBFBD>۷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// In : <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> ũ<><C5A9>
// Out : (Return)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, nBufferLength_InOut - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
virtual bool SerializeOut(char* lpSerializeItem_Out, size_t& nBufferLength_InOut);
// Desc : char<61><72><EFBFBD>۷κ<DBB7><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD> <20>´<EFBFBD>.
// In : <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> ũ<><C5A9>
// Out : (Return)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, nBufferLength_InOut - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>
virtual bool SerializeIn(const char* lpSerializeItem_In, size_t& nBufferLength_InOut);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> <20>߰<EFBFBD> (<28>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD><C4BF><EFBFBD> <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD>ݽô<DDBD>.)
inline void AddAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue);
inline void SetAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue);
// 3<><33> <20><EFBFBD><EBB7B1> <20><>ġ(<28><><EFBFBD><EFBFBD>, <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)0
inline void RemoveUpgradeAttribute(Item::Attribute::Type eAttributeType);
inline void RemoveGemAttribute(Item::Attribute::Type eAttributeType);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.
inline short GetAttribute(Item::Attribute::Type eAttributeType);
inline void GetAttribute(short* lpAttributeArray_Out, unsigned short nArraySize);
// <20>ɼǺ<C9BC> <20>Ѱ谪<D1B0><E8B0AA> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
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); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
BOOL AddRandomOption(Item::EquipType::Grade eGrade, unsigned char cBaseNum, int iMagicChance = 0);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
BOOL AddRandomSocket(int iMagicChance = -1);
// <20>ɼ<EFBFBD> <20>̽<EFBFBD>
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);
// <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD>
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 GetCoreLevel(void) const { return m_cCoreLevel; }
unsigned char GetCurrentSocketNum(void) const { return m_cSocketNum; }
unsigned char GetMaxSocketNum(void) const { return m_cMaxSocket; }
// <20><><EFBFBD><EFBFBD><EBB7B1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
void SetNewEquip(char cStrong = 1)
{
if(m_cSeasonRecord != cStrong)
m_cCoreLevel = 0;
m_cSeasonRecord = cStrong; // 1 <20>⺻, 2 <20><><EFBFBD><EFBFBD>, 3 <20><><EFBFBD><EFBFBD>
}
unsigned char GetSeasonRecord(void) { return m_cSeasonRecord; }
unsigned long GetBuyPrice(void) const;
unsigned long GetSellPrice(bool bStallOn = true) 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; }
// <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool IsUpgradable(void) const;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
inline unsigned char GetMaxRuneSocket();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
inline unsigned char GetRuneEquipable();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
inline unsigned short GetRuneEquipLimitLevel(void) const;
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
inline bool SubRuneAttribute(void);
// <20><>ġ <20>Ǿ<EFBFBD> <20>ִ<EFBFBD> <20><> <20><><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>Ѱ<EFBFBD><D1B0>ش<EFBFBD>.
inline unsigned short GetRuneSocket(unsigned char cIndex)
{
if (cIndex >= EquipmentInfo::MAX_RUNE_SOCKET_NUM)
{
return 0;
}
return m_usRuneSocket[cIndex];
}
// <20><> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><E7BABB> <20>Ѱ<EFBFBD><D1B0>ش<EFBFBD>.
inline void GetSubRuneAttribute(short* psAttribute);
inline void GetSubRuneAttribute(Item::Attribute::Type eAttributeType, short& sAttribute);
// <20>ܺο<DCBA><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F>߰<EFBFBD>
inline void SetRuneAttribute(RuneApplyType enRuneApplyType, unsigned char ucIndex);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
unsigned short GetAllRuneSkillPointCheck();
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>Ʈ üũ
bool GetRuneCheckSkill(CCharacter* lpCharacter, Item::ItemPos itemPos, bool bChk = true);
// ------------------------------------------------------------------------------------------------------------
// ConvertTool<6F><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> - RebalanceOverItem.cpp <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
inline void Repair();
inline void InitEquip();
inline void SetEquip();
// ------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> - ItemServerFunc.cpp <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EQUIPMENT_ERROR InstallSocket(CItem& Gem);
EQUIPMENT_ERROR UpgradeItem(CItem& Mineral_InOut, unsigned long dwCurrentGold_In, unsigned long& dwUsedGold_Out, unsigned char& cValue_Out);
EQUIPMENT_ERROR InstallRuneSocket(CItem& Rune, bool bEquip, unsigned char cLevel); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ġ.
EQUIPMENT_ERROR UnInstallRuneSocket(CItem& Rune, bool bEquip, unsigned char cLevel, unsigned short usSkillPoint); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// ------------------------------------------------------------------------------------------------------------
// 3<><33> <20><EFBFBD><EBB7B1> <20><>ġ <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
// S <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD>Ѱ<EFBFBD> <20><><EFBFBD>ϱ<EFBFBD>
bool GetLimitValue(short* lpattrLimit);
bool GetLimitValue(Item::Attribute::Type eAttributeType, short& attrLimit);
// S <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD>Ѱ<EFBFBD> <20><><EFBFBD><EFBFBD>(S <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20>̿ܿ<CCBF><DCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȯ<EFBFBD><C8AE><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. - by hackermz)
void RevisionLimit();
void RevisionLimit(short* lpattrLimit);
void RevisionLimit(Item::Attribute::Type eAttributeType, short& attrLImit);
// <20>׷<EFBFBD><D7B7>̵<EFBFBD> å<><C3A5>
void CalculateItemGrade(void);
protected:
enum ApplyType
{
APPLY = 1, // <20><> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><> <20><>
REMOVE = -1 // <20><> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><> <20><>
};
CEquipment(const ItemInfo& itemInfo);
virtual ~CEquipment();
inline void InitializeGemAttribute(void); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ʱ<EFBFBD>ȭ
inline void InitializeUpgradeAttribute(void); // <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ʱ<EFBFBD>ȭ
inline void ApplyGemAttribute(ApplyType eApplyType); // <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD>
inline void ApplyUpgradeAttribute(ApplyType eApplyType); // <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD>
inline void ApplyRuneAttribute(ApplyType eApplyType); // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD>
void CalculateItemPrice(void); // <20><><EFBFBD><EFBFBD> å<><C3A5>
unsigned char m_cSocket[EquipmentInfo::MAX_SOCKET_NUM]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ItemAttribute m_SocketAttribute[EquipmentInfo::MAX_SOCKET_ATTRIBUTE_NUM]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD>
ItemAttribute m_UpgradeAttribute[EquipmentInfo::MAX_UPGRADE_ATTRIBUTE]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD> <20>ٴ<EFBFBD> <20>Ӽ<EFBFBD>
unsigned short m_usRuneSocket[EquipmentInfo::MAX_RUNE_SOCKET_NUM]; // <20><> <20><><EFBFBD><EFBFBD>
short m_wAttribute[Attribute::MAX_ATTRIBUTE_NUM]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> (<28><>ũ<EFBFBD><C5A9>Ʈ + DB + ...)
unsigned char m_cUpgradeLevel; // <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ܰ<EFBFBD>
unsigned char m_cSocketNum; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned char m_cMaxSocket; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned char m_cMaxAttribute; // <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned char m_cSeasonRecord; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ñ<EFBFBD>
Grade::GradeInfo m_GradeInfo; // <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned char m_cUpgradeCnt;
unsigned char m_cCoreLevel; // <20>ھ<DABE><EEB7B9>
friend class CItemFactory;
friend class CItemType;
};
class CUseItem : public CItem
{
public:
inline static CUseItem* DowncastToUseItem(CItem* lpItem);
// ------------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> - ItemServerFunc.cpp <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool UseCashItem(CCharacter* lpSender, CCharacter* lpRecver, Item::ItemPos itemPos, unsigned short& wError);
bool Use(CCharacter* lpSender, CCharacter* lpRecver, Item::ItemPos itemPos, 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<CEquipment*>(lpItem) : NULL;
}
inline void Item::CEquipment::AddAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue)
{
/*
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>Ӽ<EFBFBD> <20>߰<EFBFBD>
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;
}
/*
// edith 2009.03.15 min <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> max<61><78><EFBFBD><EFBFBD> <20><><EFBFBD>Ƶ<EFBFBD> <20>ɼ<EFBFBD><C9BC>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>۾<EFBFBD><DBBE>Ȱ<EFBFBD>
if(eAttributeType == Attribute::MIN_DAMAGE)
{
if(m_wAttribute[Attribute::MIN_DAMAGE] > m_wAttribute[Attribute::MAX_DAMAGE])
{
// <20>ΰ<EFBFBD> <20><>ȯ
short t = m_wAttribute[Attribute::MIN_DAMAGE];
m_wAttribute[Attribute::MIN_DAMAGE] = m_wAttribute[Attribute::MAX_DAMAGE];
m_wAttribute[Attribute::MAX_DAMAGE] = t;
}
}
//*/
}
}
inline void Item::CEquipment::SetAttribute(Item::Attribute::Type eAttributeType, short nAttributeValue)
{
/*
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>Ӽ<EFBFBD> <20>߰<EFBFBD>
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<Item::Attribute::Type>(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<Item::Attribute::Type>(first->m_cType))
{
first->m_usValue = 0;
}
}
}
inline bool Item::CEquipment::SubRuneAttribute(void)
{
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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<Item::Attribute::Type>(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());
// <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CItemType::SetInstallGemAttribute(this);
}
inline void Item::CEquipment::InitializeUpgradeAttribute(void)
{
std::fill_n(m_UpgradeAttribute, int(EquipmentInfo::MAX_UPGRADE_ATTRIBUTE), ItemAttribute());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ܰ谪<DCB0><E8B0AA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
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<Item::Attribute::Type>(first->m_cType), first->m_usValue * eApplyType);
}
}
inline unsigned char Item::CEquipment::GetMaxRuneSocket()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
return Item::CItemMgr::GetInstance().GetMaxRuneSocket(static_cast<ItemType::Type>(GetItemInfo().m_DetailData.m_cItemType));
}
inline unsigned char Item::CEquipment::GetRuneEquipable()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ
unsigned char cRuneSocketCnt = Item::CItemMgr::GetInstance().GetMaxRuneSocket(static_cast<ItemType::Type>(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<Item::Attribute::Type>(first->m_cType), first->m_usValue * eApplyType);
}
}
inline void Item::CEquipment::ApplyRuneAttribute(ApplyType eApplyType)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>Ӽ<EFBFBD> <20>߰<EFBFBD>/<2F><><EFBFBD><EFBFBD>
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)
{
// <20><> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><E7BABB> <20>Ѱ<EFBFBD><D1B0>ش<EFBFBD>.
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)
{
// <20>ܺο<DCBA><CEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F>߰<EFBFBD>.
if (enRuneApplyType & RUNE_INDEX && enRuneApplyType & 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 & RUNE_ALL && enRuneApplyType & RUNE_REMOVE)
{
ApplyRuneAttribute(REMOVE);
}
else if (enRuneApplyType & RUNE_INDEX && enRuneApplyType & 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 & RUNE_ALL && enRuneApplyType & RUNE_APPLY)
{
ApplyRuneAttribute(APPLY);
}
}
inline unsigned short Item::CEquipment::GetRuneEquipLimitLevel(void) const
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
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 (usResult<itemInfo->m_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<CUseItem*>(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<6F><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> - RebalanceOverItem.cpp <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
inline void Item::CEquipment::Repair()
{
SetNumOrDurability(GetMaxNumOrDurability());
CalculateItemPrice();
}
inline void Item::CEquipment::InitEquip()
{
// <20>ɼ<EFBFBD> <20>̽<EFBFBD><CCBD><EFBFBD> <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߰<EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
RuneApplyType enRuneApplyType = static_cast<RuneApplyType>(RUNE_ALL | RUNE_REMOVE);
SetRuneAttribute(enRuneApplyType, 0);
// <20><><EFBFBD><EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ȴ<EFBFBD>. (<28>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD>´<EFBFBD>.)
m_cUpgradeLevel = 0;
m_cCoreLevel = 0;
InitializeUpgradeAttribute();
// <20><><EFBFBD>ϵ<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>ȴ<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD>´<EFBFBD>.)
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()
{
// <20><> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ٽ<EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
RuneApplyType enRuneApplyType = static_cast<RuneApplyType>(RUNE_ALL | RUNE_APPLY);
SetRuneAttribute(enRuneApplyType, 0);
}
#endif

View File

@@ -0,0 +1,750 @@
#include "stdafx.h"
#include "ItemConstants.h"
#include "ItemStructure.h"
#include <algorithm>
#include <Item/Item.h>
#include "GMMemory.h"
using namespace Item;
CItemType& CItemType::GetInstance()
{
static CItemType itemType;
return itemType;
}
const CTypeName Attribute::Attributes[Attribute::MAX_ATTRIBUTE_NUM] =
{
CTypeName(Attribute::NONE, "None"),
CTypeName(Attribute::MIN_DAMAGE, "MinDamage"),
CTypeName(Attribute::MAX_DAMAGE, "MaxDamage"),
CTypeName(Attribute::ARMOR, "Armor"),
CTypeName(Attribute::HIT_RATE, "HitRate"),
CTypeName(Attribute::EVADE, "Evade"),
CTypeName(Attribute::MAX_HP, "MaxHP"),
CTypeName(Attribute::HP_REGEN, "HPRegen"),
CTypeName(Attribute::MAX_MP, "MaxMP"),
CTypeName(Attribute::MP_REGEN, "MPRegen"),
CTypeName(Attribute::CRITICAL, "Critical"),
CTypeName(Attribute::BLOCK, "Block"),
CTypeName(Attribute::SPEED, "Speed"),
CTypeName(Attribute::MAGIC_POWER, "MagicPower"),
CTypeName(Attribute::MAGIC_RESIST, "MagicResist"),
//--// start..
CTypeName(Attribute::LUCKCHANCE, "LuckChance"),
// CTypeName(Attribute::RUNE, "Rune"),
CTypeName(Attribute::COOLDOWN, "CoolDown"),
CTypeName(Attribute::SKILL_POINT, "SkillPoint"),
CTypeName(Attribute::FROST, "Frost"),
CTypeName(Attribute::FIRE, "Fire"),
CTypeName(Attribute::ELECTRO, "Electro"),
CTypeName(Attribute::DARKNESS, "Darkness")
//--// end..
};
CItemType::CItemType()
{
using namespace ItemType;
int nCount = 0;
for (nCount = 0; nCount < MAX_ARRAY_TYPE; ++nCount)
{
m_ItemTypes[nCount].reserve(MAX_ITEM_TYPE);
}
m_ItemTypeNames[SHIRT] = CTypeName(SHIRT, "SHIRT");
m_ItemTypeNames[TUNIC] = CTypeName(TUNIC, "TUNIC");
m_ItemTypeNames[CON_ARMOUR] = CTypeName(CON_ARMOUR, "CON_ARMOUR");
m_ItemTypeNames[CON_HELM] = CTypeName(CON_HELM, "CON_HELM");
m_ItemTypeNames[CON_GLOVE] = CTypeName(CON_GLOVE, "CON_GLOVE");
m_ItemTypeNames[CON_BOOTS] = CTypeName(CON_BOOTS, "CON_BOOTS");
m_ItemTypeNames[DEX_ARMOUR] = CTypeName(DEX_ARMOUR, "DEX_ARMOUR");
m_ItemTypeNames[DEX_HELM] = CTypeName(DEX_HELM, "DEX_HELM");
m_ItemTypeNames[DEX_GLOVE] = CTypeName(DEX_GLOVE, "DEX_GLOVE");
m_ItemTypeNames[DEX_BOOTS] = CTypeName(DEX_BOOTS, "DEX_BOOTS");
m_ItemTypeNames[ONEHANDED_SWORD] = CTypeName(ONEHANDED_SWORD, "ONEHANDED_SWORD");
m_ItemTypeNames[TWOHANDED_SWORD] = CTypeName(TWOHANDED_SWORD, "TWOHANDED_SWORD");
m_ItemTypeNames[ONEHANDED_AXE] = CTypeName(ONEHANDED_AXE, "ONEHANDED_AXE");
m_ItemTypeNames[TWOHANDED_AXE] = CTypeName(TWOHANDED_AXE, "TWOHANDED_AXE");
m_ItemTypeNames[ONEHANDED_BLUNT] = CTypeName(ONEHANDED_BLUNT, "ONEHANDED_BLUNT");
m_ItemTypeNames[TWOHANDED_BLUNT] = CTypeName(TWOHANDED_BLUNT, "TWOHANDED_BLUNT");
m_ItemTypeNames[BOW] = CTypeName(BOW, "BOW");
m_ItemTypeNames[CROSSBOW] = CTypeName(CROSSBOW, "CROSSBOW");
m_ItemTypeNames[STAFF] = CTypeName(STAFF, "STAFF");
m_ItemTypeNames[DAGGER] = CTypeName(DAGGER, "DAGGER");
m_ItemTypeNames[SHIELD] = CTypeName(SHIELD, "SHIELD");
m_ItemTypeNames[CON_BODY] = CTypeName(CON_BODY, "CON_BODY");
m_ItemTypeNames[CON_HEAD] = CTypeName(CON_HEAD, "CON_HEAD");
m_ItemTypeNames[CON_PELVIS] = CTypeName(CON_PELVIS, "CON_PELVIS");
m_ItemTypeNames[CON_PROTECT_A] = CTypeName(CON_PROTECT_A, "CON_PROTECT_A");
m_ItemTypeNames[DEX_BODY] = CTypeName(DEX_BODY, "DEX_BODY");
m_ItemTypeNames[DEX_HEAD] = CTypeName(DEX_HEAD, "DEX_HEAD");
m_ItemTypeNames[DEX_PELVIS] = CTypeName(DEX_PELVIS, "DEX_PELVIS");
m_ItemTypeNames[DEX_PROTECT_A] = CTypeName(DEX_PROTECT_A, "DEX_PROTECT_A");
m_ItemTypeNames[COM_BLUNT] = CTypeName(COM_BLUNT, "COM_BLUNT");
m_ItemTypeNames[COM_SWORD] = CTypeName(COM_SWORD, "COM_SWORD");
m_ItemTypeNames[OPP_HAMMER] = CTypeName(OPP_HAMMER, "OPP_HAMMER");
m_ItemTypeNames[OPP_AXE] = CTypeName(OPP_AXE, "OPP_AXE");
m_ItemTypeNames[OPP_SLUSHER] = CTypeName(OPP_SLUSHER, "OPP_SLUSHER");
m_ItemTypeNames[OPP_TALON] = CTypeName(OPP_TALON, "OPP_TALON");
m_ItemTypeNames[OPP_SYTHE] = CTypeName(OPP_SYTHE, "OPP_SYTHE");
m_ItemTypeNames[SKILL_A_GUARD] = CTypeName(SKILL_A_GUARD, "SKILL_A_GUARD");
m_ItemTypeNames[SKILL_A_ATTACK] = CTypeName(SKILL_A_ATTACK, "SKILL_A_ATTACK");
m_ItemTypeNames[SKILL_A_GUN] = CTypeName(SKILL_A_GUN, "SKILL_A_GUN");
m_ItemTypeNames[SKILL_A_KNIFE] = CTypeName(SKILL_A_KNIFE, "SKILL_A_KNIFE");
m_ItemTypeNames[ARROW] = CTypeName(ARROW, "ARROW");
m_ItemTypeNames[BOLT] = CTypeName(BOLT, "BOLT");
m_ItemTypeNames[AMMO] = CTypeName(AMMO, "AMMO");
m_ItemTypeNames[POTION] = CTypeName(POTION, "POTION");
m_ItemTypeNames[EXP_BOOK] = CTypeName(EXP_BOOK, "EXPBOOK");
m_ItemTypeNames[CASH_BOOK] = CTypeName(CASH_BOOK, "CASHBOOK");
m_ItemTypeNames[EVENT_LOTTERY] = CTypeName(EVENT_LOTTERY, "EVENT_LOTTERY");
m_ItemTypeNames[PORTAL] = CTypeName(PORTAL, "PORTAL");
m_ItemTypeNames[FIRE_CRACKER] = CTypeName(FIRE_CRACKER, "FIRE_CRACKER");
m_ItemTypeNames[SKILL_BOOK] = CTypeName(SKILL_BOOK, "SKILLBOOK");
m_ItemTypeNames[FIXED_PORTAL] = CTypeName(FIXED_PORTAL, "FIXED_PORTAL");
m_ItemTypeNames[SKILL_ITEM] = CTypeName(SKILL_ITEM, "SKILL_ITEM");
m_ItemTypeNames[CASH_ITEM] = CTypeName(CASH_ITEM, "CASH_ITEM");
m_ItemTypeNames[GEM] = CTypeName(GEM, "GEM");
m_ItemTypeNames[ORE] = CTypeName(ORE, "ORE");
m_ItemTypeNames[ETC] = CTypeName(ETC, "ETC");
m_ItemTypeNames[CAMP_KIT] = CTypeName(CAMP_KIT, "CAMP_KIT");
m_ItemTypeNames[SHORT_RANGE_ARMS_KIT] = CTypeName(SHORT_RANGE_ARMS_KIT, "SHORT_RANGE_ARMS_KIT");
m_ItemTypeNames[LONG_RANGE_ARMS_KIT] = CTypeName(LONG_RANGE_ARMS_KIT, "LONG_RANGE_ARMS_KIT");
m_ItemTypeNames[AIRSHIP_KIT] = CTypeName(AIRSHIP_KIT, "AIRSHIP_KIT");
m_ItemTypeNames[WORLDWEAPON_K_KIT] = CTypeName(WORLDWEAPON_K_KIT, "WORLDWEAPON_K_KIT");
m_ItemTypeNames[WORLDWEAPON_M_KIT] = CTypeName(WORLDWEAPON_M_KIT, "WORLDWEAPON_M_KIT");
m_ItemTypeNames[MINERAL_KIT] = CTypeName(MINERAL_KIT, "MINERAL_KIT");
m_ItemTypeNames[QUEST_ITEM] = CTypeName(QUEST_ITEM, "QUEST_ITEM");
//--// start..
m_ItemTypeNames[NECKLACE] = CTypeName(NECKLACE, "NECKLACE");
m_ItemTypeNames[RING] = CTypeName(RING, "RING");
m_ItemTypeNames[RUNE] = CTypeName(RUNE, "RUNE");
m_ItemTypeNames[GEM_SELL] = CTypeName(GEM_SELL, "GEM_SELL");
m_ItemTypeNames[RIDE] = CTypeName(RIDE, "RIDE");
m_ItemTypeNames[TRANSFORM] = CTypeName(TRANSFORM, "TRANSFORM");
//--// end..
// --------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>
m_ItemTypes[EQUIP_TYPE].push_back(SHIRT); m_ItemTypes[EQUIP_TYPE].push_back(TUNIC);
m_ItemTypes[EQUIP_TYPE].push_back(CON_ARMOUR); m_ItemTypes[EQUIP_TYPE].push_back(CON_HELM);
m_ItemTypes[EQUIP_TYPE].push_back(CON_GLOVE); m_ItemTypes[EQUIP_TYPE].push_back(CON_BOOTS);
m_ItemTypes[EQUIP_TYPE].push_back(DEX_ARMOUR); m_ItemTypes[EQUIP_TYPE].push_back(DEX_HELM);
m_ItemTypes[EQUIP_TYPE].push_back(DEX_GLOVE); m_ItemTypes[EQUIP_TYPE].push_back(DEX_BOOTS);
m_ItemTypes[EQUIP_TYPE].push_back(ONEHANDED_SWORD); m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_SWORD);
m_ItemTypes[EQUIP_TYPE].push_back(ONEHANDED_AXE); m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_AXE);
m_ItemTypes[EQUIP_TYPE].push_back(ONEHANDED_BLUNT); m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_BLUNT);
m_ItemTypes[EQUIP_TYPE].push_back(BOW); m_ItemTypes[EQUIP_TYPE].push_back(CROSSBOW);
m_ItemTypes[EQUIP_TYPE].push_back(STAFF); m_ItemTypes[EQUIP_TYPE].push_back(DAGGER);
m_ItemTypes[EQUIP_TYPE].push_back(SHIELD);
m_ItemTypes[EQUIP_TYPE].push_back(CON_BODY); m_ItemTypes[EQUIP_TYPE].push_back(CON_HEAD);
m_ItemTypes[EQUIP_TYPE].push_back(CON_PELVIS); m_ItemTypes[EQUIP_TYPE].push_back(CON_PROTECT_A);
m_ItemTypes[EQUIP_TYPE].push_back(DEX_BODY); m_ItemTypes[EQUIP_TYPE].push_back(DEX_HEAD);
m_ItemTypes[EQUIP_TYPE].push_back(DEX_PELVIS); m_ItemTypes[EQUIP_TYPE].push_back(DEX_PROTECT_A);
m_ItemTypes[EQUIP_TYPE].push_back(COM_BLUNT); m_ItemTypes[EQUIP_TYPE].push_back(COM_SWORD);
m_ItemTypes[EQUIP_TYPE].push_back(OPP_HAMMER); m_ItemTypes[EQUIP_TYPE].push_back(OPP_AXE);
m_ItemTypes[EQUIP_TYPE].push_back(OPP_SLUSHER); m_ItemTypes[EQUIP_TYPE].push_back(OPP_TALON);
m_ItemTypes[EQUIP_TYPE].push_back(OPP_SYTHE);
m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_GUARD); m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_ATTACK);
m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_GUN); m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_KNIFE);
m_ItemTypes[EQUIP_TYPE].push_back(ARROW); m_ItemTypes[EQUIP_TYPE].push_back(BOLT);
// --------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// źȯ<C5BA><C8AF> '<27><><EFBFBD><EFBFBD>'<27><> <20>ƴ<EFBFBD> '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
m_ItemTypes[USE_ITEM_TYPE].push_back(AMMO);
m_ItemTypes[USE_ITEM_TYPE].push_back(POTION); m_ItemTypes[USE_ITEM_TYPE].push_back(EXP_BOOK);
m_ItemTypes[USE_ITEM_TYPE].push_back(CASH_BOOK); m_ItemTypes[USE_ITEM_TYPE].push_back(EVENT_LOTTERY);
m_ItemTypes[USE_ITEM_TYPE].push_back(PORTAL); m_ItemTypes[USE_ITEM_TYPE].push_back(FIRE_CRACKER);
m_ItemTypes[USE_ITEM_TYPE].push_back(SKILL_BOOK); m_ItemTypes[USE_ITEM_TYPE].push_back(FIXED_PORTAL);
m_ItemTypes[USE_ITEM_TYPE].push_back(SKILL_ITEM); m_ItemTypes[USE_ITEM_TYPE].push_back(CASH_ITEM);
m_ItemTypes[USE_ITEM_TYPE].push_back(CAMP_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(SHORT_RANGE_ARMS_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(LONG_RANGE_ARMS_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(AIRSHIP_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(WORLDWEAPON_K_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(WORLDWEAPON_M_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(MINERAL_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(QUEST_ITEM);
// --------------------------------------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>
m_ItemTypes[WEAPON_TYPE].push_back(ONEHANDED_SWORD); m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_SWORD);
m_ItemTypes[WEAPON_TYPE].push_back(ONEHANDED_AXE); m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_AXE);
m_ItemTypes[WEAPON_TYPE].push_back(ONEHANDED_BLUNT); m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_BLUNT);
m_ItemTypes[WEAPON_TYPE].push_back(BOW); m_ItemTypes[WEAPON_TYPE].push_back(CROSSBOW);
m_ItemTypes[WEAPON_TYPE].push_back(STAFF); m_ItemTypes[WEAPON_TYPE].push_back(DAGGER);
m_ItemTypes[WEAPON_TYPE].push_back(COM_BLUNT); m_ItemTypes[WEAPON_TYPE].push_back(COM_SWORD);
m_ItemTypes[WEAPON_TYPE].push_back(OPP_HAMMER); m_ItemTypes[WEAPON_TYPE].push_back(OPP_AXE);
m_ItemTypes[WEAPON_TYPE].push_back(OPP_SLUSHER); m_ItemTypes[WEAPON_TYPE].push_back(OPP_TALON);
m_ItemTypes[WEAPON_TYPE].push_back(OPP_SYTHE);
// --------------------------------------------------------------------------------------------------------
// <20><>ų<EFBFBD><C5B3>
m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_GUARD); m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_ATTACK);
m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_GUN); m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_KNIFE);
// --------------------------------------------------------------------------------------------------------
// <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20>з<EFBFBD><D0B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ɼǿ<C9BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ItemTypes[HELM_TYPE].push_back(CON_HELM); m_ItemTypes[HELM_TYPE].push_back(DEX_HELM);
m_ItemTypes[HELM_TYPE].push_back(CON_HEAD); m_ItemTypes[HELM_TYPE].push_back(DEX_HEAD);
// edith <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>尩,<2C>Ź<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ü<EFBFBD><C3BC> <20>߰<EFBFBD> (<28>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD>ü<EFBFBD><C3BC>ְ<EFBFBD><D6B0>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD>)
m_ItemTypes[HELM_TYPE].push_back(CON_GLOVE); m_ItemTypes[HELM_TYPE].push_back(CON_BOOTS);
m_ItemTypes[HELM_TYPE].push_back(DEX_GLOVE); m_ItemTypes[HELM_TYPE].push_back(DEX_BOOTS);
m_ItemTypes[HELM_TYPE].push_back(CON_PELVIS); m_ItemTypes[HELM_TYPE].push_back(CON_PROTECT_A);
m_ItemTypes[HELM_TYPE].push_back(DEX_PELVIS); m_ItemTypes[HELM_TYPE].push_back(DEX_PROTECT_A);
// <20><><EFBFBD>ʷ<EFBFBD>
m_ItemTypes[ARMOUR_TYPE].push_back(CON_ARMOUR); m_ItemTypes[ARMOUR_TYPE].push_back(DEX_ARMOUR);
m_ItemTypes[ARMOUR_TYPE].push_back(CON_BODY); m_ItemTypes[ARMOUR_TYPE].push_back(DEX_BODY);
// <20>ܰ˷<DCB0>
m_ItemTypes[DAGGER_TYPE].push_back(DAGGER); m_ItemTypes[DAGGER_TYPE].push_back(OPP_TALON);
m_ItemTypes[DAGGER_TYPE].push_back(SKILL_A_KNIFE);
// <20>Ѽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ItemTypes[ONEHANDED_TYPE].push_back(ONEHANDED_SWORD); m_ItemTypes[ONEHANDED_TYPE].push_back(ONEHANDED_AXE);
m_ItemTypes[ONEHANDED_TYPE].push_back(ONEHANDED_BLUNT); m_ItemTypes[ONEHANDED_TYPE].push_back(COM_BLUNT);
m_ItemTypes[ONEHANDED_TYPE].push_back(COM_SWORD); m_ItemTypes[ONEHANDED_TYPE].push_back(OPP_HAMMER);
m_ItemTypes[ONEHANDED_TYPE].push_back(OPP_AXE); m_ItemTypes[ONEHANDED_TYPE].push_back(OPP_SLUSHER);
m_ItemTypes[ONEHANDED_TYPE].push_back(SKILL_A_ATTACK);
// <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ItemTypes[ONEHANDED_TYPE].push_back(SKILL_A_GUN); m_ItemTypes[LONGRANGE_TYPE].push_back(BOW);
m_ItemTypes[LONGRANGE_TYPE].push_back(CROSSBOW);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_SWORD); m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_AXE);
m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_BLUNT);
// <20><><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>
m_ItemTypes[STAFF_TYPE].push_back(STAFF); m_ItemTypes[STAFF_TYPE].push_back(OPP_SYTHE);
// <20><><EFBFBD>з<EFBFBD>
m_ItemTypes[SHIELD_TYPE].push_back(SHIELD); m_ItemTypes[SHIELD_TYPE].push_back(SKILL_A_GUARD);
// --------------------------------------------------------------------------------------------------------
// Standard-Option Type
m_ItemTypes[STANDARD_TYPE].push_back(CON_ARMOUR); m_ItemTypes[STANDARD_TYPE].push_back(DEX_ARMOUR);
m_ItemTypes[STANDARD_TYPE].push_back(CON_BODY); m_ItemTypes[STANDARD_TYPE].push_back(DEX_BODY);
m_ItemTypes[STANDARD_TYPE].push_back(SHIELD); m_ItemTypes[STANDARD_TYPE].push_back(SKILL_A_GUARD);
m_ItemTypes[STANDARD_TYPE].push_back(ONEHANDED_SWORD); m_ItemTypes[STANDARD_TYPE].push_back(TWOHANDED_SWORD);
m_ItemTypes[STANDARD_TYPE].push_back(ONEHANDED_AXE); m_ItemTypes[STANDARD_TYPE].push_back(TWOHANDED_AXE);
m_ItemTypes[STANDARD_TYPE].push_back(ONEHANDED_BLUNT); m_ItemTypes[STANDARD_TYPE].push_back(TWOHANDED_BLUNT);
m_ItemTypes[STANDARD_TYPE].push_back(BOW); m_ItemTypes[STANDARD_TYPE].push_back(CROSSBOW);
m_ItemTypes[STANDARD_TYPE].push_back(STAFF); m_ItemTypes[STANDARD_TYPE].push_back(DAGGER);
m_ItemTypes[STANDARD_TYPE].push_back(COM_BLUNT); m_ItemTypes[STANDARD_TYPE].push_back(COM_SWORD);
m_ItemTypes[STANDARD_TYPE].push_back(OPP_HAMMER); m_ItemTypes[STANDARD_TYPE].push_back(OPP_AXE);
m_ItemTypes[STANDARD_TYPE].push_back(OPP_SLUSHER); m_ItemTypes[STANDARD_TYPE].push_back(OPP_TALON);
m_ItemTypes[STANDARD_TYPE].push_back(OPP_SYTHE); m_ItemTypes[STANDARD_TYPE].push_back(SKILL_A_ATTACK);
m_ItemTypes[STANDARD_TYPE].push_back(SKILL_A_GUN); m_ItemTypes[STANDARD_TYPE].push_back(SKILL_A_KNIFE);
// edith 2008.01.14 <20><><EFBFBD>Ĵٵ<C4B4><D9B5>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD>.
m_ItemTypes[STANDARD_TYPE].push_back(CON_HELM); m_ItemTypes[STANDARD_TYPE].push_back(DEX_HELM);
m_ItemTypes[STANDARD_TYPE].push_back(CON_HEAD); m_ItemTypes[STANDARD_TYPE].push_back(DEX_HEAD);
m_ItemTypes[STANDARD_TYPE].push_back(CON_GLOVE); m_ItemTypes[STANDARD_TYPE].push_back(CON_BOOTS);
m_ItemTypes[STANDARD_TYPE].push_back(DEX_GLOVE); m_ItemTypes[STANDARD_TYPE].push_back(DEX_BOOTS);
m_ItemTypes[STANDARD_TYPE].push_back(CON_PELVIS); m_ItemTypes[STANDARD_TYPE].push_back(CON_PROTECT_A);
m_ItemTypes[STANDARD_TYPE].push_back(DEX_PELVIS); m_ItemTypes[STANDARD_TYPE].push_back(DEX_PROTECT_A);
// --------------------------------------------------------------------------------------------------------
// Over-Option Type
/*
m_ItemTypes[OVER_TYPE].push_back(CON_HELM); m_ItemTypes[OVER_TYPE].push_back(DEX_HELM);
m_ItemTypes[OVER_TYPE].push_back(CON_HEAD); m_ItemTypes[OVER_TYPE].push_back(DEX_HEAD);
// --------------------------------------------------------------------------------------------------------
// No-Option Type
m_ItemTypes[NO_TYPE].push_back(CON_GLOVE); m_ItemTypes[NO_TYPE].push_back(CON_BOOTS);
m_ItemTypes[NO_TYPE].push_back(DEX_GLOVE); m_ItemTypes[NO_TYPE].push_back(DEX_BOOTS);
m_ItemTypes[NO_TYPE].push_back(CON_PELVIS); m_ItemTypes[NO_TYPE].push_back(CON_PROTECT_A);
m_ItemTypes[NO_TYPE].push_back(DEX_PELVIS); m_ItemTypes[NO_TYPE].push_back(DEX_PROTECT_A);
*/
// No-Option Type
// m_ItemTypes[NO_TYPE].push_back(RIDE); m_ItemTypes[NO_TYPE].push_back(TRANSFORM);
// --------------------------------------------------------------------------------------------------------
//--// start..
// --------------------------------------------------------------------------------------------------------
// Accessory Type
m_ItemTypes[ACCESSORY_TYPE].push_back(NECKLACE); m_ItemTypes[ACCESSORY_TYPE].push_back(RING);
m_ItemTypes[ACCESSORY_TYPE].push_back(RUNE);
// --------------------------------------------------------------------------------------------------------
//--// end..
// <20>ƹ<EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ItemTypes[AVATA_TYPE].push_back(RIDE); m_ItemTypes[AVATA_TYPE].push_back(TRANSFORM);
for (nCount = 0; nCount < MAX_ARRAY_TYPE; ++nCount)
{
std::sort(m_ItemTypes[nCount].begin(), m_ItemTypes[nCount].end());
}
// --------------------------------------------------------------------------------------------------------
// <20><><EFBFBD>Ѱ<EFBFBD> <20≯<EFBFBD>
m_ItemLimitNames[StatusLimit::NONE] = CTypeName(StatusLimit::NONE, "NONE");
m_ItemLimitNames[StatusLimit::STR] = CTypeName(StatusLimit::STR, "STR");
m_ItemLimitNames[StatusLimit::DEX] = CTypeName(StatusLimit::DEX, "DEX");
m_ItemLimitNames[StatusLimit::CON] = CTypeName(StatusLimit::CON, "CON");
m_ItemLimitNames[StatusLimit::INT] = CTypeName(StatusLimit::INT, "INT");
m_ItemLimitNames[StatusLimit::WIS] = CTypeName(StatusLimit::WIS, "WIS");
m_ItemLimitNames[StatusLimit::LEVEL] = CTypeName(StatusLimit::LEVEL, "LEVEL"); //--//
// --------------------------------------------------------------------------------------------------------
//--// start..
// --------------------------------------------------------------------------------------------------------
// <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20≯<EFBFBD>
m_ItemGradeNames[EquipType::S_GRADE] = CTypeName(EquipType::S_GRADE, "S");
m_ItemGradeNames[EquipType::AAA_GRADE] = CTypeName(EquipType::AAA_GRADE, "AAA");
m_ItemGradeNames[EquipType::AA_GRADE] = CTypeName(EquipType::AA_GRADE, "AA");
m_ItemGradeNames[EquipType::A_GRADE] = CTypeName(EquipType::A_GRADE, "A");
m_ItemGradeNames[EquipType::B_GRADE] = CTypeName(EquipType::B_GRADE, "B");
m_ItemGradeNames[EquipType::C_GRADE] = CTypeName(EquipType::C_GRADE, "C");
m_ItemGradeNames[EquipType::D_GRADE] = CTypeName(EquipType::D_GRADE, "D");
m_ItemGradeNames[EquipType::F_GRADE] = CTypeName(EquipType::F_GRADE, "F");
m_ItemGradeNames[EquipType::X_GRADE] = CTypeName(EquipType::X_GRADE, "X");
// --------------------------------------------------------------------------------------------------------
//--// end..
}
bool CItemType::IsCorrectItemType(ArrayType itemType, unsigned char cEquipType)
{
return std::binary_search(m_ItemTypes[itemType].begin(),
m_ItemTypes[itemType].end(), cEquipType);
}
bool CItemType::IsCorrectOptionType(EquipType::OptionType eOptionType, ItemType::Type eItemType)
{
switch (eOptionType)
{
case EquipType::STANDARD_OPTION: return IsCorrectItemType(STANDARD_TYPE, eItemType);
case EquipType::OVER_OPTION: return IsCorrectItemType(OVER_TYPE, eItemType);
case EquipType::NO_OPTION: return IsCorrectItemType(NO_TYPE, eItemType);
}
return false;
}
EquipType::OptionType CItemType::GetOptionType(ItemType::Type eItemType)
{
if (true == IsCorrectOptionType(EquipType::STANDARD_OPTION, eItemType))
{
return EquipType::STANDARD_OPTION;
}
if (true == IsCorrectOptionType(EquipType::OVER_OPTION, eItemType))
{
return EquipType::OVER_OPTION;
}
if (true == IsCorrectOptionType(EquipType::NO_OPTION, eItemType))
{
return EquipType::NO_OPTION;
}
return EquipType::NONE;
}
CItemType::ArrayType CItemType::GetEquipType(unsigned long dwItemFlag)
{
// <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20>ٴ<EFBFBD> <20>ֵ<EFBFBD>
if (dwItemFlag & DetailData::HELM) { return HELM_TYPE; }
if (dwItemFlag & DetailData::ARMOR) { return ARMOUR_TYPE; }
if (dwItemFlag & DetailData::DAGGER) { return DAGGER_TYPE; }
if (dwItemFlag & DetailData::ONEHANDED) { return ONEHANDED_TYPE; }
if (dwItemFlag & DetailData::LONGRANGE) { return LONGRANGE_TYPE; }
if (dwItemFlag & DetailData::TWOHANDED) { return TWOHANDED_TYPE; }
if (dwItemFlag & DetailData::STAFF) { return STAFF_TYPE; }
if (dwItemFlag & DetailData::SHIELD) { return SHIELD_TYPE; }
return MAX_ARRAY_TYPE;
}
void CItemType::SetEquipTypeFlags(ItemInfo& itemInfo)
{
using namespace ItemType;
switch (itemInfo.m_DetailData.m_cItemType)
{
case ARROW:
case BOLT:
itemInfo.m_DetailData.m_dwFlags |= DetailData::STACKABLE;
break;
}
if (IsCorrectItemType(HELM_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::HELM;
}
else if (IsCorrectItemType(ARMOUR_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::ARMOR;
}
else if (IsCorrectItemType(DAGGER_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::DAGGER;
}
else if (IsCorrectItemType(ONEHANDED_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::ONEHANDED;
}
else if (IsCorrectItemType(LONGRANGE_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::LONGRANGE;
}
else if (IsCorrectItemType(TWOHANDED_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::TWOHANDED;
}
else if (IsCorrectItemType(STAFF_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::STAFF;
}
else if (IsCorrectItemType(SHIELD_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::SHIELD;
}
itemInfo.m_DetailData.m_dwFlags |= DetailData::EQUIP;
}
//--// start..
void CItemType::SetAccessoryTypeFlags(ItemInfo& itemInfo)
{
using namespace ItemType;
switch (itemInfo.m_DetailData.m_cItemType)
{
case NECKLACE:
itemInfo.m_DetailData.m_dwFlags |= DetailData::NECKLACE;
itemInfo.m_DetailData.m_dwFlags |= DetailData::EQUIP;
break;
case RING:
itemInfo.m_DetailData.m_dwFlags |= DetailData::RING;
itemInfo.m_DetailData.m_dwFlags |= DetailData::EQUIP;
break;
case RUNE:
itemInfo.m_DetailData.m_dwFlags |= DetailData::RUNE;
itemInfo.m_DetailData.m_dwFlags |= DetailData::STACKABLE;
break;
}
}
//--// end.
void CItemType::SetAvataTypeFlags(ItemInfo& itemInfo)
{
using namespace ItemType;
switch (itemInfo.m_DetailData.m_cItemType)
{
case RIDE:
case TRANSFORM:
itemInfo.m_DetailData.m_dwFlags |= DetailData::AVATA;
itemInfo.m_DetailData.m_dwFlags |= DetailData::EQUIP;
break;
}
}
void CItemType::SetUseItemTypeFlags(ItemInfo& itemInfo)
{
using namespace ItemType;
switch (itemInfo.m_DetailData.m_cItemType)
{
case POTION:
case PORTAL:
case FIRE_CRACKER:
case FIXED_PORTAL:
case SKILL_ITEM:
itemInfo.m_DetailData.m_dwFlags |= DetailData::QUICKSLOT_IN;
break;
}
if (itemInfo.m_DetailData.m_cMaxDurabilityOrStack > 1)
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::STACKABLE;
}
itemInfo.m_DetailData.m_dwFlags |= DetailData::USE_ITEM;
}
void CItemType::SetEtcItemTypeFlags(ItemInfo& itemInfo)
{
if (itemInfo.m_DetailData.m_cMaxDurabilityOrStack > 1)
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::STACKABLE;
}
}
using namespace Attribute;
typedef ItemAttribute Gem;
typedef ItemAttribute Upg;
// edith 2008.03.02 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void CItemType::SetInstallGemAttribute(CItem* lpItem)
{
ItemAttribute aryArmorGemAttribute[EquipmentInfo::MAX_ATTRIBUTE_PER_GEM][MAX_GEM_KIND] = {
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȣ<><C8A3> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD> <09><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ڼ<EFBFBD><DABC><EFBFBD> <09><><EFBFBD>޶<EFBFBD><DEB6><EFBFBD> <09><EFBFBD><E4B8AE>Ʈ
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȸ<><C8B8> <09>ִ<EFBFBD>HP <09>ִ<EFBFBD>MP HPȸ<50><C8B8> MPȸ<50><C8B8> ũ<><C5A9>Ƽ<EFBFBD><C6BC> <09><><EFBFBD><EFBFBD> <09><><EFBFBD>ǵ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>ٿ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{ Gem(ARMOR, 1), Gem(ARMOR, 2), Gem(MAX_HP, 1), Gem(EVADE, 2), Gem(MAX_HP, 2), Gem(MAX_MP, 2), Gem(HP_REGEN, 2), Gem(MP_REGEN, 2), Gem(MAX_MP, 1), Gem(BLOCK, 2), Gem(SPEED, 2), Gem(MAGIC_POWER, 1), Gem(MAGIC_POWER, 2), Gem(MAGIC_RESIST, 2) },
{ Gem(EVADE, 1), Gem(NONE, 0), Gem(HP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(MP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(MAGIC_RESIST, 1), Gem(NONE, 0), Gem(NONE, 0) }
};
ItemAttribute aryDaggerGemAttribute[EquipmentInfo::MAX_ATTRIBUTE_PER_GEM][MAX_GEM_KIND] = {
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȣ<><C8A3> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD> <09><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ڼ<EFBFBD><DABC><EFBFBD> <09><><EFBFBD>޶<EFBFBD><DEB6><EFBFBD> <09><EFBFBD><E4B8AE>Ʈ
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȸ<><C8B8> <09>ִ<EFBFBD>HP <09>ִ<EFBFBD>MP HPȸ<50><C8B8> MPȸ<50><C8B8> ũ<><C5A9>Ƽ<EFBFBD><C6BC> <09><><EFBFBD><EFBFBD> <09><><EFBFBD>ǵ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>ٿ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{ Gem(MIN_DAMAGE, 1), Gem(MAX_DAMAGE, 2), Gem(HIT_RATE, 4), Gem(HIT_RATE, 2), Gem(MAX_HP, 2), Gem(MAX_MP, 2), Gem(HP_REGEN, 2), Gem(MP_REGEN, 2), Gem(CRITICAL, 2), Gem(CRITICAL, 1), Gem(MAX_HP, 1), Gem(MAX_MP, 1), Gem(MAGIC_POWER, 1), Gem(MAGIC_RESIST, 1) },
{ Gem(MAX_DAMAGE, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(MAX_DAMAGE, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(HIT_RATE, 2), Gem(HP_REGEN, 1), Gem(MP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0) }
};
ItemAttribute aryOneHandedWeaponGemAttribute[EquipmentInfo::MAX_ATTRIBUTE_PER_GEM][MAX_GEM_KIND] = {
{ Gem(MIN_DAMAGE, 2), Gem(MIN_DAMAGE, 1), Gem(HIT_RATE, 4), Gem(HIT_RATE, 2), Gem(MAX_HP, 2), Gem(MAX_MP, 2), Gem(HP_REGEN, 2), Gem(MP_REGEN, 2), Gem(CRITICAL, 2), Gem(CRITICAL, 1), Gem(MAX_HP, 1), Gem(MAX_MP, 1), Gem(MAGIC_POWER, 1), Gem(MAGIC_RESIST, 1) },
{ Gem(MAX_DAMAGE, 2), Gem(MAX_DAMAGE, 3), Gem(NONE, 0), Gem(MAX_DAMAGE, 2), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(HIT_RATE, 2), Gem(HP_REGEN, 1), Gem(MP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0) }
};
ItemAttribute aryTwoHandedWeaponGemAttribute[EquipmentInfo::MAX_ATTRIBUTE_PER_GEM][MAX_GEM_KIND] = {
{ Gem(MIN_DAMAGE, 3), Gem(MIN_DAMAGE, 2), Gem(HIT_RATE, 4), Gem(HIT_RATE, 2), Gem(MAX_HP, 2), Gem(MAX_MP, 2), Gem(HP_REGEN, 2), Gem(MP_REGEN, 2), Gem(CRITICAL, 2), Gem(CRITICAL, 1), Gem(MAX_HP, 1), Gem(MAX_MP, 1), Gem(MAGIC_POWER, 1), Gem(MAGIC_RESIST, 1) },
{ Gem(MAX_DAMAGE, 3), Gem(MAX_DAMAGE, 4), Gem(NONE, 0), Gem(MAX_DAMAGE, 3), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(HIT_RATE, 2), Gem(HP_REGEN, 1), Gem(MP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0) }
};
ItemAttribute aryStaffGemAttribute[EquipmentInfo::MAX_ATTRIBUTE_PER_GEM][MAX_GEM_KIND] = {
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȣ<><C8A3> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD> <09><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ڼ<EFBFBD><DABC><EFBFBD> <09><><EFBFBD>޶<EFBFBD><DEB6><EFBFBD> <09><EFBFBD><E4B8AE>Ʈ
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȸ<><C8B8> <09>ִ<EFBFBD>HP <09>ִ<EFBFBD>MP HPȸ<50><C8B8> MPȸ<50><C8B8> ũ<><C5A9>Ƽ<EFBFBD><C6BC> <09><><EFBFBD><EFBFBD> <09><><EFBFBD>ǵ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>ٿ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{ Gem(MAGIC_POWER, 3), Gem(MAGIC_RESIST, 3), Gem(HIT_RATE, 4), Gem(MAGIC_POWER, 3), Gem(MAX_HP, 2), Gem(MAX_MP, 4), Gem(HP_REGEN, 2), Gem(MP_REGEN, 4), Gem(CRITICAL, 2), Gem(CRITICAL, 1), Gem(MAX_HP, 1), Gem(MAX_MP, 2), Gem(MAGIC_POWER, 6), Gem(MAGIC_RESIST, 6) },
{ Gem(MAX_DAMAGE, 3), Gem(MAX_DAMAGE, 3), Gem(NONE, 0), Gem(MAGIC_RESIST, 3), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(HIT_RATE, 2), Gem(HP_REGEN, 1), Gem(MP_REGEN, 2), Gem(NONE, 0), Gem(NONE, 0) }
};
ItemAttribute aryShieldGemAttribute[EquipmentInfo::MAX_ATTRIBUTE_PER_GEM][MAX_GEM_KIND] = {
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȣ<><C8A3> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD> <09><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> <09>ڼ<EFBFBD><DABC><EFBFBD> <09><><EFBFBD>޶<EFBFBD><DEB6><EFBFBD> <09><EFBFBD><E4B8AE>Ʈ
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD> ȸ<><C8B8> <09>ִ<EFBFBD>HP <09>ִ<EFBFBD>MP HPȸ<50><C8B8> MPȸ<50><C8B8> ũ<><C5A9>Ƽ<EFBFBD><C6BC> <09><><EFBFBD><EFBFBD> <09><><EFBFBD>ǵ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD>ٿ<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{ Gem(ARMOR, 1), Gem(ARMOR, 2), Gem(MAX_HP, 1), Gem(EVADE, 2), Gem(MAX_HP, 2), Gem(MAX_MP, 2), Gem(HP_REGEN, 2), Gem(MP_REGEN, 2), Gem(MAX_MP, 1), Gem(BLOCK, 2), Gem(SPEED, 2), Gem(MAGIC_POWER, 1), Gem(MAGIC_POWER, 2), Gem(MAGIC_RESIST, 2) },
{ Gem(EVADE, 1), Gem(NONE, 0), Gem(HP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(MP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(MAGIC_RESIST, 1), Gem(NONE, 0), Gem(NONE, 0) }
};
// edith 2009.06.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڱ<EFBFBD> <20><><EFBFBD><EFBFBD>
ItemAttribute aryRuneGemAttribute[EquipmentInfo::MAX_ATTRIBUTE_PER_GEM][MAX_GEM_KIND] = {
// Fehu Othila Jera dummy~
{ Gem(LUCKCHANCE, 1), Gem(LUCKCHANCE, 2), Gem(LUCKCHANCE, 3), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(MP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(MAGIC_RESIST, 1), Gem(NONE, 0), Gem(NONE, 0) },
{ Gem(NONE, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(NONE, 0), Gem(MP_REGEN, 1), Gem(NONE, 0), Gem(NONE, 0), Gem(MAGIC_RESIST, 1), Gem(NONE, 0), Gem(NONE, 0) }
};
using namespace ItemType;
CEquipment* lpEquip = CEquipment::DowncastToEquipment(lpItem);
if (NULL != lpEquip)
{
short GemType = 0; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
short GemLevel = 0; // <20><><EFBFBD><EFBFBD> ũ<><C5A9>
unsigned short AttributeIndex = 0;
for (unsigned char SocketIndex = 0;
SocketIndex < lpEquip->GetCurrentSocketNum() && AttributeIndex < EquipmentInfo::MAX_SOCKET_ATTRIBUTE_NUM;
++SocketIndex)
{
GemType = (lpEquip->GetSocket(SocketIndex) - 1) % MAX_GEM_KIND;
GemLevel = ((lpEquip->GetSocket(SocketIndex) - 1) / MAX_GEM_KIND) + 1;
for (unsigned char cIndex = 0; cIndex < EquipmentInfo::MAX_ATTRIBUTE_PER_GEM; ++cIndex)
{
Gem GemAttr;
// edith 2009.06.23 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڱ<EFBFBD>
if(GemLevel == GEMETYPE_RUNE) /// <20><> <20><><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
{
if(GemType >= GEMETYPE_RUNE_NUM)
break;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƸӸ<C6B8> <20>Ѵ<EFBFBD>.
switch (Item::CItemType::GetEquipType(lpEquip->GetItemInfo().m_DetailData.m_dwFlags))
{
case HELM_TYPE: GemAttr = aryRuneGemAttribute[cIndex][GemType]; break;
case ARMOUR_TYPE: GemAttr = aryRuneGemAttribute[cIndex][GemType]; break;
}
if (0 == GemAttr.m_usValue)
{
break;
}
}
else
{
// <20>Ϲ<EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD≯<EFBFBD>
switch (Item::CItemType::GetEquipType(lpEquip->GetItemInfo().m_DetailData.m_dwFlags))
{
case HELM_TYPE: GemAttr = aryArmorGemAttribute[cIndex][GemType]; break;
case ARMOUR_TYPE: GemAttr = aryArmorGemAttribute[cIndex][GemType]; break;
case DAGGER_TYPE: GemAttr = aryDaggerGemAttribute[cIndex][GemType]; break;
case ONEHANDED_TYPE:
case LONGRANGE_TYPE:
GemAttr = aryOneHandedWeaponGemAttribute[cIndex][GemType];
break;
case TWOHANDED_TYPE: GemAttr = aryTwoHandedWeaponGemAttribute[cIndex][GemType]; break;
case STAFF_TYPE: GemAttr = aryStaffGemAttribute[cIndex][GemType]; break;
case SHIELD_TYPE: GemAttr = aryShieldGemAttribute[cIndex][GemType]; break;
}
if (0 == GemAttr.m_usValue)
{
break;
}
GemAttr.m_usValue *= GemLevel;
}
lpEquip->m_SocketAttribute[AttributeIndex] = GemAttr;
++AttributeIndex;
}
}
}
}
void CItemType::SetUpgradeItemAttribute(CItem* lpItem)
{
ItemAttribute aryArmorUpgrade[EquipmentInfo::MAX_ATTRIBUTE_PER_UPGRADE_LEVEL][MAX_LEVEL_OPTION_UPGRADE] = {
{ Upg(ARMOR, 4), Upg(EVADE, 2), Upg(MAX_HP, 1), Upg(HP_REGEN, 1), Upg(MAGIC_RESIST, 1) },
{ Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0) }
};
ItemAttribute aryDaggerUpgrad[EquipmentInfo::MAX_ATTRIBUTE_PER_UPGRADE_LEVEL][MAX_LEVEL_OPTION_UPGRADE] = {
{ Upg(MIN_DAMAGE, 2), Upg(HIT_RATE, 8), Upg(MAX_MP, 1), Upg(MP_REGEN, 1), Upg(CRITICAL, 1) },
{ Upg(MAX_DAMAGE, 2), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0) }
};
ItemAttribute aryOneHandedWeaponUpgrade[EquipmentInfo::MAX_ATTRIBUTE_PER_UPGRADE_LEVEL][MAX_LEVEL_OPTION_UPGRADE] = {
{ Upg(MIN_DAMAGE, 4), Upg(HIT_RATE, 8), Upg(MAX_MP, 1), Upg(MP_REGEN, 1), Upg(CRITICAL, 1) },
{ Upg(MAX_DAMAGE, 4), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0) }
};
ItemAttribute aryTwoHandedWeaponUpgrade[EquipmentInfo::MAX_ATTRIBUTE_PER_UPGRADE_LEVEL][MAX_LEVEL_OPTION_UPGRADE] = {
{ Upg(MIN_DAMAGE, 6), Upg(HIT_RATE, 8), Upg(MAX_MP, 1), Upg(MP_REGEN, 1), Upg(CRITICAL, 1) },
{ Upg(MAX_DAMAGE, 6), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0) }
};
ItemAttribute aryStaffUpgrade[EquipmentInfo::MAX_ATTRIBUTE_PER_UPGRADE_LEVEL][MAX_LEVEL_OPTION_UPGRADE] = {
{ Upg(MAGIC_POWER, 10), Upg(HIT_RATE, 8), Upg(MAX_MP, 2), Upg(MP_REGEN, 2), Upg(CRITICAL, 1) },
{ Upg(MAX_DAMAGE, 6), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0) }
};
ItemAttribute aryShieldUpgrade[EquipmentInfo::MAX_ATTRIBUTE_PER_UPGRADE_LEVEL][MAX_LEVEL_OPTION_UPGRADE] = {
{ Upg(MAX_HP, 1), Upg(HP_REGEN, 1), Upg(MAX_MP, 1), Upg(MP_REGEN, 1), Upg(BLOCK, 1) },
{ Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0), Upg(NONE, 0) }
};
using namespace ItemType;
CEquipment* lpEquip = CEquipment::DowncastToEquipment(lpItem);
if (NULL != lpEquip)
{
short AttributeIndex = 0;
unsigned char cUpgradeLevel = min(lpEquip->GetUpgradeLevel(), MAX_LEVEL_OPTION_UPGRADE);
for (unsigned char cLevelIndex = 0;
cLevelIndex < cUpgradeLevel && AttributeIndex < EquipmentInfo::MAX_UPGRADE_ATTRIBUTE;
++cLevelIndex)
{
for (unsigned char cAttributeIndex = 0; cAttributeIndex < EquipmentInfo::MAX_ATTRIBUTE_PER_UPGRADE_LEVEL; ++cAttributeIndex)
{
Upg UpgAttr;
switch (lpEquip->GetItemInfo().m_DetailData.m_cItemType)
{
case CON_ARMOUR: case CON_BODY:
case DEX_ARMOUR: case DEX_BODY:
// edith 2008.01.14 <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case CON_HELM:
case DEX_HELM:
case CON_HEAD:
case DEX_HEAD:
case CON_GLOVE:
case DEX_GLOVE:
case CON_BOOTS:
case DEX_BOOTS:
case CON_PELVIS:
case DEX_PELVIS:
case CON_PROTECT_A:
case DEX_PROTECT_A:
UpgAttr = aryArmorUpgrade[cAttributeIndex][cLevelIndex];
break;
case DAGGER: case OPP_TALON: case SKILL_A_KNIFE:
UpgAttr = aryDaggerUpgrad[cAttributeIndex][cLevelIndex];
break;
case ONEHANDED_SWORD: case ONEHANDED_AXE: case ONEHANDED_BLUNT:
case OPP_HAMMER: case OPP_AXE: case OPP_SLUSHER:
case SKILL_A_ATTACK: case SKILL_A_GUN:
case BOW: case CROSSBOW:
case COM_BLUNT: case COM_SWORD:
UpgAttr = aryOneHandedWeaponUpgrade[cAttributeIndex][cLevelIndex];
break;
case TWOHANDED_SWORD: case TWOHANDED_AXE: case TWOHANDED_BLUNT:
UpgAttr = aryTwoHandedWeaponUpgrade[cAttributeIndex][cLevelIndex];
break;
case STAFF: case OPP_SYTHE:
UpgAttr = aryStaffUpgrade[cAttributeIndex][cLevelIndex];
break;
case SHIELD: case SKILL_A_GUARD:
UpgAttr = aryShieldUpgrade[cAttributeIndex][cLevelIndex];
break;
}
if (0 == UpgAttr.m_usValue)
{
break;
}
lpEquip->m_UpgradeAttribute[AttributeIndex] = UpgAttr;
++AttributeIndex;
}
}
}
}

View File

@@ -0,0 +1,538 @@
#ifndef _ITEM_CONSTANTS_H_
#define _ITEM_CONSTANTS_H_
#include <vector>
#include <Utility/TypeArray.h>
namespace Item
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
struct ItemInfo;
struct ItemAttribute;
class CItem;
enum Const
{
MAX_GEM_KIND = 14, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
MAX_LEVEL_OPTION_UPGRADE = 5, // <20><><EFBFBD>ý<EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.)
MAX_OPTION_BASE_NUM = 6, // <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> +<2B><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
GEMETYPE_RUNE = 5, // 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>
GEMETYPE_RUNE_NUM = 12, // <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> 12<31><32><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD> 3<><33> <20><><EFBFBD><EFBFBD>
MAX_TEMP_INVEN_ITEM_NUM = 20, // <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
PRICE_AGGRAVATION = 7, // <20><><EFBFBD><EFBFBD><EBB7B1> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ġ
GM_MODEL_ITEM = 49999, // GM <20>𵨷<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>.
MAX_UPGRADE_COUNT = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><>.
};
namespace ItemType
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> ( 8bit )
enum Type
{
NONE = 0,
// <20><><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>
SHIRT = 1, TUNIC = 2,
// <20>ΰ<EFBFBD> <20><><EFBFBD>
CON_ARMOUR = 3, CON_HELM = 4,
CON_GLOVE = 5, CON_BOOTS = 6,
DEX_ARMOUR = 7, DEX_HELM = 8,
DEX_GLOVE = 9, DEX_BOOTS = 10,
// <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD>
ONEHANDED_SWORD = 11, TWOHANDED_SWORD = 12,
ONEHANDED_AXE = 13, TWOHANDED_AXE = 14,
ONEHANDED_BLUNT = 15, TWOHANDED_BLUNT = 16,
BOW = 17, CROSSBOW = 18,
STAFF = 19, DAGGER = 20,
SHIELD = 21,
// <20><>ĭ <20><><EFBFBD>
CON_BODY = 22, CON_HEAD = 23,
CON_PELVIS = 24, CON_PROTECT_A = 25,
DEX_BODY = 26, DEX_HEAD = 27,
DEX_PELVIS = 28, DEX_PROTECT_A = 29,
// <20><>ĭ <20><><EFBFBD><EFBFBD>
COM_BLUNT = 30, COM_SWORD = 31,
OPP_HAMMER = 32, OPP_AXE = 33,
OPP_SLUSHER = 34, OPP_TALON = 35,
OPP_SYTHE = 36,
// <20><>ų<EFBFBD><C5B3>
SKILL_A_GUARD = 37, SKILL_A_ATTACK = 38,
SKILL_A_GUN = 39, SKILL_A_KNIFE = 40,
// ź<><C5BA><EFBFBD><EFBFBD>
ARROW = 41, BOLT = 42,
AMMO = 43,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POTION = 44, EXP_BOOK = 45,
CASH_BOOK = 46, EVENT_LOTTERY = 47,
PORTAL = 48, FIRE_CRACKER = 49,
SKILL_BOOK = 50, FIXED_PORTAL = 51,
SKILL_ITEM = 52, CASH_ITEM = 53,
// <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GEM = 54, ORE = 55,
ETC = 56,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8>Ŷ
CAMP_KIT = 57, SHORT_RANGE_ARMS_KIT = 58,
LONG_RANGE_ARMS_KIT = 59, AIRSHIP_KIT = 60,
WORLDWEAPON_K_KIT = 61, WORLDWEAPON_M_KIT = 62,
MINERAL_KIT = 63,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QUEST_ITEM = 64,
// <20>Ǽ<EFBFBD><C7BC><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NECKLACE = 65, RING = 66,
RUNE = 67,
// <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>/<2F>ǸŰ<C7B8> <20><><EFBFBD><EFBFBD>. 2006-06-19 by hackermz)
GEM_SELL = 68,
// <20><><EFBFBD>̴<EFBFBD>
RIDE = 69, TRANSFORM = 70,
MAX_ITEM_TYPE = 71,
};
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
namespace StatusLimit
{
enum Type
{
NONE = 0,
STR = 1,
DEX = 2,
CON = 3,
INT = 4,
WIS = 5,
LEVEL = 6,
MAX_STATUS_LIMIT = 7
};
};
namespace Attribute
{
enum Type
{
// ---------------------------------------------------------------------------
// <20><> <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> DB <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF>մϴ<D5B4>.
NONE = 0,
MIN_DAMAGE = 1,
MAX_DAMAGE = 2,
ARMOR = 3,
HIT_RATE = 4,
EVADE = 5,
MAX_HP = 6,
HP_REGEN = 7,
MAX_MP = 8,
MP_REGEN = 9,
CRITICAL = 10,
BLOCK = 11,
SPEED = 12,
MAGIC_POWER = 13,
MAGIC_RESIST = 14,
LUCKCHANCE = 15,
MAX_DB_ATTRIBUTE_NUM = 16,
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. (<28><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.)
COOLDOWN = 16,
SKILL_POINT = 17,
FROST = 18,
FIRE = 19,
ELECTRO = 20,
DARKNESS = 21,
RUNTYPE = 22,
MAX_ATTRIBUTE_NUM = 22
// ---------------------------------------------------------------------------
};
enum Trend
{
Aggressive = (1 << 0),
Defensive = (1 << 1)
};
enum CriticalType
{
NONE_TYPE = 0,
SWORD_TYPE = 1,
AXE_TYPE = 2,
BLUNT_TYPE = 3
};
extern const CTypeName Attributes[MAX_ATTRIBUTE_NUM];
};
namespace EquipType
{
enum Type
{
ARMOR_TYPE = 0, // <20><><EFBFBD><EFBFBD>
DAGGER_TYPE = 1, // <20>ܰ<EFBFBD>
ONEHANDED_WEAPON_TYPE = 2, // <20>Ѽչ<D1BC><D5B9><EFBFBD>
LONGRANGE_WEAPON_TYPE = 3, // <20><><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD>
TWOHANDED_WEAPON_TYPE = 4, // <20><><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD>
STAFF_TYPE = 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SHIELD_TYPE = 6, // <20><><EFBFBD><EFBFBD>
MAX_TYPE = 7
};
enum Grade
{
S_GRADE = 0,
AAA_GRADE = 1,
AA_GRADE = 2,
A_GRADE = 3,
B_GRADE = 4,
C_GRADE = 5,
D_GRADE = 6,
F_GRADE = 7,
X_GRADE = 8,
MAX_GRADE = 9
};
enum OptionType
{
NONE = 0,
STANDARD_OPTION = 1,
OVER_OPTION = 2,
NO_OPTION = 3,
MAX_OPTION_TYPE = 4
};
};
namespace EquipmentPos
{
// <20><><EFBFBD><EFBFBD> <20><>ġ ( 8bit )
enum Type
{
// <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ
HELM = 0, SHIRT = 1,
TUNIC = 2, ARMOUR = 3,
GLOVE = 4, BOOTS = 5,
NECKLACE = 6, RINGR = 7,
RINGL = 8, SHIELD_HAND1 = 9,
SHIELD_HAND2 = 10, WEAPON_HAND1 = 11,
WEAPON_HAND2 = 12, AVATA = 13,
// <20><>ĭ <20><><EFBFBD><EFBFBD> <20><>ġ
HEAD = 0, BODY = 3,
PROTECT_ARM = 4, PELVIS = 5,
SKILL_ARM = 9, WEAPON = 11,
MAX_EQUPMENT_POS = 15,
TEMP_ITEM_INDEX = 128
};
};
namespace ExtraSpacePos
{
enum Type
{
// --------------------------------------------------------------------------
// 2004-07-14 by <20>ε<EFBFBD>
//
// Extra<72><61> DB ũ<><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EBB7AE> <20>ִ<EFBFBD> 494 / 508 bytes
// ( DB ũ<><20>ʰ<EFBFBD><CAB0><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>սô<D5BD>. )
//
// <20><><EFBFBD><EFBFBD> <20>ڷ<EFBFBD> : <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9><EFBFBD><EFBFBD> 14 bytes,
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ũ<><C5A9><EFBFBD><EFBFBD> 52 bytes
// ( Ǯ<>ɼ<EFBFBD><C9BC>϶<EFBFBD>... 14(<28>⺻) + 6(<28><><EFBFBD><EFBFBD>) + 8(<28><><EFBFBD><EFBFBD>) + 24(<28>ɼ<EFBFBD>) )
// --------------------------------------------------------------------------
UPGRADE_EQUIPMENT_POS = 0, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
UPGRADE_MATERIAL_POS = 1, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HOLDITEM_POS = 2, // <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
KIT_MATERIAL_POS = 3, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CAMP_MATERIAL_POS = 4, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS1 = 5, // <20><>¡<EFBFBD><C2A1> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS2 = 6, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS3 = 7, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS4 = 8, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS5 = 9, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS6 = 10, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS7 = 11, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS8 = 12, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
EMBLEM_JEWEL_POS9 = 13, // (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
GRAFT_ORIGINAL_POS = 14, // <20>ɼ<EFBFBD> <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
GRAFT_SACRIFICE_POS = 15, // <20>ɼ<EFBFBD> <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
GRAFT_RESULT_POS = 16, // <20>ɼ<EFBFBD> <20>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
COMPENSATION_POS = 17, // <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>
MAX_EXTRA_SPACE_NUM = 18,
EMBLEM_JEWEL_POS_NUM = 9
};
};
namespace GiveItem
{
enum ExceptionUID : unsigned __int64
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>޽<EFBFBD> <20>ӽ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD><E4B8AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><C2B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> UID
PENDING_ITEM_UID = 0xFFFFFFFFFFFFFFFF
};
};
namespace EtcItemID
{
enum Type
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
GEM_START_ID = 1901,
GEM_END_ID = 1942,
GEM_PERFECTEND_ID = 1956,
GEM_RUNE_START_ID = 1957, // <20><><EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><D3BC>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><EFBFBD><E9BAB8><EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20>Ҹ<EFBFBD>)
GEM_RUNE_END_ID = 1968,
GEM_UNSOCKET_ID = 1970,
GEM_MAXSOCKET_ID = 1971,
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
RUNE_START_ID = 40000, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20><> ID<49><44> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ!)
RUNE_END_ID = 44096,
// <20>Ҹ<EFBFBD><D2B8><EFBFBD> <20><> ID
DESTRUCTION_RUNE = 40000,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
MINERAL_START_ID = 2001,
MINERAL_END_ID = 2003,
SILVIN = 2001,
MITHRIL = 2002,
ITERNIUM = 2003,
SOULMETAL = 2004,
ANTONIUM = 2005,
ANCIENTMETAL = 2006,
ENDURANCESTONE = 2007,
AWAKENCORE = 2008, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ھ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EBB7B9>-5 ȿ<><C8BF>)
// <20><>ö ID
SCRAPS = 2101,
// ȸ<><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
BREAD = 3020,
RARE_STEAK = 3021,
WELLDONE_STEAK = 3022,
BACON = 3023,
// <20><><EFBFBD><EFBFBD>
MANNA1 = 3024,
MANNA2 = 3025,
MANNA3 = 3026,
MANNA4 = 3027,
// <20><><EFBFBD><EFBFBD>
SOUP1 = 3028,
SOUP2 = 3029,
SOUP3 = 3030,
SOUP4 = 3031,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD>۾<EFBFBD><DBBE>̵<EFBFBD> + 3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>Ǿ<EFBFBD><C7BE>̵<EFBFBD>
POTION1 = 3105,
POTION2 = 3109,
POTION3 = 3113,
POTION4 = 3117,
POTION5 = 3121,
POTION6 = 3153,
POTION7 = 3157,
POTION8 = 3161,
POTION9 = 3165,
POTION10 = 3169,
POTION11 = 3176,
POTION12 = 3180,
POTION13 = 3184,
POTION14 = 3188,
// POTION15 = 3192, // HP, MP
// <20><>ų<EFBFBD><C5B3> <20><><EFBFBD><EFBFBD> ID
SKILL_COUPON_3 = 3401,
SKILL_COUPON_4 = 3402,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŸƮŶ ID
CAMP_KIT_ID = 7100,
SHORT_RANGE_ARMS_KIT_ID = 7101,
LONG_RANGE_ARMS_KIT_ID = 7102,
AIRSHIP_KIT_ID = 7103,
WORLDWEAPON_K_KIT = 7105,
WORLDWEAPON_M_KIT = 7106,
MINERAL_KIT = 7107,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
SIEGE_MATERIAL_ID = 7104,
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD> ID
OBLIVION_STONE = 9914,
ORB_EXP = 9101,
ORB_LUCK = 9102,
CASHPOTION1 = 9001,
CASHPOTION2 = 9003,
CASHPOTION3 = 9007,
CASHPOTION4 = 9009,
CASHPOTION5 = 9011,
CASHPOTION6 = 9013,
CASHPOTION7 = 9015,
CASHPOTION8 = 9017,
CASHPOTION9 = 9019,
CASHPOTION10 = 9021,
CASHPOTION11 = 9023,
CASHPOTION12 = 9025,
CASHPOTION13 = 9027,
CASHPOTION14 = 9029,
// CASHPOTION15 = 9005,
RIDEH1 = 9104,
RIDEH2 = 9106,
RIDEA1 = 9105,
RIDEA2 = 9107,
// <20><>Ȱ<EFBFBD>ǵ<EFBFBD> ID
REBIRTH_STONE = 9201,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B0A1> ID
RENAME_WARRANT = 9200,
};
};
namespace Chemical
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD>
enum Result
{
S_SUCCESS = 0, // <20><><EFBFBD><EFBFBD>
F_WRONG_RECIPE = 2, // <20>ùٸ<C3B9> <20>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>.
F_NOT_ENOUGH_ITEM = 3, // <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ּҷ<D6BC><D2B7><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>մϴ<D5B4>.
F_WRONG_RATE = 4, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>մϴ<D5B4>. <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֽñ<D6BD> <20>ٶ<EFBFBD><D9B6>ϴ<EFBFBD>.
F_NOT_QUEST = 5, // <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ߴ<EFBFBD>.
F_NOT_ABILITY = 6, // <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
};
};
namespace Compensation
{
// Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ư<><C6AF> <20><><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD>
enum SpeacialCase
{
CASE1 = ItemType::MAX_ITEM_TYPE,
CASE2 = ItemType::MAX_ITEM_TYPE + 1,
CASE3 = ItemType::MAX_ITEM_TYPE + 2,
CASE4 = ItemType::MAX_ITEM_TYPE + 3,
CASE5 = ItemType::MAX_ITEM_TYPE + 4,
CASE6 = ItemType::MAX_ITEM_TYPE + 5,
CASE7 = ItemType::MAX_ITEM_TYPE + 6,
CASE8 = ItemType::MAX_ITEM_TYPE + 7,
CASE9 = ItemType::MAX_ITEM_TYPE + 8,
MAX_CASE = ItemType::MAX_ITEM_TYPE + 9
};
};
class CItemType
{
public:
enum ArrayType
{
EQUIP_TYPE = 0, // <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8>
USE_ITEM_TYPE = 1, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>
WEAPON_TYPE = 2, // <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8>
SKILL_ARM_TYPE = 3,
HELM_TYPE = 4, // <20><><EFBFBD><EFBFBD>
ARMOUR_TYPE = 5, // <20><><EFBFBD><EFBFBD>
DAGGER_TYPE = 6, // <20>ܰ<EFBFBD>
ONEHANDED_TYPE = 7, // <20>Ѽչ<D1BC><D5B9><EFBFBD>
LONGRANGE_TYPE = 8, // <20><><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD>
TWOHANDED_TYPE = 9, // <20><><EFBFBD>չ<EFBFBD><D5B9><EFBFBD>
STAFF_TYPE = 10, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SHIELD_TYPE = 11, // <20><><EFBFBD><EFBFBD>
STANDARD_TYPE = 12,
OVER_TYPE = 13,
NO_TYPE = 14,
ACCESSORY_TYPE = 15,
AVATA_TYPE = 16,
MAX_ARRAY_TYPE = 17
};
typedef std::vector<ItemAttribute> ItemAttributeArray;
static CItemType& GetInstance();
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
static ArrayType GetEquipType(unsigned long dwItemFlag);
// Rodin : <20><> <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD> CEquipment<6E><74> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> <20>Ǵ°<C7B4> <20><><EFBFBD><EFBFBD> <20><>? (<28>׷<EFBFBD><D7B7>鼭 CEquipment<6E><74> friend<6E><64> <20><><EFBFBD><EFBFBD>!)
static void SetInstallGemAttribute(CItem* lpItem);
static void SetUpgradeItemAttribute(CItem* lpItem);
// <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
bool IsCorrectItemType(ArrayType itemType, unsigned char cEquipType);
bool IsCorrectOptionType(EquipType::OptionType eOptionType, ItemType::Type eItemType);
EquipType::OptionType GetOptionType(ItemType::Type eItemType);
void SetEquipTypeFlags(ItemInfo& itemInfo);
void SetAccessoryTypeFlags(ItemInfo& itemInfo);
void SetAvataTypeFlags(ItemInfo& itemInfo);
void SetUseItemTypeFlags(ItemInfo& itemInfo);
void SetEtcItemTypeFlags(ItemInfo& itemInfo);
CTypeName* GetItemTypeName(void) { return m_ItemTypeNames; }
CTypeName* GetItemLimitName(void) { return m_ItemLimitNames; }
CTypeName* GetItemGradeName(void) { return m_ItemGradeNames; }
private:
CItemType();
typedef std::vector<ItemType::Type> ItemTypeArray;
ItemTypeArray m_ItemTypes[MAX_ARRAY_TYPE];
CTypeName m_ItemTypeNames[ItemType::MAX_ITEM_TYPE];
CTypeName m_ItemLimitNames[StatusLimit::MAX_STATUS_LIMIT];
CTypeName m_ItemGradeNames[EquipType::MAX_GRADE];
};
};
#endif

View File

@@ -0,0 +1,298 @@
#include "stdafx.h"
#include <Utility/Math/Math.h>
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> include<64><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
#include <Log/ServerLog.h>
#include "ItemStructure.h"
#include "ItemDataParser.h"
#include "GMMemory.h"
using namespace Item;
bool ReadString(char* szBuffer_Out, int nBufferLen, const char* szValue_In)
{
int nLength = _snprintf(szBuffer_Out, nBufferLen - 1, "%s", szValue_In);
if (0 <= nLength)
{
szBuffer_Out[nLength] = '\0';
return true;
}
szBuffer_Out[nBufferLen - 1] = '\0';
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. Data:%s", szValue_In);
return false;
}
inline bool ReadValue(unsigned char& cValue_Out, const char* szValue_In)
{
cValue_Out = static_cast<unsigned char>(atoi(szValue_In));
return true;
}
inline bool ReadValue(unsigned short& usValue_Out, const char* szValue_In)
{
usValue_Out = static_cast<unsigned short>(atoi(szValue_In));
return true;
}
inline bool ReadValue(unsigned long& dwValue_Out, const char* szValue_In)
{
dwValue_Out = static_cast<unsigned long>(atol(szValue_In));
return true;
}
inline bool ReadValue(float& fValue_Out, const char* szValue_In)
{
fValue_Out = static_cast<float>(atof(szValue_In));
return true;
}
bool ReadStringToTypeValue(unsigned char& cValue_Out, const CTypeName* lpTypeArray,
const unsigned char nMaxType, const char* szValue_In)
{
for (unsigned char nCount = 0; nCount < nMaxType; ++nCount)
{
const char* szTypeName = lpTypeArray[nCount].GetTypeName();
if (NULL != szTypeName)
{
if (0 == strcmp(szValue_In, szTypeName))
{
cValue_Out = lpTypeArray[nCount].GetTypeValue();
return true;
}
}
}
return false;
}
bool ReadStringToBool(bool& bValue_Out, const char* szValue_In)
{
char szBuffer[2];
_snprintf(szBuffer, 2, "%s", szValue_In);
bValue_Out = (!strcmp(szBuffer, "O")) ? true : false;
return true;
}
// <20><20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>
bool ReadID(Item::ItemInfo& itemInfo, const char* szValue)
{
itemInfo.m_usProtoTypeID = static_cast<unsigned short>(atoi(szValue));
if (0 == itemInfo.m_usProtoTypeID || 0xFFFF == itemInfo.m_usProtoTypeID)
{
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. 0<>̳<EFBFBD> 0xFFFF<46><46> <20><><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. ID:0x%08x",
itemInfo.m_usProtoTypeID);
return false;
}
return true;
}
bool ReadItemName(Item::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_SpriteData.m_szName, SpriteData::MAX_NAME, szValue); }
bool ReadFieldModelName(Item::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szFieldModelName, StringData::MAX_FIELD_MODEL_NAME, szValue); }
bool ReadAttachedModelName(Item::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szEquipModelName, StringData::MAX_EQUIP_MODEL_NAME, szValue); }
bool ReadSpriteDDS(Item::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_SpriteData.m_szSpriteName, SpriteData::MAX_SPRITE_NAME, szValue); }
bool ReadMinX(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMinX, szValue); }
bool ReadMinY(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMinY, szValue); }
bool ReadMaxX(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMaxX, szValue); }
bool ReadMaxY(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMaxY, szValue); }
bool ReadSizeX(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cXSize, szValue); }
bool ReadSizeY(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cYSize, szValue); }
bool ReadEffectSound(Item::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szEffectSoundName, StringData::MAX_EFFECT_SOUND_NAME, szValue); }
bool ReadItemType(Item::ItemInfo& itemInfo, const char* szValue)
{
return ReadStringToTypeValue(itemInfo.m_DetailData.m_cItemType,
Item::CItemType::GetInstance().GetItemTypeName(), Item::ItemType::MAX_ITEM_TYPE, szValue);
}
bool ReadTypeName(Item::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szTypeName, StringData::MAX_TYPE_NAME, szValue); }
bool ReadAbleExchangeNDrop(Item::ItemInfo& itemInfo, const char* szValue) { return ReadStringToBool(itemInfo.m_DetailData.m_bExchangeAndDrop, szValue); }
bool ReadAbleSell(Item::ItemInfo& itemInfo, const char* szValue) { return ReadStringToBool(itemInfo.m_DetailData.m_bSell, szValue); }
bool ReadMinDropLevel(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cMinDropLevel, szValue); }
bool ReadMaxDropLevel(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cMaxDropLevel, szValue); }
bool ReadPrice(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_dwPrice, szValue); }
bool ReadOptionPrice(Item::ItemInfo& itemInfo, const char* szValue) { return ReadStringToBool(itemInfo.m_DetailData.m_bOptionPrice, szValue); }
bool ReadBlackPrice(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_dwBlackPrice, szValue); }
bool ReadMedalPrice(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_dwMedalPrice, szValue); }
bool ReadDurability(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cDefaultDurabilityOrStack, szValue); }
bool ReadMaxDurability(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cMaxDurabilityOrStack, szValue); }
bool ReadClassLimit(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_dwClassLimit, szValue); }
bool ReadLowLevel(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_wLowLimitLevel, szValue); }
bool ReadHighLevel(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_wHighLimitLevel, szValue); }
bool ReadLimitStatus(Item::ItemInfo& itemInfo, const char* szValue)
{
return ReadStringToTypeValue(itemInfo.m_UseLimit.m_cLimitStatus,
Item::CItemType::GetInstance().GetItemLimitName(), Item::StatusLimit::MAX_STATUS_LIMIT, szValue);
}
bool ReadLimitValue(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_wLimitValue, szValue); }
bool ItemDataParser::SetDefaultData(ParseDataArray& parseDataArray)
{
parseDataArray.reserve(40);
parseDataArray.push_back(ParseData("ID", ReadID));
parseDataArray.push_back(ParseData("ItemName", ReadItemName));
parseDataArray.push_back(ParseData("FieldModelName", ReadFieldModelName));
parseDataArray.push_back(ParseData("AttachedModelName", ReadAttachedModelName));
parseDataArray.push_back(ParseData("SpriteDDS", ReadSpriteDDS));
parseDataArray.push_back(ParseData("MinX", ReadMinX));
parseDataArray.push_back(ParseData("MinY", ReadMinY));
parseDataArray.push_back(ParseData("MaxX", ReadMaxX));
parseDataArray.push_back(ParseData("MaxY", ReadMaxY));
parseDataArray.push_back(ParseData("SizeX", ReadSizeX));
parseDataArray.push_back(ParseData("SizeY", ReadSizeY));
parseDataArray.push_back(ParseData("EffectSound", ReadEffectSound));
parseDataArray.push_back(ParseData("ItemType", ReadItemType));
parseDataArray.push_back(ParseData("TypeName", ReadTypeName));
parseDataArray.push_back(ParseData("AbleExchangeNDrop", ReadAbleExchangeNDrop));
parseDataArray.push_back(ParseData("AbleSell", ReadAbleSell));
parseDataArray.push_back(ParseData("MinDropLevel", ReadMinDropLevel));
parseDataArray.push_back(ParseData("MaxDropLevel", ReadMaxDropLevel));
parseDataArray.push_back(ParseData("Price", ReadPrice));
parseDataArray.push_back(ParseData("OptionPrice", ReadOptionPrice));
parseDataArray.push_back(ParseData("BlackPrice", ReadBlackPrice));
parseDataArray.push_back(ParseData("MedalPrice", ReadMedalPrice));
parseDataArray.push_back(ParseData("ClassLimit", ReadClassLimit));
parseDataArray.push_back(ParseData("LimitStat", ReadLimitStatus));
parseDataArray.push_back(ParseData("Limit", ReadLimitValue));
parseDataArray.push_back(ParseData("Durability", ReadDurability));
parseDataArray.push_back(ParseData("LowLevel", ReadLowLevel));
parseDataArray.push_back(ParseData("HighLevel", ReadHighLevel));
parseDataArray.push_back(ParseData("MaxDurability", ReadMaxDurability));
return true;
}
bool ReadMinDamage(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::MIN_DAMAGE], szValue); }
bool ReadMaxDamage(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::MAX_DAMAGE], szValue); }
bool ReadArmor(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::ARMOR], szValue); }
bool ReadBlock(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::BLOCK], szValue); }
bool ReadDropOption(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_wDropOption, szValue); }
bool ReadGrade(Item::ItemInfo& itemInfo, const char* szValue)
{
return ReadStringToTypeValue(itemInfo.m_DetailData.m_cGrade,
Item::CItemType::GetInstance().GetItemGradeName(), Item::EquipType::MAX_GRADE, szValue);
}
bool ReadCriticalType(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cCriticalType, szValue); }
bool ReadAttackRange(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cAttackRange, szValue); }
bool ReadMaxSocketNum(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cMaxSocketNum, szValue); }
bool ReadLuckChance(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::LUCKCHANCE], szValue); }
bool ItemDataParser::SetEquipData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("MinDamage", ReadMinDamage));
parseDataArray.push_back(ParseData("MaxDamage", ReadMaxDamage));
parseDataArray.push_back(ParseData("Defence", ReadArmor));
parseDataArray.push_back(ParseData("Block", ReadBlock));
parseDataArray.push_back(ParseData("DropOption", ReadDropOption));
parseDataArray.push_back(ParseData("Grade", ReadGrade));
parseDataArray.push_back(ParseData("CriticalType", ReadCriticalType));
parseDataArray.push_back(ParseData("AttackRange", ReadAttackRange));
parseDataArray.push_back(ParseData("MaxSocketNum", ReadMaxSocketNum));
parseDataArray.push_back(ParseData("MagicResist", ReadLuckChance));
return true;
}
bool ReadHitRate(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::HIT_RATE], szValue); }
bool ReadEvade(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::EVADE], szValue); }
bool ReadCritical(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::CRITICAL], szValue); }
bool ReadMagicPower(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::MAGIC_POWER], szValue); }
bool ReadMagicResist(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::MAGIC_RESIST], szValue); }
bool ReadCoolDown(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::COOLDOWN], szValue); }
bool ReadMaxHP(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::MAX_HP], szValue); }
bool ReadMaxMP(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::MAX_MP], szValue); }
bool ReadHPRegen(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::HP_REGEN], szValue); }
bool ReadMPRegen(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::MP_REGEN], szValue); }
bool ReadSpeed(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::SPEED], szValue); }
bool ReadSkillPoint(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::SKILL_POINT], szValue); }
bool ReadFrost(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::FROST], szValue); }
bool ReadFire(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::FIRE], szValue); }
bool ReadElectro(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::ELECTRO], szValue); }
bool ReadDarkness(Item::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[Item::Attribute::DARKNESS], szValue); }
bool ItemDataParser::SetAccessoryData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("MinDamage", ReadMinDamage));
parseDataArray.push_back(ParseData("MaxDamage", ReadMaxDamage));
parseDataArray.push_back(ParseData("Defence", ReadArmor));
parseDataArray.push_back(ParseData("Block", ReadBlock));
parseDataArray.push_back(ParseData("DropOption", ReadDropOption));
parseDataArray.push_back(ParseData("Grade", ReadGrade));
parseDataArray.push_back(ParseData("CriticalType", ReadCritical));
parseDataArray.push_back(ParseData("AttackRange", ReadHitRate));
parseDataArray.push_back(ParseData("MaxSocketNum", ReadMagicPower));
parseDataArray.push_back(ParseData("MagicResist", ReadMagicResist));
parseDataArray.push_back(ParseData("Evade", ReadEvade));
parseDataArray.push_back(ParseData("CoolDown", ReadCoolDown));
parseDataArray.push_back(ParseData("MaxHP", ReadMaxHP));
parseDataArray.push_back(ParseData("MaxMP", ReadMaxMP));
parseDataArray.push_back(ParseData("HPRegen", ReadHPRegen));
parseDataArray.push_back(ParseData("MPRegen", ReadMPRegen));
parseDataArray.push_back(ParseData("Speed", ReadSpeed));
parseDataArray.push_back(ParseData("SkillPoint", ReadSkillPoint));
parseDataArray.push_back(ParseData("Frost", ReadFrost));
parseDataArray.push_back(ParseData("Fire", ReadFire));
parseDataArray.push_back(ParseData("Electro", ReadElectro));
parseDataArray.push_back(ParseData("Darkness", ReadDarkness));
return true;
}
bool ItemDataParser::SetAvataData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("DropOption", ReadDropOption));
parseDataArray.push_back(ParseData("Grade", ReadGrade));
parseDataArray.push_back(ParseData("Speed", ReadSpeed));
return true;
}
bool ReadForStatueWar(Item::ItemInfo& itemInfo, const char* szValue) { return ReadStringToBool(itemInfo.m_UseItemInfo.m_bForStatueWar, szValue); }
bool ReadLimitRealmPoint(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_cLimitRealmPoint, szValue); }
bool ReadSkill_ID(Item::ItemInfo& itemInfo, const char* szValue) { itemInfo.m_UseItemInfo.m_usSkill_ID = Math::Convert::Atos(szValue); return true; }
bool ReadSkill_Level(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_usSkill_LockCount, szValue); }
bool ReadZone(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_cZone, szValue); }
bool ReadPositionX(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_Pos.m_fPointX, szValue); }
bool ReadPositionY(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_Pos.m_fPointY, szValue); }
bool ReadPositionZ(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_Pos.m_fPointZ, szValue); }
bool ReadAmount(Item::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_dwAmount, szValue); }
bool ReadQuestID(Item::ItemInfo& itemInfo, const char* szValue) { itemInfo.m_UseItemInfo.m_wQuestID = Math::Convert::Atos(szValue); return true; }
bool ReadItemDescribe(Item::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szItemDescribe, Item::StringData::MAX_ITEM_DESCRIBE, szValue); }
bool ItemDataParser::SetUseItemData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("MinDamage", ReadForStatueWar));
parseDataArray.push_back(ParseData("MaxDamage", ReadLimitRealmPoint));
parseDataArray.push_back(ParseData("Defence", ReadSkill_ID));
parseDataArray.push_back(ParseData("Block", ReadSkill_Level));
parseDataArray.push_back(ParseData("DropOption", ReadZone));
parseDataArray.push_back(ParseData("Grade", ReadPositionX));
parseDataArray.push_back(ParseData("CriticalType", ReadPositionY));
parseDataArray.push_back(ParseData("AttackRange", ReadPositionZ));
parseDataArray.push_back(ParseData("MaxSocketNum", ReadAmount));
parseDataArray.push_back(ParseData("MagicResist", ReadQuestID));
parseDataArray.push_back(ParseData("Evade", ReadItemDescribe));
return true;
}
bool ItemDataParser::SetEtcItemData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("MinDamage", ReadItemDescribe));
return true;
}

View File

@@ -0,0 +1,36 @@
#ifndef _ITEM_DATA_PARSER_H_
#define _ITEM_DATA_PARSER_H_
#include <vector>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
namespace Item
{
struct ItemInfo;
};
namespace ItemDataParser
{
struct ParseData
{
typedef bool(*ParseFunc) (Item::ItemInfo& itemInfo, const char* szValue);
const char* m_szColumnName;
ParseFunc m_fnParseFunc;
ParseData(const char* szColumnName, ParseFunc fnParseFunc)
: m_szColumnName(szColumnName), m_fnParseFunc(fnParseFunc) { }
};
typedef std::vector<ParseData> ParseDataArray;
bool SetDefaultData(ParseDataArray& parseDataArray);
bool SetEquipData(ParseDataArray& parseDataArray);
bool SetAccessoryData(ParseDataArray& parseDataArray); //--//
bool SetAvataData(ParseDataArray& parseDataArray);
bool SetUseItemData(ParseDataArray& parseDataArray);
bool SetEtcItemData(ParseDataArray& parseDataArray);
};
#endif

View File

@@ -0,0 +1,373 @@
#include "stdafx.h"
#include "Item.h"
#include "ItemMgr.h"
#include "ItemFactory.h"
#include "ItemConstants.h" //--//
namespace Item
{
CItemOwnerInfo::CItemOwnerInfo(const char* szName, unsigned long dwUID, unsigned long dwCID)
: m_dwUID(dwUID), m_dwCID(dwCID)
{
strncpy(m_szName, szName, MAX_NAME);
m_szName[MAX_NAME - 1] = 0;
}
CItemFactory& CItemFactory::GetInstance()
{
static CItemFactory itemFactory;
return itemFactory;
}
CItemFactory::CItemFactory()
: m_nCurrentUID(0LL)
{
}
CItemFactory::~CItemFactory()
{
}
CItem* CItemFactory::CreateItem(const ItemInfo& itemInfo)
{
CItem* lpItem = CreateTempItem(itemInfo);
if(0 != lpItem)
{
lpItem->SetUID(GetNewItemUID());
}
return lpItem;
}
// Desc : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> 0<><30> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CItem* CItemFactory::CreateTempItem(const ItemInfo& itemInfo)
{
unsigned long dwFlags = itemInfo.m_DetailData.m_dwFlags;
CItem* lpItem = 0;
if(DetailData::EQUIP == (dwFlags & DetailData::EQUIP))
{
lpItem = new CEquipment(itemInfo);
//--// start..
if (0 == itemInfo.m_DetailData.m_wDropOption)
{
Item::CEquipment* lpEquip = Item::CEquipment::DowncastToEquipment(lpItem);
if (NULL != lpEquip)
{
lpEquip->m_GradeInfo.m_eItemGrade = static_cast<EquipType::Grade>(itemInfo.m_DetailData.m_cGrade);
// edith 2008.02.10 <20>ӽþ<D3BD><C3BE><EFBFBD><EFBFBD>۵<EFBFBD> <20><EFBFBD><EBB7B1><EFBFBD><EFBFBD>ġ<EFBFBD>Ȱɷ<C8B0> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// lpEquip->SetNewEquip();
}
}
//--// end..
}
else if(DetailData::USE_ITEM == (dwFlags & DetailData::USE_ITEM))
{
lpItem = new CUseItem(itemInfo);
}
else
{
lpItem = new CItem(itemInfo);
}
return lpItem;
}
CItem* CItemFactory::CreateItem(unsigned short usProtoTypeID)
{
const ItemInfo* lpItemInfo = CItemMgr::GetInstance().GetItemInfo(usProtoTypeID);
if(0 != lpItemInfo)
{
return CreateItem(*lpItemInfo);
}
ERRLOG1(g_Log, "ProtoTypeID:%u / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ID<49>Դϴ<D4B4>", usProtoTypeID);
return 0;
}
CItem* CItemFactory::CreateItem(const char* lpSerializedItem_In, size_t& nParseLength_InOut)
{
const ItemData* lpItemData = reinterpret_cast<const ItemData*>(lpSerializedItem_In);
const ItemInfo* lpItemInfo = 0;
if (0 != lpItemData &&
0 != (lpItemInfo = CItemMgr::GetInstance().GetItemInfo(lpItemData->m_usProtoTypeID)))
{
// serialize<7A><65> itemUID<49><44> <20><><EFBFBD><EFBFBD>Ƿ<EFBFBD>, itemUID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>.
CItem* lpItem = CreateTempItem(*lpItemInfo);
if (0 != lpItem &&
!lpItem->SerializeIn(lpSerializedItem_In, nParseLength_InOut))
{
DELETE_ITEM(lpItem);
}
return lpItem;
}
return 0;
}
void CItemFactory::DeleteItem(Item::CItem* lpDeleteItem)
{
// <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>;;
RemoveItemMap(lpDeleteItem->GetUID());
delete lpDeleteItem;
}
CItemOwnerInfo* CItemFactory::AddItemMap(unsigned __int64 dwItemUID, const CItemOwnerInfo& itemOwnerInfo)
{
CItemOwnerInfo* lpOwnerInfo = 0;
ItemSerialMap::iterator pos = m_ItemSerialMap.lower_bound(dwItemUID);
if(pos == m_ItemSerialMap.end() || m_ItemSerialMap.comp(dwItemUID, pos->first))
{
m_ItemSerialMap.insert(pos, ItemSerialMap::value_type(dwItemUID, itemOwnerInfo));
}
else
{
// <20>̹<EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
lpOwnerInfo = &pos->second;
}
return lpOwnerInfo;
}
void CItemFactory::RemoveItemMap(unsigned __int64 dwItemUID)
{
m_ItemSerialMap.erase(dwItemUID);
}
void CItemFactory::ClearItemMap()
{
m_ItemSerialMap.clear();
}
Item::CItem* CreateItemFromGiveInfo(CItemMgr& itemMgr, CItemFactory& itemFactory,
GiveItemInfo& giveItemInfo, Item::ItemPos itemPos)
{
char szItemData[Item::MAX_ITEM_SIZE];
unsigned long dwDataSize = Item::MAX_ITEM_SIZE;
unsigned __int64 dwItemUID = itemFactory.GetNewItemUID();
if (CreateItemDataFromGiveInfo(itemMgr, giveItemInfo,
szItemData, dwDataSize, dwItemUID, itemPos))
{
size_t data_size = dwDataSize;
return itemFactory.CreateItem(szItemData, data_size);
}
return NULL;
}
inline void AddAttrFromGiveInfo(short wNewAttribute[Item::Attribute::MAX_ATTRIBUTE_NUM],
GiveItemInfo& giveItemInfo,
Item::CItemType::ArrayType eArrayType,
unsigned short wDropOption,
Item::Attribute::Type eAttrType,
GiveItemInfo::GiveItemType eGiveItemType)
{
if(giveItemInfo.m_cAttribute[eGiveItemType] < Item::EquipType::MAX_GRADE)
{
unsigned short usMinValue = static_cast<short>(wDropOption *
Item::Grade::GetGradeValue(eArrayType, Item::Grade::VALUE_GRADE,
static_cast<Item::EquipType::Grade>(giveItemInfo.m_cAttribute[eGiveItemType]), eAttrType));
if(Item::EquipType::AAA_GRADE == giveItemInfo.m_cAttribute[eGiveItemType])
{
wNewAttribute[eAttrType] += usMinValue + 2;
}
else
{
unsigned short usMaxValue = static_cast<short>(wDropOption *
Item::Grade::GetGradeValue(eArrayType, Item::Grade::VALUE_GRADE,
static_cast<Item::EquipType::Grade>(giveItemInfo.m_cAttribute[eGiveItemType - 1]), eAttrType));
wNewAttribute[eAttrType] += static_cast<short>((usMaxValue + usMinValue) / 2.0f + 0.5f);
}
}
}
bool CreateItemDataFromGiveInfo(Item::CItemMgr& itemMgr, GiveItemInfo& giveItemInfo,
char* szData, unsigned long& dwDataSize_InOut,
unsigned __int64 dwItemUID, Item::ItemPos itemPos)
{
// <20>ϴ<EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ִ´<D6B4>.
const Item::ItemInfo* lpItemInfo = 0;
if (Item::MAX_ITEM_SIZE <= dwDataSize_InOut &&
0 != (lpItemInfo = itemMgr.GetItemInfo(giveItemInfo.m_usPrototypeID)))
{
Item::ItemData* lpItemData = reinterpret_cast<Item::ItemData*>(szData);
lpItemData->m_dwUID = dwItemUID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UID
lpItemData->m_usProtoTypeID = giveItemInfo.m_usPrototypeID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
lpItemData->m_ItemPos = itemPos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ
lpItemData->m_cItemSize = sizeof(Item::ItemData); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü ũ<><C5A9>
lpItemData->m_cNumOrDurability = giveItemInfo.m_cAmount; // <20><><EFBFBD><EFBFBD> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(lpItemInfo->m_DetailData.m_dwFlags & Item::DetailData::EQUIP)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><> <20><> <20>ִ´<D6B4>.
Item::EquipmentInfo* lpEquipmentInfo =
reinterpret_cast<Item::EquipmentInfo*>(lpItemData + 1);
Item::ItemAttribute* lpItemAttribute =
reinterpret_cast<Item::ItemAttribute*>(lpEquipmentInfo + 1);
const unsigned char cDefaultDurability =
lpItemInfo->m_DetailData.m_cDefaultDurabilityOrStack;
lpEquipmentInfo->m_cUpgradeCnt = 0;
lpEquipmentInfo->m_cReserved1 = 0;
lpEquipmentInfo->m_cUpgradeLevel = 0;
lpEquipmentInfo->m_cDiffMaxSocket = 0;
lpEquipmentInfo->m_cSeasonRecord = 1;
lpEquipmentInfo->m_cSocketNum = 0;
lpEquipmentInfo->m_cAttributeNum = 0;
lpEquipmentInfo->m_cDiffMaxDurability =
(cDefaultDurability <= giveItemInfo.m_cAmount)
? giveItemInfo.m_cAmount - cDefaultDurability : 0;
lpEquipmentInfo->m_cReserved2 = 0;
lpEquipmentInfo->m_cCoreLevel = 0;
lpItemData->m_cItemSize += sizeof(Item::EquipmentInfo);
// <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<>Ժ<EFBFBD><D4BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD>.
Item::CItemType::ArrayType eArrayType =
Item::CItemType::GetEquipType(lpItemInfo->m_DetailData.m_dwFlags);
short wNewAttribute[Item::Attribute::MAX_ATTRIBUTE_NUM];
std::fill_n(wNewAttribute, int(Item::Attribute::MAX_ATTRIBUTE_NUM), 0);
unsigned short wDropOption = lpItemInfo->m_DetailData.m_wDropOption;
switch(lpItemInfo->m_DetailData.m_cItemType)
{
case Item::ItemType::CON_ARMOUR:
case Item::ItemType::CON_BODY:
case Item::ItemType::DEX_BODY:
case Item::ItemType::DEX_ARMOUR:
case Item::ItemType::CON_HELM:
case Item::ItemType::CON_HEAD:
case Item::ItemType::DEX_HEAD:
case Item::ItemType::DEX_HELM:
// edith 2008.01.14 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC>߰<EFBFBD><DFB0>۾<EFBFBD>
case Item::ItemType::CON_GLOVE:
case Item::ItemType::DEX_GLOVE:
case Item::ItemType::CON_BOOTS:
case Item::ItemType::DEX_BOOTS:
case Item::ItemType::CON_PELVIS:
case Item::ItemType::DEX_PELVIS:
case Item::ItemType::CON_PROTECT_A:
case Item::ItemType::DEX_PROTECT_A:
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::ARMOR, GiveItemInfo::ARMOR);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::EVADE, GiveItemInfo::EVADE);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAX_HP, GiveItemInfo::MAX_HP);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::HP_REGEN, GiveItemInfo::HP_REGEN);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAX_MP, GiveItemInfo::MAX_MP);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAGIC_RESIST, GiveItemInfo::MAGIC_RESIST);
break;
case Item::ItemType::DAGGER:
case Item::ItemType::OPP_TALON:
case Item::ItemType::SKILL_A_KNIFE:
case Item::ItemType::ONEHANDED_SWORD:
case Item::ItemType::ONEHANDED_BLUNT:
case Item::ItemType::COM_SWORD:
case Item::ItemType::OPP_HAMMER:
case Item::ItemType::ONEHANDED_AXE:
case Item::ItemType::OPP_SLUSHER:
case Item::ItemType::COM_BLUNT:
case Item::ItemType::OPP_AXE:
case Item::ItemType::BOW:
case Item::ItemType::CROSSBOW:
case Item::ItemType::SKILL_A_ATTACK:
case Item::ItemType::SKILL_A_GUN:
case Item::ItemType::TWOHANDED_SWORD:
case Item::ItemType::TWOHANDED_AXE:
case Item::ItemType::TWOHANDED_BLUNT:
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MIN_DAMAGE, GiveItemInfo::MIN_DAMAGE);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAX_DAMAGE, GiveItemInfo::MAX_DAMAGE);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::HIT_RATE, GiveItemInfo::HIT_RATE);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::CRITICAL, GiveItemInfo::CRITICAL);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::BLOCK, GiveItemInfo::BLOCK);
break;
case Item::ItemType::STAFF:
case Item::ItemType::OPP_SYTHE:
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAX_DAMAGE, GiveItemInfo::MAX_DAMAGE);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::HIT_RATE, GiveItemInfo::HIT_RATE);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAX_MP, GiveItemInfo::MAX_MP);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MP_REGEN, GiveItemInfo::MP_REGEN);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::CRITICAL, GiveItemInfo::CRITICAL);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAGIC_POWER, GiveItemInfo::MAGIC_POWER);
break;
case Item::ItemType::SHIELD:
case Item::ItemType::SKILL_A_GUARD:
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAX_HP, GiveItemInfo::MAX_HP);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::HP_REGEN, GiveItemInfo::HP_REGEN);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MAX_MP, GiveItemInfo::MAX_MP);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::MP_REGEN, GiveItemInfo::MP_REGEN);
AddAttrFromGiveInfo(wNewAttribute, giveItemInfo, eArrayType, wDropOption, Item::Attribute::BLOCK, GiveItemInfo::BLOCK);
break;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD>, <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
for(int nCount = 0; nCount < Item::Attribute::MAX_ATTRIBUTE_NUM; ++nCount)
{
if(0 < wNewAttribute[nCount])
{
lpItemAttribute->m_cType = nCount;
lpItemAttribute->m_usValue = wNewAttribute[nCount];
++lpItemAttribute;
++lpEquipmentInfo->m_cAttributeNum;
}
}
lpItemData->m_cItemSize +=
lpEquipmentInfo->m_cAttributeNum * sizeof(Item::ItemAttribute);
}
dwDataSize_InOut = lpItemData->m_cItemSize;
return true;
}
return false;
}
}

View File

@@ -0,0 +1,101 @@
#ifndef _RYL_GAME_ITEM_FACTORY_H_
#define _RYL_GAME_ITEM_FACTORY_H_
#include <map>
#include <boost/pool/pool_alloc.hpp>
#include <Item/ItemStructure.h>
#include <Network/Packet/PacketStruct/CharAdminPacket.h>
#define DELETE_ITEM(p) if(p) { Item::CItemFactory::GetInstance().DeleteItem(p); (p)=0; }
namespace Item
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CItem;
class CItemMgr;
struct ItemInfo;
class CItemOwnerInfo
{
public:
CItemOwnerInfo(const char* szName, unsigned long dwUID, unsigned long dwCID);
const char* GetName() const { return m_szName; }
unsigned long GetUID() const { return m_dwUID; }
unsigned long GetCID() const { return m_dwCID; }
private:
enum
{
MAX_NAME = 16
};
char m_szName[MAX_NAME];
unsigned long m_dwUID;
unsigned long m_dwCID;
};
class CItemFactory
{
public:
static CItemFactory& GetInstance();
unsigned __int64 GetItemUID() { return m_nCurrentUID; }
unsigned __int64 GetNewItemUID() { return m_nCurrentUID++; }
void SetItemUID(unsigned __int64 nCurrentUID) { m_nCurrentUID = nCurrentUID; }
// Desc : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> 0<><30> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD> <20>ʴ´<CAB4>.
CItem* CreateTempItem(const ItemInfo& itemInfo);
// Desc : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><20>ɷ<EFBFBD>ġ) - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>.
CItem* CreateItem(const ItemInfo& itemInfo);
// Desc : <20><><EFBFBD><EFBFBD> ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><20>ɷ<EFBFBD>ġ) - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>.
CItem* CreateItem(unsigned short usProtoTypeID);
// Desc : SerializeOut<75><74> <20><><EFBFBD>۷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD> <20>ʴ´<CAB4>!
// In : <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> ũ<><C5A9>
// Out : (Return)<29><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, nParseLength_InOut - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><C5A9>
CItem* CreateItem(const char* lpSerializedItem_In, size_t& nParseLength_InOut);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void DeleteItem(CItem* lpDeleteItem);
// ---------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. (2004/08/11, by sparrowhawk)
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>Ҷ<EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڴ´<DAB4>.
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴٰ<DAB4>, <20>ȹھ<C8B9><DABE><EFBFBD><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (<28>̹<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>..)
// <20><><EFBFBD>߿<EFBFBD> <20><> <20><>ġ<EFBFBD><C4A1> ID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> ȸ<><C8B8><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>, <20><><EFBFBD>׸<EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>..
// TODO : Map<61><70> boost pool<6F><6C> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> boost<73><74><EFBFBD>̺귯<CCBA><EAB7AF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD>߿<EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD>ʿ<EFBFBD> boost pool<6F><6C><EFBFBD>̺귯<CCBA><EAB7AF><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD>..
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UID<49>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>. <20><><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> NULL<4C≯<EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>ƴϸ<C6B4> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>(<28>̹<EFBFBD> <20><><EFBFBD><EFBFBD>)
CItemOwnerInfo* AddItemMap(unsigned __int64 dwItemUID, const CItemOwnerInfo& itemOwnerInfo);
void RemoveItemMap(unsigned __int64 dwItemUID);
void ClearItemMap();
private:
CItemFactory();
~CItemFactory();
typedef std::map<unsigned __int64, CItemOwnerInfo, std::less<unsigned __int64>,
boost::fast_pool_allocator<std::pair<unsigned __int64, CItemOwnerInfo> > > ItemSerialMap;
unsigned __int64 m_nCurrentUID;
ItemSerialMap m_ItemSerialMap;
};
Item::CItem* CreateItemFromGiveInfo(Item::CItemMgr& itemMgr,
CItemFactory& itemFactory, GiveItemInfo& giveItemInfo, Item::ItemPos itemPos);
bool CreateItemDataFromGiveInfo(Item::CItemMgr& itemMgr, GiveItemInfo& giveItemInfo,
char* szData, unsigned long& dwDataSize_InOut, unsigned __int64 dwItemUID, Item::ItemPos itemPos);
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,107 @@
#ifndef _CITEM_MGR_H_
#define _CITEM_MGR_H_
#define g_ItemMgr Item::CItemMgr::GetInstance()
#include <vector>
#include <map>
#include "ItemStructure.h"
// ----------------------------------------------------------------------------
// class : CItemMgr ( must use in single thread )
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20>ε<EFBFBD><CEB5>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
namespace Item
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
class CItem;
class CItemMgr
{
public:
static CItemMgr& GetInstance();
typedef std::map<ItemType::Type, unsigned char> RuneItemCnt;
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ (ItemScript.txt)
bool LoadItemProtoType(const char* szFileName = NULL);
bool LoadItemProtoTypeBinary(const char* szFileNameBinary = NULL);
bool SaveItemProtoTypeBinary(const char* szFileNameBinary = NULL, const char* szTrashFile = NULL);
const ItemInfo* GetItemInfo(unsigned short usProtoTypeID);
const ItemInfo* GetItemInfoFromItemName(const char* szItemName);
const ItemInfo* GetItemInfoFromEquipName(const char* szEquipName);
const char* GetEquipName(const unsigned short usItemProtoTypeID);
const unsigned short GetItemIDFromSkillID(const unsigned short usSkill_ID, const unsigned short unSkill_LockCount);
const unsigned short GetDropItem(const Item::ItemType::Type eItemType, const unsigned char cLevel);
const unsigned short GetRingDropItem(const unsigned char cLevel, const unsigned char cGrade); //--//
const unsigned short GetNecklaceDropItem(const unsigned char cLevel, const unsigned char cGrade); //--//
const unsigned short GetRuneDropItem(const unsigned char cLevel, const unsigned char cGrade); //--//
void PrintDropListByLevel(void);
void PrintRingDropListByLevel(void); //--//
void PrintNecklaceDropListByLevel(void); //--//
void PrintRuneDropListByLevel(void); //--//
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ (ChemicalInfo.txt)
bool LoadItemChemical(const char* szFileName = NULL);
bool LoadItemChemicalBinary(const char* szFileNameBinary = NULL);
bool SaveItemChemicalBinary(const char* szFileNameBinary = NULL, const char* szTrashFile = NULL);
unsigned char GetChemicalResult(ChemicalInfo& chemical);
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ (SpeacialCompensation.txt)
bool LoadItemSpeacialCompensation(const char* szFileName = NULL);
bool LoadItemSpeacialCompensationBinary(const char* szFileNameBinary = NULL);
bool SaveItemSpeacialCompensationBinary(const char* szFileNameBinary = NULL, const char* szTrashFile = NULL);
unsigned short GetCompensationItem(unsigned char cItemType, short wLimitValue);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<>Կ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>밪.
unsigned char GetMaxRuneSocket(ItemType::Type type);
private:
CItemMgr();
~CItemMgr();
void DestoryItemInfo(void);
void DestoryChemical(void);
void DestoryCompensation(void);
static const char* ms_szChemicalScriptFileName;
static const char* ms_szSpeacialCompensationFileName;
static CItemMgr ms_this;
size_t m_nItemNum;
ItemInfo* m_ItemInfoArray;
typedef std::vector<unsigned short> ItemIDVector;
ItemIDVector m_vecDropListByLevel[Creature::MONSTER_MAX_LEVEL];
ItemIDVector m_vecRingDropListByLevel[Creature::MONSTER_MAX_LEVEL][EquipType::MAX_GRADE]; //--//
ItemIDVector m_vecNecklaceDropListByLevel[Creature::MONSTER_MAX_LEVEL][EquipType::MAX_GRADE]; //--//
ItemIDVector m_vecRuneDropListByLevel[Creature::MONSTER_MAX_LEVEL][EquipType::MAX_GRADE]; //--//
ItemIDVector m_vecCompensation[Compensation::MAX_CASE];
size_t m_nChemicalNum;
ChemicalInfo* m_ChemicalArray;
RuneItemCnt m_mapRuneItemCnt; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>.
};
}
#endif

View File

@@ -0,0 +1,91 @@
#include "stdafx.h"
#include "ItemSerialMgr.h"
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <DB/DBComponent.h>
#include <DB/GameDBComponent.h>
namespace Item
{
CItemSerialMgr::CItemSerialMgr()
: m_dwItemSerial(0LL), m_dwServerID(0)
{
}
CItemSerialMgr::~CItemSerialMgr()
{
}
bool CItemSerialMgr::SetItemSerial(unsigned __int64 dwItemSerial)
{
if(m_dwItemSerial < dwItemSerial)
{
m_dwItemSerial = dwItemSerial;
return true;
}
return false;
}
bool CItemSerialMgr::LoadItemSerial(CDBComponent& DBComponent, unsigned long dwServerID)
{
m_dwItemSerial = 0LL;
m_dwServerID = dwServerID;
using namespace DBComponent;
if (!GameDB::GetItemUID(DBComponent, dwServerID, &m_dwItemSerial, true))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>׿<EFBFBD><D7BF><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> / ä<><C3A4> 2byteü<65><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
SERVER_ID serverID;
serverID.dwID = dwServerID;
m_dwItemSerial = ((static_cast<unsigned __int64>(serverID.GetZone()) << 56) & 0xFF00000000000000LL) |
((static_cast<unsigned __int64>(serverID.GetChannel()) << 48) & 0x00FF000000000000LL);
// <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (!GameDB::InsertItemUID(DBComponent, dwServerID, m_dwItemSerial))
{
ERRLOG1(g_Log, "ServerID:0x%08X / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", m_dwServerID);
return false;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>Ƿ<EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
m_dwItemSerial += 10LL;
return true;
}
bool CItemSerialMgr::SaveItemSerial(CDBComponent& DBComponent, unsigned long dwServerID)
{
if(m_dwServerID != dwServerID)
{
ERRLOG2(g_Log, "OldServerID:0x%08X / NewServerID:0x%08X / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> ID<49><44> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>",
m_dwServerID, dwServerID);
}
else
{
using namespace DBComponent;
if(GameDB::SetItemUID(DBComponent, dwServerID, m_dwItemSerial))
{
return true;
}
else
{
ERRLOG2(g_Log, "ServerID:0x%08X / ItemSerial : 0x016I64X / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB<44><42> <20>ø<EFBFBD><C3B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
m_dwServerID, m_dwItemSerial);
}
}
return false;
}
}

View File

@@ -0,0 +1,31 @@
#ifndef _RYL_DB_ITEM_SERIAL_MGR_H_
#define _RYL_DB_ITEM_SERIAL_MGR_H_
// forward delc.
class CDBComponent;
namespace Item
{
class CItemSerialMgr
{
public:
CItemSerialMgr();
~CItemSerialMgr();
unsigned __int64 GetItemSerial() const { return m_dwItemSerial; }
unsigned __int64 GetNewItemSerial() { return ++m_dwItemSerial; }
bool SetItemSerial(unsigned __int64 dwItemSerial);
bool LoadItemSerial(CDBComponent& DBComponent, unsigned long dwServerID);
bool SaveItemSerial(CDBComponent& DBComponent, unsigned long dwServerID);
protected:
unsigned __int64 m_dwItemSerial;
unsigned long m_dwServerID;
};
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,449 @@
#include "stdafx.h"
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> include<64><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
#include <Log/ServerLog.h>
#include <Skill/SkillMgr.h>
#include <algorithm>
#include "ItemStructure.h"
#include "GMMemory.h"
// <20><><EFBFBD>翬 S<>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD>̺<EFBFBD>
static const float g_aryGradeTable[Item::EquipType::MAX_TYPE][Item::Grade::MAX_TABLE_TYPE][Item::EquipType::MAX_GRADE][Item::Attribute::MAX_ATTRIBUTE_NUM] =
{
//--// start..
// <20><><EFBFBD>ʷ<EFBFBD>
{
// MinDam. MaxDam. Armor HitRate Evade MaxHP HPRegen MaxMP MPRegen Cri. Block Speed M.Power M.Res. M.Che. CoolDw SkillPt Frost Fire Electro Dark
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0, 0.4f, 0, 0.1f, 0.1f, 0.2f, 0.1f, 0, 0, 0, 0, 0, 0.08f, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0, 0.2f, 0, 0.05f, 0.05f, 0.1f, 0.05f, 0, 0, 0, 0, 0, 0.04f, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0, -0.2f, 0, -0.05f, -0.05f, -0.1f, -0.05f, 0, 0, 0, 0, 0, -0.04f, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, -0.4f, 0, -0.1f, -0.1f, -0.2f, -0.1f, 0, 0, 0, 0, 0, -0.08f, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0, 1.5f, 0, 0.375f, 0.375f, 0.75f, 0.375f, 0, 0, 0, 0, 0, 0.3f, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0, 1.2f, 0, 0.3f, 0.3f, 0.6f, 0.3f, 0, 0, 0, 0, 0, 0.24f, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0.9f, 0, 0.225f, 0.225f, 0.45f, 0.225f, 0, 0, 0, 0, 0, 0.18f, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0, 0.6f, 0, 0.15f, 0.15f, 0.3f, 0.15f, 0, 0, 0, 0, 0, 0.12f, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0.3f, 0, 0.075f, 0.075f, 0.15f, 0.075f, 0, 0, 0, 0, 0, 0.06f, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 1.801f, 0, 0.45f, 0.45f, 0.9f, 0.45f, 0, 0, 0, 0, 0, 0.36f, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 1.801f, 0, 0.45f, 0.45f, 0.9f, 0.45f, 0, 0, 0, 0, 0, 0.36f, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 1.501f, 0, 0.375f, 0.375f, 0.75f, 0.375f, 0, 0, 0, 0, 0, 0.3f, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0, 1.201f, 0, 0.3f, 0.3f, 0.6f, 0.3f, 0, 0, 0, 0, 0, 0.24f, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0, 0.9f, 0, 0.225f, 0.225f, 0.45f, 0.225f, 0, 0, 0, 0, 0, 0.18f, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0.6f, 0, 0.15f, 0.15f, 0.3f, 0.15f, 0, 0, 0, 0, 0, 0.12f, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0, 0.3f, 0, 0.075f, 0.075f, 0.15f, 0.075f, 0, 0, 0, 0, 0, 0.06f, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
}
},
// <20>ܰ˷<DCB0>
{
// MinDam. MaxDam. Armor HitRate Evade MaxHP HPRegen MaxMP MPRegen Cri. Block Speed M.Power M.Res. M.Che. CoolDw SkillPt Frost Fire Electro Dark
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.12f, 0.16f, 0, 0.4f, 0, 0, 0, 0, 0, 0.08f, 0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.06f, 0.08f, 0, 0.2f, 0, 0, 0, 0, 0, 0.04f, 0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, -0.06f, -0.08f, 0, -0.2f, 0, 0, 0, 0, 0, -0.04f, -0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, -0.12f, -0.16f, 0, -0.4f, 0, 0, 0, 0, 0, -0.08f, -0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.6f, 0.75f, 0, 1.5f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.48f, 0.6f, 0, 1.2f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.36f, 0.45f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.24f, 0.3f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0.12f, 0.15f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0.72f, 0.9f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0.72f, 0.9f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0.6f, 0.75f, 0, 1.50f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.48f, 0.6f, 0, 1.20f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.36f, 0.45f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.24f, 0.3f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.12f, 0.15f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
}
},
// <20>Ѽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
// MinDam. MaxDam. Armor HitRate Evade MaxHP HPRegen MaxMP MPRegen Cri. Block Speed M.Power M.Res. M.Che. CoolDw SkillPt Frost Fire Electro Dark
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.2f, 0.2f, 0, 0.4f, 0, 0, 0, 0, 0, 0.08f, 0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.1f, 0.1f, 0, 0.2f, 0, 0, 0, 0, 0, 0.04f, 0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, -0.1f, -0.1f, 0, -0.2f, 0, 0, 0, 0, 0, -0.04f, -0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, -0.2f, -0.2f, 0, -0.4f, 0, 0, 0, 0, 0, -0.08f, -0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 1.0f, 1.25f, 0, 1.5f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.8f, 1.0f, 0, 1.2f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.6f, 0.75f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.4f, 0.5f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0.2f, 0.25f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 1.2f, 1.5f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 1.2f, 1.5f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 1.0f, 1.25f, 0, 1.50f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.8f, 1.0f, 0, 1.20f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.6f, 0.75f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.4f, 0.5f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.2f, 0.25f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
}
},
// <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
// MinDam. MaxDam. Armor HitRate Evade MaxHP HPRegen MaxMP MPRegen Cri. Block Speed M.Power M.Res. M.Che. CoolDw SkillPt Frost Fire Electro Dark
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.2f, 0.2f, 0, 0.4f, 0, 0, 0, 0, 0, 0.08f, 0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.1f, 0.1f, 0, 0.2f, 0, 0, 0, 0, 0, 0.04f, 0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, -0.1f, -0.1f, 0, -0.2f, 0, 0, 0, 0, 0, -0.04f, -0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, -0.2f, -0.2f, 0, -0.4f, 0, 0, 0, 0, 0, -0.08f, -0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 1.0f, 1.25f, 0, 1.5f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.8f, 1.0f, 0, 1.2f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.6f, 0.75f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.4f, 0.5f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0.2f, 0.25f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 1.2f, 1.5f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 1.2f, 1.5f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 1.0f, 1.25f, 0, 1.50f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.8f, 1.0f, 0, 1.20f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.6f, 0.75f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.4f, 0.5f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.2f, 0.25f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
}
},
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
// MinDam. MaxDam. Armor HitRate Evade MaxHP HPRegen MaxMP MPRegen Cri. Block Speed M.Power M.Res. M.Che. CoolDw SkillPt Frost Fire Electro Dark
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.2f, 0.2f, 0, 0.4f, 0, 0, 0, 0, 0, 0.08f, 0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.1f, 0.1f, 0, 0.2f, 0, 0, 0, 0, 0, 0.04f, 0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, -0.1f, -0.1f, 0, -0.2f, 0, 0, 0, 0, 0, -0.04f, -0.04f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, -0.2f, -0.2f, 0, -0.4f, 0, 0, 0, 0, 0, -0.08f, -0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 1.0f, 1.25f, 0, 1.5f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.8f, 1.0f, 0, 1.2f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.6f, 0.75f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.4f, 0.5f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0.2f, 0.25f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 1.2f, 1.5f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 1.2f, 1.5f, 0, 1.80f, 0, 0, 0, 0, 0, 0.9f, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 1.0f, 1.25f, 0, 1.50f, 0, 0, 0, 0, 0, 0.75f, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0.8f, 1.0f, 0, 1.20f, 0, 0, 0, 0, 0, 0.6f, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0.6f, 0.75f, 0, 0.9f, 0, 0, 0, 0, 0, 0.45f, 0.18f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0.4f, 0.5f, 0, 0.6f, 0, 0, 0, 0, 0, 0.3f, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0.2f, 0.25f, 0, 0.3f, 0, 0, 0, 0, 0, 0.15f, 0.06f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
}
},
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
// MinDam. MaxDam. Armor HitRate Evade MaxHP HPRegen MaxMP MPRegen Cri. Block Speed M.Power M.Res. M.Che. CoolDw SkillPt Frost Fire Electro Dark
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0.22f, 0, 0.4f, 0, 0, 0, 0.2f, 0.4f, 0.08f, 0, 0, 0.4f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0.11f, 0, 0.2f, 0, 0, 0, 0.1f, 0.2f, 0.04f, 0, 0, 0.2f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, -0.11f, 0, -0.2f, 0, 0, 0, -0.1f, -0.2f, -0.04f, 0, 0, -0.2f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, -0.22f, 0, -0.4f, 0, 0, 0, -0.2f, -0.4f, -0.08f, 0, 0, -0.4f, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0.825f, 0, 1.5f, 0, 0, 0, 0.75f, 1.5f, 0.3f, 0, 0, 1.5f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0.66f, 0, 1.2f, 0, 0, 0, 0.6f, 1.2f, 0.24f, 0, 0, 1.2f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0.495f, 0, 0.9f, 0, 0, 0, 0.45f, 0.9f, 0.18f, 0, 0, 0.9f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0.33f, 0, 0.6f, 0, 0, 0, 0.3f, 0.6f, 0.12f, 0, 0, 0.6f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0.165f, 0, 0.3f, 0, 0, 0, 0.15f, 0.3f, 0.06f, 0, 0, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0.99f, 0, 1.801f, 0, 0, 0, 0.9f, 1.81f, 0.36f, 0, 0, 1.81f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0.99f, 0, 1.801f, 0, 0, 0, 0.9f, 1.81f, 0.36f, 0, 0, 1.81f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0.825f, 0, 1.501f, 0, 0, 0, 0.75f, 1.51f, 0.3f, 0, 0, 1.51f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0.66f, 0, 1.201f, 0, 0, 0, 0.6f, 1.21f, 0.24f, 0, 0, 1.21f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0.495f, 0, 0.9f, 0, 0, 0, 0.45f, 0.9f, 0.18f, 0, 0, 0.9f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0.33f, 0, 0.6f, 0, 0, 0, 0.3f, 0.6f, 0.12f, 0, 0, 0.6f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0.165f, 0, 0.3f, 0, 0, 0, 0.15f, 0.3f, 0.06f, 0, 0, 0.3f, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
}
},
// <20><><EFBFBD>з<EFBFBD>
{
// MinDam. MaxDam. Armor HitRate Evade MaxHP HPRegen MaxMP MPRegen Cri. Block Speed M.Power M.Res. M.Che. CoolDw SkillPt Frost Fire Electro Dark
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0, 0, 0, 0, 0.05f, 0.1f, 0.05f, 0.1f, 0, 0.16f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0, 0, 0, 0, 0.025f, 0.05f, 0.025f, 0.05f, 0, 0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0, 0, 0, 0, -0.025f,-0.05f, -0.025f,-0.05f, 0, -0.08f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, -0.05f, -0.1f, -0.05f, -0.1f, 0, -0.16f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0, 0, 0, 0, 0.1875f,0.375f, 0.1875f,0.375f, 0, 0.6f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0, 0, 0, 0, 0.15f, 0.3f, 0.15f, 0.3f, 0, 0.48f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0.113f, 0.225f, 0.113f, 0.225f, 0, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0, 0, 0, 0, 0.075f, 0.15f, 0.075f, 0.15f, 0, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0.038f, 0.075f, 0.038f, 0.075f, 0, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
},
{
{ 0, 0, 0, 0, 0, 0, 0.225f, 0.45f, 0.225f, 0.45f, 0, 0.72f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade S
{ 0, 0, 0, 0, 0, 0, 0.225f, 0.45f, 0.225f, 0.45f, 0, 0.72f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AAA
{ 0, 0, 0, 0, 0, 0, 0.1875f,0.375f, 0.1875f,0.375f, 0, 0.6f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade AA
{ 0, 0, 0, 0, 0, 0, 0.15f, 0.3f, 0.15f, 0.3f, 0, 0.48f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade A
{ 0, 0, 0, 0, 0, 0, 0.113f, 0.225f, 0.113f, 0.225f, 0, 0.36f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade B
{ 0, 0, 0, 0, 0, 0, 0.075f, 0.15f, 0.075f, 0.15f, 0, 0.24f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade C
{ 0, 0, 0, 0, 0, 0, 0.038f, 0.075f, 0.038f, 0.075f, 0, 0.12f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // Grade D
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Grade F
}
}
//--// end..
};
void Item::ItemData::DumpInfo(unsigned long dwCID, const char* szExtraString) const
{
ERRLOG8(g_Log, "CID:0x%10u / ItemUID:%016I64X / ProtoTypeID:%d / ItemPos(%d, 0x%04x) / ItemSize:%d / NumOrDurability:%d %s",
dwCID, m_dwUID, m_usProtoTypeID, m_ItemPos.m_cPos, m_ItemPos.m_cIndex,
m_cItemSize, m_cNumOrDurability, szExtraString);
}
Item::SpriteData::SpriteData() { Initialize(); }
void Item::SpriteData::Initialize()
{
memset(m_szName, 0, MAX_NAME);
memset(m_szSpriteName, 0, MAX_SPRITE_NAME);
m_nSpriteMinX = m_nSpriteMinY = m_nSpriteMaxX = m_nSpriteMaxY = 0;
}
Item::StringData::StringData() { Initialize(); }
void Item::StringData::Initialize()
{
memset(m_szFieldModelName, 0, MAX_FIELD_MODEL_NAME);
memset(m_szEquipModelName, 0, MAX_EQUIP_MODEL_NAME);
memset(m_szEffectSoundName, 0, MAX_EFFECT_SOUND_NAME);
memset(m_szTypeName, 0, MAX_TYPE_NAME);
memset(m_szItemDescribe, 0, MAX_ITEM_DESCRIBE);
}
Item::DetailData::DetailData() { Initialize(); }
void Item::DetailData::Initialize()
{
m_cItemType = 0;
m_cXSize = 0;
m_cYSize = 0;
m_wDropOption = 0;
m_cCriticalType = 0;
m_cAttackRange = 0;
m_cMaxSocketNum = 0;
m_cDefaultDurabilityOrStack = 0;
m_cMaxDurabilityOrStack = 0;
m_cMinDropLevel = 0;
m_cMaxDropLevel = 0;
m_dwPrice = 0;
m_dwBlackPrice = 0;
m_dwMedalPrice = 0;
m_bExchangeAndDrop = true;
m_bSell = true;
m_bOptionPrice = false;
m_dwFlags = 0;
}
Item::EquipAttribute::EquipAttribute() { Initialize(); }
void Item::EquipAttribute::Initialize()
{
m_nAttibuteNum = 0;
std::fill_n(m_usAttributeValue, unsigned short(Item::Attribute::MAX_ATTRIBUTE_NUM), 0);
}
Item::UseItemInfo::UseItemInfo() { Initialize(); }
void Item::UseItemInfo::Initialize()
{
m_cZone = 0;
m_dwAmount = 0;
m_usSkill_ID = 0;
m_usSkill_LockCount = 0;
m_wQuestID = 0;
m_cLimitRealmPoint = 0;
m_bForStatueWar = false;
}
Item::UseLimit::UseLimit() { Initialize(); }
void Item::UseLimit::Initialize()
{
m_dwClassLimit = 0;
m_cLimitStatus = Item::StatusLimit::NONE;
m_wLimitValue = 0;
}
Item::ItemInfo::ItemInfo() { Initialize(); }
Item::ItemInfo::ItemInfo(unsigned short usProtoTypeID) { Initialize(); m_usProtoTypeID = usProtoTypeID; }
void Item::ItemInfo::Initialize()
{
m_usProtoTypeID = 0;
m_DetailData.Initialize();
m_UseLimit.Initialize();
m_SpriteData.Initialize();
m_StringData.Initialize();
m_EquipAttribute.Initialize();
m_UseItemInfo.Initialize();
}
const char* Item::ItemInfo::GetItemDescribe(void) const
{
if (Item::ItemType::SKILL_BOOK == m_DetailData.m_cItemType)
{
const Skill::ProtoType* pSkillProtoType =
CSkillMgr::GetInstance().GetSkillProtoType(m_UseItemInfo.m_usSkill_ID);
if (NULL != pSkillProtoType)
{
return pSkillProtoType[m_UseItemInfo.m_usSkill_LockCount].m_szSkillDescribe;
}
}
return m_StringData.m_szItemDescribe;
}
Item::ItemGarbage::ItemGarbage(CItem* lpItem, unsigned long dwRemainNum)
: m_lpItem(lpItem), m_dwRemainNum(dwRemainNum)
{
}
Item::ChemicalInfo::ChemicalInfo()
: m_wPickkingItemID(0), m_wTargetItemID(0), m_wResultItemID(0),
m_cPickkingItemNum(0), m_cTargetItemNum(0), m_cResultItemNum(0),
m_dwItemID(0), m_usAbilityID(0), m_cAbilityLevel(0), m_usQuestID(0), m_cPercent(0)
{
}
Item::ChemicalInfo::ChemicalInfo(unsigned short wPickkingItemID, unsigned char cPickkingItemNum,
unsigned short wTargetItemID, unsigned char cTargetItemNum, unsigned int dwItemID, unsigned short usAbilityID, unsigned char cAbilityLevel, unsigned short usQuestID, unsigned char cPercent)
: m_wPickkingItemID(wPickkingItemID), m_wTargetItemID(wTargetItemID), m_wResultItemID(0),
m_cPickkingItemNum(cPickkingItemNum),m_cTargetItemNum(cTargetItemNum), m_cResultItemNum(0),
m_dwItemID(dwItemID), m_usAbilityID(usAbilityID), m_cAbilityLevel(cAbilityLevel), m_usQuestID(usQuestID), m_cPercent(cPercent)
{
}
Item::Grade::GradeInfo::GradeInfo()
: m_eItemGrade(EquipType::F_GRADE), m_cPlus(0)
{
std::fill_n(m_aryAttributeGrade, int(Attribute::MAX_ATTRIBUTE_NUM), EquipType::F_GRADE);
}
const float Item::Grade::GetGradeValue(Item::CItemType::ArrayType eEquipType, Grade::TableType eTableType,
EquipType::Grade eGrade, Attribute::Type eType)
{
switch (eEquipType)
{
case CItemType::HELM_TYPE:
case CItemType::ARMOUR_TYPE:
return g_aryGradeTable[EquipType::ARMOR_TYPE][eTableType][eGrade][eType];
case CItemType::DAGGER_TYPE: return g_aryGradeTable[EquipType::DAGGER_TYPE][eTableType][eGrade][eType];
case CItemType::ONEHANDED_TYPE: return g_aryGradeTable[EquipType::ONEHANDED_WEAPON_TYPE][eTableType][eGrade][eType];
case CItemType::LONGRANGE_TYPE: return g_aryGradeTable[EquipType::LONGRANGE_WEAPON_TYPE][eTableType][eGrade][eType];
case CItemType::TWOHANDED_TYPE: return g_aryGradeTable[EquipType::TWOHANDED_WEAPON_TYPE][eTableType][eGrade][eType];
case CItemType::STAFF_TYPE: return g_aryGradeTable[EquipType::STAFF_TYPE][eTableType][eGrade][eType];
case CItemType::SHIELD_TYPE: return g_aryGradeTable[EquipType::SHIELD_TYPE][eTableType][eGrade][eType];
}
return 0.0f;
}

View File

@@ -0,0 +1,372 @@
#ifndef _ITEM_STRUCTURE_H_
#define _ITEM_STRUCTURE_H_
#include <Creature/CreatureStructure.h>
#include "ItemConstants.h"
namespace Item
{
class CItem;
#pragma pack(1)
// ------------------------------------------------------------------------------------------
// UseLimit, ItemInfo <20><> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
struct ItemPos
{
unsigned short m_cPos : 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Equip, Inven...) (0~15)
unsigned short m_cIndex : 12; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> (0~4095)
ItemPos() : m_cPos(0), m_cIndex(0) { }
ItemPos(unsigned char cPos, unsigned short usIndex) : m_cPos(cPos), m_cIndex(usIndex) { }
inline void SetPos(unsigned short wIndex) { m_cIndex = wIndex; }
inline void SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex);
inline void GetPos(unsigned char& cXIndex, unsigned char& cYIndex, unsigned char& cZIndex) const;
inline unsigned char GetXIndex(void) const { return (m_cIndex & 0x00F); }
inline unsigned char GetYIndex(void) const { return (m_cIndex & 0x0F0) >> 4; }
inline unsigned char GetZIndex(void) const { return (m_cIndex & 0xF00) >> 8; }
inline void SetXIndex(unsigned char cXIndex) { m_cIndex = (m_cIndex & 0xFF0) + cXIndex; }
inline void SetYIndex(unsigned char cYIndex) { m_cIndex = (m_cIndex & 0xF0F) + (cYIndex << 4); }
inline void SetZIndex(unsigned char cZIndex) { m_cIndex = (m_cIndex & 0x0FF) + (cZIndex << 8); }
inline bool operator == (const ItemPos& rhs) const { return (m_cPos == rhs.m_cPos && m_cIndex == rhs.m_cIndex); }
};
inline void ItemPos::SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex)
{
m_cIndex = (cZIndex << 8) + (cYIndex << 4) + cXIndex;
}
inline void ItemPos::GetPos(unsigned char& cXIndex, unsigned char& cYIndex, unsigned char& cZIndex) const
{
cXIndex = (m_cIndex & 0x00F);
cYIndex = (m_cIndex & 0x0F0) >> 4;
cZIndex = (m_cIndex & 0xF00) >> 8;
}
struct ItemData
{
unsigned __int64 m_dwUID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UID
unsigned short m_usProtoTypeID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
ItemPos m_ItemPos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ
unsigned char m_cItemSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü ũ<><C5A9>
unsigned char m_cNumOrDurability; // <20><><EFBFBD><EFBFBD> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ItemData() { m_dwUID = m_usProtoTypeID = m_cNumOrDurability = 0; m_cItemSize = sizeof(ItemData); }
void DumpInfo(unsigned long dwCID, const char* szExtraString) const;
};
struct ItemAttribute
{
unsigned short m_cType : 4; // <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> 4bit (16<31><36><EFBFBD><EFBFBD>)
unsigned short m_usValue : 12; // <20>Ӽ<EFBFBD> <20><> 12bit (0 ~ 4096)
ItemAttribute() : m_cType(0), m_usValue(0) { }
ItemAttribute(unsigned char cType, unsigned short usValue) : m_cType(cType), m_usValue(usValue) { }
};
// <20>ڿ<EFBFBD> Socket<65><74><EFBFBD><EFBFBD><EBB9B0> m_cSocketNum<75><6D>ŭ, Attribute<74><65> m_cDiffAttributeNum<75><6D>ŭ <20>ٴ´<D9B4>.
struct EquipmentInfo
{
enum
{
MAX_UPGRADE_LEVEL = 10, // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
MAX_CORE_LEVEL = 5, // <20>ִ<EFBFBD> <20>ھ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28>ھ<EFBFBD><DABE><EFBFBD> <20>ھ<DABE><EEBCAE> <20>߶<EFBFBD> Ư<><C6AF><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD> <20>ο<EFBFBD><CEBF>ϴ<EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD>)
MAX_ATTRIBUTE_PER_GEM = 2, // <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><>ȭ<EFBFBD>Ǵ<EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_ATTRIBUTE_PER_UPGRADE_LEVEL = 2, // <20><> <20>ܰ迡 <20><>ȭ<EFBFBD>Ǵ<EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_UPGRADE_ATTRIBUTE = 6, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_MINSIZE_SOCKET_NUM = 6, // ũ<>Ⱑ 1by1<79><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
MAX_MINSIZE_ATTRIBUTE_NUM = 6, // ũ<>Ⱑ 1by1<79><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_SOCKET_NUM = 8, // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
MAX_SOCKET_ATTRIBUTE_NUM = 16, // <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
// edith 2009.09.16 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// MAX_ATTRIBUTE_NUM = 22, // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_ATTRIBUTE_NUM = 15, // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_RUNE_SOCKET_NUM = 2, // <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>
MAX_SOCKET_AND_ATTRIBUTE_MINISIZE = (MAX_MINSIZE_SOCKET_NUM * sizeof(char) + MAX_MINSIZE_ATTRIBUTE_NUM * sizeof(ItemAttribute)),
MAX_SOCKET_AND_ATTRIBUTE_SIZE = (MAX_SOCKET_NUM * sizeof(char) + MAX_ATTRIBUTE_NUM * sizeof(ItemAttribute))
};
unsigned short m_cUpgradeCnt : 2; // <20><><EFBFBD>ý<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ī<><C4AB>Ʈ.
unsigned short m_cReserved1 : 9; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... (0~511)
short m_cUpgradeLevel : 5; // <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ܰ<EFBFBD> (-16 ~ 15)
char m_cDiffMaxSocket : 5; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> + m_cDiffMaxSocket = <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> (-16 ~ 15)
unsigned char m_cSeasonRecord : 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ñ<EFBFBD> (0~7) (<28><><EFBFBD><EFBFBD><EBB7B1> <20><> : 0, <20><> : 1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD> : 2)
unsigned char m_cSocketNum : 4; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> (0 ~ 15)
unsigned char m_cAttributeNum : 4; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD>ų<EFBFBD>, <20><>ġ<EFBFBD><C4A1> <20>ٸ<EFBFBD> <20>Ӽ<EFBFBD> <20><> (0 ~ 15<31><35>)
char m_cDiffMaxDurability; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD><DBB0><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
unsigned char m_cCoreLevel : 4; // <20>ھ<EFBFBD><DABE><EFBFBD> <20><><EFBFBD><EFBFBD> (0 ~ 15)
unsigned char m_cReserved2 : 4; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...(0~124)
EquipmentInfo()
{
m_cUpgradeCnt = m_cReserved1 = m_cUpgradeLevel = m_cDiffMaxSocket = m_cDiffMaxDurability =
m_cSocketNum = m_cAttributeNum = m_cSeasonRecord = m_cCoreLevel = m_cReserved2 = 0;
}
};
#pragma pack()
const unsigned char MAX_ITEM_SIZE = sizeof(ItemData) +
sizeof(EquipmentInfo) + EquipmentInfo::MAX_SOCKET_AND_ATTRIBUTE_SIZE;
struct SpriteData
{
enum { MAX_NAME = 64, MAX_SPRITE_NAME = 32 };
char m_szName[MAX_NAME];
char m_szSpriteName[MAX_SPRITE_NAME];
unsigned short m_nSpriteMinX;
unsigned short m_nSpriteMinY;
unsigned short m_nSpriteMaxX;
unsigned short m_nSpriteMaxY;
SpriteData();
void Initialize();
};
struct StringData
{
enum
{
MAX_FIELD_MODEL_NAME = 32, MAX_EQUIP_MODEL_NAME = 32,
MAX_EFFECT_SOUND_NAME = 32, MAX_TYPE_NAME = 32,
MAX_ITEM_DESCRIBE = 256
};
char m_szFieldModelName[MAX_FIELD_MODEL_NAME];
char m_szEquipModelName[MAX_EQUIP_MODEL_NAME];
char m_szEffectSoundName[MAX_EFFECT_SOUND_NAME];
char m_szTypeName[MAX_TYPE_NAME];
char m_szItemDescribe[MAX_ITEM_DESCRIBE];
StringData();
void Initialize();
};
struct DetailData
{
enum Flags
{
EQUIP = (1 << 0), // <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
USE_ITEM = (1 << 1), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
QUICKSLOT_IN = (1 << 2), // <20><><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
STACKABLE = (1 << 3), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
HELM = (1 << 4), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ARMOR = (1 << 5), // <20><><EFBFBD>ʷ<EFBFBD>
DAGGER = (1 << 6), // <20>ܰ˷<DCB0>
ONEHANDED = (1 << 7), // <20>Ѽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LONGRANGE = (1 << 8), // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TWOHANDED = (1 << 9), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
STAFF = (1 << 10), // <20><><EFBFBD><EFBFBD><EFBFBD>̷<EFBFBD>
SHIELD = (1 << 11), // <20><><EFBFBD>з<EFBFBD>
//--// start..
NECKLACE = (1 << 12), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RING = (1 << 13), // <20><><EFBFBD><EFBFBD>
RUNE = (1 << 14), // <20><>
//--// end..
AVATA = (1 << 15) // <20>ƹ<EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>
};
unsigned long m_dwPrice; // <20><20><><EFBFBD><EFBFBD>
unsigned long m_dwBlackPrice; // <20>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long m_dwMedalPrice; // <20>޴޻<DEB4><DEBB><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned short m_wDropOption; // <20><>ġ å<><C3A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
unsigned char m_cGrade; // <20><>ġ å<><C3A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20>϶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //--//
unsigned char m_cCriticalType; // ũ<><C5A9>Ƽ<EFBFBD><C6BC> Ÿ<><C5B8>
unsigned char m_cAttackRange; // <20><><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD>
unsigned char m_cItemType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>( namespace Type <20><><EFBFBD><EFBFBD> )
unsigned char m_cXSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><58><C5A9>
unsigned char m_cYSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><59><C5A9>
unsigned char m_cMaxSocketNum; // <20>ִ<EFBFBD> <20><><EFBFBD>ϼ<EFBFBD>
unsigned char m_cDefaultDurabilityOrStack; // <20><20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char m_cMaxDurabilityOrStack; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char m_cMinDropLevel; // <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned char m_cMaxDropLevel; // <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned short m_wLowLimitLevel; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѽ<EFBFBD>.
unsigned short m_wHighLimitLevel; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѽ<EFBFBD>.
bool m_bExchangeAndDrop; // <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD>?
bool m_bSell; // <20><> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>?
bool m_bOptionPrice; // <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> å<><C3A5><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><> <20><><EFBFBD>ΰ<EFBFBD>?
unsigned long m_dwFlags;
DetailData();
void Initialize();
};
struct EquipAttribute
{
unsigned short m_usAttributeValue[Item::Attribute::MAX_ATTRIBUTE_NUM];
unsigned short m_nAttibuteNum;
EquipAttribute();
void Initialize();
};
struct UseItemInfo
{
Position m_Pos; // <20>̵<EFBFBD> <20><>ǥ (<28><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>)
unsigned char m_cZone; // <20>̵<EFBFBD> <20><> (<28><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD>)
unsigned long m_dwAmount; // <20><> (<28><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD>, ij<><C4B3><EFBFBD><EFBFBD>)
unsigned short m_usSkill_ID; // <20><><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD>̵<EFBFBD> (<28><><EFBFBD><EFBFBD>, <20><>ų<EFBFBD><C5B3>)
unsigned short m_usSkill_LockCount; // <20><><EFBFBD><EFBFBD> <20><>ų <20><>ī<EFBFBD><C4AB>Ʈ (<28><><EFBFBD><EFBFBD>, <20><>ų<EFBFBD><C5B3>)
unsigned short m_wQuestID; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̵<EFBFBD> (<28><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
unsigned char m_cLimitRealmPoint; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bool m_bForStatueWar; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
UseItemInfo();
void Initialize();
};
struct UseLimit
{
enum DeactivatedType
{
STATUS_LIMIT = ( 1 << 0 ),
CLASS_LIMIT = ( 1 << 1 ),
BROKEN_ITEM = ( 1 << 2 )
};
unsigned long m_dwClassLimit;
unsigned char m_cLimitStatus;
unsigned short m_wLimitValue;
UseLimit();
void Initialize();
};
#pragma pack(8)
struct ItemInfo
{
unsigned short m_usProtoTypeID;
DetailData m_DetailData;
UseLimit m_UseLimit;
SpriteData m_SpriteData;
StringData m_StringData;
EquipAttribute m_EquipAttribute;
UseItemInfo m_UseItemInfo;
ItemInfo();
ItemInfo(unsigned short usPrototypeID);
void Initialize();
inline bool operator < (ItemInfo& rhs)
{
return (m_usProtoTypeID < rhs.m_usProtoTypeID);
}
const char* GetItemDescribe(void) const;
};
#pragma pack()
struct ItemGarbage
{
CItem* m_lpItem;
unsigned long m_dwRemainNum;
ItemGarbage(CItem* lpItem, unsigned long dwRemainNum);
};
struct ChemicalInfo
{
unsigned short m_wPickkingItemID;
unsigned short m_wTargetItemID;
unsigned short m_wResultItemID;
unsigned char m_cPickkingItemNum;
unsigned char m_cTargetItemNum;
unsigned char m_cResultItemNum;
unsigned long m_dwItemID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
unsigned short m_usAbilityID; // <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
unsigned char m_cAbilityLevel;
unsigned short m_usQuestID; // <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD>
unsigned char m_cPercent; // <20><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>
ChemicalInfo();
ChemicalInfo(unsigned short wPickkingItemID, unsigned char cPickkingItemNum,
unsigned short wTargetItemID, unsigned char cTargetItemNum, unsigned int dwItemID, unsigned short usAbilityID, unsigned char cAbilityLevel, unsigned short usQuestID, unsigned char cPercent);
bool operator < (const ChemicalInfo& rhs)
{
if (m_wPickkingItemID == rhs.m_wPickkingItemID)
{
return m_wTargetItemID < rhs.m_wTargetItemID;
}
return m_wPickkingItemID < rhs.m_wPickkingItemID;
}
bool operator == (const ChemicalInfo& rhs)
{
return (m_wPickkingItemID == rhs.m_wPickkingItemID && m_wTargetItemID == rhs.m_wTargetItemID &&
m_cPickkingItemNum == rhs.m_cPickkingItemNum && m_cTargetItemNum == rhs.m_cTargetItemNum);
}
};
namespace Grade
{
struct GradeInfo
{
EquipType::Grade m_eItemGrade;
unsigned char m_cPlus;
EquipType::Grade m_aryAttributeGrade[Attribute::MAX_ATTRIBUTE_NUM];
GradeInfo();
};
enum TableType
{
DROP_MIN_VALUE = 0, // <20><><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ּҰ<D6BC>
DROP_MAX_VALUE = 1, // <20><><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7>̵<EFBFBD> <20>ִ밪
VALUE_GRADE = 2, // <20><>ġ <20>׷<EFBFBD><D7B7>̵<EFBFBD>
MAX_TABLE_TYPE = 3
};
const float GetGradeValue(Item::CItemType::ArrayType eEquipType, Grade::TableType eTableType,
EquipType::Grade eGrade, Attribute::Type eType);
};
};
#endif

View File

@@ -0,0 +1,200 @@
#ifndef _REBALANCELIB_CONTAINER_CHECKER_H_
#define _REBALANCELIB_CONTAINER_CHECKER_H_
#include <Item/ItemStructure.h>
#include <Network/Packet/PacketStruct/CharItemPacketStruct.h>
namespace RebalanceLib
{
class CItemChecker
{
public:
CItemChecker(TakeType::TakeSource eTakeSource) : m_eTakeSource(eTakeSource) { }
virtual void Set(Item::ItemPos itemPos, int nXSize, int nYSize) = 0;
virtual bool Test(Item::ItemPos itemPos, int nXSize, int nYSize) = 0;
virtual bool FindEmptyPos(Item::ItemPos& foundPos, int nXSize, int nYSize) = 0;
protected:
TakeType::TakeSource m_eTakeSource;
};
template<int nListSize>
class CItemListChecker : public CItemChecker
{
public:
CItemListChecker(TakeType::TakeSource eTakeSource) : CItemChecker(eTakeSource)
{
memset(m_Set, 0, sizeof(char) * nListSize);
}
// CItemListChecker<65><72><EFBFBD><EFBFBD> nXSize, nYSize<7A><65> <20><><EFBFBD>ǹ<EFBFBD><C7B9>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ƴϴ<C6B4><CFB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
virtual void Set(Item::ItemPos itemPos, int nXSize, int nYSize)
{
if(itemPos.m_cIndex < nListSize)
{
m_Set[itemPos.m_cIndex] = 1;
}
}
virtual bool Test(Item::ItemPos itemPos, int nXSize, int nYSize)
{
return (itemPos.m_cIndex < nListSize && 0 == m_Set[itemPos.m_cIndex]);
}
virtual bool FindEmptyPos(Item::ItemPos& foundPos, int nXSize, int nYSize)
{
for(int nIndex = 0; nIndex < nListSize; ++nIndex)
{
foundPos.SetPos(nIndex);
if(Test(foundPos, nXSize, nYSize))
{
foundPos.m_cPos = static_cast<unsigned short>(m_eTakeSource);
return true;
}
}
return false;
}
void Fill() { memset(m_Set, 1, sizeof(char) * nListSize); }
void Clear() { memset(m_Set, 0, sizeof(char) * nListSize); }
private:
char m_Set[nListSize];
};
template<int tX, int tY, int tZ>
class CItemArrayChecker : public CItemChecker
{
public:
CItemArrayChecker(TakeType::TakeSource eTakeSource) : CItemChecker(eTakeSource)
{
memset(m_Set, 0, sizeof(char) * tX * tY * tZ);
}
virtual void Set(Item::ItemPos itemPos, int nXSize, int nYSize)
{
int nZ = itemPos.GetZIndex();
if(nZ < tZ)
{
int nY = itemPos.GetYIndex();
int nX = itemPos.GetXIndex();
int nMaxY = min(static_cast<long>(nY + nYSize), static_cast<long>(tY));
int nMaxX = min(static_cast<long>(nX + nXSize), static_cast<long>(tX));
for(nY = itemPos.GetYIndex(); nY < nMaxY; ++nY)
{
for(nX = itemPos.GetXIndex(); nX < nMaxX; ++nX)
{
m_Set[nX][nY][nZ] = 1;
}
}
}
}
virtual bool Test(Item::ItemPos itemPos, int nXSize, int nYSize)
{
int nZ = itemPos.GetZIndex();
int nY = itemPos.GetYIndex();
int nX = itemPos.GetXIndex();
int nMaxY = nY + nYSize;
int nMaxX = nX + nXSize;
if(tZ < nZ || tY < nMaxY || tX < nMaxX)
{
return false;
}
for(nY = itemPos.GetYIndex(); nY < nMaxY; ++nY)
{
for(nX = itemPos.GetXIndex(); nX < nMaxX; ++nX)
{
if(0 != m_Set[nX][nY][nZ])
{
return false;
}
}
}
return true;
}
virtual bool FindEmptyPos(Item::ItemPos& foundPos, int nXSize, int nYSize)
{
for(int nZ = 0; nZ < tZ; ++nZ)
{
for(int nY = 0; nY < tY; ++nY)
{
for(int nX = 0; nX < tX; ++nX)
{
foundPos.SetPos(nX, nY, nZ);
if(Test(foundPos, nXSize, nYSize))
{
foundPos.m_cPos = static_cast<unsigned short>(m_eTakeSource);
return true;
}
}
}
}
return false;
}
virtual bool FindQuestEmptyPos(Item::ItemPos& foundPos, int nXSize, int nYSize)
{
for(int nY = 0; nY < tY; ++nY)
{
for(int nX = 0; nX < tX; ++nX)
{
foundPos.SetPos(nX, nY, 3);
if(Test(foundPos, nXSize, nYSize))
{
foundPos.m_cPos = static_cast<unsigned short>(m_eTakeSource);
return true;
}
}
}
return false;
}
void FillTab(int nTabNum)
{
if(nTabNum < tZ)
{
for(int nY = 0; nY < tY; ++nY)
{
for(int nX = 0; nX < tX; ++nX)
{
m_Set[nX][nY][nTabNum] = 1;
}
}
}
}
void Fill() { memset(m_Set, 1, sizeof(char) * tX * tY * tZ); }
void Clear() { memset(m_Set, 0, sizeof(char) * tX * tY * tZ); }
private:
char m_Set[tX][tY][tZ];
};
}
#endif

View File

@@ -0,0 +1,497 @@
#include "stdafx.h"
#include "OldItemConstants.h"
#include "OldItemStructure.h"
#include <algorithm>
using namespace OldItem;
OldItem::CItemType& OldItem::CItemType::GetInstance()
{
static CItemType itemType;
return itemType;
}
const CTypeName OldItem::Attribute::Attributes[OldItem::Attribute::MAX_ATTRIBUTE_NUM] =
{
CTypeName(Attribute::NONE, "NONE"),
CTypeName(Attribute::CRITICAL_TYPE, "CRITICAL_TYPE"),
CTypeName(Attribute::CRITICAL_PERCENTAGE, "CRITICAL_PERCENTAGE"),
CTypeName(Attribute::MIN_DAMAGE, "MIN_DAMAGE"),
CTypeName(Attribute::MAX_DAMAGE, "MAX_DAMAGE"),
CTypeName(Attribute::DRC, "DRC"),
CTypeName(Attribute::OFFENCE_REVISION, "OFFENCE_REVISION"),
CTypeName(Attribute::DEFENCE, "DEFENCE"),
CTypeName(Attribute::DEFENCE_REVISION, "DEFENCE_REVISION"),
CTypeName(Attribute::MAGIC_RESISTANCE, "MAGIC_RESISTANCE"),
CTypeName(Attribute::BLOCKING_PERCENTAGE, "BLOCKING_PERCENTAGE"),
CTypeName(Attribute::ATTACK_SPEED, "ATTACK_SPEED"),
CTypeName(Attribute::MOVE_SPEED, "MOVE_SPEED"),
CTypeName(Attribute::ATTACK_RANGE, "ATTACK_RANGE"),
CTypeName(Attribute::RANGE_ATTACK_DISTANCE, "RANGE_ATTACK_DISTANCE"),
CTypeName(Attribute::MAX_HP, "MAX_HP"),
CTypeName(Attribute::MAX_MP, "MAX_MP"),
CTypeName(Attribute::HP_REGEN_AMOUNT, "HP_REGEN_AMOUNT"),
CTypeName(Attribute::MP_REGEN_AMOUNT, "MP_REGEN_AMOUNT"),
CTypeName(Attribute::FIRE_ATTACK, "FIRE_ATTACK"),
CTypeName(Attribute::LIGHTNING_ATTACK, "LIGHTNING_ATTACK"),
CTypeName(Attribute::COLD_ATTACK, "COLD_ATTACK"),
CTypeName(Attribute::DRAIN_ATTACK, "DRAIN_ATTACK"),
CTypeName(Attribute::POISON_ATTACK, "POISON_ATTACK"),
CTypeName(Attribute::FIRE_RESISTANCE, "FIRE_RESISTANCE"),
CTypeName(Attribute::LIGHTNING_RESISTANCE, "LIGHTNING_RESISTANCE"),
CTypeName(Attribute::COLD_RESISTANCE, "COLD_RESISTANCE"),
CTypeName(Attribute::DRAIN_RESISTANCE, "DRAIN_RESISTANCE"),
CTypeName(Attribute::POISON_RESISTANCE, "POISON_RESISTANCE"),
CTypeName(Attribute::ADD_STR, "ADD_STR"),
CTypeName(Attribute::ADD_DEX, "ADD_DEX"),
CTypeName(Attribute::ADD_CON, "ADD_CON"),
CTypeName(Attribute::ADD_INT, "ADD_INT"),
CTypeName(Attribute::ADD_WIS, "ADD_WIS"),
CTypeName(Attribute::MAGIC_POWER, "MAGIC_POWER")
};
const CTypeName OldItem::Grade::Grades[Grade::MAX_ITEM_GRADE] =
{
CTypeName(Grade::ETC, "ETC"),
CTypeName(Grade::NORMAL, "NORMAL"),
CTypeName(Grade::ENHANCED, "ENHANCED"),
CTypeName(Grade::RARE, "RARE")
};
OldItem::CItemType::CItemType()
{
using namespace OldItem::ItemType;
int nCount = 0;
for(nCount = 0; nCount < MAX_ARRAY_TYPE; ++nCount)
{
m_ItemTypes[nCount].reserve(MAX_ITEM_TYPE);
}
m_ItemTypeNames[HELM] = CTypeName(HELM, "HELM");
m_ItemTypeNames[SHIRT] = CTypeName(SHIRT, "SHIRT");
m_ItemTypeNames[TUNIC] = CTypeName(TUNIC, "TUNIC");
m_ItemTypeNames[ARMOUR] = CTypeName(ARMOUR, "ARMOUR");
m_ItemTypeNames[GLOVE] = CTypeName(GLOVE, "GLOVE");
m_ItemTypeNames[BOOTS] = CTypeName(BOOTS, "BOOTS");
m_ItemTypeNames[SWORD] = CTypeName(SWORD, "ONEHANDED_SWORD");
m_ItemTypeNames[BLUNT] = CTypeName(BLUNT, "ONEHANDED_BLUNT");
m_ItemTypeNames[AXE] = CTypeName(AXE, "ONEHANDED_AXE");
m_ItemTypeNames[TWOHANDED_BLUNT] = CTypeName(TWOHANDED_BLUNT, "TWOHANDED_BLUNT");
m_ItemTypeNames[TWOHANDED_AXE] = CTypeName(TWOHANDED_AXE, "TWOHANDED_AXE");
m_ItemTypeNames[TWOHANDED_SWORD] = CTypeName(TWOHANDED_SWORD, "TWOHANDED_SWORD");
m_ItemTypeNames[BOW] = CTypeName(BOW, "BOW");
m_ItemTypeNames[CROSSBOW] = CTypeName(CROSSBOW, "CROSSBOW");
m_ItemTypeNames[STAFF] = CTypeName(STAFF, "STAFF");
m_ItemTypeNames[DAGGER] = CTypeName(DAGGER, "DAGGER");
m_ItemTypeNames[SHIELD] = CTypeName(SHIELD, "SHIELD");
m_ItemTypeNames[CLOAK] = CTypeName(CLOAK, "CLOAK");
m_ItemTypeNames[RING] = CTypeName(RING, "RING");
m_ItemTypeNames[NECKLACE] = CTypeName(NECKLACE, "NECKLACE");
m_ItemTypeNames[POTION] = CTypeName(POTION, "POTION");
m_ItemTypeNames[POISON] = CTypeName(POISON, "POISON");
m_ItemTypeNames[TRAP] = CTypeName(TRAP, "TRAP");
m_ItemTypeNames[SKILLBOOK] = CTypeName(SKILLBOOK, "SKILLBOOK");
m_ItemTypeNames[GEM] = CTypeName(GEM, "GEM");
m_ItemTypeNames[RUNE] = CTypeName(RUNE, "RUNE");
m_ItemTypeNames[MATERIAL] = CTypeName(MATERIAL, "ORE");
m_ItemTypeNames[AMMO] = CTypeName(AMMO, "AMMO");
m_ItemTypeNames[ETC] = CTypeName(ETC, "ETC");
m_ItemTypeNames[HEAD] = CTypeName(HEAD, "HEAD");
m_ItemTypeNames[BODY] = CTypeName(BODY, "BODY");
m_ItemTypeNames[PROTECT_A] = CTypeName(PROTECT_A, "PROTECT_A");
m_ItemTypeNames[PELVIS] = CTypeName(PELVIS, "PELVIS");
m_ItemTypeNames[COM_BLUNT] = CTypeName(COM_BLUNT, "COM_BLUNT");
m_ItemTypeNames[COM_SWORD] = CTypeName(COM_SWORD, "COM_SWORD");
m_ItemTypeNames[OPP_HAMMER] = CTypeName(OPP_HAMMER, "OPP_HAMMER");
m_ItemTypeNames[OPP_AXE] = CTypeName(OPP_AXE, "OPP_AXE");
m_ItemTypeNames[OPP_SLUSHER] = CTypeName(OPP_SLUSHER, "OPP_SLUSHER");
m_ItemTypeNames[OPP_TALON] = CTypeName(OPP_TALON, "OPP_TALON");
m_ItemTypeNames[OPP_SYTHE] = CTypeName(OPP_SYTHE, "OPP_SYTHE");
m_ItemTypeNames[SKILL_A_GUARD] = CTypeName(SKILL_A_GUARD, "SKILL_A_GUARD");
m_ItemTypeNames[SKILL_A_ATTACK] = CTypeName(SKILL_A_ATTACK, "SKILL_A_ATTACK");
m_ItemTypeNames[SKILL_A_GUN] = CTypeName(SKILL_A_GUN, "SKILL_A_GUN");
m_ItemTypeNames[SKILL_A_KNIFE] = CTypeName(SKILL_A_KNIFE, "SKILL_A_KNIFE");
m_ItemTypeNames[ACCESSORY] = CTypeName(ACCESSORY, "ACCESSORY");
m_ItemTypeNames[ARROW] = CTypeName(ARROW, "ARROW");
m_ItemTypeNames[BOLT] = CTypeName(BOLT, "BOLT");
m_ItemTypeNames[PORTAL] = CTypeName(PORTAL, "PORTAL");
m_ItemTypeNames[EVENT_DROP] = CTypeName(EVENT_DROP, "EVENT_DROP");
m_ItemTypeNames[EVENT_LOTTERY] = CTypeName(EVENT_LOTTERY, "EVENT_LOTTERY");
m_ItemTypeNames[EXPBOOK] = CTypeName(EXPBOOK, "EXPBOOK");
m_ItemTypeNames[CASHBOOK] = CTypeName(CASHBOOK, "CASHBOOK");
m_ItemTypeNames[FIRE_CRACKER] = CTypeName(FIRE_CRACKER, "FIRE_CRACKER");
m_ItemTypeNames[CAMP_KIT] = CTypeName(CAMP_KIT, "CAMP_KIT");
m_ItemTypeNames[SHORT_RANGE_ARMS_KIT] = CTypeName(SHORT_RANGE_ARMS_KIT, "SHORT_RANGE_ARMS_KIT");
m_ItemTypeNames[LONG_RANGE_ARMS_KIT] = CTypeName(LONG_RANGE_ARMS_KIT, "LONG_RANGE_ARMS_KIT");
m_ItemTypeNames[AIRSHIP_KIT] = CTypeName(AIRSHIP_KIT, "AIRSHIP_KIT");
// <20><><EFBFBD><EFBFBD>
m_ItemTypes[EQUIP_TYPE].push_back(ARROW); m_ItemTypes[EQUIP_TYPE].push_back(BOLT);
m_ItemTypes[EQUIP_TYPE].push_back(HELM); m_ItemTypes[EQUIP_TYPE].push_back(SHIRT);
m_ItemTypes[EQUIP_TYPE].push_back(TUNIC); m_ItemTypes[EQUIP_TYPE].push_back(ARMOUR);
m_ItemTypes[EQUIP_TYPE].push_back(SHIELD); m_ItemTypes[EQUIP_TYPE].push_back(CLOAK);
m_ItemTypes[EQUIP_TYPE].push_back(GLOVE); m_ItemTypes[EQUIP_TYPE].push_back(BOOTS);
m_ItemTypes[EQUIP_TYPE].push_back(SWORD); m_ItemTypes[EQUIP_TYPE].push_back(BLUNT);
m_ItemTypes[EQUIP_TYPE].push_back(AXE); m_ItemTypes[EQUIP_TYPE].push_back(DAGGER);
m_ItemTypes[EQUIP_TYPE].push_back(STAFF); m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_BLUNT);
m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_AXE); m_ItemTypes[EQUIP_TYPE].push_back(TWOHANDED_SWORD);
m_ItemTypes[EQUIP_TYPE].push_back(BOW); m_ItemTypes[EQUIP_TYPE].push_back(CROSSBOW);
m_ItemTypes[EQUIP_TYPE].push_back(RING); m_ItemTypes[EQUIP_TYPE].push_back(NECKLACE);
m_ItemTypes[EQUIP_TYPE].push_back(HEAD); m_ItemTypes[EQUIP_TYPE].push_back(BODY);
m_ItemTypes[EQUIP_TYPE].push_back(PELVIS); m_ItemTypes[EQUIP_TYPE].push_back(PROTECT_A);
m_ItemTypes[EQUIP_TYPE].push_back(COM_BLUNT); m_ItemTypes[EQUIP_TYPE].push_back(COM_SWORD);
m_ItemTypes[EQUIP_TYPE].push_back(OPP_HAMMER); m_ItemTypes[EQUIP_TYPE].push_back(OPP_AXE);
m_ItemTypes[EQUIP_TYPE].push_back(OPP_SLUSHER); m_ItemTypes[EQUIP_TYPE].push_back(OPP_TALON);
m_ItemTypes[EQUIP_TYPE].push_back(OPP_SYTHE); m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_GUARD);
m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_ATTACK); m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_GUN);
m_ItemTypes[EQUIP_TYPE].push_back(SKILL_A_KNIFE); m_ItemTypes[EQUIP_TYPE].push_back(ACCESSORY);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_ItemTypes[USE_ITEM_TYPE].push_back(POTION); m_ItemTypes[USE_ITEM_TYPE].push_back(POISON);
m_ItemTypes[USE_ITEM_TYPE].push_back(TRAP); m_ItemTypes[USE_ITEM_TYPE].push_back(SKILLBOOK);
m_ItemTypes[USE_ITEM_TYPE].push_back(AMMO); m_ItemTypes[USE_ITEM_TYPE].push_back(PORTAL);
m_ItemTypes[USE_ITEM_TYPE].push_back(EVENT_LOTTERY); m_ItemTypes[USE_ITEM_TYPE].push_back(EXPBOOK);
m_ItemTypes[USE_ITEM_TYPE].push_back(CASHBOOK); m_ItemTypes[USE_ITEM_TYPE].push_back(FIRE_CRACKER);
m_ItemTypes[USE_ITEM_TYPE].push_back(CAMP_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(SHORT_RANGE_ARMS_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(LONG_RANGE_ARMS_KIT);
m_ItemTypes[USE_ITEM_TYPE].push_back(AIRSHIP_KIT);
// <20><><EFBFBD><EFBFBD>
m_ItemTypes[WEAPON_TYPE].push_back(SWORD); m_ItemTypes[WEAPON_TYPE].push_back(BLUNT);
m_ItemTypes[WEAPON_TYPE].push_back(AXE); m_ItemTypes[WEAPON_TYPE].push_back(DAGGER);
m_ItemTypes[WEAPON_TYPE].push_back(STAFF); m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_BLUNT);
m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_AXE); m_ItemTypes[WEAPON_TYPE].push_back(TWOHANDED_SWORD);
m_ItemTypes[WEAPON_TYPE].push_back(BOW); m_ItemTypes[WEAPON_TYPE].push_back(CROSSBOW);
m_ItemTypes[WEAPON_TYPE].push_back(COM_BLUNT); m_ItemTypes[WEAPON_TYPE].push_back(COM_SWORD);
m_ItemTypes[WEAPON_TYPE].push_back(OPP_HAMMER); m_ItemTypes[WEAPON_TYPE].push_back(OPP_AXE);
m_ItemTypes[WEAPON_TYPE].push_back(OPP_SLUSHER); m_ItemTypes[WEAPON_TYPE].push_back(OPP_TALON);
m_ItemTypes[WEAPON_TYPE].push_back(OPP_SYTHE);
// <20><><EFBFBD>
m_ItemTypes[ARMOUR_TYPE].push_back(HELM); m_ItemTypes[ARMOUR_TYPE].push_back(SHIRT);
m_ItemTypes[ARMOUR_TYPE].push_back(TUNIC); m_ItemTypes[ARMOUR_TYPE].push_back(ARMOUR);
m_ItemTypes[ARMOUR_TYPE].push_back(SHIELD); m_ItemTypes[ARMOUR_TYPE].push_back(CLOAK);
m_ItemTypes[ARMOUR_TYPE].push_back(GLOVE); m_ItemTypes[ARMOUR_TYPE].push_back(BOOTS);
m_ItemTypes[ARMOUR_TYPE].push_back(HEAD); m_ItemTypes[ARMOUR_TYPE].push_back(BODY);
m_ItemTypes[ARMOUR_TYPE].push_back(PELVIS); m_ItemTypes[ARMOUR_TYPE].push_back(PROTECT_A);
// <20><>ų<EFBFBD><C5B3>
m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_GUARD); m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_ATTACK);
m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_GUN); m_ItemTypes[SKILL_ARM_TYPE].push_back(SKILL_A_KNIFE);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_ItemTypes[TWOHANDED_TYPE].push_back(STAFF); m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_BLUNT);
m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_AXE); m_ItemTypes[TWOHANDED_TYPE].push_back(TWOHANDED_SWORD);
m_ItemTypes[TWOHANDED_TYPE].push_back(BOW); m_ItemTypes[TWOHANDED_TYPE].push_back(CROSSBOW);
// <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD><CCB5>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD>
m_ItemTypes[UPGRADE_SOCKET_ONLY].push_back(HELM);
m_ItemTypes[UPGRADE_SOCKET_ONLY].push_back(RING);
m_ItemTypes[UPGRADE_SOCKET_ONLY].push_back(NECKLACE);
m_ItemTypes[UPGRADE_SOCKET_ONLY].push_back(HEAD);
m_ItemTypes[UPGRADE_SOCKET_ONLY].push_back(ACCESSORY);
for(nCount = 0; nCount < MAX_ARRAY_TYPE; ++nCount)
{
std::sort(m_ItemTypes[nCount].begin(), m_ItemTypes[nCount].end());
}
}
bool OldItem::CItemType::IsCorrectItemType(ArrayType itemType, unsigned char cEquipType)
{
return std::binary_search(m_ItemTypes[itemType].begin(),
m_ItemTypes[itemType].end(), cEquipType);
}
unsigned char OldItem::CItemType::ConvertRandomOptionType(unsigned char cEquipType)
{
using namespace OldItem::ItemType;
if (true == IsCorrectItemType(CItemType::WEAPON_TYPE, cEquipType))
{
return RandomOption::WEAPON;
}
else
{
switch (cEquipType)
{
case ARMOUR: case BODY: return RandomOption::ARMOUR_BODY;
case HELM: case HEAD: return RandomOption::HELM_HEAD;
case RING: case ACCESSORY: return RandomOption::RING_ACCESSORY;
case NECKLACE: return RandomOption::NECKLACE;
case SHIELD: case SKILL_A_GUARD: return RandomOption::SKILL_A_GUARD;
case SKILL_A_ATTACK:
case SKILL_A_GUN:
case SKILL_A_KNIFE:
return RandomOption::SKILL_A_WEAPON;
}
}
return RandomOption::MAX_RANDOM_OPTION_TYPE;
}
void OldItem::CItemType::SetEquipTypeFlags(OldItem::ItemInfo& itemInfo)
{
using namespace OldItem::ItemType;
switch (itemInfo.m_DetailData.m_cItemType)
{
case ARROW:
case BOLT:
itemInfo.m_DetailData.m_dwFlags |= OldItem::DetailData::STACKABLE;
break;
}
if (IsCorrectItemType(WEAPON_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::WEAPON;
if (IsCorrectItemType(TWOHANDED_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::TWOHANDED;
}
}
else if (IsCorrectItemType(SKILL_ARM_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::SKILL_ARM;
}
else if (IsCorrectItemType(ARMOUR_TYPE, itemInfo.m_DetailData.m_cItemType))
{
itemInfo.m_DetailData.m_dwFlags |= DetailData::ARMOUR;
}
itemInfo.m_DetailData.m_dwFlags |= OldItem::DetailData::EQUIP;
}
void OldItem::CItemType::SetUseItemTypeFlags(OldItem::ItemInfo& itemInfo)
{
using namespace OldItem::ItemType;
switch (itemInfo.m_DetailData.m_cItemType)
{
case POTION:
case POISON:
case TRAP:
case PORTAL:
case FIRE_CRACKER:
itemInfo.m_DetailData.m_dwFlags |= OldItem::DetailData::QUICKSLOT_IN;
break;
}
if (itemInfo.m_DetailData.m_cMaxDurabilityOrStack > 1)
{
itemInfo.m_DetailData.m_dwFlags |= OldItem::DetailData::STACKABLE;
}
itemInfo.m_DetailData.m_dwFlags |= OldItem::DetailData::USE_ITEM;
}
void OldItem::CItemType::SetEtcItemTypeFlags(OldItem::ItemInfo& itemInfo)
{
if (itemInfo.m_DetailData.m_cMaxDurabilityOrStack > 1)
{
itemInfo.m_DetailData.m_dwFlags |= OldItem::DetailData::STACKABLE;
}
}
using namespace OldItem::Attribute;
typedef OldItem::ItemAttribute Gem;
typedef OldItem::ItemAttribute Upg;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1<><31> <20>ɷ<EFBFBD>ġ <20><><EFBFBD>̺<EFBFBD>
const Gem GemAttribute1[5][4] =
{
// <09><><EFBFBD><EFBFBD> / <20><>ų<EFBFBD><C5B3> <09>Ƹ<EFBFBD> <09><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>
Gem(FIRE_ATTACK, 1), Gem(FIRE_RESISTANCE, 1), Gem(FIRE_RESISTANCE, 1), Gem(ADD_STR, 3), // <20><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>
Gem(POISON_ATTACK, 1), Gem(POISON_RESISTANCE, 1), Gem(POISON_RESISTANCE, 1), Gem(ADD_CON, 3), // <20><><EFBFBD>޶<EFBFBD><DEB6><EFBFBD> <20><><EFBFBD><EFBFBD>
Gem(COLD_ATTACK, 1), Gem(COLD_RESISTANCE, 1), Gem(COLD_RESISTANCE, 1), Gem(ADD_INT, 3), // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD>
Gem(LIGHTNING_ATTACK, 1), Gem(LIGHTNING_RESISTANCE, 1), Gem(LIGHTNING_RESISTANCE, 1), Gem(ADD_WIS, 3), // <20><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD> <20><><EFBFBD><EFBFBD>
Gem(DRAIN_ATTACK, 1), Gem(DRAIN_RESISTANCE, 1), Gem(DRAIN_RESISTANCE, 1), Gem(ADD_DEX, 3) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
};
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 2<><32> <20>̻<EFBFBD> <20>ɷ<EFBFBD>ġ <20><><EFBFBD>̺<EFBFBD>
const Gem GemAttribute2[5][4] =
{
// <09><><EFBFBD><EFBFBD> / <20><>ų<EFBFBD><C5B3> <09>Ƹ<EFBFBD> <09><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>
Gem(MAX_DAMAGE, 1), Gem(DEFENCE_REVISION, 1), Gem(DEFENCE_REVISION, 1), Gem(ADD_STR, 3), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Gem(HP_REGEN_AMOUNT, 2), Gem(MAX_HP, 1), Gem(MAX_HP, 1), Gem(ADD_CON, 3), // <20><><EFBFBD>޶<EFBFBD><DEB6><EFBFBD> <20><><EFBFBD><EFBFBD>
Gem(MP_REGEN_AMOUNT, 2), Gem(MAX_MP, 1), Gem(MAGIC_RESISTANCE, 2), Gem(ADD_INT, 3), // <20><><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD>
Gem(CRITICAL_PERCENTAGE, 1), Gem(MAGIC_RESISTANCE, 2), Gem(BLOCKING_PERCENTAGE, 1), Gem(ADD_DEX, 3), // <20><><EFBFBD>̾Ƹ<CCBE><C6B8><EFBFBD> <20><><EFBFBD><EFBFBD>
Gem(OFFENCE_REVISION, 1), Gem(DEFENCE, 1), Gem(DEFENCE, 1), Gem(ADD_DEX, 3) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
};
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 2<><32> <20>̻<EFBFBD> <20>ɷ<EFBFBD>ġ <20><><EFBFBD>̺<EFBFBD>
const Upg UpgradeAttribute[15][4] =
{
// <09><><EFBFBD><EFBFBD> / <20><>ų<EFBFBD><C5B3> <09>Ƹ<EFBFBD> <09><><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD>
Upg(MAX_DAMAGE, 3), Upg(DEFENCE, 3), Upg(BLOCKING_PERCENTAGE, 2), Upg(0, 0), // 1<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 3), Upg(DEFENCE, 3), Upg(BLOCKING_PERCENTAGE, 2), Upg(0, 0), // 2<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 6), Upg(DEFENCE, 6), Upg(BLOCKING_PERCENTAGE, 4), Upg(0, 0), // 3<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 6), Upg(DEFENCE, 6), Upg(BLOCKING_PERCENTAGE, 4), Upg(0, 0), // 4<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 9), Upg(DEFENCE, 9), Upg(BLOCKING_PERCENTAGE, 6), Upg(0, 0), // 5<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 9), Upg(DEFENCE, 9), Upg(BLOCKING_PERCENTAGE, 6), Upg(0, 0), // 6<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 12), Upg(DEFENCE, 12), Upg(BLOCKING_PERCENTAGE, 8), Upg(0, 0), // 7<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 12), Upg(DEFENCE, 12), Upg(BLOCKING_PERCENTAGE, 8), Upg(0, 0), // 8<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 15), Upg(DEFENCE, 15), Upg(BLOCKING_PERCENTAGE, 10), Upg(0, 0), // 9<>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 15), Upg(DEFENCE, 15), Upg(BLOCKING_PERCENTAGE, 10), Upg(0, 0), // 10<31>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 19), Upg(DEFENCE, 19), Upg(BLOCKING_PERCENTAGE, 13), Upg(0, 0), // 11<31>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 19), Upg(DEFENCE, 19), Upg(BLOCKING_PERCENTAGE, 13), Upg(0, 0), // 12<31>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 23), Upg(DEFENCE, 23), Upg(BLOCKING_PERCENTAGE, 16), Upg(0, 0), // 13<31>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 23), Upg(DEFENCE, 23), Upg(BLOCKING_PERCENTAGE, 16), Upg(0, 0), // 14<31>ܰ<EFBFBD>
Upg(MAX_DAMAGE, 27), Upg(DEFENCE, 27), Upg(BLOCKING_PERCENTAGE, 19), Upg(0, 0), // 15<31>ܰ<EFBFBD>
};
enum EquipType { None = 0, Weapon = 1, Armour = 2, Shield = 3, Helm = 4 };
short GetEquipType(OldItem::ItemType::Type eItemType)
{
using namespace OldItem::ItemType;
// <20><><EFBFBD><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD>
switch (eItemType)
{
case SWORD: case BLUNT: case AXE: case TWOHANDED_BLUNT: // <20>ΰ<EFBFBD>
case TWOHANDED_AXE: case TWOHANDED_SWORD: case BOW: case CROSSBOW:
case STAFF: case DAGGER:
case COM_BLUNT: case COM_SWORD: case OPP_HAMMER: case OPP_AXE: // <20><>ĭ
case OPP_SLUSHER: case OPP_TALON: case OPP_SYTHE: case SKILL_A_ATTACK:
case SKILL_A_GUN: case SKILL_A_KNIFE:
return Weapon;
case ARMOUR: // <20>ΰ<EFBFBD>
case BODY: // <20><>ĭ
return Armour;
case SHIELD: // <20>ΰ<EFBFBD>
case SKILL_A_GUARD: // <20><>ĭ
return Shield;
case HELM: // <20>ΰ<EFBFBD>
case HEAD: // <20><>ĭ
return Helm;
}
return None;
}
void OldItem::CItemType::GetInstallGemAttribute(const unsigned char* cSockets_In,
OldItem::ItemAttribute* cAttributes_Out,
OldItem::ItemType::Type eItemType,
unsigned char cSocketNum,
unsigned char cMaxAttributeNum)
{
enum GemType
{
Ruby = 0,
Emerald = 1,
Sapphire = 2,
Diamond = 3,
BlackMoon = 4,
MaxType = 5
};
short EquipType = GetEquipType(eItemType); // <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>
short GemType = 0; // <20><> Ÿ<><C5B8>
short GemLevel = 0; // <20><> <20><><EFBFBD><EFBFBD>
if (0 >= EquipType)
return;
Gem GemAttr;
unsigned short AttributeIndex = 0;
for(unsigned char SocketIndex = 0;
SocketIndex < cSocketNum && AttributeIndex < cMaxAttributeNum;
++SocketIndex)
{
GemType = (cSockets_In[SocketIndex] - 1) % MaxType;
GemLevel = ((cSockets_In[SocketIndex] - 1) / MaxType) + 1;
if (0 == SocketIndex)
{
GemAttr = GemAttribute1[GemType][EquipType - 1]; // <20><><EFBFBD><EFBFBD> ù<><C3B9>°
}
else
{
GemAttr = GemAttribute2[GemType][EquipType - 1]; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
GemAttr.m_usValue *= GemLevel;
cAttributes_Out[AttributeIndex] = GemAttr;
++AttributeIndex;
if (MAX_DAMAGE == GemAttr.m_cType)
{
// <20>ְ<EFBFBD>, <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>.
GemAttr.m_cType = MIN_DAMAGE;
cAttributes_Out[AttributeIndex] = GemAttr;
++AttributeIndex;
}
}
}
void OldItem::CItemType::GetUpgradeItemAttribute(OldItem::ItemType::Type eItemType, OldItem::ItemAttribute* cAttributes_Out,
unsigned char cUpgradeLevel, unsigned char cMaxUpgradeAttributeNum)
{
using namespace OldItem::ItemType;
short EquipType = GetEquipType(eItemType); // <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>
if (0 == cUpgradeLevel || 0 >= EquipType)
return;
Upg UpgAttr = UpgradeAttribute[cUpgradeLevel - 1][EquipType - 1];
if (0 == UpgAttr.m_usValue)
return;
short AttributeIndex = 0;
cAttributes_Out[AttributeIndex] = UpgAttr;
++AttributeIndex;
if (MAX_DAMAGE == UpgAttr.m_cType)
{
// <20>ְ<EFBFBD>, <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD><C3B8><EFBFBD>.
UpgAttr.m_cType = MIN_DAMAGE;
cAttributes_Out[AttributeIndex] = UpgAttr;
++AttributeIndex;
}
/* FIXME :
if (IsWeapon(EquipType))
{
Attribute[0].m_nAttributeType = Attribute::MIN_DAMAGE; // <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
Attribute[0].m_nValue = 3;
Attribute[1].m_nAttributeType = Attribute::MAX_DAMAGE; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
Attribute[1].m_nValue = 3;
return 2;
}
else if (IsArmour(EquipType))
{
Attribute[0].m_nAttributeType = Attribute::DEFENCE; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
Attribute[0].m_nValue = 3;
return 1;
}
*/
}

View File

@@ -0,0 +1,351 @@
#ifndef _OLD_ITEM_CONSTANTS_H_
#define _OLD_ITEM_CONSTANTS_H_
#include <vector>
#include <Pattern/Singleton.h>
#include <Utility/TypeArray.h>
namespace OldItem
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
struct ItemInfo;
struct ItemAttribute;
namespace ItemType
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> ( 8bit )
enum Type
{
// <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
HELM = 0, SHIRT = 1,
TUNIC = 2, ARMOUR = 3,
GLOVE = 4, BOOTS = 5,
SWORD = 6, BLUNT = 7,
AXE = 8, TWOHANDED_BLUNT = 9,
TWOHANDED_AXE = 10, TWOHANDED_SWORD = 11,
BOW = 12, CROSSBOW = 13,
STAFF = 14, DAGGER = 15,
SHIELD = 16, CLOAK = 17,
RING = 18, NECKLACE = 19,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POTION = 20, POISON = 21,
TRAP = 22, SKILLBOOK = 23,
GEM = 24, RUNE = 25,
MATERIAL = 26, AMMO = 27,
ETC = 28,
// <20><>ĭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HEAD = 29, BODY = 30,
PROTECT_A = 31, PELVIS = 32,
COM_BLUNT = 33, COM_SWORD = 34,
OPP_HAMMER = 35, OPP_AXE = 36,
OPP_SLUSHER = 37, OPP_TALON = 38,
OPP_SYTHE = 39, SKILL_A_GUARD = 40,
SKILL_A_ATTACK = 41, SKILL_A_GUN = 42,
SKILL_A_KNIFE = 43, ACCESSORY = 44,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28>Ŀ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD>)
ARROW = 45, BOLT = 46,
PORTAL = 47, EVENT_DROP = 48,
EVENT_LOTTERY = 49, EXPBOOK = 50,
CASHBOOK = 51, FIRE_CRACKER = 52,
CAMP_KIT = 53, SHORT_RANGE_ARMS_KIT = 54, // <20><><EFBFBD><EFBFBD>, <20>ٰŸ<D9B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŸƮŶ
LONG_RANGE_ARMS_KIT = 55, AIRSHIP_KIT = 56, // <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŸƮŶ
MAX_ITEM_TYPE = 57
};
enum DropType
{
MAX_DROP_TYPE = 35
};
};
class CItemType
{
public:
static CItemType& GetInstance();
enum ArrayType
{
EQUIP_TYPE = 0, USE_ITEM_TYPE = 1,
WEAPON_TYPE = 2, ARMOUR_TYPE = 3,
SKILL_ARM_TYPE = 4, TWOHANDED_TYPE = 5,
UPGRADE_SOCKET_ONLY = 6, MAX_ARRAY_TYPE = 7
};
typedef std::vector<OldItem::ItemAttribute> ItemAttributeArray;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
static void GetInstallGemAttribute(const unsigned char* cSockets_In,
ItemAttribute* cAttributes_Out, ItemType::Type eItemType,
unsigned char cSocketNum, unsigned char cMaxAttributeNum);
static bool IsUpgradeSocketOnly(ItemType::Type eItemType);
static void GetUpgradeItemAttribute(ItemType::Type eItemType, ItemAttribute* cAttributes_Out,
unsigned char cUpgradeLevel, unsigned char cMaxUpgradeAttributeNum);
// <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
bool IsCorrectItemType(ArrayType itemType, unsigned char cEquipType);
unsigned char ConvertRandomOptionType(unsigned char cEquipType);
void SetEquipTypeFlags(ItemInfo& itemInfo);
void SetUseItemTypeFlags(ItemInfo& itemInfo);
void SetEtcItemTypeFlags(ItemInfo& itemInfo);
CTypeName* GetItemTypeName() { return m_ItemTypeNames; }
private:
CItemType();
typedef std::vector<ItemType::Type> ItemTypeArray;
ItemTypeArray m_ItemTypes[MAX_ARRAY_TYPE];
CTypeName m_ItemTypeNames[ItemType::MAX_ITEM_TYPE];
};
namespace Attribute
{
enum Type
{
// Creature<72><65> <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD><DBBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
NONE = 0, CRITICAL_TYPE = 1,
CRITICAL_PERCENTAGE = 2, MIN_DAMAGE = 3,
MAX_DAMAGE = 4, DRC = 5,
OFFENCE_REVISION = 6, DEFENCE = 7,
DEFENCE_REVISION = 8, MAGIC_RESISTANCE = 9,
BLOCKING_PERCENTAGE = 10, ATTACK_SPEED = 11,
MOVE_SPEED = 12, ATTACK_RANGE = 13,
RANGE_ATTACK_DISTANCE = 14, MAX_HP = 15,
MAX_MP = 16, HP_REGEN_AMOUNT = 17,
MP_REGEN_AMOUNT = 18, FIRE_ATTACK = 19,
LIGHTNING_ATTACK = 20, COLD_ATTACK = 21,
DRAIN_ATTACK = 22, POISON_ATTACK = 23,
FIRE_RESISTANCE = 24, LIGHTNING_RESISTANCE = 25,
COLD_RESISTANCE = 26, DRAIN_RESISTANCE = 27,
POISON_RESISTANCE = 28, ADD_STR = 29,
ADD_DEX = 30, ADD_CON = 31,
ADD_INT = 32, ADD_WIS = 33,
MAGIC_POWER = 34,
MAX_ATTRIBUTE_NUM = 35
};
enum Trend
{
Aggressive = (1 << 0),
Defensive = (1 << 1)
};
enum CriticalType
{
NONE_TYPE = 0,
SWORD_TYPE = 1,
AXE_TYPE = 2,
BLUNT_TYPE = 3
};
extern const CTypeName Attributes[MAX_ATTRIBUTE_NUM];
};
namespace EquipType
{
enum Type
{
Attach = 0,
Detach = 1,
GuardArm = 2
};
enum DoubleSwordType
{
ErrorDoubleSword = 0,
SoloSword = 1,
WarriorDoubleSword = 2,
AssasinDoubleDagger = 3
};
};
namespace RandomOption
{
enum Type
{
WEAPON = 0, ARMOUR_BODY = 1,
HELM_HEAD = 2, RING_ACCESSORY = 3,
NECKLACE = 4, SKILL_A_GUARD = 5,
SKILL_A_WEAPON = 6,
MAX_RANDOM_OPTION_TYPE = 7
};
enum Attribute
{
MAX_DURABILITY = 0, NOW_DURABILITY = 1,
MIN_DAMAGE = 2, MAX_DAMAGE = 3,
OFFENCE_REVISION = 4, DEFENCE = 5,
DEFENCE_REVISION = 6, MAGIC_RESISTANCE = 7,
CRITICAL_PERCENTAGE = 8, BLOCKING_PERCENTAGE = 9,
MAX_HP = 10, MAX_MP = 11,
HP_REGEN_AMOUNT = 12, MP_REGEN_AMOUNT = 13,
MAX_RANDOM_OPTION_ATTRIBUTE = 14
};
enum ValueRange
{
MIN_MINUS_FACTOR = 0, MIN_MULTIPLY_FACTOR = 1,
MIN_DIVIDE_FACTOR = 2, MAX_MULTIPLY_FACTOR = 3,
MAX_DIVIDE_FACTOR = 4, MAX_PLUS_FACTOR = 5,
MAX_RANDOM_OPTION_VALUE_RANGE = 6
};
};
namespace EquipmentPos
{
// <20><><EFBFBD><EFBFBD> <20><>ġ ( 8bit )
enum Type
{
// <20>ΰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ
HELM = 0, SHIRT = 1,
TUNIC = 2, ARMOUR = 3,
GLOVE = 4, BOOTS = 5,
NECKLACE = 6, RINGR = 7,
RINGL = 8, SHIELD_HAND1 = 9,
SHIELD_HAND2 = 10, WEAPON_HAND1 = 11,
WEAPON_HAND2 = 12, CLOAK = 13,
RIDE = 14,
// <20><>ĭ <20><><EFBFBD><EFBFBD> <20><>ġ
HEAD = 0, BODY = 3,
PROTECT_ARM = 4, PELVIS = 5,
ACCESSORY1 = 6, ACCESSORY2 = 7,
ACCESSORY3 = 8, SKILL_ARM = 9,
WEAPON = 11,
MAX_EQUPMENT_POS = 16,
TEMP_ITEM_INDEX = 128
};
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
namespace StatusLimit
{
enum Type
{
NONE = 0, LEVEL = 1,
STR = 2, DEX = 3,
CON = 4, INT = 5,
WIS = 6,
MAX_STATUS_LIMIT = 7
};
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
namespace Grade
{
enum Type
{
ETC = 0,
NORMAL = 1,
ENHANCED = 2,
RARE = 3,
MAX_ITEM_GRADE = 4
};
extern const CTypeName Grades[MAX_ITEM_GRADE];
};
namespace ExtraSpacePos
{
enum Type
{
UPGRADE_EQUIPMENT_POS = 0,
UPGRADE_MATERIAL_POS = 1,
HOLDITEM_POS = 2,
KIT_MATERIAL_POS = 3,
CAMP_MATERIAL_POS = 4, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS1 = 5, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS2 = 6, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS3 = 7, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS4 = 8, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS5 = 9, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS6 = 10, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS7 = 11, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS8 = 12, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
EMBLEM_JEWEL_POS9 = 13, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
MAX_EXTRA_SPACE_NUM = 14,
EMBLEM_JEWEL_POS_NUM = 9
};
};
namespace EtcItemID
{
enum Type
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
GEM_START_ID = 1901,
GEM_END_ID = 1915,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
MINERAL_START_ID = 2001,
MINERAL_END_ID = 2003,
SYLVINE = 2001,
MYTHRIL = 2002,
ETERNIUM = 2003,
// ȸ<><C8B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
POTION_START_ID = 3020,
POTION_END_ID = 3124,
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD> ID
OBLIVION_STONE = 9914,
// <20><>Ȱ<EFBFBD>ǵ<EFBFBD> ID
REBIRTH_STONE = 9201,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B0A1> ID
RENAME_WARRANT = 9200,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŸƮŶ ID
CAMP_KIT_ID = 7100,
SHORT_RANGE_ARMS_KIT_ID = 7101,
LONG_RANGE_ARMS_KIT_ID = 7102,
AIRSHIP_KIT_ID = 7103,
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
SIEGE_MATERIAL_ID = 9914,
// <20><>ö ID
SCRAPS = 2101
};
};
namespace Chemical
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD>
enum Result
{
S_SUCCESS = 0, // <20><><EFBFBD><EFBFBD>
F_WRONG_RECIPE = 2, // <20>ùٸ<C3B9> <20>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD> <20>ƴմϴ<D5B4>.
F_NOT_ENOUGH_ITEM = 3, // <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ּҷ<D6BC><D2B7><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>մϴ<D5B4>.
F_WRONG_RATE = 4 // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>մϴ<D5B4>. <20>ռ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ֽñ<D6BD> <20>ٶ<EFBFBD><D9B6>ϴ<EFBFBD>.
};
};
};
#endif

View File

@@ -0,0 +1,291 @@
#include "stdafx.h"
#include <Utility/Math/Math.h>
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> include<64><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
#include <Log/ServerLog.h>
#include "OldItemStructure.h"
#include "OldItemDataParser.h"
using namespace OldItem;
namespace OldItemDataParser
{
bool ReadString(char* szBuffer_Out, int nBufferLen, const char* szValue_In)
{
int nLength = _snprintf(szBuffer_Out, nBufferLen - 1, "%s", szValue_In);
if (0 <= nLength)
{
szBuffer_Out[nLength] = '\0';
return true;
}
szBuffer_Out[nBufferLen - 1] = '\0';
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. Data:%s", szValue_In);
return false;
}
inline bool ReadValue(unsigned char& cValue_Out, const char* szValue_In)
{
cValue_Out = static_cast<unsigned char>(atoi(szValue_In));
return true;
}
inline bool ReadValue(unsigned short& usValue_Out, const char* szValue_In)
{
usValue_Out = static_cast<unsigned short>(atoi(szValue_In));
return true;
}
inline bool ReadValue(unsigned long& dwValue_Out, const char* szValue_In)
{
dwValue_Out = static_cast<unsigned long>(atol(szValue_In));
return true;
}
inline bool ReadValue(float& fValue_Out, const char* szValue_In)
{
fValue_Out = static_cast<float>(atof(szValue_In));
return true;
}
bool ReadStringToTypeValue(unsigned char& cVaule_Out, const CTypeName* lpTypeArray,
const unsigned char nMaxType, const char* szValue_In)
{
for (unsigned char nCount = 0; nCount < nMaxType; ++nCount)
{
if (0 == strcmp(szValue_In, lpTypeArray[nCount].GetTypeName()))
{
cVaule_Out = lpTypeArray[nCount].GetTypeValue();
return true;
}
}
return false;
}
// <20><20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>
bool ReadID(OldItem::ItemInfo& itemInfo, const char* szValue)
{
itemInfo.m_usProtoTypeID = static_cast<unsigned short>(atoi(szValue));
if (0 == itemInfo.m_usProtoTypeID || 0xFFFF == itemInfo.m_usProtoTypeID)
{
ERRLOG1(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID<49><44> <20>̻<EFBFBD><CCBB>մϴ<D5B4>. 0<>̳<EFBFBD> 0xFFFF<46><46> <20><><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. ID:0x%08x",
itemInfo.m_usProtoTypeID);
return false;
}
return true;
}
bool ReadItemName(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_SpriteData.m_szName, SpriteData::MAX_NAME, szValue); }
bool ReadFieldModelName(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szFieldModelName, StringData::MAX_FIELD_MODEL_NAME, szValue); }
bool ReadAttachedModelName(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szEquipModelName, StringData::MAX_EQUIP_MODEL_NAME, szValue); }
bool ReadSpriteDDS(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_SpriteData.m_szSpriteName, SpriteData::MAX_SPRITE_NAME, szValue); }
bool ReadMinX(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMinX, szValue); }
bool ReadMinY(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMinY, szValue); }
bool ReadMaxX(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMaxX, szValue); }
bool ReadMaxY(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_SpriteData.m_nSpriteMaxY, szValue); }
bool ReadSizeX(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cXSize, szValue); }
bool ReadSizeY(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cYSize, szValue); }
bool ReadEffectSound(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szEffectSoundName, StringData::MAX_EFFECT_SOUND_NAME, szValue); }
bool ReadItemLevel(OldItem::ItemInfo& itemInfo, const char* szValue)
{
unsigned char cGrade = 0;
if (ReadStringToTypeValue(cGrade, OldItem::Grade::Grades, OldItem::Grade::MAX_ITEM_GRADE, szValue))
{
itemInfo.m_DetailData.m_ItemGrade = static_cast<OldItem::Grade::Type>(cGrade);
return true;
}
return false;
}
bool ReadItemType(OldItem::ItemInfo& itemInfo, const char* szValue)
{
return ReadStringToTypeValue(itemInfo.m_DetailData.m_cItemType,
OldItem::CItemType::GetInstance().GetItemTypeName(), OldItem::ItemType::MAX_ITEM_TYPE, szValue);
}
bool ReadTypeName(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szTypeName, StringData::MAX_TYPE_NAME, szValue); }
bool ReadPrice(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_dwPrice, szValue); }
bool ReadBlackPrice(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_dwBlackPrice, szValue); }
bool ReadMedalPrice(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_dwMedalPrice, szValue); }
bool ReadOptionLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cOptionLimit, szValue); }
bool ReadDurability(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cDefaultDurabilityOrStack, szValue); }
bool ReadMaxDurability(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cMaxDurabilityOrStack, szValue); }
bool ReadClassLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_dwClassLimit, szValue); }
bool ReadSkillLimitType(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_nSkillType, szValue); }
bool ReadSkillLimitLevel(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_cSkillLevel, szValue); }
bool ReadLevelLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_cLevelLimit, szValue); }
bool ReadSTRLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_nStatusLimit[StatusLimit::STR], szValue); }
bool ReadDEXLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_nStatusLimit[StatusLimit::DEX], szValue); }
bool ReadCONLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_nStatusLimit[StatusLimit::CON], szValue); }
bool ReadINTLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_nStatusLimit[StatusLimit::INT], szValue); }
bool ReadWISLimit(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseLimit.m_nStatusLimit[StatusLimit::WIS], szValue); }
bool ReadCraftExp(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_dwCraftExp, szValue); }
}
bool OldItemDataParser::SetDefaultData(ParseDataArray& parseDataArray)
{
parseDataArray.reserve(40);
parseDataArray.push_back(ParseData("ID", ReadID));
parseDataArray.push_back(ParseData("ItemName", ReadItemName));
parseDataArray.push_back(ParseData("FieldModelName", ReadFieldModelName));
parseDataArray.push_back(ParseData("AttachedModelName", ReadAttachedModelName));
parseDataArray.push_back(ParseData("SpriteDDS", ReadSpriteDDS));
parseDataArray.push_back(ParseData("MinX", ReadMinX));
parseDataArray.push_back(ParseData("MinY", ReadMinY));
parseDataArray.push_back(ParseData("MaxX", ReadMaxX));
parseDataArray.push_back(ParseData("MaxY", ReadMaxY));
parseDataArray.push_back(ParseData("SizeX", ReadSizeX));
parseDataArray.push_back(ParseData("SizeY", ReadSizeY));
parseDataArray.push_back(ParseData("EffectSound", ReadEffectSound));
parseDataArray.push_back(ParseData("ItemLevel", ReadItemLevel));
parseDataArray.push_back(ParseData("ItemType", ReadItemType));
parseDataArray.push_back(ParseData("TypeName", ReadTypeName));
parseDataArray.push_back(ParseData("Price", ReadPrice));
parseDataArray.push_back(ParseData("BlackPrice", ReadBlackPrice));
parseDataArray.push_back(ParseData("MedalPrice", ReadMedalPrice));
parseDataArray.push_back(ParseData("OptionLimit", ReadOptionLimit));
parseDataArray.push_back(ParseData("Durability", ReadDurability));
parseDataArray.push_back(ParseData("MaxDurability", ReadMaxDurability));
parseDataArray.push_back(ParseData("ClassLimit", ReadClassLimit));
parseDataArray.push_back(ParseData("SkillLimitType", ReadSkillLimitType));
parseDataArray.push_back(ParseData("SkillLimitLevel", ReadSkillLimitLevel));
parseDataArray.push_back(ParseData("LevelLimit", ReadLevelLimit));
parseDataArray.push_back(ParseData("STRLimit", ReadSTRLimit));
parseDataArray.push_back(ParseData("DEXLimit", ReadDEXLimit));
parseDataArray.push_back(ParseData("CONLimit", ReadCONLimit));
parseDataArray.push_back(ParseData("INTLimit", ReadINTLimit));
parseDataArray.push_back(ParseData("WISLimit", ReadWISLimit));
parseDataArray.push_back(ParseData("CraftExp", ReadCraftExp));
return true;
}
namespace OldItemDataParser
{
bool ReadCriticalType(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::CRITICAL_TYPE], szValue); }
bool ReadCriticalPercentage(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::CRITICAL_PERCENTAGE], szValue); }
bool ReadMinDamage(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::MIN_DAMAGE], szValue); }
bool ReadMaxDamage(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::MAX_DAMAGE], szValue); }
bool ReadDRC(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::DRC], szValue); }
bool ReadOffenceRevision(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::OFFENCE_REVISION], szValue); }
bool ReadDefence(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::DEFENCE], szValue); }
bool ReadDefenceRevision(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::DEFENCE_REVISION], szValue); }
bool ReadResistance(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::MAGIC_RESISTANCE], szValue); }
bool ReadBlockingPercentage(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::BLOCKING_PERCENTAGE], szValue); }
bool ReadAttackSpeed(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::ATTACK_SPEED], szValue); }
bool ReadMoveSpeed(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::MOVE_SPEED], szValue); }
bool ReadAttackRange(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::ATTACK_RANGE], szValue); }
bool ReadRangedAttack(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::RANGE_ATTACK_DISTANCE], szValue); }
bool ReadHpMaxPlus(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::MAX_HP], szValue); }
bool ReadMpMaxPlus(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::MAX_MP], szValue); }
bool ReadHPRegen(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::HP_REGEN_AMOUNT], szValue); }
bool ReadMPRegen(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::MP_REGEN_AMOUNT], szValue); }
bool ReadFireAttribute(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::FIRE_ATTACK], szValue); }
bool ReadLightingAttribute(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::LIGHTNING_ATTACK], szValue); }
bool ReadColdAttribute(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::COLD_ATTACK], szValue); }
bool ReadDrainAttribute(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::DRAIN_ATTACK], szValue); }
bool ReadPoisonAttribute(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::POISON_ATTACK], szValue); }
bool ReadFireResistance(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::FIRE_RESISTANCE], szValue); }
bool ReadLightningResistance(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::LIGHTNING_RESISTANCE], szValue); }
bool ReadColdResistance(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::COLD_RESISTANCE], szValue); }
bool ReadDrainResistance(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::DRAIN_RESISTANCE], szValue); }
bool ReadPoisonResistance(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::POISON_RESISTANCE], szValue); }
bool ReadSTRAdd(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::ADD_STR], szValue); }
bool ReadDEXAdd(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::ADD_DEX], szValue); }
bool ReadCONAdd(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::ADD_CON], szValue); }
bool ReadINTAdd(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::ADD_INT], szValue); }
bool ReadWISAdd(OldItem::ItemInfo& itemInfo, const char* szValue) { ++itemInfo.m_EquipAttribute.m_nAttibuteNum; return ReadValue(itemInfo.m_EquipAttribute.m_usAttributeValue[OldItem::Attribute::ADD_WIS], szValue); }
bool ReadMaterialValue(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cMaterialType, szValue); }
bool ReadMaxSocketNum(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_DetailData.m_cMaxSocketNum, szValue); }
}
bool OldItemDataParser::SetEquipData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("CriticalType", ReadCriticalType));
parseDataArray.push_back(ParseData("CriticalPercentage", ReadCriticalPercentage));
parseDataArray.push_back(ParseData("MinDamage", ReadMinDamage));
parseDataArray.push_back(ParseData("MaxDamage", ReadMaxDamage));
parseDataArray.push_back(ParseData("DRC", ReadDRC));
parseDataArray.push_back(ParseData("OffenceRevision", ReadOffenceRevision));
parseDataArray.push_back(ParseData("Defence", ReadDefence));
parseDataArray.push_back(ParseData("DefenceRevision", ReadDefenceRevision));
parseDataArray.push_back(ParseData("Resistance", ReadResistance));
parseDataArray.push_back(ParseData("BlockingPercentage", ReadBlockingPercentage));
parseDataArray.push_back(ParseData("AttackSpeed", ReadAttackSpeed));
parseDataArray.push_back(ParseData("MoveSpeed", ReadMoveSpeed));
parseDataArray.push_back(ParseData("AttackRange", ReadAttackRange));
parseDataArray.push_back(ParseData("LongRangeAttack", ReadRangedAttack));
parseDataArray.push_back(ParseData("HpMaxPlus", ReadHpMaxPlus));
parseDataArray.push_back(ParseData("MpMaxPlus", ReadMpMaxPlus));
parseDataArray.push_back(ParseData("HPRegen", ReadHPRegen));
parseDataArray.push_back(ParseData("MPRegen", ReadMPRegen));
parseDataArray.push_back(ParseData("FireAttribute", ReadFireAttribute));
parseDataArray.push_back(ParseData("LightingAttribute", ReadLightingAttribute));
parseDataArray.push_back(ParseData("ColdAttribute", ReadColdAttribute));
parseDataArray.push_back(ParseData("DrainAttribute", ReadDrainAttribute));
parseDataArray.push_back(ParseData("PoisonAttribute", ReadPoisonAttribute));
parseDataArray.push_back(ParseData("FireResistance", ReadFireResistance));
parseDataArray.push_back(ParseData("LightningResistance", ReadLightningResistance));
parseDataArray.push_back(ParseData("ColdResistance", ReadColdResistance));
parseDataArray.push_back(ParseData("DrainResistance", ReadDrainResistance));
parseDataArray.push_back(ParseData("PoisonResistance", ReadPoisonResistance));
parseDataArray.push_back(ParseData("STRAdd", ReadSTRAdd));
parseDataArray.push_back(ParseData("DEXAdd", ReadDEXAdd));
parseDataArray.push_back(ParseData("CONAdd", ReadCONAdd));
parseDataArray.push_back(ParseData("INTAdd", ReadINTAdd));
parseDataArray.push_back(ParseData("WISAdd", ReadWISAdd));
parseDataArray.push_back(ParseData("MaterialValue", ReadMaterialValue));
parseDataArray.push_back(ParseData("MaxSocketNum", ReadMaxSocketNum));
return true;
}
namespace OldItemDataParser
{
bool ReadSkill_ID(OldItem::ItemInfo& itemInfo, const char* szValue) { itemInfo.m_UseItemInfo.m_usSkill_ID = Math::Convert::Atos(szValue); return true; }
bool ReadSkill_Level(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_usSkill_LockCount, szValue); }
bool ReadZone(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_cZone, szValue); }
bool ReadPositionX(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_Pos.m_fPointX, szValue); }
bool ReadPositionY(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_Pos.m_fPointY, szValue); }
bool ReadPositionZ(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_Pos.m_fPointZ, szValue); }
bool ReadAmount(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadValue(itemInfo.m_UseItemInfo.m_dwAmount, szValue); }
bool ReadItemDescribe(OldItem::ItemInfo& itemInfo, const char* szValue) { return ReadString(itemInfo.m_StringData.m_szItemDescribe, OldItem::StringData::MAX_ITEM_DESCRIBE, szValue); }
}
bool OldItemDataParser::SetUseItemData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("CriticalType", ReadSkill_ID));
parseDataArray.push_back(ParseData("CriticalPercentage", ReadSkill_Level));
parseDataArray.push_back(ParseData("MinDamage", ReadZone));
parseDataArray.push_back(ParseData("MaxDamage", ReadPositionX));
parseDataArray.push_back(ParseData("DRC", ReadPositionY));
parseDataArray.push_back(ParseData("OffenceRevision", ReadPositionZ));
parseDataArray.push_back(ParseData("Defence", ReadAmount));
parseDataArray.push_back(ParseData("DefenceRevision", ReadItemDescribe));
return true;
}
bool OldItemDataParser::SetEtcItemData(ParseDataArray& parseDataArray)
{
parseDataArray.push_back(ParseData("CriticalType", ReadItemDescribe));
return true;
}

View File

@@ -0,0 +1,34 @@
#ifndef _OLD_ITEM_DATA_PARSER_H_
#define _OLD_ITEM_DATA_PARSER_H_
#include <vector>
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
namespace OldItem
{
struct ItemInfo;
};
namespace OldItemDataParser
{
struct ParseData
{
typedef bool(*ParseFunc) (OldItem::ItemInfo& itemInfo, const char* szValue);
const char* m_szColumnName;
ParseFunc m_fnParseFunc;
ParseData(const char* szColumnName, ParseFunc fnParseFunc)
: m_szColumnName(szColumnName), m_fnParseFunc(fnParseFunc) { }
};
typedef std::vector<ParseData> ParseDataArray;
bool SetDefaultData(ParseDataArray& parseDataArray);
bool SetEquipData(ParseDataArray& parseDataArray);
bool SetUseItemData(ParseDataArray& parseDataArray);
bool SetEtcItemData(ParseDataArray& parseDataArray);
};
#endif

View File

@@ -0,0 +1,679 @@
#include "stdafx.h"
#include <memory>
#include <algorithm>
#include <functional>
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̹Ƿ<CCB9> include<64><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
#include <Log/ServerLog.h>
#include <Network/XORCrypt/XORCrypt.h>
#include <Network/Packet/PacketStruct/ServerInfo.h>
#include <Utility/DelimitedFile.h>
#include <Utility/TokenlizedFile.h>
#include <Utility/Resource/EnsureCleanup.h>
#include <Utility/Compress/MiniLZO/MiniLZOWrapper.h>
#include <Utility/Setup/ServerSetup.h>
#include "OldItemDataParser.h"
#include "OldItemMgr.h"
#define DECODE_HEADER(Start_In, Length_In, PageVer_In, PageNum_In) CXORCrypt::GetInstance().DecodeHeader((Start_In),(Length_In),(PageVer_In),(PageNum_In))
#define ENCODE_HEADER(Start_In, Length_In, PageVer_In, PageNum_In) CXORCrypt::GetInstance().EncodeHeader((Start_In),(Length_In),(PageVer_In),(PageNum_In))
#define COMPRESS(In, In_len, Out, Out_len) CMiniLZO::Compress((In), (In_len), (Out), (Out_len))
#define DECOMPRESS(In, In_len, Out, Out_len) CMiniLZO::Decompress((In), (In_len), (Out), (Out_len))
using namespace OldItem;
const char* CItemMgr::ms_szItemScriptFileName = "./Script/Game/ItemScript.txt";
const char* CItemMgr::ms_szBGItemScriptFileName = "./Script/Game/BGItemScript.txt";
const char* CItemMgr::ms_szChemicalScriptFileName = "./Script/Game/Chemical.txt";
class CParseDelimitedData
{
public:
CParseDelimitedData(CTokenlizedFile& TokenlizedFile) : m_TokenlizedFile(TokenlizedFile) { }
bool operator() (OldItemDataParser::ParseDataArray& ParserArray, OldItem::ItemInfo& itemInfo)
{
for (OldItemDataParser::ParseDataArray::iterator itr = ParserArray.begin();
itr != ParserArray.end(); ++itr)
{
const char* szValue = m_TokenlizedFile.GetStringValue(itr->m_szColumnName);
if (NULL == szValue)
{
ERRLOG2(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. Line:%d, ColumnName:%d",
m_TokenlizedFile.GetCurrentLine(), itr->m_szColumnName);
return false;
}
if (false == itr->m_fnParseFunc(itemInfo, szValue))
{
ERRLOG2(g_Log, "<EFBFBD>˸<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ƴմϴ<D5B4>. Line:%d, ColumnName:%d",
m_TokenlizedFile.GetCurrentLine(), itr->m_szColumnName);
return false;
}
}
return true;
}
private:
CTokenlizedFile& m_TokenlizedFile;
};
OldItem::CItemMgr& OldItem::CItemMgr::GetInstance()
{
static CItemMgr itemMgr;
return itemMgr;
}
CItemMgr::CItemMgr()
: m_ItemInfoArray(NULL), m_nItemNum(0), m_ChemicalArray(NULL), m_nChemicalNum(0)
{
}
CItemMgr::~CItemMgr()
{
DestoryItemInfo();
DestoryChemical();
}
void CItemMgr::DestoryItemInfo(void)
{
if (NULL != m_ItemInfoArray)
{
delete [] m_ItemInfoArray;
m_ItemInfoArray = NULL;
}
m_nItemNum = 0;
}
void CItemMgr::DestoryChemical(void)
{
if (NULL != m_ChemicalArray)
{
delete [] m_ChemicalArray;
m_ChemicalArray = NULL;
}
m_nChemicalNum = 0;
}
bool CItemMgr::LoadItemProtoType(const char* szFileName)
{
DestoryItemInfo();
ItemInfo itemInfo;
CTokenlizedFile TokenlizedFile; // <20><>ü <20>Ҹ<EFBFBD><D2B8><EFBFBD>, <20>ڵ<EFBFBD> Close.
char szItemScriptName[MAX_PATH];
if (SERVER_ID::GROUP_BATTLE_SERVER == CServerSetup::GetInstance().GetServerGroup())
{
strncpy(szItemScriptName, ms_szBGItemScriptFileName, MAX_PATH);
}
else
{
strncpy(szItemScriptName, ms_szItemScriptFileName, MAX_PATH);
}
if (false == TokenlizedFile.Open((NULL != szFileName) ? szFileName : szItemScriptName))
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.");
return false;
}
if (false == TokenlizedFile.ReadColumn())
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20>÷<EFBFBD><C3B7><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.");
return false;
}
OldItemDataParser::ParseDataArray DefaultItemData;
OldItemDataParser::ParseDataArray EquipItemData;
OldItemDataParser::ParseDataArray UseItemData;
OldItemDataParser::ParseDataArray EtcItemData;
OldItemDataParser::SetDefaultData(DefaultItemData);
OldItemDataParser::SetEquipData(EquipItemData);
OldItemDataParser::SetUseItemData(UseItemData);
OldItemDataParser::SetEtcItemData(EtcItemData);
CItemType& ItemType = CItemType::GetInstance();
std::vector<ItemInfo> ItemInfoVector;
CParseDelimitedData ParseData(TokenlizedFile);
while (TokenlizedFile.ReadLine())
{
itemInfo.Initialize();
if (false == ParseData(DefaultItemData, itemInfo))
{
return false;
}
if (ItemType.IsCorrectItemType(CItemType::EQUIP_TYPE,
itemInfo.m_DetailData.m_cItemType))
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (false == ParseData(EquipItemData, itemInfo))
{
return false;
}
ItemType.SetEquipTypeFlags(itemInfo);
}
else if (ItemType.IsCorrectItemType(CItemType::USE_ITEM_TYPE,
itemInfo.m_DetailData.m_cItemType))
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (false == ParseData(UseItemData, itemInfo))
{
return false;
}
ItemType.SetUseItemTypeFlags(itemInfo);
}
else
{
// <20><>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if (false == ParseData(EtcItemData, itemInfo))
{
return false;
}
ItemType.SetEtcItemTypeFlags(itemInfo);
}
ItemInfoVector.push_back(itemInfo);
}
if (false == TokenlizedFile.IsEOF())
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.");
return false;
}
std::sort(ItemInfoVector.begin(), ItemInfoVector.end());
for (std::vector<ItemInfo>::iterator itr = ItemInfoVector.begin();
itr != ItemInfoVector.end() - 1; ++itr)
{
if (itr->m_usProtoTypeID == (itr+1)->m_usProtoTypeID)
{
ERRLOG1(g_Log, "<EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID<49><44> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. <20><><EFBFBD><EFBFBD>ID:%d", itr->m_usProtoTypeID);
return false;
}
};
m_nItemNum = ItemInfoVector.size();
m_ItemInfoArray = new ItemInfo[m_nItemNum];
if (NULL == m_ItemInfoArray)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>޸𸮰<DEB8> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.");
return false;
}
std::copy(ItemInfoVector.begin(), ItemInfoVector.end(), m_ItemInfoArray);
return true;
}
const ItemInfo* CItemMgr::GetItemInfo(unsigned short usProtoTypeID)
{
ItemInfo* lpFirst = m_ItemInfoArray;
ItemInfo* lpLast = m_ItemInfoArray + m_nItemNum;
ItemInfo* lpMid = NULL;
size_t nCount = m_nItemNum;
size_t nCount2 = 0;
for (; 0 < nCount; )
{
nCount2 = nCount / 2;
lpMid = lpFirst + nCount2;
if (lpMid->m_usProtoTypeID < usProtoTypeID)
{
lpFirst = ++lpMid, nCount -= nCount2 + 1;
}
else
{
nCount = nCount2;
}
}
return (lpFirst != lpLast && !(usProtoTypeID < lpFirst->m_usProtoTypeID)) ? lpFirst : NULL;
}
const ItemInfo* CItemMgr::GetItemInfoFromItemName(const char* szItemName)
{
ItemInfo* lpFirst = m_ItemInfoArray;
ItemInfo* lpLast = m_ItemInfoArray + m_nItemNum;
for (; lpFirst != lpLast; ++lpFirst)
{
if (0 == strcmp(lpFirst->m_SpriteData.m_szName, szItemName))
{
return lpFirst;
}
}
return NULL;
}
const ItemInfo* CItemMgr::GetItemInfoFromEquipName(const char* szEquipName)
{
ItemInfo* lpFirst = m_ItemInfoArray;
ItemInfo* lpLast = m_ItemInfoArray + m_nItemNum;
for (; lpFirst != lpLast; ++lpFirst)
{
if (0 == strcmp(lpFirst->m_StringData.m_szEquipModelName, szEquipName))
{
return lpFirst;
}
}
return NULL;
}
const char* CItemMgr::GetEquipName(const unsigned short usItemProtoTypeID)
{
const ItemInfo* pItemInfo = GetItemInfo(usItemProtoTypeID);
if(pItemInfo)
{
return pItemInfo->m_StringData.m_szEquipModelName;
}
return NULL;
}
const unsigned short CItemMgr::GetItemIDFromSkillID(const unsigned short usSkill_ID, const unsigned short unSkill_LockCount)
{
ItemInfo* lpFirst = m_ItemInfoArray;
ItemInfo* lpLast = m_ItemInfoArray + m_nItemNum;
for (; lpFirst != lpLast; ++lpFirst)
{
if (lpFirst->m_UseItemInfo.m_usSkill_ID == usSkill_ID &&
lpFirst->m_UseItemInfo.m_usSkill_LockCount == unSkill_LockCount)
{
return lpFirst->m_usProtoTypeID;
}
}
return 0;
}
bool CItemMgr::LoadItemProtoTypeBinary(const char* szFileNameBinary)
{
if (NULL == szFileNameBinary) { return false; }
HANDLE hFile = CreateFile(szFileNameBinary, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) { return false; }
CEnsureCloseHandle EnsureCloseHandle(hFile);
unsigned long dwRead = 0;
unsigned long dwFileHighSize = 0;
unsigned long dwFileSize = GetFileSize(hFile, &dwFileHighSize);
char* lpAllocated = new char[dwFileSize];
CEnsureDeleteArray<char> EnsureFileInfo(lpAllocated);
if (false == ReadFile(hFile, lpAllocated, dwFileSize, &dwRead, NULL))
{
return false;
}
unsigned long dwHeaderSize = sizeof(unsigned long) + *reinterpret_cast<unsigned long *>(lpAllocated) + sizeof(unsigned long);
unsigned long dwDecompressedSize = *reinterpret_cast<unsigned long *>(lpAllocated + dwHeaderSize - sizeof(unsigned long));
DestoryItemInfo();
m_nItemNum = dwDecompressedSize / sizeof(ItemInfo);
m_ItemInfoArray = new ItemInfo[m_nItemNum];
if (NULL == m_ItemInfoArray)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>޸𸮰<DEB8> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.");
return false;
}
DECOMPRESS(lpAllocated + dwHeaderSize, dwFileSize - dwHeaderSize,
reinterpret_cast<char *>(m_ItemInfoArray), &dwDecompressedSize);
DECODE_HEADER(reinterpret_cast<char *>(m_ItemInfoArray), dwDecompressedSize, 0, 2);
return true;
}
bool CItemMgr::SaveItemProtoTypeBinary(const char* szFileNameBinary, const char* szTrashFile)
{
if (NULL == szFileNameBinary || NULL == szTrashFile) { return false; }
HANDLE hFile = CreateFile(szFileNameBinary, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) { return false; }
CEnsureCloseHandle EnsureCloseSaveHandle(hFile);
unsigned long nItemInfoSize = static_cast<unsigned long>(sizeof(ItemInfo) * m_nItemNum);
unsigned long nCompressedInfoSize = nItemInfoSize;
char* lpItemInfo = new char[nItemInfoSize];
char* lpCompressedInfo = new char[nItemInfoSize];
CEnsureDeleteArray<char> EnsureDeleteItemInfo(lpItemInfo);
CEnsureDeleteArray<char> EnsureDeleteCompressedInfo(lpCompressedInfo);
if (NULL == lpItemInfo || NULL == lpCompressedInfo)
{
return false;
}
memcpy(lpItemInfo, m_ItemInfoArray, nItemInfoSize);
ENCODE_HEADER(lpItemInfo, nItemInfoSize, 0, 2);
COMPRESS(lpItemInfo, nItemInfoSize, lpCompressedInfo, &nCompressedInfoSize);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>) <20>ڷ<EFBFBD>
HANDLE hTrashFile = CreateFile(szTrashFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hTrashFile == INVALID_HANDLE_VALUE) { return false; }
CEnsureCloseHandle EnsureCloseTrashHandle(hTrashFile);
unsigned long dwRead = 0;
unsigned long dwWritten = 0;
unsigned long dwFileHighSize = 0;
unsigned long dwTrashFileSize = GetFileSize(hTrashFile, &dwFileHighSize);
char* lpTrashFileData = new char[dwTrashFileSize];
CEnsureDeleteArray<char> EnsureDeleteTrashFile(lpTrashFileData);
if (false == ReadFile(hTrashFile, lpTrashFileData, dwTrashFileSize, &dwRead, NULL))
{
return false;
}
// Trash File<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WriteFile(hFile, &dwTrashFileSize, sizeof(unsigned long), &dwWritten, 0); // Trash <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
WriteFile(hFile, lpTrashFileData, dwTrashFileSize, &dwWritten, 0); // Trash <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20>ùٸ<C3B9> <20>ڷ<EFBFBD>
WriteFile(hFile, &nItemInfoSize, sizeof(unsigned long), &dwWritten, 0); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
WriteFile(hFile, lpCompressedInfo, nCompressedInfoSize, &dwWritten, 0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return true;
}
bool CItemMgr::LoadItemChemical(const char* szFileName)
{
const int ITEM_NAME_LEN = 32;
char szBuffer[ITEM_NAME_LEN];
int nLineCount = 0;
CDelimitedFile DelimitedFile; // <20><>ü <20>Ҹ<EFBFBD><D2B8><EFBFBD>, <20>ڵ<EFBFBD> Close.
// <20><>ũ<EFBFBD>ο<EFBFBD> <20>α<EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>.
// <20><>ũ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD> \<5C>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
// ( '<27>̽<EFBFBD><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ϴ<EFBFBD>' <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD> )
#define READ_DATA(ColumnName, Argument) \
if (false == DelimitedFile.ReadData(Argument)) \
{ \
ERRLOG2(g_Log, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64> %s<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>!", nLineCount, #ColumnName); \
return false; \
}
#define READ_STRING(ColumnName, Buffer, BufferSize) \
if (false == DelimitedFile.ReadString(Buffer, BufferSize)) \
{\
ERRLOG2(g_Log, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20>б<EFBFBD> <20><><EFBFBD><EFBFBD> : %d<><64> %s<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>!", nLineCount, #ColumnName);\
return false;\
}
if (false == DelimitedFile.Open(szFileName ? szFileName : ms_szChemicalScriptFileName, 2))
{
ERRLOG1(g_Log, "%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", szFileName ? szFileName : ms_szChemicalScriptFileName);
return false;
}
std::vector<ChemicalInfo> ChemicalVector;
ChemicalInfo tempChemical;
while (DelimitedFile.ReadLine())
{
++nLineCount;
READ_STRING("PickkingItem Name", szBuffer, ITEM_NAME_LEN);
READ_DATA("PickkingItem ID", tempChemical.m_wPickkingItemID);
READ_DATA("PickkingItem Num", tempChemical.m_cPickkingItemNum);
READ_STRING("TargetItem Name", szBuffer, ITEM_NAME_LEN);
READ_DATA("TargetItem ID", tempChemical.m_wTargetItemID);
READ_DATA("TargetItem Num", tempChemical.m_cTargetItemNum);
READ_STRING("ResultItem Name", szBuffer, ITEM_NAME_LEN);
READ_DATA("ResultItem ID", tempChemical.m_wResultItemID);
READ_DATA("ResultItem Num", tempChemical.m_cResultItemNum);
const ItemInfo* lpPickkingItem = GetItemInfo(tempChemical.m_wPickkingItemID);
const ItemInfo* lpTargetItem = GetItemInfo(tempChemical.m_wTargetItemID);
const ItemInfo* lpResultItem = GetItemInfo(tempChemical.m_wResultItemID);
if (NULL == lpPickkingItem || NULL == lpTargetItem || NULL == lpResultItem)
{
ERRLOG3(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>. "
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : %d, <20>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : %d, <20>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : %d",
tempChemical.m_wPickkingItemID, tempChemical.m_wTargetItemID, tempChemical.m_wResultItemID);
return false;
}
if (lpTargetItem->m_DetailData.m_cXSize < lpResultItem->m_DetailData.m_cXSize ||
lpTargetItem->m_DetailData.m_cYSize < lpResultItem->m_DetailData.m_cYSize)
{
ERRLOG6(g_Log, "<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۽<EFBFBD><DBBD>ϴ<EFBFBD>. "
"<EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : %d(%dx%d), <20>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : %d(%dx%d)",
tempChemical.m_wTargetItemID, lpTargetItem->m_DetailData.m_cXSize, lpTargetItem->m_DetailData.m_cYSize,
tempChemical.m_wResultItemID, lpResultItem->m_DetailData.m_cXSize, lpResultItem->m_DetailData.m_cYSize);
return false;
}
ChemicalVector.push_back(tempChemical);
}
std::sort(ChemicalVector.begin(), ChemicalVector.end());
m_nChemicalNum = ChemicalVector.size();
m_ChemicalArray = new ChemicalInfo[m_nChemicalNum];
if (NULL == m_ChemicalArray)
{
ERRLOG0(g_Log, "<EFBFBD>޸<EFBFBD><EFBFBD><EFBFBD> <20>Ҵ翡 <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>.");
return false;
}
std::copy(ChemicalVector.begin(), ChemicalVector.end(), m_ChemicalArray);
return true;
}
bool CItemMgr::LoadItemChemicalBinary(const char* szFileNameBinary)
{
HANDLE hFile = CreateFile((0 == szFileNameBinary) ? ms_szChemicalScriptFileName : szFileNameBinary,
GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) { return false; }
CEnsureCloseHandle EnsureCloseHandle(hFile);
unsigned long dwRead = 0;
unsigned long dwFileHighSize = 0;
unsigned long dwFileSize = GetFileSize(hFile, &dwFileHighSize);
char* lpAllocated = new char[dwFileSize];
CEnsureDeleteArray<char> EnsureFileInfo(lpAllocated);
if (false == ReadFile(hFile, lpAllocated, dwFileSize, &dwRead, NULL))
{
return false;
}
unsigned long dwHeaderSize = sizeof(unsigned long) + *reinterpret_cast<unsigned long *>(lpAllocated) + sizeof(unsigned long);
unsigned long dwDecompressedSize = *reinterpret_cast<unsigned long *>(lpAllocated + dwHeaderSize - sizeof(unsigned long));
DestoryChemical();
m_nChemicalNum = dwDecompressedSize / sizeof(ChemicalInfo);
m_ChemicalArray = new ChemicalInfo[m_nChemicalNum];
if (NULL == m_ChemicalArray)
{
ERRLOG0(g_Log, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>޸𸮰<DEB8> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.");
return false;
}
DECOMPRESS(lpAllocated + dwHeaderSize, dwFileSize - dwHeaderSize,
reinterpret_cast<char *>(m_ChemicalArray), &dwDecompressedSize);
DECODE_HEADER(reinterpret_cast<char *>(m_ChemicalArray), dwDecompressedSize, 0, 2);
return true;
}
bool CItemMgr::SaveItemChemicalBinary(const char* szFileNameBinary, const char* szTrashFile)
{
HANDLE hFile = CreateFile((0 == szFileNameBinary) ? ms_szChemicalScriptFileName : szFileNameBinary,
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) { return false; }
CEnsureCloseHandle EnsureCloseSaveHandle(hFile);
unsigned long nChemicalInfoSize = static_cast<unsigned long>(sizeof(ChemicalInfo) * m_nChemicalNum);
unsigned long nCompressedInfoSize = nChemicalInfoSize;
char* lpChemicalInfo = new char[nChemicalInfoSize];
char* lpCompressedInfo = new char[nChemicalInfoSize];
CEnsureDeleteArray<char> EnsureDeleteItemInfo(lpChemicalInfo);
CEnsureDeleteArray<char> EnsureDeleteCompressedInfo(lpCompressedInfo);
if (NULL == lpChemicalInfo || NULL == lpCompressedInfo)
{
return false;
}
memcpy(lpChemicalInfo, m_ChemicalArray, nChemicalInfoSize);
ENCODE_HEADER(lpChemicalInfo, nChemicalInfoSize, 0, 2);
COMPRESS(lpChemicalInfo, nChemicalInfoSize, lpCompressedInfo, &nCompressedInfoSize);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>) <20>ڷ<EFBFBD>
HANDLE hTrashFile = CreateFile(szTrashFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hTrashFile == INVALID_HANDLE_VALUE) { return false; }
CEnsureCloseHandle EnsureCloseTrashHandle(hTrashFile);
unsigned long dwRead = 0;
unsigned long dwWritten = 0;
unsigned long dwFileHighSize = 0;
unsigned long dwTrashFileSize = GetFileSize(hTrashFile, &dwFileHighSize);
char* lpTrashFileData = new char[dwTrashFileSize];
CEnsureDeleteArray<char> EnsureDeleteTrashFile(lpTrashFileData);
if (false == ReadFile(hTrashFile, lpTrashFileData, dwTrashFileSize, &dwRead, NULL))
{
return false;
}
// Trash File<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WriteFile(hFile, &dwTrashFileSize, sizeof(unsigned long), &dwWritten, 0); // Trash <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
WriteFile(hFile, lpTrashFileData, dwTrashFileSize, &dwWritten, 0); // Trash <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20>ùٸ<C3B9> <20>ڷ<EFBFBD>
WriteFile(hFile, &nChemicalInfoSize, sizeof(unsigned long), &dwWritten, 0); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
WriteFile(hFile, lpCompressedInfo, nCompressedInfoSize, &dwWritten, 0); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return true;
}
class CFindChemical : public std::unary_function<ChemicalInfo, bool>
{
public:
explicit CFindChemical(unsigned short wPickkingItemID, unsigned short wTargetItemID)
: m_wPickkingItemID(wPickkingItemID), m_wTargetItemID(wTargetItemID)
{ }
bool operator() (ChemicalInfo& chemical)
{
return (m_wPickkingItemID == chemical.m_wPickkingItemID &&
m_wTargetItemID == chemical.m_wTargetItemID);
}
private:
const unsigned short m_wPickkingItemID;
const unsigned short m_wTargetItemID;
};
unsigned char CItemMgr::GetChemicalResult(ChemicalInfo& chemical)
{
CFindChemical findChemical(chemical.m_wPickkingItemID, chemical.m_wTargetItemID);
const ChemicalInfo* lpChemicalRecipe =
std::find_if(&m_ChemicalArray[0], &m_ChemicalArray[m_nChemicalNum], findChemical);
if (&m_ChemicalArray[m_nChemicalNum] == lpChemicalRecipe)
{
return Chemical::F_WRONG_RECIPE;
}
if (lpChemicalRecipe->m_cPickkingItemNum > chemical.m_cPickkingItemNum ||
lpChemicalRecipe->m_cTargetItemNum > chemical.m_cTargetItemNum)
{
return Chemical::F_NOT_ENOUGH_ITEM;
}
if (0 != chemical.m_cTargetItemNum % lpChemicalRecipe->m_cTargetItemNum ||
0 != chemical.m_cPickkingItemNum % lpChemicalRecipe->m_cPickkingItemNum)
{
return Chemical::F_WRONG_RATE;
}
chemical.m_wResultItemID = lpChemicalRecipe->m_wResultItemID;
unsigned char cPickkingItemUse = chemical.m_cPickkingItemNum / lpChemicalRecipe->m_cPickkingItemNum;
unsigned char cTargetItemUse = chemical.m_cTargetItemNum / lpChemicalRecipe->m_cTargetItemNum;
if (cPickkingItemUse >= cTargetItemUse)
{
chemical.m_cPickkingItemNum = chemical.m_cPickkingItemNum - cTargetItemUse * lpChemicalRecipe->m_cPickkingItemNum;
chemical.m_cTargetItemNum = 0;
chemical.m_cResultItemNum = cTargetItemUse * lpChemicalRecipe->m_cResultItemNum;
}
else
{
chemical.m_cPickkingItemNum = 0;
chemical.m_cTargetItemNum = chemical.m_cTargetItemNum - cPickkingItemUse * lpChemicalRecipe->m_cTargetItemNum;
chemical.m_cResultItemNum = cPickkingItemUse * lpChemicalRecipe->m_cResultItemNum;
}
return Chemical::S_SUCCESS;
}

View File

@@ -0,0 +1,66 @@
#ifndef _OLD_CITEM_MGR_H_
#define _OLD_CITEM_MGR_H_
#include "OldItemStructure.h"
// ----------------------------------------------------------------------------
// class : CItemMgr ( must use in single thread )
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE> <20>ε<EFBFBD><CEB5>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
namespace OldItem
{
class CItemMgr
{
public:
static CItemMgr& GetInstance();
~CItemMgr();
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ (ItemScript.txt)
bool LoadItemProtoType(const char* szFileName = NULL);
bool LoadItemProtoTypeBinary(const char* szFileNameBinary = NULL);
bool SaveItemProtoTypeBinary(const char* szFileNameBinary = NULL, const char* szTrashFile = NULL);
const OldItem::ItemInfo* GetItemInfo(unsigned short usProtoTypeID);
const OldItem::ItemInfo* GetItemInfoFromItemName(const char* szItemName);
const OldItem::ItemInfo* GetItemInfoFromEquipName(const char* szEquipName);
const char* GetEquipName(const unsigned short usItemProtoTypeID);
const unsigned short GetItemIDFromSkillID(const unsigned short usSkill_ID, const unsigned short unSkill_LockCount);
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ռ<EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ (ChemicalInfo.txt)
bool LoadItemChemical(const char* szFileName = NULL);
bool LoadItemChemicalBinary(const char* szFileNameBinary = NULL);
bool SaveItemChemicalBinary(const char* szFileNameBinary = NULL, const char* szTrashFile = NULL);
unsigned char GetChemicalResult(ChemicalInfo& chemical);
private:
CItemMgr();
void DestoryItemInfo(void);
void DestoryChemical(void);
static const char* ms_szItemScriptFileName;
static const char* ms_szBGItemScriptFileName;
static const char* ms_szChemicalScriptFileName;
size_t m_nItemNum;
ItemInfo* m_ItemInfoArray;
size_t m_nChemicalNum;
ChemicalInfo* m_ChemicalArray;
};
}
#endif

View File

@@ -0,0 +1,130 @@
#include "stdafx.h"
#include <Utility/Math/Math.h>
#include <Log/ServerLog.h>
#include <algorithm>
#include "OldItemStructure.h"
using namespace OldItem;
void OldItem::ItemData::DumpInfo(unsigned long dwCID, const char* szExtraString) const
{
const int MIN_BUFFER = 32;
char szItemUID[MIN_BUFFER];
Math::Convert::Hex64ToStr(szItemUID, m_dwUID);
ERRLOG8(g_Log, "CID:0x%08x / ItemUID:%s / ProtoTypeID:%d / ItemPos(%d, 0x%04x) / ItemSize:%d / NumOrDurability:%d %s",
dwCID, szItemUID, m_usProtoTypeID, m_ItemPos.m_cPos, m_ItemPos.m_cIndex,
m_cItemSize, m_cNumOrDurability, szExtraString);
}
OldItem::SpriteData::SpriteData() { Initialize(); }
void OldItem::SpriteData::Initialize()
{
memset(m_szName, 0, MAX_NAME);
memset(m_szSpriteName, 0, MAX_SPRITE_NAME);
m_nSpriteMinX = m_nSpriteMinY = m_nSpriteMaxX = m_nSpriteMaxY = 0;
}
OldItem::StringData::StringData() { Initialize(); }
void OldItem::StringData::Initialize()
{
memset(m_szFieldModelName, 0, MAX_FIELD_MODEL_NAME);
memset(m_szEquipModelName, 0, MAX_EQUIP_MODEL_NAME);
memset(m_szEffectSoundName, 0, MAX_EFFECT_SOUND_NAME);
memset(m_szTypeName, 0, MAX_TYPE_NAME);
memset(m_szItemDescribe, 0, MAX_ITEM_DESCRIBE);
}
OldItem::DetailData::DetailData() { Initialize(); }
void OldItem::DetailData::Initialize()
{
m_ItemGrade = OldItem::Grade::ETC;
m_dwFlags = m_dwPrice = m_dwBlackPrice = m_dwMedalPrice = m_dwCraftExp = 0;
m_cOptionLimit = m_cItemType = m_cXSize = m_cYSize =
m_cDefaultDurabilityOrStack = m_cMaxDurabilityOrStack = m_cMaterialType = m_cMaxSocketNum = 0;
}
OldItem::EquipAttribute::EquipAttribute() { Initialize(); }
void OldItem::EquipAttribute::Initialize()
{
m_nAttibuteNum = 0;
std::fill_n(m_usAttributeValue, unsigned short(OldItem::Attribute::MAX_ATTRIBUTE_NUM), 0);
}
OldItem::UseItemInfo::UseItemInfo() { Initialize(); }
void OldItem::UseItemInfo::Initialize()
{
m_usSkill_ID = 0;
m_usSkill_LockCount = 0;
m_cZone = 0;
m_dwAmount = 0;
}
OldItem::UseLimit::UseLimit() { Initialize(); }
void OldItem::UseLimit::Initialize()
{
std::fill_n(m_nStatusLimit, unsigned short(StatusLimit::MAX_STATUS_LIMIT), 0);
m_dwClassLimit = m_nSkillType = m_cSkillLevel = m_cLevelLimit = 0;
}
OldItem::ItemInfo::ItemInfo() { Initialize(); }
OldItem::ItemInfo::ItemInfo(unsigned short usProtoTypeID) { Initialize(); m_usProtoTypeID = usProtoTypeID; }
void OldItem::ItemInfo::Initialize()
{
m_usProtoTypeID = 0;
m_DetailData.Initialize();
m_UseLimit.Initialize();
m_SpriteData.Initialize();
m_StringData.Initialize();
m_EquipAttribute.Initialize();
m_UseItemInfo.Initialize();
}
/*
const char* OldItem::ItemInfo::GetItemDescribe(void) const
{
if (OldItem::ItemType::SKILLBOOK == m_DetailData.m_cItemType)
{
const Skill::ProtoType* pSkillProtoType = CSkillMgr::GetInstance().GetSkillProtoType(m_UseItemInfo.m_usSkill_ID);
if (NULL != pSkillProtoType)
{
return pSkillProtoType[m_UseItemInfo.m_usSkill_LockCount].m_szSkillDescribe;
}
}
return m_StringData.m_szItemDescribe;
}
*/
OldItem::ItemGarbage::ItemGarbage(CItem* lpItem, unsigned long dwRemainNum)
: m_lpItem(lpItem), m_dwRemainNum(dwRemainNum)
{
}
OldItem::ChemicalInfo::ChemicalInfo()
: m_wPickkingItemID(0), m_wTargetItemID(0), m_wResultItemID(0),
m_cPickkingItemNum(0), m_cTargetItemNum(0), m_cResultItemNum(0)
{
}
OldItem::ChemicalInfo::ChemicalInfo(unsigned short wPickkingItemID, unsigned char cPickkingItemNum,
unsigned short wTargetItemID, unsigned char cTargetItemNum)
: m_wPickkingItemID(wPickkingItemID), m_wTargetItemID(wTargetItemID), m_wResultItemID(0),
m_cPickkingItemNum(cPickkingItemNum),m_cTargetItemNum(cTargetItemNum), m_cResultItemNum(0)
{
}

View File

@@ -0,0 +1,303 @@
#ifndef _OLD_ITEM_STRUCTURE_H_
#define _OLD_ITEM_STRUCTURE_H_
#include <Creature/CreatureStructure.h>
#include "OldItemConstants.h"
namespace OldItem
{
class CItem;
#pragma pack(1)
// ------------------------------------------------------------------------------------------
// UseLimit, ItemInfo <20><> <20><>ũ<EFBFBD><C5A9>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
struct ItemPos
{
unsigned short m_cPos : 4; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Equip, Inven...) (0~15)
unsigned short m_cIndex : 12; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> (0~4095)
ItemPos() : m_cPos(0), m_cIndex(0) { }
ItemPos(unsigned char cPos, unsigned short usIndex) : m_cPos(cPos), m_cIndex(usIndex) { }
inline void SetPos(unsigned short wIndex) { m_cIndex = wIndex; }
inline void SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex);
inline void GetPos(unsigned char& cXIndex, unsigned char& cYIndex, unsigned char& cZIndex) const;
inline unsigned char GetXIndex(void) const { return (m_cIndex & 0x00F); }
inline unsigned char GetYIndex(void) const { return (m_cIndex & 0x0F0) >> 4; }
inline unsigned char GetZIndex(void) const { return (m_cIndex & 0xF00) >> 8; }
inline void SetXIndex(unsigned char cXIndex) { m_cIndex = (m_cIndex & 0xFF0) + cXIndex; }
inline void SetYIndex(unsigned char cYIndex) { m_cIndex = (m_cIndex & 0xF0F) + (cYIndex << 4); }
inline void SetZIndex(unsigned char cZIndex) { m_cIndex = (m_cIndex & 0x0FF) + (cZIndex << 8); }
inline bool operator == (const ItemPos& rhs) const { return (m_cPos == rhs.m_cPos && m_cIndex == rhs.m_cIndex); }
};
inline void ItemPos::SetPos(unsigned char cXIndex, unsigned char cYIndex, unsigned char cZIndex)
{
m_cIndex = (cZIndex << 8) + (cYIndex << 4) + cXIndex;
}
inline void ItemPos::GetPos(unsigned char& cXIndex, unsigned char& cYIndex, unsigned char& cZIndex) const
{
cXIndex = (m_cIndex & 0x00F);
cYIndex = (m_cIndex & 0x0F0) >> 4;
cZIndex = (m_cIndex & 0xF00) >> 8;
}
struct ItemData
{
unsigned __int64 m_dwUID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UID
unsigned short m_usProtoTypeID; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
ItemPos m_ItemPos; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ
unsigned char m_cItemSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü ũ<><C5A9>.
unsigned char m_cNumOrDurability; // <20><><EFBFBD><EFBFBD> Ȥ<><C8A4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ItemData() { m_dwUID = m_usProtoTypeID = m_cNumOrDurability = 0; m_cItemSize = sizeof(ItemData); }
void DumpInfo(unsigned long dwCID, const char* szExtraString) const;
};
struct ItemAttribute
{
unsigned short m_cType : 6; // <20>Ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> 6bit (64<36><34><EFBFBD><EFBFBD>)
short m_usValue : 10; // <20>Ӽ<EFBFBD> <20><> 10bit (-512~511<31><31><EFBFBD><EFBFBD>)
ItemAttribute() : m_cType(0), m_usValue(0) { }
ItemAttribute(unsigned char cType, unsigned short usValue) : m_cType(cType), m_usValue(usValue) { }
};
// <20>ڿ<EFBFBD> Socket<65><74><EFBFBD><EFBFBD><EBB9B0> m_cSocketNum<75><6D>ŭ, Attribute<74><65> m_cDiffAttributeNum<75><6D>ŭ <20>ٴ´<D9B4>.
struct EquipmentInfo
{
enum
{
MAX_UPGRADE_LEVEL = 15, // <20>ִ<EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD> <20><><EFBFBD><EFBFBD> - 15
MAX_UPGRADE_SOCKET_ONLY = 5, // <20><><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD><CCB5>Ҷ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
MAX_UPGRADE_ATTRIBUTE = 2, // <20><><EFBFBD>׷<EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_MINSIZE_SOCKET_NUM = 6, // ũ<>Ⱑ 1by1<79><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
MAX_MINSIZE_ATTRIBUTE_NUM = 6, // ũ<>Ⱑ 1by1<79><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_SOCKET_NUM = 8, // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
MAX_SOCKET_ATTRIBUTE_NUM = 16, // <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
MAX_ATTRIBUTE_NUM = 12, // <20>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>Ӽ<EFBFBD> <20><>
MAX_SOCKET_AND_ATTRIBUTE_MINISIZE = (MAX_MINSIZE_SOCKET_NUM * sizeof(char) + MAX_MINSIZE_ATTRIBUTE_NUM * sizeof(ItemAttribute)),
MAX_SOCKET_AND_ATTRIBUTE_SIZE = (MAX_SOCKET_NUM * sizeof(char) + MAX_ATTRIBUTE_NUM * sizeof(ItemAttribute))
};
unsigned short m_cRuneSocket : 11; // <20><> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ID
short m_cDiffMaterialType : 5; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> + m_cDiffMaterialType = <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>(-16~15)
char m_cDiffMaxSocket : 5; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> + m_cDiffMaxSocket = <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> (-16~15)
unsigned char m_cReserved : 3; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
unsigned char m_cSocketNum : 4; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> (0~15)
unsigned char m_cAttributeNum : 4; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD>ų<EFBFBD>, <20><>ġ<EFBFBD><C4A1> <20>ٸ<EFBFBD> <20>Ӽ<EFBFBD> <20><>(0~15<31><35>)
char m_cDiffMaxDurability; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD><DBB0><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
unsigned char m_cReserved2; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
EquipmentInfo()
{
m_cRuneSocket = m_cDiffMaterialType = m_cDiffMaxSocket = m_cDiffMaxDurability =
m_cSocketNum = m_cAttributeNum = m_cReserved = m_cReserved2 = 0;
}
};
#pragma pack()
const unsigned char MAX_ITEM_SIZE = sizeof(ItemData) +
sizeof(EquipmentInfo) + EquipmentInfo::MAX_SOCKET_AND_ATTRIBUTE_SIZE;
struct SpriteData
{
enum { MAX_NAME = 64, MAX_SPRITE_NAME = 32 };
char m_szName[MAX_NAME];
char m_szSpriteName[MAX_SPRITE_NAME];
unsigned short m_nSpriteMinX;
unsigned short m_nSpriteMinY;
unsigned short m_nSpriteMaxX;
unsigned short m_nSpriteMaxY;
SpriteData();
void Initialize();
};
struct StringData
{
enum
{
MAX_FIELD_MODEL_NAME = 32, MAX_EQUIP_MODEL_NAME = 32,
MAX_EFFECT_SOUND_NAME = 32, MAX_TYPE_NAME = 32,
MAX_ITEM_DESCRIBE = 256
};
char m_szFieldModelName[MAX_FIELD_MODEL_NAME];
char m_szEquipModelName[MAX_EQUIP_MODEL_NAME];
char m_szEffectSoundName[MAX_EFFECT_SOUND_NAME];
char m_szTypeName[MAX_TYPE_NAME];
char m_szItemDescribe[MAX_ITEM_DESCRIBE];
StringData();
void Initialize();
};
struct DetailData
{
enum Flags
{
EQUIP = ( 1 << 0), // <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
USE_ITEM = ( 1 << 1), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
QUICKSLOT_IN = ( 1 << 2), // <20><><EFBFBD><EFBFBD><EFBFBD>Կ<EFBFBD> <20><><EFBFBD><20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
STACKABLE = ( 1 << 3), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>
TWOHANDED = ( 1 << 4), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
WEAPON = ( 1 << 5), // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ARMOUR = ( 1 << 6), // <20><><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SKILL_ARM = ( 1 << 7), // <20><>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
};
unsigned char m_cItemType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>( namespace Type <20><><EFBFBD><EFBFBD> )
unsigned char m_cXSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><58><C5A9>
unsigned char m_cYSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><59><C5A9>
unsigned char m_cOptionLimit;
unsigned char m_cDefaultDurabilityOrStack;
unsigned char m_cMaxDurabilityOrStack;
unsigned char m_cMaterialType;
unsigned char m_cMaxSocketNum;
unsigned long m_dwCraftExp;
Grade::Type m_ItemGrade;
unsigned long m_dwPrice;
unsigned long m_dwBlackPrice;
unsigned long m_dwMedalPrice;
unsigned long m_dwFlags;
DetailData();
void Initialize();
};
struct EquipAttribute
{
unsigned short m_usAttributeValue[OldItem::Attribute::MAX_ATTRIBUTE_NUM];
unsigned short m_nAttibuteNum;
EquipAttribute();
void Initialize();
};
struct UseItemInfo
{
unsigned short m_usSkill_ID;
unsigned short m_usSkill_LockCount;
unsigned char m_cZone;
Position m_Pos;
unsigned long m_dwAmount;
UseItemInfo();
void Initialize();
};
struct UseLimit
{
enum DeactivatedType
{
STATUS_LIMIT = ( 1 << 0),
CLASS_LIMIT = ( 1 << 1),
BROKEN_ITEM = ( 1 << 2)
};
unsigned short m_nStatusLimit[StatusLimit::MAX_STATUS_LIMIT];
unsigned short m_nSkillType; // <20><>ų <20><><EFBFBD><EFBFBD> Ÿ<><C5B8>
unsigned char m_cSkillLevel; // <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned char m_cLevelLimit;
unsigned long m_dwClassLimit;
UseLimit();
void Initialize();
};
#pragma pack(8)
struct ItemInfo
{
unsigned short m_usProtoTypeID;
DetailData m_DetailData;
UseLimit m_UseLimit;
SpriteData m_SpriteData;
StringData m_StringData;
EquipAttribute m_EquipAttribute;
UseItemInfo m_UseItemInfo;
ItemInfo();
ItemInfo(unsigned short usPrototypeID);
void Initialize();
inline bool operator < (ItemInfo& rhs)
{
return (m_usProtoTypeID < rhs.m_usProtoTypeID);
}
// const char* GetItemDescribe(void) const;
};
#pragma pack()
struct ItemGarbage
{
CItem* m_lpItem;
unsigned long m_dwRemainNum;
ItemGarbage(CItem* lpItem, unsigned long dwRemainNum);
};
struct ChemicalInfo
{
unsigned short m_wPickkingItemID;
unsigned short m_wTargetItemID;
unsigned short m_wResultItemID;
unsigned char m_cPickkingItemNum;
unsigned char m_cTargetItemNum;
unsigned char m_cResultItemNum;
ChemicalInfo();
ChemicalInfo(unsigned short wPickkingItemID, unsigned char cPickkingItemNum,
unsigned short wTargetItemID, unsigned char cTargetItemNum);
bool operator < (const ChemicalInfo& rhs)
{
if (m_wPickkingItemID == rhs.m_wPickkingItemID)
{
return m_wTargetItemID < rhs.m_wTargetItemID;
}
return m_wPickkingItemID < rhs.m_wPickkingItemID;
}
bool operator == (const ChemicalInfo& rhs)
{
return (m_wPickkingItemID == rhs.m_wPickkingItemID && m_wTargetItemID == rhs.m_wTargetItemID &&
m_cPickkingItemNum == rhs.m_cPickkingItemNum && m_cTargetItemNum == rhs.m_cTargetItemNum);
}
};
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,88 @@
#ifndef _RYL_REBALANCE_LIB_REBALANCE_ITEM_H_
#define _RYL_REBALANCE_LIB_REBALANCE_ITEM_H_
#include <algorithm>
#include <Skill/SkillMgr.h>
#include <Item/ItemConstants.h>
namespace Item
{
// forward decl.
struct ItemData;
struct ItemInfo;
namespace Grade
{
struct GradeInfo;
}
class CItemSerialMgr;
}
namespace OldItem
{
// forward decl.
struct ItemInfo;
}
namespace RebalanceLib
{
class CItemChecker;
class CItemGrade
{
public:
static CItemGrade& GetInstance();
CItemGrade() { std::fill_n(m_dwItemGradeNum, size_t(Item::EquipType::MAX_GRADE), 0LL); }
void AddGradeItemNum(Item::EquipType::Grade eGrade) { ++m_dwItemGradeNum[eGrade]; }
unsigned __int64 GetGradeItemNum(Item::EquipType::Grade eGrade) const { return m_dwItemGradeNum[eGrade]; }
void WriteGradeNum();
private:
unsigned __int64 m_dwItemGradeNum[Item::EquipType::MAX_GRADE];
};
struct SkillBookInfo
{
unsigned long m_dwBookNum[CSkillMgr::MAX_SKILL_LOCKCOUNT];
bool IsEmpty()
{
for(int nCount = 0; nCount < CSkillMgr::MAX_SKILL_LOCKCOUNT; ++nCount)
{
if(0 != m_dwBookNum[nCount])
{
return false;
}
}
return true;
}
};
const char* GetGradeString(Item::EquipType::Grade grade);
bool ConvertRebalanceItem(unsigned long dwUID, unsigned long dwCID,
const Item::ItemData* lpItemData,
const Item::ItemInfo& newItemInfo, const OldItem::ItemInfo& oldItemInfo,
char* szData_Out, unsigned long& dwDataSize_InOut, Item::Grade::GradeInfo& convertedGrade);
bool ConvertContainer(unsigned long dwUID, unsigned long dwCID,
CItemChecker* lpItemChecker, SkillBookInfo* lpSkillBookInfo,
const char* szOriginalData, unsigned long dwOriginalSize,
char* szChangedData, unsigned long& dwChangedSize_InOut);
bool AddSkillBook(unsigned long dwUID, unsigned long dwCID, const char* szPosition,
Item::CItemSerialMgr& itemSerialMgr, unsigned long& dwGold_InOut,
char* szData, unsigned long& dwDataSize_InOut, unsigned long dwMaxDataSize,
CItemChecker& itemChecker, SkillBookInfo& skillBookInfo);
};
#endif