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

📄 charmove.cpp

📁 墨香最新私服
💻 CPP
字号:
// CharMove.cpp: implementation of the CCharMove class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CharMove.h"

#include "PackedData.h"
#include "Player.h"
#include "TileManager.h"
#include "GridSystem.h"
#include "MapDBMsgParser.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCharMove::CCharMove()
{

}

CCharMove::~CCharMove()
{

}

void CCharMove::InitMove(CObject* pObject,VECTOR3* pPos)
{
	MOVE_INFO* pMoveInfo = &pObject->m_MoveInfo;
	pMoveInfo->CurPosition = *pPos;
	pMoveInfo->bMoving = FALSE;
	pMoveInfo->m_bMoveCalculateTime = FALSE;
	pMoveInfo->MoveMode = eMoveMode_Run;
	pMoveInfo->KyungGongIdx = 0;
	pMoveInfo->Move_EstimateMoveTime = 0;
	pMoveInfo->InitTargetPosition();
	
	g_pServerSystem->m_pGridSystem->AddObject(pObject,pPos);
	g_pServerSystem->GetMap()->GetTileManager()->AddObject(pObject);
}

void CCharMove::ReleaseMove(CObject* pObject)
{
	g_pServerSystem->m_pGridSystem->RemoveObject(pObject);
	g_pServerSystem->GetMap()->GetTileManager()->RemoveObject(pObject);
}

VECTOR3* CCharMove::GetPosition(CObject* pObject)
{
	return CalcPositionEx(pObject,gCurTime);
}

void CCharMove::SetPosition(CObject* pObject,VECTOR3* pPos)
{
	ASSERTVALID_POSITION(*pPos);
	if(CheckValidPosition(*pPos) == FALSE)
	{
		return;
	}

	if(pObject->m_MoveInfo.bMoving)
		pObject->m_MoveInfo.bMoving = FALSE;

	pObject->m_MoveInfo.CurPosition = *pPos;
	pObject->m_bNeededToCalcGrid = TRUE;

	g_pServerSystem->GetMap()->GetTileManager()->Preoccupy(pObject,pPos);
}

BOOL CCharMove::CheckVaildStop(CPlayer* pPlayer,DWORD CurTime,VECTOR3* EndPos)
{	
	CalcPositionEx(pPlayer,CurTime);
	if(CalcDistanceXZ(&pPlayer->m_MoveInfo.CurPosition,EndPos) > MOVE_LIMIT_ERRORDISTANCE)
	{
		CorrectPlayerPosToServer(pPlayer);
		return FALSE;
	}
	return TRUE;
}

// 泅犁 困摹甫 拌魂秦辑 EndPos客 瞒捞啊 腹捞 唱搁 炼摹-_-;甫 秒茄促.
// 捞悼捞 场车澜阑 钎矫茄促.
void CCharMove::EndMove(CObject* pObject,DWORD CurTime,VECTOR3* EndPos)
{	
	ASSERTVALID_POSITION(*EndPos);
	if(CheckValidPosition(*EndPos) == FALSE)
	{
		return;
	}
	
	pObject->m_MoveInfo.CurPosition = *EndPos;
	pObject->m_MoveInfo.bMoving = FALSE;
	pObject->m_MoveInfo.InitTargetPosition();
	pObject->m_bNeededToCalcGrid = TRUE;

	g_pServerSystem->GetMap()->GetTileManager()->Preoccupy(pObject,EndPos);

	if(pObject->m_MoveInfo.KyungGongIdx)
		SetKyungGong(pObject,0);
}

void CCharMove::StartMoveEx(CObject* pObject,DWORD CurTime,VECTOR3* StartPos,VECTOR3* pTargetPos)
{	
	MOVE_INFO* pMoveInfo = &pObject->m_MoveInfo;
	ASSERT(pMoveInfo->GetCurTargetPosIdx()< pMoveInfo->GetMaxTargetPosIdx());
	float Speed = pObject->GetMoveSpeed();
	//YH2DO
	if(Speed == 0)
	{
		EndMove(pObject,CurTime,StartPos);
		return;
	}

	CalcPositionEx(pObject,CurTime);

	//KES HACK CHECK
	if( pObject->GetObjectKind() == eObjectKind_Player )
	if( CalcDistanceXZ(&pMoveInfo->CurPosition,StartPos) > 10*100 ) //5m 磊林 吧啡匙 弊烦 10m
	{
		((CPlayer*)pObject)->SpeedHackCheck();		
	}
	
	pMoveInfo->Move_StartTime = CurTime;

	pMoveInfo->CurPosition.x = StartPos->x;
	pMoveInfo->CurPosition.z = StartPos->z;
	pMoveInfo->Move_StartPosition.x = StartPos->x;
	pMoveInfo->Move_StartPosition.z = StartPos->z;

	float Distance = CalcDistanceXZ(pTargetPos,&pMoveInfo->Move_StartPosition);
	pMoveInfo->Move_Direction.x = pTargetPos->x - pMoveInfo->Move_StartPosition.x;
	pMoveInfo->Move_Direction.z = pTargetPos->z - pMoveInfo->Move_StartPosition.z;

	if(Distance)
	{
		float tt = (Speed / Distance);
		pMoveInfo->Move_Direction.x = pMoveInfo->Move_Direction.x * tt;
		pMoveInfo->Move_Direction.z = pMoveInfo->Move_Direction.z * tt;
	}
	else
	{
		pMoveInfo->Move_Direction.x = 0;
		pMoveInfo->Move_Direction.z = 0;
	}

	pMoveInfo->Move_EstimateMoveTime = Distance / Speed;

	if(pMoveInfo->Move_EstimateMoveTime < 0)
	{
		ASSERT(0);
	}
	
	ASSERTVALID_POSITION(pMoveInfo->CurPosition);
	//////////////////////////////////////////////////////////////////////////
	// YH2DO 咯扁俊 面倒八荤鞍篮吧 持绰促.
	//////////////////////////////////////////////////////////////////////////	

	pObject->m_bNeededToCalcGrid = TRUE;

	pMoveInfo->m_bMoveCalculateTime = g_pServerSystem->m_pGridSystem->GetGridChangeTime(
		pObject,StartPos,pTargetPos,Speed,pMoveInfo->m_dwMoveCalculateTime);
	
	g_pServerSystem->GetMap()->GetTileManager()->Preoccupy(pObject,pTargetPos);

	pMoveInfo->bMoving = TRUE;
	ASSERT(pMoveInfo->GetCurTargetPosIdx()< pMoveInfo->GetMaxTargetPosIdx());
}

VECTOR3* CCharMove::CalcPositionEx(CObject* pObject,DWORD CurTime)
{
	//瘤陛 object啊 沥瘤惑怕牢单档  pMoveInfo->bMovingd= TRUE牢 版快啊 乐促.
	MOVE_INFO * pMoveInfo = &pObject->m_MoveInfo;
	ASSERTVALID_POSITION(pMoveInfo->CurPosition);
	if(pMoveInfo->bMoving)
	{
		ASSERT(pMoveInfo->GetCurTargetPosIdx()< pMoveInfo->GetMaxTargetPosIdx());
		if(CurTime == pMoveInfo->Move_LastCalcTime)
		{
			if(pMoveInfo->CurPosition.x < 0)	pMoveInfo->CurPosition.x = 0;
			if(pMoveInfo->CurPosition.z < 0)	pMoveInfo->CurPosition.z = 0;
			if(pMoveInfo->CurPosition.x > 51100)	pMoveInfo->CurPosition.x = 51100;
			if(pMoveInfo->CurPosition.z > 51100)	pMoveInfo->CurPosition.z = 51100;
			
			return &pMoveInfo->CurPosition;
		}
		
		pMoveInfo->Move_LastCalcTime = CurTime;
		float fMoveTime = ((CurTime - pMoveInfo->Move_StartTime)*0.001f);
		if(pMoveInfo->Move_EstimateMoveTime < fMoveTime)
		{
			ASSERTVALID_POSITION(pMoveInfo->CurPosition);
			// 促澜 鸥百栏肺 函版
			if(pMoveInfo->GetCurTargetPosIdx() < pMoveInfo->GetMaxTargetPosIdx()- 1)
			{				
				ASSERTVALID_POSITION(pMoveInfo->CurPosition);
				pMoveInfo->CurPosition.x = pMoveInfo->GetTargetPosition(pMoveInfo->GetCurTargetPosIdx())->x;
				pMoveInfo->CurPosition.z = pMoveInfo->GetTargetPosition(pMoveInfo->GetCurTargetPosIdx())->z;
				pMoveInfo->SetCurTargetPosIdx(pMoveInfo->GetCurTargetPosIdx()+1);


				ASSERT(pMoveInfo->GetCurTargetPosIdx()< pMoveInfo->GetMaxTargetPosIdx());
				StartMoveEx(pObject, CurTime, &pMoveInfo->CurPosition, pMoveInfo->GetTargetPosition(pMoveInfo->GetCurTargetPosIdx()));
			}
			else
			{
				ASSERTVALID_POSITION(pMoveInfo->CurPosition);
				ASSERT(pMoveInfo->GetCurTargetPosIdx()< pMoveInfo->GetMaxTargetPosIdx());
				pMoveInfo->CurPosition.x = pMoveInfo->GetTargetPosition(pMoveInfo->GetCurTargetPosIdx())->x;
				pMoveInfo->CurPosition.z = pMoveInfo->GetTargetPosition(pMoveInfo->GetCurTargetPosIdx())->z;
				pMoveInfo->bMoving = FALSE;
							
				if(pMoveInfo->KyungGongIdx)
					SetKyungGong(pObject,0);
			}
			ASSERTVALID_POSITION(pMoveInfo->CurPosition);
		}
		else
		{
			ASSERTVALID_POSITION(pMoveInfo->CurPosition);
			pMoveInfo->CurPosition.x = pMoveInfo->Move_StartPosition.x + pMoveInfo->Move_Direction.x * fMoveTime;
			pMoveInfo->CurPosition.z = pMoveInfo->Move_StartPosition.z + pMoveInfo->Move_Direction.z * fMoveTime;
			ASSERTVALID_POSITION(pMoveInfo->CurPosition);
		}
	}
	
	if(pMoveInfo->CurPosition.x < 0)	pMoveInfo->CurPosition.x = 0;
	if(pMoveInfo->CurPosition.z < 0)	pMoveInfo->CurPosition.z = 0;
	if(pMoveInfo->CurPosition.x > 51100)	pMoveInfo->CurPosition.x = 51100;
	if(pMoveInfo->CurPosition.z > 51100)	pMoveInfo->CurPosition.z = 51100;
	return &pMoveInfo->CurPosition;
}

void CCharMove::MoveProcess(CObject* pObject)
{
	MOVE_INFO* pMoveInfo = &pObject->m_MoveInfo;
	if(pMoveInfo->bMoving == FALSE)
		goto MoveProcessEnd;

	if(pMoveInfo->m_bMoveCalculateTime)
	{
		if(pMoveInfo->m_dwMoveCalculateTime <= gTickTime)
		{
			ASSERT(pMoveInfo->GetCurTargetPosIdx()< pMoveInfo->GetMaxTargetPosIdx());
			//StartMoveEx(pObject,gCurTime,&pMoveInfo->CurPosition,&pMoveInfo->TargetPositions[pMoveInfo->CurTargetPositionIdx]);
			StartMoveEx(pObject,gCurTime,&pMoveInfo->CurPosition, pMoveInfo->GetTargetPosition(pMoveInfo->GetCurTargetPosIdx()));
		}
		else
		{
			pMoveInfo->m_dwMoveCalculateTime -= gTickTime;
		}
			
	}

MoveProcessEnd:
	if(pObject->m_bNeededToCalcGrid == TRUE)
	{		
		if(pMoveInfo->CurPosition.x < 0)	pMoveInfo->CurPosition.x = 0;
		if(pMoveInfo->CurPosition.z < 0)	pMoveInfo->CurPosition.z = 0;
		if(pMoveInfo->CurPosition.x > 51100)	pMoveInfo->CurPosition.x = 51100;
		if(pMoveInfo->CurPosition.z > 51100)	pMoveInfo->CurPosition.z = 51100;
		
		g_pServerSystem->m_pGridSystem->ChangeGrid(pObject,&pMoveInfo->CurPosition);
		pObject->m_bNeededToCalcGrid = FALSE;
	}
}

BOOL CCharMove::IsMoving(CObject* pObject)
{
	if(pObject->m_MoveInfo.bMoving)
		CalcPositionEx(pObject,gCurTime);

	return pObject->m_MoveInfo.bMoving;
}

void CCharMove::SetWalkMode(CObject* pObject)
{
	pObject->m_MoveInfo.MoveMode = eMoveMode_Walk;
}
void CCharMove::SetRunMode(CObject* pObject)
{
	pObject->m_MoveInfo.MoveMode = eMoveMode_Run;
}
BOOL CCharMove::SetKyungGong(CObject* pObject,WORD KGIdx)
{
	pObject->m_MoveInfo.KyungGongIdx = KGIdx;

	pObject->m_KyungGongNaeRyuk_LastCheckTime = 0;	// 矫累何磐 憋捞霸 窍扁 困秦辑

	return TRUE;
}

BOOL CCharMove::IsValidKyungGong(CObject* pObject,WORD KGIdx)
{
	if(KGIdx == 0)		// 版傍 秦力绰 亲惑 OK
		return TRUE;

	// YH2DO 荤恩父 版傍 静唱? -_-a
	if(pObject->GetObjectKind() != eObjectKind_Player)
		return FALSE;

	if(((CPlayer*)pObject)->GetKyungGongGrade() == KGIdx)
		return TRUE;
	else
		return FALSE;
}

void CCharMove::CorrectPlayerPosToServer(CObject* pObject)
{
	VECTOR3* pCurPos = CCharMove::GetPosition(pObject);
	EndMove(pObject,gCurTime,pCurPos);

	MOVE_POS msg;
	msg.Category = MP_MOVE;
	msg.Protocol = MP_MOVE_CORRECTION;
	msg.dwMoverID = pObject->GetID();
	msg.cpos.Compress(pCurPos);

	PACKEDDATA_OBJ->QuickSend(pObject,&msg,sizeof(msg));
}

DWORD CCharMove::GetMoveEstimateTime(CObject* pObject)
{
	DWORD dwEstimateTime = 0;
	float Speed = pObject->GetMoveSpeed();
	CalcPositionEx(pObject, gCurTime);
	VECTOR3 * pVPos = pObject->m_MoveInfo.GetTargetPosition(0);
	if( 0 == pObject->m_MoveInfo.GetMaxTargetPosIdx()) return 0;
	ASSERT(pObject->m_MoveInfo.GetCurTargetPosIdx() < pObject->m_MoveInfo.GetMaxTargetPosIdx());
	for(int i = pObject->m_MoveInfo.GetCurTargetPosIdx() ; i < pObject->m_MoveInfo.GetMaxTargetPosIdx()-1; ++i)
	{
		float Distance = CalcDistanceXZ(&pVPos[i],&pVPos[i+1]);
		dwEstimateTime += (DWORD)(Distance/Speed*1000);
	}

	dwEstimateTime += (DWORD)(pObject->m_MoveInfo.Move_EstimateMoveTime*1000);

	return dwEstimateTime;
}

void CCharMove::ForceStopKyungGong(CPlayer* pPlayer)
{
	MSGBASE msg;
	msg.Category = MP_MOVE;
	msg.Protocol = MP_MOVE_FORCESTOPKYUNGGONG;
	pPlayer->SendMsg(&msg,sizeof(msg));
}

void CCharMove::Warp(CObject* pObject, VECTOR3* vPos )
{
	SetPosition(pObject, vPos);

	MOVE_POS msg;
	msg.Category = MP_MOVE;
	msg.Protocol = MP_MOVE_WARP;
	msg.dwMoverID = pObject->GetID();
	msg.cpos.Compress(vPos);

	PACKEDDATA_OBJ->QuickSend(pObject,&msg,sizeof(msg));
}

⌨️ 快捷键说明

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