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>
165 lines
3.8 KiB
C++
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;
|
|
}
|
|
}
|
|
}
|
|
}; |