172 lines
4.6 KiB
C#
172 lines
4.6 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;
|
|
|
|
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)
|
|
{
|
|
itemData = item;
|
|
shopManager = manager;
|
|
UpdateDisplay();
|
|
}
|
|
|
|
void OnItemClicked()
|
|
{
|
|
if (shopManager != null && itemData.id != 0)
|
|
{
|
|
shopManager.ShowItemDetail(itemData);
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|