#include "stdafx.h" #include #include #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; } // Äù½ºÆ® Æ®¸®°Å ¹ßµ¿ 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 ¾ÆÀÌÅÛÀÌ NULLÀÔ´Ï´Ù.", m_dwCID); return false; } unsigned char cX, cY, cTab; itemPos.GetPos(cX, cY, cTab); // Äù½ºÆ® ÅÇ Ã¼Å© unsigned char cItemType = lpItem->GetItemInfo().m_DetailData.m_cItemType; /* // edith 2008.06.04 Àκ¥Å丮 Äù½ºÆ® ¾ÆÀÌÅÛ ÅÇ Á¦°Å 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 ¾ÆÀÌÅÛ¿¡ ¸Â´Â ¿Ã¹Ù¸¥ ÅÇÀÌ ¾Æ´Õ´Ï´Ù. 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(cX + cXSize) || m_nYSize < static_cast(cY + cYSize) || m_nTabNum <= cTab) { ERRLOG9(g_Log, "CID:%10u ¾ÆÀÌÅÛ À§Ä¡ ¹× Å©±â°¡ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù. " "X:%d/%d, Y:%d/%d, Tab:%d/%d, XÅ©±â:%d, YÅ©±â:%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) ÀÌ¹Ì ±× Àå¼Ò¿¡ ¾ÆÀÌÅÛÀÌ ÀÖ½À´Ï´Ù.", 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 ¾ÆÀÌÅÛ Á¾·ù ID°¡ ¾ø½À´Ï´Ù. usProtoTypeID:%d", m_dwCID, usProtoTypeID); return false; } unsigned char cX, cY, cTab; itemPos.GetPos(cX, cY, cTab); // Äù½ºÆ® ÅÇ Ã¼Å© unsigned char cItemType = lpItemInfo->m_DetailData.m_cItemType; /* // edith 2008.06.04 Àκ¥Å丮 Äù½ºÆ® ¾ÆÀÌÅÛ ÅÇ Á¦°Å 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 ¾ÆÀÌÅÛ¿¡ ¸Â´Â ¿Ã¹Ù¸¥ ÅÇÀÌ ¾Æ´Õ´Ï´Ù. 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(cX + cXSize) || m_nYSize < static_cast(cY + cYSize) || m_nTabNum <= cTab) { ERRLOG9(g_Log, "CID:%10u ¾ÆÀÌÅÛ À§Ä¡ ¹× Å©±â°¡ ¿Ã¹Ù¸£Áö ¾Ê½À´Ï´Ù. " "X:%d/%d, Y:%d/%d, Tab:%d/%d, XÅ©±â:%d, YÅ©±â:%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) { // ½ºÅÃÀÎ °æ¿ì 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) ÀÌ¹Ì ±× Àå¼Ò¿¡ ¾ÆÀÌÅÛÀÌ ÀÖ°í, ½ºÅÃÇÒ ¼öµµ ¾ø½À´Ï´Ù.", 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; } // Äù½ºÆ® Æ®¸®°Å ¹ßµ¿ 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; // Äù½ºÆ® ÅÇ Ã¼Å© unsigned char cItemType = lpItemInfo->m_DetailData.m_cItemType; unsigned char cStartTab = 0; unsigned char cEndTab = m_nTabNum; /* // edith 2008.06.04 Àκ¥Å丮 Äù½ºÆ® ¾ÆÀÌÅÛ ÅÇ Á¦°Å 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) { // ½ºÅÃÇÒ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ Àִ°¡ ã´Â´Ù. for (cTab = cStartTab; cTab < cEndTab; ++cTab) { for (cHeight = 0; cHeight < m_nYSize; ++cHeight) { if (cHeight + cYSize> m_nYSize) { // YSize°¡ °æ°è¸¦ ¹þ¾î³ª¸é ´ÙÀ½ ÅÇÀ¸·Î... break; } for (cWidth = 0; cWidth < m_nXSize; ++cWidth) { if (cWidth + cXSize > m_nXSize) { // XSize°¡ °æ°è¸¦ ¹þ¾î³ª¸é ´ÙÀ½ ÇàÀ¸·Î... break; } CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cHeight + cWidth]; if (NULL != lpItem) { // Àåºñ ¾ÆÀÌÅÛÀº ½ºÅÃÇÒ ¼ö ¾ø´Ù. if (false == lpItem->IsSet(DetailData::EQUIP)) { // ÀÌ¹Ì ¾ÆÀÌÅÛÀÌ ÀÖÀ» ¶§, ȹµæÇÑ ¾ÆÀÌÅÛÀÌ ½ºÅð¡´ÉÇÑ ¾ÆÀÌÅÛÀ̰í, Max °³°¡ ¾Æ´Ï¶ó¸é, // ÇØ´ç ÀÚ¸®¿¡ ½ºÅýÃŲ´Ù. 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; } } } } } // ¾ÆÀÌÅÛÀÌ ¾ø°Å³ª, ´Ù¸£°Å³ª, ½ºÅÃÇÒ¼ö ¾øÀ¸¸é, ´ÙÀ½ °ø°£À» ã´Â´Ù. } } } // ½ºÅÃÇÒ ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÌ ¾øÀ¸¹Ç·Î, ºó °ø°£À» ã´Â´Ù. for (cTab = cStartTab; cTab < cEndTab; ++cTab) { for (cHeight = 0; cHeight < m_nYSize; ++cHeight) { if (cHeight + cYSize> m_nYSize) { // YSize°¡ °æ°è¸¦ ¹þ¾î³ª¸é ´ÙÀ½ ÅÇÀ¸·Î... break; } for (cWidth = 0; cWidth < m_nXSize; ++cWidth) { if (cWidth + cXSize > m_nXSize) { // XSize°¡ °æ°è¸¦ ¹þ¾î³ª¸é ´ÙÀ½ ÇàÀ¸·Î... break; } CItem* lpItem = m_lppItems[m_nSizePerTab * cTab + m_nXSize * cHeight + cWidth]; if (NULL == lpItem) { unsigned char cX, cY; lpItem = NULL; // ¾ÆÀÌÅÛÀÌ ¾ø´Â Ä­À̸é Å©±â¸¦ ºñ±³ÇÏ¿© °ø°£ÀÌ ÃæºÐÇѰ¡ üũ 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; }