using BrewMonster.Network; using BrewMonster.Scripts; using BrewMonster.Scripts.Task; using BrewMonster.UI; using ModelRenderer.Scripts.Common; using PerfectWorld.Scripts.Managers; using PerfectWorld.Scripts.Task; using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using CSNetwork; using System.Text; using TMPro; namespace BrewMonster { public class DlgProduce : AUIDialog { [Header("Produce Tabs")] [SerializeField] private Transform tabBtnContainer; [SerializeField] private GameObject tabBtnPb; [SerializeField] private string tabButtonTextComponentName = "Text"; [Header("Produce Detail")] [SerializeField] private ScrollRect m_scrollRect; [SerializeField] private Transform itemContainer; [SerializeField] private GameObject itemPb; [Header("Quantity")] [SerializeField] private TextMeshProUGUI quantityText; [SerializeField] private Button quantityIncreaseBtn; [SerializeField] private Button quantityDecreaseBtn; [SerializeField] private Button quantityMaxBtn; private int currentQuantity = 1; private int produceRemainCount = 0; private bool isProducing = false; [Header("Material Slots")] [SerializeField] private List materialSlots = new List(); [Header("Result Slot")] [SerializeField] private Image itemResult; [Header("Item Info Panel")] public Transform itemInfoRoot; public TextMeshProUGUI infoDescText; //[Header("Wepon Info Equippment Panel")] //[SerializeField] private Transform weponInfoRoot; //[SerializeField] private TextMeshProUGUI weponNameInfoText; //[SerializeField] private TextMeshProUGUI weponDescInfoText; //[SerializeField] private TextMeshProUGUI weponExtraInfoText; [Header("Default")] [SerializeField] private Sprite khung_item; private NPC_MAKE_SERVICE? cachedMakeService = null; private int currentTabIndex = 0; private uint selectedRecipeId = 0; // Track the currently selected recipe static readonly Color COLOR_NOT_ENOUGH = new Color32(145, 145, 145, 255); static readonly Color COLOR_ENOUGH = Color.white; [SerializeField] private Button startProduceBtn; [SerializeField] private Button cancelProduceBtn; [SerializeField] private Button clickCatcherPanel; enum ItemInfoMode { None, ResultItem, MaterialItem } private ItemInfoMode currentInfoMode = ItemInfoMode.None; public override void Start() { quantityText.text = currentQuantity.ToString(); quantityDecreaseBtn.onClick.AddListener(OnClickDecreaseBtn); quantityIncreaseBtn.onClick.AddListener(OnClickIncreaseBtn); quantityMaxBtn.onClick.AddListener(OnClickMaxBtn); clickCatcherPanel.onClick.AddListener(HideItemInfo); } public override void Update() { #if UNITY_EDITOR || UNITY_STANDALONE if (Input.GetMouseButtonDown(0)) { CheckHidePanel(Input.mousePosition); } #else if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { CheckHidePanel(Input.GetTouch(0).position); } #endif } void CheckHidePanel(Vector2 screenPos) { if (!RectTransformUtility.RectangleContainsScreenPoint( itemInfoRoot as RectTransform, screenPos, Camera.main)) { HideItemInfo(); } } public void OpenProduce(uint npcId) { if (!LoadMakeService(npcId)) { Debug.LogError("[DlgProduce] LoadMakeService failed"); return; } selectedRecipeId = 0; // Reset selected recipe SetupButtonHandlers(); CreateTabs(); OnTabSelected(0); } void SetupButtonHandlers() { if (startProduceBtn != null) { startProduceBtn.onClick.RemoveAllListeners(); startProduceBtn.onClick.AddListener(OnStartProduceClicked); } if (cancelProduceBtn != null) { cancelProduceBtn.onClick.RemoveAllListeners(); cancelProduceBtn.onClick.AddListener(OnCancelProduceClicked); } } bool LoadMakeService(uint npcId) { var edm = ElementDataManProvider.GetElementDataMan(); if (edm == null) return false; DATA_TYPE dt = DATA_TYPE.DT_INVALID; object npcData = edm.get_data_ptr(npcId, ID_SPACE.ID_SPACE_ESSENCE, ref dt); if (dt != DATA_TYPE.DT_NPC_ESSENCE || npcData == null) return false; NPC_ESSENCE npc = (NPC_ESSENCE)npcData; if (npc.id_make_service == 0) return false; DATA_TYPE serviceDt = DATA_TYPE.DT_INVALID; object serviceData = edm.get_data_ptr( npc.id_make_service, ID_SPACE.ID_SPACE_ESSENCE, ref serviceDt ); if (serviceDt != DATA_TYPE.DT_NPC_MAKE_SERVICE || serviceData == null) return false; cachedMakeService = (NPC_MAKE_SERVICE)serviceData; return true; } void CreateTabs() { ClearContainer(tabBtnContainer); if (!cachedMakeService.HasValue || cachedMakeService.Value.pages == null) return; var makeService = cachedMakeService.Value; for (int pageIndex = 0; pageIndex < makeService.pages.Length; pageIndex++) { var page = makeService.pages[pageIndex]; bool hasRecipes = false; if (page.id_goods != null) { foreach (uint recipeId in page.id_goods) { if (recipeId != 0) { hasRecipes = true; break; } } } if (!hasRecipes) continue; GameObject tabObj = Instantiate(tabBtnPb, tabBtnContainer); tabObj.name = $"ProduceTab_Page_{pageIndex}"; tabObj.SetActive(true); string pageTitle = ByteToStringUtils.UshortArrayToUnicodeString(page.page_title); if (string.IsNullOrWhiteSpace(pageTitle)) pageTitle = $"Page {pageIndex + 1}"; TMPro.TextMeshProUGUI tabTMP = null; TextMeshProUGUI tabText = null; Transform textTf = tabObj.transform.Find(tabButtonTextComponentName); if (textTf != null) { tabTMP = textTf.GetComponent(); if (tabTMP == null) { tabText = textTf.GetComponent(); } } if (tabTMP == null && tabText == null) { tabTMP = tabObj.GetComponentInChildren(); if(tabTMP == null) { tabText = tabObj.GetComponentInChildren(); } } if(tabTMP != null) tabTMP.text = pageTitle; else if(tabText != null) tabText.text = pageTitle; Button btn = tabObj.GetComponent