📄 itemmanager.cpp
字号:
else
{
pPosInfo[PosInfoNum].m_num = need_num;
need_num = 0;
}
++PosInfoNum;
if( need_num == 0 ) return TRUE;
}
}
ASSERT( need_num != 0 );
return FALSE;
}
// 肯傈茄 蔼捞 牢磊肺 甸绢客具 茄促!!
// 窃荐狼 角菩绰 绝促!
VOID ItemManager::Obtain( SLOTIDX SlotIdx,
SLOTCODE ItemCode, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo,
BYTE & OUT byCount, ITEMSLOTEX * OUT pItemSlot )
{
SCItemSlot ItemSlot;
ItemSlot.SetCode( ItemCode );
return Obtain( SlotIdx, ItemSlot, PosInfoNum, pPosInfo, byCount, pItemSlot );
}
VOID ItemManager::Obtain( SLOTIDX SlotIdx,
SCItemSlot & IN slot, POSTYPE & OUT PosInfoNum, POS_INFO * OUT pPosInfo,
BYTE & OUT byCount, ITEMSLOTEX * OUT pItemSlot )
{
ASSERT( SlotIdx == SI_INVENTORY || SlotIdx == SI_TEMPINVENTORY );
SCSlotContainer * pContainer = GetItemSlotContainer( SlotIdx );
MSG_DG_ITEM_SERIAL_SYN msg;
msg.m_dwKey = m_pPlayer->GetUserKey();
INT total = 0;
for( POSTYPE i = 0 ; i < PosInfoNum ; ++i )
{
POSTYPE pos = pPosInfo[i].m_pos;
SCItemSlot & ItemSlot = (SCItemSlot &)pContainer->GetSlot(pos);
if( pContainer->IsEmpty(pos) )
{
// 厚绢乐促.
ASSERT( pPosInfo[i].m_num <= slot.GetMaxNum() );
slot.SetNum(pPosInfo[i].m_num);
// ------------- 牢亥配府 酒捞袍 惯鞭 夸没 -------------
slot.SetSerial(TEMP_DBSERIAL_VALUE);
pContainer->InsertSlot( pos, slot );
pContainer->SetLock( pos, TRUE );
msg.m_SlotIdx = SlotIdx;
msg.m_ItemPos = pos;
m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
// ------------- 牢亥配府 酒捞袍 惯鞭 夸没 -------------
}
else
{
ASSERT( ItemSlot.GetCode() == slot.GetCode() );
ASSERT( ItemSlot.GetNum() < ItemSlot.GetMaxNum() );
ASSERT( pPosInfo[i].m_num + ItemSlot.GetNum() <= ItemSlot.GetMaxNum() );
ItemSlot.SetNum( ItemSlot.GetNum()+pPosInfo[i].m_num );
//pContainer->UpdateSlot( pos, ST_NONE, 0, 0, 0, ItemSlot.GetNum()+pPosInfo[i].m_num, 0, UB_DURA );
}
if( pItemSlot )
{
pItemSlot[total].m_ItemPos = pos;
ItemSlot.CopyOut(pItemSlot[total].m_Stream);
++total;
}
}
byCount += total;
}
// 般摹绰 酒捞袍
// SLOTCODE ItemCode : 掘绊磊 窍绰 酒捞袍 内靛
// WORD num : 掘绊磊 窍绰 酒捞袍 俺荐
RC::eITEM_RESULT ItemManager::ObtainDup( SLOTCODE ItemCode, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
SCItemSlot ItemSlot;
ItemSlot.SetCode( ItemCode );
return ObtainDup( ItemSlot, num, pTotalInfo );
}
RC::eITEM_RESULT ItemManager::ObtainDup( SCItemSlot & IN slot, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
if( !slot.IsOverlap() )
return RC::RC_ITEM_INVALIDSTATE;
ASSERT( num > 0 );
SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
SCSlotContainer * pTmpInventory = GetItemSlotContainer( SI_TEMPINVENTORY );
ASSERT( slot.GetNum() == 1 );
const int MAX_DUP_NUM = slot.GetMaxNum();
//--------------------------------------------------------------------------------
// 后傍埃捞 乐绰瘤 咯何 眉农
//--------------------------------------------------------------------------------
// static栏肺 荤侩!
static POSTYPE InPos[MAX_INVENTORY_SLOT_NUM];
static POSTYPE InPosTmp[MAX_TEMPINVENTORY_SLOT_NUM];
POSTYPE InPosNum = 0;
POSTYPE InPosTmpNum = 0;
// 牢亥配府 般磨荐 乐绰瘤 眉农
POSTYPE need_num = num;
CanInsertOverlappedItem( pInventory, slot.GetCode(), need_num, InPos, InPosNum );
CanInsertItem( pInventory, MAX_DUP_NUM, need_num, InPos, InPosNum );
CanInsertOverlappedItem( pTmpInventory, slot.GetCode(), need_num, InPosTmp, InPosTmpNum );
CanInsertItem( pTmpInventory, MAX_DUP_NUM, need_num, InPosTmp, InPosTmpNum );
if( need_num != 0 )
return RC::RC_ITEM_NOSPACEININVENTORY;
BYTE total = 0;
if( pTotalInfo )
{
pTotalInfo->m_InvenCount = 0;
pTotalInfo->m_TmpInvenCount = 0;
}
MSG_DG_ITEM_SERIAL_SYN msg;
BOOL bAyncSerial = FALSE;
// 矫府倔捞 乐绊 俺荐啊 1捞搁 弊措肺 荤侩!
if( slot.GetSerial() == 0 || num != 1 )
{
msg.m_dwKey = m_pPlayer->GetUserKey();
// 持阑 困摹俊 遏阑 吧绊 矫府倔捞 绝绰 酒捞袍阑 持绊! + 矫府倔 惯鞭 夸没
slot.SetSerial( TEMP_DBSERIAL_VALUE ); //< 烙矫 蔼 持扁
bAyncSerial = TRUE;
}
need_num = num;
// 牢亥配府
for( POSTYPE i = 0 ; i < InPosNum ; ++i )
{
POSTYPE pos = InPos[i];
SCItemSlot & ItemSlot = (SCItemSlot &)pInventory->GetSlot(pos);
if( pInventory->IsEmpty(pos) )
{
if( need_num <= MAX_DUP_NUM )
{
slot.SetNum( need_num );
need_num = 0;
}
else
{
slot.SetNum( MAX_DUP_NUM );
need_num -= MAX_DUP_NUM;
}
pInventory->InsertSlot( pos, slot );
if( bAyncSerial )
{
ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
pInventory->SetLock( pos, TRUE );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
msg.m_SlotIdx = SI_INVENTORY;
msg.m_ItemPos = pos;
m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
}
}
else
{
ASSERT( ItemSlot.GetCode() == slot.GetCode() );
ASSERT( ItemSlot.GetNum() < ItemSlot.GetMaxNum() );
if( need_num + ItemSlot.GetNum() > MAX_DUP_NUM )
{
need_num -= MAX_DUP_NUM - ItemSlot.GetNum();
ItemSlot.SetNum( MAX_DUP_NUM );
//pInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, MAX_DUP_NUM, 0, UB_DURA );
}
else
{
ItemSlot.SetNum( need_num + ItemSlot.GetNum() );
//pInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, need_num + ItemSlot.GetNum(), 0, UB_DURA );
need_num = 0;
}
}
if( pTotalInfo )
{
pTotalInfo->m_Slot[total].m_ItemPos = pos;
ItemSlot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
++total; ++pTotalInfo->m_InvenCount;
}
}
// 烙矫 牢亥配府
if( need_num != 0 )
{
for( POSTYPE i = 0 ; i < InPosTmpNum ; ++i )
{
POSTYPE pos = InPosTmp[i];
SCItemSlot & ItemSlot = (SCItemSlot &)pTmpInventory->GetSlot(pos);
if( pTmpInventory->IsEmpty(pos) )
{
if( need_num <= MAX_DUP_NUM )
{
slot.SetNum( need_num );
need_num = 0;
}
else
{
slot.SetNum( MAX_DUP_NUM );
need_num -= MAX_DUP_NUM;
}
pTmpInventory->InsertSlot( pos, slot );
if( bAyncSerial )
{
ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
pTmpInventory->SetLock( pos, TRUE );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
msg.m_SlotIdx = SI_TEMPINVENTORY;
msg.m_ItemPos = pos;
m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
}
}
else
{
ASSERT( ItemSlot.GetCode() == slot.GetCode() );
ASSERT( ItemSlot.GetNum() < ItemSlot.GetMaxNum() );
if( need_num + ItemSlot.GetNum() > MAX_DUP_NUM )
{
need_num -= MAX_DUP_NUM - ItemSlot.GetNum();
//pTmpInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, MAX_DUP_NUM, 0, UB_DURA );
ItemSlot.SetNum(MAX_DUP_NUM);
}
else
{
//pTmpInventory->UpdateSlot( pos, ST_NONE, 0, 0, 0, need_num + ItemSlot.GetNum(), 0, UB_DURA );
ItemSlot.SetNum(need_num + ItemSlot.GetNum());
need_num = 0;
}
}
if( pTotalInfo )
{
pTotalInfo->m_Slot[total].m_ItemPos = pos;
ItemSlot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
++total; ++pTotalInfo->m_TmpInvenCount;
}
}
}
ASSERT( need_num == 0 );
return RC::RC_ITEM_SUCCESS;
}
// 般摹瘤 臼绰 酒捞袍
// SLOTCODE ItemCode : 掘绊磊 窍绰 酒捞袍 内靛
// WORD num : 掘绊磊 窍绰 酒捞袍 俺荐
RC::eITEM_RESULT ItemManager::Obtain( SLOTCODE ItemCode, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
SCItemSlot ItemSlot;
ItemSlot.SetCode( ItemCode );
return Obtain( ItemSlot, num, pTotalInfo );
}
// 可记捞 嘿篮 酒捞袍档 掘阑 荐 乐促.
RC::eITEM_RESULT ItemManager::Obtain( SCItemSlot & IN slot, POSTYPE num, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
if( pTotalInfo )
{
pTotalInfo->m_InvenCount = 0;
pTotalInfo->m_TmpInvenCount = 0;
}
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
// 般磨 荐 乐绰 酒捞袍档 贸府窍扁 困秦! 林籍!
//if( slot.IsOverlap() )
// return RC::RC_ITEM_INVALIDSTATE;
SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
SCSlotContainer * pTmpInventory = GetItemSlotContainer( SI_TEMPINVENTORY );
ASSERT( num > 0 );
//ASSERT( slot.GetSerial() != TEMP_DBSERIAL_VALUE );
// 持阑 傍埃捞 乐绰瘤 眉农
int need_num = num;
need_num -= pInventory->GetMaxSlotNum() - pInventory->GetSlotNum();
if( need_num > 0 )
{
// 牢亥配府狼 后傍埃捞 何练窍促.
need_num -= pTmpInventory->GetMaxSlotNum() - pTmpInventory->GetSlotNum();
if( need_num > 0 )
return RC::RC_ITEM_NOSPACEININVENTORY;
}
BYTE total = 0;
MSG_DG_ITEM_SERIAL_SYN msg;
BOOL bAyncSerial = FALSE;
if( slot.GetSerial() == 0 || num != 1 ) //< 俺荐啊 1啊 酒聪芭唱 矫府倔捞 绝芭唱
{
msg.m_dwKey = m_pPlayer->GetUserKey();
// 持阑 困摹俊 遏阑 吧绊 矫府倔捞 绝绰 酒捞袍阑 持绊! + 矫府倔 惯鞭 夸没
slot.SetSerial( TEMP_DBSERIAL_VALUE ); //< 烙矫 蔼 持扁
bAyncSerial = TRUE;
}
need_num = num;
for( POSTYPE pos = 0 ; pos < pInventory->GetMaxSlotNum() ; ++pos )
{
if( pInventory->IsEmpty(pos) )
{
pInventory->InsertSlot( pos, slot );
if( bAyncSerial )
{
ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
pInventory->SetLock( pos, TRUE );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
msg.m_SlotIdx = SI_INVENTORY;
msg.m_ItemPos = pos;
m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
}
--need_num;
if( pTotalInfo )
{
pTotalInfo->m_Slot[total].m_ItemPos = pos;
slot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
++total; ++pTotalInfo->m_InvenCount;
}
if( need_num == 0 ) break;
}
}
if( need_num != 0 )
{
for( POSTYPE pos = 0 ; pos < pTmpInventory->GetMaxSlotNum() ; ++pos )
{
if( pTmpInventory->IsEmpty(pos) )
{
pTmpInventory->InsertSlot( pos, slot );
if( bAyncSerial )
{
ASSERT( slot.GetSerial() == TEMP_DBSERIAL_VALUE );
pTmpInventory->SetLock( pos, TRUE );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
msg.m_SlotIdx = SI_TEMPINVENTORY;
msg.m_ItemPos = pos;
m_pPlayer->SendToGameDBPServer( &msg, sizeof(msg) );
// --- 牢亥配府 酒捞袍 惯鞭 夸没 ---
}
if( pTotalInfo )
{
pTotalInfo->m_Slot[total].m_ItemPos = pos;
slot.CopyOut(pTotalInfo->m_Slot[total].m_Stream);
++total; ++pTotalInfo->m_TmpInvenCount;
}
--need_num;
if( need_num == 0 ) break;
}
}
}
ASSERT( need_num == 0 );
return RC::RC_ITEM_SUCCESS;
}
RC::eITEM_RESULT ItemManager::Pick( POSTYPE NumberOfItems, SCItemSlot & rItemSlot, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
RC::eITEM_RESULT rt = RC::RC_ITEM_SUCCESS;
if( rItemSlot.IsOverlap() )
{
ASSERT( rItemSlot.GetNum() != 0 );
BYTE num = rItemSlot.GetNum();
rItemSlot.SetNum(1);
rt = ObtainDup( rItemSlot, NumberOfItems*num, pTotalInfo );
}
else
{
rt = Obtain( rItemSlot, NumberOfItems, pTotalInfo );
}
if( rt == RC::RC_ITEM_SUCCESS )
{
// 酒捞袍 凛扁 肺弊
GAMELOG->WriteItemOwner( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &rItemSlot );
// 酒捞袍 凛扁 肺弊 场
}
return rt;
}
// Field俊 乐绰 酒捞袍阑 笼菌促.
// 酒捞袍阑 牢亥配府狼 后傍埃 趣篮 烙矫 牢亥配府俊 茫酒辑 持绢霖促.
// 般磨 荐 乐绰 酒捞袍篮 般摹霸 贸府窍绊 ACK甫 焊辰促.
// 般摹瘤 臼绰 酒捞袍篮 厚悼扁利栏肺 DBP肺 何磐 矫府倔阑 惯鞭罐绊 ACK甫 焊辰促.
RC::eITEM_RESULT ItemManager::Pick( DWORD dwItemObjectKey, INVENTORY_TOTAL_INFO * OUT pTotalInfo )
{
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
if( !ValidContainer(SI_INVENTORY) )
return RC::RC_ITEM_INVALIDSTATE;
ObjectFinder<Item> finder( dwItemObjectKey );
if( !m_pPlayer->GetField()->SearchNeighborFieldItemAt( m_pPlayer->GetSectorIndex(), finder ) )
{
return RC::RC_ITEM_NOTEXISTITEMATFIELD;
}
Item * pItem = finder.GetTargetObject();
SCItemSlot & rItemSlot = pItem->GetItemSlot();
DURATYPE num = 1;
RC::eITEM_RESULT rt = RC::RC_ITEM_SUCCESS;
rt = Pick( num, rItemSlot, pTotalInfo );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -