using asap.core; using cfg; using GameCore; using System; using System.Collections.Generic; public class BuffDataCenter { private cfg.Tables _tables; public BuffDataCenter(cfg.Tables tables) { this._tables = tables; } Dictionary mapBuffDataList = new Dictionary(); List targetBuffDataList = new List(); Dictionary globalBuffDataList = new Dictionary(); FishBuffTimeData fishDailyBuff = null; public List showFishBuffIds = new List(); public void InitData(Dictionary userDatas) { if (userDatas.TryGetValue("BuffDataList", out string buffDataStr)) { InitBuffData(buffDataStr); } if (userDatas.TryGetValue("TargetBuffDataList", out string targetBuffDataStr)) { InitTargetBuffData(targetBuffDataStr); } if (userDatas.TryGetValue("FishDailyBuff", out string dailyBuffDataStr)) { InitDailyBuffData(dailyBuffDataStr); } if (userDatas.TryGetValue("GlobalBuffDataList", out string globalBuffDataStr)) { InitGlobalBuffData(globalBuffDataStr); } } void InitBuffData(string dataStr) { mapBuffDataList = Newtonsoft.Json.JsonConvert.DeserializeObject>(dataStr); } void InitTargetBuffData(string dataStr) { targetBuffDataList = Newtonsoft.Json.JsonConvert.DeserializeObject>(dataStr); } void InitDailyBuffData(string dataStr) { fishDailyBuff = Newtonsoft.Json.JsonConvert.DeserializeObject(dataStr); } void InitGlobalBuffData(string dataStr) { globalBuffDataList = Newtonsoft.Json.JsonConvert.DeserializeObject>(dataStr); } #region 地图Buff或目标奖励Buff public FishBuff IsMapBuff(int mapId) { if (mapBuffDataList.TryGetValue(mapId, out FishBuffTimeData mapBuffData) && !mapBuffData.isEnd && mapBuffData.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { FishBuff buff = _tables.TbFishBuff.GetOrDefault(mapBuffData.buffID); return buff; } foreach (var item in targetBuffDataList) { if (!item.isEnd && item.sourceID == mapId && item.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { FishBuff buff = _tables.TbFishBuff.GetOrDefault(item.buffID); return buff; } } return null; } public bool IsDarkness(int mapId) { if (mapBuffDataList.TryGetValue(mapId, out FishBuffTimeData mapBuffData) && !mapBuffData.isEnd && mapBuffData.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { var buff = _tables.TbFishBuff.GetOrDefault(mapBuffData.buffID); if (buff.IsDarkness) { return true; } } foreach (var item in targetBuffDataList) { var buff = _tables.TbFishBuff.GetOrDefault(item.buffID); if (!item.isEnd && (item.sourceID == mapId || item.sourceID == 0) && item.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { if (buff.IsDarkness) { return true; } } } return false; } public string GetSceneFx(int mapId) { if (mapBuffDataList.TryGetValue(mapId, out FishBuffTimeData mapBuffData) && !mapBuffData.isEnd && mapBuffData.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { var buff = _tables.TbFishBuff.GetOrDefault(mapBuffData.buffID); if (!string.IsNullOrEmpty(buff.SceneFx)) { return buff.SceneFx; } } foreach (var item in targetBuffDataList) { var buff = _tables.TbFishBuff.GetOrDefault(item.buffID); if (!item.isEnd && (item.sourceID == mapId || item.sourceID == 0) && item.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { if (!string.IsNullOrEmpty(buff.SceneFx)) { return buff.SceneFx; } } } return ""; } //获取某种Buff public FishBuffTimeData GetBuffData() where T : FishBuffType { int curMapId = GContext.container.Resolve().currentMapId; foreach (var item in targetBuffDataList) { var buff = _tables.TbFishBuff.GetOrDefault(item.buffID); if (buff.BuffParam is T && !item.isEnd && (item.sourceID == curMapId || item.sourceID == 0) && item.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { return item; } } return null; } //排行榜活动特殊地图额外积分 public float GetSpMapExtraPointBuffValue() { float extraPointValue = 0; foreach (var item in targetBuffDataList) { var buff = _tables.TbFishBuff.GetOrDefault(item.buffID); if (buff.BuffParam is SpMapExtraPoint && !item.isEnd && item.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { SpMapExtraPoint extraPoint = buff.BuffParam as SpMapExtraPoint; extraPointValue += extraPoint.Param; } } return extraPointValue; } #endregion #region 地图Buff public bool CheckMapBuff(int mapID) { if (mapID != GContext.container.Resolve().lastMapId) { return false; } if (!mapBuffDataList.ContainsKey(mapID)) { var mapdata = _tables.TbMapData.GetOrDefault(mapID); if (mapdata != null && mapdata.FishBuff > 0) { var buffData = _tables.TbFishBuff.GetOrDefault(mapdata.FishBuff); var mapBuffData = new FishBuffTimeData(); mapBuffData.SortID = buffData.SortID; mapBuffData.sourceID = mapID; mapBuffData.buffID = mapdata.FishBuff; DateTime now = ZZTimeHelper.UtcNow().UtcNowOffset(); mapBuffData.buffEndTime = now.AddSeconds(buffData.CountDown); mapBuffDataList.Add(mapID, mapBuffData); PlayFabMgr.Instance.UpdateUserDataValue("BuffDataList", Newtonsoft.Json.JsonConvert.SerializeObject(mapBuffDataList)); return true; } } return false; } //当前地图的Buff public FishBuffTimeData GetMapBuffTimeData(int mapId) { if (mapBuffDataList.TryGetValue(mapId, out FishBuffTimeData mapBuffData) && !mapBuffData.isEnd && mapBuffData.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { return mapBuffData; } return null; } //钓鱼金币加成 public float GetExtraGoldBuffValue(int mapId, int fishQuality) { float extraGoldValue = 0; if (mapBuffDataList.TryGetValue(mapId, out FishBuffTimeData mapBuffData) && !mapBuffData.isEnd && mapBuffData.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { var buff = _tables.TbFishBuff.GetOrDefault(mapBuffData.buffID); if (buff.BuffParam is ExtraGold) { ExtraGold extraGold = buff.BuffParam as ExtraGold; extraGoldValue += extraGold.Param; } } MoreFishingCash moreFishingCash = GetWeelyBuffTimeData(); if (moreFishingCash != null) { for (int i = 0; i < moreFishingCash.Quality.Count; i++) { if (fishQuality == moreFishingCash.Quality[i]) { extraGoldValue += moreFishingCash.Param[i]; } } } return extraGoldValue; } #endregion #region 目标奖励活动Buff public void CheckTargetBuff() { FishingEventData fishingEventData = GContext.container.Resolve(); var collectingTargetInit = fishingEventData.collectingTargetInit; if (collectingTargetInit != null) { EventTargetExtraDrop eventTargetExtraDrop = collectingTargetInit.FishingExtraDrop; ETKeepsake eTKeepsake = null; if (eventTargetExtraDrop is ETKeepsake) { eTKeepsake = eventTargetExtraDrop as ETKeepsake; } else { return; } int buffID = eTKeepsake.FishbuffID; FishBuff fishBuff = _tables.TbFishBuff.GetOrDefault(buffID); if (fishBuff != null) { FishBuffTimeData fishBuffTimeData = new FishBuffTimeData(); if (fishBuff.IsMapBuff) { fishBuffTimeData.sourceID = GContext.container.Resolve().currentMapId; } else { fishBuffTimeData.sourceID = 0; } fishBuffTimeData.SortID = fishBuff.SortID; fishBuffTimeData.buffID = fishBuff.ID; if (fishBuff.CountDown > 0) { fishBuffTimeData.buffEndTime = ZZTimeHelper.UtcNow().UtcNowOffset().AddSeconds(fishBuff.CountDown); } else { fishBuffTimeData.buffEndTime = fishingEventData.GetCollectingTargetEndTime(); } for (int i = 0; i < targetBuffDataList.Count; i++) { if (targetBuffDataList[i].buffID == fishBuffTimeData.buffID && targetBuffDataList[i].sourceID == fishBuffTimeData.sourceID) { targetBuffDataList[i] = fishBuffTimeData; PlayFabMgr.Instance.UpdateUserDataValue("TargetBuffDataList", Newtonsoft.Json.JsonConvert.SerializeObject(targetBuffDataList)); return; } } targetBuffDataList.Add(fishBuffTimeData); PlayFabMgr.Instance.UpdateUserDataValue("TargetBuffDataList", Newtonsoft.Json.JsonConvert.SerializeObject(targetBuffDataList)); } } else { ClearTargetBuff(); } } public void ClearTargetBuff() { targetBuffDataList.Clear(); PlayFabMgr.Instance.UpdateUserDataValue("TargetBuffDataList", Newtonsoft.Json.JsonConvert.SerializeObject(targetBuffDataList)); } /// /// CollectionTargetWeight的特殊处理 /// /// public void EndCollectionTargetWeight(int fishItemId) { CollectingTargetInit collectingTargetInit = GContext.container.Resolve().collectingTargetInit; if (collectingTargetInit == null) { return; } EventTargetExtraDrop eventTargetExtraDrop = collectingTargetInit.FishingExtraDrop; ETKeepsake eTKeepsake = null; if (eventTargetExtraDrop is ETKeepsake) { eTKeepsake = eventTargetExtraDrop as ETKeepsake; } else { return; } FishBuff fishBuff; int curMapId = GContext.container.Resolve().currentMapId; foreach (var item in targetBuffDataList) { fishBuff = _tables.TbFishBuff.GetOrDefault(item.buffID); if (!item.isEnd && (item.sourceID == curMapId || item.sourceID == 0) && fishBuff.BuffParam is CollectionTargetWeight) { CollectionTargetWeight collectionTargetWeight = fishBuff.BuffParam as CollectionTargetWeight; if (collectionTargetWeight.TargetFishIndex < 1 || collectionTargetWeight.TargetFishIndex > eTKeepsake.FishIDList.Count) { continue; } else if (fishItemId == eTKeepsake.FishIDList[collectionTargetWeight.TargetFishIndex - 1]) { item.isEnd = true; PlayFabMgr.Instance.UpdateUserDataValue("TargetBuffDataList", Newtonsoft.Json.JsonConvert.SerializeObject(targetBuffDataList)); break; } } } } //目标奖励活动额外积分 public float GetCollectionTargetExtraPointBuffValue(int mapId) { float extraPointValue = 0; foreach (var item in targetBuffDataList) { var buff = _tables.TbFishBuff.GetOrDefault(item.buffID); if (buff.BuffParam is CollectionTargetExtraPoint && !item.isEnd && (item.sourceID == mapId || item.sourceID == 0) && item.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { CollectionTargetExtraPoint extraPoint = buff.BuffParam as CollectionTargetExtraPoint; extraPointValue += extraPoint.Param; } } return extraPointValue; } #endregion #region 全局Buff Item投放 public void SetGlobalBucffNew(int buffID, bool isNew = true) { var buff = _tables.TbFishBuff.GetOrDefault(buffID); if (buff != null) { if (globalBuffDataList.TryGetValue(buff.GroupId, out FishBuffTimeData fishBuffTimeData)) { if (fishBuffTimeData.isNew != isNew) { fishBuffTimeData.isNew = isNew; if (isNew) { showFishBuffIds.Add(fishBuffTimeData); } else { showFishBuffIds.Remove(fishBuffTimeData); } } } } } public void AddGlobalBuff(int buffID) { var buff = _tables.TbFishBuff.GetOrDefault(buffID); if (buff != null) { var UtcNow = ZZTimeHelper.UtcNow().UtcNowOffset(); bool isNewBuff = true; if (globalBuffDataList.TryGetValue(buff.GroupId, out FishBuffTimeData fishBuffTimeData)) { var oldBuff = _tables.TbFishBuff.GetOrDefault(fishBuffTimeData.buffID); if (oldBuff.GroupId != buff.GroupId) { globalBuffDataList.Remove(buff.GroupId); } else { isNewBuff = false; if (fishBuffTimeData.buffEndTime.Ticks > UtcNow.Ticks) { fishBuffTimeData.buffEndTime = fishBuffTimeData.buffEndTime.AddSeconds(buff.CountDown); if (buff.SortID > fishBuffTimeData.SortID) { fishBuffTimeData.SortID = buff.SortID; } } else { fishBuffTimeData.buffEndTime = UtcNow.AddSeconds(buff.CountDown); fishBuffTimeData.SortID = buff.SortID; fishBuffTimeData.isNew = true; } fishBuffTimeData.isEnd = false; showFishBuffIds.Add(fishBuffTimeData); fishBuffTimeData.addDown = buff.CountDown; } } if (isNewBuff) { fishBuffTimeData = new FishBuffTimeData(); if (buff.IsMapBuff) { fishBuffTimeData.sourceID = GContext.container.Resolve().currentMapId; } else { fishBuffTimeData.sourceID = 0; } fishBuffTimeData.buffID = buffID; if (buff.CountDown > 0) { fishBuffTimeData.buffEndTime = ZZTimeHelper.UtcNow().UtcNowOffset().AddSeconds(buff.CountDown); } else { fishBuffTimeData.buffEndTime = ZZTimeHelper.UtcNow().UtcNowOffset().AddDays(1); } globalBuffDataList[buff.GroupId] = fishBuffTimeData; fishBuffTimeData.SortID = buff.SortID; fishBuffTimeData.isNew = true; fishBuffTimeData.addDown = buff.CountDown; showFishBuffIds.Add(fishBuffTimeData); } PlayFabMgr.Instance.UpdateUserDataValue("GlobalBuffDataList", Newtonsoft.Json.JsonConvert.SerializeObject(globalBuffDataList)); } } //GetBuffGroupTimeData public T GetWeelyBuffTimeData(bool isEnd = false) where T : FishBuffType { GetWeelyBuff(); foreach (var item in globalBuffDataList) { if (!item.Value.isEnd && item.Value.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { FishBuff buff = _tables.TbFishBuff.GetOrDefault(item.Value.buffID); if (buff.BuffParam is T) { //if (isEnd) //{ // item.Value.isEnd = true; //} return buff.BuffParam as T; } } } return null; } public List GetGroupBuff() { GetWeelyBuff(); List buffList = new List(); foreach (var item in globalBuffDataList) { if (!item.Value.isEnd && item.Value.buffEndTime.Ticks > ZZTimeHelper.UtcNow().UtcNowOffset().Ticks) { buffList.Add(item.Value); } } return buffList; } #endregion #region 每日周期Buff FishBuffTimeData GetWeelyBuff() { DateTime now = ZZTimeHelper.UtcNow().UtcNowOffset(); int week = (int)now.DayOfWeek; var weelyBuff = _tables.TbWeelyBuffInit.GetOrDefault(week); if (weelyBuff != null) { List dailyBuffList = weelyBuff.DailyBuffList; int day = now.DayOfYear; if (fishDailyBuff != null && fishDailyBuff.buffEndTime > now/* && fishDailyBuff.buffEndTime.DayOfYear == day*/) { //旧的每日Buff还未结束 return fishDailyBuff; } for (int i = 0; i < dailyBuffList.Count; i++) { var buff = _tables.TbDailyBuffTrigger.GetOrDefault(dailyBuffList[i]); if (buff != null) { DateTime startTime = now.Date.AddSeconds(buff.StartTime); DateTime endTime = now.Date.AddSeconds(buff.EndTime); if (now >= startTime && now <= endTime) { //开启新的每日Buff if (buff.LevelRequired > GContext.container.Resolve().lv) { return null; } if (fishDailyBuff == null) { fishDailyBuff = new FishBuffTimeData(); } if (fishDailyBuff.sourceID == buff.Day/* && fishDailyBuff.buffEndTime.DayOfYear == day*/) { return null; } FishBuff fishBuff = _tables.TbFishBuff.GetOrDefault(buff.BuffID); fishDailyBuff.buffID = buff.BuffID; fishDailyBuff.sourceID = buff.Day; fishDailyBuff.buffEndTime = endTime; if (fishBuff.CountDown > 0) { fishDailyBuff.buffEndTime = now.AddSeconds(fishBuff.CountDown); } AddGlobalBuff(buff.BuffID); fishDailyBuff.isEnd = false; PlayFabMgr.Instance.UpdateUserDataValue("FishDailyBuff", Newtonsoft.Json.JsonConvert.SerializeObject(fishDailyBuff)); return fishDailyBuff; } } } } return null; } #endregion } public class FishBuffTimeData { public int SortID; public int sourceID; public int buffID; public bool isEnd = false; [NonSerialized] public bool isNew = false; [NonSerialized] public int addDown; public DateTime buffEndTime; }