feat: add move fly and swim when attack to target.

This commit is contained in:
Tungdv
2026-03-10 15:54:04 +07:00
parent 94c20c4bdd
commit ebd44a40fc
@@ -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;
}