From b60fe6fa6f16e22b9c12cfb17acced8d67d65f85 Mon Sep 17 00:00:00 2001 From: VuNgocHaiC7 Date: Fri, 27 Feb 2026 15:34:12 +0700 Subject: [PATCH] update code DlgPetRec --- .../Scripts/UI/Dialogs/DlgPetRec.cs | 388 ++++++++++-------- 1 file changed, 228 insertions(+), 160 deletions(-) diff --git a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs index 3c78eb1cdb..19a08232a3 100644 --- a/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs +++ b/Assets/PerfectWorld/Scripts/UI/Dialogs/DlgPetRec.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.IO; using BrewMonster.Network; -using BrewMonster.Scripts.Managers; using BrewMonster.Scripts.Pet; using TMPro; using UnityEngine; @@ -22,44 +21,39 @@ namespace BrewMonster.UI [Header("Pet List")] [SerializeField] private Button[] m_pBtn_PetSlots = new Button[PETSLOT_MAX]; - [Header("Button")] + [Header("Button")] [SerializeField] private Button m_btnComfirm; [SerializeField] private Button m_btnCancle; [SerializeField] private Button m_btnClose; - [Header("Icon Default")] + [Header("Icon Default")] [SerializeField] private Sprite m_defaultIcon; - - private int m_nSlot= -1; + + private int m_nSlot = -1; private CECPetData m_pCurrentPet = null; private CECPetData[] m_petSlots = new CECPetData[PETSLOT_MAX]; - - private float m_doubleClickTime = 1f; - private Dictionary m_lastClickTime = new Dictionary(); - private GameObject m_draggedIcon; - private int m_draggedSlotIndex = -1; + private float m_doubleClickTime = 0.3f; + private Dictionary m_lastClickTime = new Dictionary(); + private GameObject m_draggedIcon = null; public override void Awake() { base.Awake(); - RegisterClick(m_pImg_Item.transform, OnClickTargetSlot); + RegisterTargetSlotEvents(m_pImg_Item.transform); - for(int i=0; i< PETSLOT_MAX; i++) + for (int i = 0; i < PETSLOT_MAX; i++) { int slotIndex = i; // Capture the current value of i for the lambda - RegisterDoubleClickOnPetSlot(m_pBtn_PetSlots[i], slotIndex); - RegisterDragOnPetSlot(m_pBtn_PetSlots[i], slotIndex); + RegisterPetSlotEvents(m_pBtn_PetSlots[i], slotIndex); } - RegisterDrop(m_pImg_Item.transform, OnDropPetToTarget); - if (m_btnComfirm != null) - m_btnComfirm.onClick.AddListener(OnCommandConfirm); - if(m_btnCancle != null) - m_btnCancle.onClick.AddListener(OnCommandCancel); - if(m_btnClose != null) - m_btnClose.onClick.AddListener(OnCommandCancel); + m_btnComfirm.onClick.AddListener(OnCommandConfirm); + if (m_btnCancle != null) + m_btnCancle.onClick.AddListener(OnCommandCancel); + if (m_btnClose != null) + m_btnClose.onClick.AddListener(OnCommandCancel); } public override void OnEnable() @@ -85,22 +79,70 @@ namespace BrewMonster.UI ClearHighlight(); } - #region Double-Click - private void RegisterDoubleClickOnPetSlot(Button button, int slotIndex) + #region Double-Click and Drag on Pet Slot + + private void RegisterTargetSlotEvents(Transform target) { - if(button == null) + if (target == null) + return; + + var image = target.GetComponent(); + if (image != null) + { + image.raycastTarget = true; + } + + var trigger = target.GetComponent(); + if (trigger == null) + trigger = target.gameObject.AddComponent(); + trigger.triggers.Clear(); + + var clickEntry = new EventTrigger.Entry { eventID = EventTriggerType.PointerClick }; + clickEntry.callback.AddListener((data) => { OnTargetSlotClick((PointerEventData)data); }); + trigger.triggers.Add(clickEntry); + + var dropEntry = new EventTrigger.Entry { eventID = EventTriggerType.Drop }; + dropEntry.callback.AddListener((data) => { OnDropPetToTarget((PointerEventData)data); }); + trigger.triggers.Add(dropEntry); + } + + private void OnTargetSlotClick(PointerEventData eventData) + { + // Single click - clear the pet and return to slot + if (m_pCurrentPet != null && m_nSlot >= 0) + { + BMLogger.Log("DlgPetRec: Single click on target slot - returning pet to slot"); + ClearPet(); + UpdatePetSlotUI(); + } + } + + private void RegisterPetSlotEvents(Button button, int slotIndex) + { + if (button == null) return; var trigger = button.GetComponent(); - if(trigger == null) + if (trigger == null) trigger = button.gameObject.AddComponent(); - trigger.triggers.RemoveAll(e=> e.eventID == EventTriggerType.PointerClick); + trigger.triggers.Clear(); - var entry = new EventTrigger.Entry - { eventID = EventTriggerType.PointerClick }; + var clickEntry = new EventTrigger.Entry { eventID = EventTriggerType.PointerClick }; + clickEntry.callback.AddListener((data) => { OnPetSlotClick(slotIndex, (PointerEventData)data); }); + trigger.triggers.Add(clickEntry); - entry.callback.AddListener((data) => { OnPetSlotClick(slotIndex, (PointerEventData)data); }); + var beginDragEntry = new EventTrigger.Entry { eventID = EventTriggerType.BeginDrag }; + beginDragEntry.callback.AddListener((data) => { OnBeginDragPet(slotIndex, (PointerEventData)data); }); + trigger.triggers.Add(beginDragEntry); + + var dragEntry = new EventTrigger.Entry { eventID = EventTriggerType.Drag }; + dragEntry.callback.AddListener((data) => { OnDragPet(slotIndex, (PointerEventData)data); }); + trigger.triggers.Add(dragEntry); + + var endDragEntry = new EventTrigger.Entry { eventID = EventTriggerType.EndDrag }; + endDragEntry.callback.AddListener((data) => { OnEndDragPet(slotIndex, (PointerEventData)data); }); + trigger.triggers.Add(endDragEntry); } private void OnPetSlotClick(int slotIndex, PointerEventData eventData) @@ -109,7 +151,7 @@ namespace BrewMonster.UI if (m_lastClickTime.ContainsKey(slotIndex)) { float timeSinceLastClick = currentTime - m_lastClickTime[slotIndex]; - if(timeSinceLastClick <= m_doubleClickTime) + if (timeSinceLastClick <= m_doubleClickTime) { // Double-click detected OnPetSlotDoubleClick(slotIndex); @@ -130,41 +172,89 @@ namespace BrewMonster.UI } SetPet(slotIndex); + UpdatePetSlotUI(); } - #endregion - #region Drag and Drop - private void RegisterDragOnPetSlot(Button button, int slotIndex) + + private void OnBeginDragPet(int slotIndex, PointerEventData eventData) { - if(button == null) + var petData = GetPetSlot(slotIndex); + if (petData == null) + { + BMLogger.LogWarning($"DlgPetRec: No pet in slot {slotIndex} to drag"); return; + } - - var trigger = button.GetComponent(); - if(trigger == null) - trigger = button.gameObject.AddComponent(); + // Don't allow dragging active or selected pets + var host = CECGameRun.Instance?.GetHostPlayer(); + if (host != null) + { + var petCorral = host.GetPetCorral(); + if (petCorral != null) + { + bool isActive = petCorral.GetActivePetIndex() == slotIndex; + bool isSelected = (m_nSlot == slotIndex && m_pCurrentPet != null); - // Begin drag - var beginDragEntry = new EventTrigger.Entry { eventID = EventTriggerType.BeginDrag }; - beginDragEntry.callback.AddListener((data) => { OnBeginDragPet(slotIndex, (PointerEventData)data); }); - trigger.triggers.Add(beginDragEntry); + if (isActive || isSelected) + { + BMLogger.Log($"DlgPetRec: Cannot drag active or selected pet from slot {slotIndex}"); + return; + } + } + } - //End drag - var endDragEntry = new EventTrigger.Entry { eventID = EventTriggerType.EndDrag }; - endDragEntry.callback.AddListener((data) => { OnEndDragPet(slotIndex, (PointerEventData)data); }); - trigger.triggers.Add(endDragEntry); + // Create dragged icon + var buttonImage = m_pBtn_PetSlots[slotIndex].GetComponent(); + if (buttonImage != null && buttonImage.sprite != null) + { + Canvas canvas = GetComponentInParent(); + if (canvas == null) + { + BMLogger.LogError("DlgPetRec: No parent canvas found for dragging"); + return; + } - // Drag - var dragEntry = new EventTrigger.Entry { eventID = EventTriggerType.Drag }; - dragEntry.callback.AddListener((data) => { OnDragPet(slotIndex, (PointerEventData)data); }); - trigger.triggers.Add(dragEntry); + m_draggedIcon = new GameObject("DraggedIcon"); + m_draggedIcon.transform.SetParent(canvas.transform, false); + m_draggedIcon.transform.SetAsLastSibling(); + + var canvasGroup = m_draggedIcon.AddComponent(); + canvasGroup.alpha = 0.6f; + canvasGroup.blocksRaycasts = false; + + var image = m_draggedIcon.AddComponent(); + image.sprite = buttonImage.sprite; + image.raycastTarget = false; + + var rectTransform = m_draggedIcon.GetComponent(); + rectTransform.sizeDelta = new Vector2(100, 100); + RectTransformUtility.ScreenPointToLocalPointInRectangle( + canvas.transform as RectTransform, + eventData.position, + canvas.worldCamera, + out Vector2 localPoint + ); + rectTransform.localPosition = localPoint; + + BMLogger.Log($"DlgPetRec: Started dragging pet from slot {slotIndex}"); + } } private void OnDragPet(int slotIndex, PointerEventData eventData) { if (m_draggedIcon != null) { - m_draggedIcon.transform.position = eventData.position; + Canvas canvas = GetComponentInParent(); + if (canvas != null) + { + RectTransformUtility.ScreenPointToLocalPointInRectangle( + canvas.transform as RectTransform, + eventData.position, + canvas.worldCamera, + out Vector2 localPoint + ); + m_draggedIcon.transform.localPosition = localPoint; + } } } @@ -174,101 +264,65 @@ namespace BrewMonster.UI { Destroy(m_draggedIcon); m_draggedIcon = null; + BMLogger.Log($"DlgPetRec: Ended dragging pet from slot {slotIndex}"); } - m_draggedSlotIndex = -1; - } - - private void OnBeginDragPet(int slotIndex, PointerEventData eventData) - { - var petData = GetPetSlot(slotIndex); - if (petData == null) - { - return; - } - - m_draggedSlotIndex = slotIndex; - m_draggedIcon = new GameObject("DraggedPetIcon"); - m_draggedIcon.transform.SetParent(transform.root, false); - - var canvas = m_draggedIcon.AddComponent(); - canvas.overrideSorting = true; - canvas.sortingOrder = 1000; - - var image = m_draggedIcon.AddComponent(); - if(m_pBtn_PetSlots != null) - { - var slotTransform = m_pBtn_PetSlots[slotIndex].transform; - var buttonImage = m_pBtn_PetSlots[slotIndex].GetComponent(); - - if (buttonImage != null && buttonImage.sprite != null) - { - image.sprite = buttonImage.sprite; - } - } - image.raycastTarget = false; - var canvasGroup = m_draggedIcon.AddComponent(); - canvasGroup.alpha = 0.6f; - canvasGroup.blocksRaycasts = false; - - var rectTransform = m_draggedIcon.GetComponent(); - rectTransform.sizeDelta = new Vector2(50, 50); // Set default size, can be adjusted based on actual icon size - rectTransform.position = eventData.position; - } - - private void RegisterDrop(Transform target, Action callback) - { - if(target == null) - return; - - var trigger = target.GetComponent(); - if(trigger == null) - trigger = target.gameObject.AddComponent(); - - trigger.triggers.RemoveAll(e=> e.eventID == EventTriggerType.Drop); - var entry = new EventTrigger.Entry { eventID = EventTriggerType.Drop }; - entry.callback.AddListener((data) => { callback((PointerEventData)data); }); - trigger.triggers.Add(entry); - } - - private void OnDropPetToTarget(PointerEventData eventData) - { - if (m_draggedSlotIndex < 0) - return; - - var petData = GetPetSlot(m_draggedSlotIndex); - if(petData == null) - return; - - SetPet(m_draggedSlotIndex); } #endregion - private void RegisterClick(Transform target, Action callback) + + #region Drag and Drop Logic + + private void OnDropPetToTarget(PointerEventData eventData) { - if(target == null) - return; - var trigger = target.GetComponent(); - if(trigger == null) - trigger = target.gameObject.AddComponent(); - - var existingClick = trigger.triggers.Find(e => e.eventID == EventTriggerType.PointerClick); - if(existingClick != null) - trigger.triggers.Remove(existingClick); - - var entry = new EventTrigger.Entry { eventID = EventTriggerType.PointerClick }; - entry.callback.AddListener((data) => { callback((PointerEventData)data); }); - trigger.triggers.Add(entry); - } - - private void OnClickTargetSlot(PointerEventData eventData) - { - if (m_pCurrentPet != null) + // Get the dragged pet slot index from the event + var draggedObject = eventData.pointerDrag; + if (draggedObject == null) { - ClearPet(); + BMLogger.LogWarning("DlgPetRec: No dragged object found"); + return; } - } - private void OnShowDialog(){ + // Find which pet slot was dragged + for (int i = 0; i < PETSLOT_MAX; i++) + { + if (m_pBtn_PetSlots[i] != null && m_pBtn_PetSlots[i].gameObject == draggedObject) + { + var petData = GetPetSlot(i); + if (petData == null) + { + BMLogger.LogWarning($"DlgPetRec: No pet in dragged slot {i}"); + return; + } + + // Check if this pet can be selected + var host = CECGameRun.Instance?.GetHostPlayer(); + if (host != null) + { + var petCorral = host.GetPetCorral(); + if (petCorral != null) + { + bool isActive = petCorral.GetActivePetIndex() == i; + if (isActive) + { + BMLogger.Log($"DlgPetRec: Cannot select active pet from slot {i}"); + return; + } + } + } + + BMLogger.Log($"DlgPetRec: Pet from slot {i} dropped to target"); + SetPet(i); + UpdatePetSlotUI(); + return; + } + } + + BMLogger.LogWarning("DlgPetRec: Could not find source pet slot for dragged object"); + } + #endregion + + private void OnShowDialog() + { ClearPet(); LoadPetSlotFromCorral(); } @@ -285,22 +339,24 @@ namespace BrewMonster.UI m_pTxt_Gold.text = "0"; ClearSlotIcon(m_pImg_Item); - ClearHighlight(); + UpdatePetSlotUI(); } - - private void OnCommandConfirm(){ + + private void OnCommandConfirm() + { // TODO } - private void SetPet(int nSlot){ + private void SetPet(int nSlot) + { var host = CECGameRun.Instance.GetHostPlayer(); - if(host == null) + if (host == null) return; var petCorral = host.GetPetCorral(); - if(petCorral == null) + if (petCorral == null) return; - + if (petCorral.GetActivePetIndex() == nSlot) { //GetGameUIMan()->MessageBox("", GetStringFromTable(820), MB_OK, @@ -309,22 +365,22 @@ namespace BrewMonster.UI } var pDB = ElementDataManProvider.GetElementDataMan(); - if(pDB == null) + if (pDB == null) return; var petData = petCorral.GetPetData(nSlot); - if(petData != null) + if (petData != null) { DATA_TYPE dataType = DATA_TYPE.DT_INVALID; var petEssenceData = pDB.get_data_ptr((uint)petData.GetTemplateID(), ID_SPACE.ID_SPACE_ESSENCE, ref dataType); - if(petEssenceData != null && dataType == DATA_TYPE.DT_PET_ESSENCE) + if (petEssenceData != null && dataType == DATA_TYPE.DT_PET_ESSENCE) { var petEssence = (PET_ESSENCE)petEssenceData; dataType = DATA_TYPE.DT_INVALID; var eggEssenceData = pDB.get_data_ptr((uint)petData.GetEggID(), ID_SPACE.ID_SPACE_ESSENCE, ref dataType); - if (eggEssenceData != null && dataType == DATA_TYPE.DT_PET_ESSENCE) + if (eggEssenceData != null && dataType == DATA_TYPE.DT_PET_EGG_ESSENCE) { var eggEssence = (PET_EGG_ESSENCE)eggEssenceData; m_pCurrentPet = petData; @@ -346,21 +402,26 @@ namespace BrewMonster.UI private void UpdatePetUI(CECPetData petData, PET_ESSENCE petEssence, PET_EGG_ESSENCE eggEssence) { if (petData == null || eggEssence.id == 0) + { + BMLogger.LogWarning("DlgPetRec: UpdatePetUI - Invalid pet data or egg essence"); return; + } - if(m_pTxt_Name != null) + if (m_pTxt_Name != null) m_pTxt_Name.text = petData.GetName(); - if(m_pTxt_Gold != null) + if (m_pTxt_Gold != null) m_pTxt_Gold.text = eggEssence.money_restored.ToString(); if (m_pImg_Item != null) { string iconPath = petEssence.FileIcon; + BMLogger.Log($"DlgPetRec: Loading icon from path: {iconPath}"); var sprite = LoadPetIconSprite(iconPath); - if(sprite != null) + if (sprite != null) { + BMLogger.Log($"DlgPetRec: Sprite loaded successfully: {sprite.name}"); m_pImg_Item.sprite = sprite; m_pImg_Item.enabled = true; m_pImg_Item.color = Color.white; @@ -368,6 +429,7 @@ namespace BrewMonster.UI } else { + BMLogger.LogWarning($"DlgPetRec: Failed to load sprite from path: {iconPath}"); ClearSlotIcon(m_pImg_Item); } } @@ -384,13 +446,13 @@ namespace BrewMonster.UI private Sprite LoadPetIconSprite(string iconPath) { - if(string.IsNullOrEmpty(iconPath)) + if (string.IsNullOrEmpty(iconPath)) return null; try { string fileName = Path.GetFileNameWithoutExtension(iconPath); - if(string.IsNullOrEmpty(fileName)) + if (string.IsNullOrEmpty(fileName)) return null; fileName = fileName.ToLower(); @@ -413,11 +475,11 @@ namespace BrewMonster.UI Array.Clear(m_petSlots, 0, m_petSlots.Length); var host = CECGameRun.Instance?.GetHostPlayer(); - if(host == null) + if (host == null) return; var petCorral = host.GetPetCorral(); - if(petCorral == null) + if (petCorral == null) return; for (int i = 0; i < PETSLOT_MAX; i++) @@ -445,6 +507,11 @@ namespace BrewMonster.UI private void OnDestroy() { + if (m_draggedIcon != null) + { + Destroy(m_draggedIcon); + m_draggedIcon = null; + } ClearPet(); } @@ -488,8 +555,9 @@ namespace BrewMonster.UI bool isActive = petCorral.GetActivePetIndex() == i; bool isDead = petData.GetHPFactor() <= 0.0f; + bool isSelected = (m_nSlot == i && m_pCurrentPet != null); - if (isActive || isDead) + if (isActive || isDead || isSelected) { buttonImage.color = Color.gray; } @@ -511,7 +579,8 @@ namespace BrewMonster.UI } } bool isActivePet = petCorral.GetActivePetIndex() == i; - m_pBtn_PetSlots[i].interactable = !isActivePet; + bool isSelectedPet = (m_nSlot == i && m_pCurrentPet != null); + m_pBtn_PetSlots[i].interactable = !isActivePet && !isSelectedPet; } } } @@ -533,6 +602,5 @@ namespace BrewMonster.UI } } } - } -} +} \ No newline at end of file