📄 itemmanager.cpp
字号:
if( rt == RC::RC_ITEM_SUCCESS )
{
// 清泼捞衬 固记捞衬
// 付阑
if( pItem->GetFromMonsterKey() != 0 )
{
Field * pField = m_pPlayer->GetField();
SharingItem<MSG_CG_ITEM_PICK_ACK> sp(rItemSlot,num,m_pPlayer);
if( pField->GetMap()->GetZoneType() == eZONETYPE_MISSION )
{
// 固记
m_pPlayer->GetField()->ForeachPlayer(sp);
}
else
{
// 付阑, 清泼
sp.SetDistance( 15.0f );
m_pPlayer->GetField()->ForeachNeighborPlayerAt(m_pPlayer->GetSectorIndex(), sp);
}
}
m_pPlayer->GetField()->LeaveField( pItem );
ObjectFactory::Instance()->FreeObject( pItem );
}
return rt;
}
RC::eITEM_RESULT ItemManager::Combine( SLOTIDX fromIndex, POSTYPE fromPos, SLOTIDX toIndex, POSTYPE toPos )
{
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
if( !ValidPos( fromIndex, fromPos ) )
return RC::RC_ITEM_INVALIDPOS;
if( !ValidPos( toIndex, toPos ) )
return RC::RC_ITEM_INVALIDPOS;
if( toIndex == SI_WAREHOUSE )
return RC::RC_ITEM_INVALIDSTATE;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 阿辆 抗寇 贸府
if( fromIndex == toIndex && fromPos == toPos )
return RC::RC_ITEM_INVALIDPOS;
SCSlotContainer * pFromContainer = GetItemSlotContainer( fromIndex );
SCSlotContainer * pToContainer = GetItemSlotContainer( toIndex );
SCItemSlot & rFromSlot = (SCItemSlot &)pFromContainer->GetSlot( fromPos );
SCItemSlot & rToSlot = (SCItemSlot &)pToContainer->GetSlot( toPos );
if( rFromSlot.GetCode() != rToSlot.GetCode() )
{
return RC::RC_ITEM_ITEMCODENOTEQUAL;
}
//BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( rFromSlot.GetCode() );
if( !rFromSlot.GetItemInfo() || (rFromSlot.GetItemInfo() && rFromSlot.GetItemInfo()->m_wType != eITEMTYPE_WASTE ) )
return RC::RC_ITEM_ITEMCODENOTEQUAL;
//BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( pFromSlot->GetCode() );
DURATYPE MAX_COMBINE_NUM = rFromSlot.GetMaxNum();
DURATYPE CombineNum = rFromSlot.GetNum() + rToSlot.GetNum();
if( CombineNum > MAX_COMBINE_NUM )
{
// to slot 俺荐 函版茄促.
//pFromContainer->UpdateSlot( fromPos, ST_NONE, 0, 0, 0, CombineNum - MAX_COMBINE_NUM, 0, UB_DURA );
rFromSlot.SetNum( CombineNum - MAX_COMBINE_NUM );
// to slot 俺荐 函版茄促.
//pToContainer->UpdateSlot( toPos, ST_NONE, 0, 0, 0, MAX_COMBINE_NUM, 0, UB_DURA );
rToSlot.SetNum( MAX_COMBINE_NUM );
}
else
{
// from slot 瘤款促.
//SCSlot * pDelSlot = NULL;
pFromContainer->DeleteSlot( fromPos, NULL );
// to slot 俺荐 函版茄促.
//pToContainer->UpdateSlot( toPos, ST_NONE, 0, 0, 0, CombineNum, 0, UB_DURA );
rToSlot.SetNum( CombineNum );
}
return RC::RC_ITEM_SUCCESS;
}
RC::eITEM_RESULT ItemManager::Divide()
{
return RC::RC_ITEM_SUCCESS;
}
#include <SkillInfoParser.h>
#include "SkillFactory.h"
RC::eITEM_RESULT ItemManager::Use( SLOTIDX atIndex, POSTYPE atPos )
{
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
if( !ValidPos( atIndex, atPos ) )
return RC::RC_ITEM_INVALIDPOS;
SCSlotContainer * pAtContainer = GetItemSlotContainer( atIndex );
SCItemSlot & rAtSlot = (SCItemSlot &)pAtContainer->GetSlot( atPos );
if( !rAtSlot.GetItemInfo() || ( rAtSlot.GetItemInfo() && rAtSlot.GetItemInfo()->m_wType != eITEMTYPE_WASTE) )
{
return RC::RC_ITEM_ISNOTWASTEITEM;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 辆幅俊 蝶扼 瓤苞甫 利侩茄促.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
BASE_ITEMINFO * pInfo = rAtSlot.GetItemInfo();
sSWITCH( pInfo->m_byWasteType )
CASE(eITEMWASTE_HPPOTION)
// can use item ?
RC::eITEM_RESULT rcResult = m_pPlayer->CanUseItem( rAtSlot.GetItemInfo() );
if( rcResult != RC::RC_ITEM_SUCCESS )
{
return rcResult;
}
int iPeriodicTime = 0;
WORD wHeal = 0;
if( pInfo->m_wTimes )
{
iPeriodicTime = pInfo->m_wHealHPTime/pInfo->m_wTimes;
wHeal = pInfo->m_wHealHP/pInfo->m_wTimes;
}
m_pPlayer->PeriodicRecover( eCHAR_STATE_ETC_ITEM_RECOVER_HP, wHeal, 0, pInfo->m_wHealHPTime, iPeriodicTime );
CASE(eITEMWASTE_MPPOTION)
// can use item ?
RC::eITEM_RESULT rcResult = m_pPlayer->CanUseItem( rAtSlot.GetItemInfo() );
if( rcResult != RC::RC_ITEM_SUCCESS )
{
return rcResult;
}
int iPeriodicTime = 0;
WORD wHeal = 0;
if( pInfo->m_wTimes )
{
iPeriodicTime = pInfo->m_wHealHPTime/pInfo->m_wTimes;
wHeal = pInfo->m_wHealHP/pInfo->m_wTimes;
}
m_pPlayer->PeriodicRecover( eCHAR_STATE_ETC_ITEM_RECOVER_MP, 0, wHeal, pInfo->m_wHealHPTime, iPeriodicTime );
CASE(eITEMWASTE_MOVE_SPEED_INC)
// 捞加
SkillExecute( 40001 );
CASE(eITEMWASTE_BASE_PHYSICAL_ATTACKPWR_INC)
// 拱傍
SkillExecute( 40031 );
CASE(eITEMWASTE_BASE_MAGICAL_ATTACKPWR_INC)
// 付傍
SkillExecute( 40021 );
CASE(eITEMWASTE_BASE_PHYSICAL_DEFENSEPWR_INC)
// 拱傍
SkillExecute( 40011 );
CASE(eITEMWASTE_BASE_MAGICAL_DEFENSEPWR_INC)
DEFAULT
SASSERT( NULL, "肋给等 家葛己 酒捞袍 鸥涝" );
eSWITCH
DURATYPE curNum = rAtSlot.GetNum();
if( curNum > 1 )
{
rAtSlot.SetNum( curNum - 1 );
}
else
{
pAtContainer->DeleteSlot( atPos, NULL );
}
return RC::RC_ITEM_SUCCESS;
}
VOID ItemManager::SkillExecute( WORD SkillCode )
{
// 货肺款 胶懦俊 措秦 皋葛府甫 且寸罐绊 胶懦沥焊甫 悸泼茄促.
SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
if( !pBaseSkillInfo )
{
SUNLOG( eCRITICAL_LOG, "[ItemManager::SkillExecute]Invalid SkillCode[%d]", SkillCode);
return;
}
Skill* pNewSkill = (Skill*)SkillFactory::Instance()->AllocSkill( SKILL_TYPE_ACTIVE, pBaseSkillInfo );
if(!pNewSkill)
{
return;
}
WzVector wvResultCurPos;
m_pPlayer->GetPos( &wvResultCurPos );
SkillInfo SkillInfoData;
SkillInfoData.m_SkillCode = SkillCode;
SkillInfoData.m_dwClientSerial = 0;
SkillInfoData.m_wvCurPos = wvResultCurPos;
SkillInfoData.m_wvDestPos = wvResultCurPos;
SkillInfoData.m_dwMainTargetKey = 0;
SkillInfoData.m_wvMainTargetPos = wvResultCurPos;
pNewSkill->Init( m_pPlayer, &SkillInfoData, pBaseSkillInfo );
m_pPlayer->AddSkill( pNewSkill );
}
RC::eITEM_RESULT ItemManager::Sell( SLOTIDX atIndex, POSTYPE atPos )
{
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
if( !ValidPos( atIndex, atPos ) )
return RC::RC_ITEM_INVALIDPOS;
SCSlotContainer * pAtContainer = GetItemSlotContainer( atIndex );
SCItemSlot & rItemSlot = (SCItemSlot &)pAtContainer->GetSlot( atPos );
BASE_ITEMINFO * pInfo = rItemSlot.GetItemInfo();
LEVELTYPE DropLV = pInfo->m_DropLV;
if( rItemSlot.GetSet() == 1 &&
( pInfo->IsArmor() || pInfo->IsWeapon() ) )
{
DropLV = CalcDropLVForDivine(pInfo->m_DropLV);
if( DropLV > MAX_LEVEL ) DropLV = MAX_LEVEL;
}
MONEY PriceOfGoods = rItemSlot.GetPriceForSell();
// m_pPlayer->SetMoney( m_pPlayer->GetMoney() + PriceOfGoods );
m_pPlayer->PlusMoney( PriceOfGoods ); // SetMoney肺 捣 冈绰 何盒 傈何 PlusMoney()肺 背眉吝(泅芒)
DEBUG_CODE( if( PriceOfGoods == 0 &&
rItemSlot.GetItemInfo()->m_wType != eITEMTYPE_WASTE ) SUNLOG( eFULL_LOG, "[ItemManager::Sell] 酒捞袍(%s)颇绰啊拜捞%I64u=0捞促.", pInfo->m_pszName, PriceOfGoods); );
// ItemManager狼 Sell篮 npc客狼 芭贰俊辑父 荤侩等促.
// NPC俊霸 迫扁 肺弊
GAMELOG->WriteItemTradeWithNPC( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &rItemSlot, (DWORD)PriceOfGoods );
// NPC俊霸 迫扁 肺弊 场
pAtContainer->DeleteSlot( atPos, NULL );
return RC::RC_ITEM_SUCCESS;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// @praram
// byNumberOfItemToBuy : m_byDupNum阑 逞阑 荐 绝促.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
RC::eITEM_RESULT ItemManager::Buy( DWORD dwShopListID, BYTE ShopTabIndex, BYTE ShopItemIndex, INVENTORY_TOTAL_INFO * pTotalInfo )
{
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
if( !ValidContainer(SI_INVENTORY) )
return RC::RC_ITEM_INVALIDSTATE;
SHOPINFO * pShopInfo = ShopInfoParser::Instance()->GetShopList(dwShopListID);
if( !pShopInfo )
{
return RC::RC_ITEM_INVALIDSHOPLISTID;
}
if( ShopTabIndex >= SHOPINFO::_MAX_TAB_NUM ||
ShopItemIndex >= SHOPINFO::_MAX_SELLITEM_NUM )
{
return RC::RC_ITEM_OUTOFSHOPITEMINDEX;
}
SHOPINFO::SHOP_ITEM * pShopItem = pShopInfo->GetItemForIndex( ShopTabIndex, ShopItemIndex );
if( !pShopItem )
{
return RC::RC_ITEM_OUTOFSHOPITEMINDEX;
}
SLOTCODE buyItemCode = pShopItem->m_SellItemCode;
BASE_ITEMINFO * pInfo = ItemInfoParser::Instance()->GetItemInfo( buyItemCode );
if( !pInfo ) return RC::RC_ITEM_OUTOFSHOPITEMINDEX;
//!烙矫啊拜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!烙矫啊拜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 捣捞 乐绰瘤 眉农
DURATYPE num = pShopItem->m_SellItemNum;
SCItemSlot slot;
slot.SetCode(buyItemCode);
MONEY PriceOfGoods = slot.GetPriceForBuy()*num;
DEBUG_CODE( if( PriceOfGoods == 0 ) SUNLOG( eFULL_LOG, "[ItemManager::Buy] 版绊!!备涝啊拜捞0捞促."); );
// 捣拌魂
if( m_pPlayer->GetMoney() < PriceOfGoods )
{
return RC::RC_ITEM_HAVENOTMONEY;
}
RC::eITEM_RESULT rt = RC::RC_ITEM_SUCCESS;
if( SCItemSlot::IsOverlap(buyItemCode) )
{
rt = ObtainDup( buyItemCode, num, pTotalInfo );
}
else
{
rt = Obtain( buyItemCode, num, pTotalInfo );
}
if( rt == RC::RC_ITEM_SUCCESS )
{
// m_pPlayer->SetMoney( m_pPlayer->GetMoney() - PriceOfGoods );
m_pPlayer->MinusMoney( PriceOfGoods ); // SetMoney肺 捣 静绰 何盒 傈何 MinusMoney()肺 背眉吝(泅芒)
// ItemManager狼 Sell篮 npc客狼 芭贰俊辑父 荤侩等促.
// NPC俊霸 迫扁 肺弊
GAMELOG->WriteItemTradeWithNPC( m_pPlayer, g_pGameServer->GetServerGUID(), TRUE, &slot, (DWORD)PriceOfGoods );
// NPC俊霸 迫扁 肺弊 场
}
return rt;
}
RC::eITEM_RESULT ItemManager::Lose( SLOTCODE ItemCode, BOOL bAllOfItem )
{
if( !ValidState() )
return RC::RC_ITEM_INVALIDSTATE;
SCSlotContainer * pInventory = GetItemSlotContainer( SI_INVENTORY );
for(POSTYPE i = 0 ; i < pInventory->GetMaxSlotNum() ; ++i )
{
if( pInventory->IsEmpty(i) ) continue;
const SCSlot & rSlot = pInventory->GetSlot(i);
if( rSlot.GetCode() != ItemCode ) continue;
pInventory->DeleteSlot(i, NULL);
// 菩哦 焊晨
MSG_CG_ITEM_LOSE_ACK msg;
msg.m_ItemPos = i;
m_pPlayer->SendPacket( &msg, sizeof(msg) );
if( bAllOfItem ) return RC::RC_ITEM_SUCCESS;
}
return RC::RC_ITEM_SUCCESS;
}
// 荤侩惑 林狼痢!!!
// 馆靛矫 己傍窍绰 牢磊蔼父阑 持绢具 茄促.
// 溜, 蜡瓤己 眉农甫 茄 牢磊父 持绢具 茄促.
VOID ItemManager::Lose( SCSlotContainer * pContainer, POSTYPE pos, BYTE num )
{
SCItemSlot & rSlotItem = (SCItemSlot &)pContainer->GetSlot(pos);
if( rSlotItem.GetNum() > num )
{
//pContainer->UpdateSlot( rSlotItem.GetPos(), ST_NONE,0,0,0,rSlotItem.GetDura()-1,0, UB_DURA );
rSlotItem.SetNum( rSlotItem.GetNum() - num );
}
else
{
pContainer->DeleteSlot( rSlotItem.GetPos(), NULL );
}
}
BOOL ItemManager::IsExistItemDup( SLOTIDX idx, SLOTCODE code, BYTE num,
POSTYPE * OUT pPosArray, POSTYPE & INOUT posNum )
{
posNum = 0;
POSTYPE maxPos = posNum;
SCSlotContainer * pContainer = GetItemSlotContainer( idx );
for( POSTYPE i = 0 ; i < pContainer->GetMaxSlotNum() ; ++i )
{
if( !pContainer->IsEmpty(i) )
{
SCSlot & slot = pContainer->GetSlot(i);
if( slot.GetCode() == code )
{
if( maxPos < posNum ) return FALSE;
pPosArray[posNum++] = i;
if( posNum == num ) return TRUE;
}
}
}
return FALSE;
}
BOOL ItemManager::IsExistItem( SLOTIDX idx, SLOTCODE code, DURATYPE dupNum,/*吝汗登绰巴父秦寸,郴备档(X)*/
POSTYPE * OUT pPosArray, POSTYPE & INOUT posNum )
{
posNum = 0;
BYTE InsufficientNum = dupNum;
POSTYPE maxPos = posNum;
SCSlotContainer * pContainer = GetItemSlotContainer( idx );
for( POSTYPE i = 0 ; i < pContainer->GetMaxSlotNum() ; ++i )
{
if( !pContainer->IsEmpty(i) )
{
SCSlot & slot = pContainer->GetSlot(i);
if( slot.GetCode() == code )
{
if( maxPos < posNum ) return FALSE;
pPosArray[posNum++] = i;
ASSERT( slot.GetNum()!= 0 );
if( InsufficientNum <= slot.GetNum() ) return TRUE;
InsufficientNum -= slot.GetNum();
}
}
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -