318 lines
11 KiB
C#
318 lines
11 KiB
C#
|
|
using CSNetwork.GPDataType;
|
|
using System;
|
|
using System.Runtime.ConstrainedExecution;
|
|
using UnityEngine;
|
|
using static CECPlayer;
|
|
|
|
namespace BrewMonster.Scripts
|
|
{
|
|
public class CECHPWorkFall : CECHPWork
|
|
{
|
|
protected A3DVECTOR3 m_vDirH;
|
|
protected float m_fSpeedH;
|
|
protected bool m_bEnterWater;
|
|
protected int m_iFallMode;
|
|
protected int m_nCurStage;
|
|
protected int m_iFallType;
|
|
protected bool m_fForceDown;
|
|
|
|
Vector3 g_vOrigin = Vector3.zero;
|
|
public static class FlyFallStage
|
|
{
|
|
public const int enumStageNone = 0,
|
|
enumStageUpperAir = 1,
|
|
enumStageLowerAir = 2,
|
|
enumStageShallowWater = 3,
|
|
enumStageDeepWater = 4,
|
|
enumStageLandOn = 5;
|
|
};
|
|
|
|
// Fall type
|
|
public static class Fall_type
|
|
{
|
|
public const int TYPE_FREEFALL = 0,
|
|
TYPE_FLYFALL = 1;
|
|
};
|
|
|
|
// This work is do player moving ?
|
|
// public override bool IsMoving() { return true; }
|
|
// Copy work data
|
|
|
|
// Set fall type
|
|
public void SetFallType(int iType) { m_iFallType = iType; }
|
|
public int GetFallType() { return m_iFallType; }
|
|
|
|
public CECHPWorkFall(CECHPWorkMan pWorkMan) : base(Host_work_ID.WORK_FREEFALL, pWorkMan)
|
|
{
|
|
m_dwMask = Work_mask.MASK_FREEFALL;
|
|
m_dwTransMask = Work_mask.MASK_STAND;
|
|
|
|
Reset();
|
|
}
|
|
|
|
// Reset work
|
|
public override void Reset()
|
|
{
|
|
base.Reset();
|
|
|
|
m_bEnterWater = false;
|
|
m_nCurStage = FlyFallStage.enumStageNone;
|
|
m_iFallType = Fall_type.TYPE_FREEFALL;
|
|
m_fForceDown = false;
|
|
}
|
|
|
|
// Copy work data
|
|
public override bool CopyData(CECHPWork pWork)
|
|
{
|
|
if (!base.CopyData(pWork))
|
|
return false;
|
|
|
|
CECHPWorkFall pSrc = (CECHPWorkFall)pWork;
|
|
|
|
m_bEnterWater = pSrc.m_bEnterWater;
|
|
m_nCurStage = pSrc.m_nCurStage;
|
|
m_iFallType = pSrc.m_iFallType;
|
|
m_fForceDown = pSrc.m_fForceDown;
|
|
|
|
return true;
|
|
}
|
|
|
|
// On first tick
|
|
protected override void OnFirstTick()
|
|
{
|
|
m_pHost.m_iMoveEnv = (int)MoveEnvironment.MOVEENV_GROUND;
|
|
m_pHost.m_iMoveMode = (int)MoveMode.MOVE_FREEFALL;
|
|
|
|
m_vDirH = m_pHost.m_vVelocity;
|
|
m_vDirH.y = 0.0f;
|
|
m_fSpeedH = m_vDirH.Normalize();
|
|
|
|
if (m_fSpeedH > m_pHost.GetGroundSpeed())
|
|
m_fSpeedH = m_pHost.GetGroundSpeed();
|
|
|
|
// Clear N
|
|
m_pHost.m_CDRInfo.vTPNormal = Vector3.zero;
|
|
}
|
|
|
|
// Work is cancel
|
|
public override void Cancel()
|
|
{
|
|
m_pHost.m_CDRInfo.vAbsVelocity = Vector3.zero;
|
|
if (m_pHost.m_CDRInfo.vTPNormal == Vector3.zero)
|
|
m_pHost.m_CDRInfo.fYVel = 0.0f;
|
|
base.Cancel();
|
|
}
|
|
|
|
// Tick routine
|
|
public override bool Tick(float dwDeltaTime)
|
|
{
|
|
base.Tick(dwDeltaTime);
|
|
var m_pEquipPack = m_pHost.GetInventory(InventoryConst.IVTRTYPE_EQUIPPACK);
|
|
if (m_pEquipPack.GetItem(InventoryConst.EQUIPIVTR_FLYSWORD, false) == null)
|
|
m_iFallMode = (int)GPMoveMode.GP_MOVE_FALL;
|
|
else
|
|
m_iFallMode = (int)GPMoveMode.GP_MOVE_FLYFALL;
|
|
|
|
if (m_pHost.IsDead())
|
|
m_iFallMode |= (int)GPMoveMode.GP_MOVE_DEAD;
|
|
|
|
if (!m_pHost.IsRooting())
|
|
{
|
|
float fDeltaTime = dwDeltaTime * 0.001f;
|
|
|
|
if (m_pHost.m_iMoveEnv == (int)MoveEnvironment.MOVEENV_GROUND ||
|
|
m_pHost.m_iMoveEnv == (int)MoveEnvironment.MOVEENV_AIR)
|
|
{
|
|
if (m_iFallType == Fall_type.TYPE_FLYFALL)
|
|
Fall_Air(fDeltaTime);
|
|
else
|
|
FreeFall_Air(fDeltaTime);
|
|
}
|
|
//else // m_pHost.m_iMoveEnv == CECPlayer::MOVEENV_WATER
|
|
//{
|
|
// if (m_iFallType == Fall_type.TYPE_FLYFALL)
|
|
// Fall_Water(fDeltaTime);
|
|
// else
|
|
// FreeFall_Water(fDeltaTime);
|
|
//}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Free fall in air
|
|
public bool Fall_Air(float fDeltaTime)
|
|
{
|
|
A3DVECTOR3 vCurPos = m_pHost.GetPos();
|
|
// A3DVECTOR3 vCurVel = m_pHost.m_vVelocity;
|
|
CDR_INFO cdr = m_pHost.m_CDRInfo;
|
|
|
|
bool bWorkEnd = false;
|
|
|
|
if (m_pHost.m_GndInfo.bOnGround)
|
|
{
|
|
bWorkEnd = true;
|
|
//if (m_pHost.UsingWing())
|
|
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON, false);
|
|
else
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON_SWORD, false);
|
|
}
|
|
else
|
|
{
|
|
vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vDirH, m_fSpeedH, fDeltaTime);
|
|
|
|
if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3)
|
|
{
|
|
bWorkEnd = true;
|
|
//if (m_pHost.UsingWing())
|
|
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON, false);
|
|
else
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON_SWORD, false);
|
|
}
|
|
else
|
|
{
|
|
float fHei = vCurPos.y - m_pHost.m_GndInfo.fGndHei;
|
|
|
|
if (fHei > 25f)
|
|
{
|
|
if (m_nCurStage == FlyFallStage.enumStageNone)
|
|
{
|
|
m_nCurStage = FlyFallStage.enumStageUpperAir;
|
|
//if (m_pHost.UsingWing())
|
|
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN, false);
|
|
else
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_SWORD_HIGH, false);
|
|
}
|
|
}
|
|
else if (fHei > 20f)
|
|
{
|
|
if (m_nCurStage == FlyFallStage.enumStageNone)
|
|
{
|
|
m_nCurStage = FlyFallStage.enumStageLowerAir;
|
|
//if (m_pHost.UsingWing())
|
|
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_WING_LOW, false);
|
|
else
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_SWORD_LOW, false);
|
|
}
|
|
}
|
|
else if (fHei > 3.0f)
|
|
{
|
|
if (m_nCurStage == FlyFallStage.enumStageNone
|
|
|| m_nCurStage == FlyFallStage.enumStageUpperAir)
|
|
{
|
|
m_nCurStage = FlyFallStage.enumStageLowerAir;
|
|
//if (m_pHost.UsingWing())
|
|
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_WING_LOW, false);
|
|
else
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_FLYDOWN_SWORD_LOW, false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_nCurStage != FlyFallStage.enumStageLandOn)
|
|
{
|
|
m_nCurStage = FlyFallStage.enumStageLandOn;
|
|
//if (m_pHost.UsingWing())
|
|
if (m_pHost.GetWingType() == enumWingType.WINGTYPE_WING)
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON, false);
|
|
else
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_LANDON_SWORD, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
|
|
}
|
|
|
|
if (bWorkEnd)
|
|
{
|
|
Finish();
|
|
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
|
|
|
|
float fSpeed = cdr.vAbsVelocity.magnitude;
|
|
if (Math.Abs(fSpeed - 0) < float.Epsilon)
|
|
fSpeed = m_pHost.GetFlySpeed();
|
|
|
|
m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, m_iFallMode);
|
|
m_pHost.m_vVelocity.Clear();
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, EC_Utility.ToA3DVECTOR3(g_vOrigin), EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), m_iFallMode);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Free fall in air
|
|
public bool FreeFall_Air(float fDeltaTime)
|
|
{
|
|
A3DVECTOR3 vCurPos = m_pHost.GetPos();
|
|
// A3DVECTOR3 vCurVel = m_pHost.m_vVelocity;
|
|
CDR_INFO cdr = m_pHost.m_CDRInfo;
|
|
|
|
if (m_pHost.m_GndInfo.bOnGround)
|
|
{
|
|
Finish();
|
|
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
|
|
|
|
float fSpeed = cdr.vAbsVelocity.magnitude;
|
|
if (Math.Abs(fSpeed - 0) < float.Epsilon)
|
|
fSpeed = m_pHost.GetFlySpeed();
|
|
|
|
m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), fSpeed, m_iFallMode);
|
|
m_pHost.m_vVelocity.Clear();
|
|
}
|
|
else
|
|
{
|
|
vCurPos = m_pHost.m_MoveCtrl.GroundMove(m_vDirH, m_fSpeedH, fDeltaTime);
|
|
|
|
// If player is blocked, add disturb speed at random direction
|
|
if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3)
|
|
{
|
|
cdr.fYVel = 0.0f;
|
|
|
|
Finish();
|
|
|
|
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
|
|
m_pHost.m_MoveCtrl.SendStopMoveCmd(EC_Utility.ToVector3(vCurPos), 5.0f, m_iFallMode);
|
|
}
|
|
/* {
|
|
m_fSpeedH = 3.0f;
|
|
m_vDirH = glb_RandomVectorH();
|
|
}
|
|
else
|
|
{
|
|
m_fSpeedH = 0.0f;
|
|
m_vDirH.Clear();
|
|
} */
|
|
|
|
m_pHost.SetPos(EC_Utility.ToVector3(vCurPos));
|
|
m_pHost.m_MoveCtrl.SendMoveCmd(vCurPos, 2, EC_Utility.ToA3DVECTOR3(g_vOrigin), EC_Utility.ToA3DVECTOR3(cdr.vAbsVelocity), m_iFallMode);
|
|
|
|
m_pHost.PlayAction((int)PLAYER_ACTION_TYPE.ACT_JUMP_LOOP, false);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// Finish
|
|
public void Finish()
|
|
{
|
|
m_bFinished = true;
|
|
m_pHost.m_CDRInfo.vAbsVelocity = Vector3.zero;
|
|
// m_pHost.m_CDRInfo.fYVel = 0.0f;
|
|
|
|
//if (m_iFallType == Fall_type.TYPE_FLYFALL)
|
|
// m_pHost.ShowWing(false);
|
|
}
|
|
}
|
|
}
|