diff --git a/AGENTS.MD b/AGENTS.MD index aa6f84d5..9c777309 100644 --- a/AGENTS.MD +++ b/AGENTS.MD @@ -8,6 +8,8 @@ AscNet is a research/private-server emulator for Punishing: Gray Raven. The runt **Maintainer-authorized shop exception:** Curated retail `GetShopInfoResponse` catalogs MAY be stored in `Resources/Configs/client_shops.json` when the corresponding server-owned Shop/ShopGoods source is unavailable. This exception applies only to static shop catalog fields. Player purchase counts, refresh timestamps, reset periods, availability, and all other dynamic state MUST still be derived at runtime from persisted state and authoritative clock/table data; production MUST NOT read captures or decoded dump files. +**Maintainer-authorized purchase catalog exception:** The existing static supply-pack catalog MAY be curated into the server-owned `Resources/Configs/client_purchases.json`. The maintainer authorized retaining its static package definitions, removing inherited retail sales deadlines, and using authoritative reward-item icons when original artwork is unavailable. Prices, enabled state, and optional sales schedules belong to this catalog; player counts, purchase timestamps, entitlement durations/remaining days and claim state MUST remain derived from persisted player state and authoritative rules. Do not restore captured response envelopes or player-state fields. See `Resources/Configs/purchase-rules-source.md`. + **Maintainer-authorized Simulated Battlefield exception:** Curated retail `PreFightResponse.FightData.NpcGroupList` compositions and per-clear `FightSettleResponse.Settle.MultiRewardGoodsList` goods for Simulated Battlefield MAY be stored in `Resources/Configs/simulated_battlefield.json` when no server-owned encounter or drop source exists. This exception applies only to ordered static wave fields `NpcId` and `BufferIds`, plus static per-clear settlement fields `RewardType`, `TemplateId`, and `Count`. NPC levels, attributes, magic data, challenge counts, progression effects, timestamps, reward multiplicity, and all other dynamic state MUST still be derived at runtime from player/request state and authoritative table data; production MUST NOT read captures or decoded dump files. For all game-protocol work: diff --git a/AscNet.Common/Database/Inventory.Currency.cs b/AscNet.Common/Database/Inventory.Currency.cs new file mode 100644 index 00000000..67bcc89c --- /dev/null +++ b/AscNet.Common/Database/Inventory.Currency.cs @@ -0,0 +1,35 @@ +using AscNet.Common.MsgPack; + +namespace AscNet.Common.Database; + +public partial class Inventory +{ + // The client displays item 2 + item 3 as one Black Card balance. + // Keep legacy constant names for compatibility with existing reward tables. + public static bool IsBlackCard(int id) => id is PaidGem or FreeGem; + + public IEnumerable SpendableStacks(int id) => Items + .Where(item => IsBlackCard(id) ? IsBlackCard(item.Id) : item.Id == id); + + public long SpendableCount(int id) => SpendableStacks(id).Sum(item => item.Count); + + public List Spend(int id, int amount) + { + if (amount < 0 || SpendableCount(id) < amount) + throw new InvalidOperationException("Insufficient currency"); + List changed = new(); + foreach (int source in IsBlackCard(id) ? new[] { PaidGem, FreeGem } : new[] { id }) + { + foreach (Item stack in Items.Where(item => item.Id == source)) + { + long debit = Math.Min(amount, stack.Count); + if (debit <= 0) continue; + stack.Count -= debit; + stack.RefreshTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + amount -= checked((int)debit); + changed.Add(stack); + } + } + return changed; + } +} diff --git a/AscNet.Common/Database/Player.Purchases.cs b/AscNet.Common/Database/Player.Purchases.cs index 7cfd705b..b6363f61 100644 --- a/AscNet.Common/Database/Player.Purchases.cs +++ b/AscNet.Common/Database/Player.Purchases.cs @@ -11,6 +11,35 @@ public partial class Player [BsonElement("pending_purchase")] public PlayerPendingPurchase? PendingPurchase { get; set; } + + [BsonElement("purchase_daily_passes")] + [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)] + public Dictionary PurchaseDailyPasses { get; set; } = new(); + + [BsonElement("pending_recharge")] + public PlayerPendingRecharge? PendingRecharge { get; set; } + + [BsonElement("recharge_sequence")] + public long RechargeSequence { get; set; } + + [BsonElement("purchase_period_buy_times")] + [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)] + public Dictionary PurchasePeriodBuyTimes { get; set; } = new(); +} + +public sealed class PlayerPurchaseDailyPass +{ + public long EndDay { get; set; } + public long StartDay { get; set; } + public List RewardIndexList { get; set; } = new(); + public long LastClaimDay { get; set; } = -1; +} + +public sealed class PlayerPendingRecharge +{ + public string Key { get; set; } = ""; + public string Order { get; set; } = ""; + public int Count { get; set; } } public sealed class PlayerPendingPurchase @@ -18,8 +47,11 @@ public sealed class PlayerPendingPurchase public uint Id { get; set; } public int Count { get; set; } public int PreviousBuyTimes { get; set; } + public int PeriodBuyTimes { get; set; } public long BuyTime { get; set; } public int ConsumeId { get; set; } public int ConsumeCount { get; set; } public List Goods { get; set; } = new(); + [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)] + public Dictionary DailyPasses { get; set; } = new(); } diff --git a/AscNet.Common/MsgPack/Types.cs b/AscNet.Common/MsgPack/Types.cs index c30fc941..d508a63f 100644 --- a/AscNet.Common/MsgPack/Types.cs +++ b/AscNet.Common/MsgPack/Types.cs @@ -2638,6 +2638,7 @@ public class GetPurchaseListResponsePurchaseInfoDailyRewardGoods public dynamic? FirstRewardGoods { get; set; } public dynamic? ExtraRewardGoods { get; set; } public Int32 DailyRewardRemainDay { get; set; } + public Int32 BuyLimitRemainDay { get; set; } public Boolean IsDailyRewardGet { get; set; } public String Name { get; set; } public String Desc { get; set; } diff --git a/AscNet.GameServer/Game/PurchaseCatalog.cs b/AscNet.GameServer/Game/PurchaseCatalog.cs new file mode 100644 index 00000000..9ee154b7 --- /dev/null +++ b/AscNet.GameServer/Game/PurchaseCatalog.cs @@ -0,0 +1,111 @@ +using AscNet.Common.Util; +using Newtonsoft.Json.Linq; + +namespace AscNet.GameServer.Game; + +/// Server-owned package definitions, independent of player purchase state. +public sealed class PurchaseCatalog +{ + private readonly Dictionary entries = new(); + private static readonly string[] PlayerFields = + [ + "BuyTimes", "LastBuyTime", "DailyRewardRemainDay", "BuyLimitRemainDay", + "IsDailyRewardGet", "DailyRewardSupplementGetData", "DiscountCouponInfos", "ConvertSwitch" + ]; + + public static PurchaseCatalog Load(string path) => Parse(File.ReadAllText(path)); + + public static PurchaseCatalog Parse(string json) + { + JObject root = JObject.Parse(json); + if (root.Value("SchemaVersion") != 1 || root["Purchases"] is not JArray purchases) + throw new InvalidDataException("Purchase catalog requires SchemaVersion 1 and Purchases; response snapshots are not supported."); + PurchaseCatalog catalog = new(); + foreach (JToken token in purchases) + { + if (token is not JObject entry) + throw new InvalidDataException("Purchase catalog entries must be objects."); + uint id = entry.Value("Id"); + if (id == 0 || id > int.MaxValue || !catalog.entries.TryAdd(id, entry)) + throw new InvalidDataException($"Invalid or duplicate purchase Id {id}."); + if (entry.Value("UiType") <= 0 || entry["ConsumeCount"] is null + || entry.Value("ConsumeCount") < 0 || entry["ConsumeId"] is null + || entry.Value("ConsumeId") < 0) + throw new InvalidDataException($"Purchase {id} requires a UI type and nonnegative price/currency."); + if (PlayerFields.Any(field => entry.Property(field) is not null) + || (entry["PurchaseSignInInfo"] as JObject)?.Property("PurchaseSignInData") is not null) + throw new InvalidDataException($"Purchase {id} contains player state instead of catalog data."); + foreach (string field in new[] { "TimeToShelve", "TimeToUnShelve", "TimeToInvalid" }) + if (entry[field] is null || entry.Value(field) < 0) + throw new InvalidDataException($"Purchase {id} requires nonnegative {field} (0 means unrestricted)."); + if (entry["NormalDiscounts"] is JObject discounts) + foreach (JProperty discount in discounts.Properties()) + if (!int.TryParse(discount.Name, out int purchaseNumber) || purchaseNumber <= 0 + || discount.Value.Value() is < 0 or > 10000) + throw new InvalidDataException($"Purchase {id} has an invalid discount tier."); + if (entry["DailyRewardDays"] is not null && entry.Value("DailyRewardDays") <= 0) + throw new InvalidDataException($"Purchase {id} has an invalid daily reward duration."); + } + return catalog; + } + + public List List(IEnumerable? uiTypes, long now) + { + HashSet? requested = uiTypes?.ToHashSet(); + return entries.Values + .Where(entry => entry.Value("Enabled") != false + && (requested is null || requested.Contains(entry.Value("UiType"))) + && !HasEnded(entry.Value("TimeToInvalid"), now) + && !HasEnded(entry.Value("TimeToUnShelve"), now)) + .Select(entry => (dynamic)ToPurchaseInfo(entry)).ToList(); + } + + public Dictionary? Find(uint id) => + entries.TryGetValue(id, out JObject? entry) && entry.Value("Enabled") != false + ? ToPurchaseInfo(entry) : null; + + public int DailyRewardDays(uint id) => entries.TryGetValue(id, out JObject? entry) + ? entry.Value("DailyRewardDays") ?? 0 : 0; + + private static bool HasEnded(long end, long now) => end > 0 && end <= now; + + private static Dictionary ToPurchaseInfo(JObject entry) + { + // A fresh recursive copy prevents a player's state from leaking into the catalog. + Dictionary info = JsonSnapshot.ReadDynamic(entry)!; + info.Remove("Enabled"); + info.Remove("DailyRewardDays"); + // No ownership-based price reduction is configured; client discount tiers apply separately. + info["ConvertSwitch"] = entry.Value("ConsumeCount"); + info["DiscountCouponInfos"] = null!; + return info; + } + + public static int AvailabilityCode(Dictionary info, long now) + { + long start = Convert.ToInt64((object)info["TimeToShelve"]); + long end = Convert.ToInt64((object)info["TimeToUnShelve"]); + long invalid = Convert.ToInt64((object)info["TimeToInvalid"]); + if (start > now) return 20053002; + if (HasEnded(invalid, now)) return 20053003; + return HasEnded(end, now) ? 20053004 : 0; + } + + public static int UnitPrice(Dictionary info, int bought) + { + int price = Convert.ToInt32((object)info["ConsumeCount"]); + int basisPoints = 10000; + int selectedTier = 0; + if (info.TryGetValue("NormalDiscounts", out dynamic? raw) && raw is Dictionary discounts) + foreach (var tier in discounts) + { + int number = Convert.ToInt32((object)tier.Key); + if (number <= (long)bought + 1 && number > selectedTier) + { + selectedTier = number; + basisPoints = Convert.ToInt32((object)tier.Value); + } + } + return checked((int)((long)price * basisPoints / 10000)); + } +} diff --git a/AscNet.GameServer/Handlers/AccountModule.cs b/AscNet.GameServer/Handlers/AccountModule.cs index 0b645ace..10bc9546 100644 --- a/AscNet.GameServer/Handlers/AccountModule.cs +++ b/AscNet.GameServer/Handlers/AccountModule.cs @@ -724,9 +724,11 @@ private static List BuildPurchaseClientInfoLoginData(Player player) { Id = (uint)package.Id, UiType = monthlyUiType, - BuyTimes = player.PurchaseBuyTimes.GetValueOrDefault((uint)package.Id), - DailyRewardRemainDay = 0, - IsDailyRewardGet = false + BuyTimes = Math.Max(player.PurchaseBuyTimes.GetValueOrDefault((uint)package.Id), + PayModule.RemainingDays(player, (uint)package.Id) > 0 ? 1 : 0), + DailyRewardRemainDay = PayModule.RemainingDays(player, (uint)package.Id), + BuyLimitRemainDay = PayModule.RemainingDays(player, (uint)package.Id), + IsDailyRewardGet = player.PurchaseDailyPasses.GetValueOrDefault((uint)package.Id)?.LastClaimDay == PayModule.PurchaseDay() }) .ToList(); } @@ -734,7 +736,8 @@ private static List BuildPurchaseClientInfoLoginData(Player player) private static NotifyLogin BuildNotifyLogin(Session session) { ItemModule.ResumePendingItemUse(session); - PayModule.ResumePendingPurchase(session); + ItemModule.ReconcileDailyAssetPurchaseCounts(session.inventory); + PayModule.ResumePendingPurchase(session, out _); BiancaTheatreModule.PrepareLogin(session); GuildModule.PrepareLogin(session); GuildBossModule.PrepareLogin(session); @@ -1340,6 +1343,7 @@ static void DoLogin(Session session, bool updateLoginAccounting) NewPlayerTaskActiveDay = session.player.PlayerData.NewPlayerTaskActiveDay }; NotifyPayInfo notifyPayInfo = BuildNotifyPayInfo(); + PayModule.GrantMailDailyRewards(session, sendPush: false); long mailNow = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); bool mailStateChanged = MailModule.EnsureSystemMails(session.player, mailNow) | MailModule.ReconcileExpiry(session.player, mailNow); @@ -1348,6 +1352,11 @@ static void DoLogin(Session session, bool updateLoginAccounting) session.player.SaveChecked(); NotifyFunctionalEntranceData notifyFunctionalEntranceData = BuildFunctionalEntranceData(); PurchaseDailyNotify purchaseDailyNotify = BuildPurchaseDailyNotify(); + PayModule.AddSignInNotifications(purchaseDailyNotify, session.player); + foreach (uint id in session.player.PurchaseDailyPasses.Keys) + if (PayModule.RemainingDays(session.player, id) > 0 + && session.player.PurchaseDailyPasses[id].LastClaimDay < PayModule.PurchaseDay()) + purchaseDailyNotify.DailyRewardInfoList.Add(new Dictionary { ["Id"] = id }); NotifyPurchaseRecommendConfig purchaseRecommendConfig = BuildPurchaseRecommendConfig(); // Seed the manual before NotifyLogin fires login-complete; the late full push refreshes Lotto/Purchase after cache initialization. session.SendPush(WheelchairManualModule.BuildPayload(session, DateTimeOffset.UtcNow)); diff --git a/AscNet.GameServer/Handlers/ItemModule.cs b/AscNet.GameServer/Handlers/ItemModule.cs index 8658d984..132b7ab9 100644 --- a/AscNet.GameServer/Handlers/ItemModule.cs +++ b/AscNet.GameServer/Handlers/ItemModule.cs @@ -637,21 +637,117 @@ private static bool TryBuildItemExchange( public static void ItemBuyAssetRequestHandler(Session session, Packet.Request packet) { ItemBuyAssetRequest request = packet.Deserialize(); - int count = Math.Max(0, request.Times); + lock (session.player) + { + // Resolve the requested conversion from the installed client's recipe table. + BuyAssetTable? asset = TableReaderV2.Parse().Find(row => row.Id == request.ItemId); + if (asset is null || request.Times <= 0 || asset.Config.Count == 0 + || asset.TimeId > 0 + || (asset.BuyLimit > 0 && request.Times > asset.BuyLimit)) + { + session.SendResponse(new ItemBuyAssetResponse { Code = 20012001 }, packet.Id); + return; + } + Item? owned = session.inventory.Items.FirstOrDefault(i => i.Id == request.ItemId); + int bought = owned is not null && PayModule.PurchaseDay(owned.LastBuyTime) == PayModule.PurchaseDay() ? owned.BuyTimes : 0; + if ((asset.DailyLimit > 0 && (long)bought + request.Times > asset.DailyLimit) + || (asset.TotalLimit > 0 && (long)(owned?.TotalBuyTimes ?? 0) + request.Times > asset.TotalLimit) + || (long)(owned?.TotalBuyTimes ?? 0) + request.Times > int.MaxValue) + { + session.SendResponse(new ItemBuyAssetResponse { Code = 20012001 }, packet.Id); + return; + } + var recipes = TableReaderV2.Parse().Where(row => asset.Config.Contains(row.Id)).OrderBy(row => row.Times).ToArray(); + if (recipes.Length != asset.Config.Count || recipes.Any(row => row.ConsumeId.Count == 0)) + { + session.SendResponse(new ItemBuyAssetResponse { Code = 20012001 }, packet.Id); + return; + } + int currency = request.ConsumeId == 0 ? recipes[0].ConsumeId[0] : request.ConsumeId; + long cost = 0, count = 0; + // Unlimited exchanges have a fixed price; capped daily resources use a price ladder. + int iterations = recipes.Length == 1 ? 1 : request.Times; + if (iterations > 1000) { session.SendResponse(new ItemBuyAssetResponse { Code = 20012001 }, packet.Id); return; } + for (int i = 0; i < iterations; i++) + { + var recipe = recipes.LastOrDefault(row => row.Times <= (long)bought + i + 1) ?? recipes[0]; + int index = recipe.ConsumeId.IndexOf(currency); + if (index < 0 || index >= recipe.ConsumeCount.Count || recipe.GainCount <= 0 + || !Inventory.IsValidClientItemId(request.ItemId)) + { + session.SendResponse(new ItemBuyAssetResponse { Code = 20012001 }, packet.Id); + return; + } + int multiplier = recipes.Length == 1 ? request.Times : 1; + cost += (long)recipe.ConsumeCount[index] * multiplier; + count += (long)recipe.GainCount * multiplier; + } + if (request.ItemId == Inventory.Coin) + { + var configs = TableReaderV2.Parse(); + long factor = long.Parse(configs.Single(c => c.Key == "BuyAssetCoinBase").Value) + + session.player.PlayerData.Level * long.Parse(configs.Single(c => c.Key == "BuyAssetCoinMul").Value); + count = checked(count * factor); + } + ItemTable? item = TableReaderV2.Parse().Find(row => row.Id == request.ItemId); + if (cost <= 0 || cost > int.MaxValue || count > int.MaxValue + || session.inventory.SpendableCount(currency) < cost + || session.inventory.Items.Where(i => i.Id == request.ItemId).Sum(i => i.Count) + count > Inventory.GetMaxCount(item)) + { + session.SendResponse(new ItemBuyAssetResponse { Code = 20012004 }, packet.Id); + return; + } + var before = session.inventory.Items.Select(i => new Item { Id = i.Id, Count = i.Count, + CreateTime = i.CreateTime, RefreshTime = i.RefreshTime, BuyTimes = i.BuyTimes, + TotalBuyTimes = i.TotalBuyTimes, LastBuyTime = i.LastBuyTime }).ToList(); + List changed; + try + { + changed = session.inventory.Spend(currency, (int)cost); + Item updated = session.inventory.Do(request.ItemId, (int)count); + updated.BuyTimes = checked(bought + request.Times); + updated.TotalBuyTimes = checked(updated.TotalBuyTimes + request.Times); + updated.LastBuyTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + changed.Add(updated); + session.inventory.SaveChecked(); + } + catch (Exception error) + { + session.inventory.Items = before; + session.log.Error("Asset conversion failed", error); + session.SendResponse(new ItemBuyAssetResponse { Code = 2 }, packet.Id); + return; + } + session.SendPush(new NotifyItemDataList { ItemDataList = changed }); + session.SendResponse(new ItemBuyAssetResponse { Count = (int)count }, packet.Id); + } + } - Item consumedItem = session.inventory.Do(request.ConsumeId, -count); - Item boughtItem = session.inventory.Do(request.ItemId, count); + internal static void ReconcileDailyAssetPurchaseCounts(Inventory inventory) + { + long today = PayModule.PurchaseDay(); + HashSet dailyAssets = TableReaderV2.Parse() + .Where(row => row.DailyLimit > 0) + .Select(row => row.Id) + .ToHashSet(); + List<(Item Item, int BuyTimes)> stale = inventory.Items + .Where(item => item.BuyTimes != 0 + && dailyAssets.Contains(item.Id) + && PayModule.PurchaseDay(item.LastBuyTime) != today) + .Select(item => (item, item.BuyTimes)) + .ToList(); + if (stale.Count == 0) + return; - session.SendPush(new NotifyItemDataList - { - ItemDataList = { consumedItem, boughtItem } - }); - session.inventory.Save(); - session.SendResponse(new ItemBuyAssetResponse + foreach ((Item item, _) in stale) + item.BuyTimes = 0; + try { inventory.SaveChecked(); } + catch { - Count = count, - IsCrit = false - }, packet.Id); + foreach ((Item item, int buyTimes) in stale) + item.BuyTimes = buyTimes; + throw; + } } } } diff --git a/AscNet.GameServer/Handlers/PayModule.Store.cs b/AscNet.GameServer/Handlers/PayModule.Store.cs new file mode 100644 index 00000000..f8b07847 --- /dev/null +++ b/AscNet.GameServer/Handlers/PayModule.Store.cs @@ -0,0 +1,326 @@ +using System.Collections; +using AscNet.Common.Database; +using AscNet.Common.MsgPack; +using AscNet.Common.Util; +using AscNet.Table.V2.share.config; +using AscNet.Table.V2.client.config; +using AscNet.Table.V2.share.item; +using AscNet.Table.V2.share.pay; +using AscNet.Table.V2.share.reward; +using MessagePack; + +namespace AscNet.GameServer.Handlers; + +[MessagePackObject(true)] +public sealed class PurchaseGetDailyRewardRequest +{ + public uint Id { get; set; } +} + +[MessagePackObject(true)] +public sealed class PurchaseGetDailyRewardResponse +{ + public int Code { get; set; } + public dynamic? PurchaseInfo { get; set; } + public List RewardList { get; set; } = new(); +} + +internal partial class PayModule +{ + private sealed class PurchaseLimitException(string message) : InvalidOperationException(message) { } + + // The client attaches analytics metadata when entering Store from a tab. + private static bool ValidPurchaseParam(object? value) + { + if (value is null) return true; + if (value is IDictionary map) + return map.Keys.Cast().All(key => key is string name && name == "FromMsg" + && map[key] is sbyte or byte or short or ushort or int or uint or long or ulong); + return value is ICollection collection && collection.Count == 0; + } + + private static int ResetOffset => int.Parse(TableReaderV2.Parse() + .Single(row => row.Key == "DailyResetTimestamp").Value); + + internal static long PurchaseDay(long? timestamp = null) => + ((timestamp ?? DateTimeOffset.UtcNow.ToUnixTimeSeconds()) - ResetOffset) / 86400; + + internal static int RemainingDays(Player? player, uint id) => checked((int)Math.Max(0, + (player?.PurchaseDailyPasses.GetValueOrDefault(id)?.EndDay ?? 0) - PurchaseDay())); + + private static int CurrentBuyTimes(Player player, Dictionary info) + { + uint id = ReadDynamicUInt(info, "Id"); + int bought = player.PurchaseBuyTimes.GetValueOrDefault(id); + long last = player.PurchaseLastBuyTimes.GetValueOrDefault(id); + if (bought == 0 || last == 0 || !info.TryGetValue("ClientResetInfo", out dynamic? raw) + || raw is not Dictionary reset) return bought; + DateTime date = DateTimeOffset.FromUnixTimeSeconds(last - ResetOffset).UtcDateTime; + DateTime today = DateTimeOffset.FromUnixTimeSeconds(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - ResetOffset).UtcDateTime; + bool elapsed = ReadDynamicInt(reset, "ResetType") switch + { + 0 => date.Date < today.Date, + 1 => date.Date.AddDays(-(((int)date.DayOfWeek + 6) % 7)) + < today.Date.AddDays(-(((int)today.DayOfWeek + 6) % 7)), + 2 => date.Year < today.Year || (date.Year == today.Year && date.Month < today.Month), + 3 => ReadDynamicInt(reset, "DayCount") > 0 + && PurchaseDay() - PurchaseDay(last) >= ReadDynamicInt(reset, "DayCount"), + _ => false + }; + // Lifetime counts remain monotonic for durable reward receipt identities. + return elapsed ? 0 : player.PurchasePeriodBuyTimes.GetValueOrDefault(id, bought); + } + + private static void AddBonusRewards(Dictionary info, bool first, int count, List goods) + { + string field = first && HasValue(info, "FirstRewardGoods") ? "FirstRewardGoods" : "ExtraRewardGoods"; + if (info.TryGetValue(field, out dynamic? value) && value is Dictionary bonus) + goods.AddRange(ReadPurchaseRewards(new() { ["RewardGoodsList"] = new List { bonus } }, + field == "FirstRewardGoods" ? 1 : count)); + if (field == "FirstRewardGoods" && count > 1) + AddBonusRewards(info, false, count - 1, goods); + } + + private static void PreparePassUpdates(Player player, Dictionary info, int count, + PlayerPendingPurchase pending, HashSet? visiting = null) + { + uint id = ReadDynamicUInt(info, "Id"); + visiting ??= new(); + if (!visiting.Add(id)) throw new InvalidOperationException("Cyclic companion package"); + if (info.TryGetValue("PurchaseSignInInfo", out dynamic? signRaw) && signRaw is Dictionary sign) + { + int[] rewards = ReadIds(sign, "PurchaseSignInRewardInfos").ToArray(); + if (count != 1 || rewards.Length == 0 || rewards.Any(reward => RewardHandler.GetRewardGoods(reward).Count == 0)) + throw new InvalidOperationException("Invalid sign-in package rewards"); + pending.DailyPasses[id] = new() { StartDay = PurchaseDay(), EndDay = PurchaseDay() + rewards.Length }; + } + if (HasValue(info, "DailyRewardGoodsList")) + { + int duration = GetDailyPackageDuration(info); + var old = player.PurchaseDailyPasses.GetValueOrDefault(id); + long end = checked(Math.Max(PurchaseDay(), old?.EndDay ?? 0) + checked(duration * count)); + // A companion is granted by the purchased bundle, not bought directly. + // Client Text.PurchaseMonthPlusDesc explicitly allows this grant even + // when the recipient already holds the maximum number of monthly passes. + if (visiting.Count == 1 && info.TryGetValue("ClientResetInfo", out dynamic? raw) && raw is Dictionary reset + && ReadDynamicInt(reset, "ResetType") == 5 && ReadDynamicInt(reset, "DayCount") > 0 + && RemainingDays(player, id) > ReadDynamicInt(reset, "DayCount")) + throw new PurchaseLimitException($"Monthly pass {id} renewal limit exceeded: {RemainingDays(player, id)} days remaining"); + pending.DailyPasses[id] = new() { EndDay = end, LastClaimDay = old?.LastClaimDay ?? -1 }; + } + int company = ReadDynamicInt(info, "CompanyPackage"); + if (company > 0) + { + if (!TryFindPurchaseInfo((uint)company, null, out var companion)) + throw new InvalidOperationException("Missing companion package"); + PreparePassUpdates(player, companion!, checked(count * ReadDynamicInt(info, "CompanyPackageCount")), pending, visiting); + } + visiting.Remove(id); + } + + private static int GetDailyPackageDuration(Dictionary info) + { + int catalogDays = Catalog.Value.DailyRewardDays(ReadDynamicUInt(info, "Id")); + if (catalogDays > 0) return catalogDays; + var configured = TableReaderV2.Parse() + .SingleOrDefault(row => row.Id == ReadDynamicUInt(info, "Id")); + // Explicit local-server durations take precedence; monthly passes use + // the same client configuration as XYKPurchasePackage. + int duration = configured is not null ? configured.Days + : ReadDynamicInt(info, "UiType") == 2 + ? TableReaderV2.Parse().Single(row => row.Key == "PurchaseYKLimtCount").Value + : 0; + if (duration <= 0) throw new InvalidOperationException("Missing or invalid duration source for daily package"); + return duration; + } + + [RequestPacketHandler("PurchaseGetDailyRewardRequest")] + public static void PurchaseGetDailyRewardRequestHandler(Session session, Packet.Request packet) + { + var request = packet.Deserialize(); + PurchaseGetDailyRewardResponse response = new() { Code = 20053031 }; + lock (session.player) + { + try + { + if (TryFindPurchaseInfo(request.Id, null, out var info) && RemainingDays(session.player, request.Id) > 0) + { + var result = ClaimDailyRewards(session, request.Id, info!, out int claimCode); + response.Code = claimCode; + if (claimCode == 0) + { + ApplyPurchaseState([info!], session.player); + response.PurchaseInfo = info; + response.RewardList = result?.RewardGoods ?? []; + result?.SendPushes(session); + } + } + } + catch (Exception error) { session.log.Error($"Daily purchase reward failed: {error}"); response.Code = 2; } + session.SendResponse(response, packet.Id); + } + } + + private static RewardApplicationResult? ClaimDailyRewards(Session session, uint id, + Dictionary info, out int code) + { + code = 0; + var pass = session.player.PurchaseDailyPasses[id]; + long day = PurchaseDay(); + if (pass.LastClaimDay >= day) return null; + bool signPackage = info.TryGetValue("PurchaseSignInInfo", out dynamic? raw) && raw is Dictionary; + int index = checked((int)(day - pass.StartDay)); + List goods = signPackage ? new() : ReadPurchaseRewards(new() { ["RewardGoodsList"] = info["DailyRewardGoodsList"] }, 1); + var rows = goods.Select(g => new RewardGoodsTable { Id = g.Id, TemplateId = g.TemplateId, Count = g.Count, + Params = g.Level > 0 ? [g.Level] : [] }).ToList(); + if (signPackage) + { + int[] rewards = ReadIds((Dictionary)raw!, "PurchaseSignInRewardInfos").ToArray(); + if (index < 0 || index >= rewards.Length) throw new InvalidOperationException("Sign-in day out of range"); + rows = RewardHandler.GetRewardGoods(rewards[index]); + } + string claimKey = $"purchase-daily:{session.player.PlayerData.Id}:{id}:{day}"; + if (!session.inventory.AppliedRewardClaims.Contains(claimKey, StringComparer.Ordinal) + && !HasItemCapacity(session, rows)) + { + code = 20027011; + return null; + } + var result = RewardHandler.ApplyRewardsOnceAndPersist( + [new RewardGrant(claimKey, rows)], session); + long before = pass.LastClaimDay; + pass.LastClaimDay = day; + bool added = signPackage && !pass.RewardIndexList.Contains(index + 1); + if (added) pass.RewardIndexList.Add(index + 1); + try { session.player.SaveChecked(); } + catch { pass.LastClaimDay = before; if (added) pass.RewardIndexList.Remove(index + 1); throw; } + return result; + } + + private static List ToRewardGoodsTable(IEnumerable goods) => + goods.Select(g => new RewardGoodsTable + { + Id = g.Id, TemplateId = g.TemplateId, Count = g.Count, + Params = g.Level > 0 ? [g.Level] : [] + }).ToList(); + + private static bool HasItemCapacity(Session session, IEnumerable goods) + { + foreach (IGrouping group in goods + .Where(goods => RewardHandler.GetRewardType(goods) == RewardType.Item) + .GroupBy(goods => goods.TemplateId)) + { + ItemTable? table = TableReaderV2.Parse().FirstOrDefault(item => item.Id == group.Key); + if (table is null || !Inventory.IsValidClientItemId(group.Key)) + return false; + long remaining = Inventory.GetMaxCount(table); + foreach (Item item in session.inventory.Items.Where(item => item.Id == group.Key)) + { + if (item.Count < 0 || item.Count > remaining) + return false; + remaining -= item.Count; + } + foreach (RewardGoodsTable reward in group) + { + if (reward.Count < 0 || reward.Count > remaining) + return false; + remaining -= reward.Count; + } + } + return true; + } + + internal static void GrantMailDailyRewards(Session session, bool sendPush = true) + { + lock (session.player) + { + bool changed = false; + foreach (uint id in session.player.PurchaseDailyPasses.Keys.ToArray()) + if (RemainingDays(session.player, id) > 0 && TryFindPurchaseInfo(id, null, out var info) + && ReadDynamicBool(info!, "IsUseMail")) + { + var pass = session.player.PurchaseDailyPasses[id]; + long day = PurchaseDay(); + if (pass.LastClaimDay >= day) continue; + long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); + var rewards = ReadPurchaseRewards(new() { ["RewardGoodsList"] = info!["DailyRewardGoodsList"] }, 1); + PlayerMail mail = new() + { + Id = $"purchase-daily:{session.player.PlayerData.Id}:{id}:{day}", + Title = Convert.ToString(info["Name"]) ?? "", + Content = Convert.ToString(info["Desc"]) ?? "", + CreateTime = now, SendTime = now, + RewardGoodsList = rewards.Select(g => new PlayerMailRewardGoods + { + Id = g.Id, RewardType = g.RewardType, TemplateId = checked((uint)g.TemplateId), + Count = g.Count, Level = g.Level, Quality = g.Quality, Grade = g.Grade + }).ToList() + }; + long oldClaim = pass.LastClaimDay; + session.player.Mails.Add(mail); + pass.LastClaimDay = day; + try { session.player.SaveChecked(); } + catch { session.player.Mails.Remove(mail); pass.LastClaimDay = oldClaim; throw; } + changed = true; + } + if (changed && sendPush) + session.SendPush(MailModule.BuildNotifyMails(session.player, DateTimeOffset.UtcNow.ToUnixTimeSeconds())); + } + } + + internal static void AddSignInNotifications(PurchaseDailyNotify notify, Player player) + { + foreach (uint id in player.PurchaseDailyPasses.Keys) + { + if (RemainingDays(player, id) <= 0 || !TryFindPurchaseInfo(id, null, out var info)) continue; + if (!info!.TryGetValue("PurchaseSignInInfo", out dynamic? raw) || raw is not Dictionary sign) continue; + ApplyPurchaseState([info], player); + var data = new Dictionary(info); + foreach (var entry in sign) data[entry.Key] = entry.Value; + data["SignRound"] = 1; + data["RewardIndexList"] = player.PurchaseDailyPasses[id].RewardIndexList; + notify.PurchaseSignInInfoList.Add(data); + } + } + + private static void CompleteLocalRecharge(Session session, Packet.Request packet) + { + var request = packet.Deserialize(); + PayInitiatedResponse response = new() { Code = 20053031 }; + lock (session.player) + { + try + { + PayTable? product = TableReaderV2.Parse().SingleOrDefault(row => row.Key == request.Key); + if (product is not null && product.ShowUIType == 1 && product.MoneyCard > 0 + && string.IsNullOrEmpty(request.TargetParam) + && (session.player.PendingRecharge is null || session.player.PendingRecharge.Key == request.Key)) + { + var pending = session.player.PendingRecharge; + if (pending is null) + { + pending = new() { Key = request.Key, Count = product.MoneyCard, + Order = $"local:{session.player.PlayerData.Id}:{session.player.RechargeSequence}" }; + session.player.PendingRecharge = pending; + try { session.player.SaveChecked(); } + catch { session.player.PendingRecharge = null; throw; } + } + var result = RewardHandler.ApplyRewardsOnceAndPersist([new RewardGrant(pending.Order, + [new RewardGoodsTable { TemplateId = Inventory.HongKa, Count = pending.Count }])], session); + long sequence = session.player.RechargeSequence; + session.player.RechargeSequence = checked(sequence + 1); + session.player.PendingRecharge = null; + try { session.player.SaveChecked(); } + catch { session.player.RechargeSequence = sequence; session.player.PendingRecharge = pending; throw; } + response.Code = 0; + response.GameOrder = pending.Order; + response.LocalCompleted = true; + response.RewardList = result.RewardGoods; + result.SendPushes(session); + } + } + catch (Exception error) { session.log.Error($"Local recharge failed: {error}"); response.Code = 2; } + session.SendResponse(response, packet.Id); + } + } +} diff --git a/AscNet.GameServer/Handlers/PayModule.cs b/AscNet.GameServer/Handlers/PayModule.cs index 3ec235f7..a589e29b 100644 --- a/AscNet.GameServer/Handlers/PayModule.cs +++ b/AscNet.GameServer/Handlers/PayModule.cs @@ -4,8 +4,8 @@ using AscNet.Table.V2.share.reward; using AscNet.Table.V2.share.wheelchairmanual; using AscNet.Common.Util; +using AscNet.GameServer.Game; using MessagePack; -using Newtonsoft.Json.Linq; namespace AscNet.GameServer.Handlers { @@ -43,61 +43,45 @@ public class PayInitiatedRequest public class PayInitiatedResponse { public int Code; + public string GameOrder { get; set; } = ""; + public bool LocalCompleted { get; set; } + public List RewardList { get; set; } = new(); } #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. #endregion - internal class PayModule + internal partial class PayModule { - private const string PurchaseSnapshotPath = "Configs/client_purchases.json"; - private static readonly Lazy RetailPurchaseSnapshot = new(() => JsonSnapshot.LoadObject(PurchaseSnapshotPath)); + private static readonly Lazy Catalog = new(() => + PurchaseCatalog.Load(JsonSnapshot.ResolvePath("Configs/client_purchases.json"))); [RequestPacketHandler("GetPurchaseListRequest")] public static void GetPurchaseListRequestHandler(Session session, Packet.Request packet) { GetPurchaseListRequest request = packet.Deserialize(); - session.SendResponse(BuildPurchaseListResponse(request.UiTypeList, session.player), packet.Id); + try + { + GrantMailDailyRewards(session); + session.SendResponse(BuildPurchaseListResponse(request.UiTypeList, session.player), packet.Id); + } + catch (Exception error) + { + session.log.Error($"Cannot load purchase catalog: {error}"); + session.SendResponse(new GetPurchaseListResponse { Code = 2 }, packet.Id); + } } private static GetPurchaseListResponse BuildPurchaseListResponse(IEnumerable? uiTypes, Player? player = null) { - JObject root = RetailPurchaseSnapshot.Value; - JObject? responses = root["Responses"] as JObject; - string key = BuildPurchaseSnapshotKey(uiTypes); - JObject? data = responses?[key] as JObject; - - if (data is null) + GetPurchaseListResponse response = new() { - string? defaultKey = root.Value("DefaultKey"); - data = defaultKey is null ? null : responses?[defaultKey] as JObject; - } - - GetPurchaseListResponse response = ReadPurchaseResponse(data); + PurchaseInfoList = Catalog.Value.List(uiTypes, DateTimeOffset.UtcNow.ToUnixTimeSeconds()) + }; ApplyPurchaseState(response.PurchaseInfoList, player); ApplyPurchaseState(response.PurchaseComboInfoList, player); return response; } - private static string BuildPurchaseSnapshotKey(IEnumerable? uiTypes) - { - return uiTypes is null - ? string.Empty - : string.Join(",", uiTypes.OrderBy(static uiType => uiType)); - } - - private static GetPurchaseListResponse ReadPurchaseResponse(JObject? data) - { - if (data is null) - return new GetPurchaseListResponse { Code = 0 }; - - return new GetPurchaseListResponse - { - Code = JsonSnapshot.ReadInt(data, "Code"), - PurchaseInfoList = JsonSnapshot.ReadDynamicList(data["PurchaseInfoList"]), - PurchaseComboInfoList = JsonSnapshot.ReadDynamicList(data["PurchaseComboInfoList"]) - }; - } - private static void ApplyPurchaseState(List purchaseInfoList, Player? player) { foreach (dynamic purchaseInfo in purchaseInfoList) @@ -105,12 +89,23 @@ private static void ApplyPurchaseState(List purchaseInfoList, Player? p if (purchaseInfo is not Dictionary data) continue; uint id = ReadDynamicUInt(data, "Id"); - data["BuyTimes"] = player?.PurchaseBuyTimes.GetValueOrDefault(id) ?? 0; + data["BuyTimes"] = player is null ? 0 : CurrentBuyTimes(player, data); data["LastBuyTime"] = player?.PurchaseLastBuyTimes.GetValueOrDefault(id) ?? 0L; - data["DailyRewardRemainDay"] = 0; - data["BuyLimitRemainDay"] = 0; - data["IsDailyRewardGet"] = false; - data["PurchaseSignInInfo"] = null!; + if (player?.PurchaseBuyTimes.GetValueOrDefault(id) > 0) + data["FirstRewardGoods"] = null!; + int days = RemainingDays(player, id); + if (days > 0 && player?.PurchaseBuyTimes.GetValueOrDefault(id) == 0) data["BuyTimes"] = 1; + data["DailyRewardRemainDay"] = days; + data["BuyLimitRemainDay"] = days; + data["IsDailyRewardGet"] = player?.PurchaseDailyPasses.GetValueOrDefault(id)?.LastClaimDay == PurchaseDay(); + if (data.TryGetValue("PurchaseSignInInfo", out dynamic? signRaw) && signRaw is Dictionary sign) + { + var pass = player?.PurchaseDailyPasses.GetValueOrDefault(id); + sign["PurchaseSignInData"] = new Dictionary + { + ["SignRound"] = 1, ["RewardIndexList"] = pass?.RewardIndexList ?? new List() + }; + } data["DailyRewardSupplementGetData"] = null!; } } @@ -137,20 +132,32 @@ public static void PurchaseRequestHandler(Session session, Packet.Request packet BuyTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), ConsumeId = ReadDynamicInt(info!, "ConsumeId"), ConsumeCount = cost, Goods = goods }; + PreparePassUpdates(session.player, info!, request.Count, pending); + pending.PeriodBuyTimes = checked(CurrentBuyTimes(session.player, info!) + request.Count); session.player.PendingPurchase = pending; try { session.player.SaveChecked(); } catch { session.player.PendingPurchase = null; throw; } } - RewardApplicationResult result = ResumePendingPurchase(session)!; - response.NewPurchaseInfoList = BuildPurchaseListResponse(request.UiTypeList, session.player).PurchaseInfoList; - ApplyPurchaseState([info!], session.player); - ReplacePurchaseInfo(response.NewPurchaseInfoList, info!); - response.PurchaseInfo = info; - response.RewardList = result.RewardGoods; - result.SendPushes(session); - if (TableReaderV2.Parse() - .Any(activity => activity.ShowPackageIds.Contains((int)request.Id))) - session.SendPush(WheelchairManualModule.BuildPayload(session, DateTimeOffset.UtcNow)); + RewardApplicationResult? result = ResumePendingPurchase(session, out int resumeCode); + if (resumeCode != 0) + { + response.Code = resumeCode; + } + else + { + // A later mail save must not turn an already committed purchase into a failed purchase. + try { GrantMailDailyRewards(session); } + catch (Exception error) { session.log.Error($"Daily purchase mail will retry on refresh: {error}"); } + response.NewPurchaseInfoList = BuildPurchaseListResponse(request.UiTypeList, session.player).PurchaseInfoList; + ApplyPurchaseState([info!], session.player); + ReplacePurchaseInfo(response.NewPurchaseInfoList, info!); + response.PurchaseInfo = info; + response.RewardList = result!.RewardGoods; + result.SendPushes(session); + if (TableReaderV2.Parse() + .Any(activity => activity.ShowPackageIds.Contains((int)request.Id))) + session.SendPush(WheelchairManualModule.BuildPayload(session, DateTimeOffset.UtcNow)); + } } } catch (Exception exception) @@ -158,20 +165,25 @@ public static void PurchaseRequestHandler(Session session, Packet.Request packet session.log.Error($"Purchase {request.Id} failed: {exception}"); response.Code = 2; // ServerInternalError (CodeText) } + if (response.Code != 0) session.log.Warn($"Purchase rejected: package={request.Id}, count={request.Count}, code={response.Code}"); session.SendResponse(response, packet.Id); } } - public static RewardApplicationResult? ResumePendingPurchase(Session session) + public static RewardApplicationResult? ResumePendingPurchase(Session session, out int code) { + code = 0; PlayerPendingPurchase? pending = session.player.PendingPurchase; if (pending is null) return null; string key = $"purchase:{session.player.PlayerData.Id}:{pending.Id}:{pending.PreviousBuyTimes}"; - List rows = pending.Goods.Select(goods => new RewardGoodsTable + List rows = ToRewardGoodsTable(pending.Goods); + if (!session.inventory.AppliedRewardClaims.Contains(key, StringComparer.Ordinal) + && !HasItemCapacity(session, rows)) { - Id = goods.Id, TemplateId = goods.TemplateId, Count = goods.Count, - Params = goods.Level > 0 ? [goods.Level] : [] - }).ToList(); + session.log.Warn($"Purchase resume deferred: package={pending.Id} exceeds item capacity"); + code = 20027011; + return null; + } RewardApplicationResult result = RewardHandler.ApplyRewardsOnceAndPersist( [new RewardGrant(key, rows, pending.ConsumeCount > 0 ? new Dictionary { [pending.ConsumeId] = pending.ConsumeCount } : null)], session); @@ -179,6 +191,13 @@ [new RewardGrant(key, rows, pending.ConsumeCount > 0 bool hadTime = session.player.PurchaseLastBuyTimes.TryGetValue(pending.Id, out long oldTime); session.player.PurchaseBuyTimes[pending.Id] = checked(pending.PreviousBuyTimes + pending.Count); session.player.PurchaseLastBuyTimes[pending.Id] = pending.BuyTime; + bool hadPeriod = session.player.PurchasePeriodBuyTimes.TryGetValue(pending.Id, out int oldPeriod); + session.player.PurchasePeriodBuyTimes[pending.Id] = pending.PeriodBuyTimes > 0 + ? pending.PeriodBuyTimes : session.player.PurchaseBuyTimes[pending.Id]; + Dictionary oldPasses = session.player.PurchaseDailyPasses; + session.player.PurchaseDailyPasses = new(oldPasses); + foreach (var pass in pending.DailyPasses) + session.player.PurchaseDailyPasses[pass.Key] = pass.Value; session.player.PendingPurchase = null; try { session.player.SaveChecked(); } catch @@ -188,6 +207,9 @@ [new RewardGrant(key, rows, pending.ConsumeCount > 0 if (hadTime) session.player.PurchaseLastBuyTimes[pending.Id] = oldTime; else session.player.PurchaseLastBuyTimes.Remove(pending.Id); session.player.PendingPurchase = pending; + session.player.PurchaseDailyPasses = oldPasses; + if (hadPeriod) session.player.PurchasePeriodBuyTimes[pending.Id] = oldPeriod; + else session.player.PurchasePeriodBuyTimes.Remove(pending.Id); throw; } return result; @@ -198,47 +220,68 @@ private static int ValidatePurchase(Session session, PurchaseRequest request, { goods = []; cost = 0; info = null; if (request.Count <= 0 || request.Id > int.MaxValue - || (request.Param is not null && (request.Param is not System.Collections.ICollection parameters || parameters.Count != 0))) + || !ValidPurchaseParam(request.Param)) return 20053031; if (request.DiscountId > 0) return 20053014; if (!TryFindPurchaseInfo(request.Id, request.UiTypeList, out info)) return 20053001; PlayerPendingPurchase? pending = session.player.PendingPurchase; if (pending is not null) return pending.Id == request.Id && pending.Count == request.Count ? 0 : 20053031; - int previous = session.player.PurchaseBuyTimes.GetValueOrDefault(request.Id); + int previous = CurrentBuyTimes(session.player, info!); int limit = ReadDynamicInt(info!, "BuyLimitTimes"); if (previous < 0 || (long)previous + request.Count > int.MaxValue || (limit > 0 && (long)previous + request.Count > limit)) return 20053005; if (request.Count > 1 && !ReadDynamicBool(info!, "CanMultiply")) return 20053031; - long now = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); - int start = ReadDynamicInt(info!, "TimeToShelve"); - int end = ReadDynamicInt(info!, "TimeToUnShelve"); - int invalid = ReadDynamicInt(info!, "TimeToInvalid"); - if (start > now) return 20053002; - if (invalid > 0 && invalid <= now) return 20053003; - if (end > 0 && end <= now) return 20053004; + int availability = PurchaseCatalog.AvailabilityCode(info!, DateTimeOffset.UtcNow.ToUnixTimeSeconds()); + if (availability != 0) return availability; if (!AreConditionsSatisfied(session, ReadIds(info!, "Conditions"))) return 20053030; int predecessor = ReadDynamicInt(info!, "PrePurchaseId"); if (predecessor > 0 && session.player.PurchaseBuyTimes.GetValueOrDefault((uint)predecessor) == 0) return 20053008; - if (ReadIds(info!, "MutexPurchaseIds").Any(id => session.player.PurchaseBuyTimes.GetValueOrDefault((uint)id) > 0)) + if (ReadIds(info!, "MutexPurchaseIds").Any(id => session.player.PurchaseDailyPasses.ContainsKey((uint)id) + ? RemainingDays(session.player, (uint)id) > 0 + : session.player.PurchaseBuyTimes.GetValueOrDefault((uint)id) > 0)) return 20053101; if (!info!.TryGetValue("ConsumeId", out dynamic? rawConsumeId) || rawConsumeId is null || !info.TryGetValue("ConsumeCount", out dynamic? rawConsumeCount) || rawConsumeCount is null || HasValue(info, "PayKey") || HasValue(info, "PayKeySuffix") - || HasValue(info, "SelectDataForClient") || HasValue(info, "DailyRewardGoodsList") - || HasValue(info, "ClientResetInfo") || HasValue(info, "FirstRewardGoods") - || HasValue(info, "ExtraRewardGoods") || HasValue(info, "NormalDiscounts") + || HasValue(info, "SelectDataForClient") || ReadDynamicInt(info, "SignInId") > 0) return 20053031; - int consumeId = ReadDynamicInt(info, "ConsumeId"), unitCost = ReadDynamicInt(info, "ConsumeCount"); + // The client caps a multi-buy at the next discount tier. Reject forged requests + // crossing that boundary instead of charging one tier for the entire batch. + if (info.TryGetValue("NormalDiscounts", out dynamic? discountRaw) + && discountRaw is Dictionary discounts + && discounts.Keys.Any(tier => Convert.ToInt64((object)tier) > (long)previous + 1 + && Convert.ToInt64((object)tier) <= (long)previous + request.Count)) return 20053031; + int consumeId = ReadDynamicInt(info, "ConsumeId"), unitCost = PurchaseCatalog.UnitPrice(info, previous); if (consumeId < 0 || unitCost < 0 || (unitCost > 0 && !Inventory.IsValidClientItemId(consumeId)) || (long)unitCost * request.Count > int.MaxValue) return 20053031; cost = checked(unitCost * request.Count); - if (cost > (session.inventory.Items.FirstOrDefault(item => item.Id == consumeId)?.Count ?? 0)) return 20012004; - try { goods = ReadPurchaseRewards(info, request.Count); } + if (cost > session.inventory.SpendableCount(consumeId)) return 20012004; + try + { + goods = ReadPurchaseRewards(info, request.Count); + AddBonusRewards(info, session.player.PurchaseBuyTimes.GetValueOrDefault(request.Id) == 0, request.Count, goods); + int company = ReadDynamicInt(info, "CompanyPackage"); + if (company > 0) + { + if (!TryFindPurchaseInfo((uint)company, null, out var companion)) return 20053001; + goods.AddRange(ReadPurchaseRewards(companion!, checked(request.Count * ReadDynamicInt(info, "CompanyPackageCount")))); + } + PlayerPendingPurchase preview = new(); + PreparePassUpdates(session.player, info, request.Count, preview); + } catch (OverflowException) { return 20053031; } - if (goods.Count == 0 || goods.Any(reward => reward.Count <= 0 || !Enum.IsDefined(typeof(RewardType), reward.RewardType))) + catch (PurchaseLimitException error) + { + session.log.Warn($"Purchase limit: package={request.Id}, {error.Message}"); + return 20053005; + } + catch (InvalidOperationException) { return 20053031; } + if ((goods.Count == 0 && !HasValue(info, "PurchaseSignInInfo") && !HasValue(info, "DailyRewardGoodsList")) + || goods.Any(reward => reward.Count <= 0 || !Enum.IsDefined(typeof(RewardType), reward.RewardType))) return 20053031; + if (!HasItemCapacity(session, ToRewardGoodsTable(goods))) return 20027011; return 0; } public static bool IsPurchaseUnlocked(Session session, int purchaseId) @@ -271,33 +314,9 @@ private static bool HasValue(Dictionary data, string key) => private static bool TryFindPurchaseInfo(uint purchaseId, IEnumerable? uiTypes, out Dictionary? purchaseInfo) { - purchaseInfo = FindPurchaseInfo(BuildPurchaseListResponse(uiTypes).PurchaseInfoList, purchaseId); - if (purchaseInfo is not null) - return true; - - JObject? responses = RetailPurchaseSnapshot.Value["Responses"] as JObject; - if (responses is null) - return false; - - foreach (JProperty property in responses.Properties()) - { - purchaseInfo = FindPurchaseInfo(ReadPurchaseResponse(property.Value as JObject).PurchaseInfoList, purchaseId); - if (purchaseInfo is not null) - return true; - } - - return false; - } - - private static Dictionary? FindPurchaseInfo(IEnumerable purchaseInfoList, uint purchaseId) - { - foreach (dynamic purchaseInfo in purchaseInfoList) - { - if (purchaseInfo is Dictionary data && ReadDynamicUInt(data, "Id") == purchaseId) - return data; - } - - return null; + // UiTypeList selects the list to refresh; companion/pass lookups can cross tabs. + purchaseInfo = Catalog.Value.Find(purchaseId); + return purchaseInfo is not null; } private static void ReplacePurchaseInfo(List purchaseInfoList, Dictionary updatedPurchaseInfo) @@ -369,7 +388,7 @@ private static bool ReadDynamicBool(Dictionary data, string na [RequestPacketHandler("PayInitiatedRequest")] public static void PayInitiatedRequestHandler(Session session, Packet.Request packet) { - session.SendResponse(new PayInitiatedResponse() { Code = 1 }, packet.Id); + CompleteLocalRecharge(session, packet); } } } diff --git a/AscNet.GameServer/Handlers/RewardHandler.cs b/AscNet.GameServer/Handlers/RewardHandler.cs index 8cdb23ed..9a4c6ed1 100644 --- a/AscNet.GameServer/Handlers/RewardHandler.cs +++ b/AscNet.GameServer/Handlers/RewardHandler.cs @@ -297,15 +297,20 @@ public static RewardApplicationResult ApplyRewardsOnceAndPersist( { foreach ((int itemId, int count) in grant.Costs) { - Item? item = stagedInventory.Items.FirstOrDefault(value => value.Id == itemId); if (!inventoryClaimed) { - if (item is null || item.Count < count) + if (stagedInventory.SpendableCount(itemId) < count) throw new InvalidOperationException($"Insufficient item {itemId} for reward claim {grant.ClaimKey}."); - item = stagedInventory.Do(itemId, -count); + foreach (Item changed in stagedInventory.Spend(itemId, count)) + if (grantResult.ItemData.ItemDataList.All(entry => entry.Id != changed.Id)) + grantResult.ItemData.ItemDataList.Add(changed); + } + else + { + foreach (Item item in stagedInventory.SpendableStacks(itemId)) + if (grantResult.ItemData.ItemDataList.All(entry => entry.Id != item.Id)) + grantResult.ItemData.ItemDataList.Add(item); } - if (item is not null) - grantResult.ItemData.ItemDataList.Add(item); } } List prepared = PrepareRewards(grant.Goods, session, grantResult); diff --git a/AscNet.GameServer/Handlers/ShopModule.cs b/AscNet.GameServer/Handlers/ShopModule.cs index 768de3d2..7630bf2c 100644 --- a/AscNet.GameServer/Handlers/ShopModule.cs +++ b/AscNet.GameServer/Handlers/ShopModule.cs @@ -636,10 +636,11 @@ private static bool TryPreparePurchase( return false; } - foreach (ClientShopConsume consume in goods.ConsumeList) + foreach (ClientShopConsume consume in goods.ConsumeList.GroupBy(c => Inventory.IsBlackCard(c.Id) ? Inventory.FreeGem : c.Id) + .Select(g => new ClientShopConsume { Id = g.Key, Count = checked((uint)g.Sum(c => (long)c.Count)) })) { long totalCost = (long)consume.Count * count; - long available = session.inventory.Items.FirstOrDefault(item => item.Id == consume.Id)?.Count ?? 0; + long available = session.inventory.SpendableCount(consume.Id); if (consume.Id <= 0 || totalCost <= 0 || totalCost > int.MaxValue @@ -686,12 +687,8 @@ private static RewardGoods ToRewardGoods(ClientShopRewardGoods reward, int count foreach (ClientShopConsume consume in goods.ConsumeList) { int totalCost = checked((int)((long)consume.Count * count)); - long before = session.inventory.Items.FirstOrDefault(item => item.Id == consume.Id)?.Count ?? 0; - Item updated = session.inventory.Do(consume.Id, -totalCost); - notifyItemDataList.ItemDataList.Add(updated); - int paid = checked((int)Math.Min(totalCost, Math.Max(0, before - updated.Count))); - if (paid > 0) - progress.Add((11202, consume.Id, paid)); + notifyItemDataList.ItemDataList.AddRange(session.inventory.Spend(consume.Id, totalCost)); + progress.Add((11202, consume.Id, totalCost)); } if (notifyItemDataList.ItemDataList.Count > 0) diff --git a/AscNet.Test/Program.PurchaseCatalog.cs b/AscNet.Test/Program.PurchaseCatalog.cs new file mode 100644 index 00000000..803b68c9 --- /dev/null +++ b/AscNet.Test/Program.PurchaseCatalog.cs @@ -0,0 +1,139 @@ +using AscNet.Common.Database; +using AscNet.Common.MsgPack; +using AscNet.GameServer.Game; +using AscNet.GameServer.Handlers; +using Newtonsoft.Json.Linq; + +namespace AscNet.Test; + +internal static partial class Program +{ + private static void ValidatePurchaseCatalog() + { + JObject Definition(int id, int ui, int price, long start = 0, long end = 0, long invalid = 0) => new() + { + ["Id"] = id, ["UiType"] = ui, ["ConsumeId"] = 5, ["ConsumeCount"] = price, + ["TimeToShelve"] = start, ["TimeToUnShelve"] = end, ["TimeToInvalid"] = invalid, + ["RewardGoodsList"] = new JArray(new JObject { ["TemplateId"] = 2, ["Count"] = 1, ["RewardType"] = 1 }) + }; + string Json(params JObject[] entries) => new JObject + { ["SchemaVersion"] = 1, ["Purchases"] = new JArray(entries) }.ToString(); + JObject offer = Definition(1, 5, 240); + offer["NormalDiscounts"] = new JObject { ["1"] = 7000, ["3"] = 5000 }; + JObject disabled = Definition(5, 8, 5); + disabled["Enabled"] = false; + PurchaseCatalog catalog = PurchaseCatalog.Parse(Json(offer, Definition(2, 8, 28, start: 100), + Definition(3, 8, 40, end: 200), Definition(4, 8, 68, invalid: 150), disabled)); + AssertEqual(4, catalog.List(null, 99).Count, "all enabled entries include future countdowns"); + AssertEqual(1, catalog.List([5, 5], 99).Count, "duplicate requested tabs do not duplicate packages"); + AssertEqual(0, catalog.List([999], 99).Count, "unknown tabs do not fall back to unrelated snapshots"); + AssertEqual(0, catalog.List([], 99).Count, "empty tab request returns empty list"); + AssertEqual(2, catalog.List([8], 150).Count, "invalid time removes package at the exact boundary"); + AssertEqual(1, catalog.List([8], 200).Count, "unshelve removes package at the exact boundary"); + AssertEqual(true, catalog.Find(5) is null, "disabled catalog offer cannot be purchased"); + AssertEqual(20053002, PurchaseCatalog.AvailabilityCode(catalog.Find(2)!, 99), "future purchase denied"); + AssertEqual(0, PurchaseCatalog.AvailabilityCode(catalog.Find(2)!, 100), "purchase opens at start"); + AssertEqual(20053003, PurchaseCatalog.AvailabilityCode(catalog.Find(4)!, 150), "configured expiration is enforced"); + AssertEqual(20053004, PurchaseCatalog.AvailabilityCode(catalog.Find(3)!, 200), "configured unshelve is enforced"); + AssertEqual(168, PurchaseCatalog.UnitPrice(catalog.Find(1)!, 0), "initial discount price"); + AssertEqual(120, PurchaseCatalog.UnitPrice(catalog.Find(1)!, 2), "purchase count selects later discount tier"); + offer["ConsumeCount"] = 100; + PurchaseCatalog repriced = PurchaseCatalog.Parse(Json(offer)); + AssertEqual(70, PurchaseCatalog.UnitPrice(repriced.Find(1)!, 0), "server catalog change adjusts debit"); + AssertEqual(100, Convert.ToInt32((object)repriced.Find(1)!["ConvertSwitch"]), "client base price follows edited catalog"); + Dictionary copy = catalog.Find(1)!; + copy["BuyTimes"] = 9; + ((Dictionary)((List)copy["RewardGoodsList"])[0])["Count"] = 99; + AssertEqual(false, catalog.Find(1)!.ContainsKey("BuyTimes"), "request state never enters catalog"); + AssertEqual(1, Convert.ToInt32((object)((Dictionary) + ((List)catalog.Find(1)!["RewardGoodsList"])[0])["Count"]), "nested reward data is isolated"); + void Reject(string json, string name) + { + try { PurchaseCatalog.Parse(json); } + catch (InvalidDataException) { return; } + throw new InvalidDataException($"Catalog must reject {name}"); + } + Reject(Json(Definition(1, 5, 1), Definition(1, 8, 2)), "duplicate package IDs"); + JObject playerState = Definition(1, 5, 1); + playerState["BuyTimes"] = 1; + Reject(Json(playerState), "player state in static configuration"); + Reject("{\"Responses\":{}}", "legacy response snapshots"); + ValidateCatalogPurchaseResponses(); + Console.WriteLine("Purchase catalog, schedule, pricing and player isolation checks passed."); + } + + private static void ValidateCatalogPurchaseResponses() + { + using MongoCollectionOverride storage = MongoCollectionOverride.InstallForDailySignInCompatibility( + out RecordingMongoCollectionProxy players, + out RecordingMongoCollectionProxy characters, + out RecordingMongoCollectionProxy inventories); + const long uid = 468680; + Player player = CreateDrawCompatibilityPlayer(uid); + player.PlayerData.Level = 80; + Inventory inventory = CreateDrawCompatibilityInventory(uid, [new Item { Id = Inventory.HongKa, Count = 2000 }]); + using LoopbackSessionHarness harness = new(CreateDrawCompatibilityCharacter(uid), player, inventory, "purchase-catalog"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + int sequence = 468680; + JArray List(params int[] uiTypes) + { + int packet = sequence++; + InvokeRegisteredRequestHandler(nameof(GetPurchaseListRequest), harness.Session, packet, + new GetPurchaseListRequest { UiTypeList = uiTypes.ToList() }); + var response = ReadResponsePayload(harness, packet, nameof(GetPurchaseListResponse), "catalog list"); + AssertEqual(0, response.Code, "catalog response succeeds"); + return JArray.Parse(MessagePack.MessagePackSerializer.ConvertToJson( + MessagePack.MessagePackSerializer.Serialize(response.PurchaseInfoList))); + } + PurchaseResponse Buy(uint id, int tab) + { + int packet = sequence++; + InvokeRegisteredRequestHandler(nameof(PurchaseRequest), harness.Session, packet, + new PurchaseRequest { Id = id, Count = 1, DiscountId = -1, UiTypeList = [tab] }); + return ReadResponsePayload(harness, packet, nameof(PurchaseResponse), "catalog purchase", maxPacketsToRead: 64); + } + JArray first = List(5, 8, 5); + AssertEqual(first.Count, first.Select(row => row.Value("Id")).Distinct().Count(), "wire list IDs are unique"); + AssertEqual(true, first.All(row => row.Value("UiType") is 5 or 8), "wire list respects requested tabs"); + foreach (uint id in new uint[] { 10007, 2059, 2074 }) + AssertEqual(0L, first.Single(row => row.Value("Id") == id).Value("TimeToInvalid"), + "local catalog has no inherited retail sales deadline"); + AssertEqual(0, Buy(10007, 5).Code, "previously expired seven-day package can be purchased"); + AssertEqual(0, Buy(2059, 5).Code, "second previously expired package can be purchased"); + AssertEqual(0, Buy(2074, 8).Code, "discounted coating item can be purchased"); + AssertEqual(1820L, inventory.Items.Single(item => item.Id == Inventory.HongKa).Count, + "debits equal displayed 24 + 128 + discounted 28"); + AssertEqual(20053005, Buy(2074, 8).Code, "purchase limit remains enforced"); + AssertEqual(7L, player.PurchaseDailyPasses[10007].EndDay - player.PurchaseDailyPasses[10007].StartDay, + "removing sales deadline does not remove sign-in entitlement duration"); + foreach (uint id in new uint[] { 2062, 2068 }) + { + AssertEqual(0, Buy(id, 5).Code, "daily-mail-only package can be purchased"); + AssertEqual(10L, player.PurchaseDailyPasses[id].EndDay + - (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 25200) / 86400, + "configured ten-day term survives unlimited sales window"); + } + AssertEqual(1722L, inventory.Items.Single(item => item.Id == Inventory.HongKa).Count, + "daily-mail-only packs charge their configured 68 and 30"); + JToken firstBonus = List(3).Single(row => row.Value("Id") == 101)["FirstRewardGoods"]!; + AssertEqual(true, firstBonus.Type == JTokenType.Object, "unconsumed first-purchase bonus is advertised"); + PurchaseResponse firstExchange = Buy(101, 3); + AssertEqual(0, firstExchange.Code, "first exchange purchase succeeds"); + AssertEqual(true, firstExchange.RewardList.Any(reward => reward.TemplateId == 3 && reward.Count == 50), + "first exchange purchase grants its first-purchase bonus"); + JToken? consumedBonus = List(3).Single(row => row.Value("Id") == 101)["FirstRewardGoods"]; + AssertEqual(true, consumedBonus is null || consumedBonus.Type == JTokenType.Null, + "consumed first-purchase bonus is no longer advertised"); + PurchaseResponse repeatExchange = Buy(101, 3); + AssertEqual(0, repeatExchange.Code, "repeat exchange purchase succeeds"); + AssertEqual(false, repeatExchange.RewardList.Any(reward => reward.TemplateId == 3), + "repeat exchange purchase does not grant the first-purchase bonus again"); + JArray purchased = List(5, 8); + AssertEqual(1, purchased.Single(row => row.Value("Id") == 2059).Value("BuyTimes"), "buy response state persists"); + harness.Session.player = CreateDrawCompatibilityPlayer(uid + 1); + JArray fresh = List(5, 8); + AssertEqual(0, fresh.Single(row => row.Value("Id") == 2059).Value("BuyTimes"), "second player has independent count"); + AssertEqual(0L, fresh.Single(row => row.Value("Id") == 2059).Value("LastBuyTime"), "second player has independent timestamp"); + harness.Session.player = player; + } +} diff --git a/AscNet.Test/Program.StorePurchases.cs b/AscNet.Test/Program.StorePurchases.cs new file mode 100644 index 00000000..c568205e --- /dev/null +++ b/AscNet.Test/Program.StorePurchases.cs @@ -0,0 +1,521 @@ +using AscNet.Common.Database; +using AscNet.Common.MsgPack; +using AscNet.Common.Util; +using AscNet.GameServer.Game; +using AscNet.GameServer.Handlers; +using AscNet.Table.V2.share.item; +using AscNet.Table.V2.share.reward; +using MongoDB.Bson; +using MongoDB.Bson.Serialization; + +namespace AscNet.Test; + +internal static partial class Program +{ + private static void ValidateStorePurchases() + { + ValidatePurchaseCatalog(); + using MongoCollectionOverride storage = MongoCollectionOverride.InstallForDailySignInCompatibility( + out RecordingMongoCollectionProxy players, + out RecordingMongoCollectionProxy characters, + out RecordingMongoCollectionProxy inventories); + const long uid = 468600; + Player player = CreateDrawCompatibilityPlayer(uid); + player.PlayerData.Level = 80; + Inventory inventory = CreateDrawCompatibilityInventory(uid, + [new Item { Id = Inventory.HongKa, Count = 2000 }, new Item { Id = Inventory.FreeGem, Count = 2000 }]); + using LoopbackSessionHarness harness = new(CreateDrawCompatibilityCharacter(uid), player, inventory, "store-purchase"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + int packetId = 468600; + PurchaseResponse Buy(uint id, object? param = null) + { + int sequence = packetId++; + InvokeRegisteredRequestHandler(nameof(PurchaseRequest), harness.Session, sequence, + new PurchaseRequest { Id = id, Count = 1, DiscountId = -1, UiTypeList = [15], + Param = param ?? new Dictionary { ["FromMsg"] = 2 } }); + return ReadResponsePayload(harness, sequence, nameof(PurchaseResponse), "store purchase", maxPacketsToRead: 64); + } + PayInitiatedResponse Recharge(string key) + { + int sequence = packetId++; + InvokeRegisteredRequestHandler(nameof(PayInitiatedRequest), harness.Session, sequence, + new PayInitiatedRequest { Key = key }); + return ReadResponsePayload(harness, sequence, nameof(PayInitiatedResponse), "recharge", maxPacketsToRead: 32); + } + PurchaseGetDailyRewardResponse Claim(uint id) + { + int sequence = packetId++; + InvokeRegisteredRequestHandler(nameof(PurchaseGetDailyRewardRequest), harness.Session, sequence, + new PurchaseGetDailyRewardRequest { Id = id }); + return ReadResponsePayload(harness, sequence, nameof(PurchaseGetDailyRewardResponse), "daily claim", maxPacketsToRead: 32); + } + int LoginMonthlyRemaining(uint id) + { + var data = (System.Collections.IEnumerable)typeof(PurchaseRequest).Assembly + .GetType("AscNet.GameServer.Handlers.AccountModule")! + .GetMethod("BuildPurchaseClientInfoLoginData", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)! + .Invoke(null, new object[] { player })!; + var typed = data.Cast().ToList(); + string json = MessagePack.MessagePackSerializer.ConvertToJson(MessagePack.MessagePackSerializer.Serialize(typed)); + var item = Newtonsoft.Json.Linq.JArray.Parse(json).Single(row => row.Value("Id") == id); + if (item["BuyLimitRemainDay"] is null) throw new InvalidDataException("Login monthly pass omits BuyLimitRemainDay"); + return item.Value("BuyLimitRemainDay"); + } + AssertEqual(0, LoginMonthlyRemaining(83028), "login includes zero monthly renewal days before purchase"); + long Balance(int id) => inventory.Items.FirstOrDefault(item => item.Id == id)?.Count ?? 0; + ItemBuyAssetResponse Exchange(int itemId, int times, int currency = 0) + { + int seq = packetId++; + InvokeRegisteredRequestHandler(nameof(ItemBuyAssetRequest), harness.Session, seq, + new ItemBuyAssetRequest { ItemId = itemId, Times = times, ConsumeId = currency }); + return ReadResponsePayload(harness, seq, nameof(ItemBuyAssetResponse), "asset conversion", maxPacketsToRead: 32); + } + inventory.Items.Add(new Item { Id = 2, Count = 100 }); + inventory.Items.Single(i => i.Id == 3).Count = 50; + AssertEqual(0, Exchange(50002, 120).Code, "omitted currency uses recipe and pooled black cards"); + AssertEqual(0L, Balance(2), "free balance spent first"); + AssertEqual(30L, Balance(3), "remainder deducted from paid balance"); + AssertEqual(120L, Balance(50002), "event tickets granted exactly"); + AssertEqual(0, Exchange(50000, 20, 3).Code, "basic tickets explicit currency"); + AssertEqual(10L, Balance(3), "basic tickets deduct black cards"); + AssertEqual(20012004, Exchange(50000, 11).Code, "insufficient cards reject conversion"); + AssertEqual(20012001, Exchange(50000, 1, 5).Code, "forged currency rejected"); + AssertEqual(20012001, Exchange(50000, -1).Code, "negative conversion rejected"); + AssertEqual(20012001, Exchange(50000, int.MaxValue).Code, "oversized conversion rejected"); + AssertEqual(20L, Balance(50000), "failed conversions grant nothing"); + inventories.ThrowOnReplaceOne = true; + AssertEqual(2, Exchange(50000, 1).Code, "failed save rejects exchange"); + inventories.ThrowOnReplaceOne = false; + AssertEqual(10L, Balance(3), "failed save restores black cards"); + AssertEqual(20L, Balance(50000), "failed save restores tickets"); + inventory.Items.Single(i => i.Id == 2).Count = 50; + inventory.Items.Single(i => i.Id == 3).Count = 0; + int dormBuy = packetId++; + InvokeRegisteredRequestHandler(nameof(BuyRequest), harness.Session, dormBuy, + new BuyRequest { ShopId = 1011001, GoodsId = 801550, Count = 1 }); + var dormResult = ReadResponsePayload(harness, dormBuy, nameof(BuyResponse), "dorm black card purchase", maxPacketsToRead: 64); + AssertEqual(0, dormResult.Code, "dorm furniture accepts pooled black cards"); + AssertEqual(20L, Balance(2), "dorm deducts configured 30 black cards"); + int rejectedDorm = packetId++; + InvokeRegisteredRequestHandler(nameof(BuyRequest), harness.Session, rejectedDorm, + new BuyRequest { ShopId = 1011001, GoodsId = 801550, Count = 1 }); + AssertEqual(1, ReadResponsePayload(harness, rejectedDorm, nameof(BuyResponse), "unaffordable furniture").Code, + "dorm rejects insufficient pooled currency"); + AssertEqual(20L, Balance(2), "failed dorm purchase does not debit"); + inventory.Items.Single(i => i.Id == 3).Count = 2000; + long cardsBeforeResources = Balance(2) + Balance(3); + AssertEqual(0, Exchange(1, 2).Code, "coin exchange preserves price ladder"); + AssertEqual(7L * (9915 + 80 * 85), Balance(1), "coin yield follows player level"); + AssertEqual(cardsBeforeResources - 30, Balance(2) + Balance(3), "coin ladder spends 10 plus 20"); + AssertEqual(0, Exchange(4, 2).Code, "serum exchange preserves price ladder"); + AssertEqual(125L, Balance(4), "serum ladder yields 60 plus 65"); + AssertEqual(20012001, Exchange(4, 9).Code, "serum daily purchase cap enforced"); + Dictionary dailyAssets = TableReaderV2.Parse() + .Where(row => row.Id is Inventory.Coin or Inventory.ActionPoint) + .ToDictionary(row => row.Id); + Item staleCogs = inventory.Items.Single(item => item.Id == Inventory.Coin); + Item staleSerum = inventory.Items.Single(item => item.Id == Inventory.ActionPoint); + staleCogs.BuyTimes = dailyAssets[Inventory.Coin].DailyLimit; + staleSerum.BuyTimes = dailyAssets[Inventory.ActionPoint].DailyLimit; + staleCogs.TotalBuyTimes = staleCogs.BuyTimes + 7; + staleSerum.TotalBuyTimes = staleSerum.BuyTimes + 11; + int cogsLifetimeBuys = staleCogs.TotalBuyTimes, serumLifetimeBuys = staleSerum.TotalBuyTimes; + long yesterday = DateTimeOffset.UtcNow.AddDays(-1).ToUnixTimeSeconds(); + staleCogs.LastBuyTime = yesterday; + staleSerum.LastBuyTime = yesterday; + NotifyLogin nextDayLogin = (NotifyLogin)typeof(PurchaseRequest).Assembly + .GetType("AscNet.GameServer.Handlers.AccountModule")! + .GetMethod("BuildNotifyLogin", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)! + .Invoke(null, [harness.Session])!; + AssertEqual(0, nextDayLogin.ItemList.Single(item => item.Id == Inventory.Coin).BuyTimes, + "next-day login resets exhausted Cogs purchases"); + AssertEqual(0, nextDayLogin.ItemList.Single(item => item.Id == Inventory.ActionPoint).BuyTimes, + "next-day login resets exhausted serum purchases"); + AssertEqual(cogsLifetimeBuys, staleCogs.TotalBuyTimes, "Cogs lifetime purchases survive daily reset"); + AssertEqual(serumLifetimeBuys, staleSerum.TotalBuyTimes, "serum lifetime purchases survive daily reset"); + Inventory persistedDailyReset = BsonSerializer.Deserialize(inventories.LastReplacement!.ToBson()); + AssertEqual(0, persistedDailyReset.Items.Single(item => item.Id == Inventory.Coin).BuyTimes, + "next-day Cogs reset is persisted before login projection"); + AssertEqual(0, persistedDailyReset.Items.Single(item => item.Id == Inventory.ActionPoint).BuyTimes, + "next-day serum reset is persisted before login projection"); + AssertEqual(0, Exchange(1, 1).Code, "next-day login enables another Cogs purchase"); + AssertEqual(0, Exchange(4, 1).Code, "next-day login enables another serum purchase"); + AssertEqual(20053031, Buy(90943, new Dictionary { ["Unknown"] = 1 }).Code, "unknown metadata rejected"); + AssertEqual(0, Buy(90943).Code, "Store FromMsg permits free daily pack"); + long serum = Balance(90031); + AssertEqual(20053005, Buy(90943).Code, "daily limit enforced"); + AssertEqual(serum, Balance(90031), "daily repeat never grants"); + player.PurchaseLastBuyTimes[90943] -= 86400; + AssertEqual(0, Buy(90943).Code, "next day restores daily purchase"); + AssertEqual(serum + 1, Balance(90031), "reset purchase has distinct durable receipt"); + AssertEqual(20053005, Buy(90943).Code, "reset period still limited to one"); + AssertEqual(0, Buy(90289).Code, "weekly supply accepts reset config"); + AssertEqual(20053005, Buy(90289).Code, "weekly supply limit"); + player.PurchaseLastBuyTimes[90289] -= 7 * 86400; + AssertEqual(0, Buy(90289).Code, "weekly supply resets"); + AssertEqual(0, Buy(19).Code, "monthly reset supply succeeds"); + player.PurchaseLastBuyTimes[19] -= 32 * 86400; + AssertEqual(0, Buy(19).Code, "monthly reset supply renews"); + AssertEqual(0, Buy(1968).Code, "beginner limited supply grants equipment"); + AssertEqual(20053005, Buy(1968).Code, "limited supply cannot be bought twice"); + long savedRc = Balance(Inventory.HongKa); + inventory.Items.Single(item => item.Id == Inventory.HongKa).Count = 0; + AssertEqual(20012004, Buy(25).Code, "insufficient RC rejects store debit"); + inventory.Items.Single(item => item.Id == Inventory.HongKa).Count = savedRc; + long beforeThreeDay = Balance(Inventory.HongKa); + AssertEqual(0, Buy(10004).Code, "beginner three-day sign-in purchase succeeds"); + AssertEqual(beforeThreeDay - 12, Balance(Inventory.HongKa), "three-day package price"); + AssertEqual(3, checked((int)(player.PurchaseDailyPasses[10004].EndDay - player.PurchaseDailyPasses[10004].StartDay)), "three-day duration"); + Dictionary signPackage = PurchaseCatalog + .Load(JsonSnapshot.ResolvePath("Configs/client_purchases.json")).Find(10004)!; + var signInfo = (Dictionary)signPackage["PurchaseSignInInfo"]; + int firstRewardId = Convert.ToInt32((object)((List)signInfo["PurchaseSignInRewardInfos"])[0]); + HashSet firstRewardGoodsIds = TableReaderV2.Parse() + .Single(reward => reward.Id == firstRewardId).SubIds.ToHashSet(); + HashSet itemIds = TableReaderV2.Parse().Select(item => item.Id).ToHashSet(); + RewardGoodsTable firstItemReward = TableReaderV2.Parse() + .Single(reward => firstRewardGoodsIds.Contains(reward.Id) && itemIds.Contains(reward.TemplateId)); + ItemTable firstItemTable = TableReaderV2.Parse() + .Single(item => item.Id == firstItemReward.TemplateId); + Item capacityItem = inventory.Items.FirstOrDefault(item => item.Id == firstItemReward.TemplateId) + ?? inventory.Do(firstItemReward.TemplateId, 0); + capacityItem.Count = Inventory.GetMaxCount(firstItemTable) - firstItemReward.Count + 1; + long capacityBefore = capacityItem.Count; + long claimDayBefore = player.PurchaseDailyPasses[10004].LastClaimDay; + int claimReceiptsBefore = inventory.AppliedRewardClaims.Count; + AssertEqual(20027011, Claim(10004).Code, "daily claim rejects a reward that would exceed item capacity"); + AssertEqual(capacityBefore, capacityItem.Count, "capacity rejection grants no truncated reward"); + AssertEqual(claimDayBefore, player.PurchaseDailyPasses[10004].LastClaimDay, + "capacity rejection does not consume the daily entitlement"); + AssertEqual(0, player.PurchaseDailyPasses[10004].RewardIndexList.Count, + "capacity rejection does not advance sign-in progress"); + AssertEqual(claimReceiptsBefore, inventory.AppliedRewardClaims.Count, + "capacity rejection does not write a reward receipt"); + capacityItem.Count--; + AssertEqual(0, Claim(10004).Code, "first sign-in reward"); + AssertEqual(Inventory.GetMaxCount(firstItemTable), Balance(firstItemReward.TemplateId), + "daily claim grants the complete reward after capacity is available"); + AssertEqual(0, Claim(10004).RewardList.Count, "same-day sign-in is idempotent"); + AssertEqual(true, player.PurchaseDailyPasses[10004].RewardIndexList.SequenceEqual(new[] { 1 }), "sign-in index saved"); + var signNotify = new PurchaseDailyNotify(); + typeof(PurchaseRequest).Assembly.GetType("AscNet.GameServer.Handlers.PayModule")! + .GetMethod("AddSignInNotifications", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)! + .Invoke(null, new object[] { signNotify, player }); + AssertEqual(1, signNotify.PurchaseSignInInfoList.Count, "active sign-in included at login"); + inventory.Items.Single(item => item.Id == firstItemReward.TemplateId).Count = 0; + AssertEqual(0, Buy(1969).Code, "monthly companion bundle succeeds"); + AssertEqual(true, player.PurchaseDailyPasses.ContainsKey(83028), "companion bundle activates monthly pass"); + AssertEqual(30, LoginMonthlyRemaining(83028), "login includes purchased monthly renewal days"); + long end = player.PurchaseDailyPasses[83028].EndDay; + AssertEqual(30L, end - (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 25200) / 86400, "monthly duration follows client config"); + AssertEqual(0, Buy(83028).Code, "monthly renewal succeeds"); + AssertEqual(end + 30, player.PurchaseDailyPasses[83028].EndDay, "renewal extends existing term"); + AssertEqual(60, LoginMonthlyRemaining(83028), "login renewal days track extended term"); + long blackCards = Balance(Inventory.FreeGem); + AssertEqual(0, Claim(83028).Code, "monthly daily claim succeeds"); + AssertEqual(blackCards + 100, Balance(Inventory.FreeGem), "daily Black Cards delivered"); + AssertEqual(0, Claim(83028).RewardList.Count, "second daily claim is idempotent"); + long passDay = player.PurchaseDailyPasses[83028].LastClaimDay; + player.PurchaseDailyPasses[83028].LastClaimDay--; + AssertEqual(0, Claim(83028).Code, "stale daily claim state recovers using receipt"); + AssertEqual(blackCards + 100, Balance(Inventory.FreeGem), "stale claim timestamp cannot duplicate daily grant"); + player.PurchaseDailyPasses[83028].EndDay = passDay; + AssertEqual(20053031, Claim(83028).Code, "expired pass cannot claim"); + player.PurchaseDailyPasses[83028].EndDay = end + 30; + AssertEqual(20053101, Buy(90032).Code, "active alternative monthly pass excluded"); + AssertEqual(0, Buy(90291).Code, "serum monthly pass purchase succeeds"); + int mails = player.Mails.Count; + AssertEqual(true, mails > 0, "mail-based daily benefit delivered to inbox"); + AssertEqual(true, player.Mails.Any(mail => mail.RewardGoodsList?.Any(g => g.TemplateId == 90031 && g.Count == 2) == true), "monthly mail has configured serum"); + int listPacket = packetId++; + InvokeRegisteredRequestHandler(nameof(GetPurchaseListRequest), harness.Session, listPacket, + new GetPurchaseListRequest { UiTypeList = [2] }); + ReadResponsePayload(harness, listPacket, nameof(GetPurchaseListResponse), "mail refresh"); + AssertEqual(mails, player.Mails.Count, "daily mail is not duplicated"); + long rc = Balance(Inventory.HongKa); + AssertEqual(20053031, Recharge("PayWin999999").Code, "unknown recharge cannot grant guessed amount"); + foreach (var (key, amount) in new[] { ("PayWin5", 5), ("PayWin28", 28), ("PayWin34", 34), + ("PayWin59", 59), ("PayWin71", 71), ("PayWin119", 119), ("PayWin299", 299), ("PayWin600", 600) }) + { + PayInitiatedResponse response = Recharge(key); + AssertEqual(0, response.Code, "known recharge succeeds"); + AssertEqual(true, response.LocalCompleted, "client bypasses external SDK only on local completion"); + AssertEqual(amount, response.RewardList.Single().Count, "exact tier returned"); + rc += amount; + AssertEqual(rc, Balance(Inventory.HongKa), "correct RC inventory entry updated"); + } + inventories.ThrowOnReplaceOne = true; + AssertEqual(2, Recharge("PayWin28").Code, "failed recharge inventory save is retryable"); + inventories.ThrowOnReplaceOne = false; + AssertEqual(rc, Balance(Inventory.HongKa), "failed save cannot grant in memory"); + characters.ThrowOnReplaceOne = true; + AssertEqual(2, Recharge("PayWin28").Code, "late persistence failure retains receipt"); + characters.ThrowOnReplaceOne = false; + AssertEqual(rc + 28, Balance(Inventory.HongKa), "durable inventory credited once"); + harness.Session.player = BsonSerializer.Deserialize(players.LastReplacement!.ToBson()); + AssertEqual(20053031, Recharge("PayWin600").Code, "pending tier prevents overlapping recharge"); + AssertEqual(0, Recharge("PayWin28").Code, "reloaded pending recharge resumes"); + AssertEqual(rc + 28, Balance(Inventory.HongKa), "recovery never double credits"); + AssertEqual(end + 30, harness.Session.player.PurchaseDailyPasses[83028].EndDay, "monthly term survives reload"); + AssertEqual(0, Claim(83028).RewardList.Count, "daily claim survives reload"); + ValidateFullMonthlyCombo(); + ValidateTenDayPackage(); + ValidateBlackCardPoolPackagePurchases(); + Console.WriteLine("Store purchase/recharge compatibility checks passed."); + } + + private static void ValidateFullMonthlyCombo() + { + const long uid = 468601; + Player player = CreateDrawCompatibilityPlayer(uid); + Inventory inventory = CreateDrawCompatibilityInventory(uid, + [new Item { Id = Inventory.HongKa, Count = 100 }]); + using LoopbackSessionHarness harness = new(CreateDrawCompatibilityCharacter(uid), player, inventory, "full-monthly-combo"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + long day = (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 25200) / 86400; + player.PurchaseDailyPasses[83028] = new() { EndDay = day + 179, LastClaimDay = day }; + int sequence = 1; + PurchaseResponse Buy(uint id) + { + int packet = sequence++; + InvokeRegisteredRequestHandler(nameof(PurchaseRequest), harness.Session, packet, + new PurchaseRequest { Id = id, Count = 1, DiscountId = -1, UiTypeList = [15] }); + return ReadResponsePayload(harness, packet, nameof(PurchaseResponse), "full monthly", maxPacketsToRead: 64); + } + AssertEqual(20053005, Buy(83028).Code, "full direct renewal still rejects"); + AssertEqual(100L, inventory.Items.Single(i => i.Id == Inventory.HongKa).Count, "rejection does not debit"); + AssertEqual(0, Buy(1969).Code, "beginner combo bypasses companion renewal cap"); + AssertEqual(day + 209, player.PurchaseDailyPasses[83028].EndDay, "combo extends full pass by thirty days"); + AssertEqual(day, player.PurchaseDailyPasses[83028].LastClaimDay, "combo preserves today's claim"); + AssertEqual(52L, inventory.Items.Single(i => i.Id == Inventory.HongKa).Count, "combo charges only its own price"); + AssertEqual(20053005, Buy(1969).Code, "combo still limited to one purchase"); + AssertEqual(20053005, Buy(83028).Code, "direct renewal still rejects above cap"); + AssertEqual(day + 209, player.PurchaseDailyPasses[83028].EndDay, "rejected purchases preserve term"); + } + + private static void ValidateTenDayPackage() + { + const long uid = 468602; + Player player = CreateDrawCompatibilityPlayer(uid); + Inventory inventory = CreateDrawCompatibilityInventory(uid, + [new Item { Id = Inventory.HongKa, Count = 100 }]); + using LoopbackSessionHarness harness = new(CreateDrawCompatibilityCharacter(uid), player, inventory, "ten-day-package"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + int sequence = 1; + PurchaseResponse Buy() + { + int packet = sequence++; + InvokeRegisteredRequestHandler(nameof(PurchaseRequest), harness.Session, packet, + new PurchaseRequest { Id = 9, Count = 1, DiscountId = -1, UiTypeList = [5] }); + return ReadResponsePayload(harness, packet, nameof(PurchaseResponse), "ten day", maxPacketsToRead: 64); + } + void Refresh() + { + int packet = sequence++; + InvokeRegisteredRequestHandler(nameof(GetPurchaseListRequest), harness.Session, packet, + new GetPurchaseListRequest { UiTypeList = [5] }); + ReadResponsePayload(harness, packet, nameof(GetPurchaseListResponse), "ten day refresh", maxPacketsToRead: 64); + } + AssertEqual(0, Buy().Code, "ten-day package is purchasable"); + long day = (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - 25200) / 86400; + AssertEqual(day + 10, player.PurchaseDailyPasses[9].EndDay, "ten-day configured duration"); + AssertEqual(95L, inventory.Items.Single(i => i.Id == Inventory.HongKa).Count, "ten-day purchase price"); + AssertEqual(10L, inventory.Items.Single(i => i.Id == 12).Count, "instant reward delivered"); + AssertEqual(1, player.Mails.Count, "first day's reward arrives by mail"); + AssertEqual(250, player.Mails.Single().RewardGoodsList!.Single().Count, "daily mail reward quantity"); + AssertEqual(50000u, player.Mails.Single().RewardGoodsList!.Single().TemplateId, "daily mail reward item"); + Refresh(); + AssertEqual(1, player.Mails.Count, "same-day refresh does not duplicate mail"); + AssertEqual(20053005, Buy().Code, "ten-day package lifetime limit enforced"); + // Model the tenth day, keeping earlier mail on its original date. + player.Mails.Clear(); + player.PurchaseDailyPasses[9].EndDay = day + 1; + player.PurchaseDailyPasses[9].LastClaimDay = day - 1; + Refresh(); + AssertEqual(1, player.Mails.Count, "final entitled day delivers mail"); + harness.Session.player = BsonSerializer.Deserialize(player.ToBson()); + Refresh(); + AssertEqual(1, harness.Session.player.Mails.Count, "mail claim survives player reload"); + harness.Session.player.PurchaseDailyPasses[9].EndDay = day; + harness.Session.player.PurchaseDailyPasses[9].LastClaimDay = day - 1; + Refresh(); + AssertEqual(1, harness.Session.player.Mails.Count, "expired ten-day pass sends no further mail"); + } + + private static void ValidateBlackCardPoolPackagePurchases() + { + using MongoCollectionOverride storage = MongoCollectionOverride.InstallForDailySignInCompatibility( + out RecordingMongoCollectionProxy players, + out RecordingMongoCollectionProxy characters, + out RecordingMongoCollectionProxy inventories); + const uint SkillPack = 21; + long uid = 468700; + int packetId = 468700; + long skillPointMax = Inventory.GetMaxCount( + TableReaderV2.Parse().Single(item => item.Id == Inventory.SkillPoint)); + long Balance(Inventory inventory, int id) => + inventory.Items.FirstOrDefault(item => item.Id == id)?.Count ?? 0; + PurchaseResponse Buy(LoopbackSessionHarness harness) + { + int sequence = packetId++; + InvokeRegisteredRequestHandler(nameof(PurchaseRequest), harness.Session, sequence, + new PurchaseRequest + { + Id = SkillPack, Count = 1, DiscountId = -1, UiTypeList = [6], + Param = new Dictionary { ["FromMsg"] = 2 } + }); + return ReadResponsePayload(harness, sequence, nameof(PurchaseResponse), + "black card pool purchase", maxPacketsToRead: 64); + } + foreach ((long paid, long free) in new[] { (10L, 0L), (5L, 5L), (0L, 10L) }) + { + uid++; + Player player = CreateDrawCompatibilityPlayer(uid); + Inventory inventory = CreateDrawCompatibilityInventory(uid, + [ + new Item { Id = Inventory.PaidGem, Count = paid }, + new Item { Id = Inventory.FreeGem, Count = free } + ]); + using LoopbackSessionHarness harness = new( + CreateDrawCompatibilityCharacter(uid), player, inventory, $"pool-{paid}-{free}"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + AssertEqual(0, Buy(harness).Code, $"package 21 pooled balance {paid}/{free}"); + AssertEqual(0L, Balance(inventory, Inventory.PaidGem), $"package 21 {paid}/{free} paid stack emptied"); + AssertEqual(0L, Balance(inventory, Inventory.FreeGem), $"package 21 {paid}/{free} free stack emptied"); + AssertEqual(5L, Balance(inventory, Inventory.SkillPoint), $"package 21 {paid}/{free} skill points granted"); + AssertEqual(5000L, Balance(inventory, Inventory.Coin), $"package 21 {paid}/{free} cogs granted"); + AssertEqual(1, player.PurchaseBuyTimes[SkillPack], $"package 21 {paid}/{free} counter recorded"); + AssertEqual(null, player.PendingPurchase, $"package 21 {paid}/{free} pending cleared"); + if (paid != 5 || free != 5) + continue; + // A durable receipt with retained pending intent resumes as a state refresh, never a second debit. + player.PendingPurchase = new PlayerPendingPurchase + { + Id = SkillPack, Count = 1, PreviousBuyTimes = 0, + BuyTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), + ConsumeId = Inventory.FreeGem, ConsumeCount = 10, + Goods = + [ + new RewardGoods { Id = 900190, RewardType = (int)RewardType.Item, TemplateId = Inventory.SkillPoint, Count = 5 }, + new RewardGoods { Id = 900191, RewardType = (int)RewardType.Item, TemplateId = Inventory.Coin, Count = 5000 } + ] + }; + inventory.Items.Single(item => item.Id == Inventory.SkillPoint).Count = skillPointMax - 2; + int retryPacket = packetId++; + InvokeRegisteredRequestHandler(nameof(PurchaseRequest), harness.Session, retryPacket, + new PurchaseRequest + { + Id = SkillPack, Count = 1, DiscountId = -1, UiTypeList = [6], + Param = new Dictionary { ["FromMsg"] = 2 } + }); + NotifyItemDataList retryPush = ReadItemPush( + harness.ReadPacket("pool claimed retry item push"), "pool claimed retry"); + PurchaseResponse retry = ReadResponsePayload( + harness.ReadPacket("pool claimed retry response"), nameof(PurchaseResponse)); + AssertEqual(0, retry.Code, "claimed pool retry succeeds despite full capacity"); + AssertEqual(4, retryPush.ItemDataList.Count, "claimed retry pushes cost and reward stacks once"); + AssertEqual(1, retryPush.ItemDataList.Count(entry => entry.Id == Inventory.PaidGem), + "claimed retry refreshes the paid Black Card stack once"); + AssertEqual(1, retryPush.ItemDataList.Count(entry => entry.Id == Inventory.FreeGem), + "claimed retry refreshes the free Black Card stack once"); + AssertEqual(0L, retryPush.ItemDataList.Single(entry => entry.Id == Inventory.PaidGem).Count, + "claimed retry paid stack stays empty"); + AssertEqual(0L, retryPush.ItemDataList.Single(entry => entry.Id == Inventory.FreeGem).Count, + "claimed retry free stack stays empty"); + AssertEqual(2, retry.RewardList.Count, "claimed retry echoes the reward list"); + AssertEqual(skillPointMax - 2, Balance(inventory, Inventory.SkillPoint), + "claimed retry cannot double grant skill points"); + AssertEqual(5000L, Balance(inventory, Inventory.Coin), "claimed retry cogs unchanged"); + AssertEqual(1, player.PurchaseBuyTimes[SkillPack], "claimed retry keeps the counter"); + AssertEqual(null, player.PendingPurchase, "claimed retry clears pending"); + } + { + uid++; + Player player = CreateDrawCompatibilityPlayer(uid); + Inventory inventory = CreateDrawCompatibilityInventory(uid, + [ + new Item { Id = Inventory.PaidGem, Count = 4 }, + new Item { Id = Inventory.FreeGem, Count = 5 } + ]); + using LoopbackSessionHarness harness = new( + CreateDrawCompatibilityCharacter(uid), player, inventory, "pool-4-5"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + AssertEqual(20012004, Buy(harness).Code, "package 21 pooled 4/5 rejects as insufficient"); + AssertEqual(4L, Balance(inventory, Inventory.PaidGem), "insufficient paid stack unchanged"); + AssertEqual(5L, Balance(inventory, Inventory.FreeGem), "insufficient free stack unchanged"); + AssertEqual(0L, Balance(inventory, Inventory.SkillPoint), "insufficient grants no skill points"); + AssertEqual(0L, Balance(inventory, Inventory.Coin), "insufficient grants no cogs"); + AssertEqual(false, player.PurchaseBuyTimes.ContainsKey(SkillPack), "insufficient writes no counter"); + AssertEqual(null, player.PendingPurchase, "insufficient persists no pending intent"); + AssertEqual(0, inventory.AppliedRewardClaims.Count, "insufficient writes no receipts"); + } + { + uid++; + Player player = CreateDrawCompatibilityPlayer(uid); + Item skillPoints = new() { Id = Inventory.SkillPoint, Count = skillPointMax - 4 }; + Inventory inventory = CreateDrawCompatibilityInventory(uid, + [ + new Item { Id = Inventory.PaidGem, Count = 10 }, + new Item { Id = Inventory.FreeGem, Count = 0 }, + skillPoints + ]); + using LoopbackSessionHarness harness = new( + CreateDrawCompatibilityCharacter(uid), player, inventory, "pool-capacity"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + int receiptsBefore = inventory.AppliedRewardClaims.Count; + AssertEqual(20027011, Buy(harness).Code, "package 21 room 4 rejects immediate reward overflow"); + AssertEqual(10L, Balance(inventory, Inventory.PaidGem), "capacity rejection keeps paid stack"); + AssertEqual(0L, Balance(inventory, Inventory.FreeGem), "capacity rejection keeps free stack"); + AssertEqual(skillPointMax - 4, Balance(inventory, Inventory.SkillPoint), + "capacity rejection grants no truncated skill points"); + AssertEqual(0L, Balance(inventory, Inventory.Coin), "capacity rejection grants no cogs"); + AssertEqual(false, player.PurchaseBuyTimes.ContainsKey(SkillPack), "capacity rejection writes no counter"); + AssertEqual(null, player.PendingPurchase, "capacity rejection persists no pending intent"); + AssertEqual(receiptsBefore, inventory.AppliedRewardClaims.Count, "capacity rejection writes no receipts"); + skillPoints.Count = skillPointMax - 5; + AssertEqual(0, Buy(harness).Code, "package 21 room 5 grants in full"); + AssertEqual(skillPointMax, Balance(inventory, Inventory.SkillPoint), "room 5 grants exactly five"); + AssertEqual(5000L, Balance(inventory, Inventory.Coin), "room 5 grants cogs"); + AssertEqual(0L, Balance(inventory, Inventory.PaidGem), "room 5 paid stack emptied"); + AssertEqual(0L, Balance(inventory, Inventory.FreeGem), "room 5 free stack emptied"); + AssertEqual(1, player.PurchaseBuyTimes[SkillPack], "room 5 records the counter"); + AssertEqual(null, player.PendingPurchase, "room 5 clears pending"); + } + { + uid++; + Player player = CreateDrawCompatibilityPlayer(uid); + Item skillPoints = new() { Id = Inventory.SkillPoint, Count = 0 }; + Inventory inventory = CreateDrawCompatibilityInventory(uid, + [ + new Item { Id = Inventory.PaidGem, Count = 10 }, + new Item { Id = Inventory.FreeGem, Count = 0 }, + skillPoints + ]); + using LoopbackSessionHarness harness = new( + CreateDrawCompatibilityCharacter(uid), player, inventory, "pool-resume"); + harness.Session.stage = CreateLoginAccountCompatibilityStage(uid); + inventories.ThrowOnReplaceOne = true; + AssertEqual(2, Buy(harness).Code, "failed inventory save leaves the purchase pending"); + inventories.ThrowOnReplaceOne = false; + AssertEqual(true, player.PendingPurchase is { Id: SkillPack }, "pending intent survives save failure"); + AssertEqual(10L, Balance(inventory, Inventory.PaidGem), "failed save keeps paid stack"); + AssertEqual(0, inventory.AppliedRewardClaims.Count, "failed save writes no receipts"); + skillPoints.Count = skillPointMax - 4; + AssertEqual(20027011, Buy(harness).Code, "unreceipted resume rechecks capacity"); + AssertEqual(true, player.PendingPurchase is { Id: SkillPack }, "blocked resume stays retryable"); + AssertEqual(10L, Balance(inventory, Inventory.PaidGem), "blocked resume keeps paid stack"); + AssertEqual(0L, Balance(inventory, Inventory.FreeGem), "blocked resume keeps free stack"); + AssertEqual(skillPointMax - 4, Balance(inventory, Inventory.SkillPoint), "blocked resume grants nothing"); + AssertEqual(0L, Balance(inventory, Inventory.Coin), "blocked resume grants no cogs"); + AssertEqual(false, player.PurchaseBuyTimes.ContainsKey(SkillPack), "blocked resume writes no counter"); + AssertEqual(0, inventory.AppliedRewardClaims.Count, "blocked resume writes no receipts"); + skillPoints.Count = skillPointMax - 5; + AssertEqual(0, Buy(harness).Code, "resumed purchase completes once capacity frees"); + AssertEqual(skillPointMax, Balance(inventory, Inventory.SkillPoint), "resumed purchase grants in full"); + AssertEqual(0L, Balance(inventory, Inventory.PaidGem), "resumed purchase debits paid stack"); + AssertEqual(0L, Balance(inventory, Inventory.FreeGem), "resumed purchase debits free stack"); + AssertEqual(1, player.PurchaseBuyTimes[SkillPack], "resumed purchase records the counter"); + AssertEqual(null, player.PendingPurchase, "resumed purchase clears pending"); + } + } +} diff --git a/AscNet.Test/Program.cs b/AscNet.Test/Program.cs index 682c35e1..8b574cbd 100644 --- a/AscNet.Test/Program.cs +++ b/AscNet.Test/Program.cs @@ -118,6 +118,11 @@ static void Main(string[] args) ValidateLoadingOptionCompatibility(); return; } + if (args.Contains("--store-purchases-only")) + { + ValidateStorePurchases(); + return; + } if (args.Contains("--wheelchair-manual-compat-only")) { ValidateWheelchairManualFullCompatibility(); diff --git a/Resources/Configs/client_purchases.json b/Resources/Configs/client_purchases.json index 6d68da46..2203aaf9 100644 --- a/Resources/Configs/client_purchases.json +++ b/Resources/Configs/client_purchases.json @@ -1 +1,3811 @@ -{"DefaultKey":"5,6,7,8,9,10,11,12,14,15,16","Responses":{"11":{"Code":0,"PurchaseInfoList":[{"Id":90842,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30013,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024560},{"RewardType":1,"TemplateId":31204,"Count":40,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024561},{"RewardType":1,"TemplateId":31104,"Count":16,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024562}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.20 Meritorious Pack","Desc":"Lv.20 Meritorious Pack","Icon":"UIv300_24","UiType":11,"SignInId":0,"Tag":10,"Priority":9400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235477,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040000,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90843,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30014,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024570},{"RewardType":1,"TemplateId":31204,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024571},{"RewardType":1,"TemplateId":31104,"Count":25,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024572}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.40 Meritorious Pack","Desc":"Lv.40 Meritorious Pack","Icon":"UIv300_25","UiType":11,"SignInId":0,"Tag":10,"Priority":9500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235479,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040001,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90844,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30014,"Count":20,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024580},{"RewardType":1,"TemplateId":31204,"Count":280,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024581},{"RewardType":1,"TemplateId":31104,"Count":35,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024582}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.60 Meritorious Pack","Desc":"Lv.60 Meritorious Pack","Icon":"UIv300_26","UiType":11,"SignInId":0,"Tag":10,"Priority":9600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235482,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040002,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90845,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":94038,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024590},{"RewardType":1,"TemplateId":90015,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024591}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.80 Meritorious Pack","Desc":"Lv.80 Meritorious Pack","Icon":"UIv300_27","UiType":11,"SignInId":0,"Tag":10,"Priority":9700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235488,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040003,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90846,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":5,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024600},{"RewardType":1,"TemplateId":30014,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024601},{"RewardType":1,"TemplateId":31204,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024602},{"RewardType":1,"TemplateId":12,"Count":70,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024603}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct Booster Pack","Desc":"Construct Booster Pack","Icon":"UIv300_28","UiType":11,"SignInId":0,"Tag":2,"Priority":9800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90847,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":3,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024610},{"RewardType":1,"TemplateId":31104,"Count":25,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024611},{"RewardType":1,"TemplateId":60002,"Count":40,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024612},{"RewardType":1,"TemplateId":60001,"Count":60,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024613}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Booster Pack","Desc":"Weapon Booster Pack","Icon":"UIv300_29","UiType":11,"SignInId":0,"Tag":2,"Priority":9900,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90848,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":3,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50009,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024620},{"RewardType":1,"TemplateId":40301,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024621},{"RewardType":1,"TemplateId":1,"Count":300000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024622}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"CUB Booster Pack","Desc":"CUB Booster Pack","Icon":"UIv300_30","UiType":11,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"5,6,7,8,9,10,11,12,14,15,16":{"Code":0,"PurchaseInfoList":[{"Id":10007,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":24,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":690720}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"7-Day Boon","Desc":"Log in for 7 days in a row to claim rewards","Icon":"UIv405_1","UiType":5,"SignInId":0,"Tag":1,"Priority":1,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":24,"CanMultiply":false,"FashionLabel":null,"SkipId":50121,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[69073,69074,69075,69076,69077,69078,69079],"PurchaseSignInShowId":113,"PurchaseSignInData":null,"BetterIndexStr":"1|2"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2059,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908640},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908641},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908642}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Anchored Starlight","Desc":"Anchored Starlight","Icon":"UIv405_2","UiType":5,"SignInId":0,"Tag":14,"Priority":1000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2060,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036720},{"RewardType":1,"TemplateId":3,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036721},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036722}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Guardians' Return","Desc":"Guardians' Return","Icon":"UIv405_3","UiType":5,"SignInId":0,"Tag":14,"Priority":1100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2061,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036730},{"RewardType":1,"TemplateId":3,"Count":8500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036731}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Vow of Valor","Desc":"Vow of Valor","Icon":"UIv405_4","UiType":5,"SignInId":0,"Tag":14,"Priority":1200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1780664060,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2062,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90030,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Voyage Eternal","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_5","UiType":5,"SignInId":0,"Tag":14,"Priority":1300,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2063,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":290,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown R&D Ticket Special Offer","Desc":"Inverse Crown R&D Ticket Special Offer","Icon":"UIv405_6","UiType":5,"SignInId":0,"Tag":14,"Priority":1400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2064,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":1400,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown Discounted R&D Ticket","Desc":"Inverse Crown Discounted R&D Ticket","Icon":"UIv405_7","UiType":5,"SignInId":0,"Tag":14,"Priority":1500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2065,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908690},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908691}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Onward in Light","Desc":"Onward in Light","Icon":"UIv405_8","UiType":5,"SignInId":0,"Tag":14,"Priority":1600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2066,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908700},{"RewardType":1,"TemplateId":50003,"Count":1500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908701}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Kindred Farers","Desc":"Kindred Farers","Icon":"UIv405_9","UiType":5,"SignInId":0,"Tag":14,"Priority":1700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2067,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908710},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908711},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908712},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908713}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Oathbound Horizon","Desc":"Oathbound Horizon","Icon":"UIv405_10","UiType":5,"SignInId":0,"Tag":14,"Priority":1800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2068,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":120,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Radiant Crusade","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_11","UiType":5,"SignInId":0,"Tag":14,"Priority":1900,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2069,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":98,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908720},{"RewardType":1,"TemplateId":29,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908721}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Deployment Support Black Box","Desc":"Deployment Support Black Box","Icon":"UIv405_12","UiType":5,"SignInId":0,"Tag":14,"Priority":2000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":98,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2070,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":3000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908730},{"RewardType":1,"TemplateId":70001,"Count":480,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908731},{"RewardType":1,"TemplateId":70002,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908732}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Victory Support Black Box","Desc":"Victory Support Black Box","Icon":"UIv405_13","UiType":5,"SignInId":0,"Tag":14,"Priority":2100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2071,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908740},{"RewardType":1,"TemplateId":3002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908741},{"RewardType":1,"TemplateId":50001,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908742}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Research Resonance Support Bundle","Desc":"Weapon Research Resonance Support Bundle","Icon":"UIv405_14","UiType":5,"SignInId":0,"Tag":14,"Priority":2200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2072,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908750},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908751},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908752}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Special Agent Support Black Box","Desc":"Special Agent Support Black Box","Icon":"UIv405_15","UiType":5,"SignInId":0,"Tag":14,"Priority":2300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":9,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900090},{"RewardType":1,"TemplateId":1,"Count":20000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900091}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Pack -10d","Desc":"1 per day for 10 days","Icon":"Uio1rmb","UiType":5,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":11,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900110}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Bundle","Desc":"Construct 10x R&D Bundle","Icon":"UioCDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":12,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900120}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon 10x R&D Bundle","Desc":"Weapon 10x R&D Bundle","Icon":"UioWDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":21,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":3,"ConsumeCount":10,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900190},{"RewardType":1,"TemplateId":1,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900191}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Skill Pts Daily Pack","Desc":"Skill Pts Daily Pack","Icon":"UioJDay","UiType":6,"SignInId":0,"Tag":0,"Priority":50100,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":10,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90289,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005550}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Event R&D Bundle","Desc":"Weekly Event R&D Bundle","Icon":"UIWeekly1","UiType":6,"SignInId":0,"Tag":1,"Priority":5001,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1762537049,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90290,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005560}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Weapon R&D Bundle","Desc":"Weekly Werpon R&D Bundle","Icon":"UIWeekly2","UiType":6,"SignInId":0,"Tag":1,"Priority":5002,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90943,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":90031,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50001670}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Daily Supply","Desc":"Serum Daily Supply","Icon":"UioDay","UiType":6,"SignInId":0,"Tag":10,"Priority":4500,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782574188,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90944,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":4,"Count":30,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032900},{"RewardType":3,"TemplateId":2994001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032901},{"RewardType":3,"TemplateId":3944001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032902}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Limited Pack","Desc":"Weekly Limited Pack","Icon":"UioWeek","UiType":6,"SignInId":0,"Tag":10,"Priority":5000,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782412686,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":19,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":99,"RewardGoodsList":[{"RewardType":1,"TemplateId":32,"Count":70,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900230},{"RewardType":1,"TemplateId":1,"Count":50000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900231}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Coating Blueprint Supply","Desc":"Coating Blueprint Supply","Icon":"UioPifuM","UiType":7,"SignInId":0,"Tag":0,"Priority":30500,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":99,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":25,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":[{"RewardType":1,"TemplateId":32,"Count":15,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900210}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Blueprint Bundle","Desc":"Blueprint Bundle","Icon":"UioSkinD","UiType":7,"SignInId":0,"Tag":0,"Priority":30500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":26,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":60,"RewardGoodsList":[{"RewardType":1,"TemplateId":31,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900220}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Decor Coin Bundle","Desc":"Decor Coin Bundle","Icon":"UioFCoin","UiType":7,"SignInId":0,"Tag":0,"Priority":50500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":60,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2073,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6006104,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908760}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Nightshroud Coronet","Desc":"Nightshroud Coronet","Icon":"UIv405_16","UiType":8,"SignInId":0,"Tag":15,"Priority":2400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2074,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80138,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Evernight Solitude","Desc":"Evernight Solitude","Icon":"UIv405_17","UiType":8,"SignInId":0,"Tag":15,"Priority":2500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2075,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6005505,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Stygian Pinion","Desc":"Stygian Pinion","Icon":"UIv405_18","UiType":8,"SignInId":0,"Tag":15,"Priority":2600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2076,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80136,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908790}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Nether Shade","Desc":"Nether Shade","Icon":"UIv405_19","UiType":8,"SignInId":0,"Tag":15,"Priority":2700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2077,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6004205,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":907300}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Infernal Deliverance","Desc":"Infernal Deliverance","Icon":"UIv405_20","UiType":8,"SignInId":0,"Tag":15,"Priority":2800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2078,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80116,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":907310}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Argent Requiem","Desc":"Argent Requiem","Icon":"UIv405_21","UiType":8,"SignInId":0,"Tag":15,"Priority":2900,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2079,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6004506,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908201}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Chromatic ☆ Night","Desc":"Chromatic ☆ Night","Icon":"UIv405_22","UiType":8,"SignInId":0,"Tag":15,"Priority":3000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2080,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80129,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908210}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Iridescent Galaxy","Desc":"Iridescent Galaxy","Icon":"UIv405_23","UiType":8,"SignInId":0,"Tag":15,"Priority":3100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":10,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":35,"RewardGoodsList":[{"RewardType":4,"TemplateId":6310104,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900100}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Tiara Coating Pack","Desc":"Tiara Coating Pack","Icon":"UioLifu","UiType":8,"SignInId":0,"Tag":1,"Priority":30000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":35,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90842,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30013,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024560},{"RewardType":1,"TemplateId":31204,"Count":40,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024561},{"RewardType":1,"TemplateId":31104,"Count":16,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024562}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.20 Meritorious Pack","Desc":"Lv.20 Meritorious Pack","Icon":"UIv300_24","UiType":11,"SignInId":0,"Tag":10,"Priority":9400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235477,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040000,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90843,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30014,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024570},{"RewardType":1,"TemplateId":31204,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024571},{"RewardType":1,"TemplateId":31104,"Count":25,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024572}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.40 Meritorious Pack","Desc":"Lv.40 Meritorious Pack","Icon":"UIv300_25","UiType":11,"SignInId":0,"Tag":10,"Priority":9500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235479,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040001,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90844,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30014,"Count":20,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024580},{"RewardType":1,"TemplateId":31204,"Count":280,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024581},{"RewardType":1,"TemplateId":31104,"Count":35,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024582}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.60 Meritorious Pack","Desc":"Lv.60 Meritorious Pack","Icon":"UIv300_26","UiType":11,"SignInId":0,"Tag":10,"Priority":9600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235482,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040002,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90845,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":94038,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024590},{"RewardType":1,"TemplateId":90015,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024591}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.80 Meritorious Pack","Desc":"Lv.80 Meritorious Pack","Icon":"UIv300_27","UiType":11,"SignInId":0,"Tag":10,"Priority":9700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235488,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040003,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90846,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":5,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024600},{"RewardType":1,"TemplateId":30014,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024601},{"RewardType":1,"TemplateId":31204,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024602},{"RewardType":1,"TemplateId":12,"Count":70,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024603}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct Booster Pack","Desc":"Construct Booster Pack","Icon":"UIv300_28","UiType":11,"SignInId":0,"Tag":2,"Priority":9800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90847,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":3,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024610},{"RewardType":1,"TemplateId":31104,"Count":25,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024611},{"RewardType":1,"TemplateId":60002,"Count":40,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024612},{"RewardType":1,"TemplateId":60001,"Count":60,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024613}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Booster Pack","Desc":"Weapon Booster Pack","Icon":"UIv300_29","UiType":11,"SignInId":0,"Tag":2,"Priority":9900,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90848,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":3,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50009,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024620},{"RewardType":1,"TemplateId":40301,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024621},{"RewardType":1,"TemplateId":1,"Count":300000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024622}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"CUB Booster Pack","Desc":"CUB Booster Pack","Icon":"UIv300_30","UiType":11,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":10004,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":12,"RewardGoodsList":null,"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Beginner 3-Day Limited Supply","Desc":"Log in on the main interface for 3 days in a row to claim rewards","Icon":"UIv400_25","UiType":15,"SignInId":0,"Tag":13,"Priority":102,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":12,"CanMultiply":false,"FashionLabel":null,"SkipId":50106,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[67151,67152,67153],"PurchaseSignInShowId":98,"PurchaseSignInData":null,"BetterIndexStr":"1|3"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":1968,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":2,"TemplateId":1171004,"Count":1,"Level":1,"Quality":3,"Grade":1,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671500},{"RewardType":1,"TemplateId":90002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671501}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Beginner S-Rank Limited Supply","Desc":"Beginner S-Rank Limited Supply","Icon":"UIv400_26","UiType":15,"SignInId":0,"Tag":13,"Priority":101,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1763139522,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":1969,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":48,"RewardGoodsList":[{"RewardType":1,"TemplateId":95006,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671540},{"RewardType":1,"TemplateId":50005,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671541}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Beginner Monthly Pass Combo Supply","Desc":"Monthly Pass Plus","Icon":"UIv400_27","UiType":15,"SignInId":0,"Tag":13,"Priority":103,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":[90032],"ConvertSwitch":48,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":83028,"CompanyPackageCount":1,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"2":{"Code":0,"PurchaseInfoList":[{"Id":83028,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":5,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20000580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":3,"Count":100,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20001020}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Monthly Pass A","Desc":"Daily Log-in gives 100 Black Cards","Icon":"Card","UiType":2,"SignInId":0,"Tag":1,"Priority":0,"ClientResetInfo":{"ResetType":5,"DayCount":150},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1749999635,"MutexPurchaseIds":[90032],"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":{"Count":0,"RecordAlarmCount":1817,"RecordAlarmCountHasSign":false},"DailyRewardSupplementGetConsumeItemId":106,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90032,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20000580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":3,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50000840}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Monthly Pass C","Desc":"Daily Log-in gives 90 Black Cards","Icon":"CardC","UiType":2,"SignInId":0,"Tag":1,"Priority":0,"ClientResetInfo":{"ResetType":5,"DayCount":150},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1712683208,"MutexPurchaseIds":[83028],"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":{"Count":0,"RecordAlarmCount":1817,"RecordAlarmCountHasSign":false},"DailyRewardSupplementGetConsumeItemId":106,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90291,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":680,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005570}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":50,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90031,"Count":2,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Monthly Pass","Desc":"1 per day for 30 days","Icon":"UIMonthly1","UiType":2,"SignInId":0,"Tag":2,"Priority":5011,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90292,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":119,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":1190,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":96004,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon R&D Monthly Pass","Desc":"1 per day for 30 days","Icon":"UIMonthly2","UiType":2,"SignInId":0,"Tag":2,"Priority":5012,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":119,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"0,5,6":{"Code":0,"PurchaseInfoList":[{"Id":10007,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":24,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":690720}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"7-Day Boon","Desc":"Log in for 7 days in a row to claim rewards","Icon":"UIv405_1","UiType":5,"SignInId":0,"Tag":1,"Priority":1,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":24,"CanMultiply":false,"FashionLabel":null,"SkipId":50121,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[69073,69074,69075,69076,69077,69078,69079],"PurchaseSignInShowId":113,"PurchaseSignInData":null,"BetterIndexStr":"1|2"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2059,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908640},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908641},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908642}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Anchored Starlight","Desc":"Anchored Starlight","Icon":"UIv405_2","UiType":5,"SignInId":0,"Tag":14,"Priority":1000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2060,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036720},{"RewardType":1,"TemplateId":3,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036721},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036722}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Guardians' Return","Desc":"Guardians' Return","Icon":"UIv405_3","UiType":5,"SignInId":0,"Tag":14,"Priority":1100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2061,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036730},{"RewardType":1,"TemplateId":3,"Count":8500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036731}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Vow of Valor","Desc":"Vow of Valor","Icon":"UIv405_4","UiType":5,"SignInId":0,"Tag":14,"Priority":1200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1780664060,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2062,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90030,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Voyage Eternal","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_5","UiType":5,"SignInId":0,"Tag":14,"Priority":1300,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2063,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":290,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown R&D Ticket Special Offer","Desc":"Inverse Crown R&D Ticket Special Offer","Icon":"UIv405_6","UiType":5,"SignInId":0,"Tag":14,"Priority":1400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2064,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":1400,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown Discounted R&D Ticket","Desc":"Inverse Crown Discounted R&D Ticket","Icon":"UIv405_7","UiType":5,"SignInId":0,"Tag":14,"Priority":1500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2065,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908690},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908691}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Onward in Light","Desc":"Onward in Light","Icon":"UIv405_8","UiType":5,"SignInId":0,"Tag":14,"Priority":1600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2066,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908700},{"RewardType":1,"TemplateId":50003,"Count":1500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908701}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Kindred Farers","Desc":"Kindred Farers","Icon":"UIv405_9","UiType":5,"SignInId":0,"Tag":14,"Priority":1700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2067,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908710},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908711},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908712},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908713}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Oathbound Horizon","Desc":"Oathbound Horizon","Icon":"UIv405_10","UiType":5,"SignInId":0,"Tag":14,"Priority":1800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2068,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":120,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Radiant Crusade","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_11","UiType":5,"SignInId":0,"Tag":14,"Priority":1900,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2069,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":98,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908720},{"RewardType":1,"TemplateId":29,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908721}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Deployment Support Black Box","Desc":"Deployment Support Black Box","Icon":"UIv405_12","UiType":5,"SignInId":0,"Tag":14,"Priority":2000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":98,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2070,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":3000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908730},{"RewardType":1,"TemplateId":70001,"Count":480,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908731},{"RewardType":1,"TemplateId":70002,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908732}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Victory Support Black Box","Desc":"Victory Support Black Box","Icon":"UIv405_13","UiType":5,"SignInId":0,"Tag":14,"Priority":2100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2071,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908740},{"RewardType":1,"TemplateId":3002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908741},{"RewardType":1,"TemplateId":50001,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908742}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Research Resonance Support Bundle","Desc":"Weapon Research Resonance Support Bundle","Icon":"UIv405_14","UiType":5,"SignInId":0,"Tag":14,"Priority":2200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2072,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908750},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908751},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908752}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Special Agent Support Black Box","Desc":"Special Agent Support Black Box","Icon":"UIv405_15","UiType":5,"SignInId":0,"Tag":14,"Priority":2300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":9,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900090},{"RewardType":1,"TemplateId":1,"Count":20000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900091}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Pack -10d","Desc":"1 per day for 10 days","Icon":"Uio1rmb","UiType":5,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":11,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900110}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Bundle","Desc":"Construct 10x R&D Bundle","Icon":"UioCDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":12,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900120}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon 10x R&D Bundle","Desc":"Weapon 10x R&D Bundle","Icon":"UioWDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":21,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":3,"ConsumeCount":10,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900190},{"RewardType":1,"TemplateId":1,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900191}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Skill Pts Daily Pack","Desc":"Skill Pts Daily Pack","Icon":"UioJDay","UiType":6,"SignInId":0,"Tag":0,"Priority":50100,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":10,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90289,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005550}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Event R&D Bundle","Desc":"Weekly Event R&D Bundle","Icon":"UIWeekly1","UiType":6,"SignInId":0,"Tag":1,"Priority":5001,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1762537049,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90290,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005560}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Weapon R&D Bundle","Desc":"Weekly Werpon R&D Bundle","Icon":"UIWeekly2","UiType":6,"SignInId":0,"Tag":1,"Priority":5002,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90943,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":90031,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50001670}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Daily Supply","Desc":"Serum Daily Supply","Icon":"UioDay","UiType":6,"SignInId":0,"Tag":10,"Priority":4500,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782574188,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90944,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":4,"Count":30,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032900},{"RewardType":3,"TemplateId":2994001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032901},{"RewardType":3,"TemplateId":3944001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032902}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Limited Pack","Desc":"Weekly Limited Pack","Icon":"UioWeek","UiType":6,"SignInId":0,"Tag":10,"Priority":5000,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782412686,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"5,6,7,8,10,11,14,15,16":{"Code":0,"PurchaseInfoList":[{"Id":10007,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":24,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":690720}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"7-Day Boon","Desc":"Log in for 7 days in a row to claim rewards","Icon":"UIv405_1","UiType":5,"SignInId":0,"Tag":1,"Priority":1,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":24,"CanMultiply":false,"FashionLabel":null,"SkipId":50121,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[69073,69074,69075,69076,69077,69078,69079],"PurchaseSignInShowId":113,"PurchaseSignInData":null,"BetterIndexStr":"1|2"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2059,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908640},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908641},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908642}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Anchored Starlight","Desc":"Anchored Starlight","Icon":"UIv405_2","UiType":5,"SignInId":0,"Tag":14,"Priority":1000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2060,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036720},{"RewardType":1,"TemplateId":3,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036721},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036722}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Guardians' Return","Desc":"Guardians' Return","Icon":"UIv405_3","UiType":5,"SignInId":0,"Tag":14,"Priority":1100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2061,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036730},{"RewardType":1,"TemplateId":3,"Count":8500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036731}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Vow of Valor","Desc":"Vow of Valor","Icon":"UIv405_4","UiType":5,"SignInId":0,"Tag":14,"Priority":1200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1780664060,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2062,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90030,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Voyage Eternal","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_5","UiType":5,"SignInId":0,"Tag":14,"Priority":1300,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2063,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":290,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown R&D Ticket Special Offer","Desc":"Inverse Crown R&D Ticket Special Offer","Icon":"UIv405_6","UiType":5,"SignInId":0,"Tag":14,"Priority":1400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1783164964,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2064,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":1400,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown Discounted R&D Ticket","Desc":"Inverse Crown Discounted R&D Ticket","Icon":"UIv405_7","UiType":5,"SignInId":0,"Tag":14,"Priority":1500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2065,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908690},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908691}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Onward in Light","Desc":"Onward in Light","Icon":"UIv405_8","UiType":5,"SignInId":0,"Tag":14,"Priority":1600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2066,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908700},{"RewardType":1,"TemplateId":50003,"Count":1500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908701}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Kindred Farers","Desc":"Kindred Farers","Icon":"UIv405_9","UiType":5,"SignInId":0,"Tag":14,"Priority":1700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2067,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908710},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908711},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908712},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908713}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Oathbound Horizon","Desc":"Oathbound Horizon","Icon":"UIv405_10","UiType":5,"SignInId":0,"Tag":14,"Priority":1800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2068,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":120,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Radiant Crusade","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_11","UiType":5,"SignInId":0,"Tag":14,"Priority":1900,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2069,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":98,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908720},{"RewardType":1,"TemplateId":29,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908721}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Deployment Support Black Box","Desc":"Deployment Support Black Box","Icon":"UIv405_12","UiType":5,"SignInId":0,"Tag":14,"Priority":2000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":98,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2070,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":3000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908730},{"RewardType":1,"TemplateId":70001,"Count":480,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908731},{"RewardType":1,"TemplateId":70002,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908732}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Victory Support Black Box","Desc":"Victory Support Black Box","Icon":"UIv405_13","UiType":5,"SignInId":0,"Tag":14,"Priority":2100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2071,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908740},{"RewardType":1,"TemplateId":3002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908741},{"RewardType":1,"TemplateId":50001,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908742}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Research Resonance Support Bundle","Desc":"Weapon Research Resonance Support Bundle","Icon":"UIv405_14","UiType":5,"SignInId":0,"Tag":14,"Priority":2200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2072,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908750},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908751},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908752}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Special Agent Support Black Box","Desc":"Special Agent Support Black Box","Icon":"UIv405_15","UiType":5,"SignInId":0,"Tag":14,"Priority":2300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":9,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900090},{"RewardType":1,"TemplateId":1,"Count":20000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900091}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Pack -10d","Desc":"1 per day for 10 days","Icon":"Uio1rmb","UiType":5,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":11,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900110}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Bundle","Desc":"Construct 10x R&D Bundle","Icon":"UioCDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":12,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900120}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon 10x R&D Bundle","Desc":"Weapon 10x R&D Bundle","Icon":"UioWDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":10004,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":12,"RewardGoodsList":null,"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Beginner 3-Day Limited Supply","Desc":"Log in on the main interface for 3 days in a row to claim rewards","Icon":"UIv400_25","UiType":15,"SignInId":0,"Tag":13,"Priority":102,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":12,"CanMultiply":false,"FashionLabel":null,"SkipId":50106,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[67151,67152,67153],"PurchaseSignInShowId":98,"PurchaseSignInData":null,"BetterIndexStr":"1|3"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":1968,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":2,"TemplateId":1171004,"Count":1,"Level":1,"Quality":3,"Grade":1,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671500},{"RewardType":1,"TemplateId":90002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671501}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Beginner S-Rank Limited Supply","Desc":"Beginner S-Rank Limited Supply","Icon":"UIv400_26","UiType":15,"SignInId":0,"Tag":13,"Priority":101,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1763139522,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":1969,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":48,"RewardGoodsList":[{"RewardType":1,"TemplateId":95006,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671540},{"RewardType":1,"TemplateId":50005,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":671541}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Beginner Monthly Pass Combo Supply","Desc":"Monthly Pass Plus","Icon":"UIv400_27","UiType":15,"SignInId":0,"Tag":13,"Priority":103,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":[90032],"ConvertSwitch":48,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":83028,"CompanyPackageCount":1,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":21,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":3,"ConsumeCount":10,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900190},{"RewardType":1,"TemplateId":1,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900191}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Skill Pts Daily Pack","Desc":"Skill Pts Daily Pack","Icon":"UioJDay","UiType":6,"SignInId":0,"Tag":0,"Priority":50100,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":10,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90289,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005550}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Event R&D Bundle","Desc":"Weekly Event R&D Bundle","Icon":"UIWeekly1","UiType":6,"SignInId":0,"Tag":1,"Priority":5001,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1762537049,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90290,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005560}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Weapon R&D Bundle","Desc":"Weekly Werpon R&D Bundle","Icon":"UIWeekly2","UiType":6,"SignInId":0,"Tag":1,"Priority":5002,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90943,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":90031,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50001670}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Daily Supply","Desc":"Serum Daily Supply","Icon":"UioDay","UiType":6,"SignInId":0,"Tag":10,"Priority":4500,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782574188,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90944,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":4,"Count":30,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032900},{"RewardType":3,"TemplateId":2994001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032901},{"RewardType":3,"TemplateId":3944001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032902}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Limited Pack","Desc":"Weekly Limited Pack","Icon":"UioWeek","UiType":6,"SignInId":0,"Tag":10,"Priority":5000,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782412686,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2073,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6006104,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908760}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Nightshroud Coronet","Desc":"Nightshroud Coronet","Icon":"UIv405_16","UiType":8,"SignInId":0,"Tag":15,"Priority":2400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2074,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80138,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Evernight Solitude","Desc":"Evernight Solitude","Icon":"UIv405_17","UiType":8,"SignInId":0,"Tag":15,"Priority":2500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2075,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6005505,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Stygian Pinion","Desc":"Stygian Pinion","Icon":"UIv405_18","UiType":8,"SignInId":0,"Tag":15,"Priority":2600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2076,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80136,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908790}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Nether Shade","Desc":"Nether Shade","Icon":"UIv405_19","UiType":8,"SignInId":0,"Tag":15,"Priority":2700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2077,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6004205,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":907300}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Infernal Deliverance","Desc":"Infernal Deliverance","Icon":"UIv405_20","UiType":8,"SignInId":0,"Tag":15,"Priority":2800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2078,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80116,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":907310}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Argent Requiem","Desc":"Argent Requiem","Icon":"UIv405_21","UiType":8,"SignInId":0,"Tag":15,"Priority":2900,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2079,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":240,"RewardGoodsList":[{"RewardType":4,"TemplateId":6004506,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908201}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Chromatic ☆ Night","Desc":"Chromatic ☆ Night","Icon":"UIv405_22","UiType":8,"SignInId":0,"Tag":15,"Priority":3000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":240,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2080,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":40,"RewardGoodsList":[{"RewardType":1,"TemplateId":80129,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908210}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Iridescent Galaxy","Desc":"Iridescent Galaxy","Icon":"UIv405_23","UiType":8,"SignInId":0,"Tag":15,"Priority":3100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":{"1":7000},"DiscountCouponInfos":null,"DiscountShowStr":"7","LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":40,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":10,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":35,"RewardGoodsList":[{"RewardType":4,"TemplateId":6310104,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900100}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Tiara Coating Pack","Desc":"Tiara Coating Pack","Icon":"UioLifu","UiType":8,"SignInId":0,"Tag":1,"Priority":30000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":35,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":19,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":99,"RewardGoodsList":[{"RewardType":1,"TemplateId":32,"Count":70,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900230},{"RewardType":1,"TemplateId":1,"Count":50000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900231}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Coating Blueprint Supply","Desc":"Coating Blueprint Supply","Icon":"UioPifuM","UiType":7,"SignInId":0,"Tag":0,"Priority":30500,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":99,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":25,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":[{"RewardType":1,"TemplateId":32,"Count":15,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900210}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Blueprint Bundle","Desc":"Blueprint Bundle","Icon":"UioSkinD","UiType":7,"SignInId":0,"Tag":0,"Priority":30500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":26,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":60,"RewardGoodsList":[{"RewardType":1,"TemplateId":31,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900220}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Decor Coin Bundle","Desc":"Decor Coin Bundle","Icon":"UioFCoin","UiType":7,"SignInId":0,"Tag":0,"Priority":50500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":60,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90842,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30013,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024560},{"RewardType":1,"TemplateId":31204,"Count":40,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024561},{"RewardType":1,"TemplateId":31104,"Count":16,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024562}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.20 Meritorious Pack","Desc":"Lv.20 Meritorious Pack","Icon":"UIv300_24","UiType":11,"SignInId":0,"Tag":10,"Priority":9400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235477,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040000,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90843,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30014,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024570},{"RewardType":1,"TemplateId":31204,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024571},{"RewardType":1,"TemplateId":31104,"Count":25,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024572}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.40 Meritorious Pack","Desc":"Lv.40 Meritorious Pack","Icon":"UIv300_25","UiType":11,"SignInId":0,"Tag":10,"Priority":9500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235479,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040001,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90844,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":30014,"Count":20,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024580},{"RewardType":1,"TemplateId":31204,"Count":280,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024581},{"RewardType":1,"TemplateId":31104,"Count":35,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024582}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.60 Meritorious Pack","Desc":"Lv.60 Meritorious Pack","Icon":"UIv300_26","UiType":11,"SignInId":0,"Tag":10,"Priority":9600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235482,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040002,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90845,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":94038,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024590},{"RewardType":1,"TemplateId":90015,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024591}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Lv.80 Meritorious Pack","Desc":"Lv.80 Meritorious Pack","Icon":"UIv300_27","UiType":11,"SignInId":0,"Tag":10,"Priority":9700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1747235488,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[1040003,770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90846,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":5,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024600},{"RewardType":1,"TemplateId":30014,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024601},{"RewardType":1,"TemplateId":31204,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024602},{"RewardType":1,"TemplateId":12,"Count":70,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024603}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct Booster Pack","Desc":"Construct Booster Pack","Icon":"UIv300_28","UiType":11,"SignInId":0,"Tag":2,"Priority":9800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90847,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":3,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024610},{"RewardType":1,"TemplateId":31104,"Count":25,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024611},{"RewardType":1,"TemplateId":60002,"Count":40,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024612},{"RewardType":1,"TemplateId":60001,"Count":60,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024613}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Booster Pack","Desc":"Weapon Booster Pack","Icon":"UIv300_29","UiType":11,"SignInId":0,"Tag":2,"Priority":9900,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90848,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":3,"ConsumeId":3,"ConsumeCount":500,"RewardGoodsList":[{"RewardType":1,"TemplateId":50009,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024620},{"RewardType":1,"TemplateId":40301,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024621},{"RewardType":1,"TemplateId":1,"Count":300000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50024622}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"CUB Booster Pack","Desc":"CUB Booster Pack","Icon":"UIv300_30","UiType":11,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":500,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":[770303],"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"3":{"Code":0,"PurchaseInfoList":[{"Id":100,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":2,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":1,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 10 Black Cards","Icon":"UiPurchaseIconDh1","UiType":3,"SignInId":0,"Tag":0,"Priority":1,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1780665806,"MutexPurchaseIds":null,"ConvertSwitch":1,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":101,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":50,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":50,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 50 Black Cards","Icon":"UiPurchaseIconDh5","UiType":3,"SignInId":0,"Tag":0,"Priority":2,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1721413334,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":102,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":280,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":280,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 280 Black Cards","Icon":"UiPurchaseIconDh28","UiType":3,"SignInId":0,"Tag":0,"Priority":3,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":103,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":34,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":340,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":340,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 340 Black Cards","Icon":"UiPurchaseIconDh34","UiType":3,"SignInId":0,"Tag":0,"Priority":4,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1721320542,"MutexPurchaseIds":null,"ConvertSwitch":34,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":104,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":59,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":590,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":590,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 590 Black Cards","Icon":"UiPurchaseIconDh59","UiType":3,"SignInId":0,"Tag":0,"Priority":5,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":59,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":105,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":71,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":710,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":710,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 710 Black Cards","Icon":"UiPurchaseIconDh71","UiType":3,"SignInId":0,"Tag":0,"Priority":6,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":71,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":106,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":119,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":1190,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":1190,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 1190 Black Cards","Icon":"UiPurchaseIconDh119","UiType":3,"SignInId":0,"Tag":0,"Priority":7,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":119,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":107,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":2990,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":2990,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 2990 Black Cards","Icon":"UiPurchaseIconDh299","UiType":3,"SignInId":0,"Tag":0,"Priority":8,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":108,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":6000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"DailyRewardGoodsList":null,"FirstRewardGoods":{"RewardType":1,"TemplateId":3,"Count":6000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":null,"Desc":"Buy 6000 Black Cards","Icon":"UiPurchaseIconDh600","UiType":3,"SignInId":0,"Tag":0,"Priority":9,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"2,5,6":{"Code":0,"PurchaseInfoList":[{"Id":10007,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":24,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":690720}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"7-Day Boon","Desc":"Log in for 7 days in a row to claim rewards","Icon":"UIv405_1","UiType":5,"SignInId":0,"Tag":1,"Priority":1,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":24,"CanMultiply":false,"FashionLabel":null,"SkipId":50121,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[69073,69074,69075,69076,69077,69078,69079],"PurchaseSignInShowId":113,"PurchaseSignInData":null,"BetterIndexStr":"1|2"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2059,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908640},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908641},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908642}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Anchored Starlight","Desc":"Anchored Starlight","Icon":"UIv405_2","UiType":5,"SignInId":0,"Tag":14,"Priority":1000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2060,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036720},{"RewardType":1,"TemplateId":3,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036721},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036722}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Guardians' Return","Desc":"Guardians' Return","Icon":"UIv405_3","UiType":5,"SignInId":0,"Tag":14,"Priority":1100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2061,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036730},{"RewardType":1,"TemplateId":3,"Count":8500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036731}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Vow of Valor","Desc":"Vow of Valor","Icon":"UIv405_4","UiType":5,"SignInId":0,"Tag":14,"Priority":1200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1780664060,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2062,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90030,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Voyage Eternal","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_5","UiType":5,"SignInId":0,"Tag":14,"Priority":1300,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2063,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":290,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown R&D Ticket Special Offer","Desc":"Inverse Crown R&D Ticket Special Offer","Icon":"UIv405_6","UiType":5,"SignInId":0,"Tag":14,"Priority":1400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1783164964,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2064,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":1400,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown Discounted R&D Ticket","Desc":"Inverse Crown Discounted R&D Ticket","Icon":"UIv405_7","UiType":5,"SignInId":0,"Tag":14,"Priority":1500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2065,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908690},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908691}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Onward in Light","Desc":"Onward in Light","Icon":"UIv405_8","UiType":5,"SignInId":0,"Tag":14,"Priority":1600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2066,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908700},{"RewardType":1,"TemplateId":50003,"Count":1500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908701}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Kindred Farers","Desc":"Kindred Farers","Icon":"UIv405_9","UiType":5,"SignInId":0,"Tag":14,"Priority":1700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2067,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908710},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908711},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908712},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908713}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Oathbound Horizon","Desc":"Oathbound Horizon","Icon":"UIv405_10","UiType":5,"SignInId":0,"Tag":14,"Priority":1800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2068,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":120,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Radiant Crusade","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_11","UiType":5,"SignInId":0,"Tag":14,"Priority":1900,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2069,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":98,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908720},{"RewardType":1,"TemplateId":29,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908721}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Deployment Support Black Box","Desc":"Deployment Support Black Box","Icon":"UIv405_12","UiType":5,"SignInId":0,"Tag":14,"Priority":2000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":98,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2070,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":3000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908730},{"RewardType":1,"TemplateId":70001,"Count":480,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908731},{"RewardType":1,"TemplateId":70002,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908732}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Victory Support Black Box","Desc":"Victory Support Black Box","Icon":"UIv405_13","UiType":5,"SignInId":0,"Tag":14,"Priority":2100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2071,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908740},{"RewardType":1,"TemplateId":3002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908741},{"RewardType":1,"TemplateId":50001,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908742}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Research Resonance Support Bundle","Desc":"Weapon Research Resonance Support Bundle","Icon":"UIv405_14","UiType":5,"SignInId":0,"Tag":14,"Priority":2200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2072,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908750},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908751},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908752}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Special Agent Support Black Box","Desc":"Special Agent Support Black Box","Icon":"UIv405_15","UiType":5,"SignInId":0,"Tag":14,"Priority":2300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":9,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900090},{"RewardType":1,"TemplateId":1,"Count":20000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900091}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Pack -10d","Desc":"1 per day for 10 days","Icon":"Uio1rmb","UiType":5,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":11,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900110}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Bundle","Desc":"Construct 10x R&D Bundle","Icon":"UioCDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":12,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900120}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon 10x R&D Bundle","Desc":"Weapon 10x R&D Bundle","Icon":"UioWDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":21,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":3,"ConsumeCount":10,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900190},{"RewardType":1,"TemplateId":1,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900191}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Skill Pts Daily Pack","Desc":"Skill Pts Daily Pack","Icon":"UioJDay","UiType":6,"SignInId":0,"Tag":0,"Priority":50100,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":10,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90289,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005550}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Event R&D Bundle","Desc":"Weekly Event R&D Bundle","Icon":"UIWeekly1","UiType":6,"SignInId":0,"Tag":1,"Priority":5001,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1762537049,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90290,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005560}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Weapon R&D Bundle","Desc":"Weekly Werpon R&D Bundle","Icon":"UIWeekly2","UiType":6,"SignInId":0,"Tag":1,"Priority":5002,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90943,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":90031,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50001670}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Daily Supply","Desc":"Serum Daily Supply","Icon":"UioDay","UiType":6,"SignInId":0,"Tag":10,"Priority":4500,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1783164982,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90944,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":4,"Count":30,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032900},{"RewardType":3,"TemplateId":2994001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032901},{"RewardType":3,"TemplateId":3944001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032902}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Limited Pack","Desc":"Weekly Limited Pack","Icon":"UioWeek","UiType":6,"SignInId":0,"Tag":10,"Priority":5000,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1783164984,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":83028,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":5,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20000580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":3,"Count":100,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20001020}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Monthly Pass A","Desc":"Daily Log-in gives 100 Black Cards","Icon":"Card","UiType":2,"SignInId":0,"Tag":1,"Priority":0,"ClientResetInfo":{"ResetType":5,"DayCount":150},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1749999635,"MutexPurchaseIds":[90032],"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":{"Count":0,"RecordAlarmCount":1818,"RecordAlarmCountHasSign":false},"DailyRewardSupplementGetConsumeItemId":106,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90032,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20000580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":3,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50000840}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Monthly Pass C","Desc":"Daily Log-in gives 90 Black Cards","Icon":"CardC","UiType":2,"SignInId":0,"Tag":1,"Priority":0,"ClientResetInfo":{"ResetType":5,"DayCount":150},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1712683208,"MutexPurchaseIds":[83028],"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":{"Count":0,"RecordAlarmCount":1818,"RecordAlarmCountHasSign":false},"DailyRewardSupplementGetConsumeItemId":106,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90291,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":680,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005570}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":50,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90031,"Count":2,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Monthly Pass","Desc":"1 per day for 30 days","Icon":"UIMonthly1","UiType":2,"SignInId":0,"Tag":2,"Priority":5011,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90292,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":119,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":1190,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":96004,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon R&D Monthly Pass","Desc":"1 per day for 30 days","Icon":"UIMonthly2","UiType":2,"SignInId":0,"Tag":2,"Priority":5012,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":119,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"5,6":{"Code":0,"PurchaseInfoList":[{"Id":10007,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":24,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":690720}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"7-Day Boon","Desc":"Log in for 7 days in a row to claim rewards","Icon":"UIv405_1","UiType":5,"SignInId":0,"Tag":1,"Priority":1,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":24,"CanMultiply":false,"FashionLabel":null,"SkipId":50121,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[69073,69074,69075,69076,69077,69078,69079],"PurchaseSignInShowId":113,"PurchaseSignInData":null,"BetterIndexStr":"1|2"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2059,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908640},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908641},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908642}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Anchored Starlight","Desc":"Anchored Starlight","Icon":"UIv405_2","UiType":5,"SignInId":0,"Tag":14,"Priority":1000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2060,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036720},{"RewardType":1,"TemplateId":3,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036721},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036722}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Guardians' Return","Desc":"Guardians' Return","Icon":"UIv405_3","UiType":5,"SignInId":0,"Tag":14,"Priority":1100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2061,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036730},{"RewardType":1,"TemplateId":3,"Count":8500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036731}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Vow of Valor","Desc":"Vow of Valor","Icon":"UIv405_4","UiType":5,"SignInId":0,"Tag":14,"Priority":1200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1780664060,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2062,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90030,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Voyage Eternal","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_5","UiType":5,"SignInId":0,"Tag":14,"Priority":1300,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2063,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":290,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown R&D Ticket Special Offer","Desc":"Inverse Crown R&D Ticket Special Offer","Icon":"UIv405_6","UiType":5,"SignInId":0,"Tag":14,"Priority":1400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2064,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":1400,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown Discounted R&D Ticket","Desc":"Inverse Crown Discounted R&D Ticket","Icon":"UIv405_7","UiType":5,"SignInId":0,"Tag":14,"Priority":1500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2065,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908690},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908691}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Onward in Light","Desc":"Onward in Light","Icon":"UIv405_8","UiType":5,"SignInId":0,"Tag":14,"Priority":1600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2066,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908700},{"RewardType":1,"TemplateId":50003,"Count":1500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908701}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Kindred Farers","Desc":"Kindred Farers","Icon":"UIv405_9","UiType":5,"SignInId":0,"Tag":14,"Priority":1700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2067,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908710},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908711},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908712},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908713}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Oathbound Horizon","Desc":"Oathbound Horizon","Icon":"UIv405_10","UiType":5,"SignInId":0,"Tag":14,"Priority":1800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2068,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":120,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Radiant Crusade","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_11","UiType":5,"SignInId":0,"Tag":14,"Priority":1900,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2069,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":98,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908720},{"RewardType":1,"TemplateId":29,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908721}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Deployment Support Black Box","Desc":"Deployment Support Black Box","Icon":"UIv405_12","UiType":5,"SignInId":0,"Tag":14,"Priority":2000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":98,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2070,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":3000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908730},{"RewardType":1,"TemplateId":70001,"Count":480,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908731},{"RewardType":1,"TemplateId":70002,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908732}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Victory Support Black Box","Desc":"Victory Support Black Box","Icon":"UIv405_13","UiType":5,"SignInId":0,"Tag":14,"Priority":2100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2071,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908740},{"RewardType":1,"TemplateId":3002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908741},{"RewardType":1,"TemplateId":50001,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908742}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Research Resonance Support Bundle","Desc":"Weapon Research Resonance Support Bundle","Icon":"UIv405_14","UiType":5,"SignInId":0,"Tag":14,"Priority":2200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2072,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908750},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908751},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908752}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Special Agent Support Black Box","Desc":"Special Agent Support Black Box","Icon":"UIv405_15","UiType":5,"SignInId":0,"Tag":14,"Priority":2300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":9,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900090},{"RewardType":1,"TemplateId":1,"Count":20000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900091}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Pack -10d","Desc":"1 per day for 10 days","Icon":"Uio1rmb","UiType":5,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":11,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900110}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Bundle","Desc":"Construct 10x R&D Bundle","Icon":"UioCDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":12,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900120}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon 10x R&D Bundle","Desc":"Weapon 10x R&D Bundle","Icon":"UioWDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":21,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":3,"ConsumeCount":10,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":5,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900190},{"RewardType":1,"TemplateId":1,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900191}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Skill Pts Daily Pack","Desc":"Skill Pts Daily Pack","Icon":"UioJDay","UiType":6,"SignInId":0,"Tag":0,"Priority":50100,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":10,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90289,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005550}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Event R&D Bundle","Desc":"Weekly Event R&D Bundle","Icon":"UIWeekly1","UiType":6,"SignInId":0,"Tag":1,"Priority":5001,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1762537049,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90290,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":20,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005560}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Weapon R&D Bundle","Desc":"Weekly Werpon R&D Bundle","Icon":"UIWeekly2","UiType":6,"SignInId":0,"Tag":1,"Priority":5002,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":20,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90943,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":90031,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50001670}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Daily Supply","Desc":"Serum Daily Supply","Icon":"UioDay","UiType":6,"SignInId":0,"Tag":10,"Priority":4500,"ClientResetInfo":{"ResetType":0,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782574188,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90944,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":0,"ConsumeCount":0,"RewardGoodsList":[{"RewardType":1,"TemplateId":4,"Count":30,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032900},{"RewardType":3,"TemplateId":2994001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032901},{"RewardType":3,"TemplateId":3944001,"Count":1,"Level":1,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50032902}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weekly Limited Pack","Desc":"Weekly Limited Pack","Icon":"UioWeek","UiType":6,"SignInId":0,"Tag":10,"Priority":5000,"ClientResetInfo":{"ResetType":1,"DayCount":0},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1782412686,"MutexPurchaseIds":null,"ConvertSwitch":0,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]},"2,5":{"Code":0,"PurchaseInfoList":[{"Id":10007,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":24,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":690720}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"7-Day Boon","Desc":"Log in for 7 days in a row to claim rewards","Icon":"UIv405_1","UiType":5,"SignInId":0,"Tag":1,"Priority":1,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":24,"CanMultiply":false,"FashionLabel":null,"SkipId":50121,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":{"PurchaseSignInRewardInfos":[69073,69074,69075,69076,69077,69078,69079],"PurchaseSignInShowId":113,"PurchaseSignInData":null,"BetterIndexStr":"1|2"},"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2059,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908640},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908641},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908642}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Anchored Starlight","Desc":"Anchored Starlight","Icon":"UIv405_2","UiType":5,"SignInId":0,"Tag":14,"Priority":1000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2060,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036720},{"RewardType":1,"TemplateId":3,"Count":4000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036721},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036722}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Guardians' Return","Desc":"Guardians' Return","Icon":"UIv405_3","UiType":5,"SignInId":0,"Tag":14,"Priority":1100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2061,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036730},{"RewardType":1,"TemplateId":3,"Count":8500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50036731}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Vow of Valor","Desc":"Vow of Valor","Icon":"UIv405_4","UiType":5,"SignInId":0,"Tag":14,"Priority":1200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1780664060,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2062,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90030,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Voyage Eternal","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_5","UiType":5,"SignInId":0,"Tag":14,"Priority":1300,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2063,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":290,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035770}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown R&D Ticket Special Offer","Desc":"Inverse Crown R&D Ticket Special Offer","Icon":"UIv405_6","UiType":5,"SignInId":0,"Tag":14,"Priority":1400,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2064,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":1400,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50035780}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Inverse Crown Discounted R&D Ticket","Desc":"Inverse Crown Discounted R&D Ticket","Icon":"UIv405_7","UiType":5,"SignInId":0,"Tag":14,"Priority":1500,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2065,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908690},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908691}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Onward in Light","Desc":"Onward in Light","Icon":"UIv405_8","UiType":5,"SignInId":0,"Tag":14,"Priority":1600,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2066,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908700},{"RewardType":1,"TemplateId":50003,"Count":1500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908701}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Kindred Farers","Desc":"Kindred Farers","Icon":"UIv405_9","UiType":5,"SignInId":0,"Tag":14,"Priority":1700,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2067,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908710},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908711},{"RewardType":1,"TemplateId":70001,"Count":960,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908712},{"RewardType":1,"TemplateId":70002,"Count":160,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908713}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Oathbound Horizon","Desc":"Oathbound Horizon","Icon":"UIv405_10","UiType":5,"SignInId":0,"Tag":14,"Priority":1800,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2068,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":null,"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":120,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Radiant Crusade","Desc":"Get 1 reward per day by mail over 10 days","Icon":"UIv405_11","UiType":5,"SignInId":0,"Tag":14,"Priority":1900,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2069,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":98,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908720},{"RewardType":1,"TemplateId":29,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908721}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Deployment Support Black Box","Desc":"Deployment Support Black Box","Icon":"UIv405_12","UiType":5,"SignInId":0,"Tag":14,"Priority":2000,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":98,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2070,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":2,"ConsumeId":5,"ConsumeCount":128,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":3000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908730},{"RewardType":1,"TemplateId":70001,"Count":480,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908731},{"RewardType":1,"TemplateId":70002,"Count":80,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908732}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Victory Support Black Box","Desc":"Victory Support Black Box","Icon":"UIv405_13","UiType":5,"SignInId":0,"Tag":14,"Priority":2100,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":128,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2071,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":299,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908740},{"RewardType":1,"TemplateId":3002,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908741},{"RewardType":1,"TemplateId":50001,"Count":1000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908742}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon Research Resonance Support Bundle","Desc":"Weapon Research Resonance Support Bundle","Icon":"UIv405_14","UiType":5,"SignInId":0,"Tag":14,"Priority":2200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":299,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":2072,"TimeToInvalid":1784242800,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":600,"RewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":10000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908750},{"RewardType":1,"TemplateId":3,"Count":5000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908751},{"RewardType":1,"TemplateId":3005,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":908752}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Special Agent Support Black Box","Desc":"Special Agent Support Black Box","Icon":"UIv405_15","UiType":5,"SignInId":0,"Tag":14,"Priority":2300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":600,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":9,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":5,"RewardGoodsList":[{"RewardType":1,"TemplateId":12,"Count":10,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900090},{"RewardType":1,"TemplateId":1,"Count":20000,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900091}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":250,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Pack -10d","Desc":"1 per day for 10 days","Icon":"Uio1rmb","UiType":5,"SignInId":0,"Tag":2,"Priority":10000,"ClientResetInfo":null,"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":5,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":11,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50000,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900110}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Construct 10x R&D Bundle","Desc":"Construct 10x R&D Bundle","Icon":"UioCDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10200,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":12,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":69,"RewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":2500,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":900120}],"DailyRewardGoodsList":null,"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon 10x R&D Bundle","Desc":"Weapon 10x R&D Bundle","Icon":"UioWDrew","UiType":5,"SignInId":0,"Tag":1,"Priority":10300,"ClientResetInfo":null,"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":69,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":83028,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":5,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":30,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20000580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":3,"Count":100,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20001020}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Monthly Pass A","Desc":"Daily Log-in gives 100 Black Cards","Icon":"Card","UiType":2,"SignInId":0,"Tag":1,"Priority":0,"ClientResetInfo":{"ResetType":5,"DayCount":150},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1749999635,"MutexPurchaseIds":[90032],"ConvertSwitch":30,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":{"Count":0,"RecordAlarmCount":1816,"RecordAlarmCountHasSign":false},"DailyRewardSupplementGetConsumeItemId":106,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90032,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":1,"BuyLimitTimes":0,"ConsumeId":5,"ConsumeCount":28,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":300,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":20000580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":3,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50000840}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Monthly Pass C","Desc":"Daily Log-in gives 90 Black Cards","Icon":"CardC","UiType":2,"SignInId":0,"Tag":1,"Priority":0,"ClientResetInfo":{"ResetType":5,"DayCount":150},"IsUseMail":false,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":1712683208,"MutexPurchaseIds":[83028],"ConvertSwitch":28,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":{"Count":0,"RecordAlarmCount":1816,"RecordAlarmCountHasSign":false},"DailyRewardSupplementGetConsumeItemId":106,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90291,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":68,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":680,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005570}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50005,"Count":50,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":90031,"Count":2,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Serum Monthly Pass","Desc":"1 per day for 30 days","Icon":"UIMonthly1","UiType":2,"SignInId":0,"Tag":2,"Priority":5011,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":68,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0},{"Id":90292,"TimeToInvalid":0,"TimeToShelve":0,"TimeToUnShelve":0,"BuyTimes":0,"BuyLimitTimes":1,"ConsumeId":5,"ConsumeCount":119,"RewardGoodsList":[{"RewardType":1,"TemplateId":2,"Count":1190,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":50005580}],"DailyRewardGoodsList":[{"RewardType":1,"TemplateId":50003,"Count":90,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0},{"RewardType":1,"TemplateId":96004,"Count":1,"Level":0,"Quality":0,"Grade":0,"Breakthrough":0,"ConvertFrom":0,"IsGift":false,"RewardMulti":0,"Id":0}],"FirstRewardGoods":null,"ExtraRewardGoods":null,"DailyRewardRemainDay":0,"BuyLimitRemainDay":0,"IsDailyRewardGet":false,"Name":"Weapon R&D Monthly Pass","Desc":"1 per day for 30 days","Icon":"UIMonthly2","UiType":2,"SignInId":0,"Tag":2,"Priority":5012,"ClientResetInfo":{"ResetType":2,"DayCount":0},"IsUseMail":true,"NormalDiscounts":null,"DiscountCouponInfos":null,"DiscountShowStr":null,"LastBuyTime":0,"MutexPurchaseIds":null,"ConvertSwitch":119,"CanMultiply":false,"FashionLabel":null,"SkipId":0,"Conditions":null,"PrePurchaseId":0,"PurchaseSignInInfo":null,"SelectDataForClient":null,"CompanyPackage":0,"CompanyPackageCount":0,"DailyRewardSupplementGetData":null,"DailyRewardSupplementGetConsumeItemId":0,"TargetMonthlyCard":0,"MonthlyCardAddDailyCount":0}],"PurchaseComboInfoList":[]}}} \ No newline at end of file +{ + "SchemaVersion": 1, + "Purchases": [ + { + "Enabled": true, + "Id": 90842, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 0, + "ConsumeCount": 0, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 30013, + "Count": 10, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024560 + }, + { + "RewardType": 1, + "TemplateId": 31204, + "Count": 40, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024561 + }, + { + "RewardType": 1, + "TemplateId": 31104, + "Count": 16, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024562 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Lv.20 Meritorious Pack", + "Desc": "Lv.20 Meritorious Pack", + "Icon": "UIv300_24", + "UiType": 11, + "SignInId": 0, + "Tag": 10, + "Priority": 9400, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": [ + 1040000, + 770303 + ], + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90843, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 0, + "ConsumeCount": 0, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 30014, + "Count": 5, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024570 + }, + { + "RewardType": 1, + "TemplateId": 31204, + "Count": 160, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024571 + }, + { + "RewardType": 1, + "TemplateId": 31104, + "Count": 25, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024572 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Lv.40 Meritorious Pack", + "Desc": "Lv.40 Meritorious Pack", + "Icon": "UIv300_25", + "UiType": 11, + "SignInId": 0, + "Tag": 10, + "Priority": 9500, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": [ + 1040001, + 770303 + ], + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90844, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 0, + "ConsumeCount": 0, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 30014, + "Count": 20, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024580 + }, + { + "RewardType": 1, + "TemplateId": 31204, + "Count": 280, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024581 + }, + { + "RewardType": 1, + "TemplateId": 31104, + "Count": 35, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024582 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Lv.60 Meritorious Pack", + "Desc": "Lv.60 Meritorious Pack", + "Icon": "UIv300_26", + "UiType": 11, + "SignInId": 0, + "Tag": 10, + "Priority": 9600, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": [ + 1040002, + 770303 + ], + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90845, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 0, + "ConsumeCount": 0, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 94038, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024590 + }, + { + "RewardType": 1, + "TemplateId": 90015, + "Count": 5, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024591 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Lv.80 Meritorious Pack", + "Desc": "Lv.80 Meritorious Pack", + "Icon": "UIv300_27", + "UiType": 11, + "SignInId": 0, + "Tag": 10, + "Priority": 9700, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": [ + 1040003, + 770303 + ], + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90846, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 5, + "ConsumeId": 3, + "ConsumeCount": 500, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024600 + }, + { + "RewardType": 1, + "TemplateId": 30014, + "Count": 5, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024601 + }, + { + "RewardType": 1, + "TemplateId": 31204, + "Count": 90, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024602 + }, + { + "RewardType": 1, + "TemplateId": 12, + "Count": 70, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024603 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Construct Booster Pack", + "Desc": "Construct Booster Pack", + "Icon": "UIv300_28", + "UiType": 11, + "SignInId": 0, + "Tag": 2, + "Priority": 9800, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": [ + 770303 + ], + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90847, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 3, + "ConsumeId": 3, + "ConsumeCount": 500, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50003, + "Count": 500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024610 + }, + { + "RewardType": 1, + "TemplateId": 31104, + "Count": 25, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024611 + }, + { + "RewardType": 1, + "TemplateId": 60002, + "Count": 40, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024612 + }, + { + "RewardType": 1, + "TemplateId": 60001, + "Count": 60, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024613 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Weapon Booster Pack", + "Desc": "Weapon Booster Pack", + "Icon": "UIv300_29", + "UiType": 11, + "SignInId": 0, + "Tag": 2, + "Priority": 9900, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": [ + 770303 + ], + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90848, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 3, + "ConsumeId": 3, + "ConsumeCount": 500, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50009, + "Count": 500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024620 + }, + { + "RewardType": 1, + "TemplateId": 40301, + "Count": 80, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024621 + }, + { + "RewardType": 1, + "TemplateId": 1, + "Count": 300000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50024622 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "CUB Booster Pack", + "Desc": "CUB Booster Pack", + "Icon": "UIv300_30", + "UiType": 11, + "SignInId": 0, + "Tag": 2, + "Priority": 10000, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": [ + 770303 + ], + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 10007, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 24, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 250, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 690720 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "7-Day Boon", + "Desc": "Log in for 7 days in a row to claim rewards", + "Icon": "UIv405_1", + "UiType": 5, + "SignInId": 0, + "Tag": 1, + "Priority": 1, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 50121, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": { + "PurchaseSignInRewardInfos": [ + 69073, + 69074, + 69075, + 69076, + 69077, + 69078, + 69079 + ], + "PurchaseSignInShowId": 113, + "BetterIndexStr": "1|2" + }, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2059, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 128, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 4000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908640 + }, + { + "RewardType": 1, + "TemplateId": 70001, + "Count": 960, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908641 + }, + { + "RewardType": 1, + "TemplateId": 70002, + "Count": 160, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908642 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Anchored Starlight", + "Desc": "Anchored Starlight", + "Icon": "UIv405_2", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1000, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2060, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 299, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 5000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50036720 + }, + { + "RewardType": 1, + "TemplateId": 3, + "Count": 4000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50036721 + }, + { + "RewardType": 1, + "TemplateId": 3005, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50036722 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Guardians' Return", + "Desc": "Guardians' Return", + "Icon": "UIv405_3", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1100, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2061, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 600, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 10000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50036730 + }, + { + "RewardType": 1, + "TemplateId": 3, + "Count": 8500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50036731 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Vow of Valor", + "Desc": "Vow of Valor", + "Icon": "UIv405_4", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1200, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2062, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 68, + "RewardGoodsList": null, + "DailyRewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 250, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + { + "RewardType": 1, + "TemplateId": 90030, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Voyage Eternal", + "Desc": "Get 1 reward per day by mail over 10 days", + "Icon": "UIv405_5", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1300, + "ClientResetInfo": null, + "IsUseMail": true, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0, + "DailyRewardDays": 10 + }, + { + "Enabled": true, + "Id": 2063, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 2, + "ConsumeId": 5, + "ConsumeCount": 5, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 290, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50035770 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Inverse Crown R&D Ticket Special Offer", + "Desc": "Inverse Crown R&D Ticket Special Offer", + "Icon": "UIv405_6", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1400, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2064, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 28, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 1400, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50035780 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Inverse Crown Discounted R&D Ticket", + "Desc": "Inverse Crown Discounted R&D Ticket", + "Icon": "UIv405_7", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1500, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2065, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 68, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 2500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908690 + }, + { + "RewardType": 1, + "TemplateId": 3005, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908691 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Onward in Light", + "Desc": "Onward in Light", + "Icon": "UIv405_8", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1600, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2066, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 128, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 2500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908700 + }, + { + "RewardType": 1, + "TemplateId": 50003, + "Count": 1500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908701 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Kindred Farers", + "Desc": "Kindred Farers", + "Icon": "UIv405_9", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1700, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2067, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 299, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 5000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908710 + }, + { + "RewardType": 1, + "TemplateId": 3, + "Count": 5000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908711 + }, + { + "RewardType": 1, + "TemplateId": 70001, + "Count": 960, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908712 + }, + { + "RewardType": 1, + "TemplateId": 70002, + "Count": 160, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908713 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Oathbound Horizon", + "Desc": "Oathbound Horizon", + "Icon": "UIv405_10", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1800, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2068, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 30, + "RewardGoodsList": null, + "DailyRewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 120, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Radiant Crusade", + "Desc": "Get 1 reward per day by mail over 10 days", + "Icon": "UIv405_11", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 1900, + "ClientResetInfo": null, + "IsUseMail": true, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0, + "DailyRewardDays": 10 + }, + { + "Enabled": true, + "Id": 2069, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 98, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 2500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908720 + }, + { + "RewardType": 1, + "TemplateId": 29, + "Count": 300, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908721 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Deployment Support Black Box", + "Desc": "Deployment Support Black Box", + "Icon": "UIv405_12", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 2000, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2070, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 2, + "ConsumeId": 5, + "ConsumeCount": 128, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 3000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908730 + }, + { + "RewardType": 1, + "TemplateId": 70001, + "Count": 480, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908731 + }, + { + "RewardType": 1, + "TemplateId": 70002, + "Count": 80, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908732 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Victory Support Black Box", + "Desc": "Victory Support Black Box", + "Icon": "UIv405_13", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 2100, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2071, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 299, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50003, + "Count": 5000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908740 + }, + { + "RewardType": 1, + "TemplateId": 3002, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908741 + }, + { + "RewardType": 1, + "TemplateId": 50001, + "Count": 1000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908742 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Weapon Research Resonance Support Bundle", + "Desc": "Weapon Research Resonance Support Bundle", + "Icon": "UIv405_14", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 2200, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2072, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 600, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 10000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908750 + }, + { + "RewardType": 1, + "TemplateId": 3, + "Count": 5000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908751 + }, + { + "RewardType": 1, + "TemplateId": 3005, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908752 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Special Agent Support Black Box", + "Desc": "Special Agent Support Black Box", + "Icon": "UIv405_15", + "UiType": 5, + "SignInId": 0, + "Tag": 14, + "Priority": 2300, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 9, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 5, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 12, + "Count": 10, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900090 + }, + { + "RewardType": 1, + "TemplateId": 1, + "Count": 20000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900091 + } + ], + "DailyRewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50000, + "Count": 250, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Construct 10x R&D Pack -10d", + "Desc": "1 per day for 10 days", + "Icon": "Uio1rmb", + "UiType": 5, + "SignInId": 0, + "Tag": 2, + "Priority": 10000, + "ClientResetInfo": null, + "IsUseMail": true, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 11, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 69, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50000, + "Count": 2500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900110 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Construct 10x R&D Bundle", + "Desc": "Construct 10x R&D Bundle", + "Icon": "UioCDrew", + "UiType": 5, + "SignInId": 0, + "Tag": 1, + "Priority": 10200, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 12, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 69, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50003, + "Count": 2500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900120 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Weapon 10x R&D Bundle", + "Desc": "Weapon 10x R&D Bundle", + "Icon": "UioWDrew", + "UiType": 5, + "SignInId": 0, + "Tag": 1, + "Priority": 10300, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 21, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 3, + "ConsumeCount": 10, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 12, + "Count": 5, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900190 + }, + { + "RewardType": 1, + "TemplateId": 1, + "Count": 5000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900191 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Skill Pts Daily Pack", + "Desc": "Skill Pts Daily Pack", + "Icon": "UioJDay", + "UiType": 6, + "SignInId": 0, + "Tag": 0, + "Priority": 50100, + "ClientResetInfo": { + "ResetType": 0, + "DayCount": 0 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90289, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 20, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50005550 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Weekly Event R&D Bundle", + "Desc": "Weekly Event R&D Bundle", + "Icon": "UIWeekly1", + "UiType": 6, + "SignInId": 0, + "Tag": 1, + "Priority": 5001, + "ClientResetInfo": { + "ResetType": 1, + "DayCount": 0 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90290, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 20, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50003, + "Count": 500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50005560 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Weekly Weapon R&D Bundle", + "Desc": "Weekly Werpon R&D Bundle", + "Icon": "UIWeekly2", + "UiType": 6, + "SignInId": 0, + "Tag": 1, + "Priority": 5002, + "ClientResetInfo": { + "ResetType": 1, + "DayCount": 0 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90943, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 0, + "ConsumeCount": 0, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 90031, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50001670 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Serum Daily Supply", + "Desc": "Serum Daily Supply", + "Icon": "UioDay", + "UiType": 6, + "SignInId": 0, + "Tag": 10, + "Priority": 4500, + "ClientResetInfo": { + "ResetType": 0, + "DayCount": 0 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90944, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 0, + "ConsumeCount": 0, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 4, + "Count": 30, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50032900 + }, + { + "RewardType": 3, + "TemplateId": 2994001, + "Count": 1, + "Level": 1, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50032901 + }, + { + "RewardType": 3, + "TemplateId": 3944001, + "Count": 1, + "Level": 1, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50032902 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Weekly Limited Pack", + "Desc": "Weekly Limited Pack", + "Icon": "UioWeek", + "UiType": 6, + "SignInId": 0, + "Tag": 10, + "Priority": 5000, + "ClientResetInfo": { + "ResetType": 1, + "DayCount": 0 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 19, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 99, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 32, + "Count": 70, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900230 + }, + { + "RewardType": 1, + "TemplateId": 1, + "Count": 50000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900231 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Coating Blueprint Supply", + "Desc": "Coating Blueprint Supply", + "Icon": "UioPifuM", + "UiType": 7, + "SignInId": 0, + "Tag": 0, + "Priority": 30500, + "ClientResetInfo": { + "ResetType": 2, + "DayCount": 0 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 25, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 30, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 32, + "Count": 15, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900210 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Blueprint Bundle", + "Desc": "Blueprint Bundle", + "Icon": "UioSkinD", + "UiType": 7, + "SignInId": 0, + "Tag": 0, + "Priority": 30500, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 26, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 60, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 31, + "Count": 500, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900220 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Decor Coin Bundle", + "Desc": "Decor Coin Bundle", + "Icon": "UioFCoin", + "UiType": 7, + "SignInId": 0, + "Tag": 0, + "Priority": 50500, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2073, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 240, + "RewardGoodsList": [ + { + "RewardType": 4, + "TemplateId": 6006104, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908760 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Nightshroud Coronet", + "Desc": "Nightshroud Coronet", + "Icon": "UIv405_16", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 2400, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2074, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 40, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 80138, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908770 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Evernight Solitude", + "Desc": "Evernight Solitude", + "Icon": "UIv405_17", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 2500, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2075, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 240, + "RewardGoodsList": [ + { + "RewardType": 4, + "TemplateId": 6005505, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908780 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Stygian Pinion", + "Desc": "Stygian Pinion", + "Icon": "UIv405_18", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 2600, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2076, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 40, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 80136, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908790 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Nether Shade", + "Desc": "Nether Shade", + "Icon": "UIv405_19", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 2700, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2077, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 240, + "RewardGoodsList": [ + { + "RewardType": 4, + "TemplateId": 6004205, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 907300 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Infernal Deliverance", + "Desc": "Infernal Deliverance", + "Icon": "UIv405_20", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 2800, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2078, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 40, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 80116, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 907310 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Argent Requiem", + "Desc": "Argent Requiem", + "Icon": "UIv405_21", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 2900, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2079, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 240, + "RewardGoodsList": [ + { + "RewardType": 4, + "TemplateId": 6004506, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908201 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Chromatic ☆ Night", + "Desc": "Chromatic ☆ Night", + "Icon": "UIv405_22", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 3000, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 2080, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 40, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 80129, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 908210 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Iridescent Galaxy", + "Desc": "Iridescent Galaxy", + "Icon": "UIv405_23", + "UiType": 8, + "SignInId": 0, + "Tag": 15, + "Priority": 3100, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": { + "1": 7000 + }, + "DiscountShowStr": "7", + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 10, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 35, + "RewardGoodsList": [ + { + "RewardType": 4, + "TemplateId": 6310104, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 900100 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Tiara Coating Pack", + "Desc": "Tiara Coating Pack", + "Icon": "UioLifu", + "UiType": 8, + "SignInId": 0, + "Tag": 1, + "Priority": 30000, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 10004, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 12, + "RewardGoodsList": null, + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Beginner 3-Day Limited Supply", + "Desc": "Log in on the main interface for 3 days in a row to claim rewards", + "Icon": "UIv400_25", + "UiType": 15, + "SignInId": 0, + "Tag": 13, + "Priority": 102, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 50106, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": { + "PurchaseSignInRewardInfos": [ + 67151, + 67152, + 67153 + ], + "PurchaseSignInShowId": 98, + "BetterIndexStr": "1|3" + }, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 1968, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 5, + "RewardGoodsList": [ + { + "RewardType": 2, + "TemplateId": 1171004, + "Count": 1, + "Level": 1, + "Quality": 3, + "Grade": 1, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 671500 + }, + { + "RewardType": 1, + "TemplateId": 90002, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 671501 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Beginner S-Rank Limited Supply", + "Desc": "Beginner S-Rank Limited Supply", + "Icon": "UIv400_26", + "UiType": 15, + "SignInId": 0, + "Tag": 13, + "Priority": 101, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 1969, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 48, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 95006, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 671540 + }, + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 1000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 671541 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Beginner Monthly Pass Combo Supply", + "Desc": "Monthly Pass Plus", + "Icon": "UIv400_27", + "UiType": 15, + "SignInId": 0, + "Tag": 13, + "Priority": 103, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": [ + 90032 + ], + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 83028, + "CompanyPackageCount": 1, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 83028, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 30, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 300, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 20000580 + } + ], + "DailyRewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 3, + "Count": 100, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 20001020 + } + ], + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Monthly Pass A", + "Desc": "Daily Log-in gives 100 Black Cards", + "Icon": "Card", + "UiType": 2, + "SignInId": 0, + "Tag": 1, + "Priority": 0, + "ClientResetInfo": { + "ResetType": 5, + "DayCount": 150 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": [ + 90032 + ], + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 106, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90032, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 28, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 300, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 20000580 + } + ], + "DailyRewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 3, + "Count": 90, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50000840 + } + ], + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Monthly Pass C", + "Desc": "Daily Log-in gives 90 Black Cards", + "Icon": "CardC", + "UiType": 2, + "SignInId": 0, + "Tag": 1, + "Priority": 0, + "ClientResetInfo": { + "ResetType": 5, + "DayCount": 150 + }, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": [ + 83028 + ], + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 106, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90291, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 68, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 680, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50005570 + } + ], + "DailyRewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50005, + "Count": 50, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + { + "RewardType": 1, + "TemplateId": 90031, + "Count": 2, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Serum Monthly Pass", + "Desc": "1 per day for 30 days", + "Icon": "UIMonthly1", + "UiType": 2, + "SignInId": 0, + "Tag": 2, + "Priority": 5011, + "ClientResetInfo": { + "ResetType": 2, + "DayCount": 0 + }, + "IsUseMail": true, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 90292, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 1, + "ConsumeId": 5, + "ConsumeCount": 119, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 1190, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 50005580 + } + ], + "DailyRewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 50003, + "Count": 90, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + { + "RewardType": 1, + "TemplateId": 96004, + "Count": 1, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": "Weapon R&D Monthly Pass", + "Desc": "1 per day for 30 days", + "Icon": "UIMonthly2", + "UiType": 2, + "SignInId": 0, + "Tag": 2, + "Priority": 5012, + "ClientResetInfo": { + "ResetType": 2, + "DayCount": 0 + }, + "IsUseMail": true, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 100, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 1, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 10, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": null, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 10 Black Cards", + "Icon": "UiPurchaseIconDh1", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 1, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 101, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 5, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 50, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 50, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 50 Black Cards", + "Icon": "UiPurchaseIconDh5", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 2, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 102, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 28, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 280, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 280, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 280 Black Cards", + "Icon": "UiPurchaseIconDh28", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 3, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 103, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 34, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 340, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 340, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 340 Black Cards", + "Icon": "UiPurchaseIconDh34", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 4, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 104, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 59, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 590, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 590, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 590 Black Cards", + "Icon": "UiPurchaseIconDh59", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 5, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 105, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 71, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 710, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 710, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 710 Black Cards", + "Icon": "UiPurchaseIconDh71", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 6, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 106, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 119, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 1190, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 1190, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 1190 Black Cards", + "Icon": "UiPurchaseIconDh119", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 7, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 107, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 299, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 2990, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 2990, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 2990 Black Cards", + "Icon": "UiPurchaseIconDh299", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 8, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + }, + { + "Enabled": true, + "Id": 108, + "TimeToInvalid": 0, + "TimeToShelve": 0, + "TimeToUnShelve": 0, + "BuyLimitTimes": 0, + "ConsumeId": 5, + "ConsumeCount": 600, + "RewardGoodsList": [ + { + "RewardType": 1, + "TemplateId": 2, + "Count": 6000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + } + ], + "DailyRewardGoodsList": null, + "FirstRewardGoods": { + "RewardType": 1, + "TemplateId": 3, + "Count": 6000, + "Level": 0, + "Quality": 0, + "Grade": 0, + "Breakthrough": 0, + "ConvertFrom": 0, + "IsGift": false, + "RewardMulti": 0, + "Id": 0 + }, + "ExtraRewardGoods": null, + "Name": null, + "Desc": "Buy 6000 Black Cards", + "Icon": "UiPurchaseIconDh600", + "UiType": 3, + "SignInId": 0, + "Tag": 0, + "Priority": 9, + "ClientResetInfo": null, + "IsUseMail": false, + "NormalDiscounts": null, + "DiscountShowStr": null, + "MutexPurchaseIds": null, + "CanMultiply": false, + "FashionLabel": null, + "SkipId": 0, + "Conditions": null, + "PrePurchaseId": 0, + "PurchaseSignInInfo": null, + "SelectDataForClient": null, + "CompanyPackage": 0, + "CompanyPackageCount": 0, + "DailyRewardSupplementGetConsumeItemId": 0, + "TargetMonthlyCard": 0, + "MonthlyCardAddDailyCount": 0 + } + ] +} diff --git a/Resources/Configs/purchase-rules-source.md b/Resources/Configs/purchase-rules-source.md new file mode 100644 index 00000000..7e6046ea --- /dev/null +++ b/Resources/Configs/purchase-rules-source.md @@ -0,0 +1,87 @@ +# Purchase rule sources + +## Server-owned supply-pack catalog + +The maintainer explicitly authorized preserving the existing static package +definitions as local server configuration, removing inherited sales expiration +limits, and using authoritative reward-item icons if the original artwork is +missing. They confirmed that package listing, delisting and pricing must be +owned by the emulated server, as those definitions are not shipped in the client. + +`client_purchases.json` now contains `SchemaVersion: 1` and a single `Purchases` +array (58 unique packages). Duplicate response records agreed on all static +fields; only player fields differed. The migration discarded those player +fields and set all three inherited sales timestamps to zero. It does not +introduce guessed v4.7 package definitions or renumber old artwork. + +Edit a package in this file, then restart the server (no client update needed): + +- `Id` is unique; `UiType` selects its store tab. +- `Enabled: false` removes it from lists and prevents direct purchases. +- `ConsumeId` and `ConsumeCount` define currency and base price. +- `NormalDiscounts` maps the one-based purchase number to basis points. The + latest applicable tier is used, with integer rounding down, matching + `XPurchaseManager.GetLBDiscountValue`. Keep the client's discount tag for + discounted offers. Coupon and ownership-based price reductions are not enabled. +- `TimeToShelve`, `TimeToUnShelve`, `TimeToInvalid` are UTC Unix seconds; + zero means unrestricted. Future packages retain the client's countdown; + ended packages are omitted, and direct purchases are rejected at the same + boundary. Setting a new schedule does not reset a player's purchase history. +- `BuyLimitTimes` and `ClientResetInfo` define limits; current usage is derived + from persisted counts and purchase times. Monthly/sign-in reward duration is + independent of these sales timestamps. +- `DailyRewardDays`, where present, defines the static daily-mail term. The + adopted descriptions of Voyage Eternal and Radiant Crusade explicitly say + "Get 1 reward per day by mail over 10 days"; both now configure 10 days. + This is not a captured remaining-day value. Other packages continue to use + the existing duration table, monthly rules or sign-in reward sequence. + +The loader rejects duplicate IDs, legacy response snapshots and player-state +fields. `ConvertSwitch` follows the current base price, so a price edit cannot +leave the old captured price on the client. No production code reads decoded +traffic, research dumps or installed client files. + +## Client artwork compatibility + +The installed 4.7 client's resource index has no `UiPurchaseV405` bundle. +Some old icon mappings (including shared artwork and coating covers) still +resolve, so changing `UIv405_N` to `UIv407_N` is incorrect. + +`Scripts/patch_local_store.py --catalog` extends the existing reversible +recharge patch. The shared purchase icon resolver receives the package's reward +list, keeps available artwork/covers, and resolves the first available reward +icon through `XGoodsCommonManager.GetGoodsIcon` and the installed resource +index. Lists, purchase details and recommendation/combo views share this +resolver. Sold-out/expired overlays clear the ownership overlay on refresh and +timer transitions. No specific package IDs or image paths are patched. + +Prepare into a new empty backup directory while retaining any existing recharge +patch; inspect the manifest, then apply while PGR is closed: + +```powershell +python Scripts/patch_local_store.py --game-dir '' --output .runtime/store-catalog-client-patch --catalog +python Scripts/patch_local_store.py --output .runtime/store-catalog-client-patch --apply +# Restore the exact pre-catalog bundle (including any earlier recharge patch): +python Scripts/patch_local_store.py --output .runtime/store-catalog-client-patch --restore +``` + +Server checks: `dotnet run --project AscNet.Test -- --store-purchases-only`. +Client checks (requires `lupa`, plus the patch script dependencies): +`python -m unittest Scripts.test_store_catalog_patch`. Set `PGR_RESEARCH_LUA` +to the exported `PGR_DATA/en/lua/matrix` directory to also run syntax checks +and real list timer/overlay tests against that client version. + +## Daily reward rules + +`table/share/pay/PurchaseDailyDuration.tsv` is an explicit local-server +configuration, not a recovered retail table. On 2026-09-10 the maintainer +authorized the Construct 10x R&D Pack -10d (package 9) to last 10 days: +“同意,按 10 天配置”. Runtime resolves the duration by package ID and derives +the remaining days from persisted entitlement state and the server reset clock. +Unknown non-monthly daily packages still require a configured duration. + +Companion monthly-pass grants bypass the direct renewal cap. This follows the +installed EN client's `Text.tab`, key `PurchaseMonthPlusDesc`: the beginner +combo remains purchasable with six active passes and extends their term. +The combo's own one-time purchase limit and mutually exclusive pass checks +still apply. Direct monthly renewals retain their existing cap. diff --git a/Resources/table/client/config/StoreClientConfig.tsv b/Resources/table/client/config/StoreClientConfig.tsv new file mode 100644 index 00000000..d8a03d82 --- /dev/null +++ b/Resources/table/client/config/StoreClientConfig.tsv @@ -0,0 +1,6 @@ +Key Type Value +PurchaseYKLimtCount int 30 +PurchaseYKTotalCount int 6 +PurchaseYKTotalCountWeek int 1 +PurchaseYKTotalCountDay int 1 +PurchaseYKLimtCountWeek int 7 diff --git a/Resources/table/share/item/BuyAsset.tsv b/Resources/table/share/item/BuyAsset.tsv new file mode 100644 index 00000000..031193e1 --- /dev/null +++ b/Resources/table/share/item/BuyAsset.tsv @@ -0,0 +1,577 @@ +Id DailyLimit TotalLimit BuyLimit TimeId Config[1] Config[2] Config[3] Config[4] Config[5] Config[6] Config[7] Config[8] Config[9] Config[10] ExchangeType CanMutiply AutoClose IsRestrictFreeBuy ItemCombineGroupId +1 20 0 0 0 1 2 3 4 5 6 7 1 1 0 0 0 +4 10 0 0 0 101 102 103 104 105 106 107 108 109 110 1 1 0 0 0 +50000 0 0 0 0 12 1 1 1 1 0 +50001 0 0 0 0 13 1 1 1 1 0 +50002 0 0 0 0 14 1 1 1 1 0 +50003 0 0 0 0 15 1 1 1 1 1 +50004 0 0 0 0 16 1 1 1 1 0 +50005 0 0 0 0 17 1 1 1 1 0 +50007 0 0 0 0 18 1 1 1 1 0 +50008 0 0 0 0 19 1 1 1 1 0 +50009 0 0 0 0 20 1 1 1 1 0 +50010 0 0 0 0 21 1 1 1 1 0 +50011 0 0 0 0 22 1 1 1 1 0 +50012 0 0 0 0 23 1 1 1 1 0 +50013 0 0 0 0 24 1 1 1 1 0 +50014 0 0 0 0 25 1 1 1 1 0 +50015 0 0 0 0 26 1 1 1 1 0 +50016 0 0 0 0 27 1 1 1 1 0 +38 0 0 0 0 201 1 1 0 0 0 +2017 0 0 0 0 2017 2 2 1 0 0 +2018 0 0 0 0 2018 2 2 1 0 0 +2019 0 0 0 0 2019 2 2 1 0 0 +2020 0 0 0 0 2020 2 2 1 0 0 +2021 0 0 0 0 2021 2 2 1 0 0 +2022 0 0 0 0 2022 2 2 1 0 0 +2023 0 0 0 0 2023 2 2 1 0 0 +2024 0 0 0 0 2024 2 2 1 0 0 +2025 0 0 0 0 2025 2 2 1 0 0 +2026 0 0 0 0 2026 2 2 1 0 0 +2027 0 0 0 0 2027 2 2 1 0 0 +2028 0 0 0 0 2028 2 2 1 0 0 +2029 0 0 0 0 2029 2 2 1 0 0 +2030 0 0 0 0 2030 2 2 1 0 0 +2031 0 0 0 0 2031 2 2 1 0 0 +2032 0 0 0 0 2032 2 2 1 0 0 +2033 0 0 0 0 2033 2 2 1 0 0 +2034 0 0 0 0 2034 2 2 1 0 0 +2035 0 0 0 0 2035 2 2 1 0 0 +2036 0 0 0 0 2036 2 2 1 0 0 +2037 0 0 0 0 2037 2 2 1 0 0 +2038 0 0 0 0 2038 2 2 1 0 0 +2039 0 0 0 0 2039 2 2 1 0 0 +2040 0 0 0 0 2040 2 2 1 0 0 +2041 0 0 0 0 2041 2 2 1 0 0 +2042 0 0 0 0 2042 2 2 1 0 0 +2043 0 0 0 0 2043 2 2 1 0 0 +2044 0 0 0 0 2044 2 2 1 0 0 +2045 0 0 0 0 2045 2 2 1 0 0 +2046 0 0 0 0 2046 2 2 1 0 0 +2047 0 0 0 0 2047 2 2 1 0 0 +2048 0 0 0 0 2048 2 2 1 0 0 +2049 0 0 0 0 2049 2 2 1 0 0 +2050 0 0 0 0 2050 2 2 1 0 0 +2051 0 0 0 0 2051 2 2 1 0 0 +2052 0 0 0 0 2052 2 2 1 0 0 +2053 0 0 0 0 2053 2 2 1 0 0 +2054 0 0 0 0 2054 2 2 1 0 0 +2081 0 0 0 0 2081 2 2 1 0 0 +2083 0 0 0 0 2083 2 2 1 0 0 +2084 0 0 0 0 2084 2 2 1 0 0 +2085 0 0 0 0 2085 2 2 1 0 0 +2086 0 0 0 0 2086 2 2 1 0 0 +2087 0 0 0 0 2087 2 2 1 0 0 +2088 0 0 0 0 2088 2 2 1 0 0 +2089 0 0 0 0 2089 2 2 1 0 0 +2090 0 0 0 0 2090 2 2 1 0 0 +2091 0 0 0 0 2091 2 2 1 0 0 +2092 0 0 0 0 2092 2 2 1 0 0 +2093 0 0 0 0 2093 2 2 1 0 0 +2094 0 0 0 0 2094 2 2 1 0 0 +2095 0 0 0 0 2095 2 2 1 0 0 +2096 0 0 0 0 2096 2 2 1 0 0 +2097 0 0 0 0 2097 2 2 1 0 0 +2098 0 0 0 0 2098 2 2 1 0 0 +2099 0 0 0 0 2099 2 2 1 0 0 +2100 0 0 0 0 2100 2 2 1 0 0 +2101 0 0 0 0 2101 2 2 1 0 0 +2102 0 0 0 0 2102 2 2 1 0 0 +2116 0 0 0 0 2116 2 2 1 0 0 +2117 0 0 0 0 2117 2 2 1 0 0 +2118 0 0 0 0 2118 2 2 1 0 0 +2119 0 0 0 0 2119 2 2 1 0 0 +2120 0 0 0 0 2120 2 2 1 0 0 +2121 0 0 0 0 2121 2 2 1 0 0 +2122 0 0 0 0 2122 2 2 1 0 0 +2123 0 0 0 0 2123 2 2 1 0 0 +2124 0 0 0 0 2124 2 2 1 0 0 +2125 0 0 0 0 2125 2 2 1 0 0 +2126 0 0 0 0 2126 2 2 1 0 0 +2127 0 0 0 0 2127 2 2 1 0 0 +2128 0 0 0 0 2128 2 2 1 0 0 +2129 0 0 0 0 2129 2 2 1 0 0 +2130 0 0 0 0 2130 2 2 1 0 0 +2131 0 0 0 0 2131 2 2 1 0 0 +2132 0 0 0 0 2132 2 2 1 0 0 +2133 0 0 0 0 2133 2 2 1 0 0 +2134 0 0 0 0 2134 2 2 1 0 0 +2135 0 0 0 0 2135 2 2 1 0 0 +2136 0 0 0 0 2136 2 2 1 0 0 +2137 0 0 0 0 2137 2 2 1 0 0 +2138 0 0 0 0 2138 2 2 1 0 0 +2139 0 0 0 0 2139 2 2 1 0 0 +2140 0 0 0 0 2140 2 2 1 0 0 +2141 0 0 0 0 2141 2 2 1 0 0 +2142 0 0 0 0 2142 2 2 1 0 0 +2143 0 0 0 0 2143 2 2 1 0 0 +2144 0 0 0 0 2144 2 2 1 0 0 +2145 0 0 0 0 2145 2 2 1 0 0 +2146 0 0 0 0 2146 2 2 1 0 0 +2147 0 0 0 0 2147 2 2 1 0 0 +2148 0 0 0 0 2148 2 2 1 0 0 +2149 0 0 0 0 2149 2 2 1 0 0 +2150 0 0 0 0 2150 2 2 1 0 0 +2151 0 0 0 0 2151 2 2 1 0 0 +2152 0 0 0 0 2152 2 2 1 0 0 +2153 0 0 0 0 2153 2 2 1 0 0 +2154 0 0 0 0 2154 2 2 1 0 0 +2155 0 0 0 0 2155 2 2 1 0 0 +2156 0 0 0 0 2156 2 2 1 0 0 +2157 0 0 0 0 2157 2 2 1 0 0 +2158 0 0 0 0 2158 2 2 1 0 0 +2159 0 0 0 0 2159 2 2 1 0 0 +2160 0 0 0 0 2160 2 2 1 0 0 +2161 0 0 0 0 2161 2 2 1 0 0 +2162 0 0 0 0 2162 2 2 1 0 0 +2163 0 0 0 0 2163 2 2 1 0 0 +2164 0 0 0 0 2164 2 2 1 0 0 +2165 0 0 0 0 2165 2 2 1 0 0 +2166 0 0 0 0 2166 2 2 1 0 0 +2167 0 0 0 0 2167 2 2 1 0 0 +2168 0 0 0 0 2168 2 2 1 0 0 +2169 0 0 0 0 2169 2 2 1 0 0 +2170 0 0 0 0 2170 2 2 1 0 0 +2171 0 0 0 0 2171 2 2 1 0 0 +2172 0 0 0 0 2172 2 2 1 0 0 +2173 0 0 0 0 2173 2 2 1 0 0 +2174 0 0 0 0 2174 2 2 1 0 0 +2175 0 0 0 0 2175 2 2 1 0 0 +2176 0 0 0 0 2176 2 2 1 0 0 +2177 0 0 0 0 2177 2 2 1 0 0 +2178 0 0 0 0 2178 2 2 1 0 0 +2179 0 0 0 0 2179 2 2 1 0 0 +2180 0 0 0 0 2180 2 2 1 0 0 +2181 0 0 0 0 2181 2 2 1 0 0 +2182 0 0 0 0 2182 2 2 1 0 0 +2183 0 0 0 0 2183 2 2 1 0 0 +2184 0 0 0 0 2184 2 2 1 0 0 +2185 0 0 0 0 2185 2 2 1 0 0 +2186 0 0 0 0 2186 2 2 1 0 0 +2187 0 0 0 0 2187 2 2 1 0 0 +2188 0 0 0 0 2188 2 2 1 0 0 +2189 0 0 0 0 2189 2 2 1 0 0 +2190 0 0 0 0 2190 2 2 1 0 0 +2195 0 0 0 0 2195 2 2 1 0 0 +2196 0 0 0 0 2196 2 2 1 0 0 +2197 0 0 0 0 2197 2 2 1 0 0 +2198 0 0 0 0 2198 2 2 1 0 0 +2199 0 0 0 0 2199 2 2 1 0 0 +2200 0 0 0 0 2200 2 2 1 0 0 +2201 0 0 0 0 2201 2 2 1 0 0 +2202 0 0 0 0 2202 2 2 1 0 0 +2203 0 0 0 0 2203 2 2 1 0 0 +2204 0 0 0 0 2204 2 2 1 0 0 +2205 0 0 0 0 2205 2 2 1 0 0 +2206 0 0 0 0 2206 2 2 1 0 0 +2207 0 0 0 0 2207 2 2 1 0 0 +2208 0 0 0 0 2208 2 2 1 0 0 +2209 0 0 0 0 2209 2 2 1 0 0 +2210 0 0 0 0 2210 2 2 1 0 0 +2212 0 0 0 0 2212 2 2 1 0 0 +2213 0 0 0 0 2213 2 2 1 0 0 +2214 0 0 0 0 2214 2 2 1 0 0 +2215 0 0 0 0 2215 2 2 1 0 0 +2216 0 0 0 0 2216 2 2 1 0 0 +2217 0 0 0 0 2217 2 2 1 0 0 +2218 0 0 0 0 2218 2 2 1 0 0 +2219 0 0 0 0 2219 2 2 1 0 0 +2220 0 0 0 0 2220 2 2 1 0 0 +2221 0 0 0 0 2221 2 2 1 0 0 +2222 0 0 0 0 2222 2 2 1 0 0 +2223 0 0 0 0 2223 2 2 1 0 0 +2224 0 0 0 0 2224 2 2 1 0 0 +2225 0 0 0 0 2225 2 2 1 0 0 +2261 0 0 0 0 2261 2 2 1 0 0 +2262 0 0 0 0 2262 2 2 1 0 0 +2263 0 0 0 0 2263 2 2 1 0 0 +2264 0 0 0 0 2264 2 2 1 0 0 +2265 0 0 0 0 2265 2 2 1 0 0 +2266 0 0 0 0 2266 2 2 1 0 0 +2267 0 0 0 0 2267 2 2 1 0 0 +2268 0 0 0 0 2268 2 2 1 0 0 +2269 0 0 0 0 2269 2 2 1 0 0 +2270 0 0 0 0 2270 2 2 1 0 0 +2271 0 0 0 0 2271 2 2 1 0 0 +2272 0 0 0 0 2272 2 2 1 0 0 +2273 0 0 0 0 2273 2 2 1 0 0 +2274 0 0 0 0 2274 2 2 1 0 0 +2275 0 0 0 0 2275 2 2 1 0 0 +2276 0 0 0 0 2276 2 2 1 0 0 +2277 0 0 0 0 2277 2 2 1 0 0 +2321 0 0 0 0 2321 2 2 1 0 0 +2322 0 0 0 0 2322 2 2 1 0 0 +2323 0 0 0 0 2323 2 2 1 0 0 +2324 0 0 0 0 2324 2 2 1 0 0 +2325 0 0 0 0 2325 2 2 1 0 0 +2326 0 0 0 0 2326 2 2 1 0 0 +2327 0 0 0 0 2327 2 2 1 0 0 +2328 0 0 0 0 2328 2 2 1 0 0 +2329 0 0 0 0 2329 2 2 1 0 0 +2330 0 0 0 0 2330 2 2 1 0 0 +2331 0 0 0 0 2331 2 2 1 0 0 +2332 0 0 0 0 2332 2 2 1 0 0 +2333 0 0 0 0 2333 2 2 1 0 0 +2334 0 0 0 0 2334 2 2 1 0 0 +2335 0 0 0 0 2335 2 2 1 0 0 +2336 0 0 0 0 2336 2 2 1 0 0 +2337 0 0 0 0 2337 2 2 1 0 0 +2338 0 0 0 0 2338 2 2 1 0 0 +2339 0 0 0 0 2339 2 2 1 0 0 +2350 0 0 0 0 2350 2 2 1 0 0 +2351 0 0 0 0 2351 2 2 1 0 0 +2352 0 0 0 0 2352 2 2 1 0 0 +2354 0 0 0 0 2354 2 2 1 0 0 +2355 0 0 0 0 2355 2 2 1 0 0 +2356 0 0 0 0 2356 2 2 1 0 0 +2357 0 0 0 0 2357 2 2 1 0 0 +2358 0 0 0 0 2358 2 2 1 0 0 +2359 0 0 0 0 2359 2 2 1 0 0 +2360 0 0 0 0 2360 2 2 1 0 0 +2361 0 0 0 0 2361 2 2 1 0 0 +2362 0 0 0 0 2362 2 2 1 0 0 +2363 0 0 0 0 2363 2 2 1 0 0 +2364 0 0 0 0 2364 2 2 1 0 0 +2365 0 0 0 0 2365 2 2 1 0 0 +2366 0 0 0 0 2366 2 2 1 0 0 +2367 0 0 0 0 2367 2 2 1 0 0 +2368 0 0 0 0 2368 2 2 1 0 0 +2369 0 0 0 0 2369 2 2 1 0 0 +62901 5 0 0 0 629011 629012 629013 629014 629015 1 1 0 0 0 +63001 0 50 0 0 63001 2 2 1 0 0 +50104 0 1000 0 0 50104 2 2 1 0 0 +32002 0 135 135 0 32002 2 2 1 0 0 +32003 0 135 135 0 32003 2 2 1 0 0 +32004 0 135 135 0 32004 2 2 1 0 0 +32005 0 135 135 0 32005 2 2 1 0 0 +32006 0 135 135 0 32006 2 2 1 0 0 +32007 0 135 135 0 32007 2 2 1 0 0 +32008 0 135 135 0 32008 2 2 1 0 0 +32009 0 135 135 0 32009 2 2 1 0 0 +32010 0 135 135 0 32010 2 2 1 0 0 +32011 0 135 135 0 32011 2 2 1 0 0 +32012 0 135 135 0 32012 2 2 1 0 0 +32013 0 135 135 0 32013 2 2 1 0 0 +32014 0 135 135 0 32014 2 2 1 0 0 +32015 0 135 135 0 32015 2 2 1 0 0 +32016 0 135 135 0 32016 2 2 1 0 0 +32017 0 135 135 0 32017 2 2 1 0 0 +32018 0 135 135 0 32018 2 2 1 0 0 +32019 0 135 135 0 32019 2 2 1 0 0 +32020 0 135 135 0 32020 2 2 1 0 0 +32021 0 135 135 0 32021 2 2 1 0 0 +33002 0 135 135 0 33002 2 2 1 0 0 +33003 0 135 135 0 33003 2 2 1 0 0 +33004 0 135 135 0 33004 2 2 1 0 0 +33005 0 135 135 0 33005 2 2 1 0 0 +33006 0 135 135 0 33006 2 2 1 0 0 +33007 0 135 135 0 33007 2 2 1 0 0 +33008 0 135 135 0 33008 2 2 1 0 0 +97009 0 0 0 0 97009 2 2 1 0 0 +2391 0 0 0 0 2391 2 2 1 0 0 +2392 0 0 0 0 2392 2 2 1 0 0 +2393 0 0 0 0 2393 2 2 1 0 0 +2394 0 0 0 0 2394 2 2 1 0 0 +2395 0 0 0 0 2395 2 2 1 0 0 +2396 0 0 0 0 2396 2 2 1 0 0 +2397 0 0 0 0 2397 2 2 1 0 0 +2398 0 0 0 0 2398 2 2 1 0 0 +2399 0 0 0 0 2399 2 2 1 0 0 +2400 0 0 0 0 2400 2 2 1 0 0 +2422 0 0 0 0 2422 2 2 1 0 0 +2423 0 0 0 0 2423 2 2 1 0 0 +2424 0 0 0 0 2424 2 2 1 0 0 +2425 0 0 0 0 2425 2 2 1 0 0 +2426 0 0 0 0 2426 2 2 1 0 0 +2427 0 0 0 0 2427 2 2 1 0 0 +2428 0 0 0 0 2428 2 2 1 0 0 +2429 0 0 0 0 2429 2 2 1 0 0 +2430 0 0 0 0 2430 2 2 1 0 0 +2431 0 0 0 0 2431 2 2 1 0 0 +2434 0 0 0 0 2434 2 2 1 0 0 +2435 0 0 0 0 2435 2 2 1 0 0 +2436 0 0 0 0 2436 2 2 1 0 0 +2437 0 0 0 0 2437 2 2 1 0 0 +2438 0 0 0 0 2438 2 2 1 0 0 +2439 0 0 0 0 2439 2 2 1 0 0 +2440 0 0 0 0 2440 2 2 1 0 0 +2441 0 0 0 0 2441 2 2 1 0 0 +2442 0 0 0 0 2442 2 2 1 0 0 +2443 0 0 0 0 2443 2 2 1 0 0 +2444 0 0 0 0 2444 2 2 1 0 0 +2445 0 0 0 0 2445 2 2 1 0 0 +2448 0 0 0 0 2448 2 2 1 0 0 +2449 0 0 0 0 2449 2 2 1 0 0 +2450 0 0 0 0 2450 2 2 1 0 0 +2451 0 0 0 0 2451 2 2 1 0 0 +2452 0 0 0 0 2452 2 2 1 0 0 +2453 0 0 0 0 2453 2 2 1 0 0 +2454 0 0 0 0 2454 2 2 1 0 0 +2455 0 0 0 0 2455 2 2 1 0 0 +2456 0 0 0 0 2456 2 2 1 0 0 +2457 0 0 0 0 2457 2 2 1 0 0 +2458 0 0 0 0 2458 2 2 1 0 0 +2478 0 0 0 0 2478 2 2 1 0 0 +2479 0 0 0 0 2479 2 2 1 0 0 +2480 0 0 0 0 2480 2 2 1 0 0 +2481 0 0 0 0 2481 2 2 1 0 0 +2482 0 0 0 0 2482 2 2 1 0 0 +2483 0 0 0 0 2483 2 2 1 0 0 +2484 0 0 0 0 2484 2 2 1 0 0 +2485 0 0 0 0 2485 2 2 1 0 0 +2486 0 0 0 0 2486 2 2 1 0 0 +2487 0 0 0 0 2487 2 2 1 0 0 +2488 0 0 0 0 2488 2 2 1 0 0 +2489 0 0 0 0 2489 2 2 1 0 0 +2554 0 0 0 0 2554 2 2 1 0 0 +2555 0 0 0 0 2555 2 2 1 0 0 +2556 0 0 0 0 2556 2 2 1 0 0 +2557 0 0 0 0 2557 2 2 1 0 0 +2558 0 0 0 0 2558 2 2 1 0 0 +2559 0 0 0 0 2559 2 2 1 0 0 +2560 0 0 0 0 2560 2 2 1 0 0 +2561 0 0 0 0 2561 2 2 1 0 0 +2562 0 0 0 0 2562 2 2 1 0 0 +2563 0 0 0 0 2563 2 2 1 0 0 +2565 0 0 0 0 2565 2 2 1 0 0 +2566 0 0 0 0 2566 2 2 1 0 0 +2567 0 0 0 0 2567 2 2 1 0 0 +2568 0 0 0 0 2568 2 2 1 0 0 +2569 0 0 0 0 2569 2 2 1 0 0 +2570 0 0 0 0 2570 2 2 1 0 0 +2571 0 0 0 0 2571 2 2 1 0 0 +2572 0 0 0 0 2572 2 2 1 0 0 +2573 0 0 0 0 2573 2 2 1 0 0 +2574 0 0 0 0 2574 2 2 1 0 0 +2576 0 0 0 0 2576 2 2 1 0 0 +2577 0 0 0 0 2577 2 2 1 0 0 +2578 0 0 0 0 2578 2 2 1 0 0 +2579 0 0 0 0 2579 2 2 1 0 0 +2580 0 0 0 0 2580 2 2 1 0 0 +2581 0 0 0 0 2581 2 2 1 0 0 +2582 0 0 0 0 2582 2 2 1 0 0 +2583 0 0 0 0 2583 2 2 1 0 0 +2584 0 0 0 0 2584 2 2 1 0 0 +2585 0 0 0 0 2585 2 2 1 0 0 +2586 0 0 0 0 2586 2 2 1 0 0 +2587 0 0 0 0 2587 2 2 1 0 0 +2593 0 0 0 0 2593 2 2 1 0 0 +2594 0 0 0 0 2594 2 2 1 0 0 +2595 0 0 0 0 2595 2 2 1 0 0 +2596 0 0 0 0 2596 2 2 1 0 0 +2597 0 0 0 0 2597 2 2 1 0 0 +2606 0 0 0 0 2606 2 2 1 0 0 +2598 0 0 0 0 2598 2 2 1 0 0 +2599 0 0 0 0 2599 2 2 1 0 0 +2600 0 0 0 0 2600 2 2 1 0 0 +2601 0 0 0 0 2601 2 2 1 0 0 +2602 0 0 0 0 2602 2 2 1 0 0 +2603 0 0 0 0 2603 2 2 1 0 0 +2631 0 0 0 0 2631 2 2 1 0 0 +2632 0 0 0 0 2632 2 2 1 0 0 +2633 0 0 0 0 2633 2 2 1 0 0 +2634 0 0 0 0 2634 2 2 1 0 0 +2635 0 0 0 0 2635 2 2 1 0 0 +2636 0 0 0 0 2636 2 2 1 0 0 +2637 0 0 0 0 2637 2 2 1 0 0 +2638 0 0 0 0 2638 2 2 1 0 0 +2639 0 0 0 0 2639 2 2 1 0 0 +2640 0 0 0 0 2640 2 2 1 0 0 +2641 0 0 0 0 2641 2 2 1 0 0 +2642 0 0 0 0 2642 2 2 1 0 0 +2643 0 0 0 0 2643 2 2 1 0 0 +2644 0 0 0 0 2644 2 2 1 0 0 +2645 0 0 0 0 2645 2 2 1 0 0 +2646 0 0 0 0 2646 2 2 1 0 0 +2647 0 0 0 0 2647 2 2 1 0 0 +2648 0 0 0 0 2648 2 2 1 0 0 +2649 0 0 0 0 2649 2 2 1 0 0 +2650 0 0 0 0 2650 2 2 1 0 0 +2651 0 0 0 0 2651 2 2 1 0 0 +2652 0 0 0 0 2652 2 2 1 0 0 +2653 0 0 0 0 2653 2 2 1 0 0 +2654 0 0 0 0 2654 2 2 1 0 0 +2655 0 0 0 0 2655 2 2 1 0 0 +2680 0 0 0 0 2680 2 2 1 0 0 +2681 0 0 0 0 2681 2 2 1 0 0 +2682 0 0 0 0 2682 2 2 1 0 0 +2683 0 0 0 0 2683 2 2 1 0 0 +2684 0 0 0 0 2684 2 2 1 0 0 +2685 0 0 0 0 2685 2 2 1 0 0 +2686 0 0 0 0 2686 2 2 1 0 0 +2687 0 0 0 0 2687 2 2 1 0 0 +2688 0 0 0 0 2688 2 2 1 0 0 +2689 0 0 0 0 2689 2 2 1 0 0 +2690 0 0 0 0 2690 2 2 1 0 0 +2691 0 0 0 0 2691 2 2 1 0 0 +2692 0 0 0 0 2692 2 2 1 0 0 +2715 0 0 0 0 2715 2 2 1 0 0 +2716 0 0 0 0 2716 2 2 1 0 0 +2717 0 0 0 0 2717 2 2 1 0 0 +2718 0 0 0 0 2718 2 2 1 0 0 +2719 0 0 0 0 2719 2 2 1 0 0 +2720 0 0 0 0 2720 2 2 1 0 0 +2721 0 0 0 0 2721 2 2 1 0 0 +2722 0 0 0 0 2722 2 2 1 0 0 +2723 0 0 0 0 2723 2 2 1 0 0 +2724 0 0 0 0 2724 2 2 1 0 0 +2725 0 0 0 0 2725 2 2 1 0 0 +2726 0 0 0 0 2726 2 2 1 0 0 +2727 0 0 0 0 2727 2 2 1 0 0 +2730 0 0 0 0 2730 2 2 1 0 0 +2731 0 0 0 0 2731 2 2 1 0 0 +2732 0 0 0 0 2732 2 2 1 0 0 +2733 0 0 0 0 2733 2 2 1 0 0 +2734 0 0 0 0 2734 2 2 1 0 0 +2735 0 0 0 0 2735 2 2 1 0 0 +2736 0 0 0 0 2736 2 2 1 0 0 +2737 0 0 0 0 2737 2 2 1 0 0 +2738 0 0 0 0 2738 2 2 1 0 0 +2739 0 0 0 0 2739 2 2 1 0 0 +2740 0 0 0 0 2740 2 2 1 0 0 +2741 0 0 0 0 2741 2 2 1 0 0 +2742 0 0 0 0 2742 2 2 1 0 0 +2743 0 0 0 0 2743 2 2 1 0 0 +2744 0 0 0 0 2744 2 2 1 0 0 +2745 0 0 0 0 2745 2 2 1 0 0 +2746 0 0 0 0 2746 2 2 1 0 0 +2747 0 0 0 0 2747 2 2 1 0 0 +2749 0 0 0 0 2749 2 2 1 0 0 +2750 0 0 0 0 2750 2 2 1 0 0 +2751 0 0 0 0 2751 2 2 1 0 0 +2752 0 0 0 0 2752 2 2 1 0 0 +2753 0 0 0 0 2753 2 2 1 0 0 +2754 0 0 0 0 2754 2 2 1 0 0 +2755 0 0 0 0 2755 2 2 1 0 0 +2756 0 0 0 0 2756 2 2 1 0 0 +2757 0 0 0 0 2757 2 2 1 0 0 +2758 0 0 0 0 2758 2 2 1 0 0 +2759 0 0 0 0 2759 2 2 1 0 0 +2760 0 0 0 0 2760 2 2 1 0 0 +2782 0 0 0 0 2782 2 2 1 0 0 +2783 0 0 0 0 2783 2 2 1 0 0 +2784 0 0 0 0 2784 2 2 1 0 0 +2785 0 0 0 0 2785 2 2 1 0 0 +2786 0 0 0 0 2786 2 2 1 0 0 +2787 0 0 0 0 2787 2 2 1 0 0 +2788 0 0 0 0 2788 2 2 1 0 0 +2789 0 0 0 0 2789 2 2 1 0 0 +2790 0 0 0 0 2790 2 2 1 0 0 +2791 0 0 0 0 2791 2 2 1 0 0 +2792 0 0 0 0 2792 2 2 1 0 0 +2793 0 0 0 0 2793 2 2 1 0 0 +2796 0 0 0 0 2796 2 2 1 0 0 +2797 0 0 0 0 2797 2 2 1 0 0 +2798 0 0 0 0 2798 2 2 1 0 0 +2799 0 0 0 0 2799 2 2 1 0 0 +2800 0 0 0 0 2800 2 2 1 0 0 +2801 0 0 0 0 2801 2 2 1 0 0 +2802 0 0 0 0 2802 2 2 1 0 0 +2803 0 0 0 0 2803 2 2 1 0 0 +2804 0 0 0 0 2804 2 2 1 0 0 +2805 0 0 0 0 2805 2 2 1 0 0 +2806 0 0 0 0 2806 2 2 1 0 0 +2807 0 0 0 0 2807 2 2 1 0 0 +2822 0 0 0 0 2822 2 2 1 0 0 +2823 0 0 0 0 2823 2 2 1 0 0 +2824 0 0 0 0 2824 2 2 1 0 0 +2825 0 0 0 0 2825 2 2 1 0 0 +2826 0 0 0 0 2826 2 2 1 0 0 +2827 0 0 0 0 2827 2 2 1 0 0 +2828 0 0 0 0 2828 2 2 1 0 0 +2829 0 0 0 0 2829 2 2 1 0 0 +2830 0 0 0 0 2830 2 2 1 0 0 +2831 0 0 0 0 2831 2 2 1 0 0 +2832 0 0 0 0 2832 2 2 1 0 0 +2833 0 0 0 0 2833 2 2 1 0 0 +2849 0 0 0 0 2849 2 2 1 0 0 +2850 0 0 0 0 2850 2 2 1 0 0 +2851 0 0 0 0 2851 2 2 1 0 0 +2852 0 0 0 0 2852 2 2 1 0 0 +2853 0 0 0 0 2853 2 2 1 0 0 +2854 0 0 0 0 2854 2 2 1 0 0 +2855 0 0 0 0 2855 2 2 1 0 0 +2856 0 0 0 0 2856 2 2 1 0 0 +2857 0 0 0 0 2857 2 2 1 0 0 +2858 0 0 0 0 2858 2 2 1 0 0 +2859 0 0 0 0 2859 2 2 1 0 0 +2860 0 0 0 0 2860 2 2 1 0 0 +2865 0 0 0 0 2865 2 2 1 0 0 +2866 0 0 0 0 2866 2 2 1 0 0 +2867 0 0 0 0 2867 2 2 1 0 0 +2868 0 0 0 0 2868 2 2 1 0 0 +2869 0 0 0 0 2869 2 2 1 0 0 +2870 0 0 0 0 2870 2 2 1 0 0 +2871 0 0 0 0 2871 2 2 1 0 0 +2872 0 0 0 0 2872 2 2 1 0 0 +2873 0 0 0 0 2873 2 2 1 0 0 +2874 0 0 0 0 2874 2 2 1 0 0 +2875 0 0 0 0 2875 2 2 1 0 0 +2876 0 0 0 0 2876 2 2 1 0 0 +2880 0 0 0 0 2880 2 2 1 0 0 +2881 0 0 0 0 2881 2 2 1 0 0 +2882 0 0 0 0 2882 2 2 1 0 0 +2883 0 0 0 0 2883 2 2 1 0 0 +2884 0 0 0 0 2884 2 2 1 0 0 +2885 0 0 0 0 2885 2 2 1 0 0 +2886 0 0 0 0 2886 2 2 1 0 0 +2887 0 0 0 0 2887 2 2 1 0 0 +2888 0 0 0 0 2888 2 2 1 0 0 +2889 0 0 0 0 2889 2 2 1 0 0 +2890 0 0 0 0 2890 2 2 1 0 0 +2891 0 0 0 0 2891 2 2 1 0 0 +2907 0 0 0 0 2907 2 2 1 0 0 +2908 0 0 0 0 2908 2 2 1 0 0 +2909 0 0 0 0 2909 2 2 1 0 0 +2910 0 0 0 0 2910 2 2 1 0 0 +2911 0 0 0 0 2911 2 2 1 0 0 +2912 0 0 0 0 2912 2 2 1 0 0 +2913 0 0 0 0 2913 2 2 1 0 0 +2914 0 0 0 0 2914 2 2 1 0 0 +2915 0 0 0 0 2915 2 2 1 0 0 +2916 0 0 0 0 2916 2 2 1 0 0 +2917 0 0 0 0 2917 2 2 1 0 0 +2918 0 0 0 0 2918 2 2 1 0 0 +400000 0 0 0 0 400000 0 0 0 0 0 +2920 0 0 0 0 2920 2 2 1 0 0 +2921 0 0 0 0 2921 2 2 1 0 0 +2922 0 0 0 0 2922 2 2 1 0 0 +2923 0 0 0 0 2923 2 2 1 0 0 +2924 0 0 0 0 2924 2 2 1 0 0 +2925 0 0 0 0 2925 2 2 1 0 0 +2926 0 0 0 0 2926 2 2 1 0 0 +2927 0 0 0 0 2927 2 2 1 0 0 +2928 0 0 0 0 2928 2 2 1 0 0 +2929 0 0 0 0 2929 2 2 1 0 0 +2930 0 0 0 0 2930 2 2 1 0 0 +2931 0 0 0 0 2931 2 2 1 0 0 +2936 0 0 0 0 2936 2 2 1 0 0 +2937 0 0 0 0 2937 2 2 1 0 0 +2938 0 0 0 0 2938 2 2 1 0 0 +2939 0 0 0 0 2939 2 2 1 0 0 +2940 0 0 0 0 2940 2 2 1 0 0 +2941 0 0 0 0 2941 2 2 1 0 0 +2942 0 0 0 0 2942 2 2 1 0 0 +2943 0 0 0 0 2943 2 2 1 0 0 +2944 0 0 0 0 2944 2 2 1 0 0 +2945 0 0 0 0 2945 2 2 1 0 0 +2946 0 0 0 0 2946 2 2 1 0 0 +2947 0 0 0 0 2947 2 2 1 0 0 +2961 0 0 0 0 2961 2 2 1 0 0 +2962 0 0 0 0 2962 2 2 1 0 0 +2963 0 0 0 0 2963 2 2 1 0 0 +2964 0 0 0 0 2964 2 2 1 0 0 +2965 0 0 0 0 2965 2 2 1 0 0 +2966 0 0 0 0 2966 2 2 1 0 0 +2968 0 0 0 0 2968 2 2 1 0 0 +2969 0 0 0 0 2969 2 2 1 0 0 +2970 0 0 0 0 2970 2 2 1 0 0 +2971 0 0 0 0 2971 2 2 1 0 0 +2972 0 0 0 0 2972 2 2 1 0 0 +2973 0 0 0 0 2973 2 2 1 0 0 +2975 0 0 0 0 2975 2 2 1 0 0 +2976 0 0 0 0 2976 2 2 1 0 0 +2977 0 0 0 0 2977 2 2 1 0 0 +2978 0 0 0 0 2978 2 2 1 0 0 +2979 0 0 0 0 2979 2 2 1 0 0 +2980 0 0 0 0 2980 2 2 1 0 0 diff --git a/Resources/table/share/item/BuyAssetConfig.tsv b/Resources/table/share/item/BuyAssetConfig.tsv new file mode 100644 index 00000000..ba2599c7 --- /dev/null +++ b/Resources/table/share/item/BuyAssetConfig.tsv @@ -0,0 +1,599 @@ +Id Times GainCount ConsumeId[1] ConsumeId[2] ConsumeCount[1] ConsumeCount[2] DiscountShows[1] DiscountShows[2] +1 1 3 3 10 +2 2 4 3 20 +3 4 5 3 40 +4 6 6 3 80 +5 8 7 3 160 +6 10 8 3 320 +7 16 10 3 480 +101 1 60 3 30 +102 2 65 3 40 +103 3 70 3 50 +104 4 75 3 60 +105 5 80 3 70 +106 6 85 3 80 +107 7 90 3 90 +108 8 95 3 100 +109 9 100 3 110 +110 10 105 3 120 +12 1 1 3 1 +13 1 1 3 1 +14 1 1 3 1 +15 1 1 3 1 +16 1 1 3 1 +17 1 1 3 1 +18 1 1 3 1 +19 1 1 3 1 +20 1 1 3 1 +21 1 1 3 1 +22 1 1 3 1 +23 1 1 3 1 +24 1 1 3 1 +25 1 1 3 1 +26 1 1 3 1 +27 1 1 3 1 +201 1 50 3 50 +2017 1 1 31 3 10 15 +2018 1 1 31 3 10 15 +2019 1 1 31 3 10 15 +2020 1 1 31 3 10 15 +2021 1 1 31 3 10 15 +2022 1 1 31 3 10 15 +2023 1 1 31 3 10 15 +2024 1 1 31 3 10 15 +2025 1 1 31 3 10 15 +2026 1 1 31 3 10 15 +2027 1 1 31 3 10 15 +2028 1 1 31 3 10 15 +2029 1 1 31 3 10 15 +2030 1 1 31 3 10 15 +2031 1 1 31 3 10 15 +2032 1 1 31 3 10 15 +2033 1 1 31 3 10 15 +2034 1 1 31 3 10 15 +2035 1 1 31 3 10 15 +2036 1 1 31 3 10 15 +2037 1 1 31 3 10 15 +2038 1 1 31 3 10 15 +2039 1 1 31 3 10 15 +2040 1 1 31 3 10 15 +2041 1 1 31 3 10 15 +2042 1 1 31 3 10 15 +2043 1 1 31 3 10 15 +2044 1 1 31 3 10 15 +2045 1 1 31 3 10 15 +2046 1 1 31 3 10 15 +2047 1 1 31 3 10 15 +2048 1 1 31 3 10 15 +2049 1 1 31 3 10 15 +2050 1 1 31 3 10 15 +2051 1 1 31 3 10 15 +2052 1 1 31 3 10 15 +2053 1 1 31 3 10 15 +2054 1 1 31 3 10 15 +2081 1 1 31 3 10 15 +2083 1 1 31 3 70 80 +2084 1 1 31 3 70 80 +2085 1 1 31 3 70 80 +2086 1 1 31 3 70 80 +2087 1 1 31 3 70 80 +2088 1 1 31 3 70 80 +2089 1 1 31 3 70 80 +2090 1 1 31 3 70 80 +2091 1 1 31 3 70 80 +2092 1 1 31 3 70 80 +2093 1 1 31 3 70 80 +2094 1 1 31 3 70 80 +2095 1 1 31 3 70 80 +2096 1 1 31 3 70 80 +2097 1 1 31 3 70 80 +2098 1 1 31 3 70 80 +2099 1 1 31 3 70 80 +2100 1 1 31 3 70 80 +2101 1 1 31 3 70 80 +2102 1 1 31 3 70 80 +2116 1 1 31 3 70 80 +2117 1 1 31 3 70 80 +2118 1 1 31 3 70 80 +2119 1 1 31 3 70 80 +2120 1 1 31 3 70 80 +2121 1 1 31 3 70 80 +2122 1 1 31 3 70 80 +2123 1 1 31 3 70 80 +2124 1 1 31 3 70 80 +2125 1 1 31 3 70 80 +2126 1 1 31 3 70 80 +2127 1 1 31 3 70 80 +2128 1 1 31 3 70 80 +2129 1 1 31 3 70 80 +2130 1 1 31 3 70 80 +2131 1 1 31 3 70 80 +2132 1 1 31 3 70 80 +2133 1 1 31 3 70 80 +2134 1 1 31 3 70 80 +2135 1 1 31 3 70 80 +2136 1 1 31 3 70 80 +2137 1 1 31 3 70 80 +2138 1 1 31 3 70 80 +2139 1 1 31 3 70 80 +2140 1 1 31 3 70 80 +2141 1 1 31 3 70 80 +2142 1 1 31 3 70 80 +2143 1 1 31 3 70 80 +2144 1 1 31 3 70 80 +2145 1 1 31 3 70 80 +2146 1 1 31 3 70 80 +2147 1 1 31 3 70 80 +2148 1 1 31 3 70 80 +2149 1 1 31 3 70 80 +2150 1 1 31 3 70 80 +2151 1 1 31 3 70 80 +2152 1 1 31 3 70 80 +2153 1 1 31 3 70 80 +2154 1 1 31 3 70 80 +2155 1 1 31 3 70 80 +2156 1 1 31 3 70 80 +2157 1 1 31 3 70 80 +2158 1 1 31 3 70 80 +2159 1 1 31 3 70 80 +2160 1 1 31 3 70 80 +2161 1 1 31 3 70 80 +2162 1 1 31 3 70 80 +2163 1 1 31 3 70 80 +2164 1 1 31 3 70 80 +2165 1 1 31 3 70 80 +2166 1 1 31 3 70 80 +2167 1 1 31 3 70 80 +2168 1 1 31 3 70 80 +2169 1 1 31 3 70 80 +2170 1 1 31 3 70 80 +2171 1 1 31 3 70 80 +2172 1 1 31 3 70 80 +2173 1 1 31 3 70 80 +2174 1 1 31 3 70 80 +2175 1 1 31 3 70 80 +2176 1 1 31 3 70 80 +2177 1 1 31 3 70 80 +2178 1 1 31 3 70 80 +2179 1 1 31 3 70 80 +2180 1 1 31 3 70 80 +2181 1 1 31 3 70 80 +2182 1 1 31 3 70 80 +2183 1 1 31 3 70 80 +2184 1 1 31 3 70 80 +2185 1 1 31 3 70 80 +2186 1 1 31 3 70 80 +2187 1 1 31 3 70 80 +2188 1 1 31 3 70 80 +2189 1 1 31 3 70 80 +2190 1 1 31 3 70 80 +2195 1 1 31 3 70 80 +2196 1 1 31 3 70 80 +2197 1 1 31 3 70 80 +2198 1 1 31 3 70 80 +2199 1 1 31 3 70 80 +2200 1 1 31 3 70 80 +2201 1 1 31 3 70 80 +2202 1 1 31 3 70 80 +2203 1 1 31 3 70 80 +2204 1 1 31 3 70 80 +2205 1 1 31 3 70 80 +2206 1 1 31 3 70 80 +2207 1 1 31 3 70 80 +2208 1 1 31 3 70 80 +2209 1 1 31 3 70 80 +2210 1 1 31 3 70 80 +2212 1 1 31 3 70 80 +2213 1 1 31 3 70 80 +2214 1 1 31 3 70 80 +2215 1 1 31 3 70 80 +2216 1 1 31 3 70 80 +2217 1 1 31 3 70 80 +2218 1 1 31 3 70 80 +2219 1 1 31 3 70 80 +2220 1 1 31 3 70 80 +2221 1 1 31 3 70 80 +2222 1 1 31 3 70 80 +2223 1 1 31 3 70 80 +2224 1 1 31 3 70 80 +2225 1 1 31 3 70 80 +2261 1 1 31 3 70 80 +2262 1 1 31 3 70 80 +2263 1 1 31 3 70 80 +2264 1 1 31 3 70 80 +2265 1 1 31 3 70 80 +2266 1 1 31 3 70 80 +2267 1 1 31 3 70 80 +2268 1 1 31 3 70 80 +2269 1 1 31 3 70 80 +2270 1 1 31 3 70 80 +2271 1 1 31 3 70 80 +2272 1 1 31 3 70 80 +2273 1 1 31 3 70 80 +2274 1 1 31 3 70 80 +2275 1 1 31 3 70 80 +2276 1 1 31 3 70 80 +2277 1 1 31 3 70 80 +2321 1 1 31 3 70 80 +2322 1 1 31 3 70 80 +2323 1 1 31 3 70 80 +2324 1 1 31 3 70 80 +2325 1 1 31 3 70 80 +2326 1 1 31 3 70 80 +2327 1 1 31 3 70 80 +2328 1 1 31 3 70 80 +2329 1 1 31 3 70 80 +2330 1 1 31 3 70 80 +2331 1 1 31 3 70 80 +2332 1 1 31 3 70 80 +2333 1 1 31 3 70 80 +2334 1 1 31 3 70 80 +2335 1 1 31 3 70 80 +2336 1 1 31 3 70 80 +2337 1 1 31 3 70 80 +2338 1 1 31 3 70 80 +2339 1 1 31 3 70 80 +2350 1 1 31 3 70 80 +2351 1 1 31 3 70 80 +2352 1 1 31 3 70 80 +2354 1 1 31 3 70 80 +2355 1 1 31 3 70 80 +2356 1 1 31 3 70 80 +2357 1 1 31 3 70 80 +2358 1 1 31 3 70 80 +2359 1 1 31 3 70 80 +2360 1 1 31 3 70 80 +2361 1 1 31 3 70 80 +2362 1 1 31 3 70 80 +2363 1 1 31 3 70 80 +2364 1 1 31 3 70 80 +2365 1 1 31 3 70 80 +2366 1 1 31 3 70 80 +2367 1 1 31 3 70 80 +2368 1 1 31 3 70 80 +2369 1 1 31 3 70 80 +62714 1 10 3 5 100 10 +629011 1 120 3 20 +629012 2 120 3 25 +629013 3 120 3 30 +629014 4 120 3 40 +629015 5 120 3 60 +63001 1 1 3 5 300 9 0.0000 70.0000 +50104 1 1 3 5 30 1 0.0000 0.0000 +32002 1 1 32000 15 +32003 1 1 32000 15 +32004 1 1 32000 15 +32005 1 1 32000 15 +32006 1 1 32000 15 +32007 1 1 32000 15 +32008 1 1 32000 15 +32009 1 1 32000 15 +32010 1 1 32000 15 +32011 1 1 32000 15 +32012 1 1 32000 15 +32013 1 1 32000 15 +32014 1 1 32000 15 +32015 1 1 32000 15 +32016 1 1 32000 15 +32017 1 1 32000 15 +32018 1 1 32000 15 +32019 1 1 32000 15 +32020 1 1 32000 15 +32021 1 1 32000 15 +33002 1 1 33000 15 +33003 1 1 33000 15 +33004 1 1 33000 15 +33005 1 1 33000 15 +33006 1 1 33000 15 +33007 1 1 33000 15 +33008 1 1 33000 15 +97009 1 1 3 5 +2391 1 1 31 3 70 80 +2392 1 1 31 3 70 80 +2393 1 1 31 3 70 80 +2394 1 1 31 3 70 80 +2395 1 1 31 3 70 80 +2396 1 1 31 3 70 80 +2397 1 1 31 3 70 80 +2398 1 1 31 3 70 80 +2399 1 1 31 3 70 80 +2400 1 1 31 3 70 80 +2422 1 1 31 3 70 80 +2423 1 1 31 3 70 80 +2424 1 1 31 3 70 80 +2425 1 1 31 3 70 80 +2426 1 1 31 3 70 80 +2427 1 1 31 3 70 80 +2428 1 1 31 3 70 80 +2429 1 1 31 3 70 80 +2430 1 1 31 3 70 80 +2431 1 1 31 3 70 80 +2434 1 1 31 3 70 80 +2435 1 1 31 3 70 80 +2436 1 1 31 3 70 80 +2437 1 1 31 3 70 80 +2438 1 1 31 3 70 80 +2439 1 1 31 3 70 80 +2440 1 1 31 3 70 80 +2441 1 1 31 3 70 80 +2442 1 1 31 3 70 80 +2443 1 1 31 3 70 80 +2444 1 1 31 3 70 80 +2445 1 1 31 3 70 80 +2448 1 1 31 3 70 80 +2449 1 1 31 3 70 80 +2450 1 1 31 3 70 80 +2451 1 1 31 3 70 80 +2452 1 1 31 3 70 80 +2453 1 1 31 3 70 80 +2454 1 1 31 3 70 80 +2455 1 1 31 3 70 80 +2456 1 1 31 3 70 80 +2457 1 1 31 3 70 80 +2458 1 1 31 3 70 80 +2478 1 1 31 3 70 80 +2479 1 1 31 3 70 80 +2480 1 1 31 3 70 80 +2481 1 1 31 3 70 80 +2482 1 1 31 3 70 80 +2483 1 1 31 3 70 80 +2484 1 1 31 3 70 80 +2485 1 1 31 3 70 80 +2486 1 1 31 3 70 80 +2487 1 1 31 3 70 80 +2488 1 1 31 3 70 80 +2489 1 1 31 3 70 80 +2554 1 1 31 3 70 80 +2555 1 1 31 3 70 80 +2556 1 1 31 3 70 80 +2557 1 1 31 3 70 80 +2558 1 1 31 3 70 80 +2559 1 1 31 3 70 80 +2560 1 1 31 3 70 80 +2561 1 1 31 3 70 80 +2562 1 1 31 3 70 80 +2563 1 1 31 3 70 80 +2565 1 1 31 3 70 80 +2566 1 1 31 3 70 80 +2567 1 1 31 3 70 80 +2568 1 1 31 3 70 80 +2569 1 1 31 3 70 80 +2570 1 1 31 3 70 80 +2571 1 1 31 3 70 80 +2572 1 1 31 3 70 80 +2573 1 1 31 3 70 80 +2574 1 1 31 3 70 80 +2576 1 1 31 3 70 80 +2577 1 1 31 3 70 80 +2578 1 1 31 3 70 80 +2579 1 1 31 3 70 80 +2580 1 1 31 3 70 80 +2581 1 1 31 3 70 80 +2582 1 1 31 3 70 80 +2583 1 1 31 3 70 80 +2584 1 1 31 3 70 80 +2585 1 1 31 3 70 80 +2586 1 1 31 3 70 80 +2587 1 1 31 3 70 80 +2593 1 1 31 3 70 80 +2594 1 1 31 3 70 80 +2595 1 1 31 3 70 80 +2596 1 1 31 3 70 80 +2597 1 1 31 3 70 80 +2606 1 1 31 3 70 80 +2598 1 1 31 3 70 80 +2599 1 1 31 3 70 80 +2600 1 1 31 3 70 80 +2601 1 1 31 3 70 80 +2602 1 1 31 3 70 80 +2603 1 1 31 3 70 80 +2631 1 1 31 3 70 80 +2632 1 1 31 3 70 80 +2633 1 1 31 3 70 80 +2634 1 1 31 3 70 80 +2635 1 1 31 3 70 80 +2636 1 1 31 3 70 80 +2637 1 1 31 3 70 80 +2638 1 1 31 3 70 80 +2639 1 1 31 3 70 80 +2640 1 1 31 3 70 80 +2641 1 1 31 3 70 80 +2642 1 1 31 3 70 80 +2643 1 1 31 3 70 80 +2644 1 1 31 3 70 80 +2645 1 1 31 3 70 80 +2646 1 1 31 3 70 80 +2647 1 1 31 3 70 80 +2648 1 1 31 3 70 80 +2649 1 1 31 3 70 80 +2650 1 1 31 3 70 80 +2651 1 1 31 3 70 80 +2652 1 1 31 3 70 80 +2653 1 1 31 3 70 80 +2654 1 1 31 3 70 80 +2655 1 1 31 3 70 80 +2680 1 1 31 3 70 80 +2681 1 1 31 3 70 80 +2682 1 1 31 3 70 80 +2683 1 1 31 3 70 80 +2684 1 1 31 3 70 80 +2685 1 1 31 3 70 80 +2686 1 1 31 3 70 80 +2687 1 1 31 3 70 80 +2688 1 1 31 3 70 80 +2689 1 1 31 3 70 80 +2690 1 1 31 3 70 80 +2691 1 1 31 3 70 80 +2692 1 1 31 3 70 80 +2715 1 1 31 3 70 80 +2716 1 1 31 3 70 80 +2717 1 1 31 3 70 80 +2718 1 1 31 3 70 80 +2719 1 1 31 3 70 80 +2720 1 1 31 3 70 80 +2721 1 1 31 3 70 80 +2722 1 1 31 3 70 80 +2723 1 1 31 3 70 80 +2724 1 1 31 3 70 80 +2725 1 1 31 3 70 80 +2726 1 1 31 3 70 80 +2727 1 1 31 3 70 80 +2730 1 1 31 3 70 80 +2731 1 1 31 3 70 80 +2732 1 1 31 3 70 80 +2733 1 1 31 3 70 80 +2734 1 1 31 3 70 80 +2735 1 1 31 3 70 80 +2736 1 1 31 3 70 80 +2737 1 1 31 3 70 80 +2738 1 1 31 3 70 80 +2739 1 1 31 3 70 80 +2740 1 1 31 3 70 80 +2741 1 1 31 3 70 80 +2742 1 1 31 3 70 80 +2743 1 1 31 3 70 80 +2744 1 1 31 3 70 80 +2745 1 1 31 3 70 80 +2746 1 1 31 3 70 80 +2747 1 1 31 3 70 80 +2749 1 1 31 3 70 80 +2750 1 1 31 3 70 80 +2751 1 1 31 3 70 80 +2752 1 1 31 3 70 80 +2753 1 1 31 3 70 80 +2754 1 1 31 3 70 80 +2755 1 1 31 3 70 80 +2756 1 1 31 3 70 80 +2757 1 1 31 3 70 80 +2758 1 1 31 3 70 80 +2759 1 1 31 3 70 80 +2760 1 1 31 3 70 80 +2782 1 1 31 3 70 80 +2783 1 1 31 3 70 80 +2784 1 1 31 3 70 80 +2785 1 1 31 3 70 80 +2786 1 1 31 3 70 80 +2787 1 1 31 3 70 80 +2788 1 1 31 3 70 80 +2789 1 1 31 3 70 80 +2790 1 1 31 3 70 80 +2791 1 1 31 3 70 80 +2792 1 1 31 3 70 80 +2793 1 1 31 3 70 80 +2796 1 1 31 3 70 80 +2797 1 1 31 3 70 80 +2798 1 1 31 3 70 80 +2799 1 1 31 3 70 80 +2800 1 1 31 3 70 80 +2801 1 1 31 3 70 80 +2802 1 1 31 3 70 80 +2803 1 1 31 3 70 80 +2804 1 1 31 3 70 80 +2805 1 1 31 3 70 80 +2806 1 1 31 3 70 80 +2807 1 1 31 3 70 80 +2822 1 1 31 3 70 80 +2823 1 1 31 3 70 80 +2824 1 1 31 3 70 80 +2825 1 1 31 3 70 80 +2826 1 1 31 3 70 80 +2827 1 1 31 3 70 80 +2828 1 1 31 3 70 80 +2829 1 1 31 3 70 80 +2830 1 1 31 3 70 80 +2831 1 1 31 3 70 80 +2832 1 1 31 3 70 80 +2833 1 1 31 3 70 80 +2849 1 1 31 3 70 80 +2850 1 1 31 3 70 80 +2851 1 1 31 3 70 80 +2852 1 1 31 3 70 80 +2853 1 1 31 3 70 80 +2854 1 1 31 3 70 80 +2855 1 1 31 3 70 80 +2856 1 1 31 3 70 80 +2857 1 1 31 3 70 80 +2858 1 1 31 3 70 80 +2859 1 1 31 3 70 80 +2860 1 1 31 3 70 80 +2865 1 1 31 3 70 80 +2866 1 1 31 3 70 80 +2867 1 1 31 3 70 80 +2868 1 1 31 3 70 80 +2869 1 1 31 3 70 80 +2870 1 1 31 3 70 80 +2871 1 1 31 3 70 80 +2872 1 1 31 3 70 80 +2873 1 1 31 3 70 80 +2874 1 1 31 3 70 80 +2875 1 1 31 3 70 80 +2876 1 1 31 3 70 80 +2880 1 1 31 3 70 80 +2881 1 1 31 3 70 80 +2882 1 1 31 3 70 80 +2883 1 1 31 3 70 80 +2884 1 1 31 3 70 80 +2885 1 1 31 3 70 80 +2886 1 1 31 3 70 80 +2887 1 1 31 3 70 80 +2888 1 1 31 3 70 80 +2889 1 1 31 3 70 80 +2890 1 1 31 3 70 80 +2891 1 1 31 3 70 80 +270007 1 10 3 50 +270008 1 10 3 50 +2907 1 1 31 3 70 80 +2908 1 1 31 3 70 80 +2909 1 1 31 3 70 80 +2910 1 1 31 3 70 80 +2911 1 1 31 3 70 80 +2912 1 1 31 3 70 80 +2913 1 1 31 3 70 80 +2914 1 1 31 3 70 80 +2915 1 1 31 3 70 80 +2916 1 1 31 3 70 80 +2917 1 1 31 3 70 80 +2918 1 1 31 3 70 80 +400000 1 10 3 50 +2920 1 1 31 3 70 80 +2921 1 1 31 3 70 80 +2922 1 1 31 3 70 80 +2923 1 1 31 3 70 80 +2924 1 1 31 3 70 80 +2925 1 1 31 3 70 80 +2926 1 1 31 3 70 80 +2927 1 1 31 3 70 80 +2928 1 1 31 3 70 80 +2929 1 1 31 3 70 80 +2930 1 1 31 3 70 80 +2931 1 1 31 3 70 80 +2936 1 1 31 3 70 80 +2937 1 1 31 3 70 80 +2938 1 1 31 3 70 80 +2939 1 1 31 3 70 80 +2940 1 1 31 3 70 80 +2941 1 1 31 3 70 80 +2942 1 1 31 3 70 80 +2943 1 1 31 3 70 80 +2944 1 1 31 3 70 80 +2945 1 1 31 3 70 80 +2946 1 1 31 3 70 80 +2947 1 1 31 3 70 80 +2961 1 1 31 3 70 80 +2962 1 1 31 3 70 80 +2963 1 1 31 3 70 80 +2964 1 1 31 3 70 80 +2965 1 1 31 3 70 80 +2966 1 1 31 3 70 80 +2968 1 1 31 3 70 80 +2969 1 1 31 3 70 80 +2970 1 1 31 3 70 80 +2971 1 1 31 3 70 80 +2972 1 1 31 3 70 80 +2973 1 1 31 3 70 80 +2975 1 1 31 3 70 80 +2976 1 1 31 3 70 80 +2977 1 1 31 3 70 80 +2978 1 1 31 3 70 80 +2979 1 1 31 3 70 80 +2980 1 1 31 3 70 80 diff --git a/Resources/table/share/pay/Pay.tsv b/Resources/table/share/pay/Pay.tsv new file mode 100644 index 00000000..de8d455c --- /dev/null +++ b/Resources/table/share/pay/Pay.tsv @@ -0,0 +1,33 @@ +Key Platform GoodsId Amount Currency ShowAmount Name Desc MoneyCard Icon PayId ShowUIType +PayAnd5 1 101 0.9900 USD 0.99 5 Rainbow Cards Recharge $0.99 to get 5 RC 5 Pay6 1001 1 +PayAnd28 1 102 4.9899 USD 4.99 28 Rainbow Cards Recharge $4.99 to get 28 RC 28 Pay30 1002 1 +PayAnd34 1 103 5.9899 USD 5.99 34 Rainbow Cards Recharge $5.99 to get 34 RC 34 Pay34 1003 1 +PayAnd59 1 104 9.9899 USD 9.99 59 Rainbow Cards Recharge $9.99 to get 59 RC 59 Pay68 1004 1 +PayAnd71 1 105 11.9899 USD 11.99 71 Rainbow Cards Recharge $11.99 to get 71 RC 71 Pay71 1005 1 +PayAnd119 1 106 19.9899 USD 19.99 119 Rainbow Cards Recharge $19.99 to get 119 RC 119 Pay128 1006 1 +PayAnd299 1 107 49.9900 USD 49.99 299 Rainbow Cards Recharge $49.99 to get 299 RC 299 Pay328 1007 1 +PayAnd600 1 108 99.9899 USD 99.99 600 Rainbow Cards Recharge $99.99 to get 600 RC 600 Pay648 1008 1 +PayIos5 2 201 0.9900 USD 0.99 5 Rainbow Cards Recharge $0.99 to get 5 RC 5 Pay6 1001 1 +PayIos28 2 202 4.9899 USD 4.99 28 Rainbow Cards Recharge $4.99 to get 28 RC 28 Pay30 1002 1 +PayIos34 2 203 5.9899 USD 5.99 34 Rainbow Cards Recharge $5.99 to get 34 RC 34 Pay34 1003 1 +PayIos59 2 204 9.9899 USD 9.99 59 Rainbow Cards Recharge $9.99 to get 59 RC 59 Pay68 1004 1 +PayIos71 2 205 11.9899 USD 11.99 71 Rainbow Cards Recharge $11.99 to get 71 RC 71 Pay71 1005 1 +PayIos119 2 206 19.9899 USD 19.99 119 Rainbow Cards Recharge $19.99 to get 119 RC 119 Pay128 1006 1 +PayIos299 2 207 49.9900 USD 49.99 299 Rainbow Cards Recharge $49.99 to get 299 RC 299 Pay328 1007 1 +PayIos600 2 208 99.9899 USD 99.99 600 Rainbow Cards Recharge $99.99 to get 600 RC 600 Pay648 1008 1 +PayWin5 0 301 0.9900 USD 0.99 5 Rainbow Cards Recharge $0.99 to get 5 RC 5 Pay6 1001 1 +PayWin28 0 302 4.9899 USD 4.99 28 Rainbow Cards Recharge $4.99 to get 28 RC 28 Pay30 1002 1 +PayWin34 0 303 5.9899 USD 5.99 34 Rainbow Cards Recharge $5.99 to get 34 RC 34 Pay34 1003 1 +PayWin59 0 304 9.9899 USD 9.99 59 Rainbow Cards Recharge $9.99 to get 59 RC 59 Pay68 1004 1 +PayWin71 0 305 11.9899 USD 11.99 71 Rainbow Cards Recharge $11.99 to get 71 RC 71 Pay71 1005 1 +PayWin119 0 306 19.9899 USD 19.99 119 Rainbow Cards Recharge $19.99 to get 119 RC 119 Pay128 1006 1 +PayWin299 0 307 49.9900 USD 49.99 299 Rainbow Cards Recharge $49.99 to get 299 RC 299 Pay328 1007 1 +PayWin600 0 308 99.9899 USD 99.99 600 Rainbow Cards Recharge $99.99 to get 600 RC 600 Pay648 1008 1 +PayAndGoods2080 1 371 2080.0000 USD 2080 1040 2004 0 +PayIosGoods2080 2 372 2080.0000 USD 2080 1040 2004 0 +PayAndMonthPs730 1 391 365.0000 USD 365 730 3002 0 +PayIosMonthPs730 2 392 365.0000 USD 365 730 3002 0 +PayAnd1Days1840 1 439 920.0000 USD 920 1840 3005 0 +PayIos1Days1840 2 440 920.0000 USD 920 1840 3005 0 +PayAnd1weeks610 1 459 305.0000 USD 305 610 3004 0 +PayIos1weeks610 2 460 305.0000 USD 305 610 3004 0 diff --git a/Resources/table/share/pay/PurchaseDailyDuration.tsv b/Resources/table/share/pay/PurchaseDailyDuration.tsv new file mode 100644 index 00000000..43efc2d6 --- /dev/null +++ b/Resources/table/share/pay/PurchaseDailyDuration.tsv @@ -0,0 +1,2 @@ +Id Days +9 10 diff --git a/Scripts/decode_store_table.py b/Scripts/decode_store_table.py new file mode 100644 index 00000000..2d20ea50 --- /dev/null +++ b/Scripts/decode_store_table.py @@ -0,0 +1,162 @@ +"""Decode current client BinaryTable scalar and numeric-list columns using Binary/Reader.lua's format. + +Input is an extracted TextAsset, not network traffic. Produces authoritative TSV +for the server table generator. Deliberately rejects unsupported column types. +""" +import csv +import struct +import sys +from pathlib import Path + + +class DecodeError(ValueError): + """The payload is not a bounded BinaryTable supported by this decoder.""" + + +def decode(data): + pos = 4 + if len(data) < 4: + raise DecodeError("BinaryTable is shorter than its header") + + def integer(): + nonlocal pos + value = shift = 0 + while True: + if pos >= len(data): + raise DecodeError("truncated variable-length integer") + byte = data[pos] + pos += 1 + value |= (byte & 127) << shift + if byte < 128: + return value if value <= 0x7fffffff else value - 0x100000000 + shift += 7 + if shift > 35: + raise DecodeError("variable-length integer exceeds 32 bits") + + def string(): + nonlocal pos + try: + end = data.index(0, pos) + except ValueError as exc: + raise DecodeError("unterminated BinaryTable string") from exc + value = data[pos:end].decode('utf-8') + pos = end + 1 + return value + + header_size = struct.unpack_from(' len(data) - 4: + raise DecodeError("BinaryTable header exceeds payload") + columns = [(integer(), string()) for _ in range(integer())] + if len(columns) > 10000: + raise DecodeError("BinaryTable has too many columns") + primary_size = 0 + if integer(): + integer() # primary key column + primary_size = integer() + row_size, row_count, content_size = integer(), integer(), integer() + if min(row_size, row_count, content_size) < 0: + raise DecodeError("BinaryTable header contains a negative size") + content = 4 + header_size + primary_size + row_size + if content > len(data) or content_size > len(data) - content: + raise DecodeError("BinaryTable content exceeds payload") + if columns and row_count > max(1, content_size): + raise DecodeError("BinaryTable row count is inconsistent with content size") + pool = content + content_size + pool_columns, strings = set(), [] + if pool < len(data): + pos = pool + pool_header = integer() + if pool_header > len(data) - pool: + raise DecodeError("BinaryTable string-pool header exceeds payload") + if pool_header: + pos = pool + 4 + column_count, string_count, column_size, offset_size = [integer() for _ in range(4)] + if min(column_count, string_count, column_size, offset_size) < 0: + raise DecodeError("BinaryTable string-pool header contains a negative size") + if column_count > len(columns) or offset_size != string_count * 4: + raise DecodeError( + "unsupported BinaryTable string-pool layout " + f"(columns={column_count}, strings={string_count}, " + f"column_size={column_size}, offset_size={offset_size})" + ) + pos = pool + 4 + pool_header + pool_columns = {integer() for _ in range(column_count)} + offsets = pool + 4 + pool_header + column_size + if offsets + offset_size > len(data): + raise DecodeError("BinaryTable string-pool offsets exceed payload") + start = offsets + offset_size + previous = 0 + for i in range(string_count): + if offsets + i * 4 + 4 > len(data): + raise DecodeError("BinaryTable string-pool offset exceeds payload") + end = struct.unpack_from(' len(data): + raise DecodeError("BinaryTable string-pool string exceeds payload") + strings.append(data[start + previous:start + end].rstrip(b'\0').decode('utf-8')) + previous = end + pos = content + content_end = content + content_size + rows = [] + for _ in range(row_count): + if pos > content_end: + raise DecodeError("BinaryTable row cursor exceeds content") + row = [] + for index, (kind, name) in enumerate(columns): + if kind == 2: + if index in pool_columns: + string_index = integer() + if string_index < 0 or string_index >= len(strings): + raise DecodeError("BinaryTable string-pool index exceeds pool") + value = strings[string_index] + else: + value = string() + elif kind == 7: + count = integer() + if count < 0 or count > content_end - pos: + raise DecodeError("BinaryTable decimal-list count exceeds content") + value = [format(integer() / 10000, ".4f") for _ in range(count)] + elif kind == 6: + count = integer() + if count < 0 or count > content_end - pos: + raise DecodeError("BinaryTable integer-list count exceeds content") + value = [integer() for _ in range(count)] + elif kind in (1, 23): + if pos >= len(data): + raise DecodeError("BinaryTable byte column exceeds payload") + value = data[pos] + pos += 1 + elif kind == 14: + value = integer() + elif kind == 15: + value = format(integer() / 10000, '.4f') + else: + raise ValueError(f'Unsupported column {name}: {kind}') + row.append(value) + if pos > content_end: + raise DecodeError("BinaryTable column exceeds content") + rows.append(row) + if pos != content + content_size: + raise DecodeError('Content size mismatch') + # The C# table generator represents lists as repeated, numbered TSV columns. + widths = [max(1, max((len(row[i]) for row in rows), default=0)) if kind in (6, 7) else 1 + for i, (kind, _) in enumerate(columns)] + headers = [f'{name}[{j + 1}]' if kind in (6, 7) else name + for (kind, name), width in zip(columns, widths) for j in range(width)] + expanded = [] + for row in rows: + flattened = [] + for value, width in zip(row, widths): + flattened.extend(value + [''] * (width - len(value)) if isinstance(value, list) else [value]) + expanded.append(flattened) + return headers, expanded + + +if __name__ == '__main__': + columns, rows = decode(Path(sys.argv[1]).read_bytes()) + output = Path(sys.argv[2]) + output.parent.mkdir(parents=True, exist_ok=True) + with output.open('w', encoding='utf-8', newline='') as stream: + writer = csv.writer(stream, delimiter='\t', lineterminator='\n') + writer.writerow(columns) + writer.writerows(rows) + print(f'Decoded {len(rows)} rows to {output}') diff --git a/Scripts/patch_local_store.py b/Scripts/patch_local_store.py new file mode 100644 index 00000000..319b6e90 --- /dev/null +++ b/Scripts/patch_local_store.py @@ -0,0 +1,181 @@ +"""Prepare/apply a reversible local-recharge callback patch to the installed client. + +Requires UnityPy, pycryptodome and msgpack. The optional --catalog patch adds +reward-based missing-icon resolution and mutually exclusive ownership/status +overlays. Existing local recharge patches are preserved. Preparation never +modifies the installed game. +""" +import argparse +import hashlib +import json +import os +import re +import subprocess +from pathlib import Path + +import msgpack +import UnityPy + +MARKER = '-- AscNet local recharge completion' +KEY = bytes.fromhex('587865636f6472506547616b61326536') +CATALOG_MARKER = '-- AscNet server-owned purchase catalog icons' +CATALOG_CALLERS = { + 'XUiPurchaseLBListItem.lua': 'self.ItemData', + 'XUiPurchaseCoatingLBListItem.lua': 'self.ItemData', + 'XUiPurchaseBuyTips.lua': 'data', + 'XUiPurchaseBundleGrid.lua': 'data', + 'XUiPurchaseComboSubGrid.lua': 'data', + 'XUiBigListGrid.lua': 'data', + 'XUiChongzhiTanchuang.lua': 'data', + 'XUiDrawPanelLbItem.lua': 'self.ItemData', + 'XUiGridRegressionGift.lua': 'data', + 'XUiMonthlyCardEn.lua': 'item.Data', + 'XUiPanelRecommendComboPackageGrid.lua': 'data', + 'XUiPanelRecommendEmojiItem.lua': 'package.Data', +} + + +def patch_catalog_lua(name, script): + newline = '\r\n' if '\r\n' in script else '\n' + if name == 'XPurchaseConfigs.lua': + if CATALOG_MARKER in script: + raise RuntimeError('Client already has the catalog patch; use a fresh output only for an unpatched bundle') + anchor = ('function XPurchaseConfigs.GetIconPathByIconName(iconName)\n' + ' return PurchaseIconAssetPathConfig[iconName]\nend').replace('\n', newline) + if script.count(anchor) != 1: + raise RuntimeError('Purchase icon resolver changed; refusing an ambiguous patch') + replacement = Path(__file__).with_name('store_catalog_icons.lua').read_text(encoding='utf-8') + return script.replace(anchor, replacement.rstrip().replace('\n', newline)) + if name in CATALOG_CALLERS: + owner = CATALOG_CALLERS[name] + anchor = f'XPurchaseConfigs.GetIconPathByIconName({owner}.Icon)' + if script.count(anchor) != 1: + raise RuntimeError(f'{name}: purchase icon call changed') + script = script.replace(anchor, f'XPurchaseConfigs.GetIconPathByIconName({owner}.Icon, {owner})') + if name in ('XUiPurchaseLBListItem.lua', 'XUiPurchaseCoatingLBListItem.lua'): + pattern = r'(?m)^([ \t]*)self\.ImgSellout\.gameObject:SetActive\(true\)' + script, count = re.subn(pattern, lambda match: match.group(0) + newline + match[1] + + 'if self.ImgHave then self.ImgHave.gameObject:SetActive(false) end', script) + if count != 4: + raise RuntimeError(f'{name}: expected four status transitions, found {count}') + return script + + +def digest(data): + return hashlib.sha256(data).hexdigest() + + +def text_assets(env): + return {obj.path_id: (obj.read().m_Name, digest(obj.get_raw_data())) + for obj in env.objects if obj.type.name == 'TextAsset'} + + +def prepare(game, output, catalog_patch=False): + if output.exists() and any(output.iterdir()): + raise RuntimeError('Output must be empty to preserve existing rollback backups') + UnityPy.set_assetbundle_decrypt_key(KEY) + base = game / 'PGR_Data' / 'StreamingAssets' + index = UnityPy.load(str(base / 'document/matrix/index')) + index_asset = next(obj.read() for obj in index.objects if obj.type.name == 'TextAsset') + catalog = msgpack.unpackb(index_asset.m_Script.encode('utf-8', 'surrogateescape'), strict_map_key=False)[0] + filename = catalog['assets/temp/lua/matrix.ab'][0] + source = next(path for folder in ('document/matrix', 'resource/matrix') + if (path := base / folder / filename).is_file()) + original = source.read_bytes() + env = UnityPy.load(original) + before = text_assets(env) + target_names = {'XPayManager.lua'} + if catalog_patch: + target_names |= {'XPurchaseConfigs.lua', *CATALOG_CALLERS} + targets = [obj for obj in env.objects if obj.type.name == 'TextAsset' and obj.read().m_Name in target_names] + if len(targets) != len(target_names): + raise RuntimeError('Expected exactly one TextAsset for each store patch target') + changed = [] + scripts = {} + for target in targets: + data = target.read() + previous = data.m_Script + if data.m_Name == 'XPayManager.lua': + data.m_Script = patch_recharge_lua(data.m_Script) + elif catalog_patch: + data.m_Script = patch_catalog_lua(data.m_Name, data.m_Script) + if data.m_Script != previous: + changed.append(target.path_id) + scripts[data.m_Name] = data.m_Script + data.save() + if not changed: + raise RuntimeError('No new patch to prepare') + patched = env.file.save(packer='lz4') + verified = UnityPy.load(patched) + after = text_assets(verified) + assert before.keys() == after.keys() + assert {key for key in before if before[key] != after[key]} == set(changed) + for obj in verified.objects: + if obj.path_id in changed: + data = obj.read() + assert data.m_Script == scripts[data.m_Name] + output.mkdir(parents=True, exist_ok=True) + (output / 'original.bundle').write_bytes(original) + (output / 'patched.bundle').write_bytes(patched) + for name, script in scripts.items(): + (output / name.replace('.lua', '.patched.lua')).write_text(script, encoding='utf-8', newline='') + (output / 'manifest.json').write_text(json.dumps({ + 'source': str(source.resolve()), 'original_sha256': digest(original), + 'patched_sha256': digest(patched), 'verified_text_assets': len(before), + 'changed_scripts': sorted(scripts), + }, indent=2), encoding='utf-8') + print(f'Prepared and verified {len(changed)} changed Lua scripts among {len(before)} TextAssets: {output}') + + +def patch_recharge_lua(script): + if MARKER in script: + return script + anchor = ' DoPay(productKey, res.GameOrder, template.GoodsId)' + if script.count(anchor) != 1: + raise RuntimeError('Client callback changed; refusing an ambiguous patch') + insertion = ''' -- AscNet local recharge completion + if res.LocalCompleted then + XDataCenter.KickOutManager.Unlock(XEnumConst.KICK_OUT.LOCK.RECHARGE, true) + XUiManager.OpenUiObtain(res.RewardList or {}) + XEventManager.DispatchEvent(XEventId.EVENT_SUCCESS_PAY) + return + end +''' + if '\r\n' in script: + insertion = insertion.replace('\n', '\r\n') + return script.replace(anchor, insertion + anchor) + + +def apply(output, restore=False): + if os.name == 'nt': + processes = subprocess.check_output(['tasklist', '/FI', 'IMAGENAME eq PGR.exe', '/FO', 'CSV'], text=True) + if 'PGR.exe' in processes: + raise RuntimeError('Exit PGR before applying/restoring the client patch') + manifest = json.loads((output / 'manifest.json').read_text(encoding='utf-8')) + target = Path(manifest['source']) + expected = manifest['patched_sha256' if restore else 'original_sha256'] + if digest(target.read_bytes()) != expected: + raise RuntimeError('Installed bundle changed since preparation; refusing to overwrite') + payload = (output / ('original.bundle' if restore else 'patched.bundle')).read_bytes() + assert digest(payload) == manifest['original_sha256' if restore else 'patched_sha256'] + temporary = target.with_suffix(target.suffix + '.ascnet-store.tmp') + temporary.write_bytes(payload) + temporary.replace(target) + assert digest(target.read_bytes()) == digest(payload) + print('Restored original client bundle' if restore else 'Applied verified local store client patch') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--game-dir', type=Path) + parser.add_argument('--output', type=Path, required=True) + parser.add_argument('--apply', action='store_true') + parser.add_argument('--restore', action='store_true') + parser.add_argument('--catalog', action='store_true', help='Add missing purchase icons and status overlay fixes') + args = parser.parse_args() + if args.apply or args.restore: + apply(args.output, restore=args.restore) + else: + if args.game_dir is None: + parser.error('--game-dir is required for preparation') + prepare(args.game_dir, args.output, args.catalog) diff --git a/Scripts/store_catalog_icons.lua b/Scripts/store_catalog_icons.lua new file mode 100644 index 00000000..9311d012 --- /dev/null +++ b/Scripts/store_catalog_icons.lua @@ -0,0 +1,46 @@ +-- AscNet server-owned purchase catalog icons +-- Keep original artwork when the installed client can resolve it. Package IDs, +-- reward IDs and asset paths are supplied by the catalog and client tables. +local AscNetPurchaseAssetAvailable = {} +local function AscNetHasPurchaseAsset(path) + if not path or path == "" then return false end + if AscNetPurchaseAssetAvailable[path] == nil then + local bundle = CS.XResourceManager.GetBundleUrl(path) + AscNetPurchaseAssetAvailable[path] = bundle ~= nil and bundle ~= "" + end + return AscNetPurchaseAssetAvailable[path] +end + +function XPurchaseConfigs.GetIconPathByIconName(iconName, purchaseData) + local configured = PurchaseIconAssetPathConfig[iconName] + if not purchaseData then + return configured + end + local asset = configured and configured.AssetPath + local cover = configured and configured.CoverImgPath + if not AscNetHasPurchaseAsset(asset) then asset = nil end + if not AscNetHasPurchaseAsset(cover) then cover = nil end + local function findRewardIcon(rewards) + for _, reward in ipairs(rewards or {}) do + local path = XGoodsCommonManager.GetGoodsIcon(reward.TemplateId) + if AscNetHasPurchaseAsset(path) then + return path + end + end + end + if not asset then + asset = findRewardIcon(purchaseData.RewardGoodsList) + or findRewardIcon(purchaseData.DailyRewardGoodsList) + end + if not asset and purchaseData.PurchaseSignInInfo then + for _, rewardId in ipairs(purchaseData.PurchaseSignInInfo.PurchaseSignInRewardInfos or {}) do + asset = findRewardIcon(XRewardManager.GetRewardList(rewardId)) + if asset then break end + end + end + if asset or cover then + -- Never mutate the shared client table or reuse another card's image. + return { AssetPath = asset or cover, CoverImgPath = cover } + end + return nil +end diff --git a/Scripts/test_store_catalog_patch.py b/Scripts/test_store_catalog_patch.py new file mode 100644 index 00000000..bd41d4ba --- /dev/null +++ b/Scripts/test_store_catalog_patch.py @@ -0,0 +1,131 @@ +"""Behavioral Lua tests; set PGR_RESEARCH_LUA to the exported matrix Lua directory +to additionally validate the real client call sites and timer transitions. +Requires lupa, UnityPy and msgpack. +""" +import os +from pathlib import Path +import unittest + +from lupa.lua53 import LuaRuntime +from Scripts.patch_local_store import CATALOG_CALLERS, patch_catalog_lua, patch_recharge_lua + + +class PurchaseIconTests(unittest.TestCase): + def setUp(self): + self.lua = LuaRuntime(unpack_returned_tuples=True) + self.lua.execute(''' + XPurchaseConfigs = {} + TestIcons = { + current = {AssetPath = "art", CoverImgPath = "cover"}, + missing = {AssetPath = "old-art", CoverImgPath = "old-cover"}, + coverOnly = {AssetPath = "old-art", CoverImgPath = "cover"} + } + Available = {art=true, cover=true, reward=true, daily=true, signin=true} + GoodsIcons = {[1]="missing-reward", [2]="reward", [3]="daily", [4]="signin"} + CS = {XResourceManager = {GetBundleUrl = function(path) + return Available[path] and "bundle" or nil + end}} + XGoodsCommonManager = {GetGoodsIcon = function(id) return GoodsIcons[id] end} + XRewardManager = {GetRewardList = function(id) return {{TemplateId=4}} end} + ''') + source = Path(__file__).with_name('store_catalog_icons.lua').read_text(encoding='utf-8') + self.lua.execute('local PurchaseIconAssetPathConfig = TestIcons\n' + source) + + def test_valid_original_and_cover_preserved(self): + self.lua.execute(''' + local result = XPurchaseConfigs.GetIconPathByIconName("current", {RewardGoodsList={{TemplateId=2}}}) + assert(result.AssetPath == "art" and result.CoverImgPath == "cover") + ''') + + def test_missing_art_uses_first_available_reward_without_mutating_table(self): + self.lua.execute(''' + local result = XPurchaseConfigs.GetIconPathByIconName("missing", { + RewardGoodsList={{TemplateId=1}, {TemplateId=2}}}) + assert(result.AssetPath == "reward" and result.CoverImgPath == nil) + assert(TestIcons.missing.AssetPath == "old-art") + assert(XPurchaseConfigs.GetIconPathByIconName("missing").AssetPath == "old-art") + ''') + + def test_rewards_are_specific_to_each_package(self): + self.lua.execute(''' + local first = XPurchaseConfigs.GetIconPathByIconName("missing", {RewardGoodsList={{TemplateId=2}}}) + local second = XPurchaseConfigs.GetIconPathByIconName("missing", {RewardGoodsList={{TemplateId=3}}}) + assert(first.AssetPath == "reward" and second.AssetPath == "daily") + ''') + + def test_daily_and_signin_only_packages(self): + self.lua.execute(''' + local daily = XPurchaseConfigs.GetIconPathByIconName("missing", {DailyRewardGoodsList={{TemplateId=3}}}) + assert(daily.AssetPath == "daily") + local signin = XPurchaseConfigs.GetIconPathByIconName("missing", { + PurchaseSignInInfo={PurchaseSignInRewardInfos={10}}}) + assert(signin.AssetPath == "signin") + ''') + + def test_available_cover_survives_missing_base(self): + self.lua.execute(''' + local result = XPurchaseConfigs.GetIconPathByIconName("coverOnly", {RewardGoodsList={{TemplateId=2}}}) + assert(result.AssetPath == "reward" and result.CoverImgPath == "cover") + ''') + + def test_no_valid_resource_does_not_invent_an_icon(self): + self.lua.execute('assert(XPurchaseConfigs.GetIconPathByIconName("missing", {RewardGoodsList={}}) == nil)') + + +class PatchTests(unittest.TestCase): + def test_existing_recharge_patch_is_preserved(self): + original = ' DoPay(productKey, res.GameOrder, template.GoodsId)' + patched = patch_recharge_lua(original) + self.assertEqual(patched, patch_recharge_lua(patched)) + + def test_changed_resolver_is_rejected(self): + with self.assertRaises(RuntimeError): + patch_catalog_lua('XPurchaseConfigs.lua', 'function changed() end') + + def source_dir(self): + path = os.environ.get('PGR_RESEARCH_LUA') + if not path: + self.skipTest('Set PGR_RESEARCH_LUA for installed client source verification') + return Path(path) + + def test_real_client_scripts_compile_and_all_call_sites_patch(self): + source_dir = self.source_dir() + lua = LuaRuntime(unpack_returned_tuples=True) + compile_lua = lua.eval('function(source) assert(load(source)) end') + for name in ['XPurchaseConfigs.lua', *CATALOG_CALLERS]: + with self.subTest(name=name): + original = (source_dir / name).read_text(encoding='utf-8') + for script in [original, original.replace('\n', '\r\n')]: + patched = patch_catalog_lua(name, script) + self.assertNotEqual(script, patched) + compile_lua(patched) + + def test_real_timer_expiry_removes_owned_overlay(self): + source_dir = self.source_dir() + for name in ['XUiPurchaseLBListItem.lua', 'XUiPurchaseCoatingLBListItem.lua']: + with self.subTest(name=name): + lua = LuaRuntime(unpack_returned_tuples=True) + lua.execute(''' + XClass = function() return {} end + CS = {XTextManager={GetText=function(key) return key end}} + XUiHelper = {GetTime=function(t) return tostring(t) end, TimeFormatType={PURCHASELB=1}} + XOverseaManager = {IsKRRegion=function() return false end} + function Active(value) + return {gameObject={active=value, SetActive=function(self, flag) self.active=flag end}} + end + Card = {RemainTime=2, UpdateTimerType=1, + Parent={RemoveTimerFun=function() end}, ItemData={Id=1, BuyTimes=0, BuyLimitTimes=1}, + ImgSellout=Active(false), ImgHave=Active(true), TxtUnShelveTime={}, TxtSetOut={}, + ActiveImgTimeBg=function() end} + ''') + lua.globals().CardClass = lua.execute(patch_catalog_lua(name, (source_dir / name).read_text(encoding='utf-8'))) + lua.execute(''' + CardClass.UpdateTimer(Card, false, 1) + assert(Card.ImgHave.gameObject.active and not Card.ImgSellout.gameObject.active) + CardClass.UpdateTimer(Card, false, 1) + assert(not Card.ImgHave.gameObject.active and Card.ImgSellout.gameObject.active) + ''') + + +if __name__ == '__main__': + unittest.main()