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:
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
1690
Server/RylServerProject/RylGameLibrary/Item/Item.cpp
Normal file
1690
Server/RylServerProject/RylGameLibrary/Item/Item.cpp
Normal file
File diff suppressed because it is too large
Load Diff
897
Server/RylServerProject/RylGameLibrary/Item/Item.h
Normal file
897
Server/RylServerProject/RylGameLibrary/Item/Item.h
Normal 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
|
||||
750
Server/RylServerProject/RylGameLibrary/Item/ItemConstants.cpp
Normal file
750
Server/RylServerProject/RylGameLibrary/Item/ItemConstants.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
538
Server/RylServerProject/RylGameLibrary/Item/ItemConstants.h
Normal file
538
Server/RylServerProject/RylGameLibrary/Item/ItemConstants.h
Normal 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
|
||||
298
Server/RylServerProject/RylGameLibrary/Item/ItemDataParser.cpp
Normal file
298
Server/RylServerProject/RylGameLibrary/Item/ItemDataParser.cpp
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
36
Server/RylServerProject/RylGameLibrary/Item/ItemDataParser.h
Normal file
36
Server/RylServerProject/RylGameLibrary/Item/ItemDataParser.h
Normal 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
|
||||
373
Server/RylServerProject/RylGameLibrary/Item/ItemFactory.cpp
Normal file
373
Server/RylServerProject/RylGameLibrary/Item/ItemFactory.cpp
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
101
Server/RylServerProject/RylGameLibrary/Item/ItemFactory.h
Normal file
101
Server/RylServerProject/RylGameLibrary/Item/ItemFactory.h
Normal 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
|
||||
1277
Server/RylServerProject/RylGameLibrary/Item/ItemMgr.cpp
Normal file
1277
Server/RylServerProject/RylGameLibrary/Item/ItemMgr.cpp
Normal file
File diff suppressed because it is too large
Load Diff
107
Server/RylServerProject/RylGameLibrary/Item/ItemMgr.h
Normal file
107
Server/RylServerProject/RylGameLibrary/Item/ItemMgr.h
Normal 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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
31
Server/RylServerProject/RylGameLibrary/Item/ItemSerialMgr.h
Normal file
31
Server/RylServerProject/RylGameLibrary/Item/ItemSerialMgr.h
Normal 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
|
||||
1316
Server/RylServerProject/RylGameLibrary/Item/ItemServerFunc.cpp
Normal file
1316
Server/RylServerProject/RylGameLibrary/Item/ItemServerFunc.cpp
Normal file
File diff suppressed because it is too large
Load Diff
449
Server/RylServerProject/RylGameLibrary/Item/ItemStructure.cpp
Normal file
449
Server/RylServerProject/RylGameLibrary/Item/ItemStructure.cpp
Normal 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;
|
||||
}
|
||||
372
Server/RylServerProject/RylGameLibrary/Item/ItemStructure.h
Normal file
372
Server/RylServerProject/RylGameLibrary/Item/ItemStructure.h
Normal 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> Xũ<58><C5A9>
|
||||
unsigned char m_cYSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Yũ<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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -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> Xũ<58><C5A9>
|
||||
unsigned char m_cYSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Yũ<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
@@ -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
|
||||
Reference in New Issue
Block a user