Files
test/Assets/PerfectWorld/Scripts/UI/NPCShopItemPanel.cs
T
2026-02-28 18:14:10 +07:00

174 lines
4.7 KiB
C#

// Filename : NPCShopItemPanel.cs
// Creator : Converted from C++ EC_Shop
// Date : 2024
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Collections;
using PerfectWorld.Scripts.Shop;
using BrewMonster.Scripts.Managers;
public class NPCShopItemPanel : MonoBehaviour
{
[Header("UI Components")]
public TextMeshProUGUI itemNameText;
public TextMeshProUGUI itemPriceText;
public Image itemIconImage;
private GShopItem itemData;
private Coroutine iconLoadCoroutine;
private NPCShopUIManager shopManager;
private int shopItemIndex;
void Start()
{
SetupClickHandler();
}
void SetupClickHandler()
{
// Check for existing Button component
Button button = GetComponent<Button>();
if (button == null)
button = GetComponentInChildren<Button>();
if (button != null)
{
button.onClick.AddListener(OnItemClicked);
}
else
{
// If no button exists, add one to the Image or create a clickable area
if (itemIconImage != null)
{
// Try to add Button component to the icon image
Button iconButton = itemIconImage.GetComponent<Button>();
if (iconButton == null)
iconButton = itemIconImage.gameObject.AddComponent<Button>();
if (iconButton != null)
{
iconButton.onClick.AddListener(OnItemClicked);
}
}
}
}
public void SetupItem(GShopItem item, NPCShopUIManager manager, int index)
{
itemData = item;
shopManager = manager;
shopItemIndex = index;
UpdateDisplay();
}
void OnItemClicked()
{
if (shopManager != null && itemData.id != 0)
{
shopManager.ShowItemDetail(itemData, shopItemIndex);
}
}
void UpdateDisplay()
{
if (itemData.id == 0)
return;
// Set item name
if (itemNameText != null)
itemNameText.text = itemData.name;
// Set price (use first available price)
uint price = 0;
if (itemData.buy != null && itemData.buy.Length > 0)
{
for (int i = 0; i < itemData.buy.Length; i++)
{
if (itemData.buy[i].price > 0)
{
price = itemData.buy[i].price;
break;
}
}
}
if (itemPriceText != null)
itemPriceText.text = price > 0 ? price.ToString() : "N/A";
// Load icon - use coroutine to ensure UI is ready
if (itemIconImage != null)
{
// Stop any existing icon load coroutine
if (iconLoadCoroutine != null)
{
StopCoroutine(iconLoadCoroutine);
}
// Start new icon load coroutine
iconLoadCoroutine = StartCoroutine(LoadItemIconCoroutine(itemIconImage, (int)itemData.id));
}
}
IEnumerator LoadItemIconCoroutine(Image iconImage, int itemId)
{
// Wait one frame to ensure UI is fully initialized
yield return null;
LoadItemIcon(iconImage, itemId);
}
void LoadItemIcon(Image iconImage, int itemId)
{
if (itemId <= 0 || iconImage == null)
return;
// Ensure the Image component is enabled and properly configured
iconImage.enabled = true;
iconImage.preserveAspect = true;
iconImage.type = Image.Type.Simple;
// Use the existing icon loading system from EC_IvtrItemUtils
Sprite iconSprite = EC_IvtrItemUtils.Instance.ResolveItemIconSprite(itemId);
if (iconSprite != null)
{
iconImage.sprite = iconSprite;
iconImage.color = Color.white;
}
else
{
iconImage.sprite = null;
}
}
void OnDestroy()
{
if (iconLoadCoroutine != null)
{
StopCoroutine(iconLoadCoroutine);
}
// Clean up button listeners
Button button = GetComponent<Button>();
if (button == null)
button = GetComponentInChildren<Button>();
if (button != null)
{
button.onClick.RemoveListener(OnItemClicked);
}
if (itemIconImage != null)
{
Button iconButton = itemIconImage.GetComponent<Button>();
if (iconButton != null)
{
iconButton.onClick.RemoveListener(OnItemClicked);
}
}
}
}