From 01672cde165c89c95655436abe6ba95ab5ed7c5c Mon Sep 17 00:00:00 2001 From: VuNgocHaiC7 Date: Thu, 5 Mar 2026 17:40:09 +0700 Subject: [PATCH] Update DlgPetDetail for DlgPetList --- .../Scripts/UI/Dialogs/DlgPetDetail.cs | 220 ++++++++++++++++++ .../Scripts/UI/Dialogs/DlgPetDetail.cs.meta | 2 + .../Scripts/UI/Dialogs/DlgPetList.cs | 58 +---- Assets/PerfectWorld/UI/Pet/DlgPetList.prefab | 37 ++- 4 files changed, 257 insertions(+), 60 deletions(-) create mode 100644 Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs create mode 100644 Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs.meta diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs new file mode 100644 index 0000000000..cc99e86463 --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs @@ -0,0 +1,220 @@ +using BrewMonster.Network; +using BrewMonster.Scripts.Pet; +using CSNetwork.GPDataType; +using ModelRenderer.Scripts.GameData; +using System; +using System.Collections.Generic; +using System.IO; +using TMPro; +using UnityEngine; +using UnityEngine.UI; + +namespace BrewMonster.UI +{ + public class DlgPetDetail : AUIDialog + { + [SerializeField] private Image m_iconPet; + [SerializeField] private TMP_Text m_textPetName; + [SerializeField] private TMP_Text m_textLevel; + [SerializeField] private TMP_Text m_textExp; + [SerializeField] private TMP_Text m_descPet; + [SerializeField] private Sprite m_spriteDefault_Icon; + + private int m_nSlot; + + public void UpdatePet(int nSlot) + { + if (nSlot != -1) + { + m_nSlot = nSlot; + Show(true); + UpdatePetInternal(); + } + } + + private void UpdatePetInternal() + { + var pDB = ElementDataManProvider.GetElementDataMan(); + if(pDB == null) + { + return; + } + + var host = CECGameRun.Instance?.GetHostPlayer(); + if (host == null) + return; + + var pPetCorral = host.GetPetCorral(); + if(pPetCorral == null) + return; + + var pPet = pPetCorral.GetPetData(m_nSlot); + if(pPet == null) + return; + + int nLevel = pPet.GetLevel(); + m_textPetName.text = pPet.GetName(); + + m_textPetName.text = pPet.GetName(); + m_textLevel.text = "Cấp " + nLevel.ToString(); + m_textExp.text = "EXP " + $"{pPet.GetExp()} / {pPet.GetMaxExp()}"; + + DATA_TYPE dataType = DATA_TYPE.DT_INVALID; + var petEssenceData = pDB.get_data_ptr((uint)pPet.GetTemplateID(), ID_SPACE.ID_SPACE_ESSENCE, ref dataType); + + if (petEssenceData != null && dataType == DATA_TYPE.DT_PET_ESSENCE) + { + var pPetEssence = (PET_ESSENCE)petEssenceData; + + UpdatePetIcon(pPetEssence); + + if (pPet.GetClass() == (int)GP_PET_TYPE.GP_PET_CLASS_MOUNT || + pPet.GetClass() == (int)GP_PET_TYPE.GP_PET_CLASS_COMBAT || + pPet.GetClass() == (int)GP_PET_TYPE.GP_PET_CLASS_EVOLUTION) + { + string description = BuildPetDescription(pPet, pPetEssence, nLevel); + m_descPet.text = description; + } + } + else + { + if(m_spriteDefault_Icon != null) + m_iconPet.sprite = m_spriteDefault_Icon; + } + } + + private void UpdatePetIcon(PET_ESSENCE pPetEssence) + { + if (m_iconPet == null) + return; + + try + { + string strFile = Path.GetFileNameWithoutExtension(pPetEssence.FileIcon).ToLower(); + var sprite = EC_Game.GetGameRun().GetUIManager().GetSpriteInListIvtr(strFile); + + if (sprite != null) + { + m_iconPet.sprite = sprite; + m_iconPet.enabled = true; + m_iconPet.color = Color.white; + } + else + { + m_iconPet.sprite = m_spriteDefault_Icon; + } + } + catch (Exception ex) + { + Debug.LogError($"[DlgPetDetail] Error loading pet icon: {ex.Message}"); + m_iconPet.sprite = m_spriteDefault_Icon; + } + } + + private string BuildPetDescription(CECPetData pPet, PET_ESSENCE pEssence, int nLevel) + { + string desc = ""; + + // Loyalty + int intimacy = pPet.GetIntimacy(); + string loyaltyLevel = GetLoyaltyLevel(intimacy); + desc += $"Lòng trung thành: {loyaltyLevel} ({intimacy})\n"; + + // Hunger + int hunger = pPet.GetHunger(); + string hungerLevel = GetHungerLevel(hunger); + desc += $"Đói: {hungerLevel} \n"; + + // Move Speed + float speed = pEssence.speed_a + pEssence.speed_b * (nLevel - 1); + desc += $"Tốc độ di chuyển: {speed:F2}\n"; + + // Required Level + desc += $"Cấp yêu cầu: {pEssence.level_require}\n"; + + return desc; + + } + + private string GetLoyaltyLevel(int intimacy) + { + if (intimacy <= 50) + { + return " Nho hon bang 50"; + } + else if(intimacy <= 150) + { + return "Bang 50 den 150"; + } + else if (intimacy <= 500) + { + return "Bang 300 den 500"; + } + else + { + return "Lon hon bang 500"; + } + } + + private string GetHungerLevel(int hunger) + { + if(hunger == (int)CECPetData.ePetData_HUNGER_LEVEL.HUNGER_LEVEL_0) + { + return "Chet doi"; + } + else if(hunger == (int)CECPetData.ePetData_HUNGER_LEVEL.HUNGER_LEVEL_1) + { + return "Rat doi"; + } + else if (hunger == (int)CECPetData.ePetData_HUNGER_LEVEL.HUNGER_LEVEL_2) + { + return "doi"; + } + else if (hunger == (int)CECPetData.ePetData_HUNGER_LEVEL.HUNGER_LEVEL_4) + { + return "binh thuong"; + } + else if (hunger == (int)CECPetData.ePetData_HUNGER_LEVEL.HUNGER_LEVEL_7) + { + return "no"; + } + else + { + return "rat no"; + } + } + + private void ClearPetDetail() + { + if(m_textPetName != null) + { + m_textPetName.text = "___"; + } + if(m_textLevel != null) + { + m_textLevel.text = "___"; + } + if(m_textExp != null) + { + m_textExp.text = "___"; + } + if (m_iconPet != null && m_spriteDefault_Icon != null) + { + m_iconPet.sprite = m_spriteDefault_Icon; + } + if(m_descPet != null) + { + m_descPet.text = "___"; + } + } + + //public override bool Render() + //{ + // if (m_nSlot >= 0) + // { + // UpdatePetInternal(); + // } + // return base.Render(); + //} + } +} diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs.meta b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs.meta new file mode 100644 index 0000000000..59344b465d --- /dev/null +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetDetail.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ce0ac818dfef5e04e92aa1ed022893bd \ No newline at end of file diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs index 6db5ce3a51..22af527c73 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetList.cs @@ -316,18 +316,12 @@ namespace BrewMonster.UI [SerializeField] private Button m_btnHome; [SerializeField] private Button m_btnOut; - [Header("Pet Decs")] - [SerializeField] private Image m_iconPet; - [SerializeField] private TMP_Text m_namePet; - [SerializeField] private TMP_Text m_levelPet; - [SerializeField] private TMP_Text m_expPet; - [SerializeField] private Sprite m_spriteDefault_Icon; - + [Header("References")] + [SerializeField] private DlgPetDetail m_dlgPetDetail; private List m_spawnedSlots = new List(); private int m_nPageIndex = 0; - private CECPetData m_currentSelectedPet; - private int m_currentSelectSlotIndex; + private int m_currentSelectSlotIndex = -1; public void OnInitDialog() { @@ -408,51 +402,15 @@ namespace BrewMonster.UI if (pPetData != null) { m_currentSelectSlotIndex = slotIndex; - UpdatePetDetails(pPetData); UpdateButtonStates(); + + if (m_dlgPetDetail != null) + { + m_dlgPetDetail.UpdatePet(slotIndex); + } } } - private void UpdatePetDetails(CECPetData pPet) - { - if (pPet == null) - { - m_namePet.text = "___"; - m_levelPet.text = "___"; - m_expPet.text = "___"; - if(m_spriteDefault_Icon != null) - m_iconPet.sprite = m_spriteDefault_Icon; - return; - } - - m_currentSelectedPet = pPet; - m_namePet.text = pPet.GetName(); - m_levelPet.text = $"Cấp {pPet.GetLevel()}"; - int currentExp = pPet.GetExp(); - int maxExp = pPet.GetMaxExp(); - m_expPet.text = $"EXP: {currentExp} / {maxExp}"; - - UpdatePetIcon(pPet.GetTemplateID()); - } - - private void UpdatePetIcon(int templateID) - { - var pDB = ElementDataManProvider.GetElementDataMan(); - DATA_TYPE dataType = new DATA_TYPE(); - object pDBEssence = pDB.get_data_ptr((uint)templateID, ID_SPACE.ID_SPACE_ESSENCE, ref dataType); - - if (pDBEssence != null) - { - PET_ESSENCE pPET = (PET_ESSENCE)pDBEssence; - string strFile = Path.GetFileNameWithoutExtension(pPET.FileIcon).ToLower(); - m_iconPet.sprite = EC_Game.GetGameRun().GetUIManager().GetSpriteInListIvtr(strFile); - } - else - { - if(m_spriteDefault_Icon != null) - m_iconPet.sprite = m_spriteDefault_Icon; - } - } private void UpdateButtonStates() { diff --git a/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab b/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab index d892ebe4bd..7b64d5e63f 100644 --- a/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab +++ b/Assets/PerfectWorld/UI/Pet/DlgPetList.prefab @@ -236,18 +236,18 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 606266655932021657} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1624473230281581442} - {fileID: 6586898985852894528} - m_Father: {fileID: 7889082681244863727} + m_Father: {fileID: 2996968374502470470} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 54.85501} + m_AnchoredPosition: {x: 486.0603, y: 87.08179} m_SizeDelta: {x: 548, y: 109.71002} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7484416968689902533 @@ -1469,11 +1469,7 @@ MonoBehaviour: m_btnClose: {fileID: 8122086289517642079} m_btnHome: {fileID: 2385823678917970113} m_btnOut: {fileID: 3388903545038814812} - m_iconPet: {fileID: 3806612095625030478} - m_namePet: {fileID: 3493020700139178670} - m_levelPet: {fileID: 7602645980480065390} - m_expPet: {fileID: 1618158093982489839} - m_spriteDefault_Icon: {fileID: 21300000, guid: a5366f3bce011c046902e39b6bd3a077, type: 3} + m_dlgPetDetail: {fileID: 1175093797040640902} --- !u!1 &5447703489185023651 GameObject: m_ObjectHideFlags: 0 @@ -1485,8 +1481,9 @@ GameObject: - component: {fileID: 7889082681244863727} - component: {fileID: 1820092494333766511} - component: {fileID: 5179896020678852059} + - component: {fileID: 1175093797040640902} m_Layer: 5 - m_Name: right_petInfo + m_Name: pet_detail_info m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1509,7 +1506,6 @@ RectTransform: - {fileID: 2365663903306128583} - {fileID: 5708822584962701248} - {fileID: 8882903949157006170} - - {fileID: 6165010831916478045} m_Father: {fileID: 2996968374502470470} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0.5} @@ -1555,6 +1551,26 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1175093797040640902 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5447703489185023651} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ce0ac818dfef5e04e92aa1ed022893bd, type: 3} + m_Name: + m_EditorClassIdentifier: + skillNameText: {fileID: 0} + imageProgress: {fileID: 0} + m_iconPet: {fileID: 3806612095625030478} + m_textPetName: {fileID: 3493020700139178670} + m_textLevel: {fileID: 7602645980480065390} + m_textExp: {fileID: 1618158093982489839} + m_descPet: {fileID: 164215783080885169} + m_spriteDefault_Icon: {fileID: 21300000, guid: 8b997e886fff00540b9c069a9dff12af, type: 3} --- !u!1 &6029267655065740123 GameObject: m_ObjectHideFlags: 0 @@ -1680,6 +1696,7 @@ RectTransform: - {fileID: 232399539067632254} - {fileID: 7889082681244863727} - {fileID: 3045035826663144425} + - {fileID: 6165010831916478045} m_Father: {fileID: 5951834544630940226} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0}