Files
Client/Server/AdminTool/AdminToolLibrary/Ryl_ItemData.cpp
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

165 lines
3.8 KiB
C++

#include "stdafx.h"
#include <Character/ModifyCharacter.h>
#include <Item/ItemFactory.h>
#include <Log/ServerLog.h>
namespace ItemData
{
// 아이템 좌표를 만든다.
Item::ItemPos MakeItemPos(unsigned char cPos, unsigned char cX, unsigned char cY, unsigned char cZ)
{
Item::ItemPos itemPos;
itemPos.m_cPos = cPos;
if(IsArrayContainer(cPos))
{
itemPos.SetPos(cX, cY, cZ);
}
else
{
itemPos.m_cIndex = cX;
}
return itemPos;
}
// 아이템위치가 적정한위치인지 확인..
inline bool IsArrayContainer(unsigned char cTakePos)
{
switch(cTakePos)
{
case TakeType::TS_INVEN:
case TakeType::TS_EXCHANGE:
case TakeType::TS_DEPOSIT:
case TakeType::TS_STALL:
return true;
}
return false;
}
// 아이템 복사..
Item::CItem* CloneItem(Item::CItem* lpSrcItem, PktAdminMgr::CreateItemInfo EquipInfo)
{
if (0 != lpSrcItem)
{
Item::CEquipment* lpEquipment = Item::CEquipment::DowncastToEquipment(lpSrcItem);
if (0 != lpEquipment)
{
Item::CItem* lpNewItem =
Item::CItemFactory::GetInstance().CreateItem(lpEquipment->GetItemInfo());
Item::CEquipment* lpNewEquipment =
Item::CEquipment::DowncastToEquipment(lpNewItem);
if(0 == lpNewEquipment)
{
DELETE_ITEM(lpNewItem);
}
else
{
lpNewEquipment->SetNumOrDurability(lpSrcItem->GetNumOrDurability());
static_cast<CModifyEquipment*>(lpNewEquipment)->AdjustData(EquipInfo);
DETLOG0(g_Log, "Item::CEquipment* 복사 아이템을 생성했습니다.");
return lpNewEquipment;
}
}
else
{
Item::CItem* lpItem =
new Item::CItem(lpSrcItem->GetItemInfo());
if (0 != lpItem)
{
lpItem->SetNumOrDurability(lpSrcItem->GetNumOrDurability());
DETLOG0(g_Log, "Item::CItem* 복사 아이템을 생성했습니다.");
return lpItem;
}
}
}
else
{
ERRLOG0(g_Log, "원본 아이템이 NULL입니다");
}
return NULL;
}
// 리턴값 :
// 내가 사용할수 있으면 true 사용할수 없으면 false
// 리턴값이 false && bisLock가 false면 내가 창고에 락을 걸고 사용하면된다.
bool CDepositLock::isUse( unsigned long dwUID, unsigned long dwCID, CPacketDispatch* lpPacketDispatch, bool& bisLock )
{
isDepositPos Pos = m_DepositUser.find( dwUID );
if( Pos != end( ) )
{
bisLock = true;
DepositInfo& Info = Pos->second;
if( ( dwCID == Info.m_dwCID ) && ( Info.m_lpPacketDispatch == lpPacketDispatch ) )
{
return true;
}
}
else
{
bisLock = false;
}
return false;
}
// 창고 잠금정보를 저장한다
void CDepositLock::DepositLock( unsigned long dwUID, unsigned long dwCID, CPacketDispatch* lpPacketDispatch )
{
m_DepositUser.insert( std::make_pair( dwUID, DepositInfo( dwCID, lpPacketDispatch ) ) );
}
// 창고 잠금정보를 해지..
void CDepositLock::DepositUnLock( unsigned long dwUID )
{
isDepositPos Pos = m_DepositUser.find( dwUID );
if( Pos != end( ) ) m_DepositUser.erase( Pos );
}
// 창고를 독점하고있는 관리자의 Dispatch를 가져온다.
CPacketDispatch* CDepositLock::GetDispatch( unsigned long dwUID )
{
isDepositPos Pos = m_DepositUser.find( dwUID );
if( Pos != end( ) )
{
DepositInfo& Info = Pos->second;
return Info.m_lpPacketDispatch;
}
return NULL;
}
// 창고 잠금 정보를 가져온다.
bool CDepositLock::GetLockInfo( unsigned long dwUID, CDepositLock::DepositInfo& Info )
{
isDepositPos Pos = m_DepositUser.find( dwUID );
if( Pos != end( ) )
{
Info = Pos->second;
return true;
}
return false;
}
// 해당 Dispatch를 가지고 있는 창고 장금정보를 모두 해지한다.
void CDepositLock::RemoveAllSelectDispatch( CPacketDispatch* lpPacketDispatch )
{
isDepositPos Pos = m_DepositUser.begin( );
for(;Pos != end( );)
{
DepositInfo& Info = Pos->second;
if( Info.m_lpPacketDispatch == lpPacketDispatch )
{
m_DepositUser.erase( Pos++ );
}
else
{
++Pos;
}
}
}
};