From e6d29176df227bb13a16be4dddfd33979e6ea04b Mon Sep 17 00:00:00 2001 From: HungDK <> Date: Sat, 10 Jan 2026 12:11:31 +0700 Subject: [PATCH] Update movement of host - discard this only --- Assets/Scripts/CECHostPlayer.cs | 234 ++++++++++++-------------------- 1 file changed, 90 insertions(+), 144 deletions(-) diff --git a/Assets/Scripts/CECHostPlayer.cs b/Assets/Scripts/CECHostPlayer.cs index e037eedc6a..8756ed3374 100644 --- a/Assets/Scripts/CECHostPlayer.cs +++ b/Assets/Scripts/CECHostPlayer.cs @@ -16,7 +16,6 @@ using ModelRenderer.Scripts.GameData; using PerfectWorld.Scripts; using PerfectWorld.Scripts.Managers; using System; -using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; @@ -204,8 +203,9 @@ namespace BrewMonster { if (m_pNavigatePlayer == null) { - // TODO: Implement proper creation of navigate player - // m_pNavigatePlayer = CreateNavigatePlayer(); + // Create navigate player on-demand (C++: host owns a navigate/clone player + controller) + // 按需创建导航玩家(C++:宿主玩家持有导航/克隆玩家 + 控制器) + m_pNavigatePlayer = new CECHostNavigatePlayer(this); } return m_pNavigatePlayer; } @@ -2243,14 +2243,14 @@ namespace BrewMonster public void OnMsgHstCorrectPos(in ECMSG Msg) { - Debug.LogError("HoangDev : OnMsgHstCorrectPos"); + //Debug.LogError("HoangDev : OnMsgHstCorrectPos"); byte[] buf = (byte[])Msg.dwParam1; // chỗ bạn lưu pDataBuf GCHandle handle = GCHandle.Alloc(buf, GCHandleType.Pinned); cmd_host_correct_pos pCmd = (cmd_host_correct_pos)Marshal.PtrToStructure( handle.AddrOfPinnedObject(), typeof(cmd_host_correct_pos)); handle.Free(); //cmd_host_correct_pos pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1); - Debug.LogError("HoangDev :pCmd.pos " + pCmd.pos); + //Debug.LogError("HoangDev :pCmd.pos " + pCmd.pos); SetPos(pCmd.pos); m_vVelocity.Clear(); m_CDRInfo.vAbsVelocity.Clear(); @@ -2472,7 +2472,7 @@ namespace BrewMonster m_dwResFlags = (uint)PlayerResourcesReadyFlag.RESFG_ALL; joystick = FindAnyObjectByType(); EventBus.Subscribe(JoystickRelease); - EventBus.Subscribe(OnClickJoystick); + EventBus.Subscribe(OnMsgHstPushMove); if (TryGetComponent(out var visual)) { visual.InitPlayerEventDoneHandler(); @@ -2563,10 +2563,79 @@ namespace BrewMonster // TODO: Move this to right flow later , it's just for test now } + private void OnMsgHstPushMove(JoystickPressEvent joystickPressEvent) + { + //_playerStateMachine.ChangeState(_moveState); + /* if (m_pWorkMan.IsSitting()) + { + g_pGame.GetGameSession().c2s_CmdStandUp(); + return; + }*/ + m_dwMoveRelDir = 0; + if (!CanDo(ActionCanDo.CANDO_MOVETO)) return; + if(joystick.Vertical > 0) + { + if(joystick.Horizontal > 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_RIGHT); + } + else if(joystick.Horizontal < 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_FORWARD | MOVE_DIR.MD_LEFT); + } + else + { + m_dwMoveRelDir |= (uint)MOVE_DIR.MD_FORWARD; + } + } + else if (joystick.Vertical < 0) + { + if (joystick.Horizontal > 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_BACK | MOVE_DIR.MD_RIGHT); + } + else if (joystick.Horizontal < 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_BACK | MOVE_DIR.MD_LEFT); + } + else + { + m_dwMoveRelDir |= (uint)MOVE_DIR.MD_BACK; + } + } + else + { + if (joystick.Horizontal > 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_RIGHT); + } + else if (joystick.Horizontal < 0) + { + m_dwMoveRelDir |= (uint)(MOVE_DIR.MD_LEFT); + } + } + bool bPushMove = true; + /* if (Msg.dwParam1 == 8 || Msg.dwParam1 == 9) + { + if (m_iMoveEnv != (int)MoveEnvironment.MOVEENV_AIR && m_iMoveEnv != (int)MoveEnvironment.MOVEENV_WATER) + bPushMove = false; + }*/ + + if (bPushMove /*&& !IsAboutToDie()*/ && CanDo(ActionCanDo.CANDO_MOVETO)) + { + if (m_pWorkMan.CanStartWork(Host_work_ID.WORK_MOVETOPOS)) + { + CECHPWorkMove pNewWork = (CECHPWorkMove)m_pWorkMan.CreateWork(Host_work_ID.WORK_MOVETOPOS); + pNewWork.SetDestination(CECHPWorkMove.DestTypes.DEST_PUSH, g_vOrigin); + m_pWorkMan.StartWork_p1(pNewWork); + } + } + } + private void OnDestroy() { EventBus.Unsubscribe(JoystickRelease); - EventBus.Unsubscribe(OnClickJoystick); + EventBus.Unsubscribe(OnMsgHstPushMove); } //TODO: Remove this function. Since it has been deprecated. @@ -4455,14 +4524,6 @@ namespace BrewMonster vPushDir = Vector3.zero; if (joystick.Horizontal == 0 && joystick.Vertical == 0) { - if (isPressMoveUp) - { - vPushDir = Vector3.up; - } - else if (isPressMoveDown) - { - vPushDir = Vector3.down; - } return false; } @@ -4471,22 +4532,10 @@ namespace BrewMonster } else if (m_iMoveEnv == Move_environment.MOVEENV_WATER) { - float angle = Vector2.Angle(new Vector2(joystick.Horizontal, joystick.Vertical), Vector2.up); - angle *= joystick.Horizontal < 0 ? 1 : -1; - Vector2 v2Cam = new Vector2(mainCam.transform.forward.x, mainCam.transform.forward.z); - v2Cam = Quaternion.Euler(0, 0, angle) * v2Cam; - v2Cam.Normalize(); - vPushDir.x = v2Cam.x; - vPushDir.y = ((transform.position + Vector3.up * m_CDRInfo.vExtent.y) - mainCam.transform.position).normalized.y; - if (isPressMoveUp) - { - vPushDir.y = Math.Abs(vPushDir.y) * Time.deltaTime; - } - else if (isPressMoveDown) - { - vPushDir.y = -Math.Abs(vPushDir.y) * Time.deltaTime; - } - vPushDir.z = v2Cam.y; + vPushDir.x = joystick.Horizontal; + vPushDir.y = (transform.position - mainCam.transform.position).normalized.y; + vPushDir.z = joystick.Vertical; + vPushDir.Normalize(); } else { @@ -4506,28 +4555,12 @@ namespace BrewMonster // Is under water bool CanTakeOffWater() { - // TO DO: fix later + return true; //A3DVECTOR3 vPos = GetPos(); //if (vPos.y < EC_Game.GetGameRun().GetWorld().GetWaterHeight(vPos) - m_MoveConst.fShoreDepth) // return false; //else // return true; - - A3DVECTOR3 vPos = GetPos(); - float h0 = 0f; - int countHits0 = Physics.RaycastNonAlloc(EC_Utility.ToVector3(vPos) + Vector3.up * 500f, Vector3.down, hits, 1000f, 1 << 8); - if (countHits0 > 0) - { - h0 = hits[0].point.y; - } - if(vPos.y < h0 - m_MoveConst.fShoreDepth) - { - return false; - } - else - { - return true; - } } bool IsUsingItem() @@ -4551,27 +4584,6 @@ namespace BrewMonster transform.rotation = Quaternion.LookRotation(dir); } - public void SetRotationHPWithTime(Vector3 dir, float time) - { - StartCoroutine(RotateToDir(transform, dir, time)); - } - - IEnumerator RotateToDir(Transform target, Vector3 dir, float duration) - { - Quaternion startRot = target.rotation; - Quaternion endRot = Quaternion.LookRotation(dir); - float t = 0f; - - while (t < duration) - { - t += Time.deltaTime; - target.rotation = Quaternion.Slerp(startRot, endRot, t / duration); - yield return null; - } - - target.rotation = endRot; - } - void SetJumpInWater(bool b) { m_bJumpInWater = b; @@ -5317,7 +5329,7 @@ namespace BrewMonster } // Is under water - public bool IsUnderWater() + bool IsUnderWater() { return m_iMoveEnv == Move_environment.MOVEENV_WATER ? true : false; } @@ -5407,7 +5419,7 @@ namespace BrewMonster VertRayTrace(EC_Utility.ToVector3(vTestPos), ref vGndPos, ref m_GndInfo.vGndNormal, 1000f); m_GndInfo.fGndHei = vGndPos.y; - if (Physics.RaycastNonAlloc(EC_Utility.ToVector3(vTestPos) + Vector3.up * 500f, Vector3.down, hits, 1000f, 1 << 8) > 0) + if(Physics.RaycastNonAlloc(EC_Utility.ToVector3(vTestPos), Vector3.down, hits, 1000f, 1<<8) > 0) { m_GndInfo.fWaterHei = hits[0].point.y; } @@ -5509,13 +5521,13 @@ namespace BrewMonster LayerMask layerMaskTerrain = 1 << 6; LayerMask layerMaskBush = 1 << 7; - if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, layerMaskTerrain) > 0) + if (Physics.RaycastNonAlloc(vPos, (vPos + Vector3.down), hits, layerMaskTerrain) > 0) { vTerrainPos = hits[0].point; vTerrainNormal = hits[0].normal; } - if (Physics.RaycastNonAlloc(vPos, (Vector3.down), hits, DeltaY, layerMaskBush) > 0) + if (Physics.RaycastNonAlloc(vPos, (vPos + Vector3.down), hits, DeltaY, layerMaskTerrain) > 0) { if (vBuildingPos.y > vTerrainPos.y) { @@ -5543,85 +5555,19 @@ namespace BrewMonster vHitPos.y -= DeltaY; LayerMask layerMask = 1 << 6 | 1 << 7; - hits = new RaycastHit[5]; - int count = Physics.BoxCastNonAlloc(vCenter, vExt, (Vector3.down).normalized, - hits, transform.rotation, DeltaY, layerMask); - if (count == 0) + if (Physics.BoxCastNonAlloc(vCenter, vExt, (vCenter + Vector3.down).normalized, + hits, transform.rotation, DeltaY, layerMask) == 0) { vHitPos = vCenter; vHitNormal = EC_Utility.ToA3DVECTOR3(Vector3.up); } else - { - if (Math.Abs(hits[0].distance - 0f) <= float.Epsilon) - { - count = Physics.BoxCastNonAlloc(vCenter, new Vector3(vExt.x, 0.05f, vExt.z), (Vector3.down).normalized, - hits, transform.rotation, DeltaY, layerMask); - if(count == 0) - { - vHitPos = vCenter; - vHitNormal = EC_Utility.ToA3DVECTOR3(Vector3.up); - } - else - { - vHitPos = hits[0].point; - vHitPos.y += vExt.y; - vHitNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal); - } - } + { + vHitPos = hits[0].point; + vHitNormal = EC_Utility.ToA3DVECTOR3(hits[0].normal); } } - void DebugBoxCast(Vector3 center, Vector3 halfExtents, Vector3 direction, - Quaternion orientation, float distance, Color color) - { - Vector3 end = center + direction.normalized * distance; - - // Vẽ box ở vị trí bắt đầu - DebugDrawBox(center, halfExtents, orientation, color); - - // Vẽ box ở vị trí kết thúc - DebugDrawBox(end, halfExtents, orientation, color); - - // Vẽ đường nối giữa 2 box - Debug.DrawLine(center, end, color); - } - - // Vẽ 1 box từ center + halfExtents + rotation - void DebugDrawBox(Vector3 center, Vector3 halfExtents, Quaternion orientation, Color color) - { - var matrix = Matrix4x4.TRS(center, orientation, Vector3.one); - Vector3[] points = { - matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, -halfExtents.y, -halfExtents.z)), - matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, -halfExtents.y, -halfExtents.z)), - matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, -halfExtents.y, halfExtents.z)), - matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, -halfExtents.y, halfExtents.z)), - matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, halfExtents.y, -halfExtents.z)), - matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, halfExtents.y, -halfExtents.z)), - matrix.MultiplyPoint3x4(new Vector3( halfExtents.x, halfExtents.y, halfExtents.z)), - matrix.MultiplyPoint3x4(new Vector3(-halfExtents.x, halfExtents.y, halfExtents.z)) - }; - - // đáy - Debug.DrawLine(points[0], points[1], color); - Debug.DrawLine(points[1], points[2], color); - Debug.DrawLine(points[2], points[3], color); - Debug.DrawLine(points[3], points[0], color); - - // đỉnh - Debug.DrawLine(points[4], points[5], color); - Debug.DrawLine(points[5], points[6], color); - Debug.DrawLine(points[6], points[7], color); - Debug.DrawLine(points[7], points[4], color); - - // cạnh - Debug.DrawLine(points[0], points[4], color); - Debug.DrawLine(points[1], points[5], color); - Debug.DrawLine(points[2], points[6], color); - Debug.DrawLine(points[3], points[7], color); - } - - void OnMsgHstExtProp(ECMSG Msg) { cmd_own_ext_prop pCmd = GPDataTypeHelper.FromBytes((byte[])Msg.dwParam1);