using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using UnityEngine; public enum LineupRecommendHeroState { NoActivate = 0, //0 - 未激活 CanActivate = 1, // 1 - 可激活 ActivateAndHave = 2, // 2 - 已获得 ActivateButNoHave = 3, // 3 - 未获得 } public class LineupRecommendManager : GameSystemManager { Dictionary haveDict = new Dictionary(); public event Action OnUpdateLineupRecommendInfoEvent; public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent; DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk; HeroManager.Instance.onHeroChangeEvent += OnHeroChangeEvent; HeroManager.Instance.onHeroDeleteEvent += OnHeroDeleteEvent; HeroUIManager.Instance.OnHeroCollectEvent += OnHeroCollectEvent; FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent; DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk; HeroManager.Instance.onHeroChangeEvent -= OnHeroChangeEvent; HeroManager.Instance.onHeroDeleteEvent -= OnHeroDeleteEvent; HeroUIManager.Instance.OnHeroCollectEvent -= OnHeroCollectEvent; FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; } private void OnFuncStateChangeEvent(int obj) { if (obj != funcId) return; UpdateRedPoint(); } private void OnPlayerLoginOk() { UpdateRedPoint(); } private void OnHeroCollectEvent() { UpdateRedPoint(); } private void OnHeroDeleteEvent(int obj) { UpdateRedPoint(); } private void OnHeroChangeEvent(HeroInfo heroInfo) { UpdateRedPoint(); } private void OnBeforePlayerDataInitializeEvent() { haveDict.Clear(); } // 哪些id是展开的 List onList = new List(); public event Action OnUpdateSwitchOnOrOffEvent; public void ClearOnList() { onList.Clear(); } public bool IsOn(int id) { return onList.Contains(id); } public void SetOn(int id, bool isOn) { if (isOn) { if (!onList.Contains(id)) { onList.Add(id); OnUpdateSwitchOnOrOffEvent?.Invoke(); } } else { onList.Remove(id); OnUpdateSwitchOnOrOffEvent?.Invoke(); } } List sortShowList = null; public List GetSortShowList() { if (sortShowList.IsNullOrEmpty()) { sortShowList = LineupRecommendConfig.GetKeys(); sortShowList.Sort(); } return sortShowList; } public bool TryGetMoneyInfo(int RecommendID, int index, out int moneyType, out int moneyNeedCnt) { moneyType = 0; moneyNeedCnt = 0; if (!TryGetHeroConfigByIndex(RecommendID, index, out HeroConfig config)) return false; int quality = config.Quality; if (!HeroQualityConfig.HasKey(quality)) return false; HeroQualityConfig heroQualityConfig = HeroQualityConfig.Get(quality); int[] recommendAwardMoney = heroQualityConfig.RecommendAwardMoney; if (recommendAwardMoney.IsNullOrEmpty() || recommendAwardMoney.Length < 2) return false; moneyType = recommendAwardMoney[0]; moneyNeedCnt = recommendAwardMoney[1]; return true; } public bool TryGetHeroSkinConfig(int heroID, out HeroSkinConfig skinConfig) { skinConfig = null; if (!HeroConfig.HasKey(heroID)) return false; HeroConfig heroConfig = HeroConfig.Get(heroID); int[] skinIDList = heroConfig.SkinIDList; if (skinIDList.IsNullOrEmpty()) return false; int skinID = skinIDList[0]; if (!HeroSkinConfig.HasKey(skinID)) return false; skinConfig = HeroSkinConfig.Get(skinID); return true; } public bool TryGetHaveDictValue(int recommendID, out uint awardState) { return haveDict.TryGetValue(recommendID, out awardState); } public bool TryGetHeroIDListByRecommendID(int recommendID, out int[] heroIDArr) { heroIDArr = null; if (!LineupRecommendConfig.HasKey(recommendID)) return false; LineupRecommendConfig config = LineupRecommendConfig.Get(recommendID); heroIDArr = config.HeroIDList; return true; } // 推荐武将是否一个也没有 public bool HasHeroMin(int recommendID) { if (!TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty()) return false; foreach (var heroID in heroIDArr) { if (HeroManager.Instance.HasHero(heroID)) return true; } return false; } public void UseTeam(int recommendID) { if (!LineupRecommendConfig.HasKey(recommendID)) return; LineupRecommendConfig config = LineupRecommendConfig.Get(recommendID); int[] heroIDList = config.HeroIDList; int[] posIndexList = config.PosIndexList; if (heroIDList.IsNullOrEmpty() || posIndexList.IsNullOrEmpty() || heroIDList.Length != posIndexList.Length) return; bool hasHeroMin = HasHeroMin(recommendID); if (!hasHeroMin) { SysNotifyMgr.Instance.ShowTip("LineupRecommendErr01"); return; } TeamBase storyTeam = TeamManager.Instance.GetTeam(TeamType.Story); storyTeam.RemoveAllHeroes(); int currentMaxLineupCount = TeamConst.MaxTeamHeroCount - HeroUIManager.Instance.lockIndexList.Count; for (int i = 0; i < heroIDList.Length; i++) { if (currentMaxLineupCount - storyTeam.GetTeamHeroCount() > 0) { int heroID = heroIDList[i]; var hero = HeroManager.Instance.GetHeroByID(heroID); if (hero == null) continue; storyTeam.AddHero(hero, Mathf.Max(0, posIndexList[i] - 1), true); } } storyTeam.SaveTeam(); } public bool TryGetHeroConfigByIndex(int recommendID, int index, out HeroConfig config) { config = null; if (!TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty()) return false; if (index < 0 || index >= heroIDArr.Length) return false; int heroID = heroIDArr[index]; if (!HeroConfig.HasKey(heroID)) return false; config = HeroConfig.Get(heroID); return true; } public LineupRecommendHeroState GetHeroState(int recommendID, int index) { if (!TryGetHeroConfigByIndex(recommendID, index, out HeroConfig config)) return LineupRecommendHeroState.NoActivate; // heroBookState: 0未获得、1可激活、2常规、3突破升级、4星升级、5已满级 int heroID = config.HeroID; int heroBookState = HeroUIManager.Instance.GetHeroBookState(heroID, config.Quality); bool isHaveAward = IsHaveAward(recommendID, index); bool isHasHero = HeroManager.Instance.HasHero(heroID); // 已获得:推荐武将已领奖 && 仍拥有该武将 // 未获得:推荐武将已领奖 && 当前没有该武将 (已被消耗) if (isHaveAward) return isHasHero ? LineupRecommendHeroState.ActivateAndHave : LineupRecommendHeroState.ActivateButNoHave; // 可激活:没领取 && 图鉴状态可激活/已激活 // 未激活:没领取 && 图鉴状态未激活/未获得 return heroBookState > 0 ? LineupRecommendHeroState.CanActivate : LineupRecommendHeroState.NoActivate; } public bool IsHaveAward(int recommendID, int index) { if (TryGetHaveDictValue(recommendID, out uint awardState)) { if (index >= 0 && index < 6) { uint mask = (uint)(1 << index); return (awardState & mask) != 0; } } return false; } readonly int funcId = 1;//武将 Redpoint redpoint = new Redpoint(MainRedDot.HeroCardRedpoint, MainRedDot.LineupRecommendRepoint); public void UpdateRedPoint() { redpoint.state = RedPointState.None; //武将没开不刷红点 if (!FuncOpen.Instance.IsFuncOpen(funcId)) return; if (TryGetJumpIndex(out int index)) { redpoint.state = RedPointState.Simple; } } //第一个可领取的武将所在行索引 public bool TryGetJumpIndex(out int index) { index = 0; List sortShowList = GetSortShowList(); if (sortShowList.IsNullOrEmpty()) return false; for (int i = 0; i < sortShowList.Count; i++) { int recommendID = sortShowList[i]; if (!TryGetHeroIDListByRecommendID(recommendID, out int[] heroIDArr) || heroIDArr.IsNullOrEmpty()) continue; for (int j = 0; j < heroIDArr.Length; j++) { LineupRecommendHeroState heroState = GetHeroState(recommendID, j); if (heroState == LineupRecommendHeroState.CanActivate) { index = i; return true; } } } return false; } public void SendGetReward(int recommendID, int index) { var pack = new CA504_tagCMPlayerGetReward(); pack.RewardType = 4; pack.DataEx = (uint)recommendID; string indexStr = index.ToString(); pack.DataExStr = indexStr; pack.DataExStrLen = (byte)indexStr.Length; GameNetSystem.Instance.SendInfo(pack); } public void UpdateLineupRecommendInfo(HB129_tagSCLineupRecommendInfo vNetData) { if (vNetData == null || vNetData.RecommendList.IsNullOrEmpty()) return; foreach (var v in vNetData.RecommendList) { haveDict[v.RecommendID] = v.AwardState; } UpdateRedPoint(); OnUpdateLineupRecommendInfoEvent?.Invoke(); } }