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

📄 exchangeroom.cpp

📁 墨香最新私服
💻 CPP
字号:
#include "stdafx.h"
#include "ExchangeRoom.h"
#include "ExchangeManager.h"
#include "mapdbmsgparser.h"
#include "Player.h"
#include "ItemManager.h"

CExchangeRoom::CExchangeRoom()
{
	
}

CExchangeRoom::~CExchangeRoom()
{

}

void CExchangeRoom::Init( CPlayer* pPlayer1, CPlayer* pPlayer2 )
{
	sEXCHANGECONTAINER ExchangeContainer;

	m_ExchangeData[0].pPlayer		= pPlayer1;
	m_ExchangeData[0].bExchange		= FALSE;
	m_ExchangeData[0].bLock			= FALSE;
	m_ExchangeData[0].dwMoney		= 0;
	m_ExchangeData[0].nAddItemNum	= 0;
	ZeroMemory( m_ExchangeData[0].ItemInfo, sizeof(ITEMBASE)*MAX_EXCHANGEITEM );

	m_ExchangeData[1].pPlayer		= pPlayer2;
	m_ExchangeData[1].bExchange		= FALSE;
	m_ExchangeData[1].bLock			= FALSE;
	m_ExchangeData[1].dwMoney		= 0;
	m_ExchangeData[1].nAddItemNum	= 0;
	ZeroMemory( m_ExchangeData[1].ItemInfo, sizeof(ITEMBASE)*MAX_EXCHANGEITEM );

	ExchangeContainer.pRoom		= this;

	ExchangeContainer.nMyIndex	= 0;
	ExchangeContainer.pOpPlayer = pPlayer2;
	pPlayer1->SetExchangeContainer( &ExchangeContainer );

	ExchangeContainer.nMyIndex	= 1;
	ExchangeContainer.pOpPlayer = pPlayer1;
	pPlayer2->SetExchangeContainer( &ExchangeContainer );

	m_nExchangeState = EXCS_WAITING;
}

void CExchangeRoom::Exit()
{
//item lock 钱扁
	CItemSlot* pItemSlot	= NULL;
	POSTYPE	ItemPos;
	
	for( int j = 0 ; j < 2 ; ++j )
	for( int i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
	{
		ItemPos		= m_ExchangeData[j].ItemInfo[i].Position;
		pItemSlot	= m_ExchangeData[j].pPlayer->GetSlot( ItemPos );
		if( pItemSlot )
			pItemSlot->SetLock( ItemPos, FALSE );
	}	

//player data 檬扁拳
	sEXCHANGECONTAINER ExchangeContainer;	//檬扁拳窃
	if( m_ExchangeData[0].pPlayer )
		m_ExchangeData[0].pPlayer->SetExchangeContainer( &ExchangeContainer );
	if( m_ExchangeData[1].pPlayer )
		m_ExchangeData[1].pPlayer->SetExchangeContainer( &ExchangeContainer );
//
}

void CExchangeRoom::Lock( int nIndex, BOOL bLock )
{
	if( bLock )
		m_ExchangeData[nIndex].bLock = TRUE;
	else
	{
		m_ExchangeData[0].bLock = FALSE;
		m_ExchangeData[1].bLock = FALSE;

		m_ExchangeData[0].bExchange = FALSE;
		m_ExchangeData[1].bExchange = FALSE;		
	}
}

BOOL CExchangeRoom::IsAllLock()
{
	if( m_ExchangeData[0].bLock && m_ExchangeData[1].bLock )
		return TRUE;

	return FALSE;
}

void CExchangeRoom::SetExchange( int nIndex )
{
	m_ExchangeData[nIndex].bExchange = TRUE;
}

BOOL CExchangeRoom::IsAllExchange()
{
	if( m_ExchangeData[0].bExchange && m_ExchangeData[1].bExchange )
		return TRUE;

	return FALSE;
}

BOOL CExchangeRoom::AddItem( int nPlayerIndex, ITEMBASE* pItemInfo )
{
	if( IsLocked( nPlayerIndex ) ) return FALSE;
	if( m_ExchangeData[nPlayerIndex].nAddItemNum >= MAX_EXCHANGEITEM )
		return FALSE;

	if( pItemInfo->QuickPosition != 0 ) return FALSE;

//辑滚俊档 酒捞袍 LOCK
	CInventorySlot* pItemSlot = (CInventorySlot*)m_ExchangeData[nPlayerIndex].pPlayer->GetSlot( eItemTable_Inventory );

	if( pItemSlot )
	{
		if( GetItemKind( pItemInfo->wIconIdx ) == eYOUNGYAK_ITEM )
		{
			if( pItemSlot->CheckQPosForItemIdx( pItemInfo->wIconIdx ) == FALSE )
				return FALSE;
		}
		else
		{
			if( pItemSlot->GetItemInfoAbs( pItemInfo->Position )->QuickPosition != 0 )
				return FALSE;
		}

		if( pItemSlot->IsLock( pItemInfo->Position ) ) return FALSE;
		pItemSlot->SetLock( pItemInfo->Position, TRUE );
	}
//
	m_ExchangeData[nPlayerIndex].ItemInfo[m_ExchangeData[nPlayerIndex].nAddItemNum] = *pItemInfo;
	++m_ExchangeData[nPlayerIndex].nAddItemNum;

	return TRUE;
}

BOOL CExchangeRoom::DelItem( int nPlayerIndex, POSTYPE pos )
{
	ASSERT( pos >=0 && pos < m_ExchangeData[nPlayerIndex].nAddItemNum );
	
	if( IsLocked( nPlayerIndex ) ) return FALSE;
	if( m_ExchangeData[nPlayerIndex].nAddItemNum <= 0 )
		return FALSE;
	
//辑滚俊档 酒捞袍 UNLOCK
	POSTYPE ItemAbsPos = m_ExchangeData[nPlayerIndex].ItemInfo[pos].Position;

	CItemSlot* pItemSlot = m_ExchangeData[nPlayerIndex].pPlayer->GetSlot( ItemAbsPos );
	if( pItemSlot )
		pItemSlot->SetLock( ItemAbsPos, FALSE );
//

	--m_ExchangeData[nPlayerIndex].nAddItemNum;

	for( int i = pos ; i < m_ExchangeData[nPlayerIndex].nAddItemNum ; ++i )
	{
		m_ExchangeData[nPlayerIndex].ItemInfo[i] = m_ExchangeData[nPlayerIndex].ItemInfo[i+1];
	}

	return TRUE;
}

DWORD CExchangeRoom::InputMoney( int nPlayerIndex, DWORD dwMoney )
{
	if( dwMoney > m_ExchangeData[nPlayerIndex].pPlayer->GetMoney() )
		dwMoney = m_ExchangeData[nPlayerIndex].pPlayer->GetMoney();

	m_ExchangeData[nPlayerIndex].dwMoney = dwMoney;

	return dwMoney;
}

int CExchangeRoom::DoExchange()
{
	CInventorySlot* pInventory[2];
	pInventory[0] = (CInventorySlot*)m_ExchangeData[0].pPlayer->GetSlot( eItemTable_Inventory );
	pInventory[1] = (CInventorySlot*)m_ExchangeData[1].pPlayer->GetSlot( eItemTable_Inventory );

	if( pInventory[0] == NULL || pInventory[1] == NULL )
		return eEE_ERROR;

	//后磊府眉农	//瘤况龙 磊府档 绊妨茄促?(ok)
	WORD EmptySellPos[2][MAX_EXCHANGEITEM];
	WORD sOut;

	if( m_ExchangeData[1].nAddItemNum > m_ExchangeData[0].nAddItemNum )
	{
		sOut = pInventory[0]->GetEmptyCell( EmptySellPos[0], m_ExchangeData[1].nAddItemNum - m_ExchangeData[0].nAddItemNum );
		if( sOut != m_ExchangeData[1].nAddItemNum - m_ExchangeData[0].nAddItemNum )
			return eEE_NOTENOUGHSPACE;
	}
	if( m_ExchangeData[0].nAddItemNum > m_ExchangeData[1].nAddItemNum )
	{
		sOut = pInventory[1]->GetEmptyCell( EmptySellPos[1], m_ExchangeData[0].nAddItemNum - m_ExchangeData[1].nAddItemNum );
		if( sOut != m_ExchangeData[0].nAddItemNum - m_ExchangeData[1].nAddItemNum )
			return eEE_NOTENOUGHSPACE;
	}
	
	//捣眉农
	if( m_ExchangeData[0].dwMoney > m_ExchangeData[0].pPlayer->GetMoney() )
		return eEE_NOTENOUGHMONEY;
	if( m_ExchangeData[1].dwMoney > m_ExchangeData[1].pPlayer->GetMoney() )
		return eEE_NOTENOUGHMONEY;

	if( m_ExchangeData[1].dwMoney + m_ExchangeData[0].pPlayer->GetMoney() > MAX_INVENTORY_MONEY )
		return eEE_MAXMONEY;
	if( m_ExchangeData[0].dwMoney + m_ExchangeData[1].pPlayer->GetMoney() > MAX_INVENTORY_MONEY )
		return eEE_MAXMONEY;

	
///////////////////////////////////////////////
//酒捞袍 八荤 内靛 持磊.. 力磊府俊 促 甸绢乐唱?	抛胶飘 鞘夸.
	int i, j;
	for( j = 0 ; j < 2 ; ++ j )
	{
		for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
		{
			const ITEMBASE* pItemBase = pInventory[j]->GetItemInfoAbs( m_ExchangeData[j].ItemInfo[i].Position );

			if( pItemBase->dwDBIdx != m_ExchangeData[j].ItemInfo[i].dwDBIdx ||
				pItemBase->wIconIdx != m_ExchangeData[j].ItemInfo[i].wIconIdx ||
				pItemBase->Durability != m_ExchangeData[j].ItemInfo[i].Durability ||
				pItemBase->Position != m_ExchangeData[j].ItemInfo[i].Position )
				return eEE_ERROR;			//角力 牢亥配府客 背券芒狼 沥焊啊 促福促.

			if( ITEMMGR->IsDupItem(pItemBase->wIconIdx) )
			if( pItemBase->Durability > 5/*MAX_DURABILITY*/ )
				return eEE_ERROR;
		}
	}


	
	
//夯惑怕肺 汗备啊 啊瓷茄啊?
/////////////
//EXCHANGE!!!
	for( j = 0 ; j < 2 ; ++ j )
	{
		for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
		{
			ITEMBASE ItemBase;
			pInventory[j]->DeleteItemAbs( NULL, m_ExchangeData[j].ItemInfo[i].Position, &ItemBase, SS_LOCKOMIT );	//吝夸! 眉农.

			//昏力 皋技瘤..	//葛酒辑 茄波锅俊 力芭窍磊.
			MSG_EXCHANGE_REMOVEITEM RemoveMsg;
			RemoveMsg.Category = MP_EXCHANGE;
			RemoveMsg.Protocol = MP_EXCHANGE_REMOVE;
			RemoveMsg.wAbsPosition = m_ExchangeData[j].ItemInfo[i].Position;
			m_ExchangeData[j].pPlayer->SendMsg( &RemoveMsg, sizeof( RemoveMsg ) );
		}
	}

/*
	sOut = pInventory[0]->GetEmptyCell( EmptySellPos[0], m_ExchangeData[1].nAddItemNum );
	if( sOut != m_ExchangeData[1].nAddItemNum )
		return FALSE;

	sOut = pInventory[1]->GetEmptyCell( EmptySellPos[1], m_ExchangeData[0].nAddItemNum );
	if( sOut != m_ExchangeData[0].nAddItemNum  )
		return FALSE;
*/	

	for( j = 0 ; j < 2 ; ++ j )
	{
		for( i = 0 ; i < m_ExchangeData[j].nAddItemNum ; ++i )
		{
			POSTYPE EmptyPos;
			if( pInventory[!j]->GetEmptyCell( &EmptyPos ) == 0 ) //后傍埃 绝阑锭 俊矾眉农窍扁
			{
				ASSERT(0);
				continue;
			}

			ItemUpdateToDB( m_ExchangeData[!j].pPlayer->GetID(), m_ExchangeData[j].ItemInfo[i].dwDBIdx,
							m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].Durability,
							EmptyPos, 0 );

			m_ExchangeData[j].ItemInfo[i].Position = EmptyPos;

//itemoption
			if( ITEMMGR->IsOptionItem( m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].Durability) )
			{
				m_ExchangeData[!j].pPlayer->AddItemOption(
					m_ExchangeData[j].pPlayer->GetItemOption( m_ExchangeData[j].ItemInfo[i].Durability ) );
				m_ExchangeData[j].pPlayer->RemoveItemOption( m_ExchangeData[j].ItemInfo[i].Durability );

//				ItemOptionUpdateToDB( m_ExchangeData[j].ItemInfo[i].Durability, m_ExchangeData[!j].pPlayer->GetID() );
			}
/////
			int rt = pInventory[!j]->InsertItemAbs( NULL, EmptyPos, &m_ExchangeData[j].ItemInfo[i], SS_LOCKOMIT ); //Itembase俊辑 position父 官诧促.
			ASSERT( rt == EI_TRUE );

			//眠啊 皋技瘤...	//葛酒辑 茄锅俊 焊郴绰 吧肺 背眉窍磊. confirm
			MSG_ITEM InsertMsg;
			InsertMsg.Category = MP_EXCHANGE;
			InsertMsg.Protocol = MP_EXCHANGE_INSERT;
			InsertMsg.ItemInfo = m_ExchangeData[j].ItemInfo[i];
			m_ExchangeData[!j].pPlayer->SendMsg( &InsertMsg, sizeof( MSG_ITEM ) );

			LogItemMoney(m_ExchangeData[j].pPlayer->GetID(), m_ExchangeData[j].pPlayer->GetObjectName(), 
						m_ExchangeData[1-j].pPlayer->GetID(), m_ExchangeData[1-j].pPlayer->GetObjectName(),
						eLog_Exchange, m_ExchangeData[j].pPlayer->GetMoney(), m_ExchangeData[1-j].pPlayer->GetMoney(), 
						0, m_ExchangeData[j].ItemInfo[i].wIconIdx, m_ExchangeData[j].ItemInfo[i].dwDBIdx, m_ExchangeData[j].ItemInfo[i].Position, 0, m_ExchangeData[j].ItemInfo[i].Durability,
						m_ExchangeData[j].pPlayer->GetPlayerExpPoint());
		}
	}

	DWORD	dwMoney = 0;
	MSG_DWORD MoneyMsg;
	MoneyMsg.Category	= MP_EXCHANGE;
	MoneyMsg.Protocol	= MP_EXCHANGE_SETMONEY;

	int FromNum =0;
	for( j = 0 ; j < 2 ; ++j )
	{
		if( m_ExchangeData[j].dwMoney > m_ExchangeData[!j].dwMoney )	//郴啊 扒捣捞 歹 腹促.
		{
			dwMoney = m_ExchangeData[j].dwMoney - m_ExchangeData[!j].dwMoney;
			m_ExchangeData[j].pPlayer->SetMoney( dwMoney, MONEY_SUBTRACTION, 0, eItemTable_Inventory, eMoneyLog_LoseExchange, m_ExchangeData[1-j].pPlayer->GetID() );
			FromNum = j;
		}
		else if( m_ExchangeData[j].dwMoney < m_ExchangeData[!j].dwMoney )
		{
			dwMoney = m_ExchangeData[!j].dwMoney - m_ExchangeData[j].dwMoney;
			m_ExchangeData[j].pPlayer->SetMoney( dwMoney, MONEY_ADDITION, 0, eItemTable_Inventory, eMoneyLog_GetExchange, m_ExchangeData[1-j].pPlayer->GetID() );
		}
		else
		{
			continue;
		}

//		MoneyMsg.dwData	= m_ExchangeData[j].pPlayer->GetMoney();
//		m_ExchangeData[j].pPlayer->SendMsg( &MoneyMsg, sizeof( MoneyMsg ) );
	}

	LogItemMoney(m_ExchangeData[FromNum].pPlayer->GetID(), m_ExchangeData[FromNum].pPlayer->GetObjectName(),
		m_ExchangeData[!FromNum].pPlayer->GetID(), m_ExchangeData[!FromNum].pPlayer->GetObjectName(),
		eLog_Exchange, m_ExchangeData[FromNum].pPlayer->GetMoney(), m_ExchangeData[!FromNum].pPlayer->GetMoney(), 
		dwMoney, 0, 0, 0, 0, 0,
		m_ExchangeData[FromNum].pPlayer->GetPlayerExpPoint());

	return eEE_OK;
}

⌨️ 快捷键说明

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