2022-03-05 12:44:06 +02:00
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
#include "../../libgame/include/grid.h"
|
|
|
|
|
#include "constants.h"
|
|
|
|
|
#include "safebox.h"
|
|
|
|
|
#include "packet.h"
|
|
|
|
|
#include "char.h"
|
|
|
|
|
#include "desc_client.h"
|
|
|
|
|
#include "item.h"
|
|
|
|
|
#include "item_manager.h"
|
|
|
|
|
|
|
|
|
|
CSafebox::CSafebox(LPCHARACTER pkChrOwner, int iSize, DWORD dwGold) : m_pkChrOwner(pkChrOwner), m_iSize(iSize), m_lGold(dwGold)
|
|
|
|
|
{
|
|
|
|
|
assert(m_pkChrOwner != NULL);
|
|
|
|
|
memset(m_pkItems, 0, sizeof(m_pkItems));
|
|
|
|
|
|
|
|
|
|
if (m_iSize)
|
|
|
|
|
m_pkGrid = M2_NEW CGrid(5, m_iSize);
|
|
|
|
|
else
|
|
|
|
|
m_pkGrid = NULL;
|
|
|
|
|
|
|
|
|
|
m_bWindowMode = SAFEBOX;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CSafebox::~CSafebox()
|
|
|
|
|
{
|
|
|
|
|
__Destroy();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSafebox::SetWindowMode(BYTE bMode)
|
|
|
|
|
{
|
|
|
|
|
m_bWindowMode = bMode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSafebox::__Destroy()
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < SAFEBOX_MAX_NUM; ++i)
|
|
|
|
|
{
|
|
|
|
|
if (m_pkItems[i])
|
|
|
|
|
{
|
|
|
|
|
m_pkItems[i]->SetSkipSave(true);
|
|
|
|
|
ITEM_MANAGER::instance().FlushDelayedSave(m_pkItems[i]);
|
|
|
|
|
|
|
|
|
|
M2_DESTROY_ITEM(m_pkItems[i]->RemoveFromCharacter());
|
|
|
|
|
m_pkItems[i] = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (m_pkGrid)
|
|
|
|
|
{
|
|
|
|
|
M2_DELETE(m_pkGrid);
|
|
|
|
|
m_pkGrid = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSafebox::Add(DWORD dwPos, LPITEM pkItem)
|
|
|
|
|
{
|
|
|
|
|
if (!IsValidPosition(dwPos))
|
|
|
|
|
{
|
|
|
|
|
sys_err("SAFEBOX: item on wrong position at %d (size of grid = %d)", dwPos, m_pkGrid->GetSize());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pkItem->SetWindow(m_bWindowMode);
|
|
|
|
|
pkItem->SetCell(m_pkChrOwner, dwPos);
|
|
|
|
|
pkItem->Save(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Save<76><65> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
|
|
|
|
ITEM_MANAGER::instance().FlushDelayedSave(pkItem);
|
|
|
|
|
|
|
|
|
|
m_pkGrid->Put(dwPos, 1, pkItem->GetSize());
|
|
|
|
|
m_pkItems[dwPos] = pkItem;
|
|
|
|
|
|
|
|
|
|
TPacketGCItemSet pack;
|
|
|
|
|
|
|
|
|
|
pack.header = m_bWindowMode == SAFEBOX ? HEADER_GC_SAFEBOX_SET : HEADER_GC_MALL_SET;
|
|
|
|
|
pack.Cell = TItemPos(m_bWindowMode, dwPos);
|
|
|
|
|
pack.vnum = pkItem->GetVnum();
|
|
|
|
|
pack.count = pkItem->GetCount();
|
|
|
|
|
pack.flags = pkItem->GetFlag();
|
|
|
|
|
pack.anti_flags = pkItem->GetAntiFlag();
|
2022-03-06 17:36:43 +02:00
|
|
|
|
memcpy(pack.alSockets, pkItem->GetSockets(), sizeof(pack.alSockets));
|
|
|
|
|
memcpy(pack.aAttr, pkItem->GetAttributes(), sizeof(pack.aAttr));
|
2022-03-05 12:44:06 +02:00
|
|
|
|
|
|
|
|
|
m_pkChrOwner->GetDesc()->Packet(&pack, sizeof(pack));
|
|
|
|
|
sys_log(1, "SAFEBOX: ADD %s %s count %d", m_pkChrOwner->GetName(), pkItem->GetName(), pkItem->GetCount());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LPITEM CSafebox::Get(DWORD dwPos)
|
|
|
|
|
{
|
|
|
|
|
if (dwPos >= m_pkGrid->GetSize())
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
return m_pkItems[dwPos];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LPITEM CSafebox::Remove(DWORD dwPos)
|
|
|
|
|
{
|
|
|
|
|
LPITEM pkItem = Get(dwPos);
|
|
|
|
|
|
|
|
|
|
if (!pkItem)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (!m_pkGrid)
|
|
|
|
|
sys_err("Safebox::Remove : nil grid");
|
|
|
|
|
else
|
|
|
|
|
m_pkGrid->Get(dwPos, 1, pkItem->GetSize());
|
|
|
|
|
|
|
|
|
|
pkItem->RemoveFromCharacter();
|
|
|
|
|
|
|
|
|
|
m_pkItems[dwPos] = NULL;
|
|
|
|
|
|
|
|
|
|
TPacketGCItemDel pack;
|
|
|
|
|
|
|
|
|
|
pack.header = m_bWindowMode == SAFEBOX ? HEADER_GC_SAFEBOX_DEL : HEADER_GC_MALL_DEL;
|
|
|
|
|
pack.pos = dwPos;
|
|
|
|
|
|
|
|
|
|
m_pkChrOwner->GetDesc()->Packet(&pack, sizeof(pack));
|
|
|
|
|
sys_log(1, "SAFEBOX: REMOVE %s %s count %d", m_pkChrOwner->GetName(), pkItem->GetName(), pkItem->GetCount());
|
|
|
|
|
return pkItem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSafebox::Save()
|
|
|
|
|
{
|
|
|
|
|
TSafeboxTable t;
|
|
|
|
|
|
|
|
|
|
memset(&t, 0, sizeof(TSafeboxTable));
|
|
|
|
|
|
|
|
|
|
t.dwID = m_pkChrOwner->GetDesc()->GetAccountTable().id;
|
|
|
|
|
t.dwGold = m_lGold;
|
|
|
|
|
|
|
|
|
|
db_clientdesc->DBPacket(HEADER_GD_SAFEBOX_SAVE, 0, &t, sizeof(TSafeboxTable));
|
|
|
|
|
sys_log(1, "SAFEBOX: SAVE %s", m_pkChrOwner->GetName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSafebox::IsEmpty(DWORD dwPos, BYTE bSize)
|
|
|
|
|
{
|
|
|
|
|
if (!m_pkGrid)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return m_pkGrid->IsEmpty(dwPos, 1, bSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CSafebox::ChangeSize(int iSize)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ں<EFBFBD><DABA><EFBFBD> ũ<><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>д<EFBFBD>.
|
|
|
|
|
if (m_iSize >= iSize)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
m_iSize = iSize;
|
|
|
|
|
|
|
|
|
|
CGrid * pkOldGrid = m_pkGrid;
|
|
|
|
|
|
|
|
|
|
if (pkOldGrid)
|
|
|
|
|
m_pkGrid = M2_NEW CGrid(pkOldGrid, 5, m_iSize);
|
|
|
|
|
else
|
|
|
|
|
m_pkGrid = M2_NEW CGrid(5, m_iSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LPITEM CSafebox::GetItem(BYTE bCell)
|
|
|
|
|
{
|
|
|
|
|
if (bCell >= 5 * m_iSize)
|
|
|
|
|
{
|
|
|
|
|
sys_err("CHARACTER::GetItem: invalid item cell %d", bCell);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return m_pkItems[bCell];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSafebox::MoveItem(BYTE bCell, BYTE bDestCell, BYTE count)
|
|
|
|
|
{
|
|
|
|
|
LPITEM item;
|
|
|
|
|
|
|
|
|
|
int max_position = 5 * m_iSize;
|
|
|
|
|
|
|
|
|
|
if (bCell >= max_position || bDestCell >= max_position)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (!(item = GetItem(bCell)))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (item->IsExchanging())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (item->GetCount() < count)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
LPITEM item2;
|
|
|
|
|
|
|
|
|
|
if ((item2 = GetItem(bDestCell)) && item != item2 && item2->IsStackable() &&
|
|
|
|
|
!IS_SET(item2->GetAntiFlag(), ITEM_ANTIFLAG_STACK) &&
|
|
|
|
|
item2->GetVnum() == item->GetVnum()) // <20><>ĥ <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
|
|
|
|
|
if (item2->GetSocket(i) != item->GetSocket(i))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (count == 0)
|
|
|
|
|
count = item->GetCount();
|
|
|
|
|
|
2022-11-27 22:18:08 +02:00
|
|
|
|
count = std::min<BYTE>(200 - item2->GetCount(), count);
|
2022-03-05 12:44:06 +02:00
|
|
|
|
|
|
|
|
|
if (item->GetCount() >= count)
|
|
|
|
|
Remove(bCell);
|
|
|
|
|
|
|
|
|
|
item->SetCount(item->GetCount() - count);
|
|
|
|
|
item2->SetCount(item2->GetCount() + count);
|
|
|
|
|
|
|
|
|
|
sys_log(1, "SAFEBOX: STACK %s %d -> %d %s count %d", m_pkChrOwner->GetName(), bCell, bDestCell, item2->GetName(), item2->GetCount());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!IsEmpty(bDestCell, item->GetSize()))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
m_pkGrid->Get(bCell, 1, item->GetSize());
|
|
|
|
|
|
|
|
|
|
if (!m_pkGrid->Put(bDestCell, 1, item->GetSize()))
|
|
|
|
|
{
|
|
|
|
|
m_pkGrid->Put(bCell, 1, item->GetSize());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_pkGrid->Get(bDestCell, 1, item->GetSize());
|
|
|
|
|
m_pkGrid->Put(bCell, 1, item->GetSize());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sys_log(1, "SAFEBOX: MOVE %s %d -> %d %s count %d", m_pkChrOwner->GetName(), bCell, bDestCell, item->GetName(), item->GetCount());
|
|
|
|
|
|
|
|
|
|
Remove(bCell);
|
|
|
|
|
Add(bDestCell, item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool CSafebox::IsValidPosition(DWORD dwPos)
|
|
|
|
|
{
|
|
|
|
|
if (!m_pkGrid)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
if (dwPos >= m_pkGrid->GetSize())
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|