forked from metin2/server
157 lines
3.2 KiB
C++
157 lines
3.2 KiB
C++
#include "stdafx.h"
|
|
#include "constants.h"
|
|
#include "char.h"
|
|
#include "desc.h"
|
|
#include "desc_manager.h"
|
|
#include "packet.h"
|
|
#include "item.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// QUICKSLOT HANDLING
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
void CHARACTER::SyncQuickslot(BYTE bType, BYTE bOldPos, BYTE bNewPos) // bNewPos == 255 ¸é DELETE
|
|
{
|
|
if (bOldPos == bNewPos)
|
|
return;
|
|
|
|
for (int i = 0; i < QUICKSLOT_MAX_NUM; ++i)
|
|
{
|
|
if (m_quickslot[i].type == bType && m_quickslot[i].pos == bOldPos)
|
|
{
|
|
if (bNewPos == 255)
|
|
DelQuickslot(i);
|
|
else
|
|
{
|
|
TQuickslot slot;
|
|
|
|
slot.type = bType;
|
|
slot.pos = bNewPos;
|
|
|
|
SetQuickslot(i, slot);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool CHARACTER::GetQuickslot(BYTE pos, TQuickslot ** ppSlot)
|
|
{
|
|
if (pos >= QUICKSLOT_MAX_NUM)
|
|
return false;
|
|
|
|
*ppSlot = &m_quickslot[pos];
|
|
return true;
|
|
}
|
|
|
|
bool CHARACTER::SetQuickslot(BYTE pos, TQuickslot & rSlot)
|
|
{
|
|
struct packet_quickslot_add pack_quickslot_add;
|
|
|
|
if (pos >= QUICKSLOT_MAX_NUM)
|
|
return false;
|
|
|
|
if (rSlot.type >= QUICKSLOT_TYPE_MAX_NUM)
|
|
return false;
|
|
|
|
for (int i = 0; i < QUICKSLOT_MAX_NUM; ++i)
|
|
{
|
|
if (rSlot.type == 0)
|
|
continue;
|
|
else if (m_quickslot[i].type == rSlot.type && m_quickslot[i].pos == rSlot.pos)
|
|
DelQuickslot(i);
|
|
}
|
|
|
|
TItemPos srcCell(INVENTORY, rSlot.pos);
|
|
|
|
switch (rSlot.type)
|
|
{
|
|
case QUICKSLOT_TYPE_ITEM:
|
|
if (false == srcCell.IsDefaultInventoryPosition() && false == srcCell.IsBeltInventoryPosition())
|
|
return false;
|
|
|
|
break;
|
|
|
|
case QUICKSLOT_TYPE_SKILL:
|
|
if ((int) rSlot.pos >= SKILL_MAX_NUM)
|
|
return false;
|
|
|
|
break;
|
|
|
|
case QUICKSLOT_TYPE_COMMAND:
|
|
break;
|
|
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
m_quickslot[pos] = rSlot;
|
|
|
|
if (GetDesc())
|
|
{
|
|
pack_quickslot_add.header = HEADER_GC_QUICKSLOT_ADD;
|
|
pack_quickslot_add.pos = pos;
|
|
pack_quickslot_add.slot = m_quickslot[pos];
|
|
|
|
GetDesc()->Packet(&pack_quickslot_add, sizeof(pack_quickslot_add));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CHARACTER::DelQuickslot(BYTE pos)
|
|
{
|
|
struct packet_quickslot_del pack_quickslot_del;
|
|
|
|
if (pos >= QUICKSLOT_MAX_NUM)
|
|
return false;
|
|
|
|
memset(&m_quickslot[pos], 0, sizeof(TQuickslot));
|
|
|
|
pack_quickslot_del.header = HEADER_GC_QUICKSLOT_DEL;
|
|
pack_quickslot_del.pos = pos;
|
|
|
|
GetDesc()->Packet(&pack_quickslot_del, sizeof(pack_quickslot_del));
|
|
return true;
|
|
}
|
|
|
|
bool CHARACTER::SwapQuickslot(BYTE a, BYTE b)
|
|
{
|
|
struct packet_quickslot_swap pack_quickslot_swap;
|
|
TQuickslot quickslot;
|
|
|
|
if (a >= QUICKSLOT_MAX_NUM || b >= QUICKSLOT_MAX_NUM)
|
|
return false;
|
|
|
|
// Äü ½½·Ô ÀÚ¸®¸¦ ¼·Î ¹Ù²Û´Ù.
|
|
quickslot = m_quickslot[a];
|
|
|
|
m_quickslot[a] = m_quickslot[b];
|
|
m_quickslot[b] = quickslot;
|
|
|
|
pack_quickslot_swap.header = HEADER_GC_QUICKSLOT_SWAP;
|
|
pack_quickslot_swap.pos = a;
|
|
pack_quickslot_swap.pos_to = b;
|
|
|
|
GetDesc()->Packet(&pack_quickslot_swap, sizeof(pack_quickslot_swap));
|
|
return true;
|
|
}
|
|
|
|
void CHARACTER::ChainQuickslotItem(LPITEM pItem, BYTE bType, BYTE bOldPos)
|
|
{
|
|
if (pItem->IsDragonSoul())
|
|
return;
|
|
for ( int i=0; i < QUICKSLOT_MAX_NUM; ++i )
|
|
{
|
|
if ( m_quickslot[i].type == bType && m_quickslot[i].pos == bOldPos )
|
|
{
|
|
TQuickslot slot;
|
|
slot.type = bType;
|
|
slot.pos = pItem->GetCell();
|
|
|
|
SetQuickslot(i, slot);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|