using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using System; 
 | 
using System.Linq; 
 | 
  
 | 
public class HeroManager : GameSystemManager<HeroManager> 
 | 
{ 
 | 
    //武将和图鉴的关系 
 | 
    //同一个武将图鉴,可能有多个武将(物品)数据,或者没有武将,但是有图鉴信息 
 | 
    //初始创建(0725),后续跟随背包事件增加删除  key = guid 
 | 
    protected Dictionary<string, HeroInfo> heroInfoDict = new Dictionary<string, HeroInfo>(); 
 | 
  
 | 
    public Action<HeroInfo> onHeroChangeEvent; 
 | 
  
 | 
    public Action<int> onHeroDeleteEvent; 
 | 
  
 | 
    public override void Init() 
 | 
    { 
 | 
        base.Init(); 
 | 
  
 | 
        PackManager.Instance.ChangeItemEvent += ChangeHero; 
 | 
        PackManager.Instance.DeleteItemEvent += DeleteHero; 
 | 
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; 
 | 
    } 
 | 
  
 | 
    public override void Release() 
 | 
    { 
 | 
        base.Release(); 
 | 
        PackManager.Instance.ChangeItemEvent -= ChangeHero; 
 | 
        PackManager.Instance.DeleteItemEvent -= DeleteHero; 
 | 
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; 
 | 
    } 
 | 
  
 | 
    void OnBeforePlayerDataInitialize() 
 | 
    { 
 | 
  
 | 
        heroInfoDict.Clear(); 
 | 
    } 
 | 
  
 | 
  
 | 
    // isCreate bool:true代表创建 false 刷新触发 
 | 
    void ChangeHero(PackType packType, string guid, bool isCreate) 
 | 
    { 
 | 
        if (packType == PackType.Hero) 
 | 
        { 
 | 
            HeroInfo heroInfo = null; 
 | 
            if (!heroInfoDict.TryGetValue(guid, out heroInfo)) 
 | 
            { 
 | 
                heroInfo = new HeroInfo(PackManager.Instance.GetItemByGuid(guid)); 
 | 
                heroInfoDict.Add(guid, heroInfo); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                heroInfo.UpdateHero(PackManager.Instance.GetItemByGuid(guid)); 
 | 
            } 
 | 
  
 | 
            onHeroChangeEvent?.Invoke(heroInfo); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    void DeleteHero(PackType packType, string guid, int itemID, int index, int clearType) 
 | 
    { 
 | 
        if (packType == PackType.Hero) 
 | 
        { 
 | 
            HeroInfo heroInfo = null; 
 | 
            heroInfoDict.TryGetValue(guid, out heroInfo); 
 | 
  
 | 
            heroInfoDict.Remove(guid); 
 | 
  
 | 
            onHeroDeleteEvent?.Invoke(itemID); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public HeroInfo GetHero(string guid) 
 | 
    { 
 | 
        if (!heroInfoDict.ContainsKey(guid)) 
 | 
            return null; 
 | 
        return heroInfoDict[guid]; 
 | 
    } 
 | 
  
 | 
    public List<HeroInfo> GetHeroList() 
 | 
    { 
 | 
        return heroInfoDict.Values.ToList(); 
 | 
    } 
 | 
  
 | 
    public List<string> GetHeroGuidList(int job = 0, int country = 0) 
 | 
    { 
 | 
        if (job == 0 && country == 0) 
 | 
            return heroInfoDict.Keys.ToList(); 
 | 
  
 | 
  
 | 
        List<string> retGuidList = new List<string>(); 
 | 
        foreach (string guid in heroInfoDict.Keys) 
 | 
        { 
 | 
            HeroInfo heroInfo = heroInfoDict[guid]; 
 | 
            //0代表全部 
 | 
            if (job == 0 || country == 0) 
 | 
            { 
 | 
                if (job != 0 && job == heroInfo.heroConfig.Class) 
 | 
                    retGuidList.Add(guid); 
 | 
                if (country != 0 && country == heroInfo.heroConfig.Country) 
 | 
                    retGuidList.Add(guid); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                if (job == heroInfo.heroConfig.Class && country == heroInfo.heroConfig.Country) 
 | 
                    retGuidList.Add(guid); 
 | 
            } 
 | 
        } 
 | 
        return retGuidList; 
 | 
    } 
 | 
  
 | 
    public List<HeroInfo> GetPowerfulHeroList() 
 | 
    { 
 | 
        List<HeroInfo> heroList = new List<HeroInfo>(heroInfoDict.Values); 
 | 
  
 | 
        heroList.Sort((a, b) => 
 | 
        { 
 | 
            long power1 = a.CalculateFightPower(false); 
 | 
            long power2 = b.CalculateFightPower(false); 
 | 
  
 | 
            if (power1 == power2) 
 | 
            { 
 | 
                return 0; 
 | 
            } 
 | 
  
 | 
            return power1 > power2 ? -1 : 1; 
 | 
        }); 
 | 
  
 | 
        List<HeroInfo> retList = new List<HeroInfo>(); 
 | 
  
 | 
        for (int i = 0; i < TeamConst.MaxTeamHeroCount && i < heroList.Count; i++) 
 | 
        { 
 | 
            retList.Add(heroList[i]); 
 | 
        } 
 | 
  
 | 
        return retList; 
 | 
    } 
 | 
  
 | 
  
 | 
    public int GetHeroCount() 
 | 
    { 
 | 
        return heroInfoDict.Count; 
 | 
    } 
 | 
  
 | 
    public bool HasHero(int heroID) 
 | 
    { 
 | 
        return PackManager.Instance.GetSinglePack(PackType.Hero).HasItem(heroID); 
 | 
    } 
 | 
  
 | 
    public int GetHeroCountByID(int heroID) 
 | 
    { 
 | 
        return (int)PackManager.Instance.GetSinglePack(PackType.Hero).GetCountById(heroID); 
 | 
    } 
 | 
} 
 |