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

📄 trademanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "StdAfx.h"
#include ".\trademanager.h"
#include ".\TradeSlot.h"
#include ".\Player.h"
#include ".\ItemManager.h"
#include ".\SCItemSlotContainer.h"
#include <SCItemSlot.h>
#include ".\TradeSlotContainer.h"
#include "GameServer.h"

TradeManager g_TradeManager;
TradeManager::TradeManager(void)
{
}

TradeManager::~TradeManager(void)
{
	Release();
}

VOID TradeManager::Init( DWORD maxPoolSize )
{
	m_TradeKey = 0;
	m_pTradePool.Initialize( maxPoolSize );
}

VOID TradeManager::Release()
{
	m_pTradePool.Release();
}

BOOL TradeManager::CreateTradeContainer( Player * pPlayer1, Player * pPlayer2 )
{
	TradeSlotContainer * pContainer1 = _Create();
	if( !pContainer1 )
		return FALSE;
	TradeSlotContainer * pContainer2 = _Create();
	if( !pContainer2 )
	{
		_Destroy(pContainer1);
		return FALSE;
	}

	if( pPlayer1->GetBehave() == PLAYER_BEHAVE_TRADE_STATE ||
		pPlayer2->GetBehave() == PLAYER_BEHAVE_TRADE_STATE )
		return FALSE;
	

	ASSERT( NULL == pPlayer1->GetTradeContainer() );
	ASSERT( NULL == pPlayer2->GetTradeContainer() );

	pPlayer1->SetTradeContainer( pContainer1 );
	pPlayer2->SetTradeContainer( pContainer2 );

	DWORD key = ++m_TradeKey;
	pContainer1->Init( pPlayer1, pPlayer2, key );
	pContainer2->Init( pPlayer2, pPlayer1, key );

	pPlayer1->SetBehave(PLAYER_BEHAVE_TRADE_STATE);
	pPlayer2->SetBehave(PLAYER_BEHAVE_TRADE_STATE);

	return TRUE;
}

BOOL TradeManager::DestroyTradeContainer( Player * pPlayer )
{
	if( pPlayer->GetBehave() != PLAYER_BEHAVE_TRADE_STATE )
		return FALSE;

	ASSERT( pPlayer->GetTradeContainer() );
	Player * pPlayer2 = pPlayer->GetTradeContainer()->GetCounterPlayer();
	ASSERT( pPlayer->GetBehave() == PLAYER_BEHAVE_TRADE_STATE );

	pPlayer->SetBehave(PLAYER_BEHAVE_IDLE_STATE);
	pPlayer2->SetBehave(PLAYER_BEHAVE_IDLE_STATE);

	_Destroy(pPlayer->GetTradeContainer());
	_Destroy(pPlayer2->GetTradeContainer());

	pPlayer->SetTradeContainer( NULL );
	pPlayer2->SetTradeContainer( NULL );

	return TRUE;
}

BOOL TradeManager::ValidState( Player * pPlayer )
{
	if( pPlayer->IsExpiredPlayer() || pPlayer->GetBehave() != PLAYER_BEHAVE_TRADE_STATE )
		return FALSE;

	ASSERT( pPlayer->GetTradeContainer() );

	Player * pPlayer2 = pPlayer->GetTradeContainer()->GetCounterPlayer();

	if( pPlayer2->IsExpiredPlayer() || pPlayer2->GetBehave() != PLAYER_BEHAVE_TRADE_STATE )
		return FALSE;
	ASSERT( pPlayer2->GetTradeContainer() );

	ASSERT( pPlayer->GetTradeContainer()->GetKey() == pPlayer2->GetTradeContainer()->GetKey() );

	return TRUE;
}

RC::eTRADE_RESULT TradeManager::PutItem( Player * pPlayer, POSTYPE org_pos, POSTYPE & OUT trade_pos, ITEMSTREAMEX & OUT trade_itemStream )
{
	TradeSlotContainer * pContainer = pPlayer->GetTradeContainer();

	if( !ValidState(pPlayer) )
		return RC::RC_TRADE_CANCEL;

	if( pContainer->GetState() != READY )
		return RC::RC_TRADE_FAILED;

	SCSlotContainer * pInventoryContainer = pPlayer->GetItemManager()->GetItemSlotContainer(SI_INVENTORY);
	if( !pInventoryContainer->ValidPos( org_pos ) || pInventoryContainer->IsEmpty( org_pos ) )
		return RC::RC_TRADE_FAILED;

	SCSlot & rSlot = pInventoryContainer->GetSlot( org_pos );

	// 后傍埃俊 茫酒辑 持澜
	if( !pContainer->PutItem( (SCItemSlot &)rSlot, trade_pos ) )
		return RC::RC_TRADE_FAILED;

	((SCItemSlot &)rSlot).CopyOut( trade_itemStream );

	return RC::RC_TRADE_SUCCESS;
}

RC::eTRADE_RESULT TradeManager::TakeItem( Player * pPlayer, POSTYPE trade_pos )
{
	TradeSlotContainer * pContainer = pPlayer->GetTradeContainer();

	if( !ValidState(pPlayer) )
		return RC::RC_TRADE_CANCEL;

	if( pContainer->GetState() != READY )
		return RC::RC_TRADE_FAILED;

	if( !pContainer->ValidPos( trade_pos ) || pContainer->IsEmpty(trade_pos ) )
		return RC::RC_TRADE_FAILED;

	pContainer->TakeItem( trade_pos );

	return RC::RC_TRADE_SUCCESS;
}

RC::eTRADE_RESULT TradeManager::PutMoney( Player * pPlayer, MONEY & IN money )
{
	TradeSlotContainer * pContainer = pPlayer->GetTradeContainer();

	if( !ValidState(pPlayer) )
		return RC::RC_TRADE_CANCEL;

	if( pContainer->GetState() != READY )
		return RC::RC_TRADE_FAILED;

	if( !pContainer->PutMoney( money ) )
		return RC::RC_TRADE_FAILED;

	return RC::RC_TRADE_SUCCESS;
}

RC::eTRADE_RESULT TradeManager::TakeMoney( Player * pPlayer, MONEY & IN money )
{
	TradeSlotContainer * pContainer = pPlayer->GetTradeContainer();

	if( !ValidState(pPlayer) )
		return RC::RC_TRADE_CANCEL;

	if( pContainer->GetState() != READY )
		return RC::RC_TRADE_FAILED;

	if( !pContainer->TakeMoney( money ) )
		return RC::RC_TRADE_FAILED;

	return RC::RC_TRADE_SUCCESS;
}

RC::eTRADE_RESULT TradeManager::Proposal( Player * pPlayer )
{
	TradeSlotContainer * pContainer = pPlayer->GetTradeContainer();

	if( !ValidState(pPlayer) )
		return RC::RC_TRADE_CANCEL;

	if( pContainer->GetState() != READY )
		return RC::RC_TRADE_FAILED;

	pContainer->SetState( PROPOSAL );

	return RC::RC_TRADE_SUCCESS;
}

RC::eTRADE_RESULT TradeManager::Modify( Player * pPlayer )
{
	TradeSlotContainer * pContainer = pPlayer->GetTradeContainer();
	if( !ValidState(pPlayer) )
		return RC::RC_TRADE_CANCEL;

	Player * pPlayer2 = pContainer->GetCounterPlayer();
	TradeSlotContainer * pContainer2 = pPlayer2->GetTradeContainer();

	if( pContainer->GetState() != PROPOSAL )
		return RC::RC_TRADE_FAILED;
	if( pContainer2->GetState() == ACCEPT )
	{
		pContainer2->SetState(PROPOSAL);
		return RC::RC_TRADE_FAILED;
	}

	pContainer->SetState( READY );

	return RC::RC_TRADE_SUCCESS;
}

RC::eTRADE_RESULT TradeManager::Exchange( Player * pPlayer1, TRADE_TOTAL_INFO & OUT rTradeInfo1, MONEY & OUT money1, TRADE_TOTAL_INFO & OUT rTradeInfo2, MONEY & OUT money2 )
{
	if( !ValidState(pPlayer1) )
		return RC::RC_TRADE_CANCEL;

	TradeSlotContainer * pContainer1 = pPlayer1->GetTradeContainer();
	Player * pPlayer2 = pContainer1->GetCounterPlayer();
	TradeSlotContainer * pContainer2 = pPlayer2->GetTradeContainer();

	if( pContainer1->GetState() < PROPOSAL || pContainer2->GetState() < PROPOSAL )
		return RC::RC_TRADE_COUNTERPARTNER_NOTPROPOSAL;

	// 笛促 proposal老 锭
	if( pContainer1->GetState() == PROPOSAL && pContainer2->GetState() == PROPOSAL )
	{
		pContainer1->SetState(ACCEPT);
		return RC::RC_TRADE_COUNTERPARTNER_NOTACCEPT;
	}

	// 郴啊 Proposal捞绊 惑措规捞 Accept老 锭父 啊瓷
	if( !(pContainer1->GetState() == PROPOSAL &&
		pContainer2->GetState() == ACCEPT) )
		return RC::RC_TRADE_INVALID_STATE;

	pContainer1->SetState(ACCEPT);

	// 笛促 Accept

	SCSlotContainer * pInventoryContainer1 = pPlayer1->GetItemManager()->GetItemSlotContainer(SI_INVENTORY);
	SCSlotContainer * pInventoryContainer2 = pPlayer2->GetItemManager()->GetItemSlotContainer(SI_INVENTORY);
	SCSlotContainer * pTmpContainer1 = pPlayer1->GetItemManager()->GetItemSlotContainer(SI_TEMPINVENTORY);
	SCSlotContainer * pTmpContainer2 = pPlayer2->GetItemManager()->GetItemSlotContainer(SI_TEMPINVENTORY);

	POSTYPE EmptySlotNum1 = pInventoryContainer1->GetMaxSlotNum() - pInventoryContainer1->GetSlotNum();
	POSTYPE EmptySlotNum2 = pInventoryContainer2->GetMaxSlotNum() - pInventoryContainer2->GetSlotNum();

	POSTYPE EmptyTmpSlotNum1 = pTmpContainer1->GetMaxSlotNum() - pTmpContainer1->GetSlotNum();
	POSTYPE EmptyTmpSlotNum2 = pTmpContainer2->GetMaxSlotNum() - pTmpContainer2->GetSlotNum();

	if( EmptySlotNum2 < pContainer1->GetSlotNum() )
	{
		// 2锅掳 敲饭捞绢狼 牢亥配府啊 菜谩促.
		if( EmptySlotNum2 + EmptyTmpSlotNum2 < pContainer1->GetSlotNum() )
			return RC::RC_TRADE_PLAYER2_HAVENOTSPACE;
	}

	if( EmptySlotNum1 < pContainer2->GetSlotNum() )
	{
		// 1锅掳 敲饭捞绢狼 牢亥配府啊 菜谩促.
		if( EmptySlotNum1 + EmptyTmpSlotNum1 < pContainer2->GetSlotNum() )
			return RC::RC_TRADE_PLAYER1_HAVENOTSPACE;
	}

	// 捣捞 乐绰瘤 眉农
	if(  pPlayer1->GetMoney() < pContainer1->GetMoney() )
	{
		return RC::RC_TRADE_PLAYER1_HAVENOTMONEY;
	}
	if(  pPlayer2->GetMoney() < pContainer2->GetMoney())
	{
		return RC::RC_TRADE_PLAYER2_HAVENOTMONEY;
	}

	//风橇 倒搁辑 盲快扁
	TradeSlot * pTradeSlot1[MAX_TRADE_SLOT_NUM];
	POSTYPE tradeItemNum1 = 0;
	// 1锅掳 敲饭捞绢狼 酒捞袍阑 2锅掳 敲饭捞绢俊霸 霖促
	for( int i = pContainer1->GetMaxSlotNum()-1 ; i >= 0  ; --i )
	{
		if( !pContainer1->IsEmpty(i) )
		{
			TradeSlot & rTradeSlot = (TradeSlot &)pContainer1->GetSlot(i);
			pTradeSlot1[tradeItemNum1++] = &rTradeSlot;
		}
	}

	// 2锅掳 敲饭捞绢俊霸 霖促
	rTradeInfo2.m_InvenCount = 0;
	rTradeInfo2.m_TmpInvenCount = 0;
	POSTYPE num = tradeItemNum1;
	_GiveItem( pInventoryContainer2, pTradeSlot1, num, rTradeInfo2, rTradeInfo2.m_InvenCount );
	if( num != 0 )
	{
		// 烙矫 牢亥配府 盲快扁
		_GiveItem( pTmpContainer2, pTradeSlot1, num, rTradeInfo2, rTradeInfo2.m_TmpInvenCount );
	}
	ASSERT( num == 0 );

	// 俺牢芭贰 肺弊 巢扁扁..(player1 扁霖 栏肺 "林扁")
	for( i = 0 ; i < tradeItemNum1; i++)
	{
		SCItemSlot* pItemSlot = pTradeSlot1[i]->GetLinkItem();
		if(pItemSlot == NULL)	continue;

		// 家葛己 酒捞袍 咯何客 俺荐 备窍扁
		GAMELOG->WriteItemTradeWithPlayer( pPlayer1, g_pGameServer->GetServerGUID(), TRUE, pItemSlot, pPlayer2 );
	}
	// 俺牢芭贰 肺弊 巢扁扁..(player1 扁霖 栏肺 "林扁") 场


	// 2锅掳 敲饭捞绢狼 酒捞袍阑 1锅掳 敲饭捞绢俊霸 霖促
	TradeSlot * pTradeSlot2[MAX_TRADE_SLOT_NUM];
	POSTYPE tradeItemNum2 = 0;
	for( int i = pContainer2->GetMaxSlotNum()-1 ; i >= 0  ; --i )
	{
		if( !pContainer2->IsEmpty(i) )
		{
			TradeSlot & rTradeSlot = (TradeSlot &)pContainer2->GetSlot(i);
			pTradeSlot2[tradeItemNum2++] = &rTradeSlot;
		}
	}

	// 1锅掳 敲饭捞绢俊霸 霖促
	rTradeInfo1.m_InvenCount = 0;
	rTradeInfo1.m_TmpInvenCount = 0;
	POSTYPE num2 = tradeItemNum2;
	_GiveItem( pInventoryContainer1, pTradeSlot2, num2, rTradeInfo1, rTradeInfo1.m_InvenCount );
	if( num2 != 0 )
	{
		// 烙矫 牢亥配府 盲快扁
		_GiveItem( pTmpContainer1, pTradeSlot2, num2, rTradeInfo1, rTradeInfo1.m_TmpInvenCount );
	}
	ASSERT( num2 == 0 );

	// 酒捞袍 背券 肺弊 巢扁扁..(player1 扁霖 栏肺 "罐扁")
	for( i = 0 ; i < tradeItemNum2; i++)
	{
		SCItemSlot* pItemSlot = pTradeSlot2[i]->GetLinkItem();
		if(pItemSlot == NULL)	continue;
		GAMELOG->WriteItemTradeWithPlayer( pPlayer1, g_pGameServer->GetServerGUID(), FALSE, pItemSlot, pPlayer2 );
	}
	// 酒捞袍 背券 肺弊 巢扁扁..(player1 扁霖 栏肺 "罐扁") 场

	
	// 牢亥配府狼 盔贰 酒捞袍 瘤快扁
	// 烙矫 牢亥配府狼 盔贰 酒捞袍 瘤快扁
	for( POSTYPE i = 0 ; i < rTradeInfo2.m_InvenCount ; ++i )
	{
		pInventoryContainer1->DeleteSlot( pTradeSlot1[i]->GetLinkItem()->GetPos(), NULL );
	}
	for( POSTYPE i = rTradeInfo2.m_InvenCount ; i < rTradeInfo2.m_InvenCount+rTradeInfo2.m_TmpInvenCount ; ++i )
	{
		pInventoryContainer1->DeleteSlot( pTradeSlot1[i]->GetLinkItem()->GetPos(), NULL );
	}
	for( POSTYPE i = 0 ; i < rTradeInfo1.m_InvenCount ; ++i )
	{
		pInventoryContainer2->DeleteSlot( pTradeSlot2[i]->GetLinkItem()->GetPos(), NULL );
	}
	for( POSTYPE i = rTradeInfo1.m_InvenCount ; i < rTradeInfo1.m_InvenCount+rTradeInfo1.m_TmpInvenCount ; ++i )
	{
		pInventoryContainer2->DeleteSlot( pTradeSlot2[i]->GetLinkItem()->GetPos(), NULL );
	}
	
	// 捣芭贰
	pPlayer1->PlusMoney( pContainer2->GetMoney() );
	pPlayer2->MinusMoney( pContainer2->GetMoney() );

	pPlayer2->PlusMoney( pContainer1->GetMoney() );
	pPlayer1->MinusMoney( pContainer1->GetMoney() );

	// 捣芭贰 肺弊 巢扁扁(林扁)
	GAMELOG->WriteMoneyTradeWithPlayer( pPlayer1, g_pGameServer->GetServerGUID(), TRUE, (DWORD)pContainer1->GetMoney(), pPlayer2 );
	// 捣芭贰 肺弊 巢扁扁(罐扁)
	GAMELOG->WriteMoneyTradeWithPlayer( pPlayer1, g_pGameServer->GetServerGUID(), FALSE, (DWORD)pContainer2->GetMoney(), pPlayer2 );

	money1 = pPlayer1->GetMoney();
	money2 = pPlayer2->GetMoney();

	// 芭贰芒 葛滴 瘤快扁
	pContainer1->ClearAll();
	pContainer2->ClearAll();

	return RC::RC_TRADE_SUCCESS;
}


// SCSlotContainer * pContainer : 林绊磊窍绰 牧抛捞呈
// TradeSlot **& prSlot			: 临 酒捞袍 沥焊
// POSTYPE & INOUT num			: 临 酒捞袍 (巢篮) 俺荐
// TRADE_TOTAL_INFO & OUT Info  : 霖 牧抛捞呈 困摹, 酒捞袍 沥焊
VOID TradeManager::_GiveItem( SCSlotContainer * pContainer, TradeSlot ** ppSlot, POSTYPE & INOUT num, TRADE_TOTAL_INFO & OUT Info, BYTE & OUT Count )
{
	if( num == 0 ) return ;
	for( POSTYPE i = 0 ; i < pContainer->GetMaxSlotNum() ; ++i )
	{
		if( pContainer->IsEmpty(i) )
		{
			Info.m_Slot[Count].m_ItemPos = i;
			ppSlot[num-1]->GetLinkItem()->SetLock(FALSE);
			ppSlot[num-1]->GetLinkItem()->CopyOut( Info.m_Slot[Count].m_Stream );
			pContainer->InsertSlot(i, *(ppSlot[num-1]->GetLinkItem()) );
			--num;
			++Count;
			if( num == 0 ) break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -