diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs index 7ca4f5100d..0edb94ee12 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkTrace.cs @@ -678,7 +678,6 @@ namespace BrewMonster } m_bCheckTouch = true; - //return true; // TO DO: remove later if (!m_pHost.IsRooting()) { // Continue tracing object @@ -986,6 +985,87 @@ namespace BrewMonster // Trace in air and water public bool Trace_FlySwim(float fDeltaTime) { + if (m_bMeetSlide || m_bReadyCancel) + { + StopMove(true); + return true; + } + if (GetUseAutoPF()) + { + SetUseAutoPF(false); + } + + A3DVECTOR3 vCurPos = m_pHost.GetPos(); + A3DVECTOR3 vTargetPos = GetCurMovingDest(); + + float fSpeed1 = m_pHost.m_vVelocity.Magnitude(); + A3DVECTOR3 vMoveDir = vTargetPos - vCurPos; + float fDist = vMoveDir.Normalize(); + int iMoveMode; + + float na = 0.0f, pa = 0.0f, fMaxSpeed; + bool bInAir; + if (m_pHost.m_iMoveEnv == CECPlayer.Move_environment.MOVEENV_AIR) + { + bInAir = true; + na = CECHostMove.EC_NACCE_AIR; + fMaxSpeed = m_pHost.GetFlySpeed(); + iMoveMode = (int)GPMoveMode.GP_MOVE_AIR | (int)GPMoveMode.GP_MOVE_RUN; + } + else + { + bInAir = false; + na = CECHostMove.EC_NACCE_WATER; + fMaxSpeed = m_pHost.GetSwimSpeedSev(); + iMoveMode = (int)GPMoveMode.GP_MOVE_WATER | (int)GPMoveMode.GP_MOVE_RUN; + } + + ON_AIR_CDR_INFO cdr = m_pHost.m_AirCDRInfo; + + // Calculate the distance to reduce velocity to 0 + float s = -0.5f * fSpeed1 * fSpeed1 / na; + if (fDist > s - 0.01f) + pa = CECHostMove.EC_PUSH_ACCE; + + float fSpeed2 = fSpeed1 + (pa + na) * fDeltaTime; + if (Mathf.Abs(pa - 0f) < float.Epsilon && fSpeed2 < 0.0f) + fSpeed2 = 0.0f; // Only resistance couldn't generate negative speed + + AAssist.a_Clamp(ref fSpeed2, -fMaxSpeed, fMaxSpeed); + + A3DVECTOR3 vMoveDirH = new A3DVECTOR3(vMoveDir.x, 0.0f, vMoveDir.z); + if (!vMoveDirH.IsZero()) + { + //m_pHost.StartModelMove(vMoveDirH, g_vAxisY, 100); + m_pHost.SetDestDirAndUp(vMoveDirH, EC_Utility.ToVector3(GPDataTypeHelper.g_vAxisY), 0.1f); + } + + A3DVECTOR3 vVel2 = vMoveDir * fSpeed2; + vCurPos = m_pHost.m_MoveCtrl.AirWaterMove(vMoveDir, fSpeed2, fDeltaTime, bInAir, true); + + m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); + m_pHost.m_vVelocity = vVel2; + + if (Mathf.Abs(vMoveDir.y) > 0.9848f) + { + A3DVECTOR3 v1 = vMoveDir; + A3DVECTOR3 v2 = vTargetPos - vCurPos; + v1.y = v2.y = 0.0f; + if (A3DVECTOR3.DotProduct(v1, v2) < 0.0f) + { + PressCancel(); + return true; + } + } + + if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) + { + m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fMaxSpeed, iMoveMode); + m_bFinished = true; + } + else + m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 1, vTargetPos, vVel2, iMoveMode); + return true; }