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,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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user