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

📄 exchangemanager.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "ExchangeManager.h"
#include "ExchangeRoom.h"
#include "UserTable.h"
#include "Player.h"
#include "objectstatemanager.h"
#include "itemmanager.h"
#include "CheckRoutine.h"

#define MAX_EXCHANGEROOM	100


CExchangeManager::CExchangeManager()
{
	m_mpExchangeRoom = new CMemoryPoolTempl<CExchangeRoom>;
	m_mpExchangeRoom->Init( MAX_EXCHANGEROOM, 50, "ExchangeRoomPool" );
}

CExchangeManager::~CExchangeManager()
{
	PTRLISTPOS pos = m_PtrList.GetHeadPosition();

	while(pos)
	{
		CExchangeRoom* p = (CExchangeRoom*)m_PtrList.GetNext( pos );
		if( p )	delete p;
	}

	m_PtrList.RemoveAll();	

	SAFE_DELETE( m_mpExchangeRoom );
}

BOOL CExchangeManager::CanApplyExchange( CPlayer* pPlayer, CPlayer* pOpPlayer )
{
/////////
//³» »óÅÂ
	//---±³È¯ÁßÀΰ¡?(½ÅûÁß..Çã¶ôÁß..±³È¯Áß..)
	//---»óÁ¡ÀÌ¿ëÁßÀΰ¡?
	//---³ëÁ¡ÁßÀΰ¡?
	//---ºñ¹«ÁßÀΰ¡?

	if( pPlayer->GetState() != eObjectState_None && pPlayer->GetState() != eObjectState_Move
		&& pPlayer->GetState() != eObjectState_Immortal )
		return FALSE;
	if( pPlayer->IsVimuing() )
		return FALSE;
	
//	ASSERT( pPlayer->GetExchangeContainer()->pRoom == NULL );	//Confirm
	if( pPlayer->GetExchangeContainer()->pRoom != NULL )
		return FALSE;

///////////////
//»ó´ëÀ¯Àú »óÅÂ
	//---»ó´ëÀ¯Àú°¡ Á¸ÀçÇϴ°¡?
	//---±³È¯ÁßÀΰ¡?
	//---³ëÁ¡ÁßÀΰ¡?
	//---ºñ¹«ÁßÀΰ¡?

	if( pOpPlayer == NULL )
		return FALSE;
	else if( pOpPlayer->GetGameOption()->bNoDeal )
		return FALSE;
	else if( pOpPlayer->GetExchangeContainer()->pRoom != NULL || pOpPlayer->IsVimuing() )
		return FALSE;
	else if( pOpPlayer->GetState() != eObjectState_None && pOpPlayer->GetState() != eObjectState_Move
			 && pOpPlayer->GetState() != eObjectState_Immortal )
		return FALSE;

	return TRUE;
}

CExchangeRoom* CExchangeManager::CreateExchangeRoom( CPlayer* p1, CPlayer* p2 )
{
	CExchangeRoom* pExchangeRoom = m_mpExchangeRoom->Alloc();

	ASSERT( pExchangeRoom );
	if( pExchangeRoom == NULL )
		return NULL;
	
	pExchangeRoom->Init( p1, p2 );
	pExchangeRoom->SetExchangeState( EXCS_WAITING );
	
	m_PtrList.AddTail( pExchangeRoom );

	return pExchangeRoom;
}

void CExchangeManager::DestroyExchangeRoom( CExchangeRoom* pRoom )
{
	if( pRoom == NULL ) return;
	pRoom->Exit();
	m_mpExchangeRoom->Free( pRoom );	
	m_PtrList.Remove( pRoom );
}

void CExchangeManager::UserLogOut( CPlayer* pPlayer )
{
	sEXCHANGECONTAINER* pEC = pPlayer->GetExchangeContainer();
	if( !pEC->pRoom ) return;
	
	if( pEC->pOpPlayer )
	{
		MSG_BYTE CancelMsg;
		CancelMsg.Category	= MP_EXCHANGE;
		CancelMsg.Protocol	= MP_EXCHANGE_CANCEL;//Ãë¼Ò°¡ ¾Æ´Ï¶ó ¿À·ù...//confirm
		CancelMsg.bData		= eEE_USERLOGOUT;

		pEC->pOpPlayer->SendMsg( &CancelMsg, sizeof( MSG_BYTE ) );
		if( pEC->pOpPlayer->GetState() == eObjectState_Exchange )
			OBJECTSTATEMGR_OBJ->EndObjectState(pEC->pOpPlayer, eObjectState_Exchange);

		pEC->pOpPlayer = NULL;
	}

	DestroyExchangeRoom( pEC->pRoom );
	pEC->pRoom = NULL;
}


void CExchangeManager::CancelExchange( CPlayer* pPlayer )
{
	sEXCHANGECONTAINER* pEC = pPlayer->GetExchangeContainer();

	if( !pEC->pRoom ) return;

	MSG_BYTE CancelMsg;
	CancelMsg.Category	= MP_EXCHANGE;
	CancelMsg.Protocol	= MP_EXCHANGE_CANCEL;//Ãë¼Ò°¡ ¾Æ´Ï¶ó ¿À·ù...//confirm
	CancelMsg.bData		= eEE_DIE;

	pPlayer->SendMsg( &CancelMsg, sizeof( MSG_BYTE ) );

	if( pEC->pOpPlayer )
	{
		CancelMsg.bData	= eEE_USERDIE;
		pEC->pOpPlayer->SendMsg( &CancelMsg, sizeof( MSG_BYTE ) );

		if( pEC->pOpPlayer->GetState() == eObjectState_Exchange )
			OBJECTSTATEMGR_OBJ->EndObjectState(pEC->pOpPlayer, eObjectState_Exchange);

		pEC->pOpPlayer = NULL;
	}

	DestroyExchangeRoom( pEC->pRoom );
	pEC->pRoom = NULL;
}


void CExchangeManager::NetworkMsgParse( BYTE Protocol, void* pMsg )
{
	switch( Protocol )
	{
	case MP_EXCHANGE_APPLY_SYN:
		{
			MSG_DWORD* msg = (MSG_DWORD*)pMsg;

			CPlayer* pPlayer	= (CPlayer*)g_pUserTable->FindUser(msg->dwObjectID);
			CPlayer* pOpPlayer	= (CPlayer*)g_pUserTable->FindUser(msg->dwData);

			ASSERT( pPlayer );
			if( pPlayer == NULL ) break;

			MSG_DWORD msgApplySyn;
			msgApplySyn.Category	= MP_EXCHANGE;
			msgApplySyn.dwData		= msg->dwData;

			if( CanApplyExchange( pPlayer, pOpPlayer ) )
			{
				msgApplySyn.Protocol	= MP_EXCHANGE_APPLY_ACK;
				pPlayer->SendMsg( &msgApplySyn, sizeof( msgApplySyn ) );
			}
			else
			{
				msgApplySyn.Protocol	= MP_EXCHANGE_APPLY_NACK;
				pPlayer->SendMsg( &msgApplySyn, sizeof( msgApplySyn ) );
				break;//Á¾·á
			}

			CreateExchangeRoom( pPlayer, pOpPlayer );
	
			MSG_DWORD msgApply;
			msgApply.Category	= MP_EXCHANGE;
			msgApply.Protocol	= MP_EXCHANGE_APPLY;
			msgApply.dwData		= msg->dwObjectID;

			pOpPlayer->SendMsg( &msgApply, sizeof( msgApply ) );
			
			OBJECTSTATEMGR_OBJ->StartObjectState(pPlayer, eObjectState_Exchange, 0);
		}
		break;

	case MP_EXCHANGE_ACCEPT_SYN:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;

			CPlayer* pPlayer1		= (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			
			CPlayer* pPlayer2		= pPlayer1->GetExchangeContainer()->pOpPlayer;
			CExchangeRoom* pRoom	= pPlayer1->GetExchangeContainer()->pRoom;

			if( pPlayer2 == NULL )
			{
				MSGBASE AcceptNackMsg;
				AcceptNackMsg.Category	= MP_EXCHANGE;
				AcceptNackMsg.Protocol	= MP_EXCHANGE_ACCEPT_NACK;
				pPlayer1->SendMsg( &AcceptNackMsg, sizeof( MSGBASE ) );

				if( pRoom )
					DestroyExchangeRoom( pRoom );

				if( pPlayer1->GetState() == eObjectState_Exchange )
					OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_Exchange);

				break;
			}

			if( pRoom == NULL )
			{
				MSGBASE AcceptNackMsg;
				AcceptNackMsg.Category	= MP_EXCHANGE;
				AcceptNackMsg.Protocol	= MP_EXCHANGE_ACCEPT_NACK;
				pPlayer1->SendMsg( &AcceptNackMsg, sizeof( MSGBASE ) );

				AcceptNackMsg.Protocol	= MP_EXCHANGE_CANTAPPLY;
				pPlayer2->SendMsg( &AcceptNackMsg, sizeof( MSGBASE ) );

				if( pPlayer1->GetState() == eObjectState_Exchange )
					OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_Exchange);
				if( pPlayer2->GetState() == eObjectState_Exchange )
					OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_Exchange);

				break;
			}			

			//°Å¸®Ã¼Å©¸¦ Çϰí..
			VECTOR3 vPosApplyer, vPosAccepter;
			pPlayer2->GetPosition( &vPosApplyer );
			pPlayer1->GetPosition( &vPosAccepter );
			float fDist = CalcDistanceXZ( &vPosApplyer, &vPosAccepter );	//confirm ÃÖÀûÈ­

			if( fDist > 1500.0f )
			{
				MSGBASE msgError;
				msgError.Category	= MP_EXCHANGE;
				msgError.Protocol	= MP_EXCHANGE_CANTAPPLY;
				pPlayer1->SendMsg( &msgError, sizeof( MSGBASE ) );
				pPlayer2->SendMsg( &msgError, sizeof( MSGBASE ) );

				if( pPlayer1->GetState() == eObjectState_Exchange )
					OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_Exchange);
				if( pPlayer2->GetState() == eObjectState_Exchange )
					OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_Exchange);

				DestroyExchangeRoom( pRoom );
				break;
			}
			
			MSG_DWORD AcceptMsg;
			AcceptMsg.Category	= MP_EXCHANGE;
			AcceptMsg.Protocol	= MP_EXCHANGE_ACCEPT;
			AcceptMsg.dwData	= msg->dwObjectID;	//»ó´ë ¾ÆÀ̵𸦠ǥ½Ã Çϱâ À§Çؼ­
			pPlayer2->SendMsg( &AcceptMsg, sizeof( MSG_DWORD) );

			MSGBASE StartMsg;
			StartMsg.Category	= MP_EXCHANGE;
			StartMsg.Protocol	= MP_EXCHANGE_START;

			pPlayer1->SendMsg( &StartMsg, sizeof( MSGBASE ) );
			pPlayer2->SendMsg( &StartMsg, sizeof( MSGBASE ) );
			
			pPlayer1->GetExchangeContainer()->pRoom->SetExchangeState( EXCS_DOING );

			OBJECTSTATEMGR_OBJ->StartObjectState(pPlayer1, eObjectState_Exchange, 0);
		}
		break;

	case MP_EXCHANGE_REJECT_SYN:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;

			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;

			if( pRoom ) 
			if( pRoom->GetExchangeState() == EXCS_DOING )
				break;

			if( pPlayer1->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_Exchange);

			CPlayer* pPlayer2 = pPlayer1->GetExchangeContainer()->pOpPlayer;
			DestroyExchangeRoom( pRoom );

			if( pPlayer2 == NULL ) break;

			MSGBASE RejectMsg;
			RejectMsg.Category	= MP_EXCHANGE;
			RejectMsg.Protocol	= MP_EXCHANGE_REJECT;
			pPlayer2->SendMsg( &RejectMsg, sizeof( MSGBASE ) );

			if( pPlayer2->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_Exchange);
		}
		break;

	case MP_EXCHANGE_CANTAPPLY:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;

			if( pPlayer1->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_Exchange);

			CPlayer* pPlayer2		= pPlayer1->GetExchangeContainer()->pOpPlayer;
			CExchangeRoom* pRoom	= pPlayer1->GetExchangeContainer()->pRoom;
			DestroyExchangeRoom( pRoom );

			if( pPlayer2 == NULL ) break;

			MSGBASE CantApplyMsg;
			CantApplyMsg.Category	= MP_EXCHANGE;
			CantApplyMsg.Protocol	= MP_EXCHANGE_CANTAPPLY;
			pPlayer2->SendMsg( &CantApplyMsg, sizeof( MSGBASE ) );

			if( pPlayer2->GetState() == eObjectState_Exchange )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_Exchange);
		}
		break;

	case MP_EXCHANGE_WAITING_CANCEL_SYN:
		{
			MSGBASE* msg = (MSGBASE*)pMsg;

			CPlayer* pPlayer1		= (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) break;
			
			CExchangeRoom* pRoom = pPlayer1->GetExchangeContainer()->pRoom;

			if( pRoom != NULL )
			{
				if( pRoom->GetExchangeState() == EXCS_DOING )
				{
					MSGBASE CancelMsg = *msg;

					CancelMsg.Protocol = MP_EXCHANGE_WAITING_CANCEL_NACK;

⌨️ 快捷键说明

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