📄 exchangemanager.cpp
字号:
#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 + -