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

292 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using asap.core;
using game;
using GameCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.UI.OfferSweep
{
public class OfferSweepPanel : BasePanel
{
#region UI_ELEMENTS
private Button btn_purchase;
private Button btn_close;
private GameObject btn_buy;
private OfferSweepPackCell[] _offerSweepPackCells;
private TextMeshProUGUI p_current_price;
private TextMeshProUGUI p_original_price;
private TextMeshProUGUI _timeText;
private TextMeshProUGUI p_discount_price;
#endregion
private OfferSweepManager _offerSweepManager;
private OfferSweepManager OfferSweepManager => _offerSweepManager ??= GContext.container.Resolve<OfferSweepManager>();
private void Awake()
{
btn_buy = this.transform.Find("root/btn_buy").gameObject;
btn_purchase = this.transform.Find("root/btn_buy/btn_green_c").GetComponent<Button>();
btn_purchase.onClick.AddListener(OnClickPurchase);
btn_close = this.gameObject.FindChildGameObject(nameof(btn_close)).GetComponent<Button>();
btn_close.onClick.AddListener(OnClickClose);
p_discount_price = this.transform.Find("root/btn_buy/discount/p_discount_price").GetComponent<TextMeshProUGUI>();
p_current_price = btn_purchase.transform.Find("Ani_Container/p_current_price").GetComponent<TextMeshProUGUI>();
p_original_price = btn_purchase.transform.Find("Ani_Container/p_original_price").GetComponent<TextMeshProUGUI>();
_timeText = this.transform.Find("root/bg_time/text_time").GetComponent<TextMeshProUGUI>();
_offerSweepPackCells = this.transform.Find("root/list").GetComponentsInChildren<OfferSweepPackCell>();
Observable.Interval(TimeSpan.FromSeconds(1f)).Subscribe(UpdateTimer).AddTo(disposables);
}
protected override void OnDestroy()
{
var service = GContext.container.Resolve<IDeferredRewardStashService>();
service?.Flush();
GContext.Publish(new ShowData());//允许跳过动画直接关闭
base.OnDestroy();
}
private void UpdateTimer(long obj)
{
var offerSweepPackData = _offerSweepManager.SweepPackData;
if (offerSweepPackData == null)
return;
_timeText.text = ConvertTools.ConvertTime2(offerSweepPackData.RemainingTime);
}
protected override void Start()
{
base.Start();
GContext.OnEvent<RewardPanelClose>().Subscribe(OnRewardPanelClose).AddTo(disposables);
var packData = OfferSweepManager.SweepPackData;
if (packData != null)
{
packData.IsShowPoint = false;
OfferSweepManager.SaveData();
}
InitUI();
ShowUI();
}
private void InitUI()
{
p_current_price.text = string.Empty;
p_discount_price.text = string.Empty;
p_original_price.text = string.Empty;
_timeText.text = string.Empty;
for (int i = 0; i < _offerSweepPackCells.Length; i++)
{
_offerSweepPackCells[i].gameObject.SetActive(false);
}
//活动期间可以反复打开
if (OfferSweepManager.SweepPackData?.PurchasePackDir?.Count == 6)
{
OfferSweepManager.SweepPackData?.PurchasePackDir?.Clear();
OfferSweepManager.SweepPackData.StartTimeVipLevel = GContext.container.Resolve<PlayerData>().PriceLv;
OfferSweepManager.SaveData();
}
}
private void ShowUI(bool isCellShow = true)
{
var packData = OfferSweepManager.SweepPackData;
_timeText.text = ConvertTools.ConvertTime2(packData.RemainingTime);
var isCanBuyAll = (packData?.PurchasePackDir?.Count ?? 0) == 0;
btn_buy.SetActive(isCanBuyAll);
var packManager = OfferSweepManager.GetOfferSweepEventPackManager();
if (packManager == null) return;
var vipLevel = packData.StartTimeVipLevel;
var list = packManager.VIPPackList[vipLevel];
if (list == null || list.Count != 7)
{
// 约定这个list 有7个礼包第七个用来展示原价无其他作用。
Debug.LogError($"配置错误 eventPackManager ID {packManager.ID} VIP {vipLevel} list count {list?.Count}");
return;
}
for (int i = 0; i < list.Count && i < _offerSweepPackCells.Length; i++)
{
_offerSweepPackCells[i].SetData(i, _offerSweepManager);
if (isCellShow)
_offerSweepPackCells[i].ShowUI();
_offerSweepPackCells[i].gameObject.SetActive(true);
}
if (!isCanBuyAll) return;
var packConfig = _offerSweepManager.Tables.TbPack?.GetOrDefault(list[5]);
if (packConfig == null)
{
Debug.LogError($"配置错误 eventPackManager ID {packManager.ID} pack ID {list[5]}");
return;
}
//隐藏折扣和原价
if (packConfig.Rebate == 0)
{
p_discount_price.transform.parent.gameObject.SetActive(false);
p_original_price.gameObject.SetActive(false);
}
p_discount_price.text = $"{packConfig.Rebate:0%}";
var discountIapItem = _offerSweepManager.Tables.TbIAPItemList?.GetOrDefault(packConfig.IAPID);
if (discountIapItem != null)
{
SKUDetailDataEvent sKUDetailDataEvent = new SKUDetailDataEvent(discountIapItem);
GContext.Publish(sKUDetailDataEvent);
p_current_price.text = sKUDetailDataEvent.price;
}
var originalPackConfig = _offerSweepManager.Tables.TbPack?.GetOrDefault(list[6]);
if (originalPackConfig == null)
{
Debug.LogError($"配置错误 eventPackManager ID {packManager.ID} pack ID {list[6]}");
return;
}
var originalIapItem = _offerSweepManager.Tables.TbIAPItemList?.GetOrDefault(originalPackConfig.IAPID);
if (originalIapItem != null)
{
SKUDetailDataEvent sKUDetailDataEvent = new SKUDetailDataEvent(originalIapItem);
GContext.Publish(sKUDetailDataEvent);
p_original_price.text = sKUDetailDataEvent.price;
}
}
private void OnClickClose()
{
if (isPurchaseing) return;
try
{
UIManager.Instance.DestroyUI(gameObject.name);
}
catch (Exception e)
{
Debug.Log($"<color=red>{e.Message}\n{e.StackTrace}</color>");
}
}
private bool isPurchaseing = false;
private void OnClickPurchase()
{
if (isPurchaseing) return;
isPurchaseing = true;
_ = Purchase();
}
private async Task Purchase()
{
var isNotNull = _offerSweepManager.GetData(5, out var packManager, out var packConfig, out _, out var iapItem, out var packId);
if (!isNotNull) return;
for (int i = 0; i < _offerSweepPackCells.Length; i++)
{
_offerSweepPackCells[i].SetPurchaseStatus(true);
}
List<ItemData> itemDatas = new List<ItemData>();
for (int i = 0; i < 6; i++)
{
_offerSweepManager.GetData(i, out _, out _, out var itemDataTemp, out _, out _);
if (itemDataTemp != null)
itemDatas.AddRange(itemDataTemp);
}
//// 合并重复物品ID避免显示多个相同物品
//var mergedItems = itemDatas
// .GroupBy(item => item.id)
// .Select(group => new ItemData
// {
// id = group.Key,
// count = group.Sum(item => item.count)
// }).ToList();
//// 替换原来的列表
//itemDatas.Clear();
//itemDatas.AddRange(mergedItems);
var allPackIds = new Dictionary<int, int>();
var data = _offerSweepManager.SweepPackData;
for (int i = 0; i < 6; i++)
{
allPackIds.TryAdd(i,packManager.GetPackIDsByVipLevel(data.StartTimeVipLevel)[i]);
}
var shopBuyTypeData = new ShopBuyTypeData
{
type = ShopBuyType.None,
NoShow = true,
extraPurcheData = new JObject
{
{ nameof(OfferSweepPackData),JToken.FromObject(allPackIds) },
{ nameof(data.FishingEventID), data.FishingEventID }
}
};
bool Result = await GContext.container.Resolve<PlayerShopData>().OnBuy(packConfig.DropID, shopBuyTypeData, iapItem, itemDatas);
if (Result)
{
var vipLevel = data.StartTimeVipLevel;
data.PurchasedCount++;
for (int i = 0; i < 6; i++)
{
if (data.PurchasePackDir.TryAdd(i, packManager.VIPPackList[vipLevel][i]))
{
_offerSweepManager.SaveData();
}
}
for (int i = 0; i < 6; i++)
{
if (i == 5)
await _offerSweepPackCells[i].PlayEffect("OfferSweepFinalReward");
else
{
await _offerSweepPackCells[i].PlayEffect("OfferSweepGroupUnlock", false);
await _offerSweepPackCells[i].PlayEffect("OfferSweepGroupReward");
}
}
GContext.Publish(new ShowData());
ShowUI(false);
UIManager.Instance.DestroyUI(UITypes.OfferSweepPanel);
}
else
{
ShowUI(false);
}
for (int i = 0; i < _offerSweepPackCells.Length; i++)
{
_offerSweepPackCells[i].SetPurchaseStatus(false);
}
isPurchaseing = false;
}
public void OnRewardPanelClose(RewardPanelClose e)
{
ShowUI(false);
var index = _offerSweepManager.SweepPackData?.PurchasePackDir?.Count - 1 ?? 0;
if (index >= _offerSweepPackCells.Length) return;
_=TaskPlayEffect(index);
}
private async Task TaskPlayEffect(int index)
{
//5和6一起发奖励 此时index +2
if (index + 1 == _offerSweepPackCells.Length)
{
await _offerSweepPackCells[index - 1].PlayEffect("OfferSweepGroupReward");
await _offerSweepPackCells[index].PlayEffect("OfferSweepFinalReward");
var service = GContext.container.Resolve<IDeferredRewardStashService>();
service.Flush();
GContext.Publish(new ShowData());
UIManager.Instance.DestroyUI(UITypes.OfferSweepPanel);
}
else
{
await _offerSweepPackCells[index].PlayEffect("OfferSweepGroupReward");
await _offerSweepPackCells[index + 1].PlayEffect("OfferSweepGroupUnlock");
}
}
}
}