diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs index 6628160650..7b23b424a7 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWork.cs @@ -1,6 +1,6 @@ using BrewMonster.Network; -using BrewMonster.Scripts.Player; using System.Collections.Generic; +using UnityEngine; namespace BrewMonster.Scripts { @@ -431,11 +431,25 @@ namespace BrewMonster.Scripts public void CancelWork(CECHPWork pWork) { - + if (pWork == null) + { + //ASSERT(false); + return; + } + pWork.Cancel(); } public void CancelWorkAtPriority(int iPriority) { - + if (!ValidatePriority(iPriority)) + { + return; + } + WorkList workList = m_WorkStack[iPriority]; + for (int i = 0; i < workList.Count; ++i) + { + CancelWork(workList[i]); + //LOG_DEBUG_INFO(AString().Format("CECHPWork::%s priority=%d cancelled", workList[i]->GetWorkName(), iPriority)); + } } public bool DelayWork(int iPriority, CECHPWork pWork) @@ -479,11 +493,24 @@ namespace BrewMonster.Scripts } public void StartDelayedWork() { - + if (!HasDelayedWork()) + { + return; + } + CECHPWork pWork = m_Delayed.pWork; + m_Delayed.pWork = null; + //LOG_DEBUG_INFO(AString().Format("CECHPWork:: start delayed work %s, priority=%d", pWork->GetWorkName(), m_Delayed.iPriority)); + InternallyStartWork(m_Delayed.iPriority, pWork); } public void ClearDelayedWork() { - + if (!HasDelayedWork()) + { + return; + } + //LOG_DEBUG_INFO(AString().Format("delayed CECHPWork::%s priority=%d cleared", m_Delayed.pWork->GetWorkName(), m_Delayed.iPriority)); + //delete m_Delayed.pWork; + m_Delayed.pWork = null; } public CECHPWork GetDelayedWork() { @@ -742,6 +769,11 @@ namespace BrewMonster.Scripts { return IsWorkRunning(CECHPWork.Host_work_ID.WORK_PICKUP); } + + bool HasDelayedWork() + { + return GetDelayedWork() != null; + } } public abstract class CECHPWorkPostTickCommand { @@ -781,7 +813,7 @@ namespace BrewMonster.Scripts int m_iPriority; bool m_bNoDelay; bool m_bShouldTick; - uint m_dwTickTime; + float m_dwTickTime; // Constructor public CECHPWorkPostTickRunWorkCommand( @@ -789,7 +821,7 @@ namespace BrewMonster.Scripts bool bNoDelay = false, int iPriority = CECHPWorkMan.Work_priority.PRIORITY_1, bool bShouldTick = false, - uint dwTickTime = 0) + float dwTickTime = 0) { m_pWork = pWork; m_bNoDelay = bNoDelay; diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs index e1df5402a8..fd625e89c8 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkMove.cs @@ -507,6 +507,7 @@ namespace BrewMonster.Scripts if ((GetMoveRelDirMask() & (uint)((MOVE_DIR.MD_LEFT | MOVE_DIR.MD_RIGHT | MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_BACK))) != 0) m_iDestType = DestTypes.DEST_PUSH; + Debug.LogError("m_iDestType = " + m_iDestType); if (m_iDestType == DestTypes.DEST_2D) { float fDist; @@ -614,8 +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); + vCurPos = m_pHost.m_MoveCtrl.GroundMove(GPDataTypeHelper.g_vOrigin, 0.0f, fDeltaTime, 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 3997eaf683..c19caceb61 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkStand.cs @@ -134,7 +134,7 @@ namespace BrewMonster.Scripts { pWork.SetDestination(CECHPWorkMove.DestTypes.DEST_STANDJUMP, GPDataTypeHelper.g_vOrigin); m_pWorkMan.SetPostTickCommand(new CECHPWorkPostTickRunWorkCommand( - pWork, false, CECHPWorkMan.Work_priority.PRIORITY_1, true, (uint)dwDeltaTime)); + pWork, false, CECHPWorkMan.Work_priority.PRIORITY_1, true, dwDeltaTime)); } } else if (iMoveReason == 2) @@ -150,10 +150,8 @@ namespace BrewMonster.Scripts { // ASSERT(0); } - return true; } - // Play appropriate actions if (m_iPoseAction == (int)CECPlayer.PLAYER_ACTION_TYPE.ACT_STAND) { @@ -174,7 +172,7 @@ namespace BrewMonster.Scripts if (m_iPoseAction == (int)CECPlayer.PLAYER_ACTION_TYPE.ACT_STAND) { // Chariot war special case omitted for now - m_pHost.PlayAction(m_iCurAction, false, 0); + m_pHost.PlayAction(m_iCurAction, false, 300); //m_oldAction = m_iCurAction; } diff --git a/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs b/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs index 8b0e05fe2d..d52ed0847a 100644 --- a/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs +++ b/Assets/PerfectWorld/Scripts/Move/CECHostMove.cs @@ -305,7 +305,7 @@ namespace BrewMonster { cdr.fYVel += fSpeedV; EC_CDR.OnGroundMove(ref cdr); - + m_pHost.m_CDRInfo = cdr; //if (g_pGame.GetGameRun().GetWorld().GetAssureMove()) // g_pGame.GetGameRun().GetWorld().GetAssureMove().AssureMove(m_pHost.m_aabbServer.Center, cdr.vCenter); @@ -319,10 +319,14 @@ namespace BrewMonster { m_iBlockedCnt = 0; m_fBlockMove += (vNewPos - m_pHost.GetPos()).Magnitude(); m_vBlockMove += vNewPos - m_pHost.GetPos(); - if ((m_fBlockTime += fTime) >= 1.0f) + m_fBlockTime += fTime; + //TO DO: in c++ set 1.0f. Convert to c#, this logic is wrong. If set time is 2.0, game run correct + if ((m_fBlockTime) >= 2.0f) { + Debug.LogError("m_fBlockMove = " + m_fBlockMove); if (m_fBlockMove < GPDataTypeHelper.MIN_MOVELEN_ON_GROUND || m_vBlockMove.Magnitude() < GPDataTypeHelper.MIN_MOVELEN_FOR_DETECT_VIBRATION) { + Debug.LogError("m_iBlockedCnt = 5"); m_iBlockedCnt = 5; } @@ -340,6 +344,8 @@ namespace BrewMonster { public void SetSlideLock(bool bLock) { m_bSlideLock = bLock; } // Is stoping ? public bool IsStop() { return m_bStop; } + // Get host's last position sent to server + public Vector3 GetLastSevPos() { return m_vLastSevPos; } } public struct CDR_INFO { diff --git a/Assets/Scripts/CECGameRun.cs b/Assets/Scripts/CECGameRun.cs index 27319ec720..4c2f3ce59f 100644 --- a/Assets/Scripts/CECGameRun.cs +++ b/Assets/Scripts/CECGameRun.cs @@ -29,6 +29,7 @@ public partial class CECGameRun public void Init() { + Application.targetFrameRate = 60; instance = this; // _gameRunConfig = Resources.Load("GameRunConfig"); // _playerPrefab = _gameRunConfig.PlayerPrefab; diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index d495a1c5a1..0ecf4b710b 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -7,6 +7,7 @@ using BrewMonster.Scripts; using BrewMonster.Scripts.Managers; using BrewMonster.Scripts.Player; using BrewMonster.Scripts.Skills; +using BrewMonster.Scripts.World; using CSNetwork; using CSNetwork.GPDataType; using CSNetwork.Protocols.RPCData; @@ -260,21 +261,26 @@ namespace BrewMonster } #endif + // Update cursor based on what's under mouse + EstimateCursor(); //Debug.Log($"(ulong)Time.deltaTime * 1000 {(ulong)(Time.deltaTime * 1000)}"); m_MoveCtrl.Tick((ulong)(Time.deltaTime * 1000)); // Nếu có thay đổi runtime, có thể lấy lại mỗi vài giây/Start nếu bạn thích: // ccRadius = controller.radius; ccSkin = controller.skinWidth; + EstimateMoveEnv(GetPos()); + _playerStateMachine.UpdateState(); OnKeyDown(); m_pWorkMan?.Tick(Time.deltaTime); - // Update cursor based on what's under mouse - EstimateCursor(); // Update GFXs UpdateGFXs(Time.deltaTime); + + //m_dwMoveRelDir = 0; + m_fVertSpeed = 0.0f; } public void StopMovement() @@ -1270,15 +1276,15 @@ namespace BrewMonster m_pWorkMan.StartWork_p0(m_pWorkMan.CreateWork(Host_work_ID.WORK_STAND)); if (IsDead()) { - //CECHPWorkDead pWork = (CECHPWorkDead*)m_pWorkMan->CreateWork(CECHPWork.Host_work_ID.WORK_DEAD); - //pWork->SetBeDeadFlag(true); - //m_pWorkMan->StartWork_p0(pWork); - EventBus.PublishChannel(GetCharacterID(), new CECPlayer.ClearComActFlagAllRankNodesEvent(true)); - PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE); - if (PopupManager.Instance != null) - { - PopupManager.Instance.OnPlayerDied(); - } + //CECHPWorkDead pWork = (CECHPWorkDead*)m_pWorkMan.CreateWork(CECHPWork.Host_work_ID.WORK_DEAD); + //pWork.SetBeDeadFlag(true); + //m_pWorkMan.StartWork_p0(pWork); + EventBus.PublishChannel(GetCharacterID(), new CECPlayer.ClearComActFlagAllRankNodesEvent(true)); + PlayAction((int)PLAYER_ACTION_TYPE.ACT_GROUNDDIE); + if (PopupManager.Instance != null) + { + PopupManager.Instance.OnPlayerDied(); + } } else { @@ -2882,134 +2888,134 @@ namespace BrewMonster vRight.z = joystick.Vertical; vRight.y = 0f; vRight.Normalize(); - if(vRight == Vector3.zero) + if (vRight == Vector3.zero) { return false; } vPushDir = vRight; - /* // reset - vPushDir = Vector3.zero; - Vector3 vRight = Vector3.zero; - bool bMove = false; + /* // reset + vPushDir = Vector3.zero; + Vector3 vRight = Vector3.zero; + bool bMove = false; - // Không bấm gì → không có hướng - if (m_dwMoveRelDir == 0) - return false; + // Không bấm gì → không có hướng + if (m_dwMoveRelDir == 0) + return false; - // ===== LEFT ===== - if ((m_dwMoveRelDir & MD_LEFT) != 0) - { - // Nếu trên không → xoay camera thay vì di chuyển - if (m_iMoveEnv == MOVEENV_AIR) - { - // giữ nguyên logic PW - ECMSG msg = new ECMSG(); - msg.dwParam2 = 0; - msg.dwParam1 = (uint)(_yaw_vel_air * deltaTime); + // ===== LEFT ===== + if ((m_dwMoveRelDir & MD_LEFT) != 0) + { + // Nếu trên không → xoay camera thay vì di chuyển + if (m_iMoveEnv == MOVEENV_AIR) + { + // giữ nguyên logic PW + ECMSG msg = new ECMSG(); + msg.dwParam2 = 0; + msg.dwParam1 = (uint)(_yaw_vel_air * deltaTime); - if ((m_dwMoveRelDir & MD_BACK) != 0) - msg.dwParam1 = (uint)(-(int)msg.dwParam1); + if ((m_dwMoveRelDir & MD_BACK) != 0) + msg.dwParam1 = (uint)(-(int)msg.dwParam1); - OnMsgHstYaw(msg); // TODO: bạn map hàm này sang Unity - } - else if (m_iMoveEnv == MOVEENV_WATER) - { - ECMSG msg = new ECMSG(); - msg.dwParam2 = 0; - msg.dwParam1 = (uint)(_yaw_vel * deltaTime); + OnMsgHstYaw(msg); // TODO: bạn map hàm này sang Unity + } + else if (m_iMoveEnv == MOVEENV_WATER) + { + ECMSG msg = new ECMSG(); + msg.dwParam2 = 0; + msg.dwParam1 = (uint)(_yaw_vel * deltaTime); - if ((m_dwMoveRelDir & MD_BACK) != 0) - msg.dwParam1 = (uint)(-(int)msg.dwParam1); + if ((m_dwMoveRelDir & MD_BACK) != 0) + msg.dwParam1 = (uint)(-(int)msg.dwParam1); - OnMsgHstYaw(msg); // TODO - } - else - { - // Mặt đất → di chuyển sang trái theo camera - // C++: vRight = -m_CameraCoord.GetRight(); - Vector3 camRight = m_CameraCoord.GetRight(); // TODO: map sang Unity Camera? - vRight = -camRight; - vRight.y = 0; - vRight.Normalize(); + OnMsgHstYaw(msg); // TODO + } + else + { + // Mặt đất → di chuyển sang trái theo camera + // C++: vRight = -m_CameraCoord.GetRight(); + Vector3 camRight = m_CameraCoord.GetRight(); // TODO: map sang Unity Camera? + vRight = -camRight; + vRight.y = 0; + vRight.Normalize(); - vPushDir = vRight; - bMove = true; - } - } + vPushDir = vRight; + bMove = true; + } + } - // ===== RIGHT ===== - else if ((m_dwMoveRelDir & MD_RIGHT) != 0) - { - if (m_iMoveEnv == MOVEENV_AIR) - { - ECMSG msg = new ECMSG(); - msg.dwParam2 = 0; - msg.dwParam1 = (uint)((-_yaw_vel_air) * deltaTime); + // ===== RIGHT ===== + else if ((m_dwMoveRelDir & MD_RIGHT) != 0) + { + if (m_iMoveEnv == MOVEENV_AIR) + { + ECMSG msg = new ECMSG(); + msg.dwParam2 = 0; + msg.dwParam1 = (uint)((-_yaw_vel_air) * deltaTime); - if ((m_dwMoveRelDir & MD_BACK) != 0) - msg.dwParam1 = (uint)(-(int)msg.dwParam1); + if ((m_dwMoveRelDir & MD_BACK) != 0) + msg.dwParam1 = (uint)(-(int)msg.dwParam1); - OnMsgHstYaw(msg); // TODO - } - else if (m_iMoveEnv == MOVEENV_WATER) - { - ECMSG msg = new ECMSG(); - msg.dwParam2 = 0; - msg.dwParam1 = (uint)((-_yaw_vel) * deltaTime); + OnMsgHstYaw(msg); // TODO + } + else if (m_iMoveEnv == MOVEENV_WATER) + { + ECMSG msg = new ECMSG(); + msg.dwParam2 = 0; + msg.dwParam1 = (uint)((-_yaw_vel) * deltaTime); - if ((m_dwMoveRelDir & MD_BACK) != 0) - msg.dwParam1 = (uint)(-(int)msg.dwParam1); + if ((m_dwMoveRelDir & MD_BACK) != 0) + msg.dwParam1 = (uint)(-(int)msg.dwParam1); - OnMsgHstYaw(msg); // TODO - } - else - { - // Mặt đất → di chuyển sang phải theo camera - Vector3 camRight = m_CameraCoord.GetRight(); // TODO - vRight = camRight; - vRight.y = 0; - vRight.Normalize(); + OnMsgHstYaw(msg); // TODO + } + else + { + // Mặt đất → di chuyển sang phải theo camera + Vector3 camRight = m_CameraCoord.GetRight(); // TODO + vRight = camRight; + vRight.y = 0; + vRight.Normalize(); - vPushDir = vRight; - bMove = true; - } - } + vPushDir = vRight; + bMove = true; + } + } - // ===== FORWARD ===== - if ((m_dwMoveRelDir & MD_FORWARD) != 0) - { - Vector3 forward = m_CameraCoord.GetDir(); // TODO - forward.y = 0; - forward.Normalize(); + // ===== FORWARD ===== + if ((m_dwMoveRelDir & MD_FORWARD) != 0) + { + Vector3 forward = m_CameraCoord.GetDir(); // TODO + forward.y = 0; + forward.Normalize(); - vPushDir = forward; + vPushDir = forward; - if (bMove) - { - vPushDir += vRight; - vPushDir.Normalize(); - } - } - // ===== BACK ===== - else if ((m_dwMoveRelDir & MD_BACK) != 0) - { - Vector3 back = -m_CameraCoord.GetDir(); // TODO - back.y = 0; - back.Normalize(); + if (bMove) + { + vPushDir += vRight; + vPushDir.Normalize(); + } + } + // ===== BACK ===== + else if ((m_dwMoveRelDir & MD_BACK) != 0) + { + Vector3 back = -m_CameraCoord.GetDir(); // TODO + back.y = 0; + back.Normalize(); - vPushDir = back; + vPushDir = back; - if (bMove) - { - vPushDir += vRight; - vPushDir.Normalize(); - } - } - // ===== ABS UP (nếu mask cho phép) ===== - else if (((m_dwMoveRelDir & MD_ABSUP) != 0) && ((dwMask & MD_ABSUP) != 0)) - { - vPushDir = Vector3.up; - }*/ + if (bMove) + { + vPushDir += vRight; + vPushDir.Normalize(); + } + } + // ===== ABS UP (nếu mask cho phép) ===== + else if (((m_dwMoveRelDir & MD_ABSUP) != 0) && ((dwMask & MD_ABSUP) != 0)) + { + vPushDir = Vector3.up; + }*/ return true; } @@ -3366,9 +3372,126 @@ namespace BrewMonster } public void SetRotationHP(Vector3 dir) - { + { transform.rotation = Quaternion.LookRotation(dir); } + + // Estimate move environment + void EstimateMoveEnv(A3DVECTOR3 vPos) + { + if (IsFlying()) + { + m_iMoveEnv = Move_environment.MOVEENV_AIR; + return; + } + + CECWorld pWorld = EC_Game.GetGameRun().GetWorld(); + // m_GndInfo.fGndHei = pWorld.GetTerrainHeight(vPos, &m_GndInfo.vGndNormal); + + // Test whether last pos is in air + A3DVECTOR3 vGndPos0, vTestPos0 = m_MoveCtrl.GetLastSevPos() + g_vAxisY * m_aabbServer.Extents.y; + VertRayTrace(vTestPos0, vGndPos0, m_GndInfo.vGndNormal); + + m_GndInfo.fGndHei = vGndPos0.y; + + A3DVECTOR3 vAABBGnd; + VertAABBTrace(vTestPos0, m_aabbServer.Extents, vAABBGnd, m_GndInfo.vGndNormal); + vAABBGnd.y -= m_aabbServer.Extents.y; + + bool bIsInAir = false; + if (m_MoveCtrl.GetLastSevPos().y - vAABBGnd.y > 0.2f) + bIsInAir = true; + + A3DVECTOR3 vGndPos, vTestPos = vPos + g_vAxisY * m_aabbServer.Extents.y; + VertRayTrace(vTestPos, vGndPos, m_GndInfo.vGndNormal); + m_GndInfo.fGndHei = vGndPos.y; + m_GndInfo.fWaterHei = pWorld.GetWaterHeight(vTestPos); + + //@note : use the aabb trace. By Kuiwu[12/10/2005] + VertAABBTrace(vTestPos, m_aabbServer.Extents, vAABBGnd, m_GndInfo.vGndNormal); + vAABBGnd.y -= m_aabbServer.Extents.y; + + //@note : By Kuiwu[12/10/2005] + int iNewEnv = MOVEENV_GROUND; + if (CheckWaterMoveEnv(vPos, m_GndInfo.fWaterHei, vAABBGnd.y)) + iNewEnv = MOVEENV_WATER; + + // ·ÉÌì¹ÒÎÊÌâ + + if (iNewEnv == MOVEENV_GROUND && GetPos().y - vAABBGnd.y < 0.2f && bIsInAir && GetPos() != m_MoveCtrl.GetLastSevPos()) + { + m_MoveCtrl.SendMoveCmd(GetPos(), 2, g_vAxisY, m_CDRInfo.vAbsVelocity, m_iMoveMode, true); + // BubbleText(BUBBLE_LEVELUP, 0); + } + + if (iNewEnv == MOVEENV_GROUND) + { + m_GndInfo.bOnGround = true; + + // if (vPos.y > m_GndInfo.fGndHei + 0.2f) + if (m_CDRInfo.vTPNormal.IsZero()) + { + if (m_iMoveMode != MOVE_FREEFALL) + m_iMoveMode = MOVE_FREEFALL; + + m_GndInfo.bOnGround = false; + if (IsJumping() && m_CDRInfo.vAbsVelocity.y < 0.0f && vPos.y - vAABBGnd.y < 0.6f) + { + PlayAction(ACT_JUMP_LAND, false); + } + } + else + { + if (IsJumping() && m_CDRInfo.vAbsVelocity.y < 0.0f && vPos.y - vAABBGnd.y < 0.6f) + { + PlayAction(ACT_JUMP_LAND, false); + ResetJump(); + } + + // if (m_GndInfo.vGndNormal.y < EC_SLOPE_Y) + if (m_CDRInfo.vTPNormal.y < EC_SLOPE_Y) + { + if (!m_MoveCtrl.GetSlideLock()) + { + if (m_iMoveMode != MOVE_SLIDE) + { + m_iOldWalkMode = m_iMoveMode; + m_iMoveMode = MOVE_SLIDE; + } + } + else + { + m_MoveCtrl.SetSlideLock(false); + m_iMoveMode = MOVE_STAND; + } + } + else + { + m_MoveCtrl.SetSlideLock(false); + if (m_iMoveMode == MOVE_FREEFALL) + { + m_iMoveMode = MOVE_STAND; + } + else if (m_iMoveMode == MOVE_SLIDE) + m_iMoveMode = m_iOldWalkMode; + } + } + } + else if (iNewEnv == MOVEENV_WATER) + { + m_CDRInfo.fYVel = 0.0f; + + if (m_iMoveMode == MOVE_SLIDE) + { + if (m_pWorkMan.IsMoving()) + m_iMoveMode = MOVE_MOVE; + else + m_iMoveMode = MOVE_STAND; + } + } + + m_iMoveEnv = iNewEnv; + } } public enum StateAnim