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<LineupRecommendManager>
|
{
|
Dictionary<int, uint> haveDict = new Dictionary<int, uint>();
|
|
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<int> onList = new List<int>();
|
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<int> sortShowList = null;
|
public List<int> 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<int> 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();
|
}
|
}
|