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

📄 vimumanager.cpp

📁 墨香最新私服
💻 CPP
字号:
#include "stdafx.h"
#include "VimuManager.h"
#include "UserTable.h"
#include "Player.h"
#include "BattleSystem_server.h"
#include "VimuStreet/Battle_VimuStreet.h"
#include "CharMove.h"
#include "TileManager.h"
#include "..\[CC]Header\GameResourceManager.h"
#include "objectstatemanager.h"

CVimuManager::CVimuManager()
{
}

CVimuManager::~CVimuManager()
{

}

BOOL CVimuManager::CanApplyVimu( CPlayer* pApplyer, CPlayer* pAccepter )
{
	if( BATTLESYSTEM->GetBattle(pApplyer)->GetBattleKind() != eBATTLE_KIND_NONE )		return FALSE;
	if( pApplyer->IsVimuing() )				return FALSE;
	if( pApplyer->IsPKMode() )				return FALSE;
	if( pApplyer->GetState() != eObjectState_None && pApplyer->GetState() != eObjectState_Move )
		return FALSE;

	if( pAccepter == NULL )											return FALSE;
	if( BATTLESYSTEM->GetBattle(pAccepter)->GetBattleKind() != eBATTLE_KIND_NONE )		return FALSE;
	if( pAccepter->IsVimuing() )									return FALSE;
	if( pAccepter->IsPKMode() )										return FALSE;
	if( pAccepter->GetState() == eObjectState_BattleReady )			return FALSE;
	if( pAccepter->GetState() == eObjectState_Deal )				return FALSE;
	if( pAccepter->GetState() == eObjectState_Exchange )			return FALSE;
	if( pAccepter->GetState() == eObjectState_StreetStall_Owner )	return FALSE;
	if( pAccepter->GetState() == eObjectState_StreetStall_Guest )	return FALSE;

	return TRUE;
}

BOOL CVimuManager::CanAcceptVimu( CPlayer* pApplyer, CPlayer* pAccepter )
{
	if( pApplyer == NULL )									return FALSE;
	if( pApplyer->GetState() != eObjectState_BattleReady )	return FALSE;
	if( BATTLESYSTEM->GetBattle(pApplyer)->GetBattleKind() != eBATTLE_KIND_NONE )		return FALSE;
	if( !pApplyer->IsVimuing() )							return FALSE;
	if( pApplyer->IsPKMode() )								return FALSE;

	if( BATTLESYSTEM->GetBattle(pAccepter)->GetBattleKind() != eBATTLE_KIND_NONE )		return FALSE;
	if( !pAccepter->IsVimuing() )							return FALSE;
	if( pAccepter->IsPKMode() )								return FALSE;
	if( pAccepter->GetState() != eObjectState_None && pAccepter->GetState() != eObjectState_Move )
		return FALSE;

	return TRUE;
}

void CVimuManager::UserLogOut( CPlayer* pPlayer )
{
	if( pPlayer->IsVimuing() )		//厚公 脚没例瞒 贸府吝
	if( pPlayer->GetBattle()->GetBattleKind() == eBATTLE_KIND_NONE )
	{
		CPlayer* pOpPlayer = (CPlayer*)g_pUserTable->FindUser( pPlayer->GetVimuOpPlayerID() );
		if( !pOpPlayer ) return;

		if( pPlayer->GetState() == eObjectState_BattleReady )	//脚没磊
		{
			MSGBASE CancelMsg;
			CancelMsg.Category = MP_BATTLE;
			CancelMsg.Protocol = MP_BATTLE_VIMU_WAITING_CANCEL;
			pOpPlayer->SendMsg( &CancelMsg, sizeof( MSGBASE ) );

			pOpPlayer->SetVimuing( FALSE );
			if( pOpPlayer->GetState() == eObjectState_BattleReady )
				OBJECTSTATEMGR_OBJ->EndObjectState( pOpPlayer, eObjectState_BattleReady );
		}
		else
		{
			MSGBASE RejectMsg;
			RejectMsg.Category	= MP_BATTLE;
			RejectMsg.Protocol	= MP_BATTLE_VIMU_REJECT;
			
			pOpPlayer->SendMsg( &RejectMsg, sizeof( RejectMsg ) );
			pOpPlayer->SetVimuing( FALSE );
			if( pOpPlayer->GetState() == eObjectState_BattleReady )
				OBJECTSTATEMGR_OBJ->EndObjectState( pOpPlayer, eObjectState_BattleReady );
		}
	}
}

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

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser(msg->dwObjectID);
			if( !pPlayer1 ) return;
			CPlayer* pPlayer2 = (CPlayer*)g_pUserTable->FindUser(msg->dwData);

			//公利惑怕看促搁 场辰促.
			if( pPlayer1->GetState() == eObjectState_Immortal )
				OBJECTSTATEMGR_OBJ->EndObjectState( pPlayer1, eObjectState_Immortal );			

			if( pPlayer2 )
			if( pPlayer2->GetGameOption()->bNoVimu )
			{
				MSG_BYTE msgError;
				msgError.Category	= MP_BATTLE;
				msgError.Protocol	= MP_BATTLE_VIMU_ERROR;
				msgError.bData		= 3;	//厚公芭何惑怕
				pPlayer1->SendMsg( &msgError, sizeof( MSG_BYTE ) );

				break;
			}

			MSG_DWORD ApplySynMsg;
			ApplySynMsg.Category	= MP_BATTLE;
			ApplySynMsg.dwData		= msg->dwData;

			if( !CanApplyVimu( pPlayer1, pPlayer2 ) )
			{
				//error肺贸府
				ApplySynMsg.Protocol	= MP_BATTLE_VIMU_APPLY_NACK;
				pPlayer1->SendMsg( &ApplySynMsg, sizeof( MSG_DWORD ) );
				return;
			}

			ApplySynMsg.Protocol	= MP_BATTLE_VIMU_APPLY_ACK;
			pPlayer1->SendMsg( &ApplySynMsg, sizeof( MSG_DWORD ) );
			
			pPlayer1->SetVimuing( TRUE );		//厚公概聪廉啊.. 厚公敲饭捞绢甫包府茄促? //confirm
			pPlayer1->SetVimuOpPlayerID( pPlayer2->GetID() );
			OBJECTSTATEMGR_OBJ->StartObjectState(pPlayer1, eObjectState_BattleReady, 0);
			pPlayer2->SetVimuing( TRUE );
			pPlayer2->SetVimuOpPlayerID( pPlayer1->GetID() );
	
			MSG_DWORD ApplyMsg;
			ApplyMsg.Category	= MP_BATTLE;
			ApplyMsg.Protocol	= MP_BATTLE_VIMU_APPLY;
			ApplyMsg.dwData		= msg->dwObjectID;

			pPlayer2->SendMsg( &ApplyMsg, sizeof( MSG_DWORD ) );
		}
		break;

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

			CPlayer* pPlayer1 = (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( !pPlayer1 ) return;
			CPlayer* pPlayer2 = (CPlayer*)g_pUserTable->FindUser( pPlayer1->GetVimuOpPlayerID() );

			//公利惑怕看促搁 场辰促.
			if( pPlayer1->GetState() == eObjectState_Immortal )
				OBJECTSTATEMGR_OBJ->EndObjectState( pPlayer1, eObjectState_Immortal );

			if( !CanAcceptVimu( pPlayer2, pPlayer1 ) )
			{
				MSGBASE AcceptNackMsg;	
				AcceptNackMsg.Category	= MP_BATTLE;
				AcceptNackMsg.Protocol	= MP_BATTLE_VIMU_ACCEPT_NACK;
				pPlayer1->SendMsg( &AcceptNackMsg, sizeof( MSGBASE ) );
				pPlayer1->SetVimuing( FALSE );

				if( pPlayer2 )
				{
					MSG_BYTE ErrorMsg;
					ErrorMsg.Category	= MP_BATTLE;
					ErrorMsg.Protocol	= MP_BATTLE_VIMU_ERROR;
					ErrorMsg.bData		= 1;	//惑措啊 铰遏且荐 绝绰惑怕
					pPlayer2->SendMsg( &ErrorMsg, sizeof( MSG_BYTE ) );

					pPlayer2->SetVimuing( FALSE );
					if( pPlayer2->GetState() == eObjectState_BattleReady )
						OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_BattleReady);
				}

				return;
			}

			VECTOR3 vPosApplyer, vPosAccepter;
			pPlayer2->GetPosition( &vPosApplyer );
			pPlayer1->GetPosition( &vPosAccepter );
			float fDist = CalcDistanceXZ( &vPosApplyer, &vPosAccepter );	//confirm 弥利拳

			if( fDist > 1500.0f )
			{
				MSG_BYTE ErrorMsg;
				ErrorMsg.Category	= MP_BATTLE;
				ErrorMsg.Protocol	= MP_BATTLE_VIMU_ERROR;
				ErrorMsg.bData		= 2;	//惑措客 芭府啊 呈公 钢绢辑
				pPlayer1->SendMsg( &ErrorMsg, sizeof( MSG_BYTE ) );
				pPlayer2->SendMsg( &ErrorMsg, sizeof( MSG_BYTE ) );

				pPlayer1->SetVimuing( FALSE );
				pPlayer2->SetVimuing( FALSE );
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_BattleReady);

				return;
			}

			BATTLE_INFO_VIMUSTREET				BattleInfo;
			BattleInfo.BattleKind				= eBATTLE_KIND_VIMUSTREET;
			BattleInfo.BattleState				= eBATTLE_STATE_READY;
			BattleInfo.BattleTime				= BATTLE_VIMUSTREET_READYTIME;
			BattleInfo.Character[VIMUTEAM_BLUE] = pPlayer1->GetID();
			BattleInfo.Character[VIMUTEAM_RED]	= pPlayer2->GetID();
			

			//---厚公厘困摹拌魂
//			VECTOR3 vPos, vPos2, vStgPos;
//			pPlayer2->GetPosition( &vPos );
			
			BattleInfo.vStgPos.x = ( vPosApplyer.x + vPosAccepter.x ) / 2.0f;
			BattleInfo.vStgPos.z = ( vPosApplyer.z + vPosAccepter.z ) / 2.0f;

//			CTileManager* pTileManager = g_pServerSystem->GetMap()->GetTileManager();
			
//			static VECTOR2 vOffset[4] = { { 200.0f, 0.0f }, { -200.0f, 0.0f },
//										{ 0.0f, 200.0f }, { 0.0f, -200.0f } };

//			MAPTYPE MapNum = GAMERESRCMNGR->GetLoadMapNum();
//			for( int i = 0 ; i < 4 ; ++i )
//			{
//				if( !pTileManager->CollisionTileWithPosition( vPos.x+vOffset[i].x, vPos.z+vOffset[i].y, MapNum ) )
//				{
//					vPos2.x		= vPos.x + vOffset[i].x;
//					vPos2.z		= vPos.z + vOffset[i].y;
//					BattleInfo.vStgPos.x = vPos.x + vOffset[i].x / 2.0f;
//					BattleInfo.vStgPos.z = vPos.z + vOffset[i].y / 2.0f;
//					break;
//				}
//			}
//			if( i == 4 ) return;

			////Player1 WARP!
//			VECTOR3 vPlayer1Pos;
//			pPlayer1->GetPosition( &vPlayer1Pos );
//			if( !( vPlayer1Pos.x > BattleInfo.vStgPos.x - 800.0f && vPlayer1Pos.x < BattleInfo.vStgPos.x + 800.0f &&
//				vPlayer1Pos.z > BattleInfo.vStgPos.z - 800.0f && vPlayer1Pos.z < BattleInfo.vStgPos.z + 800.0f ) )
//			{
//				CCharMove::Warp( pPlayer1, &vPos2 );
//			}
			
			//MAKE VIMU STAGE!
			//void CTileManager::AddTileAttrByAreaData(VECTOR3* pPos,AREATILE areatile);

			BATTLESYSTEM->CreateBattle( &BattleInfo , GAMERESRCMNGR->GetLoadMapNum() );

			CBattle* pBattle = BATTLESYSTEM->GetBattle(BattleInfo.BattleID);

			pBattle->AddObjectToBattle( pPlayer2 );
			pBattle->AddObjectToBattle( pPlayer1 );
			
			MSG_DWORD AcceptMsg;
			AcceptMsg.Category	= MP_BATTLE;
			AcceptMsg.Protocol	= MP_BATTLE_VIMU_ACCEPT;
			AcceptMsg.dwData	= pPlayer1->GetID();
			pPlayer2->SendMsg( &AcceptMsg, sizeof(MSG_DWORD) );

			MSGBASE	AcceptAck;
			AcceptAck.Category  = MP_BATTLE;
			AcceptMsg.Protocol	= MP_BATTLE_VIMU_ACCEPT_ACK;			
			pPlayer1->SendMsg( &AcceptMsg, sizeof(MSGBASE) );
		}
		break;

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

			CPlayer* pPlayer1		= (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) return;
			CPlayer* pPlayer2		= (CPlayer*)g_pUserTable->FindUser( pPlayer1->GetVimuOpPlayerID() );

			MSGBASE RejectAck;
			RejectAck.Category	= MP_BATTLE;
			RejectAck.Protocol	= MP_BATTLE_VIMU_REJECT_ACK;
			pPlayer1->SendMsg( &RejectAck, sizeof( MSGBASE ) );
			pPlayer1->SetVimuing( FALSE );

			if( pPlayer2 )
			{
				MSGBASE RejectMsg;
				RejectMsg.Category	= MP_BATTLE;
				RejectMsg.Protocol	= MP_BATTLE_VIMU_REJECT;

				pPlayer2->SendMsg( &RejectMsg, sizeof( RejectMsg ) );
				pPlayer2->SetVimuing( FALSE );
				if( pPlayer2->GetState() == eObjectState_BattleReady )
					OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_BattleReady);
			}
		}
		break;

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

			CPlayer* pPlayer1		= (CPlayer*)g_pUserTable->FindUser( msg->dwObjectID );
			if( pPlayer1 == NULL ) return;
			
//			if( pPlayer1->IsVimuing() == TRUE )	//捞固 矫累登菌促.
			if( pPlayer1->GetBattle()->GetBattleKind() == eBATTLE_KIND_VIMUSTREET )
			{
				MSGBASE CancelMsg = *msg;

				CancelMsg.Protocol = MP_BATTLE_VIMU_WAITING_CANCEL_NACK;
				pPlayer1->SendMsg( &CancelMsg, sizeof( MSGBASE ) );
				break;
			}

			MSGBASE CancelMsg = *msg;
			CancelMsg.Protocol = MP_BATTLE_VIMU_WAITING_CANCEL_ACK;
			pPlayer1->SendMsg( &CancelMsg, sizeof( MSGBASE ) );

			pPlayer1->SetVimuing( FALSE );
			OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer1, eObjectState_BattleReady);

			CPlayer* pPlayer2		= (CPlayer*)g_pUserTable->FindUser( pPlayer1->GetVimuOpPlayerID() );
			if( pPlayer2 == NULL ) break;

			CancelMsg.Protocol = MP_BATTLE_VIMU_WAITING_CANCEL;
			pPlayer2->SendMsg( &CancelMsg, sizeof( MSGBASE ) );

			pPlayer2->SetVimuing( FALSE );
			if( pPlayer2->GetState() == eObjectState_BattleReady )
				OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_BattleReady);

		}
		break;

	case MP_BATTLE_VIMU_ERROR:
		{
			MSG_BYTE* pmsg		= (MSG_BYTE*)pMsg;

			CPlayer* pPlayer1	= (CPlayer*)g_pUserTable->FindUser( pmsg->dwObjectID );
			CPlayer* pPlayer2	= NULL;

			if( pPlayer1 )
				pPlayer2 = (CPlayer*)g_pUserTable->FindUser( pPlayer1->GetVimuOpPlayerID() );

			if( pmsg->bData == 0 )
			{

			}
			else if( pmsg->bData == 1 )		//accept error from client
			{
				if( pPlayer1 )	pPlayer1->SetVimuing( FALSE );
				if( pPlayer2 )	
				{

					OBJECTSTATEMGR_OBJ->EndObjectState(pPlayer2, eObjectState_BattleReady);

					pPlayer2->SetVimuing( FALSE );
					pPlayer2->SendMsg( pmsg, sizeof(MSG_BYTE) );
				}
			}
			else if( pmsg->bData == 2 )
			{

			}
		}
		break;
	}
}

⌨️ 快捷键说明

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