Files
back_cantanBuilding/Assets/Scripts/MiniBP/MiniBattlePassDataProvider.cs
2026-05-26 16:15:54 +08:00

750 lines
24 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 cfg;
using game;
using GameCore;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using UniRx;
using UnityEngine;
public enum MiniBattlePassType
{
None = 0,
LuckMagic = 1,
Dive = 2,
Fishcard = 3,
}
public enum MiniBattleVIPItemType
{
None = 0,
LuckMagic = 4,
Dive = 5,
Fishcard = 6,
}
public interface IMiniBattlePassDataProvider
{
MiniBattlePassRecord GetMiniBattlePassRecord(string key);
void SetMiniBattlePassRecord(string key, MiniBattlePassRecord record);
}
public class MiniBattlePassDataProvider : IMiniBattlePassDataProvider
{
private Tables _tables;
PlayerItemData _playerItemData;
string oldDataKey => "MiniBPKey";
string newDataKey => "MiniBPKeyNew";
Dictionary<MiniBattlePassType, MiniBattlePassDataModel> models = new Dictionary<MiniBattlePassType, MiniBattlePassDataModel>();
Dictionary<string, MiniBattlePassRecord> datas;
Dictionary<MiniBattleVIPItemType, MiniBattlePassType> itemSubEventToEventSubEvent = new Dictionary<MiniBattleVIPItemType, MiniBattlePassType>() {
{ MiniBattleVIPItemType.LuckMagic, MiniBattlePassType.LuckMagic },
{ MiniBattleVIPItemType.Dive, MiniBattlePassType.Dive },
{ MiniBattleVIPItemType.Fishcard, MiniBattlePassType.Fishcard }
};
public MiniBattlePassDataProvider(Tables tables, PlayerItemData playerItemData)
{
_tables = tables;
_playerItemData = playerItemData;
}
public void Refresh(FishingEvent t)
{
MiniBattlePassType miniBattlePassType = (MiniBattlePassType)t.SubType;
if (!models.TryGetValue(miniBattlePassType, out MiniBattlePassDataModel model))
{
model = NewModel(miniBattlePassType);
}
model.Refresh(t);
}
MiniBattlePassDataModel NewModel(MiniBattlePassType subType)
{
MiniBattlePassDataModel model;
model = new MiniBattlePassDataModel(_tables, _playerItemData, subType, this);
models[subType] = model;
return model;
}
public MiniBattlePassDataModel GetModel(MiniBattlePassType subType)
{
if (models.TryGetValue(subType, out MiniBattlePassDataModel model))
{
return model;
}
return NewModel(subType);
}
public void SetVipUnlock(int itemSubType)
{
MiniBattlePassType subType;
itemSubEventToEventSubEvent.TryGetValue((MiniBattleVIPItemType)itemSubType, out subType);
if (subType == 0)
{
Debug.LogError($"MiniBattlePassDataProvider.SetVipUnlock: itemSubType {itemSubType} not found in itemSubEventToEventSubEvent mapping.");
return;
}
if (models.TryGetValue(subType, out MiniBattlePassDataModel model))
{
model.SetVipUnlock();
}
}
public MiniBattlePassRecord GetMiniBattlePassRecord(string key)
{
MiniBattlePassRecord Data;
if (datas == null)
{
string dataStr = PlayFabMgr.Instance.GetLocalData(newDataKey);
Debug.Log($"GetMiniBattlePassRecord: dataStr = {dataStr}");
if (string.IsNullOrEmpty(dataStr))
{
datas = new Dictionary<string, MiniBattlePassRecord>();
}
else
{
datas = JsonConvert.DeserializeObject<Dictionary<string, MiniBattlePassRecord>>(dataStr);
}
}
if (datas.TryGetValue(key, out Data))
{
return Data;
}
else
{
Data = GetOldMiniBattlePassRecord();
datas[key] = Data;
return Data;
}
}
MiniBattlePassRecord GetOldMiniBattlePassRecord()
{
string dataStr = PlayFabMgr.Instance.GetLocalData(oldDataKey);
if (string.IsNullOrEmpty(dataStr))
{
return new MiniBattlePassRecord();
}
else
{
return JsonConvert.DeserializeObject<MiniBattlePassRecord>(dataStr);
}
}
public void SetMiniBattlePassRecord(string key, MiniBattlePassRecord record)
{
datas[key] = record;
PlayFabMgr.Instance.UpdateUserDataValue(newDataKey, JsonConvert.SerializeObject(datas));
}
}
public class MiniBattlePassDataModel
{
string _dataKey = "BP_";
MiniBattlePassType _type = MiniBattlePassType.LuckMagic;
private Tables _tables;
PlayerItemData _playerItemData;
MiniBattlePass miniBattlePassTable;
MiniBattlePassLevel miniBattlePassLevel;
public string PanelName => miniBattlePassTable.Prefab;
public List<int> ItemCountShow => miniBattlePassLevel.ItemCount;
public List<int> ItemShow => miniBattlePassLevel.ItemShow;
public string Icon => miniBattlePassTable.Icon;
public int Param => miniBattlePassTable.Param;
public string TaskDesc => miniBattlePassTable.TaskDesc_l10n_key;
public List<int> ProgressList => miniBattlePassLevel.TaskParamList;
public List<int> OverFlow => miniBattlePassTable.OverFlow;
public List<int> FreeRewards => miniBattlePassLevel.FreeRewardList;
//public int Type => miniBattlePassTable.Type;
FishingEvent fishingEvent;
public DateTime endTime { get; private set; } = DateTime.MinValue; //活动结束时间
public DateTime startTime = DateTime.MaxValue; //活动开始时间
public MiniBattlePassRecord Data { get; private set; }
public bool IsVip => Data.IsVIP;
public int rewardIndex { get; private set; } = -1;//0~
CompositeDisposable disposables;
IMiniBattlePassDataProvider _provider;
public MiniBattlePassDataModel(Tables tables, PlayerItemData playerItemData, MiniBattlePassType type, IMiniBattlePassDataProvider provider)
{
_type = type;
_tables = tables;
_playerItemData = playerItemData;
_dataKey = "BP_" + type;
_provider = provider;
Data = new MiniBattlePassRecord();
}
void UpdateTaskData(ConditionTypeEvent e)
{
if (!IsShow() || Data == null)
{
disposables?.Dispose();
disposables = null;
return;
}
int param = miniBattlePassTable.Param;
if (param > 0)
{
e.count *= param;
}
Data.Exp += e.count;
SetLevel();
SaveBattlePassRecord();
}
void SetLevel()
{
var tasks = miniBattlePassLevel?.TaskParamList;
for (int i = rewardIndex + 1; i < tasks?.Count; i++)
{
if (Data.Exp < tasks[i])
{
break;
}
else
{
rewardIndex = i;
}
}
SetRedPoint();
}
void SetRedPoint()
{
bool isRed = false;
var freeRewards = miniBattlePassLevel?.FreeRewardList;
int count = 0;
if (freeRewards?.Count > rewardIndex)
{
if (Data.NRIndexs.Count <= rewardIndex)
{
isRed = true;
count = rewardIndex - Data.NRIndexs.Count + 1;
}
}
else
{
isRed = rewardIndex > Data.showIndex;
}
if (Data.IsVIP)
{
if (Data.VRIndexs.Count <= rewardIndex)
{
isRed = true;
count += rewardIndex - Data.VRIndexs.Count + 1;
}
}
RedPointManager.Instance.SetRedPointState(HomeBtnMiniBP.redKey + _type, isRed, count);
}
public void Refresh(FishingEvent t)
{
//没有数据或者活动ID不一致时拿数据再判断
if (t.ID != Data.Id)
{
fishingEvent = t;
endTime = DateTime.Parse((t.TimeDefinition as LimitedTime).EndTime);
startTime = DateTime.Parse((t.TimeDefinition as LimitedTime).StartTime);
InitData();
}
}
public bool IsShow()
{
return /*false &&*/ fishingEvent != null
&& miniBattlePassTable != null
&& endTime > ZZTimeHelper.UtcNow()
&& startTime < ZZTimeHelper.UtcNow();
}
public bool IsDone()
{
return Data.VRIndexs.Count >= miniBattlePassLevel.PrimeRewardList.Count;
}
void InitData()
{
Data = _provider.GetMiniBattlePassRecord(_dataKey);
//拿到数据判断刷新活动
miniBattlePassTable = _tables.TbMiniBattlePass.GetOrDefault(fishingEvent.RedirectID);
if (Data.Id != fishingEvent.ID)
{
int oldRedirectID = Data.RedirectID;
int oldExp = 0;
List<int> lastDropIDs = new List<int>();
if (oldRedirectID > 0)
{
var miniTabel = _tables.TbMiniBattlePass.GetOrDefault(oldRedirectID);
if (miniTabel != null)
{
int Level = Data.PriceLv;
int levelId = miniTabel.VipList.Count > Level ? miniTabel.VipList[Level] : miniTabel.VipList[^1];
MiniBattlePassLevel passLevel = _tables.TbMiniBattlePassLevel.GetOrDefault(levelId);
int lv = GetLevel(Data.Exp, passLevel.TaskParamList);
if (lv >= 0)
{
lastDropIDs = SetLastDropIDs(passLevel, lv, Data.NRIndexs, Data.VRIndexs, Data.IsVIP);
oldExp = Data.Exp;
}
}
}
Data = new MiniBattlePassRecord();
Data.Id = fishingEvent.ID;
Data.PriceLv = GContext.container.Resolve<PlayerData>().PriceLv;
Data.LastDropIDs = lastDropIDs;
Data.oldExp = oldExp;
Data.oldRedirectID = oldRedirectID;
rewardIndex = -1;
SaveBattlePassRecord();
}
int id = miniBattlePassTable.VipList.Count > Data.PriceLv ? miniBattlePassTable.VipList[Data.PriceLv] : miniBattlePassTable.VipList[^1];
miniBattlePassLevel = _tables.TbMiniBattlePassLevel.GetOrDefault(id);
Data.RedirectID = fishingEvent.RedirectID;
SetLevel();
disposables?.Dispose();
disposables = new CompositeDisposable();
GContext.OnEvent<ConditionTypeEvent>().Where(x => x.type == miniBattlePassTable?.TaskType).Subscribe(UpdateTaskData).AddTo(disposables);
//string panelName = PanelName;
//UIType uIType = UITypes.GetOrNew(panelName);
//GContext.container.Resolve<IFaceUIService>().AddFaceCustomUIData(uIType);
}
public bool CheckIfGetLastBpRewards()
{
MiniBattlePass miniBattlePass = _tables.TbMiniBattlePass.GetOrDefault(Data.oldRedirectID);
if (miniBattlePass == null)
{
return false;
}
int Level = Data.PriceLv;
int id = miniBattlePass.VipList.Count > Level ? miniBattlePass.VipList[Level] : 0;
var passLevel = _tables.TbMiniBattlePassLevel.GetOrDefault(id);
if (Data.LastDropIDs.Count != 0 || (miniBattlePass.OverFlow.Count >= 3 && Data.oldExp > passLevel.TaskParamList[^1]))
{
var playerData = GContext.container.Resolve<PlayerItemData>();
var newList = new List<int>(Data.LastDropIDs);
var itemDatas = playerData.GetItemDataByDropList(newList);
int lv = GetLevel(Data.oldExp, passLevel.TaskParamList);
if (miniBattlePass.OverFlow.Count >= 3)
{
int exp = Data.oldExp - passLevel.TaskParamList[^1];
if (exp >= miniBattlePass.OverFlow[0])
{
ItemData itemData = new ItemData
{
id = miniBattlePass.OverFlow[2], // 钩子
count = exp * miniBattlePass.OverFlow[1] / miniBattlePass.OverFlow[0]
};
itemDatas.Add(itemData);
}
}
Data.oldExp = 0;
if (itemDatas.Count == 0)
{
return false;
}
GContext.Publish(new ShowData(itemDatas));
playerData.AddItem(itemDatas);
#if AGG
using (var e = GEvent.GameEvent("minibp_level_reward"))
{
e.AddContent("bp_id", miniBattlePass.Id)
.AddContent("drop_id_list", JsonConvert.SerializeObject(newList));
if (itemDatas != null && itemDatas.Count > 0)
{
for (int i = 0; i < itemDatas.Count; i++)
{
if (itemDatas[i].id == 1001)
{
e.AddContent("reward_hook", itemDatas[i].count);
}
else if (itemDatas[i].id == 1002)
{
e.AddContent("reward_cash", itemDatas[i].count);
}
}
}
}
#endif
string eventName = "";
if (miniBattlePass != null)
{
eventName = LocalizationMgr.GetText(miniBattlePass.TitleDesc_l10n_key);
}
string textValue = LocalizationMgr.GetFormatTextValue("UI_MiniBattlePass_DivePopupPanel_7", eventName);
GContext.Publish(new ShowData(textValue: textValue));
Data.LastDropIDs.Clear();
SaveBattlePassRecord();
return true;
}
return false;
}
/// <summary>
/// 能领奖的等级 从0开始
/// </summary>
/// <param name="exp"></param>
/// <param name="tasks"></param>
/// <returns></returns>
int GetLevel(int exp, List<int> tasks)
{
int index = -1;
for (int i = 0; i < tasks.Count; i++)
{
if (exp < tasks[i])
{
break;
}
else
{
index = i;
}
}
return index;
}
/// <summary>
/// 获得未获得奖励
/// </summary>
/// <param name="miniTabel"></param>
/// <param name="reward"></param>
/// <param name="nrIndexs"></param>
/// <param name="vrIndexs"></param>
/// <param name="vip"></param>
/// <returns></returns>
List<int> SetLastDropIDs(MiniBattlePassLevel passLevel, int reward, List<int> nrIndexs, List<int> vrIndexs, bool vip)
{
var freeRewards = passLevel.FreeRewardList;
var primeRewards = passLevel.PrimeRewardList;
List<int> rewardList = new List<int>();
if (freeRewards.Count > reward)
{
for (int i = 0; i <= reward; i++)
{
if (!nrIndexs.Contains(i))
{
rewardList.Add(freeRewards[i]);
}
}
}
if (vip)
{
for (int i = 0; i <= reward; i++)
{
if (!vrIndexs.Contains(i))
{
rewardList.Add(primeRewards[i]);
}
}
}
return rewardList;
}
/// <summary>
/// 展示后
/// </summary>
public void SetOldLevel()
{
if (Data != null)
{
Data.showIndex = rewardIndex;
SaveBattlePassRecord();
}
}
void CheckDone()
{
if (IsDone())
{
GContext.Publish(new TargetEvent(fishingEvent.ID, fishingEvent.Type, fishingEvent.SubType));
}
}
public void ReceiveReward(int index, bool isFree)
{
if (Data != null)
{
var freeRewards = miniBattlePassLevel.FreeRewardList;
var primeRewards = miniBattlePassLevel.PrimeRewardList;
int dropid = 0;
if (isFree)
{
if (!Data.NRIndexs.Contains(index))
{
Data.NRIndexs.Add(index);
dropid = freeRewards[index];
miniBPItemDatas[index].isFreeClaimed = true;
}
}
else if (Data.IsVIP)
{
if (!Data.VRIndexs.Contains(index))
{
Data.VRIndexs.Add(index);
dropid = primeRewards[index];
miniBPItemDatas[index].isGrandClaimed = true;
}
}
if (dropid == 0)
{
return;
}
List<ItemData> itemDatas = _playerItemData.AddItemByDrop(dropid);
GContext.Publish(new ShowData());
CheckDone();
SaveBattlePassRecord();
#if AGG
using (var e = GEvent.GameEvent("minibp_reward"))
{
e.AddContent("bp_level", index + 1)
.AddContent("bp_id", Data.RedirectID)
.AddContent("event_id", Data.Id)
.AddContent("is_activate", Data.IsVIP)
.AddContent("drop_id_list", dropid);
if (itemDatas != null && itemDatas.Count > 0)
{
for (int i = 0; i < itemDatas.Count; i++)
{
if (itemDatas[i].id == 1001)
{
e.AddContent("reward_hook", itemDatas[i].count);
}
else if (itemDatas[i].id == 1002)
{
e.AddContent("reward_cash", itemDatas[i].count);
}
}
}
}
#endif
}
}
public void ReceiveAllReward()
{
if (Data != null)
{
var freeRewards = miniBattlePassLevel.FreeRewardList;
var primeRewards = miniBattlePassLevel.PrimeRewardList;
List<int> rewardList = new List<int>();
if (freeRewards.Count > rewardIndex)
{
for (int i = 0; i <= rewardIndex; i++)
{
if (!Data.NRIndexs.Contains(i))
{
Data.NRIndexs.Add(i);
rewardList.Add(freeRewards[i]);
}
}
}
if (Data.IsVIP)
{
for (int i = 0; i <= rewardIndex; i++)
{
if (!Data.VRIndexs.Contains(i))
{
Data.VRIndexs.Add(i);
rewardList.Add(primeRewards[i]);
}
}
}
if (rewardList.Count == 0)
{
return;
}
List<ItemData> itemDatas = _playerItemData.AddItemByDropList(rewardList);
GContext.Publish(new ShowData());
RefreshDataReward();
CheckDone();
SaveBattlePassRecord();
#if AGG
using (var e = GEvent.GameEvent("minibp_reward"))
{
e.AddContent("bp_level", rewardIndex + 1)
.AddContent("bp_id", Data.RedirectID)
.AddContent("event_id", Data.Id)
.AddContent("is_activate", Data.IsVIP)
.AddContent("drop_id_list", JsonConvert.SerializeObject(rewardList));
if (itemDatas != null && itemDatas.Count > 0)
{
for (int i = 0; i < itemDatas.Count; i++)
{
if (itemDatas[i].id == 1001)
{
e.AddContent("reward_hook", itemDatas[i].count);
}
else if (itemDatas[i].id == 1002)
{
e.AddContent("reward_cash", itemDatas[i].count);
}
}
}
}
#endif
}
}
public void SaveBattlePassRecord()
{
SetRedPoint();
_provider.SetMiniBattlePassRecord(_dataKey, Data);
}
public IAPItemList GetIAPItem()
{
return _tables.TbIAPItemList.GetOrDefault(miniBattlePassLevel.IapId);
}
public async Task<bool> BuyBattlePass()
{
var iAPItemList = _tables.TbIAPItemList.GetOrDefault(miniBattlePassLevel.IapId);
int dropID = miniBattlePassLevel.ActivateId;
var itemDatas = GContext.container.Resolve<PlayerItemData>().GetItemDataByDropId(dropID);
ShopBuyTypeData shopBuyTypeData = new ShopBuyTypeData();
shopBuyTypeData.type = ShopBuyType.None;
shopBuyTypeData.IsHide = true;
bool Result = await GContext.container.Resolve<PlayerShopData>().OnBuy(dropID, shopBuyTypeData, iAPItemList, itemDatas);
if (Result)
{
RefreshDataVIP();
}
return Result;
}
void RefreshDataVIP()
{
if (miniBPItemDatas != null && miniBPItemDatas.Count > 0)
{
for (int i = 0; i < miniBPItemDatas.Count; i++)
{
miniBPItemDatas[i].isGrandReward = true;
}
}
}
void RefreshDataReward()
{
if (miniBPItemDatas != null && miniBPItemDatas.Count > 0)
{
for (int i = 0; i < miniBPItemDatas.Count; i++)
{
var item = miniBPItemDatas[i];
item.isGrandClaimed = Data.VRIndexs.Contains(i);
item.isFreeClaimed = Data.NRIndexs.Contains(i);
}
}
}
public void SetVipUnlock()
{
if (Data != null)
{
Data.IsVIP = true;
SaveBattlePassRecord();
}
}
public void SetPanelData()
{
if (miniBattlePassTable == null)
{
miniBattlePassTable = _tables.TbMiniBattlePass.GetOrDefault(fishingEvent.RedirectID);
}
if (miniBattlePassTable == null)
{
return;
}
int Level = Data.PriceLv;
int id = miniBattlePassTable.VipList.Count > Level ? miniBattlePassTable.VipList[Level] : miniBattlePassTable.VipList[^1];
miniBattlePassLevel = _tables.TbMiniBattlePassLevel.GetOrDefault(id);
SetData();
}
public List<MiniBPItemData> miniBPItemDatas;
void SetData()
{
miniBPItemDatas = new List<MiniBPItemData>();
var tasks = miniBattlePassLevel.TaskParamList;
var FreeRewardList = miniBattlePassLevel.FreeRewardList;
var PrimeRewardList = miniBattlePassLevel.PrimeRewardList;
string format = LocalizationMgr.GetText(miniBattlePassTable.TaskDesc_l10n_key);
for (int i = 0; i < tasks.Count; i++)
{
MiniBPItemData item = new MiniBPItemData();
item.index = i;
item.progress = Data.Exp;
item.maxProgress = tasks[i];
item.taskName = format.SafeFormat(tasks[i]);
if (FreeRewardList.Count > i)
{
item.freeReward = _playerItemData.GetItemDataOne(FreeRewardList[i]);
}
item.grandReward = _playerItemData.GetItemDataOne(PrimeRewardList[i]);
item.isGrandReward = Data.IsVIP;
item.isGrandClaimed = Data.VRIndexs.Contains(i);
item.isFreeClaimed = Data.NRIndexs.Contains(i);
miniBPItemDatas.Add(item);
}
}
~MiniBattlePassDataModel()
{
Dispose();
}
void Dispose()
{
disposables?.Dispose();
disposables = null;
}
}
public class MiniBattlePassRecord
{
/// <summary>
/// 活动ID
/// </summary>
public int Id;
public int RedirectID;
public int PriceLv;
/// <summary>
/// 普通领奖进度
/// </summary>
public List<int> NRIndexs = new List<int>();
/// <summary>
/// 是否付费
/// </summary>
public bool IsVIP;
/// <summary>
/// 付费领奖进度
/// </summary>
public List<int> VRIndexs = new List<int>();
public int oldRedirectID;
public int oldExp;
public List<int> LastDropIDs = new List<int>();
/// <summary>
/// 展示过的等级,和新等级之间表现用
/// </summary>
public int showIndex;
/// <summary>
/// 累计经验
/// </summary>
public int Exp;
}