From aa84cb62bebb9c8a4e586bcc1ec28eb7a16a8860 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 26 一月 2026 18:10:34 +0800
Subject: [PATCH] 422 子 【内政】命格系统 / 【内政】命格系统-客户端

---
 Main/System/Hero/HeroManager.cs |  233 +++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 189 insertions(+), 44 deletions(-)

diff --git a/Main/System/Hero/HeroManager.cs b/Main/System/Hero/HeroManager.cs
index d54640f..7692d1b 100644
--- a/Main/System/Hero/HeroManager.cs
+++ b/Main/System/Hero/HeroManager.cs
@@ -1,81 +1,161 @@
 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> onNewHeroEvent;
-
     public Action<HeroInfo> onHeroChangeEvent;
+
+    public Action<int> onHeroDeleteEvent;
 
     public override void Init()
     {
         base.Init();
 
-        //  娉ㄥ唽涓�鐐逛簨浠�
-        PackManager.Instance.refrechPackEvent += refrechPackEvent;
+        PackManager.Instance.ChangeItemEvent += ChangeHero;
+        PackManager.Instance.DeleteItemEvent += DeleteHero;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitialize;
     }
 
     public override void Release()
     {
         base.Release();
-        PackManager.Instance.refrechPackEvent -= refrechPackEvent;
+        PackManager.Instance.ChangeItemEvent -= ChangeHero;
+        PackManager.Instance.DeleteItemEvent -= DeleteHero;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitialize;
     }
 
-    public override void RequestNessaryData()
+    void OnBeforePlayerDataInitialize()
     {
-        base.RequestNessaryData();
 
-        
+        heroInfoDict.Clear();
     }
 
-    public void refrechPackEvent(PackType packType)
+
+    // isCreate bool锛歵rue浠h〃鍒涘缓 false 鍒锋柊瑙﹀彂
+    void ChangeHero(PackType packType, string guid, bool isCreate)
     {
         if (packType == PackType.Hero)
         {
-            // bool change = false;
-            bool isNew = false;
-            //  濡傛灉鏈夊垎鎵规鍒濆鍖栧彲鑳借繕瑕侀夯鐑︿竴鐐�?鍏堢湅鐪�
-            bool isInit = heroInfoDict.Count >= 0;
-
-            SinglePack heroPack = PackManager.Instance.GetSinglePack(packType);
-
-            Dictionary<int, ItemModel> heroes = heroPack.GetAllItems();
-
-            foreach (ItemModel hero in heroes.Values)
+            HeroInfo heroInfo = null;
+            if (!heroInfoDict.TryGetValue(guid, out heroInfo))
             {
-                HeroInfo heroInfo = null;
-                if (!heroInfoDict.TryGetValue(hero.guid, out heroInfo))
-                {
-                    heroInfo = new HeroInfo(hero);
-                    heroInfoDict.Add(hero.guid, heroInfo);
-                    if (!isInit)
-                    {
-                        isNew = true;
-                        onNewHeroEvent?.Invoke(heroInfo);
-                    }
-                }
-                else
-                {
-                    heroInfo.UpdateHero(hero);
-                    //  涔熸湁鍙兘涓嶆槸change
-                    // change = true;
-                    // onHeroChangeEvent?.Invoke(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 == null || guid == null)
+        {
+            Debug.LogError("HeroManager GetHero guid is null");
+            return null;
+        }
+        if (!heroInfoDict.ContainsKey(guid))
+            return null;
+        return heroInfoDict[guid];
+    }
+
+    public List<HeroInfo> GetHeroList()
+    {
+        return heroInfoDict.Values.ToList();
+    }
+
+    public List<string> GetHeroGuidList()
+    {
+        return heroInfoDict.Keys.ToList();
+    }
+
+    /// 鍙傛暟锛� 鑱屼笟锛屽浗瀹讹紝浼ゅ绫诲瀷锛�6澶ф垬鏂楀睘鎬э紝鐗规畩灞炴��
+    public List<string> GetHeroGuidList(List<int> selectList = null)
+    {
+        if (selectList.IsNullOrEmpty())
+            return heroInfoDict.Keys.ToList();
+
+        int job = selectList[0];
+        int country = selectList[1];
+        int hurtType = selectList[2];
+        int fightAttrType = selectList[3];
+        int specialAttrType = selectList[4];
+
+        List<string> retGuidList = new List<string>();
+        foreach (string guid in heroInfoDict.Keys)
+        {
+            HeroInfo heroInfo = heroInfoDict[guid];
+
+            //0浠h〃鍏ㄩ儴, 鍚岀骇鍒槸鍙閫夛紝涓嶅悓绾у埆涓轰笖鐨勫叧绯�
+            bool isMatch = true;
+            if (job != 0)
+            {
+                isMatch = isMatch && (job & (1 << heroInfo.heroConfig.Class)) > 0;
+            }
+            if (country != 0)
+            {
+                isMatch = isMatch && (country & (1 << heroInfo.heroConfig.Country)) > 0;
+            }
+            if (hurtType != 0)
+            {
+                isMatch = isMatch && (hurtType & (1 << heroInfo.heroConfig.HurtType)) > 0;
+            }
+            if (fightAttrType != 0)
+            {
+                isMatch = isMatch && (fightAttrType & (1 << heroInfo.heroConfig.Specialty)) > 0;
+            }
+            if (specialAttrType != 0)
+            {
+                bool isMatch2 = false;
+                for (int i = 0; i < heroInfo.heroConfig.Specialty2.Length; i++)
+                {
+                    isMatch2 = (specialAttrType & (1 << heroInfo.heroConfig.Specialty2[i])) > 0;
+                    if (isMatch2)
+                        break;
+                }
+                isMatch = isMatch && isMatch2;
+            }
+            if (isMatch)
+            {
+                retGuidList.Add(guid);
+            }
+
+        }
+        return retGuidList;
     }
 
     public List<HeroInfo> GetPowerfulHeroList()
     {
         List<HeroInfo> heroList = new List<HeroInfo>(heroInfoDict.Values);
 
-        heroList.Sort((a, b) => 
+        heroList.Sort((a, b) =>
         {
-            int power1 = a.CalculatePower();
-            int power2 = b.CalculatePower();
+            long power1 = a.CalculateFightPower(false);
+            long power2 = b.CalculateFightPower(false);
 
             if (power1 == power2)
             {
@@ -95,9 +175,74 @@
         return retList;
     }
 
-    // public override bool IsNessaryDataReady()
-    // {
-    //     return true;
-    // }
+
+    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);
+    }
+
+    //鑾峰緱鐢熸晥鐨勬灏嗘暟閲�
+    public int GetAttrActiveHeroCount()
+    {
+        int count = 0;
+        foreach (HeroInfo heroInfo in heroInfoDict.Values)
+        {
+            if (heroInfo.isAttrActive)
+            {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    //鑾峰緱鏈敓鏁堢殑姝﹀皢鏁伴噺
+    public int GetNotActiveHeroCount()
+    {
+        int count = 0;
+        foreach (HeroInfo heroInfo in heroInfoDict.Values)
+        {
+            if (!heroInfo.isAttrActive)
+            {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    //鑾峰緱鎸囧畾ID涓斿睘鎬х敓鏁堢殑姝﹀皢
+    public HeroInfo GetHeroByID(int heroID)
+    {
+        foreach (HeroInfo heroInfo in heroInfoDict.Values)
+        {
+            if (heroInfo.heroId == heroID && heroInfo.isAttrActive)
+            {
+                return heroInfo;
+            }
+        }
+        return null;
+    }
+
+    public List<HeroInfo> GetHeroListByID(int heroID)
+    {
+        List<HeroInfo> heroList = new List<HeroInfo>();
+        foreach (HeroInfo heroInfo in heroInfoDict.Values)
+        {
+            if (heroInfo.heroId == heroID)
+            {
+                heroList.Add(heroInfo);
+            }
+        }
+        return heroList;
+    }
 
 }
\ No newline at end of file

--
Gitblit v1.8.0