update code DlgPetRec

This commit is contained in:
VuNgocHaiC7
2026-02-27 15:34:12 +07:00
parent 8f8607ece6
commit b60fe6fa6f
@@ -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<int, float> m_lastClickTime = new Dictionary<int, float>();
private GameObject m_draggedIcon;
private int m_draggedSlotIndex = -1;
private float m_doubleClickTime = 0.3f;
private Dictionary<int, float> m_lastClickTime = new Dictionary<int, float>();
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<Image>();
if (image != null)
{
image.raycastTarget = true;
}
var trigger = target.GetComponent<EventTrigger>();
if (trigger == null)
trigger = target.gameObject.AddComponent<EventTrigger>();
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<EventTrigger>();
if(trigger == null)
if (trigger == null)
trigger = button.gameObject.AddComponent<EventTrigger>();
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<EventTrigger>();
if(trigger == null)
trigger = button.gameObject.AddComponent<EventTrigger>();
// 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<Image>();
if (buttonImage != null && buttonImage.sprite != null)
{
Canvas canvas = GetComponentInParent<Canvas>();
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>();
canvasGroup.alpha = 0.6f;
canvasGroup.blocksRaycasts = false;
var image = m_draggedIcon.AddComponent<Image>();
image.sprite = buttonImage.sprite;
image.raycastTarget = false;
var rectTransform = m_draggedIcon.GetComponent<RectTransform>();
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<Canvas>();
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>();
canvas.overrideSorting = true;
canvas.sortingOrder = 1000;
var image = m_draggedIcon.AddComponent<Image>();
if(m_pBtn_PetSlots != null)
{
var slotTransform = m_pBtn_PetSlots[slotIndex].transform;
var buttonImage = m_pBtn_PetSlots[slotIndex].GetComponent<Image>();
if (buttonImage != null && buttonImage.sprite != null)
{
image.sprite = buttonImage.sprite;
}
}
image.raycastTarget = false;
var canvasGroup = m_draggedIcon.AddComponent<CanvasGroup>();
canvasGroup.alpha = 0.6f;
canvasGroup.blocksRaycasts = false;
var rectTransform = m_draggedIcon.GetComponent<RectTransform>();
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<PointerEventData> callback)
{
if(target == null)
return;
var trigger = target.GetComponent<EventTrigger>();
if(trigger == null)
trigger = target.gameObject.AddComponent<EventTrigger>();
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<PointerEventData> callback)
#region Drag and Drop Logic
private void OnDropPetToTarget(PointerEventData eventData)
{
if(target == null)
return;
var trigger = target.GetComponent<EventTrigger>();
if(trigger == null)
trigger = target.gameObject.AddComponent<EventTrigger>();
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
}
}
}
}
}
}