292 lines
12 KiB
C#
292 lines
12 KiB
C#
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");
|
||
}
|
||
}
|
||
}
|
||
} |