📄 vendormanager.cpp
字号:
#include "StdAfx.h"
#include ".\vendormanager.h"
#include ".\VendorSlotContainer.h"
#include ".\Player.h"
#include ".\VendorSlot.h"
#include ".\ItemManager.h"
#include ".\SCItemSlotContainer.h"
#include ".\GameServer.h"
VendorManager g_VendorManager;
VendorManager::VendorManager(void)
{
m_pVendorPool.Initialize( MAX_PERSONAL_VENDOR_SLOT_NUM*4 );
}
VendorManager::~VendorManager(void)
{
m_pVendorPool.Release();
}
BOOL VendorManager::ValidEstablisherState( Player * pPlayer )
{
if( !pPlayer->GetField() )
return FALSE;
if( pPlayer->GetBehave() != PLAYER_BEHAVE_VENDOR_ESTABLISHER_STATE )
return FALSE;
return TRUE;
}
BOOL VendorManager::ValidObserverState( Player * pPlayer )
{
if( !pPlayer->GetField() )
return FALSE;
if( pPlayer->GetBehave() != PLAYER_BEHAVE_VENDOR_OBSERVER_STATE )
return FALSE;
return TRUE;
}
RC::eVENDOR_RESULT VendorManager::StartVendor( Player * pEstablishedPlayer, TCHAR * pTitle, ESTABLISHER_VENDOR_TOTAL_INFO & IN TotalInfo )
{
if( pEstablishedPlayer->GetBehave() != PLAYER_BEHAVE_IDLE_STATE || !pEstablishedPlayer->GetField() )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = _Alloc();
ASSERT( pContainer );
if( !pContainer->CreateVendor( pEstablishedPlayer, pTitle, TotalInfo ) )
{
_Free( pContainer );
return RC::RC_VENDOR_FAILED;
}
pEstablishedPlayer->SetVendorContainer(pContainer);
pEstablishedPlayer->SetBehave(PLAYER_BEHAVE_VENDOR_ESTABLISHER_STATE);
return RC::RC_VENDOR_SUCCESS;
}
// 龋免窍扁 傈俊 林函 敲饭捞绢俊霸 惑痢阑 辆丰茄促绊 舅赴促.
RC::eVENDOR_RESULT VendorManager::EndVendor( Player * pEstablishedPlayer )
{
if( pEstablishedPlayer->GetBehave() != PLAYER_BEHAVE_VENDOR_ESTABLISHER_STATE )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pEstablishedPlayer->GetVendorContainer();
ASSERT( pContainer );
pContainer->DestroyVendor();
_Free( pContainer );
pEstablishedPlayer->SetVendorContainer(NULL);
pEstablishedPlayer->SetBehave(PLAYER_BEHAVE_IDLE_STATE);
return RC::RC_VENDOR_SUCCESS;
}
RC::eVENDOR_RESULT VendorManager::ModifyRequest( Player * pEstablishedPlayer, POSTYPE VendorPos )
{
if( !ValidEstablisherState(pEstablishedPlayer) )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pEstablishedPlayer->GetVendorContainer();
ASSERT( pContainer );
if( !pContainer->ValidPos(VendorPos) || pContainer->IsEmpty(VendorPos) || pContainer->IsLocked(VendorPos) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
// 弊 困摹狼 惑痢 酒捞袍阑 遏阑 扒促.
pContainer->SetLock( VendorPos, TRUE );
return RC::RC_VENDOR_SUCCESS;
}
RC::eVENDOR_RESULT VendorManager::ModifyCancel( Player * pEstablishedPlayer, POSTYPE VendorPos )
{
if( !ValidEstablisherState(pEstablishedPlayer) )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pEstablishedPlayer->GetVendorContainer();
ASSERT( pContainer );
if( !pContainer->ValidPos(VendorPos) || pContainer->IsEmpty(VendorPos) || !pContainer->IsLocked(VendorPos) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
pContainer->SetLock( VendorPos, FALSE );
return RC::RC_VENDOR_SUCCESS;
}
// 函版
RC::eVENDOR_RESULT VendorManager::Modify( Player * pEstablishedPlayer, VENDOR_ITEMSLOT & IN SlotInfo, VENDOR_ITEMSLOTEX & OUT ModifiedSlotInfo )
{
if( !ValidEstablisherState(pEstablishedPlayer) )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pEstablishedPlayer->GetVendorContainer();
ASSERT( pContainer );
if( !pContainer->ValidPos(SlotInfo.m_VendorPos) || !pContainer->IsLocked(SlotInfo.m_VendorPos) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
if( !pContainer->ModifySlot( SlotInfo.m_VendorPos, SlotInfo ) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
VendorSlot & rSlot = (VendorSlot &)pContainer->GetSlot(SlotInfo.m_VendorPos);
rSlot.CopyOut( ModifiedSlotInfo );
return RC::RC_VENDOR_SUCCESS;
}
// 眠啊
RC::eVENDOR_RESULT VendorManager::Insert( Player * pEstablishedPlayer, VENDOR_ITEMSLOT & IN SlotInfo, VENDOR_ITEMSLOTEX & OUT ModifiedSlotInfo )
{
if( !ValidEstablisherState(pEstablishedPlayer) )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pEstablishedPlayer->GetVendorContainer();
ASSERT( pContainer );
if( !pContainer->ValidPos(SlotInfo.m_VendorPos) || !pContainer->IsEmpty(SlotInfo.m_VendorPos) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
if( !pContainer->ModifySlot( SlotInfo.m_VendorPos, SlotInfo ) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
VendorSlot & rSlot = (VendorSlot &)pContainer->GetSlot(SlotInfo.m_VendorPos);
rSlot.CopyOut( ModifiedSlotInfo );
return RC::RC_VENDOR_SUCCESS;
}
RC::eVENDOR_RESULT VendorManager::Delete( Player * pEstablishedPlayer, POSTYPE VendorPos )
{
if( !ValidEstablisherState(pEstablishedPlayer) )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pEstablishedPlayer->GetVendorContainer();
ASSERT( pContainer );
// 遏捞 吧赴巴阑 瘤匡 荐 乐促!
if( !pContainer->ValidPos(VendorPos) || pContainer->IsEmpty(VendorPos) || pContainer->IsLocked(VendorPos) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
pContainer->DeleteSlot( VendorPos, NULL );
return RC::RC_VENDOR_SUCCESS;
}
RC::eVENDOR_RESULT VendorManager::StartViewVendor( Player * pEstablisher, Player * pObserver, TCHAR * OUT tszVenderTitle, VENDOR_TOTAL_INFO & OUT VendorTotalInfo )
{
if( !ValidEstablisherState(pEstablisher) )
return RC::RC_VENDOR_INVALID_STATE;
if( pObserver->GetBehave() != PLAYER_BEHAVE_IDLE_STATE || !pObserver->GetField() )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pEstablisher->GetVendorContainer();
ASSERT( pContainer );
memcpy( tszVenderTitle, pContainer->GetTitle(), sizeof(TCHAR)*MAX_VENDOR_TITLE_LENGTH );
pContainer->GetTotalInfo(VendorTotalInfo);
pContainer->AddObserver( pObserver );
pObserver->SetVendorContainer(pContainer);
pObserver->SetBehave(PLAYER_BEHAVE_VENDOR_OBSERVER_STATE);
return RC::RC_VENDOR_SUCCESS;
}
RC::eVENDOR_RESULT VendorManager::EndViewVendor( Player * pObserver )
{
if( pObserver->GetBehave() != PLAYER_BEHAVE_VENDOR_OBSERVER_STATE )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pObserver->GetVendorContainer();
ASSERT( pContainer );
pContainer->RemoveObserver( pObserver );
pObserver->SetVendorContainer(NULL);
pObserver->SetBehave(PLAYER_BEHAVE_IDLE_STATE);
return RC::RC_VENDOR_SUCCESS;
}
RC::eVENDOR_RESULT VendorManager::Buy( Player * pObserver, POSTYPE VendorPos, INVENTORY_TOTAL_INFO & OUT TotalInfo )
{
if( !ValidObserverState(pObserver) )
return RC::RC_VENDOR_INVALID_STATE;
VendorSlotContainer * pContainer = pObserver->GetVendorContainer();
ASSERT( pContainer );
// 遏捞 吧赴巴阑 备涝且 荐 绝促.
if( !pContainer->ValidPos(VendorPos) || pContainer->IsEmpty(VendorPos) || pContainer->IsLocked(VendorPos) )
{
return RC::RC_VENDOR_INVALID_VENDORSLOT;
}
// 混 捣捞 粮犁窍绰 瘤 眉农
VendorSlot & rVSlot = (VendorSlot &)pContainer->GetSlot(VendorPos);
if( pObserver->GetMoney() < rVSlot.GetMoney() )
return RC::RC_VENDOR_INVALID_VENDORSLOT;
// 眉农
ItemManager * pMGR = pObserver->GetItemManager();
SCSlotContainer * pInventory = pMGR->GetItemSlotContainer( SI_INVENTORY );
SCSlotContainer * pTmpInventory = pMGR->GetItemSlotContainer( SI_TEMPINVENTORY );
// 持阑 牢亥配府 傍埃捞 乐绰瘤 眉农
if( pInventory->GetMaxSlotNum() - pInventory->GetSlotNum() < 1 )
{
// 持阑 烙矫 牢亥配府狼 傍埃捞 乐绰瘤 眉农
if( pTmpInventory->GetMaxSlotNum() - pTmpInventory->GetSlotNum() < 1 )
return RC::RC_VENDOR_NOSPACEININVENTORY;
}
// 惑痢 浇吩 瘤框
VendorSlot DeletedVendorSlot;
pContainer->DeleteSlot( VendorPos, &DeletedVendorSlot );
Player * pEstablisher = pContainer->GetEstablisher();
// 捣 拌魂
DWORD dwMoney = (DWORD)DeletedVendorSlot.GetMoney();
// pObserver->SetMoney( pObserver->GetMoney() - DeletedVendorSlot.GetMoney() );
pObserver->MinusMoney( DeletedVendorSlot.GetMoney() ); // SetMoney肺 捣 静绰 何盒 傈何 MinusMoney()肺 背眉吝(泅芒)
// pEstablisher->SetMoney( pEstablisher->GetMoney() + DeletedVendorSlot.GetMoney() );
pEstablisher->PlusMoney( DeletedVendorSlot.GetMoney() ); // SetMoney肺 捣 冈绰 何盒 傈何 PlusMoney()肺 背眉吝(泅芒)
SCItemSlot ItemSlot;
ItemSlot.Copy( *DeletedVendorSlot.GetLinkItem() );
RC::eITEM_RESULT rt = pMGR->Obtain( ItemSlot, 1, &TotalInfo );
ASSERT( rt == RC::RC_ITEM_SUCCESS );
// 俺汲磊狼 盔贰 酒捞袍档 瘤框
SCSlotContainer * pEstInventory = pEstablisher->GetItemManager()->GetItemSlotContainer( SI_INVENTORY );
pEstInventory->DeleteSlot( DeletedVendorSlot.GetLinkItem()->GetPos(), NULL );
// 俺牢惑痢 肺弊 巢扁扁
// 俺牢惑痢篮 酒捞袍阑 茄锅俊 茄俺究 观俊 荤瘤 给茄促.
// 抗甫 甸绢 5俺啊 棵扼客 乐绢档, 荤侩磊绰 茄锅俊 窍唱究 魂促.
//LONG nItemCount = 1;
//if( ItemSlot.IsOverlap() == TRUE ) nItemCount = ItemSlot.GetNum();
ITEMLOGINFO logInfo;
logInfo.nItemCode = ItemSlot.GetCode();
logInfo.nItemSerial = ItemSlot.GetSerial();
logInfo.nItemCount = ItemSlot.GetNum();
// 俺牢惑痢(荤扁)
GAMELOG->WriteItemVendorWithPlayer( pObserver, g_pGameServer->GetServerGUID(), FALSE, &ItemSlot, dwMoney, pEstablisher );
// 俺牢惑痢(迫扁)
GAMELOG->WriteItemVendorWithPlayer( pEstablisher, g_pGameServer->GetServerGUID(), TRUE, &ItemSlot, dwMoney, pObserver );
SUNLOG( eFULL_LOG, "[VendorManager::Buy] %s啊 %s 俊霸辑 %d甫 荤促", pObserver->GetCharName(), pEstablisher->GetCharName(), ItemSlot.GetCode() );
// 俺牢惑痢 肺弊 巢扁扁 场
ASSERT( (TotalInfo.m_InvenCount+TotalInfo.m_TmpInvenCount) == 1 );
return RC::RC_VENDOR_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -