using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class AlchemyStoveBehaviour : MonoBehaviour { [SerializeField] AlchemyMaterial[] m_AlchemyMaterials; [SerializeField] Transform m_ContainerAlcheming; [SerializeField] Text m_AlchemyTime; [SerializeField] Transform m_ContainerComplete; [SerializeField] Transform m_ContainerNormal; [SerializeField] Text m_StoveLevel; [SerializeField] Text m_StoveExp; [SerializeField] Slider m_StoveExpSlider; [SerializeField] Image m_ViewSlider; [SerializeField] float m_SliderLength; [SerializeField] Text m_LuckValue; [SerializeField] Transform m_ContainerGrasp; [SerializeField] Button m_Func; [SerializeField] Text m_FuncLabel; [SerializeField] Transform m_ContainerUnGrasp; int m_State = 0; //0-正常状态 1-炼丹中 2-炼丹结束 int state { get { return m_State; } set { if (m_State != value) { m_State = value; DisplayStove(); } } } float timer = 0f; AlchemyModel model { get { return ModelCenter.Instance.GetModel(); } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } private void Awake() { m_Func.SetListener(OnFunc); } public void Display() { model.selectAlchemyRefresh += SelectAlchemyRefresh; model.alchemyStateRefresh += AlchemyStateRefresh; PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent; packModel.refreshItemCountEvent += RefreshItemCountEvent; m_State = model.GetStoveState(model.selectAlchemy); DisplayAlchemyMaterials(); DisplayStove(); DisplayLuckValue(); } void DisplayAlchemyMaterials() { var grasp = model.IsGraspRecipe(model.selectAlchemy); List materials; model.TryGetAlchemyMaterials(model.selectAlchemy, out materials); for (int i = 0; i < m_AlchemyMaterials.Length; i++) { if (grasp && materials != null && i < materials.Count) { m_AlchemyMaterials[i].SetLock(false); m_AlchemyMaterials[i].Display(materials[i]); } else { m_AlchemyMaterials[i].SetLock(true); } } } void DisplayStove() { m_ContainerAlcheming.gameObject.SetActive(state == 1); m_ContainerNormal.gameObject.SetActive(state == 0); m_ContainerComplete.gameObject.SetActive(state == 2); switch (state) { case 0: m_StoveLevel.text = StringUtility.Contact("Lv.", model.stoveLevel); var isMax = !RefineStoveConfig.Has(model.stoveLevel + 1); var stoveConfig = RefineStoveConfig.Get(model.stoveLevel); if (isMax) { m_StoveExp.text = Language.Get("L1055"); m_StoveExpSlider.value = 1; } else { m_StoveExp.text = StringUtility.Contact(model.stoveExp, "/", stoveConfig.Exp); var progress = Mathf.Clamp01((float)model.stoveExp / stoveConfig.Exp); m_StoveExpSlider.value = progress; } break; case 1: uint tick = 0; if (model.TryGetAlchemyStartTime(model.selectAlchemy, out tick)) { var config = AlchemyConfig.Get(model.selectAlchemy); var startTime = TimeUtility.GetTime(tick); var seconds = (int)(config.NeedTime - (float)(TimeUtility.ServerNow - startTime).TotalSeconds); m_AlchemyTime.text = TimeUtility.SecondsToHMS(seconds); } break; case 2: break; } DisplayViewLength(); var grasp = model.IsGraspRecipe(model.selectAlchemy); m_ContainerGrasp.gameObject.SetActive(grasp); m_ContainerUnGrasp.gameObject.SetActive(!grasp); if (grasp) { switch (state) { case 0: m_FuncLabel.text = Language.Get("AlchemyStoveStart"); break; case 1: m_FuncLabel.text = Language.Get("AlchemyStoveStop"); break; case 2: m_FuncLabel.text = Language.Get("AlchemyStoveGet"); break; } } } void DisplayLuckValue() { m_LuckValue.text = PlayerDatas.Instance.extersion.luckValue.ToString(); } void DisplayViewLength() { var isMax = !RefineStoveConfig.Has(model.stoveLevel + 1); m_ViewSlider.gameObject.SetActive(!isMax); if (!isMax) { var stoveConfig = RefineStoveConfig.Get(model.stoveLevel); var config = AlchemyConfig.Get(model.selectAlchemy); var exp = config.AlchemyExp + model.stoveExp; var progress = Mathf.Clamp01((float)exp / stoveConfig.Exp); m_ViewSlider.rectTransform.sizeDelta = m_ViewSlider.rectTransform.sizeDelta.SetX(progress * m_SliderLength); } } private void SelectAlchemyRefresh() { m_State = model.GetStoveState(model.selectAlchemy); DisplayStove(); DisplayAlchemyMaterials(); } private void AlchemyStateRefresh() { m_State = model.GetStoveState(model.selectAlchemy); DisplayStove(); DisplayAlchemyMaterials(); } private void PlayerDataRefreshEvent(PlayerDataType dataType) { if (dataType == PlayerDataType.LuckValue) { DisplayLuckValue(); } } private void LateUpdate() { timer += Time.deltaTime; if (timer >= 0.5f) { timer = 0f; PerSecond(); } } private void PerSecond() { var _state = model.GetStoveState(model.selectAlchemy); if (_state == state) { if (state == 1) { DisplayStove(); } } else { state = _state; } } private void OnFunc() { switch (state) { case 0: Int2 alchemyPosition; if (model.IsStoveAlcheming(model.selectAlchemyType, out alchemyPosition)) { SysNotifyMgr.Instance.ShowTip("AlchemingError"); return; } Item item; if (!model.IsAlchemyEnoughMaterial(model.selectAlchemy, out item)) { ItemTipUtility.Show(item.id); return; } var succRate = model.GetAlchemySuccRate(model.selectAlchemy); if (succRate / 100 < 100) { ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("AlchemyLowRateRemind"), (bool isOk) => { if (isOk) { SendAlchemyPackage(); } }); return; } break; case 1: ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("StopAlchemyDrugRemind"), (bool isOk) => { if (isOk) { SendAlchemyPackage(); } }); return; } SendAlchemyPackage(); } void SendAlchemyPackage() { var pak = new CA576_tagCMPlayerRefine(); pak.AlchemyID = (uint)model.selectAlchemy; switch (state) { case 0: pak.DoType = 1; break; case 1: pak.DoType = 2; break; case 2: pak.DoType = 3; break; } GameNetSystem.Instance.SendInfo(pak); } private void RefreshItemCountEvent(PackType packType, int index, int itemId) { if (packType == PackType.Item) { List items; if (model.TryGetAlchemyMaterials(model.selectAlchemy, out items)) { if (items.FindIndex((x) => { return x.id == itemId; }) != -1) { DisplayAlchemyMaterials(); } } } } public void Dispose() { model.selectAlchemyRefresh -= SelectAlchemyRefresh; model.alchemyStateRefresh -= AlchemyStateRefresh; PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent; packModel.refreshItemCountEvent -= RefreshItemCountEvent; } } [Serializable] public class AlchemyMaterial { [SerializeField] Transform m_ContainerItem; [SerializeField] Image m_Icon; [SerializeField] Text m_Count; [SerializeField] Transform m_ContainerLock; [SerializeField] Button m_Func; PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } public void Display(Item item) { Display(item.id, item.count); } public void Display(int id, int count) { var itemConfig = ItemConfig.Get(id); m_Icon.SetSprite(itemConfig.IconKey); var packCount = packModel.GetItemCountByID(PackType.Item, id); var enough = packCount >= count; var label = UIHelper.AppendColor(enough ? TextColType.Green : TextColType.Red, packCount.ToString()); m_Count.text = StringUtility.Contact(label, "/", count); m_Func.SetListener(() => { ItemTipUtility.Show(id); }); } public void SetLock(bool _lock) { m_ContainerLock.gameObject.SetActive(_lock); m_ContainerItem.gameObject.SetActive(!_lock); } } }