Files
back_cantanBuilding/Assets/Scripts/UI/BattlePass/BattlePassPanel.cs
2026-05-26 16:15:54 +08:00

173 lines
5.0 KiB
C#

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<BattlePassDataProvider>();
_playerItemData = GContext.container.Resolve<PlayerItemData>();
GContext.OnEvent<BpVipUnlock>().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<ResAddEvent>().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<FishingEventData>().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<cfg.Tables>().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);
}
}
}