using asap.core; using DG.Tweening; using GameCore; using System; using System.Threading; using System.Threading.Tasks; using TMPro; using UniRx; using UnityEngine; using UnityEngine.UI; public class BattlePassPanel : BasePanel { [SerializeField, Range(0f, 2f)] private float _fillTime, _levelUpWaitTime ; BattlePassDataProvider _dataProvider; PlayerItemData _playerItemData; CancellationTokenSource _tokenSource; [SerializeField, Header("===========")] Button btn_close; [SerializeField] Toggle tog_battlePass, tog_task; [SerializeField] GameObject go_taskBtn, go_battlePassBtn; [SerializeField] BattlePassRecordPanel recordPanel; [SerializeField] BattleTaskPanel taskPanel; [SerializeField] TMP_Text txt_timer; [SerializeField] Button btn_activateBattlePass; [SerializeField] BPBanner bPBanner, bPBanner_bought; BPBanner curBanner; protected override async void Start() { base.Start(); _dataProvider = GContext.container.Resolve(); _playerItemData = GContext.container.Resolve(); GContext.OnEvent().Subscribe(_ => { RefreshVipBtn(); recordPanel.BpVipUnlock(); }).AddTo(disposables); btn_close.OnClickAsObservable().Subscribe(x => Close()).AddTo(disposables); btn_activateBattlePass.OnClickAsObservable().Subscribe(x => OnActivateBP()).AddTo(disposables); tog_task.onValueChanged.AddListener(x => SwitchPanel(1)); tog_battlePass.onValueChanged.AddListener(x => SwitchPanel(0)); GContext.OnEvent().Subscribe(x => OnResAnimation(x)).AddTo(disposables); Refresh(); await Awaiters.NextFrame; SwitchPanel(0); _dataProvider.CheckIfGetLastBpRewards(); } private async void OnActivateBP() { if (_dataProvider.IsUnlockVip) return; btn_activateBattlePass.enabled = false; await UIManager.Instance.ShowUI(UITypes.BattlePassActivePopupPanel); btn_activateBattlePass.enabled = true; bPBanner_bought.RefreshLevelBanner(); } private void Close() { GContext.Publish(new RestartShowHomeUIEvent()); UIManager.Instance.DestroyUI(UITypes.BattlePassPanel); } private void SwitchPanel(int type) { if (type == 0) { tog_task.enabled = true; tog_battlePass.enabled = false; go_battlePassBtn.SetActive(true); go_taskBtn.SetActive(false); recordPanel.Open(); taskPanel.Close(); } else if (type == 1) { tog_battlePass.enabled = true; tog_task.enabled = false; go_battlePassBtn.SetActive(false); go_taskBtn.SetActive(true); recordPanel.Close(); taskPanel.Open(); } } public void Refresh() { RefreshTimer(); RefreshVipBtn(); curBanner.RefreshLevelBanner(); } private void RefreshTimer() { DateTime curTimer = ZZTimeHelper.UtcNow().UtcNowOffset(); DateTime endTime = GContext.container.Resolve().GetEventEndTime(_dataProvider.Data.BattlePassRecord.ID); SetTimer(endTime - curTimer); } private void SetTimer(TimeSpan duration) { txt_timer.text = ConvertTools.ConvertTime2(duration); var timer = Observable.Interval(TimeSpan.FromSeconds(1)) .TakeWhile(seconds => seconds <= duration.TotalSeconds) .Subscribe(seconds => txt_timer.text = ConvertTools.ConvertTime2(duration.Subtract(TimeSpan.FromSeconds(seconds))) , () => Close()) .AddTo(disposables) ; } void RefreshVipBtn() { bool isVip = _dataProvider.Data.BattlePassRecord.IsUnlockVip != 0; bPBanner_bought.gameObject.SetActive(isVip); bPBanner.gameObject.SetActive(!isVip); if (isVip) { curBanner = bPBanner_bought; } else { curBanner = bPBanner; } } private void OnResAnimation(ResAddEvent addEvent) { if (addEvent.Type == 0) { cfg.Item item = GContext.container.Resolve().TbItem.GetOrDefault(addEvent.id); if (item != null) { addEvent.Type = item.Type; addEvent.SubType = item.SubType; } } if (addEvent.Type == 7 && addEvent.SubType == 3) { if (_tokenSource != null) { _tokenSource.Cancel(); _tokenSource.Dispose(); } _tokenSource = new CancellationTokenSource(); curBanner.ResAnimation(_tokenSource.Token, _fillTime, _levelUpWaitTime); } } }