using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using asap.core; using cfg; using CodeStage.AntiCheat.ObscuredTypes; using game; using LitJson; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using tysdk; using UniRx; using UnityEngine; namespace GameCore { public class SKUDetailDataEvent { public SKUDetailDataEvent(IAPItemList iap) { this.iap = iap; } public IAPItemList iap; public string price; public float prodPrice; } public enum ShopBuyType { None = 0, ShopToken = 1, ShopPackDailyBuy = 2, EventPack = 3, TriggerPack = 4, } public class ShopBuyTypeData { public ShopBuyType type = ShopBuyType.ShopToken; /// /// ShopToken = ID 记录是否买过(首次有赠送) 获取IAPID /// EventPack = Event活动ID,具体数据处理 FishingEventData.OnBuyEventPack /// TriggerPack = TriggerPackManager.ID,购买删除礼包 /// ShopPack = ShopPackManager.ID 根据类型处理 type = 3 礼包链增加次数 /// public int ID; /// /// 每日礼包记录key /// public string key; /// /// 非Event礼包的结束时间,以天为单位 /// public int endDay; public bool IsHide;//不自动塞入 ShowData 展示队列 [NonSerialized] public bool NoShow;//不自动展示 ShowData 展示队列 } public class ReplenishmentData { public ShopBuyTypeData BuyType; public int IAPID; public List ItemData; public RewardType ShowType; //以下是打点信息 public string CONTENT_ID; public float PRICE; public string CURRENCY; public float ProdPrice; public JObject extraPurcheData; public string orderId; public string time; } public partial class PlayerShopData : IDisposable { [Inject] public cfg.Tables _tables { get; set; } [Inject] public IIAPService IAPService { get; set; } public const int freeRefreshTime = 8; IList SKUDetails; Dictionary SKUDetailDataMap = new Dictionary(); Dictionary PackManagerMap = new Dictionary(); List PackManagerataList = new List(); List buyData = new List(); //ShopPack每日购买次数 public Dictionary shopPackDailyBuyCount = new Dictionary(); // Pack全部购买次数 public Dictionary shopAllPackBuyCount = new Dictionary(); // 金币鱼饵礼包购买次数 public Dictionary shopGiftBuyCount = new Dictionary(); public int shopTipforUnlocked; public int vipTipforUnlocked; public EventPackManager chainPackM; public DailySignEvent ChainPackData; public AdvertData VIPAdPackData; public ObscuredInt Voucher { get; private set; } // public bool IsShopOpen = false; public bool IsShopTopOpen = false; public bool IsVIPOpen = false; DateTime CreateTime; //待释放 CompositeDisposable disposables = null; List ReplenishmentDatas = new List(); Dictionary replenishmentDataStrs = new Dictionary(); //const string ReplenishmentDataKey = "ReplenishmentDataStr"; //const string OldReplenishmentDataKey = "OldReplenishmentDataKey"; public readonly BlackFridayCouponData CouponData = new BlackFridayCouponData(); #region Diamond Shop //Diamond Shop public bool IsShopOpen = false; private Dictionary _diamondShopItemRecords = new(); private int _diamondShopRefreshCount; private DateTime _diamondShopRefreshTime; #endregion #region 广告次数 /// /// -2 广告券数量 -1 数据所属天数 0 总广告次数 /// Dictionary advertCount = new Dictionary(); #endregion public void InitData(Dictionary userDatas) { if (userDatas == null || userDatas.Count < 1) { return; } string data_value; if (userDatas.TryGetValue("ShopPackBuyCount", out data_value)) { shopPackDailyBuyCount = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value); } if (userDatas.TryGetValue("ShopAllPackBuyCount", out data_value)) { shopAllPackBuyCount = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value); } if (userDatas.TryGetValue("ShopGiftBuyCount", out data_value)) { shopGiftBuyCount = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value); } if (userDatas.TryGetValue("Voucher", out data_value)) { InitVoucher(GlobalUtils.TryParseInt(data_value)); } if (userDatas.TryGetValue("ChainPackDataNew", out data_value)) { SetChainPackData(Newtonsoft.Json.JsonConvert.DeserializeObject(data_value)); } if (userDatas.TryGetValue("VIPAdPackData", out data_value)) { SetVIPAdPackData(Newtonsoft.Json.JsonConvert.DeserializeObject(data_value)); } if (userDatas.TryGetValue("TurntableAdData", out data_value)) { TurntableAdData = Newtonsoft.Json.JsonConvert.DeserializeObject(data_value); } //if (userDatas.TryGetValue("FishCardPackData", out data_value)) //{ // SetFishCardPackData(data_value); //} if (userDatas.TryGetValue("BuyData", out data_value)) { buyData = Newtonsoft.Json.JsonConvert.DeserializeObject>(data_value); } if (userDatas.TryGetValue("AdvertAllCount", out data_value)) { InitAdvertCount(data_value); } if (userDatas.TryGetValue("DiamondShopRefreshCount", out data_value)) { _diamondShopRefreshCount = (int.Parse(data_value)); } if (userDatas.TryGetValue("DiamondShopRefreshTime", out data_value)) { _diamondShopRefreshTime = DateTime.Parse(data_value); } if (userDatas.TryGetValue("DiamondShopItemRecords", out data_value)) { _diamondShopItemRecords = JsonConvert.DeserializeObject>(data_value); } if (userDatas.TryGetValue(BlackFridayCouponData.PlayFabDataKey, out data_value)) { // Debug.Log($"Black Friday load data!!"); CouponData.LoadData(data_value); } } public float GetBuyPaymentAmount() { if (buyData.Count > 0) { return buyData[0]; } return 0; } public void AddVoucher(int value) { Voucher = Voucher + value; PlayFabMgr.Instance.UpdateUserDataValue("Voucher", Voucher.ToString()); } public void Init() { PackManagerMap = _tables.TbShopPackManager.DataMap; PackManagerataList = _tables.TbShopPackManager.DataList; CreateTime = GContext.container.Resolve().CreateTime; InitShopPackData(); ClearAdvertCount(); if (disposables == null) { disposables = new CompositeDisposable(); GContext.OnEvent().Subscribe(GetIAPPrice).AddTo(disposables); } GetSKUs(); } private static System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^[A-Z]+"); private string RemoveCurrencyCode(string price) { return regex.Replace(price, string.Empty); } public async void GetSKUs() { Debug.Log("[DataCenter.PlayerData] GetSKUList fetch"); SKUDetails = await IAPService.GetSKUs(); SKUDetailDataMap.Clear(); if (SKUDetails != null && SKUDetails.Count > 0) { for (int i = 0; i < SKUDetails.Count; i++) { if (!SKUDetailDataMap.ContainsKey(SKUDetails[i].ProdKey)) { #if UNITY_ANDROID || UNITY_EDITOR var price = SKUDetails[i].price; SKUDetails[i].price = RemoveCurrencyCode(price); #endif SKUDetailDataMap.Add(SKUDetails[i].ProdKey, SKUDetails[i]); } } } } void GetIAPPrice(SKUDetailDataEvent data) { if (data.iap != null) { if (SKUDetailDataMap.TryGetValue(data.iap.ProductId1, out var v)) { #if UNITY_ANDROID || UNITY_EDITOR data.price = v.price; #else data.price =$"{v.localeCurrencySymbol}{v.price}"; #endif #if UNITY_EDITOR data.prodPrice = data.iap.PaymentAmount; #else data.prodPrice = v.ProdPrice; #endif } else { data.prodPrice = data.iap.PaymentAmount; data.price = $"US${data.iap.PaymentAmount}"; } } else { data.price = LocalizationMgr.GetText("UI_TurntableInfoPopupPanel_10"); } } public ShopPackManager TbPackManagerGetOrDefault(int id) { return PackManagerMap.TryGetValue(id, out var v) ? v : null; } public void InitVoucher(int value) { Voucher = value; } private JObject GenExtraPurcheData(int dropID, IAPItemList iAPItemList, List itemDataGift) { int buyDataCount = buyData.Count; var extraPurcheData = new JObject(); extraPurcheData["purchase_count"] = buyDataCount == 0 ? 1 : buyDataCount; extraPurcheData["trade_name"] = iAPItemList.TradeName; extraPurcheData["trade_type"] = iAPItemList.TradeType; extraPurcheData["usd_price"] = iAPItemList.PaymentAmount; extraPurcheData["iap_id"] = iAPItemList.ID; extraPurcheData["drop_id"] = dropID; extraPurcheData["trade_group"] = iAPItemList.TradeGroup; if (itemDataGift != null) { for (int i = 0; i < itemDataGift.Count; i++) { extraPurcheData[$"item_{itemDataGift[i].id}"] = itemDataGift[i].count; } } return extraPurcheData; } public async Task OnBuy(int dropID, ShopBuyTypeData buyType, IAPItemList iAPItemList, List itemDataGift, RewardType rewardShowType = RewardType.Normal) { if (iAPItemList == null) { return false; } if (Voucher >= iAPItemList.CostToken) { Voucher = Voucher - iAPItemList.CostToken; PlayFabMgr.Instance.UpdateUserDataValue("Voucher", Voucher.ToString()); //二次弹窗 //回调 BuySuccess(buyType, iAPItemList, itemDataGift, rewardShowType, true); if (!buyType.NoShow) { GContext.Publish(new ShowData()); } return true; } else if (SKUDetailDataMap.TryGetValue(iAPItemList.ProductId1, out SKUDetail sku)) { //充值购买平台 GameDebug.Log($"IAP_ID:{iAPItemList.ID}Price:${iAPItemList.PaymentAmount}"); var extraPurcheData = GenExtraPurcheData(dropID, iAPItemList, itemDataGift); #if !UNITY_EDITOR if (iAPItemList.PaymentAmount <= 0.5f || sku.ProdPrice <= 0.5f) return false; #endif //在这里存补单数据 ReplenishmentData replenishmentData = new ReplenishmentData() { BuyType = buyType, ItemData = itemDataGift, IAPID = iAPItemList.ID, ShowType = rewardShowType, CONTENT_ID = sku.ProdID, CURRENCY = sku.price_currency_code, #if !UNITY_EDITOR ProdPrice = sku.ProdPrice, #endif PRICE = iAPItemList.PaymentAmount, extraPurcheData = extraPurcheData, //orderId = orderId; time = ZZTimeHelper.UtcNow().ToString() }; string replenishmentDataStr = JsonConvert.SerializeObject(replenishmentData); //付费成功的回调,可能购买成功之后也会调用一次 Action OnSuccessFromSdk = (orderId) => { switch (buyType.type) { case ShopBuyType.ShopToken: //商店首次购买记录 OnShopTokenSuccess(buyType.ID, true); break; } }; PaymentInfo result = await IAPService.Pay(OnSuccessFromSdk, replenishmentDataStr, sku, 1, iAPItemList.PaymentAmount, extraPurcheData); if (result.isSuccess) { PlayFabMgr.Instance.UpdateUserDataValue("LastPaymentTime", $"{ZZTimeHelper.UtcNow()}__{sku.price}"); BuySuccess(buyType, iAPItemList, itemDataGift, rewardShowType); if (!buyType.NoShow) { GContext.Publish(new ShowData()); } return true; } else { if (result.isSuccessFromSdk || result.code == "10000") { GameObject go = await UIManager.Instance.ShowUI(UITypes.NoticeConfirmPopupPanel); var NoticeConfirmPopupPanel = go.GetComponent(); string info = LocalizationMgr.GetText("UI_ToastPanel_ErrCode_1"); string title = LocalizationMgr.GetText("UI_FishingShopPanel_25"); NoticeConfirmPopupPanel.Init(1, title, info); } else { switch (result.code) { case "10001": { GameObject go = await UIManager.Instance.ShowUI(UITypes.NoticeConfirmPopupPanel); var NoticeConfirmPopupPanel = go.GetComponent(); string info = LocalizationMgr.GetText("UI_FishingShopPanel_28"); string title = LocalizationMgr.GetText("UI_FishingShopPanel_27"); NoticeConfirmPopupPanel.Init(1, title, info); } break; case "10002": { GameObject go = await UIManager.Instance.ShowUI(UITypes.NoticeConfirmPopupPanel); var NoticeConfirmPopupPanel = go.GetComponent(); string info = LocalizationMgr.GetText("UI_ToastPanel_ErrCode_1"); string title = LocalizationMgr.GetText("UI_FishingShopPanel_25"); NoticeConfirmPopupPanel.Init(1, title, info); } break; default: ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_2")); break; } } return false; } } else { ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_28")); return false; } } /// /// 商店购买记录 /// /// /// 是付费成功 还是验证成功 void OnShopTokenSuccess(int id, bool isFromSdk) { var shopToken = _tables.TbShopToken.GetOrDefault(id); if (shopToken != null) { if (isFromSdk) { //商店物品购买付费成功的回调记录 ShopTokenID AddShopGiftBuyCount(id); } else { //商店物品购买付费成功并验证通过的回调记录 IAPItemListID AddShopGiftBuyCount(shopToken.IAPID); if (shopToken.Type == 3) { //钻石付费成功 或者购买成功 if (CouponData.IsActive) { CouponData.SetStateBought(); } } } } } public async System.Threading.Tasks.Task GetReplenishmentData() { //补单信息从服务器拿 replenishmentDataStrs = await IAPService.GetOrderUnreceived(); } public async System.Threading.Tasks.Task ReleaseReplenishment() { ReplenishmentDatas.Clear(); if (replenishmentDataStrs == null || replenishmentDataStrs.Count == 0) { return; } List orderIDList = new List(); foreach (var item in replenishmentDataStrs) { //服务器判断是否支付 ReplenishmentData replenishment = JsonConvert.DeserializeObject(item.Value); replenishment.orderId = item.Key; ReplenishmentDatas.Add(replenishment); orderIDList.Add(item.Key); } bool result = await IAPService.ConfirmOrders(orderIDList); if (!result) { //服务器返回错误 ReplenishmentDatas.Clear(); } } public void ReleaseReplenishmentData() { if (ReplenishmentDatas.Count > 0) { //确认补单 删除订单 for (int i = 0; i < ReplenishmentDatas.Count; i++) { Replenishment(ReplenishmentDatas[i]); } replenishmentDataStrs.Clear(); ReplenishmentDatas.Clear(); } } void Replenishment(ReplenishmentData data) { IAPItemList iAPItemList = _tables.TbIAPItemList.GetOrDefault(data.IAPID); if (data.ShowType == RewardType.Normal) { data.ShowType = RewardType.NormalRestore; } else if (data.ShowType == RewardType.NormalOne) { data.ShowType = RewardType.NormalOneRestore; } var itemDataGift = data.ItemData; using (var e = GEvent.RevenueEvent()) { e.AddContent(AFInAppEvents.CONTENT_ID, data.CONTENT_ID) .AddContent(AFInAppEvents.PRICE, data.PRICE) .AddContent(AFInAppEvents.CURRENCY, data.CURRENCY) #if UNITY_ANDROID .AddContent("payment", "google") #else .AddContent("payment", "apple") #endif .AddContent(AFInAppEvents.QUANTITY, 1) .AddContent("order_id", data.orderId) .AddContent("payment_state", "finish") .AddContent("restore", true) .AddContent("af_revenue", data.ProdPrice); int buyDataCount = buyData.Count; data.extraPurcheData["purchase_count"] = buyDataCount == 0 ? 1 : buyDataCount; if (null != data.extraPurcheData) { foreach (var item in data.extraPurcheData) { e.AddContent(item.Key, item.Value); } } } BuySuccess(data.BuyType, iAPItemList, itemDataGift, data.ShowType); } void BuySuccess(ShopBuyTypeData buyType, IAPItemList iAPItemList, List itemDataGift, RewardType rewardShowType, bool Voucher = false) { if (!Voucher) { if (buyData.Count == 0) { buyData.Add(iAPItemList.PaymentAmount); } else { buyData[0] += iAPItemList.PaymentAmount; } buyData.Add(iAPItemList.ID); PlayFabMgr.Instance.UpdateUserDataValue("BuyData", JsonMapper.ToJson(buyData)); #if AGG GEvent.SetUserProp("Total_consumption", buyData[0]); #endif } GContext.Publish(new ConditionTypeEvent(ConditionType.RechargeAmount, iAPItemList.VIPPoint)); ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_3")); if (!buyType.IsHide) { var newItemData = itemDataGift.Where(x => x.id != 3002).ToList(); GContext.Publish(new ShowData(newItemData, rewardShowType)); } GContext.container.Resolve().AddItem(itemDataGift); GContext.container.Resolve().AddVIPScore(iAPItemList.VIPPoint, true); int curEnd = ZZTimeHelper.UtcNow().UtcNowOffset().Day; switch (buyType.type) { case ShopBuyType.None: break; case ShopBuyType.ShopToken: //商店首次购买记录 OnShopTokenSuccess(buyType.ID, false); break; case ShopBuyType.ShopPackDailyBuy: if (buyType.endDay == curEnd) { //每日更新礼包 AddShopPackDailyBuyCount(buyType.key, 1); } break; case ShopBuyType.EventPack: //Event 礼包 GContext.container.Resolve().OnBuyEventPack(buyType.ID); break; case ShopBuyType.TriggerPack: //触发礼包 GContext.container.Resolve().AddTriggerPackCount(buyType.ID); break; } GContext.Publish(new ConditionTypeEvent(ConditionType.MakeInAppPurchase, 1)); } /// /// 一个统一的跨天刷新节点 /// public void InitShopPackData() { int dayOfYear = shopPackDailyBuyCount.GetValueOrDefault("0"); //if (shopPackDailyBuyCount.TryGetValue("0", out int dayOfYear)) //{ if (dayOfYear != ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear) { GContext.container.Resolve().AllRefresh(); shopPackDailyBuyCount.Clear(); if (VIPAdPackData != null) { VIPAdPackData.day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; VIPAdPackData.index = 0; VIPAdPackData.cdTime = null; SetAdvRedPoint(); } TurntableAdData = null; shopPackDailyBuyCount["0"] = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; PlayFabMgr.Instance.UpdateUserDataValue("ShopPackBuyCount", JsonMapper.ToJson(shopPackDailyBuyCount)); } //} } //每日购买(ID)次数(触发(Type)),每日重置 public void AddShopPackDailyBuyCount(int id, int count, bool addAll = true) { string idStr = id.ToString(); AddShopPackDailyBuyCount(idStr, count); if (addAll) { AddAllPackCount(id, count); } } //需要每日清空的数据 懒得改名 public void AddShopPackDailyBuyCount(string idStr, int count = 1) { if (shopPackDailyBuyCount.ContainsKey(idStr)) { shopPackDailyBuyCount[idStr] += count; } else { shopPackDailyBuyCount.Add(idStr, count); } shopPackDailyBuyCount["0"] = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; PlayFabMgr.Instance.UpdateUserDataValue("ShopPackBuyCount", JsonMapper.ToJson(shopPackDailyBuyCount)); } public int GetShopPackBuyCount(int id) { string idStr = id.ToString(); return GetShopPackBuyCount(idStr); } public int GetShopPackBuyCount(string id) { if (shopPackDailyBuyCount.ContainsKey(id)) { return shopPackDailyBuyCount[id]; } return 0; } public void SetAdvRedPoint() { bool isRed = false; var DailyGiftPackList = GContext.container.Resolve().priceLevel.DailyGiftPackList; int id; Daily daily; DateTime now = ZZTimeHelper.UtcNow().UtcNowOffset(); ShopPackManager dailyGiftPackM = null; for (int i = 0; i < DailyGiftPackList.Count; i++) { id = DailyGiftPackList[i]; dailyGiftPackM = TbPackManagerGetOrDefault(id); if (dailyGiftPackM == null) continue; daily = dailyGiftPackM.TimeDefinition as Daily; if (TimeSpan.FromSeconds(daily.StartTime) <= now.TimeOfDay && TimeSpan.FromSeconds(daily.EndTime) > now.TimeOfDay) { break; } } if (dailyGiftPackM != null) { isRed = GetShopPackBuyCount(dailyGiftPackM.ID) < 1; } RedPointManager.Instance.SetRedPointState(HomeBtnAdvert.redKey, isRed); } /// /// 作为首次购买的依据 ShopTokenID 或 IAPItemListID有次数都不是首充 /// /// /// public void AddShopGiftBuyCount(int id, int count = 1) { if (shopGiftBuyCount.ContainsKey(id)) { shopGiftBuyCount[id] += count; } else { shopGiftBuyCount.Add(id, count); } PlayFabMgr.Instance.UpdateUserDataValue("ShopGiftBuyCount", JsonMapper.ToJson(shopGiftBuyCount)); } /// /// 作为首次购买的依据 ShopTokenID 或 IAPItemListID有次数都不是首充 /// /// public int GiftBuyCount(int id) { shopGiftBuyCount.TryGetValue(id, out int buyCount); return buyCount; } //=====================================礼包===================================== #region =================礼包========================= #region 链式礼包 public void SetChainPackData(DailySignEvent chainPackData) { ChainPackData = chainPackData; } void SetChainPackRed() { bool isRed = false; if (chainPackM != null) { if (chainPackM.VIPPackList[ChainPackData.lastID].Count > ChainPackData.index) { var pack = _tables.TbPack.GetOrDefault(chainPackM.VIPPackList[ChainPackData.lastID][ChainPackData.index]); isRed = _tables.TbIAPItemList.GetOrDefault(pack.IAPID) == null; } } RedPointManager.Instance.SetRedPointState(RedPointName.Home_Gift2, isRed); } public void AddChainPack(FishingEvent t) { if (ChainPackData == null || ChainPackData.ID != t.ID) { DateTime dateTime = ZZTimeHelper.UtcNow().UtcNowOffset(); var time = dateTime.AddDays(10).Date; if (t.TimeDefinition is Weekly) { Weekly weekly = (Weekly)t.TimeDefinition; int offfset = (int)dateTime.DayOfWeek - weekly.StartTime; if (offfset < 0) { offfset = -offfset; } else { offfset = 7 - offfset; } time = dateTime.AddDays(offfset).Date; } else if (t.TimeDefinition is LimitedTime) { LimitedTime limitedTime = (LimitedTime)t.TimeDefinition; time = GlobalUtils.TryParseDateTime(limitedTime.EndTime, ZZTimeHelper.UtcNow()).UtcNowOffset(); } ChainPackData = new DailySignEvent() { ID = t.ID, lastID = GContext.container.Resolve().PriceLv,//VIP等级,礼包连该新,尽量少改代码 index = 0, time = time.ToString() }; PlayFabMgr.Instance.UpdateUserDataValue("ChainPackDataNew", JsonMapper.ToJson(ChainPackData)); chainPackM = null; } if (chainPackM == null) { chainPackM = _tables.TbEventPackManager.GetOrDefault(t.RedirectID); UITypes.GiftChainCommon_SubmarinePanel.SetType(chainPackM.Panel); GContext.container.Resolve().AddGiftFaceUI(chainPackM.ID, UITypes.GiftChainCommon_SubmarinePanel, chainPackM.PackType); SetChainPackRed(); GContext.Publish(new TargetEvent(chainPackM.ID, 3, 10)); } } public bool IsOpenChainGiftPack() { bool isOpen = false; if (chainPackM != null) { if (chainPackM.VIPPackList[ChainPackData.lastID].Count > ChainPackData.index) { var endTime = GetChainEndTime(); TimeSpan now = endTime - ZZTimeHelper.UtcNow().UtcNowOffset(); double seconds = now.TotalSeconds; isOpen = seconds > 0; } } return isOpen; } public void AddOpenChainGifIndex() { if (chainPackM == null || ChainPackData == null) { return; } ChainPackData.index++; SetChainPackRed(); if (chainPackM.VIPPackList[ChainPackData.lastID].Count <= ChainPackData.index) { AddAllPackCount(chainPackM.ID, 1); } PlayFabMgr.Instance.UpdateUserDataValue("ChainPackDataNew", JsonMapper.ToJson(ChainPackData)); //链式礼包 特殊处理 GContext.Publish(new TargetEvent(chainPackM.ID, 3, 10)); } public DateTime GetChainEndTime() { return GlobalUtils.TryParseDateTime(ChainPackData.time, ZZTimeHelper.UtcNow().UtcNowOffset()); } #endregion public int GetAllPackCount(int id) { if (shopAllPackBuyCount.ContainsKey(id)) { return shopAllPackBuyCount[id]; } return 0; } //总购买次数 public void AddAllPackCount(int id, int count) { if (shopAllPackBuyCount.ContainsKey(id)) { shopAllPackBuyCount[id] += count; } else { shopAllPackBuyCount.Add(id, count); } GContext.Publish(new ConditionTypeEvent(ConditionType.BuyPack, count)); PlayFabMgr.Instance.UpdateUserDataValue("ShopAllPackBuyCount", JsonMapper.ToJson(shopAllPackBuyCount)); } #endregion //========================================礼包======================================== #region 广告次数 public void InitAdvertCount(string data) { if (string.IsNullOrEmpty(data) == false) { advertCount = Newtonsoft.Json.JsonConvert.DeserializeObject>(data); } } public void AddAdticket(int count) { if (advertCount.ContainsKey(-2)) { advertCount[-2] += count; } else { advertCount[-2] = count; } if (advertCount[-2] < 0) { advertCount[-2] = 0; } #if AGG if (count < 0) { using (var e = GEvent.GameEvent("item_change", gaSend: false)) { e.AddContent("item_id", 1006) .AddContent("state_info", "cost") .AddContent("change_num", count); } } #endif PlayFabMgr.Instance.UpdateUserDataValue("AdvertAllCount", JsonMapper.ToJson(advertCount)); GContext.Publish(new ResAddEvent(1006)); } public int GetAdticketCount() { return advertCount.GetValueOrDefault(-2); } public int AddAdvertCount(int id) { ClearAdvertCount(); if (advertCount.ContainsKey(0)) { advertCount[0]++; } else { advertCount[0] = 1; } if (advertCount.ContainsKey(id)) { advertCount[id] += 1; } else { advertCount.Add(id, 1); } PlayFabMgr.Instance.UpdateUserDataValue("AdvertAllCount", JsonMapper.ToJson(advertCount)); return advertCount[id]; } public void ClearAdvertCount() { int allCount = advertCount.GetValueOrDefault(0); int ticket = advertCount.GetValueOrDefault(-2); if (advertCount.TryGetValue(-1, out int day)) { if (day != ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear) { advertCount.Clear(); advertCount[-1] = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; advertCount[0] = allCount; advertCount[-2] = ticket; PlayFabMgr.Instance.UpdateUserDataValue("AdvertAllCount", JsonMapper.ToJson(advertCount)); } } else { advertCount[-1] = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; } } public int GetAdvertCount(int id) { if (advertCount.ContainsKey(id)) { return advertCount[id]; } return 0; } #endregion #region 主界面VIP礼包 public void SetVIPAdPackData(AdvertData vipAdPackData) { int dayOfYear = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; if (vipAdPackData != null && vipAdPackData.day != dayOfYear) { vipAdPackData = null; } VIPAdPackData = vipAdPackData; } public void SetVIPPackNext() { List adConfigs = _tables.TbAdConfig.DataList; if (VIPAdPackData == null) { VIPAdPackData = new AdvertData(); VIPAdPackData.day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; } VIPAdPackData.index++; if (VIPAdPackData.index < adConfigs.Count) { AdConfig adConfig = adConfigs[VIPAdPackData.index]; VIPAdPackData.ID = adConfig.ID; AdConfig adConfig1 = adConfigs[VIPAdPackData.index - 1]; VIPAdPackData.cdTime = ZZTimeHelper.UtcNow().UtcNowOffset().AddSeconds(adConfig1.Interval).ToString(); } PlayFabMgr.Instance.UpdateUserDataValue("VIPAdPackData", JsonMapper.ToJson(VIPAdPackData)); //GContext.Publish(new VIPAdPackDataEvent()); } public DateTime GetVIPAdPackTime() { if (VIPAdPackData != null) { return GlobalUtils.TryParseDateTime(VIPAdPackData.cdTime, ZZTimeHelper.UtcNow().UtcNowOffset()); } else { return ZZTimeHelper.UtcNow().UtcNowOffset(); } } //public AdConfig GetVIPAdPackConfig() //{ // if (VIPAdPackData == null) // { // VIPAdPackData = new AdvertData(); // VIPAdPackData.day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; // } // return _tables.TbAdConfig.DataList[VIPAdPackData.index]; //} public void OpenAdPack() { if (VIPAdPackData != null && VIPAdPackData.isOpen) { return; } VIPAdPackData = new AdvertData(); VIPAdPackData.day = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; VIPAdPackData.isOpen = true; PlayFabMgr.Instance.UpdateUserDataValue("VIPAdPackData", JsonMapper.ToJson(VIPAdPackData)); } public bool IsOpenAdPack() { //if (GContext.container.Resolve().ABAdOpen // && GContext.container.Resolve().lv < 40) //{ // return false; //} return VIPAdPackData != null && VIPAdPackData.isOpen; } public bool IsShowVIPAdTimer() { List adConfigs = _tables.TbAdConfig.DataList; return VIPAdPackData.index >= adConfigs.Count; } #endregion #region TurntableAd public DailySignEvent TurntableAdData; /* About TurntableAdData: lastID: the day this ad is activated ID: ID of the current ad time: The end time of coolDown for the current Ad */ public WheelAd GetTurntableAdCofig() { if (TurntableAdData == null) { TurntableAdData = new DailySignEvent(); TurntableAdData.index = 1; TurntableAdData.lastID = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; } return _tables.TbWheelAd[TurntableAdData.index]; } public void UpdateTurntableAd() { var adConfigs = _tables.TbWheelAd; if (TurntableAdData == null) { TurntableAdData = new DailySignEvent(); TurntableAdData.index = 1; TurntableAdData.lastID = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; } TurntableAdData.index++; if (TurntableAdData.index <= adConfigs.DataList.Count) { TurntableAdData.ID = adConfigs[TurntableAdData.index].ID; TurntableAdData.time = ZZTimeHelper.UtcNow().UtcNowOffset() .AddSeconds(adConfigs[TurntableAdData.index - 1].Interval).ToString(); // isOverForToday = false; // } // else // { // isOverForToday = true; } PlayFabMgr.Instance.UpdateUserDataValue("TurntableAdData", Newtonsoft.Json.JsonConvert.SerializeObject(TurntableAdData)); // GContext.Publish(new VIPAdPackDataEvent()); } public bool IsTurntableAdMaxOut() { if (TurntableAdData == null) { TurntableAdData = new DailySignEvent(); TurntableAdData.index = 1; TurntableAdData.lastID = ZZTimeHelper.UtcNow().UtcNowOffset().DayOfYear; } return TurntableAdData.index > _tables.TbWheelAd.DataList.Count; } public DateTime GetTurnTableNextAdTime() { if (TurntableAdData == null) { return ZZTimeHelper.UtcNow().UtcNowOffset(); } return GlobalUtils.TryParseDateTime(TurntableAdData.time, ZZTimeHelper.UtcNow().UtcNowOffset()); } #endregion #region Diamond Shop public class ItemShopData { public int ItemShopID; public ItemShopRecord Record; // public int SortID; public int Count; public int DiamondCost; public int GetDiscountDiamondCost() { return Mathf.RoundToInt(DiamondCost * Record.Discount); } } public List GetItemShopData() { if (CheckIfRefreshItemShop()) { AutoRefreshDiamonShop(); } var itemShopDatas = new List(); var diamondStoreData = _tables.TbItemStore.DataMap; foreach (var record in _diamondShopItemRecords) { if (!diamondStoreData.ContainsKey(record.Key)) continue; var itemShopData = diamondStoreData[record.Key]; var count = itemShopData.ItemNumber; var diamondCost = itemShopData.TokenNumber; // var sortID = itemShopData.SortId; itemShopDatas.Add(new ItemShopData { ItemShopID = record.Key, // SortID = sortID, Record = record.Value, Count = count, DiamondCost = diamondCost, }); } return itemShopDatas.ToList(); } public TimeSpan GetDiamondShopRefreshTime() { var now = ZZTimeHelper.UtcNow().UtcNowOffset(); return _diamondShopRefreshTime - now; } public int GetDiamondShopRefreshCost() { var refreshCost = _tables.TbStoreConfig.Get(1).RefreshPrice; if (_diamondShopRefreshCount >= refreshCost.Count) { //Test // Debug.LogError("[PlayerShopData::GetDiamondShopRefreshCost]Can not refresh!"); return refreshCost[refreshCost.Count - 1]; } return refreshCost[_diamondShopRefreshCount]; } public (int refresh, int maxRefresh) GetDiamondShopRefreshInfo() { var maxRefresh = _tables.TbStoreConfig.Get(1).RefreshTimes; return (maxRefresh - _diamondShopRefreshCount, maxRefresh); } public void SetItemShopSlotBought(int itemShopId) { _diamondShopItemRecords[itemShopId].hasBought = 1; SetItemShopRedPoint(); PlayFabMgr.Instance.UpdateUserDataValue("DiamondShopItemRecords", JsonConvert.SerializeObject(_diamondShopItemRecords)); } private bool CheckIfRefreshItemShop() { return _diamondShopRefreshTime <= ZZTimeHelper.UtcNow().UtcNowOffset(); } public void RefreshDiamondShop() { if (_diamondShopRefreshCount < _tables.TbStoreConfig.Get(1).RefreshTimes) { RefreshItemShop(); _diamondShopRefreshCount++; PlayFabMgr.Instance.UpdateUserDataValue("DiamondShopRefreshCount", _diamondShopRefreshCount.ToString()); } } public void OnHonePanelLoaded() { if (CheckIfRefreshItemShop()) { AutoRefreshDiamonShop(); } SetItemShopRedPoint(); } private void SetItemShopRedPoint() { var diamondSotre = _tables.TbItemStore.DataMap; foreach (var record in _diamondShopItemRecords) { if (record.Value.hasBought == 0 && diamondSotre[record.Key].TokenNumber == 0) { RedPointManager.Instance.SetRedPointState(RedPointName.Home_Shop_Item, true); return; } } RedPointManager.Instance.SetRedPointState(RedPointName.Home_Shop_Item, false); } public void AutoRefreshDiamonShop() { Debug.Log("[PlayerShopData::GetItemSHopData] Refresh itemShop Data!"); //明天这个时候刷新 var now = ZZTimeHelper.UtcNow().UtcNowOffset(); var timeList = _tables.TbStoreConfig.Get(1).AutoRefresh.Split(':'); var hour = int.Parse(timeList[0]) == 24 ? 0 : int.Parse(timeList[0]); var timeSpan = new TimeSpan(hour, int.Parse(timeList[1]), int.Parse(timeList[2])); _diamondShopRefreshTime = new DateTime(now.Year, now.Month, now.Day).AddDays(1) + timeSpan; _diamondShopRefreshCount = 0; PlayFabMgr.Instance.UpdateUserDataValue("DiamondShopRefreshCount", _diamondShopRefreshCount.ToString()); PlayFabMgr.Instance.UpdateUserDataValue("DiamondShopRefreshTime", _diamondShopRefreshTime.ToString()); RefreshItemShop(); } private void RefreshItemShop() { _diamondShopItemRecords.Clear(); var diamondStoreData = _tables.TbItemStore.DataMap; //格子数量增加时修改调整 var totalCell = 6; for (int i = 1; i <= totalCell; i++) { var datas = diamondStoreData.Values.Where(x => x.CellId == i).ToList(); var totalWeight = 0; datas.ForEach(x => totalWeight += x.Weight); var randomWeight = UnityEngine.Random.Range(1, totalWeight); var curWeight = 0; var itemID = -1; foreach (var data in datas) { curWeight += data.Weight; if (curWeight >= randomWeight) { itemID = data.ItemId; if (data.ItemType == 1) { //随机鱼竿 var dropID = _tables.TbItem.DataMap[data.ItemId].RedirectID; itemID = GContext.container.Resolve().GetItemDataByDropIdAndType(dropID)[0].id; } else if (data.ItemType == 9) { //随机鱼卡 var mapDatas = _tables.TbMapData.DataList; var lastMapID = GContext.container.Resolve().lastMapId; var mapIDs = new List(); foreach (var map in mapDatas) { if (map.ID <= lastMapID) { mapIDs.Add(map.ID); } else { break; } } var mapID = mapIDs[UnityEngine.Random.Range(0, mapIDs.Count)]; var mapData = _tables.TbMapData.GetOrDefault(mapID); if (mapData != null) { itemID = mapData.FishCardItemList[itemID]; } } //Get disCount var discount = 1.0f; var allWeight = 0; data.DiscountWeight.ForEach(weight => allWeight += weight); var curWeight1 = UnityEngine.Random.Range(0, allWeight); for (int j = 0; j < data.DiscountWeight.Count; j++) { curWeight1 -= data.DiscountWeight[j]; if (curWeight1 <= 0) { discount = data.Discount[j]; break; } } _diamondShopItemRecords.Add(data.Id, new ItemShopRecord(itemID, discount, 0)); break; } } } PlayFabMgr.Instance.UpdateUserDataValue("DiamondShopItemRecords", JsonConvert.SerializeObject(_diamondShopItemRecords)); SetItemShopRedPoint(); } #endregion public void Dispose() { disposables?.Dispose(); disposables = null; } } }