feat: add move fly and swim when attack to target.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user