From 47a219866b0c2583b2672549cf24d1673347f272 Mon Sep 17 00:00:00 2001 From: Chomper9981 Date: Mon, 6 Apr 2026 14:31:09 +0700 Subject: [PATCH] Fix some bug related to flying phoenix --- .../Scripts/Managers/EC_HPWorkNavigate.cs | 1 + .../Scripts/Managers/EC_Object.cs | 4 ++++ Assets/PerfectWorld/Scripts/NPC/CECModel.cs | 19 ++++++++++++++++--- .../Scripts/Players/CECHostNavigatePlayer.cs | 8 +++++++- .../Scripts/Players/CECPlayerClone.cs | 15 --------------- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs index 6c55f50f18..14bf5f7c39 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_HPWorkNavigate.cs @@ -598,6 +598,7 @@ namespace BrewMonster.Scripts { pClone.SetPos(new Vector3(vCurPos.x, vCurPos.y, vCurPos.z)); pClone.SetDirAndUp(new A3DVECTOR3(vDir.x, vDir.y, vDir.z), new A3DVECTOR3(vUp.x, vUp.y, vUp.z)); + pClone.ResetHookPosition(); if(pNaviCtrl.GetCurrentNavigateInfo().bezierDir) { pClone.ChangeModelMoveDirAndUp(vDir, vUp); diff --git a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs index d7fb0a78ae..b1ea428c4b 100644 --- a/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs +++ b/Assets/PerfectWorld/Scripts/Managers/EC_Object.cs @@ -95,6 +95,10 @@ public partial class CECObject : MonoBehaviour, ITickable m_vecGroundNormal = Normalize(m_vecGroundNormal * 0.85f + m_vecGroundNormalSet * 0.15f); return true; } + protected virtual void OnDestroy() + { + TickInvoker.Instance.UnregisterTickable(this); + } // Set absolute forward and up direction public virtual void SetDirAndUp(Vector3 vDir, Vector3 vUp) diff --git a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs index 907ad04428..79b992ee74 100644 --- a/Assets/PerfectWorld/Scripts/NPC/CECModel.cs +++ b/Assets/PerfectWorld/Scripts/NPC/CECModel.cs @@ -371,6 +371,7 @@ public class CECModel protected CECModelStaticData m_pMapModel; public SkeletonBuilder m_skeletonBuilder; private Dictionary m_hookCache = new Dictionary(); + private Dictionary m_hangerPositionCache = new Dictionary(); private Dictionary m_childModels = new Dictionary(); private Transform m_transform; public bool InheritParentId() => m_bInheritParentId; @@ -603,7 +604,6 @@ public class CECModel if (pChild == null) { - Debug.LogError($"CECModel::AddChildModel, pChild is null"); return false; } @@ -611,7 +611,6 @@ public class CECModel Transform hangger = pChild.m_skeletonBuilder.GetHook(szCCName, true); if (hook == null || hangger == null) { - Debug.LogError($"CECModel::AddChildModel, hook or hanger missing (hook={szHookName}, cc={szCCName})"); return false; } @@ -620,7 +619,9 @@ public class CECModel Vector3 worldAlign = hook.position - hangger.position; pChild.transform.position += worldAlign; pChild.transform.SetParent(hook.transform, true); - + m_hookCache.Add(szHookName, hook); + m_childModels.Add(szHookName, pChild); + m_hangerPositionCache.Add(szHookName, hangger); // if (m_pA3DSkinModel && pChild->m_pA3DSkinModel) // { // if (!m_pA3DSkinModel->AddChildModel( @@ -647,6 +648,18 @@ public class CECModel m_childModels[szHangerName] = pChild; return true; } + public void ResetHookPosition(string szHookName) + { + Transform hook = m_hookCache.TryGetValue(szHookName, out Transform cachedHook) ? cachedHook : null; + Transform hangger = m_hangerPositionCache.TryGetValue(szHookName, out Transform cachedHangger) ? cachedHangger : null; + GameObject childObject = m_childModels.TryGetValue(szHookName, out CECModel child) ? child.m_pPlayerModel : null; + + if (hook != null && hangger != null && child != null) + { + Vector3 worldAlign = hook.position - hangger.position; + child.transform.position += worldAlign; + } + } public void PlayGfx(string szPath, string szHook, float fScale, bool bFadeOut, A3DVECTOR3 vOffset, float fPitch, float fYaw, float fRot, bool bUseECMHook, uint dwFadeOutTime) { if (!bFadeOut) diff --git a/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs index 6358535e7b..88f59eb123 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECHostNavigatePlayer.cs @@ -333,6 +333,13 @@ namespace BrewMonster.Scripts m_bAdjustOrient = false; } } + public void ResetHookPosition() + { + if (m_pNavigateModel != null) + { + m_pNavigateModel.ResetHookPosition(_hh_ride); + } + } protected override bool ShouldLoadEquipment(int index) { return index != InventoryConst.EQUIPIVTR_FLYSWORD; @@ -381,7 +388,6 @@ namespace BrewMonster.Scripts // PlayAction(GetMoveStandAction(false, IsFighting()), 1.0f, true); PlayNavigateAction(); - m_bNavigateModelApplied = true; OnNavigateEvent(0, (int)CECNavigateCtrl.NavigateEvent.EM_BEGIN); diff --git a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs index 13c2a0adc2..db2433f3d4 100644 --- a/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs +++ b/Assets/PerfectWorld/Scripts/Players/CECPlayerClone.cs @@ -97,21 +97,6 @@ namespace BrewMonster } return await Load(player, atOnce); } - public override void SetDirAndUp(A3DVECTOR3 vDir, A3DVECTOR3 vUp){ - base.SetDirAndUp(vDir, vUp); - if(m_pPlayerCECModel != null) - { - Vector3 dir = new Vector3(vDir.x, vDir.y, vDir.z); - Vector3 up = new Vector3(vUp.x, vUp.y, vUp.z); - if (dir.magnitude > 0.01f) - { - Quaternion lookRot = Quaternion.LookRotation(dir, up); - m_pPlayerCECModel.m_pPlayerModel.transform.rotation = lookRot; - } - m_bAdjustOrient = false; - } - //m_pPlayerCECModel.SetDirAndUp(vDir,vUp); - } protected async Task Load(CECPlayer player, bool atOnce){ player.CloneSimplePropertyTo(this); OnCloneSimpleProperty();