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, Bingo = 4, Smash = 5 } public enum MiniBattleVIPItemType { None = 0, LuckMagic = 4, Dive = 5, Fishcard = 6, Bingo = 7, Smash = 8 } /// /// 小战令已将 + type 写入 后发布。 /// 依赖该 Key 的合并红点、入口等可订阅并按 自行刷新,无需在 MiniBP 内引用具体活动。 /// public readonly struct MiniBattlePassRedPointChangedEvent { public MiniBattlePassType Type { get; } public MiniBattlePassRedPointChangedEvent(MiniBattlePassType type) { Type = type; } } public interface IMiniBattlePassDataProvider { MiniBattlePassRecord GetMiniBattlePassRecord(string key); void SetMiniBattlePassRecord(string key, MiniBattlePassRecord record); } public class MiniBattlePassDataProvider : IMiniBattlePassDataProvider { private Tables _tables; PlayerItemData _playerItemData; string newDataKey => "MiniBPKeyNew"; Dictionary models = new Dictionary(); Dictionary datas; Dictionary itemSubEventToEventSubEvent = new Dictionary() { { MiniBattleVIPItemType.LuckMagic, MiniBattlePassType.LuckMagic }, { MiniBattleVIPItemType.Dive, MiniBattlePassType.Dive }, { MiniBattleVIPItemType.Fishcard, MiniBattlePassType.Fishcard }, { MiniBattleVIPItemType.Bingo, MiniBattlePassType.Bingo }, { MiniBattleVIPItemType.Smash, MiniBattlePassType.Smash } }; public MiniBattlePassDataProvider(Tables tables, PlayerItemData playerItemData) { _tables = tables; _playerItemData = playerItemData; } 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); } // 根据活动开启 redirectID 在活动主表里面配置的 redirectID 字段获取 public void EventRefresh(FishingEvent t, int redirectID) { //根据活动新增 MiniBattlePassType miniBattlePassType = MiniBattlePassType.None; //Debug.Log($"[MiniBattlePass]MiniBattlePassDataProvider.EventRefresh: t.ID = {t.ID}, t.Type = {t.Type}, t.SubType = {t.SubType}, redirectID = {redirectID}"); if (t.Type == 9) { miniBattlePassType = (MiniBattlePassType)t.SubType; } else if (t.Type == 4) { miniBattlePassType = MiniBattlePassType.Bingo; } else if (t.Type == 7 && t.SubType == 7) { miniBattlePassType = MiniBattlePassType.Smash; } if (!models.TryGetValue(miniBattlePassType, out MiniBattlePassDataModel model)) { model = NewModel(miniBattlePassType); } model.Refresh(t, redirectID); } public void UpdateTaskData(MiniBattlePassType subType, int count) { if (models.TryGetValue(subType, out MiniBattlePassDataModel model)) { model.UpdateTaskData(count); } } 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; } //Debug.Log($"MiniBattlePassDataProvider.SetVipUnlock: itemSubType = {itemSubType}, bpSubType = {subType}"); 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(); } else { datas = JsonConvert.DeserializeObject>(dataStr); } } if (datas.TryGetValue(key, out Data)) { return Data; } else { Data = new MiniBattlePassRecord(); datas[key] = Data; return Data; } } public void SetMiniBattlePassRecord(string key, MiniBattlePassRecord record) { datas[key] = record; PlayFabMgr.Instance.UpdateUserDataValue(newDataKey, JsonConvert.SerializeObject(datas)); } } public class MiniBattlePassProgressInfo { public float FillAmount { get; set; } public int CurrentLevel { get; set; } public int NextLevel { get; set; } public int CurrentExp { get; set; } public int MaxExpForNextLevel { get; set; } public bool IsAtMaxLevel { get; set; } public bool HasProgress { get; set; } public int MaxLevelCount { get; set; } } 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 ItemCountShow => miniBattlePassLevel.ItemCount; public List ItemShow => miniBattlePassLevel.ItemShow; public string Icon => miniBattlePassTable.Icon; public int Param => miniBattlePassTable.Param; public string TaskDesc => miniBattlePassTable.TaskDesc_l10n_key; public List ProgressList { get { var taskParamList = new List(miniBattlePassLevel.TaskParamList); if (Data.InflationRate > 0) { for (int i = 0; i < taskParamList.Count; i++) { taskParamList[i] = _playerItemData.IntInflation(taskParamList[i], Data.InflationRate); } } return taskParamList; } } public List OverFlow => miniBattlePassTable.OverFlow; public List 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 bool RedPoint; 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(); } /// /// TaskType == ConditionType.None 手动调用进度增加接口 /// /// public void UpdateTaskData(int count) { if (!IsShow() || Data == null) { return; } int param = miniBattlePassTable.Param; if (param > 0) { count *= param; } Data.Exp += count; SetLevel(); SaveBattlePassRecord(); } void SetLevel() { var tasks = ProgressList; for (int i = rewardIndex + 1; i < tasks?.Count; i++) { if (Data.Exp < tasks[i]) { break; } else { rewardIndex = i; } } SetRedPoint(); } void SetRedPoint() { if (RedPoint) { RedPointManager.Instance.SetRedPointState(HomeBtnMiniBP.redKey + _type, true); GContext.Publish(new MiniBattlePassRedPointChangedEvent(_type)); return; } 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; } var overFlow = OverFlow; if (overFlow.Count >= 3) { var taskParam = ProgressList[^1]; int exp = Data.Exp - taskParam; if (exp >= overFlow[0]) { isRed = true; count += exp / overFlow[0] * overFlow[1]; } } } RedPointManager.Instance.SetRedPointState(HomeBtnMiniBP.redKey + _type, isRed, count); GContext.Publish(new MiniBattlePassRedPointChangedEvent(_type)); } public void Refresh(FishingEvent t, int redirectID) { //没有数据或者活动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(redirectID); } if (!string.IsNullOrEmpty(PanelName) && IsShow() && miniBattlePassTable.TaskType != ConditionType.None) { GContext.container.Resolve().AddGiftFaceUI(Data.Id, new UIType(PanelName), 0); } } 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(int redirectID) { Data = _provider.GetMiniBattlePassRecord(_dataKey); //拿到数据判断刷新活动 miniBattlePassTable = _tables.TbMiniBattlePass.GetOrDefault(redirectID); if (Data.Id != fishingEvent.ID) { RedPoint = true; int oldRedirectID = Data.RedirectID; int oldID = Data.Id; int oldExp = 0; bool oldIsVIP = Data.IsVIP; List lastDropIDs = new List(); 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); List taskParamList = new List(passLevel.TaskParamList); if (Data.InflationRate > 0) { for (int i = 0; i < taskParamList.Count; i++) { taskParamList[i] = _playerItemData.IntInflation(taskParamList[i], Data.InflationRate); } } int lv = GetLevel(Data.Exp, taskParamList); if (lv >= 0) { lastDropIDs = SetLastDropIDs(passLevel, lv, Data.NRIndexs, Data.VRIndexs, Data.IsVIP); oldExp = Data.Exp; } } } Data = new MiniBattlePassRecord(); Data.Id = fishingEvent.ID; if (miniBattlePassTable.TaskType == ConditionType.ConsumeEnergy) { Data.InflationRate = GContext.container.Resolve().InflationRate; } Data.PriceLv = GContext.container.Resolve().PriceLv; Data.LastDropIDs = lastDropIDs; Data.oldExp = oldExp; Data.oldRedirectID = oldRedirectID; Data.oldID = oldID; Data.oldIsVIP = oldIsVIP; rewardIndex = -1; SaveBattlePassRecord(); } int id = miniBattlePassTable.VipList.Count > Data.PriceLv ? miniBattlePassTable.VipList[Data.PriceLv] : miniBattlePassTable.VipList[^1]; miniBattlePassLevel = _tables.TbMiniBattlePassLevel.GetOrDefault(id); Data.RedirectID = redirectID; SetLevel(); disposables?.Dispose(); disposables = new CompositeDisposable(); if (miniBattlePassTable.TaskType != ConditionType.None) { GContext.OnEvent().Where(x => x.type == miniBattlePassTable?.TaskType).Subscribe(UpdateTaskData).AddTo(disposables); } } 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] : miniBattlePass.VipList[^1]; var passLevel = _tables.TbMiniBattlePassLevel.GetOrDefault(id); var TaskParamList = passLevel.TaskParamList; //passLevel 鱼卡战令任务需求最后转换 所以此处 TaskParamList 不需要膨胀处理 if (Data.LastDropIDs.Count != 0 || (miniBattlePass.OverFlow.Count >= 3 && Data.oldExp > TaskParamList[^1])) { //旧的需求 var playerData = GContext.container.Resolve(); var newList = new List(Data.LastDropIDs); var itemDatas = playerData.GetMergedItemDataByDropList(newList); playerData.LureInflation(itemDatas, null); //int lv = GetLevel(Data.oldExp, TaskParamList); ItemData itemDataOverFlow = null; if (miniBattlePass.OverFlow.Count >= 3) { int exp = Data.oldExp - TaskParamList[^1]; if (exp >= miniBattlePass.OverFlow[0]) { itemDataOverFlow = new ItemData { id = miniBattlePass.OverFlow[2], // 钩子 count = exp * miniBattlePass.OverFlow[1] / miniBattlePass.OverFlow[0] }; #if AGG using (var e = GEvent.GameEvent("minibp_reward_extra")) { e.AddContent("event_id", Data.oldID) .AddContent("bp_id", passLevel.Id) .AddContent("is_activate", Data.oldID) .AddContent("extra_points", exp) .AddContent("reward", $"{itemDataOverFlow.id},{itemDataOverFlow.count}"); } #endif } } Data.oldExp = 0; if (itemDatas.Count == 0 && itemDataOverFlow == null) { return false; } if (itemDatas.Count > 0) { ChangeSource changeSource = new ChangeSource(Data.oldID, "MiniBattlePass", "MiniBattlePass", "ExpiredReward"); if (_type == MiniBattlePassType.Bingo) { changeSource.Source_Group = "Event_Minigame1"; changeSource.Source_Type = "Event_Minigame1_Bingo"; } else if (_type == MiniBattlePassType.Fishcard) { changeSource.Source_Type = "MiniBattlePass_FishCard"; } else if (_type == MiniBattlePassType.Dive) { changeSource.Source_Type = "MiniBattlePass_Lure"; } else if (_type == MiniBattlePassType.Smash) { changeSource.Source_Group = "Event_Minigame2"; changeSource.Source_Type = "Event_Minigame2_Smash"; } GContext.Publish(new ShowData(itemDatas)); playerData.AddItem(itemDatas, changeSource); } if (itemDataOverFlow != null) { ChangeSource changeSource = new ChangeSource(Data.oldID, "MiniBattlePass", "MiniBattlePass", "OverflowReward"); if (_type == MiniBattlePassType.Fishcard) { changeSource.Source_Type = "MiniBattlePass_FishCard"; } GContext.Publish(new ShowData(itemDataOverFlow) { rewardType = RewardType.FishCardBoxOpen }); playerData.AddItem(itemDataOverFlow, changeSource); } #if AGG using (var e = GEvent.GameEvent("minibp_level_reward")) { e.AddContent("bp_id", passLevel.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) .AddContent("hook_origin", itemDatas[i].origin); } 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; } //async void ShowBox(ItemData itemData) //{ // GameObject go = await UIManager.Instance.ShowUI(new UIType("RewardPopupPanel_Fishcard")); // RewardPopupPanel_Fishcard panel_Fishcard = go.GetComponent(); // panel_Fishcard.Open(itemData); //} /// /// 能领奖的等级 从0开始 /// /// /// /// int GetLevel(int exp, List tasks) { int index = -1; for (int i = 0; i < tasks.Count; i++) { if (exp < tasks[i]) { break; } else { index = i; } } return index; } /// /// 获得未获得奖励 /// /// /// /// /// /// /// List SetLastDropIDs(MiniBattlePassLevel passLevel, int reward, List nrIndexs, List vrIndexs, bool vip) { var freeRewards = passLevel.FreeRewardList; var primeRewards = passLevel.PrimeRewardList; List rewardList = new List(); 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; } /// /// 展示后 /// public void SetOldLevel() { if (Data != null) { Data.showIndex = rewardIndex; SaveBattlePassRecord(); } } /// /// 将面板已浏览档位记为指定下标(用于 Second 面板追进度动画与 spine 锚点同步)。 /// public void SetShowIndexForPanelView(int tierIndex) { if (Data != null) { Data.showIndex = tierIndex; SaveBattlePassRecord(); } } /// /// 在已达成的最高档 内,从高档向低档找仍有未领奖励(免费或 VIP 付费)的最高档下标;若均已领完则返回 (<0 时返回 0)。 /// public int GetHighestClaimableTierIndex() { int r = rewardIndex; if (r < 0 || Data == null || miniBattlePassLevel == null) { return Mathf.Max(0, r); } var freeRewards = miniBattlePassLevel.FreeRewardList; var primeRewards = miniBattlePassLevel.PrimeRewardList; for (int i = r; i >= 0; i--) { bool freeLeft = freeRewards != null && i < freeRewards.Count && !Data.NRIndexs.Contains(i); bool primeLeft = Data.IsVIP && primeRewards != null && i < primeRewards.Count && !Data.VRIndexs.Contains(i); if (freeLeft || primeLeft) { return i; } } return r; } void CheckDone() { if (IsDone()) { GContext.Publish(new TargetEvent(fishingEvent.ID, fishingEvent.Type, fishingEvent.SubType)); } } public ItemData ReceiveOverFlow() { var overFlow = miniBattlePassTable.OverFlow; if (overFlow.Count >= 3) { var taskParam = ProgressList[^1]; int exp = Data.Exp - taskParam; if (exp >= overFlow[0]) { int count = exp / overFlow[0]; int cost_points = count * overFlow[0]; Data.Exp -= cost_points; count *= overFlow[1]; int id = overFlow[2]; //发奖励刷界面,保存数据 ItemData itemData = new ItemData { id = id, count = count, inflate = GContext.container.Resolve().InflationRate }; GContext.Publish(new game.ShowData(itemData) { rewardType = RewardType.FishCardBoxOpen }); ChangeSource changeSource = new ChangeSource(Data.Id, "MiniBattlePass", "MiniBattlePass", "OverflowReward"); if (_type == MiniBattlePassType.Fishcard) { changeSource.Source_Type = "MiniBattlePass_FishCard"; } _playerItemData.AddItem(itemData, changeSource); SetRedPoint(); #if AGG using (var e = GEvent.GameEvent("minibp_fishcard_overflow_reward")) { e.AddContent("event_id", Data.Id) .AddContent("bp_id", miniBattlePassLevel.Id) .AddContent("cost_points", cost_points) .AddContent("reward", $"{itemData.id},{itemData.count}"); } #endif GContext.Publish(new ShowData()); SaveBattlePassRecord(); return itemData; } } return null; } public void ReceiveReward(int index, bool isFree) { if (Data != null) { var freeRewards = miniBattlePassLevel.FreeRewardList; var primeRewards = miniBattlePassLevel.PrimeRewardList; int dropid = 0; ChangeSource changeSource = new ChangeSource(Data.Id, "MiniBattlePass", "MiniBattlePass", "FreeLevelReward"); if (isFree) { if (!Data.NRIndexs.Contains(index)) { if (_type == MiniBattlePassType.Bingo) { changeSource.Source_Group = "Event_Minigame1"; changeSource.Source_Type = "Event_Minigame1_Bingo"; changeSource.Source_Module = "PassFreeReward"; } else if (_type == MiniBattlePassType.Fishcard) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_FishCard"; changeSource.Source_Module = "FreeLevelReward"; } else if (_type == MiniBattlePassType.Dive) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_Lure"; changeSource.Source_Module = "FreeLevelReward"; } else if (_type == MiniBattlePassType.Smash) { changeSource.Source_Group = "Event_Minigame2"; changeSource.Source_Type = "Event_Minigame2_Smash"; changeSource.Source_Module = "PassFreeReward"; } Data.NRIndexs.Add(index); dropid = freeRewards[index]; miniBPItemDatas[index].isFreeClaimed = true; } } else if (Data.IsVIP) { if (!Data.VRIndexs.Contains(index)) { if (_type == MiniBattlePassType.Bingo) { changeSource.Source_Group = "Event_Minigame1"; changeSource.Source_Type = "Event_Minigame1_Bingo"; changeSource.Source_Module = "PassPrimeReward"; } else if (_type == MiniBattlePassType.Fishcard) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_FishCard"; changeSource.Source_Module = "PrimeLevelReward"; } else if (_type == MiniBattlePassType.Dive) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_Lure"; changeSource.Source_Module = "PrimeLevelReward"; } else if (_type == MiniBattlePassType.Smash) { changeSource.Source_Group = "Event_Minigame2"; changeSource.Source_Type = "Event_Minigame2_Smash"; changeSource.Source_Module = "PassPrimeReward"; } Data.VRIndexs.Add(index); dropid = primeRewards[index]; miniBPItemDatas[index].isGrandClaimed = true; } } if (dropid == 0) { return; } List itemDatas = _playerItemData.AddItemByDropLureInflation(null, dropid, changeSource); GContext.Publish(new ShowData()); CheckDone(); SaveBattlePassRecord(); #if AGG using (var e = GEvent.GameEvent("minibp_reward")) { e.AddContent("bp_level", index + 1) .AddContent("bp_id", miniBattlePassLevel.Id) .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) .AddContent("hook_origin", itemDatas[i].origin); } else if (itemDatas[i].id == 1002) { e.AddContent("reward_cash", itemDatas[i].count); } } } } #endif } } public bool ReceiveAllReward() { if (Data == null) { return false; } var freeRewards = miniBattlePassLevel.FreeRewardList; var primeRewards = miniBattlePassLevel.PrimeRewardList; List rewardList = new List(); List rewardList1 = new List(); List rewardList2 = new List(); List itemDatas = new List(); List itemDatas1 = new List(); List itemDatas2 = new List(); if (freeRewards.Count > rewardIndex) { for (int i = 0; i <= rewardIndex; i++) { if (!Data.NRIndexs.Contains(i)) { Data.NRIndexs.Add(i); rewardList1.Add(freeRewards[i]); } } if (rewardList1.Count > 0) { rewardList.AddRange(rewardList1); ChangeSource changeSource = new ChangeSource(Data.Id, "MiniBattlePass", "MiniBattlePass", "FreeLevelReward"); if (_type == MiniBattlePassType.Bingo) { changeSource.Source_Group = "Event_Minigame1"; changeSource.Source_Type = "Event_Minigame1_Bingo"; changeSource.Source_Module = "PassFreeReward"; } else if (_type == MiniBattlePassType.Fishcard) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_FishCard"; changeSource.Source_Module = "FreeLevelReward"; } else if (_type == MiniBattlePassType.Dive) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_Lure"; changeSource.Source_Module = "FreeLevelReward"; } else if (_type == MiniBattlePassType.Smash) { changeSource.Source_Group = "Event_Minigame2"; changeSource.Source_Type = "Event_Minigame2_Smash"; changeSource.Source_Module = "PassFreeReward"; } itemDatas1 = _playerItemData.GetItemByDropListLureInflation(null, rewardList1); for (int i = 0; i < itemDatas1.Count; i++) { itemDatas1[i].changeSource = changeSource; } itemDatas.AddRange(itemDatas1); } } if (Data.IsVIP) { for (int i = 0; i <= rewardIndex; i++) { if (!Data.VRIndexs.Contains(i)) { Data.VRIndexs.Add(i); rewardList2.Add(primeRewards[i]); } } if (rewardList2.Count > 0) { rewardList.AddRange(rewardList2); ChangeSource changeSource = new ChangeSource(Data.Id, "MiniBattlePass", "MiniBattlePass", "PrimeLevelReward"); if (_type == MiniBattlePassType.Bingo) { changeSource.Source_Group = "Event_Minigame1"; changeSource.Source_Type = "Event_Minigame1_Bingo"; changeSource.Source_Module = "PassPrimeReward"; } else if (_type == MiniBattlePassType.Fishcard) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_FishCard"; changeSource.Source_Module = "PrimeLevelReward"; } else if (_type == MiniBattlePassType.Dive) { changeSource.Source_Group = "MiniBattlePass"; changeSource.Source_Type = "MiniBattlePass_Lure"; changeSource.Source_Module = "PrimeLevelReward"; } else if (_type == MiniBattlePassType.Smash) { changeSource.Source_Group = "Event_Minigame2"; changeSource.Source_Type = "Event_Minigame2_Smash"; changeSource.Source_Module = "PassPrimeReward"; } itemDatas2 = _playerItemData.GetItemByDropListLureInflation(null, rewardList2); for (int i = 0; i < itemDatas2.Count; i++) { itemDatas2[i].changeSource = changeSource; } itemDatas.AddRange(itemDatas2); } } if (rewardList.Count == 0) { return false; } GContext.Publish(new ShowData(itemDatas)); _playerItemData.AddItem(itemDatas, null); 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", miniBattlePassLevel.Id) .AddContent("event_id", Data.Id) .AddContent("is_activate", Data.IsVIP) .AddContent("drop_id_list", JsonConvert.SerializeObject(rewardList)); if (itemDatas != null && itemDatas.Count > 0) { int reward_hook = 0; int hook_origin = 0; int reward_cash = 0; for (int i = 0; i < itemDatas.Count; i++) { if (itemDatas[i].id == 1001) { reward_hook += itemDatas[i].count; hook_origin += itemDatas[i].origin; } else if (itemDatas[i].id == 1002) { reward_cash += itemDatas[i].count; } } e.AddContent("reward_hook", reward_hook) .AddContent("hook_origin", hook_origin) .AddContent("reward_cash", reward_cash); } } #endif return true; } public void SaveBattlePassRecord() { SetRedPoint(); _provider.SetMiniBattlePassRecord(_dataKey, Data); } public IAPItemList GetIAPItem() { return _tables.TbIAPItemList.GetOrDefault(miniBattlePassLevel.IapId); } public async Task BuyBattlePass() { var iAPItemList = _tables.TbIAPItemList.GetOrDefault(miniBattlePassLevel.IapId); int dropID = miniBattlePassLevel.ActivateId; var itemDatas = GContext.container.Resolve().GetItemDataByDropId(dropID); ShopBuyTypeData shopBuyTypeData = new ShopBuyTypeData(); shopBuyTypeData.type = ShopBuyType.None; shopBuyTypeData.IsHide = true; bool Result = await GContext.container.Resolve().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 && miniBattlePassTable != null && IsShow()) { Data.IsVIP = true; SaveBattlePassRecord(); } } public void SetPanelData() { if (miniBattlePassTable == null) { miniBattlePassTable = _tables.TbMiniBattlePass.GetOrDefault(Data.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(); RedPoint = false; SetRedPoint(); } public List miniBPItemDatas; void SetData() { miniBPItemDatas = new List(); var tasks = ProgressList; 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]; if (miniBattlePassTable.TaskType != ConditionType.None) { item.taskName = format.SafeFormat(tasks[i]); } if (FreeRewardList.Count > i) { item.freeReward = _playerItemData.GetItemDataOneLureInflation(null, FreeRewardList[i]); } item.grandReward = _playerItemData.GetItemDataOneLureInflation(null, PrimeRewardList[i]); item.isGrandReward = Data.IsVIP; item.isGrandClaimed = Data.VRIndexs.Contains(i); item.isFreeClaimed = Data.NRIndexs.Contains(i); miniBPItemDatas.Add(item); } } /// /// Gets the progress information for UI display /// public MiniBattlePassProgressInfo GetUiProgressInfo() { var progressList = ProgressList; int nextlv = rewardIndex + 1; var info = new MiniBattlePassProgressInfo(); if (nextlv < progressList.Count) { int startExp = 0; if (nextlv > 0) { startExp = progressList[nextlv - 1]; } int curExp = Data.Exp - startExp; int curMax = progressList[nextlv] - startExp; info.CurrentExp = curExp; info.MaxExpForNextLevel = curMax; info.FillAmount = curMax <= 0 ? 0f : curExp / (float)curMax; info.CurrentLevel = rewardIndex; info.NextLevel = nextlv; info.IsAtMaxLevel = false; info.HasProgress = true; } else { // At max level info.CurrentExp = progressList[^1]; info.MaxExpForNextLevel = progressList[^1]; info.FillAmount = 1f; info.CurrentLevel = rewardIndex; info.NextLevel = rewardIndex; // Same as current when at max info.IsAtMaxLevel = true; info.HasProgress = false; } info.MaxLevelCount = progressList.Count; return info; } ~MiniBattlePassDataModel() { Dispose(); } void Dispose() { disposables?.Dispose(); disposables = null; } } public class MiniBattlePassRecord { /// /// 活动ID /// public int Id; public int RedirectID; public int PriceLv; public float InflationRate; /// /// 普通领奖进度 /// public List NRIndexs = new List(); /// /// 是否付费 /// public bool IsVIP; /// /// 付费领奖进度 /// public List VRIndexs = new List(); public int oldID; public int oldRedirectID; public int oldExp; public bool oldIsVIP; public List LastDropIDs = new List(); /// /// 展示过的等级,和新等级之间表现用 /// public int showIndex; /// /// 累计经验 /// public int Exp; }