📄 trademanager.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 + -