using asap.core; using game; using TMPro; using UnityEngine; using UnityEngine.UI; using System; using GameCore; using UniRx; using System.Collections.Generic; public class EventBreakEntranceButton : EventButtonResource { [SerializeField] private Image icon; [SerializeField] private TMP_Text textTimer; [SerializeField] private Button button; private ILoadResourceService _loadResourceService; private EventBreakEntranceData _btnData; private const string EntranceRedPointKey = "eventbreak.enter"; private void Awake() { if (EventBreakAct.Ctx == null) { gameObject.SetActive(false); return; } _btnData = EventBreakAct.Ctx.GetEntranceButtonData(); var _drillModel = GContext.container.Resolve(); if (_btnData == null || !_btnData.IsActive) { gameObject.SetActive(false); return; } UpdateTimer(); Observable.Interval(TimeSpan.FromSeconds(1f)).Subscribe(UpdateTimer).AddTo(this); var chainPackData = GContext.container.Resolve().ToChainPackData(); RedPointManager.Instance.SetRedPointState(EntranceRedPointKey, _drillModel.TicketCount >= _btnData.RedPointTicketThreshold || chainPackData.DoNeedPackRedPoint); CheckResource(new List() { UITypes.EventBreakPanel.Path, EventBreakAct.ActAddressable, _btnData.BtnIconUrl }); } private void Start() { button.onClick.AddListener(EnterDrillActAsync); _loadResourceService = GContext.container.Resolve(); } private async void EnterDrillActAsync() { try { bool isReady = await _loadResourceService.Loads( new List() { UITypes.EventBreakPanel.Path, EventBreakAct.ActAddressable }); if (isReady) { // Debug.Log($"[EventBreak] Download Ready!"); GContext.Publish(new UnloadActToNextAct { actId = EventBreakAct.ActAddressable, TransitionPanel = UITypes.CloudTransitionPanel }); } else { // Debug.Log($"[EventBreak] Download Not Ready!"); var panel = await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel); panel.GetComponent().SetBtn(true, () => GContext.Publish(new UnloadActToNextAct(EventBreakAct.ActAddressable))); } } catch (Exception e) { Debug.Log($"[EventBreak] EnterActError: {e.Message}\n{e.StackTrace}"); throw; } } private void UpdateTimer(long _ = 0L) { textTimer.text = ConvertTools.ConvertTime2(_btnData.RemainingTime); if (!_btnData.IsActive) Destroy(gameObject); } protected override void OnLoadEventResource() { if (_btnData.IsActive) { GContext.container.Resolve().SetImageSprite(icon, _btnData.BtnIconUrl); gameObject.SetActive(true); } } } public class EventBreakEntranceData { public string BtnIconUrl { get; set; } public DateTime ExpiryTime { get; set; } public DateTime StartTime { get; set; } public TimeSpan RemainingTime => ExpiryTime - ZZTimeHelper.UtcNow(); public bool IsActive => ZZTimeHelper.UtcNow() >= StartTime && ZZTimeHelper.UtcNow() < ExpiryTime; public int RedPointTicketThreshold { get; set; } }