⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vendormanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -