diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index 957e991c73..6f4a3e4bcb 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -553,7 +553,7 @@ namespace BrewMonster.Scripts //case CECHPWork.Host_work_ID.WORK_DEAD: pWork = new CECHPWorkDead(this); break; //case CECHPWork.Host_work_ID.WORK_FOLLOW: pWork = new CECHPWorkFollow(this); break; //case CECHPWork.Host_work_ID.WORK_FLYOFF: pWork = new CECHPWorkFly(this); break; - //case CECHPWork.Host_work_ID.WORK_FREEFALL: pWork = new CECHPWorkFall(this); break; + case CECHPWork.Host_work_ID.WORK_FREEFALL: pWork = new CECHPWorkFall(this); break; //case CECHPWork.Host_work_ID.WORK_SIT: pWork = new CECHPWorkSit(this); break; //case CECHPWork.Host_work_ID.WORK_PICKUP: pWork = new CECHPWorkPick(this); break; //case CECHPWork.Host_work_ID.WORK_CONCENTRATE: pWork = new CECHPWorkConcentrate(this); break; diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs new file mode 100644 index 0000000000..0f90427425 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs @@ -0,0 +1,317 @@ + +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); + } + } +} diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs.meta b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs.meta new file mode 100644 index 0000000000..2974f92f7d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkFall.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a85280d3ca5f703449ffa56b24ca7e47 \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs index af605fffdd..e1df5402a8 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs @@ -615,6 +615,7 @@ namespace BrewMonster.Scripts else { vCurPos = m_pHost.m_MoveCtrl.GroundMove(GPDataTypeHelper.g_vOrigin, 0.0f, fDeltaTime, m_pHost.m_fVertSpeed); + Debug.LogError("vCurPos = " + vCurPos + " m_pHost.m_fVertSpeed = " + m_pHost.m_fVertSpeed); m_pHost.SetPos(EC_Utility.ToVector3(vCurPos)); if (m_pHost.m_MoveCtrl.MoveBlocked() >= 3) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs index e8f1741569..3997eaf683 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs @@ -139,11 +139,12 @@ namespace BrewMonster.Scripts } else if (iMoveReason == 2) { - // var pWork = (CECHPWorkFall)m_pWorkMan.CreateWork(Host_work_ID.WORK_FREEFALL); - // if (pWork != null) { - // pWork.SetFallType(CECHPWorkFall.TYPE_FREEFALL); - // m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand(pWork)); - // } + var pWork = (CECHPWorkFall)m_pWorkMan.CreateWork(Host_work_ID.WORK_FREEFALL); + if (pWork != null) + { + pWork.SetFallType(CECHPWorkFall.Fall_type.TYPE_FREEFALL); + m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand(pWork)); + } } else { diff --git a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs index 198f48382e..164b0481b4 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECPlayer.cs @@ -64,7 +64,7 @@ public abstract partial class CECPlayer : CECObject private QueueActionEvent queueActionEvent; protected static PLAYER_LEVELEXP_CONFIG _player_levelup_exp; private CECPlayerActionController m_pActionController; - private enumWingType m_wingType; + private enumWingType m_wingType = enumWingType.WINGTYPE_FLYSWORD; protected int m_idCurSkillTarget; protected CECSkill m_pCurSkill; @@ -1561,6 +1561,8 @@ public abstract partial class CECPlayer : CECObject { return m_strName; } + + public enumWingType GetWingType() { return m_wingType; } } public struct PlayActionEvent diff --git a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs index 858636966c..438630e9e7 100644 --- a/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs +++ b/Assets/PerfectWorld/Scripts/Move/EC_CDR.cs @@ -212,7 +212,7 @@ namespace BrewMonster.Scripts { vDelta = vVelocity * fTime; float fDeltaDist = vDelta.magnitude; - //if (fDeltaDist < DIST_EPSILON) break; + if (fDeltaDist < DIST_EPSILON) break; // TO DO: fix later beacuse logic in CollideWithEnv_BoxCast is wrong //bool hasHit = CollideWithEnv_BoxCast(vStart, vDelta, vExt, mask, @@ -227,7 +227,7 @@ namespace BrewMonster.Scripts CDRInfo.fMoveDist += fDeltaDist; break; } - //if (bStartSolid) + //if (trcInfo.bStartSolid) //{ // CDRInfo.fMoveDist = 0f; // if (CDRInfo.vTPNormal.y < CDRInfo.fSlopeThresh) CDRInfo.vTPNormal = Vector3.up; @@ -273,35 +273,35 @@ namespace BrewMonster.Scripts bTryPull = true; } - //if (!bPull) - //{ - // if (vVelocity.sqrMagnitude > 1e-12f) - // { - // vVelDir = vVelocity.normalized; - // fVelSpeed = vVelocity.magnitude * (1f - nTry * 0.1f); + if (!bPull) + { + if (vVelocity.sqrMagnitude > 1e-12f) + { + vVelDir = vVelocity.normalized; + fVelSpeed = vVelocity.magnitude * (1f - nTry * 0.1f); - // dtp = Vector3.Dot(vNormal, vVelDir); - // float fRelSpeed = Mathf.Min(fVelSpeed, 5.0f); + dtp = Vector3.Dot(vNormal, vVelDir); + float fRelSpeed = Mathf.Min(fVelSpeed, 5.0f); - // if (dtp >= 0f && dtp < 1e-4f) - // { - // vVelocity += vNormal * VEL_REFLECT * fRelSpeed; - // } - // else - // { - // vVelocity = (vVelDir - vNormal * dtp) * fVelSpeed - vNormal * dtp * VEL_REFLECT * fRelSpeed; - // } - // } + if (dtp >= 0f && dtp < 1e-4f) + { + vVelocity += vNormal * VEL_REFLECT * fRelSpeed; + } + else + { + vVelocity = (vVelDir - vNormal * dtp) * fVelSpeed - vNormal * dtp * VEL_REFLECT * fRelSpeed; + } + } - // if (fYVel > VEL_EPSILON) - // { - // if (vNormal.y >= CDRInfo.fSlopeThresh || vNormal.y < -NORMAL_EPSILON) fYVel = 0f; - // } - // else if (fYVel < -VEL_EPSILON) - // { - // if (vNormal.y >= CDRInfo.fSlopeThresh) fYVel = 0f; - // } - //} + if (fYVel > VEL_EPSILON) + { + if (vNormal.y >= CDRInfo.fSlopeThresh || vNormal.y < -NORMAL_EPSILON) fYVel = 0f; + } + else if (fYVel < -VEL_EPSILON) + { + if (vNormal.y >= CDRInfo.fSlopeThresh) fYVel = 0f; + } + } } // “vertical ground trace” – thay RetrieveSupportPlane diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index 70d1a6aca4..b90c841dd8 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -85,6 +85,7 @@ namespace BrewMonster private float m_fPrayDistancePlus; private A3DVECTOR3 g_vOrigin = new A3DVECTOR3(0f); private Transform playerTransform; + private float EC_SLOPE_Y = 0.5f; // ====== Ground cast config ====== [Header("Ground Cast")] @@ -1245,9 +1246,13 @@ namespace BrewMonster m_aabbServer = m_aabb; CalcPlayerAABB(); SetPos(pos); - m_CDRInfo.fStepHeight = 0.8f; + //m_CDRInfo.vTPNormal = GroundCheck(out RaycastHit hit) ? hit.normal : Vector3.zero; m_CDRInfo.vExtent = EC_Utility.ToVector3(m_aabbServer.Extents); + m_CDRInfo.vTPNormal = EC_Utility.ToVector3(g_vOrigin); + m_CDRInfo.fYVel = 0.0f; + m_CDRInfo.fSlopeThresh = EC_SLOPE_Y; + m_CDRInfo.fStepHeight = 0.8f; // Create work manager m_pWorkMan = new CECHPWorkMan(this); m_pWorkMan.StartWork_p0(m_pWorkMan.CreateWork(Host_work_ID.WORK_STAND)); @@ -1276,7 +1281,7 @@ namespace BrewMonster pWork.SetBeSittingFlag(true); m_pWorkMan.StartWork_p1(pWork); }*/ - + m_GndInfo.bOnGround = GroundCheck(out lastGroundHit); LoadResources(); if (m_pWorkMan == null) {