From 45f69c9f44f9544cb6a2b077f7113fb4d8e9a1a6 Mon Sep 17 00:00:00 2001 From: VDH Date: Wed, 10 Dec 2025 18:17:34 +0700 Subject: [PATCH] skill ui --- .../AddressableAssetSettings.asset | 2 +- .../Scripts/Managers/CECManager.cs | 3 + .../Scripts/ModelFiles/CECTaoistRank.cs | 46 +- .../Scripts/Skills/ElementSkill.cs | 4 + .../Scripts/Skills/SkillWrapper.cs | 29 +- .../PerfectWorld/Scripts/Skills/skill177.cs | 3 + .../PerfectWorld/Scripts/Skills/skill178.cs | 3 + Assets/PerfectWorld/Scripts/Skills/skill54.cs | 3 + Assets/PerfectWorld/Scripts/Skills/skill56.cs | 3 + Assets/PerfectWorld/Scripts/Skills/skill57.cs | 3 + Assets/PerfectWorld/Scripts/Skills/skill58.cs | 3 + Assets/PerfectWorld/Scripts/Skills/skill76.cs | 3 + .../Scripts/UI/Dialogs/CDlgSkillSubList.cs | 244 ++--- .../Scripts/UI/GamePlay/SkillUI.meta | 8 + .../UI/GamePlay/SkillUI/AUISubDialog.cs | 95 ++ .../UI/GamePlay/SkillUI/AUISubDialog.cs.meta | 2 + .../GamePlay/SkillUI/CDlgSkillSubListItem.cs | 47 + .../SkillUI/CDlgSkillSubListItem.cs.meta | 2 + Assets/Prefabs/UI/SkillUI.prefab | 900 ++++++++++++++---- Assets/Scenes/a61.unity | 4 +- .../LiberationSans SDF - Fallback.asset | 174 +++- 21 files changed, 1182 insertions(+), 399 deletions(-) create mode 100644 Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI.meta create mode 100644 Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/AUISubDialog.cs create mode 100644 Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/AUISubDialog.cs.meta create mode 100644 Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/CDlgSkillSubListItem.cs create mode 100644 Assets/PerfectWorld/Scripts/UI/GamePlay/SkillUI/CDlgSkillSubListItem.cs.meta diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Assets/AddressableAssetsData/AddressableAssetSettings.asset index 9eb456e0fc..518cb4dea8 100644 --- a/Assets/AddressableAssetsData/AddressableAssetSettings.asset +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_DefaultGroup: 712e3991f28e549e7a56ee582a977810 m_currentHash: serializedVersion: 2 - Hash: e55a5907432af172f87a7ccca800fef4 + Hash: 2b260a6f4d09eb87199ab9c362c7be67 m_OptimizeCatalogSize: 0 m_BuildRemoteCatalog: 0 m_CatalogRequestsTimeout: 0 diff --git a/Assets/PerfectWorld/Scripts/Managers/CECManager.cs b/Assets/PerfectWorld/Scripts/Managers/CECManager.cs index bd10413956..df351edb39 100644 --- a/Assets/PerfectWorld/Scripts/Managers/CECManager.cs +++ b/Assets/PerfectWorld/Scripts/Managers/CECManager.cs @@ -124,6 +124,9 @@ namespace BrewMonster.Managers + + + diff --git a/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs b/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs index 0d185ccbf0..fbc715303f 100644 --- a/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs +++ b/Assets/PerfectWorld/Scripts/ModelFiles/CECTaoistRank.cs @@ -5,17 +5,26 @@ namespace BrewMonster { public class CECTaoistRank { - private int m_id; // ���漶���ID - private string m_name; // ���漶���ID + private int m_id; // ���漶���ID / Rank ID + private string m_name; // ���漶���ID / Rank name private CECTaoistRank m_next; static bool initComplete = false; public static CECTaoistRank[] s_allTaoistRanks = new CECTaoistRank[(int)ToaistRank.TotalRankCount]; public static readonly int[] TaoistRankIDs = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 20, 21, 22, 30, 31, 32 }; + public int GetID() + { + return m_id; + } + + public string GetName() + { + return string.IsNullOrEmpty(m_name) ? $"Rank {m_id}" : m_name; + } + public bool IsGodRank() { - CECTaoistRank GodRank; for (GodRank = GetGodRankBegin(); GodRank != GetGodRankEnd(); GodRank = GodRank.GetNext()) @@ -27,22 +36,37 @@ namespace BrewMonster } return false; } - public CECTaoistRank GetGodRankBegin() + + public static CECTaoistRank GetBaseRankBegin() + { + init(); + return s_allTaoistRanks[0]; + } + + public static CECTaoistRank GetBaseRankEnd() + { + init(); + return s_allTaoistRanks[(int)ToaistRank.BaseRankCount - 1].m_next; + } + + public static CECTaoistRank GetGodRankBegin() { init(); return s_allTaoistRanks[(int)ToaistRank.BaseRankCount]; } - public CECTaoistRank GetGodRankEnd() + public static CECTaoistRank GetGodRankEnd() { init(); return GetLastGodRank().m_next; } - public CECTaoistRank GetLastGodRank() + + public static CECTaoistRank GetLastGodRank() { init(); return s_allTaoistRanks[(int)ToaistRank.BaseRankCount + (int)ToaistRank.GodRankCount - 1]; } + public bool IsEvilRank() { CECTaoistRank EvilRank; @@ -56,25 +80,30 @@ namespace BrewMonster } return false; } + public CECTaoistRank GetNext() { return m_next; } + public static CECTaoistRank GetEvilRankBegin() { init(); return s_allTaoistRanks[(int)ToaistRank.BaseRankCount + (int)ToaistRank.GodRankCount]; } + public static CECTaoistRank GetEvilRankEnd() { init(); return GetLastEvilRank().m_next; } + public static CECTaoistRank GetLastEvilRank() { init(); return s_allTaoistRanks[(int)ToaistRank.TotalRankCount - 1]; } + public static CECTaoistRank GetTaoistRank(int id) { init(); @@ -87,6 +116,7 @@ namespace BrewMonster } return null; } + public static void init() { if (initComplete) @@ -95,6 +125,10 @@ namespace BrewMonster } for (int i = 0; i < (int)ToaistRank.TotalRankCount; i++) { + if (s_allTaoistRanks[i] == null) + { + s_allTaoistRanks[i] = new CECTaoistRank(); + } s_allTaoistRanks[i].m_id = TaoistRankIDs[i]; /* s_allTaoistRanks[i].m_name = g_pGame->GetGameRun()->GetUIManager()->GetInGameUIMan()->GetStringFromTable(1001 + s_allTaoistRanks[i].m_id);*/ diff --git a/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs b/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs index 565244e01b..43ab8648e3 100644 --- a/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs +++ b/Assets/PerfectWorld/Scripts/Skills/ElementSkill.cs @@ -210,6 +210,10 @@ namespace BrewMonster.Scripts.Skills { SkillWrapper.Instance.LoadData(data); } + public static bool IsOverridden(uint id) + { + return SkillWrapper.Instance.IsOverridden(id); + } public virtual int GetRank() { return 0; } // ѧϰn������Ҫ�����Ҽ��� public virtual int GetRequiredLevel() { return 0; } diff --git a/Assets/PerfectWorld/Scripts/Skills/SkillWrapper.cs b/Assets/PerfectWorld/Scripts/Skills/SkillWrapper.cs index 031e4aae5a..3950be8ad4 100644 --- a/Assets/PerfectWorld/Scripts/Skills/SkillWrapper.cs +++ b/Assets/PerfectWorld/Scripts/Skills/SkillWrapper.cs @@ -1,4 +1,5 @@ -using CSNetwork.GPDataType; +using BrewMonster.Scripts.Skills; +using CSNetwork.GPDataType; using System; using System.Collections.Generic; using System.Linq; @@ -22,7 +23,7 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.Skills { map.Clear(); PersistentData skill; - + for (int i = 0; i < (int)pdata.skill_count; i++) { cmd_skill_data.SKILL item = pdata.skill_list[i]; @@ -31,5 +32,29 @@ namespace BrewMonster.Assets.PerfectWorld.Scripts.Skills map[(uint)item.id_skill] = skill; } } + public bool IsOverridden(uint id) + { + foreach (var kvp in map) + { + // giả sử bạn cũng có overload IsOverridden(uint id, uint otherId) + if (IsOverridden(id, kvp.Key)) + return true; + } + + return false; + } + public bool IsOverridden(uint id, uint senior_id) + { + SkillStub stub = SkillStub.GetStub(senior_id); + if (stub == null || stub.is_senior == 0) return false; + + foreach (var pre_id in stub.pre_skills.Keys) + { + if (pre_id <= 0) continue; + if (id == pre_id) return true; + if (IsOverridden(id, pre_id)) return true; + } + return false; + } } } diff --git a/Assets/PerfectWorld/Scripts/Skills/skill177.cs b/Assets/PerfectWorld/Scripts/Skills/skill177.cs index bfa2b8ec42..23846e581a 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill177.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill177.cs @@ -235,3 +235,6 @@ namespace BrewMonster + + + diff --git a/Assets/PerfectWorld/Scripts/Skills/skill178.cs b/Assets/PerfectWorld/Scripts/Skills/skill178.cs index 190223f253..c4d5679910 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill178.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill178.cs @@ -235,3 +235,6 @@ namespace BrewMonster + + + diff --git a/Assets/PerfectWorld/Scripts/Skills/skill54.cs b/Assets/PerfectWorld/Scripts/Skills/skill54.cs index 195c7cab7a..723657f04d 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill54.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill54.cs @@ -332,3 +332,6 @@ namespace BrewMonster + + + diff --git a/Assets/PerfectWorld/Scripts/Skills/skill56.cs b/Assets/PerfectWorld/Scripts/Skills/skill56.cs index b2c127e24a..ea85a3fc9b 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill56.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill56.cs @@ -326,3 +326,6 @@ namespace BrewMonster + + + diff --git a/Assets/PerfectWorld/Scripts/Skills/skill57.cs b/Assets/PerfectWorld/Scripts/Skills/skill57.cs index 7e30059c6c..5a90bca39b 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill57.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill57.cs @@ -337,3 +337,6 @@ namespace BrewMonster + + + diff --git a/Assets/PerfectWorld/Scripts/Skills/skill58.cs b/Assets/PerfectWorld/Scripts/Skills/skill58.cs index a4c776189e..aea5aae697 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill58.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill58.cs @@ -330,3 +330,6 @@ namespace BrewMonster + + + diff --git a/Assets/PerfectWorld/Scripts/Skills/skill76.cs b/Assets/PerfectWorld/Scripts/Skills/skill76.cs index 6351f404d4..38bb80c9a2 100644 --- a/Assets/PerfectWorld/Scripts/Skills/skill76.cs +++ b/Assets/PerfectWorld/Scripts/Skills/skill76.cs @@ -240,3 +240,6 @@ namespace BrewMonster + + + diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubList.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubList.cs index a099392dd4..e565db6166 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubList.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/CDlgSkillSubList.cs @@ -111,20 +111,36 @@ namespace BrewMonster.UI } m_bAllocRankDlgs = true; - foreach (int rankId in EnumerateAllRankIds()) + for (CECTaoistRank taoistRank = CECTaoistRank.GetBaseRankBegin(); + taoistRank != CECTaoistRank.GetBaseRankEnd(); + taoistRank = taoistRank.GetNext()) { - CreateOneRankDlg(rankId); + CreateOneRankDlg(taoistRank); + } + + for (CECTaoistRank taoistRank = CECTaoistRank.GetGodRankBegin(); + taoistRank != CECTaoistRank.GetGodRankEnd(); + taoistRank = taoistRank.GetNext()) + { + CreateOneRankDlg(taoistRank); + } + + for (CECTaoistRank taoistRank = CECTaoistRank.GetEvilRankBegin(); + taoistRank != CECTaoistRank.GetEvilRankEnd(); + taoistRank = taoistRank.GetNext()) + { + CreateOneRankDlg(taoistRank); } } // ��ʼ�����������ڶԻ���һ���Է�����ڴ� / Initialize rank sub-dialogs once to avoid realloc - private void CreateOneRankDlg(int rankID) + private void CreateOneRankDlg(CECTaoistRank taoistRank) { AUISubDialog pSubRank = Instantiate(m_pSubRank, m_contentRoot); - pSubRank.SetName($"{m_pSubRank.GetName()}{rankID}"); + pSubRank.SetName($"{m_pSubRank.GetName()}{taoistRank.GetID()}"); pSubRank.Show(false); - m_rankSubDialogs[rankID] = pSubRank; + m_rankSubDialogs[taoistRank.GetID()] = pSubRank; } // ���¶������Ի�����в��� / Reset dialog with all rank/skill sub dialogs @@ -146,19 +162,31 @@ namespace BrewMonster.UI IReadOnlyDictionary> allRankProfSkills = CECHostSkillModel.Instance?.GetAllRankProfSkills(); - foreach (int rankId in EnumerateBaseRankIds()) + for (CECTaoistRank taoistRank = CECTaoistRank.GetBaseRankBegin(); + taoistRank != CECTaoistRank.GetBaseRankEnd(); + taoistRank = taoistRank.GetNext()) { - AddDlgsOfOneRank(rankId, allRankProfSkills); + BMLogger.LogError("CDlgSkillSubList::ResetDialog: Adding GetBaseRankBegin rank " + taoistRank.GetID()); + + //AddDlgsOfOneRank(taoistRank); } - foreach (int rankId in EnumerateGodRankIds()) + for (CECTaoistRank taoistRank = CECTaoistRank.GetGodRankBegin(); + taoistRank != CECTaoistRank.GetGodRankEnd(); + taoistRank = taoistRank.GetNext()) { - AddDlgsOfOneRank(rankId, allRankProfSkills); + BMLogger.LogError("CDlgSkillSubList::ResetDialog: Adding GetGodRankBegin rank "+ taoistRank.GetID()); + + //AddDlgsOfOneRank(taoistRank); } - foreach (int rankId in EnumerateEvilRankIds()) + for (CECTaoistRank taoistRank = CECTaoistRank.GetEvilRankBegin(); + taoistRank != CECTaoistRank.GetEvilRankEnd(); + taoistRank = taoistRank.GetNext()) { - AddDlgsOfOneRank(rankId, allRankProfSkills); + BMLogger.LogError("CDlgSkillSubList::ResetDialog: Adding GetEvilRankBegin rank " + taoistRank.GetID()); + + //AddDlgsOfOneRank(taoistRank); } if (m_contentRoot != null) @@ -243,23 +271,56 @@ namespace BrewMonster.UI } // ��ijһ�����漶���Ӧ�����м���������Ի��� / Add dialogs for one rank - private void AddDlgsOfOneRank(int rankID, IReadOnlyDictionary> allRankProfSkills) + private void AddDlgsOfOneRank(CECTaoistRank taoistRank) { + CECHostSkillModel model = CECHostSkillModel.Instance; + IReadOnlyDictionary> allRankProfSkills = model.GetAllRankProfSkills(); + + int rankID = taoistRank.GetID(); + if (allRankProfSkills == null) { return; } - - if (IsEvil() && IsGodRank(rankID)) + if (IsEvil() && taoistRank.IsGodRank()) { return; } - else if (!IsEvil() && IsEvilRank(rankID)) + else if (!IsEvil() && taoistRank.IsEvilRank()) { return; } - if (!allRankProfSkills.TryGetValue(rankID, out var rankSkills) || rankSkills == null || rankSkills.Count == 0) + + if (!allRankProfSkills.TryGetValue(rankID, out var rankItr) || rankItr == null || rankItr.Count == 0) + { + return; + } + + List rankSkills = new List(); + foreach (var skillID in rankItr) + { + if (ElementSkill.IsOverridden((uint)skillID)) + { + continue; + } + /* bool bOnlyShowSkillCanLearn = GetGameUIMan()->m_pDlgSkillAction->IsOnlyShowSkillCanLearn(); + if (bOnlyShowSkillCanLearn) + { + if (model.GetSkillFitLevel(skillID) == CECHostSkillModel::SKILL_NOT_FIT_LEVEL) + { + continue; + } + int curLevel = model.GetSkillCurrentLevel(skillID); + int requiredItem = model.GetRequiredBook(skillID, curLevel + 1); + if (requiredItem && !model.CheckPreItem(requiredItem)) + { + continue; + } + }*/ + rankSkills.Add(skillID); + } + if (rankSkills.Count == 0) { return; } @@ -278,27 +339,6 @@ namespace BrewMonster.UI return $"Rank {rankID}"; } - private static IEnumerable EnumerateAllRankIds() - { - return CECTaoistRank.TaoistRankIDs; - } - - private static IEnumerable EnumerateBaseRankIds() - { - return CECTaoistRank.TaoistRankIDs.Take((int)ToaistRank.BaseRankCount); - } - - private static IEnumerable EnumerateGodRankIds() - { - return CECTaoistRank.TaoistRankIDs.Skip((int)ToaistRank.BaseRankCount) - .Take((int)ToaistRank.GodRankCount); - } - - private static IEnumerable EnumerateEvilRankIds() - { - return CECTaoistRank.TaoistRankIDs.Skip((int)ToaistRank.BaseRankCount + (int)ToaistRank.GodRankCount); - } - // ����������洢��λ�õ���ȡֵ / Scroll helpers use the stored positions public void ScrollToShowSelectedSkill() { @@ -488,134 +528,4 @@ namespace BrewMonster.UI } } } - - [DisallowMultipleComponent] - public class AUISubDialog : MonoBehaviour - { - [SerializeField] private AUIDialog m_subDialog; - [SerializeField] private RectTransform m_rectTransform; - private int m_data; - - private void Reset() - { - if (m_rectTransform == null) - { - m_rectTransform = transform as RectTransform; - } - if (m_subDialog == null) - { - m_subDialog = GetComponent(); - } - } - - public void SetDialog(AUIDialog dialog) - { - m_subDialog = dialog; - } - - public AUIDialog GetSubDialog() - { - return m_subDialog; - } - - public string GetName() - { - return name; - } - - public void SetName(string newName) - { - name = newName; - } - - public Vector2Int GetSize() - { - if (m_rectTransform == null) - { - m_rectTransform = transform as RectTransform; - } - - return m_rectTransform != null - ? Vector2Int.RoundToInt(m_rectTransform.rect.size) - : Vector2Int.zero; - } - - public Vector2 GetPos() - { - if (m_rectTransform == null) - { - m_rectTransform = transform as RectTransform; - } - - return m_rectTransform != null ? m_rectTransform.anchoredPosition : Vector2.zero; - } - - public void SetPos(float x, float y) - { - if (m_rectTransform == null) - { - m_rectTransform = transform as RectTransform; - } - - if (m_rectTransform != null) - { - m_rectTransform.anchoredPosition = new Vector2(x, y); - } - } - - public void Show(bool value) - { - gameObject.SetActive(value); - } - - public void SetData(int data) - { - m_data = data; - } - - public int GetData() - { - return m_data; - } - } - - [DisallowMultipleComponent] - public class CDlgSkillSubListItem : MonoBehaviour - { - [SerializeField] private TextMeshProUGUI m_nameText; - [SerializeField] private GameObject m_highlight; - - private int m_skillID; - - public void UpdateSkill(int skillID) - { - m_skillID = skillID; - if (m_nameText != null) - { - m_nameText.text = CECHostSkillModel.Instance?.GetSkillName(skillID) ?? $"Skill {skillID}"; - } - } - - public void SetHighlight(bool bHighlight) - { - if (m_highlight != null) - { - m_highlight.SetActive(bHighlight); - } - } - - public void EnableUpgrade(bool bEnable) - { - Button btn = GetComponentInChildren