void CInputMain::SafeboxCheckout(LPCHARACTER ch, const char* c_pData, bool bMall)
{
TPacketCGSafeboxCheckout* p = (TPacketCGSafeboxCheckout*)c_pData;
if (!ch->CanHandleItem())
return;
CSafebox* pkSafebox;
if (bMall)
pkSafebox = ch->GetMall();
else
pkSafebox = ch->GetSafebox();
if (!pkSafebox)
return;
LPITEM pkItem = pkSafebox->Get(p->bSafePos);
if (!pkItem)
return;
if (!ch->IsEmptyItemGrid(p->ItemPos, pkItem->GetSize()))
return;
if (pkItem->IsDragonSoul())
{
if (bMall)
{
DSManager::instance().DragonSoulItemInitialize(pkItem);
}
if (DRAGON_SOUL_INVENTORY != p->ItemPos.window_type)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<창고> 옮길 수 없는 위치입니다."));
return;
}
TItemPos DestPos = p->ItemPos;
if (!DSManager::instance().IsValidCellForThisItem(pkItem, DestPos))
{
int iCell = ch->GetEmptyDragonSoulInventory(pkItem);
if (iCell < 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<창고> 옮길 수 없는 위치입니다."));
return;
}
DestPos = TItemPos(DRAGON_SOUL_INVENTORY, iCell);
}
pkSafebox->Remove(p->bSafePos);
pkItem->AddToCharacter(ch, DestPos);
ITEM_MANAGER::instance().FlushDelayedSave(pkItem);
}
else
{
if (DRAGON_SOUL_INVENTORY == p->ItemPos.window_type)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<창고> 옮길 수 없는 위치입니다."));
return;
}
// @fixme119
if (p->ItemPos.IsBeltInventoryPosition() && false == CBeltInventoryHelper::CanMoveIntoBeltInventory(pkItem))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("이 아이템은 벨트 인벤토리로 옮길 수 없습니다."));
return;
}
pkSafebox->Remove(p->bSafePos);
pkItem->AddToCharacter(ch, p->ItemPos);
ITEM_MANAGER::instance().FlushDelayedSave(pkItem);
}
DWORD dwID = pkItem->GetID();
db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_FLUSH, 0, sizeof(DWORD));
db_clientdesc->Packet(&dwID, sizeof(DWORD));
char szHint[128];
snprintf(szHint, sizeof(szHint), "%s %u", pkItem->GetName(), pkItem->GetCount());
if (bMall)
LogManager::instance().ItemLog(ch, pkItem, "MALL GET", szHint);
else
LogManager::instance().ItemLog(ch, pkItem, "SAFEBOX GET", szHint);
}