Files
ft/Client/Assets/Scripts/UI/PartnerStatue/EventPartnerStatueEntranceBtn.cs
2026-06-29 21:18:33 +08:00

137 lines
4.7 KiB
C#

using System;
using System.Threading.Tasks;
using asap.core;
using game;
using GameCore;
using UnityEngine;
using UnityEngine.UI;
using EventPartnerGatherRequests;
using System.Linq;
public class EventPartnerStatueEntranceBtn : EventButtonResource
{
[SerializeField] private Image icon;
[SerializeField] private BingoTimer timer;
[SerializeField] private Button btn;
[SerializeField] private GameObject fxRedPointScore, goRedPointInvitation;
private EventPartnerStatueEntranceData _data;
private void Awake()
{
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
if (arc == null || !arc.IsActive)
{
gameObject.SetActive(false);
return;
}
CheckResource(arc.TableContext.GetAddressableArray());
btn.onClick.AddListener(OnClickEnter);
arc.RtSystem.Subscribe(OnScore, OnPartnerChange);
}
protected override void OnDestroy()
{
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
arc?.RtSystem?.Unsubscribe();
base.OnDestroy();
}
private async void OnClickEnter()
{
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
try
{
var detailRes = await RefreshDetail();
if (!detailRes)
{
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_107"));
return;
}
bool isReady = await GContext.container.Resolve<ILoadResourceService>().Loads(arc.TableContext.GetAddressableArray());
if (isReady)
{
GContext.Publish(new UnloadActToNextAct { actId = arc.TableContext.GetActUrl(), TransitionPanel = UITypes.CloudTransitionPanel });
}
else
{
var panel = await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel);
panel.GetComponent<CloudTransitionPanel>()
.SetBtn(true, () => GContext.Publish(new UnloadActToNextAct(arc.TableContext.GetActUrl())));
}
}
catch (Exception e)
{
Debug.LogError(e);
}
}
protected override void OnLoadEventResource()
{
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
_data = arc.GetEntranceData();
GContext.container.Resolve<IUIService>().SetImageSprite(icon, _data.IconUrl);
timer.Init(_data.TimerContext);
timer.OnExpire += () => gameObject.SetActive(false);
gameObject.SetActive(true);
var data = GContext.container.Resolve<EventPartnerStatueTokenExchangeData>();
var context = GContext.container.Resolve<IEventPartnerTokenExchangeContext>();
var hasPendingScore = (data.PendingScoreUiCount > 0 && context is EventPartnerStatueTokenExchangeArcContext);
if (!hasPendingScore)
{
if (_data.TicketCount > 0)
RedPointManager.Instance.SetRedPointState(arc.GetRedPointKey(), true, _data.TicketCount);
else
RedPointManager.Instance.SetRedPointState(arc.GetRedPointKey(), false);
}
UpdateSpecialRedPoints();
}
private async Task<bool> RefreshDetail()
{
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
if (!arc.DoRefreshDetail)
return true;
var res = await arc.Requests.GetDetail();
if (res == null)
return false;
var pfData = EventPartnerStatuePlayfabData.Load();
arc.ResolveWithDetail(res, pfData);
return true;
}
private async void OnScore(EventPartnerGatherScoreEvt e)
{
await Awaiters.NextFrame;
Debug.Log($"[EventPartnerStatue] EntranceBtn OnScore: {e.Score}");
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
var c = arc.Model.ComponentList.FirstOrDefault(x => x.PartnerId == e.PartnerId);
if (c == null)
return;
var oldStage = arc.TableContext.GetStageFromTotalScore(c.ScoreDisplayTotal);
arc.OnScore(e);
UpdateSpecialRedPoints();
}
private async void OnPartnerChange(EventPartnerGatherPartnerEvt e)
{
await Awaiters.NextFrame;
Debug.Log($"[EventPartnerStatue] EntranceBtn PartnerChange: {e.PartnerInfo.PlayFabId}");
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
arc.OnPartnerChange(e);
UpdateSpecialRedPoints();
}
private void UpdateSpecialRedPoints()
{
var arc = GContext.container.Resolve<EventPartnerStatueArc>();
_data = arc.GetEntranceData();
goRedPointInvitation.SetActive(_data.HasInvitation);
fxRedPointScore.SetActive(_data.HasPartnerScore);
}
}