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

📄 handler_cg_sync.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		// 备秦柳 弥辆 规氢栏肺 10m 捞悼
		wvFinalDir = wvFinalDir * 10.0f;

		// 弥辆 格利瘤 谅钎啊 蜡瓤茄瘤 眉农
		WzVector vDestPos = pRecvMsg->wvCurPos + wvFinalDir;
		if( !_finite(vDestPos.x) || !_finite(vDestPos.y) || !_finite(vDestPos.z) )
		{
			SUNLOG( eCRITICAL_LOG,  "[Handler_CG_SYNC::OnCG_SYNC_KBMOVE_SYN] DestPos is Invalid! x[%f] y[%f] z[%f]", vDestPos.x, vDestPos.y, vDestPos.z );
			SendMoveNakMsg( pPlayer, RC::RC_SYNC_DEST_POSITION_IS_INVALID ); 
			return;
		}

		// 加档 搬沥
		if( pRecvMsg->m_byMoveState & KEYBOARDMOVE_FOWARD )
		{
			pPlayer->SetMoveState( CMS_RUN );
		}
		else if( pRecvMsg->m_byMoveState & KEYBOARDMOVE_BACKWARD )
		{
			pPlayer->SetMoveState( CMS_BACKSTEP );
		}
		else
		{
			pPlayer->SetMoveState( CMS_SIDESTEP );
		}

		pField->FindPathThrust( pPlayer, &wvFinalDir );
		if( !pPlayer->IsMoving() )
		{
//			printf( "努扼捞攫飘 ID:%d 啊 焊辰 虐焊靛 Thrust 角菩", pPlayer->GetObjectKey() );
		}
	}

	// 促弗 敲饭捞绢甸俊霸 宏肺靛 某胶泼
	MSG_CG_SYNC_KBMOVE_BRD sendMsg;
	sendMsg.m_byCategory	= CG_SYNC;
	sendMsg.m_byProtocol	= CG_SYNC_KBMOVE_BRD;
	sendMsg.m_wPlayerKey	= (WORD)pPlayer->GetObjectKey();
	sendMsg.wvCurPos		= pRecvMsg->wvCurPos;
	sendMsg.m_wAngle		= pRecvMsg->m_wAngle;
	sendMsg.m_byMoveState	= pRecvMsg->m_byMoveState;

	pPlayer->SendPacketAround( &sendMsg, (WORD)sendMsg.GetSize(), FALSE );
}

// 敲饭捞绢 沥瘤
VOID Handler_CG_SYNC::OnCG_SYNC_STOP_SYN( ServerSession * pServerSession, MSG_BASE * pMsg, WORD wSize )
{
	MSG_CG_SYNC_STOP_SYN *pRecvMsg = (MSG_CG_SYNC_STOP_SYN*)pMsg;

	Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	//ASSERT( pPlayer );
	if( !pPlayer ) return ;	//< 敲饭捞绢 技记捞 谗绢脸阑 锭

	// 敲饭捞绢啊 乐绰 鞘靛 器牢磐啊 蜡瓤茄瘤 八荤
	Field* pField = pPlayer->GetField();
	if( !pField ) return;

	WzVector wvPlayerPos, wvChangePos;
	pPlayer->GetPos( &wvPlayerPos );

	// 泅犁 谅钎啊 蜡瓤茄瘤 眉农
	if( !_finite(pRecvMsg->wvCurPos.x) || !_finite(pRecvMsg->wvCurPos.y) || !_finite(pRecvMsg->wvCurPos.z) )
	{
		wvChangePos = wvPlayerPos;
		SUNLOG( eCRITICAL_LOG,  "[Handler_CG_SYNC::OnCG_SYNC_STOP_SYN] CurPos is Invalid! x[%f] y[%f] z[%f]", pRecvMsg->wvCurPos.x, pRecvMsg->wvCurPos.y, pRecvMsg->wvCurPos.z );
	}
	else
	{
		wvChangePos = pRecvMsg->wvCurPos;
		pPlayer->SetPos( &pRecvMsg->wvCurPos );
	}

	// 菩哦俊 乐绰 捞悼 矫累 困摹啊 泅犁 辑滚啊 啊柳 困摹客 竭蹲嘎霸 促福搁 立加阑 谗绰促.
	float fCSDist = Math_VectorLength( wvPlayerPos, wvChangePos );
	if( fCSDist >= 5.0f )
	{
		// 菩哦俊 乐绰 捞悼 矫累 困摹啊 泅犁 辑滚啊 啊柳 困摹客 竭蹲嘎霸 促福搁 立加阑 谗绰促.
//		SUNLOG( eFULL_LOG,  "[OnCG_SYNC_STOP_SYN] 谅钎啊 5m 捞惑 瞒捞巢: serverPos=%s, clientPos=%s, dist=%fm", ToString(wvPlayerPos).c_str(), ToString(pRecvMsg->wvCurPos).c_str(), fCSDist);
	}

	pPlayer->StopMoving();

	// 促弗 敲饭捞绢甸俊霸 宏肺靛 某胶泼
	MSG_CG_SYNC_STOP_BRD sendMsg;
	sendMsg.m_byCategory	= CG_SYNC;
	sendMsg.m_byProtocol	= CG_SYNC_STOP_BRD;
	sendMsg.dwObjectKey		= pPlayer->GetObjectKey();
	sendMsg.wvCurPos		= wvChangePos;

	pPlayer->SendPacketAround( &sendMsg, (WORD)sendMsg.GetSize(), FALSE );
}

VOID Handler_CG_SYNC::OnCG_SYNC_FAST_KBMOVE_SYN( ServerSession * pServerSession, MSG_BASE * pMsg, WORD wSize )
{
	MSG_CG_SYNC_FAST_KBMOVE_SYN*pRecvMsg = (MSG_CG_SYNC_FAST_KBMOVE_SYN*)pMsg;

	Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	if( !pPlayer ) return ;	//< 敲饭捞绢 技记捞 谗绢脸阑 锭

	RC::eSYNC_RESULT rcResult = KBMoveCommon( pPlayer, pRecvMsg->m_wvCurPos );
	if( rcResult != RC::RC_SYNC_SUCCESS )
	{
		SendMoveNakMsg( pPlayer, rcResult ); 
		return;
	}

	// 捞悼惑怕啊 漂荐捞悼(剪措矫, 备福扁) 惑怕啊 嘎绰瘤 眉农
	if( pRecvMsg->m_byCmsMoveState < CMS_TUMBLING_FRONT || pRecvMsg->m_byCmsMoveState > CMS_MAX )
	{
		SUNLOG( eCRITICAL_LOG, "[OnCG_SYNC_FAST_KBMOVE_SYN] Invalid CmsMoveState[%d]!", pRecvMsg->m_byCmsMoveState );
		SendMoveNakMsg( pPlayer, RC::RC_SYNC_INVALID_MOVESATE ); 
		return;
	}

	// 弥辆 规氢阑 备茄促.
	WzVector wvFinalDir;
	CalcFinalDir( wvFinalDir, pRecvMsg->m_wAngle, TRUE, pRecvMsg->m_byCmsMoveState );

	// 加档 搬沥
	pPlayer->SetMoveState( (eCHAR_MOVE_STATE)pRecvMsg->m_byCmsMoveState );
	float fMoveSpeed = pPlayer->GetMoveStateControl()->GetMoveSpeed();

	// 备秦柳 弥辆 规氢栏肺 捞悼芭府 备窍扁
	float fMoveDistance = GetMoveTimeAsState( pRecvMsg->m_byCmsMoveState ) * fMoveSpeed;
	wvFinalDir = wvFinalDir * fMoveDistance;

	// 弥辆 格利瘤 谅钎啊 蜡瓤茄瘤 眉农
	if( !_finite(wvFinalDir.x) || !_finite(wvFinalDir.y) || !_finite(wvFinalDir.z) )
	{
		SUNLOG( eCRITICAL_LOG, "[OnCG_SYNC_FAST_KBMOVE_SYN] DestPos is Invalid! x[%f] y[%f] z[%f]", wvFinalDir.x, wvFinalDir.y, wvFinalDir.z );
		SendMoveNakMsg( pPlayer, RC::RC_SYNC_DEST_POSITION_IS_INVALID ); 
		return;
	}

	if( !pPlayer->GetField()->FindPathThrust( pPlayer, &wvFinalDir ) )
	{
		SUNLOG( eMIDDLE_LOG, "[OnCG_SYNC_FAST_KBMOVE_SYN] FindPathThrust Fail!" );
	}

	// 促弗 敲饭捞绢甸俊霸 宏肺靛 某胶泼
	MSG_CG_SYNC_FAST_KBMOVE_BRD brdMsg;
	brdMsg.m_wPlayerKey		= (WORD)pPlayer->GetObjectKey();
	brdMsg.m_wvCurPos		= pRecvMsg->m_wvCurPos;
	brdMsg.m_wAngle			= pRecvMsg->m_wAngle;
	brdMsg.m_byCmsMoveState	= pRecvMsg->m_byCmsMoveState;

	pPlayer->SendPacketAround( &brdMsg, sizeof(brdMsg), FALSE );
}

RC::eSYNC_RESULT Handler_CG_SYNC::KBMoveCommon( Player *pPlayer, WzVector &wvCurPos )
{
	// 敲饭捞绢啊 乐绰 鞘靛 器牢磐啊 蜡瓤茄瘤 八荤
	Field* pField = pPlayer->GetField();
	if( !pField )	return RC::RC_SYNC_FIELD_IS_NULL;

	pPlayer->GetStatusManager()->Move();

	// 敲饭捞绢啊 混酒乐瘤 臼栏搁 府畔
	if( !pPlayer->IsAlive() )	return RC::RC_SYNC_PLAYER_IS_DEAD;

	// 捞悼啊瓷茄瘤 眉农
	if( !pPlayer->CanMove() )	return RC::RC_SYNC_PLAYER_IS_UNMOVABLE_STATE;

	WzVector wvPlayerPos;	pPlayer->GetPos( &wvPlayerPos );

	// 菩哦俊 乐绰 捞悼 矫累 困摹啊 泅犁 辑滚啊 啊柳 困摹客 竭蹲嘎霸 促福搁 立加阑 谗绰促.
	float fCSDist = Math_VectorLength( wvPlayerPos, wvCurPos );
	if( fCSDist >= 5.0f )
	{
//		SUNLOG( eFULL_LOG, "[KBMoveCommon] 谅钎啊 5m 捞惑 瞒捞巢: serverPos=%s, clientPos=%s, dist=%fm", ToString(wvPlayerPos).c_str(), ToString(wvCurPos).c_str(), fCSDist );
	}

	// 泅犁 谅钎啊 蜡瓤茄瘤 眉农
	if( !_finite(wvCurPos.x) || !_finite(wvCurPos.y) || !_finite(wvCurPos.z) )
	{
		SUNLOG( eCRITICAL_LOG,  "[Handler_CG_SYNC::OnCG_SYNC_KBMOVE_SYN] CurPos is Invalid! x[%f] y[%f] z[%f]", wvCurPos.x, wvCurPos.y, wvCurPos.z );
		return RC::RC_SYNC_CUR_POSITION_IS_INVALID;
	}

	// 捞力 努扼捞攫飘啊 焊辰 谅钎甫 瓜绰促.
	pPlayer->SetPos( &wvCurPos );

	// 捞悼樊 眉农甫 困秦 穿利
	if( !pPlayer->GetMovementChecker()->AddMovement( wvCurPos ) )
	{
		SUNLOG( eCRITICAL_LOG, "[KBMoveCommon] Speed hack! ObjectKey(%d) Name(%s)", pPlayer->GetObjectKey(), pPlayer->GetCharName() );
		//pPlayer->ForceDisconnect( SPEED_HACK );
	}

	return RC::RC_SYNC_SUCCESS;
}

VOID Handler_CG_SYNC::CalcFinalDir( WzVector &vFinalDir, WORD wAngle, BOOL bFastMove, BYTE byMoveState )
{
	wAngle = wAngle % 360;
	vFinalDir.x = FSIN(wAngle);	vFinalDir.y = -FCOS(wAngle);	vFinalDir.z = 0.0f;

	WzVector wvDir1, wvDir2;

	SetVector( &wvDir1, 0.0f, 0.0f, 0.0f );		// 傈饶柳 氦磐
	SetVector( &wvDir2, 0.0f, 0.0f, 0.0f );		// 谅快 氦磐

	if( bFastMove )
	{
		if( byMoveState == CMS_TUMBLING_RIGHT )
		{
			wvDir2.x = vFinalDir.y;
			wvDir2.y = -vFinalDir.x;
		}
		else if( byMoveState == CMS_TUMBLING_LEFT )
		{
			wvDir2.x = -vFinalDir.y;
			wvDir2.y = vFinalDir.x;
		}
		else if( byMoveState == CMS_TUMBLING_BACK )
		{
			wvDir1 = -vFinalDir;
		}
		// 傈柳 剪措矫
		else
		{
			wvDir1 = vFinalDir;
		}
	}
	else
	{
		// 傈饶柳 氦磐吝 急琶
		if( byMoveState & KEYBOARDMOVE_FOWARD )
		{
			// 傈柳
			wvDir1 = vFinalDir;
		}
		else if( byMoveState & KEYBOARDMOVE_BACKWARD )
		{
			// 饶柳
			wvDir1 = -vFinalDir;
		}

		// 谅霸吧澜, 快霸吧澜 氦磐吝 急琶
		if( byMoveState & KEYBOARDMOVE_RIGHTSTEP )
		{
			wvDir2.x = vFinalDir.y;		// sin(a - 90) = -cos(a) = wvDir.y;
			wvDir2.y = -vFinalDir.x;	// -cos(a - 90) = -sin(a) = -wvDir.x;
		}
		else if( byMoveState & KEYBOARDMOVE_LEFTSTEP )
		{
			wvDir2.x = -vFinalDir.y;	// sin(a + 90) = cos(a)  = -wvDir.y;
			wvDir2.y = vFinalDir.x;		// -cos(a + 90) = sin(a) = wvDir.x;
		}
	}

	// 傈饶柳 氦磐客 谅快 氦磐甫 歹茄 氦磐甫 畴钢扼捞令 茄 巴捞 弥辆 规氢
	WzVector addVec = wvDir1 + wvDir2;
	VectorNormalize( &vFinalDir, &addVec );
}

VOID Handler_CG_SYNC::SendMoveNakMsg( Player * pPlayer, RC::eSYNC_RESULT eErrorCode )
{
	MSG_CG_SYNC_MOVE_NAK NakMsg;
	pPlayer->GetPos( &NakMsg.m_wvCurPos);
	NakMsg.m_byErrorCode = eErrorCode;
	pPlayer->SendPacket( &NakMsg, sizeof(NakMsg) );
}































⌨️ 快捷键说明

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