From 2d49ec4f87de5fdedcac25a2bd45c97a0c332a04 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 28 十月 2025 11:47:35 +0800
Subject: [PATCH] 0312 输出战斗日志,分析自动战斗不能攻击的问题

---
 Main/System/Team/TeamBase.cs |  260 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 201 insertions(+), 59 deletions(-)

diff --git a/Main/System/Team/TeamBase.cs b/Main/System/Team/TeamBase.cs
index e22edc8..13f0f91 100644
--- a/Main/System/Team/TeamBase.cs
+++ b/Main/System/Team/TeamBase.cs
@@ -28,9 +28,9 @@
     private int ShapeType;
     public int ServerShapeType { get; private set; }
 
-    public TeamHero[] teamHeros = new TeamHero[TeamConst.MaxTeamHeroCount];
+    public TeamHero[] tempHeroes { get; private set; }  = new TeamHero[TeamConst.MaxTeamHeroCount];
 
-    public TeamHero[] serverData { get; private set; } = new TeamHero[TeamConst.MaxTeamHeroCount];
+    public TeamHero[] serverHeroes { get; private set; } = new TeamHero[TeamConst.MaxTeamHeroCount];
 
     public TeamBase(TeamType _teamType)
     {
@@ -40,8 +40,13 @@
     }
 
     //  杩欒竟鏉ョ殑鍙互娌℃湁闃熶紞绫诲瀷
-    public TeamBase(HB424_tagSCTurnFightInit.tagSCTurnFightLineup lineUp)
+    public TeamBase(HB424_tagSCTurnFightInit.tagSCTurnFightLineup lineUp, bool isBoss = false)
     {
+        if (isBoss)
+        {
+            tempHeroes = new TeamHero[TeamConst.MaxTeamSlotCount];
+            serverHeroes = new TeamHero[TeamConst.MaxTeamSlotCount];
+        }
         teamIndex = lineUp.Num;
         playerId = lineUp.OwnerID;
         ShapeType = lineUp.ShapeType;
@@ -49,12 +54,12 @@
 
         for (int i = 0; i < lineUp.ObjCnt; i++)
         {
-            if (i < teamHeros.Length)
+            if (i < tempHeroes.Length)
             {
                 var fightObj = lineUp.ObjList[i];
                 TeamHero hero = new TeamHero(fightObj, this);
-                teamHeros[fightObj.PosNum] = hero;
-                serverData[fightObj.PosNum] = hero;
+                tempHeroes[hero.positionNum] = hero;
+                serverHeroes[hero.positionNum] = hero;
             }
             else
             {
@@ -70,9 +75,9 @@
     public int GetTeamHeroCount()
     {
         int count = 0;
-        for (int i = 0; i < teamHeros.Length; i++)
+        for (int i = 0; i < tempHeroes.Length; i++)
         {
-            if (teamHeros[i] != null)
+            if (tempHeroes[i] != null)
             {
                 count++;
             }
@@ -83,7 +88,7 @@
 
     public bool IsFull()
     {
-        return GetTeamHeroCount() >= teamHeros.Length;
+        return GetTeamHeroCount() >= tempHeroes.Length;
     }
 
     public bool IsEmpty()
@@ -99,7 +104,7 @@
     {
         if (IsEmpty())
         {
-            Debug.LogError("Cannot save an empty team. You should at least have one hero in the team.");
+            SysNotifyMgr.Instance.ShowTip("HeroFunc3");
             return;
         }
 
@@ -109,7 +114,8 @@
         savePack.PosCnt = (byte)GetTeamHeroCount();
         savePack.HeroPosList = new CB412_tagCSHeroLineupSave.tagCSHeroLineupPos[savePack.PosCnt];
 
-        foreach (var hero in teamHeros)
+        int index = 0;
+        foreach (var hero in tempHeroes)
         {
             if (hero != null)
             {
@@ -122,15 +128,17 @@
                     continue;
                 }
 
-                savePack.HeroPosList[posNum] = new CB412_tagCSHeroLineupSave.tagCSHeroLineupPos
+                savePack.HeroPosList[index] = new CB412_tagCSHeroLineupSave.tagCSHeroLineupPos
                 {
                     ItemIndex = (ushort)heroInfo.itemHero.gridIndex,
-                    PosNum = (byte)posNum
+                    PosNum = (byte)(posNum + 1)
                 };
+                index++;
             }
         }
-
         GameNetSystem.Instance.SendInfo(savePack);
+        SysNotifyMgr.Instance.ShowTip("HeroFunc4");
+        //闈炰富绾块樀瀹瑰鎴风鑷繁鍋氭垬鍔涘彉鍖栵紝涓荤嚎闃靛鏈嶅姟绔垬鍔涘彉鏇翠細鍚屾鎺ㄩ��
     }
 
     public void OnChangeShapeType(int newShapeType)
@@ -144,7 +152,7 @@
         ShapeType = newShapeType;
     }
 
-    //  hero info could be null if the hero is removed from the team
+    
     public void RefreshServerData(int shapeType, int positionIndex, HeroInfo heroInfo)
     {
         TeamHero teamHero = heroInfo == null ? null : new TeamHero(heroInfo, positionIndex, this);
@@ -160,7 +168,7 @@
 
         for (int i = 0; i < heroInfos.Count; i++)
         {
-            if (i < teamHeros.Length)
+            if (i < tempHeroes.Length)
             {
                 var heroInfo = heroInfos[i];
                 TeamHero hero = new TeamHero(heroInfo, i, this);
@@ -175,7 +183,7 @@
 
     public TeamHero GetHero(string guid)
     {
-        foreach (var hero in teamHeros)
+        foreach (var hero in tempHeroes)
         {
             if (hero != null && hero.guid == guid)
             {
@@ -184,10 +192,24 @@
         }
         return null;
     }
+    
+
+    public TeamHero GetHeroByHeroID(int heroId)
+    {
+        foreach (var hero in tempHeroes)
+        {
+            if (hero != null && hero.heroId == heroId)
+            {
+                return hero;
+            }
+        }
+        return null;
+    }
+
 
     public TeamHero GetServerHero(string guid)
     {
-        foreach (var hero in serverData)
+        foreach (var hero in serverHeroes)
         {
             if (hero != null && hero.guid == guid)
             {
@@ -200,7 +222,7 @@
     //  甯冮樀鎺ュ彛
     public bool HasHero(string guid)
     {
-        foreach (var hero in teamHeros)
+        foreach (var hero in tempHeroes)
         {
             if (hero != null && hero.guid == guid)
             {
@@ -210,11 +232,82 @@
         return false;
     }
 
+    public bool HasHeroInServer(string guid)
+    {
+        foreach (var hero in serverHeroes)
+        {
+            if (hero != null && hero.guid == guid)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public TeamHero GetServerHeroByIndex(int index)
+    {
+        if (index < 0 || index >= serverHeroes.Length)
+        {
+            return null;
+        }
+        return serverHeroes[index];
+    }
+
+
+    //鑾峰彇鎵�鏈変笂闃电殑姝﹀皢
+    public List<TeamHero> GetHerosOnTeam()
+    {
+        List<TeamHero> tmpHeros = new List<TeamHero>();
+        foreach (var hero in tempHeroes)
+        {
+            if (hero != null)
+            {
+                tmpHeros.Add(hero);
+            }
+        }
+        return tmpHeros;
+    }
+
+    public TeamHero GetNextServerHero(string guid)
+    {
+        if (string.IsNullOrEmpty(guid))
+        {
+            //鍙栫涓�涓�
+            foreach (var hero in serverHeroes)
+            {
+                if (hero != null)
+                {
+                    return hero;
+                }
+            }
+            return null;
+        }
+        else
+        {
+            //鍙栦笅涓�涓�
+            bool findNext = false;
+            foreach (var hero in serverHeroes)
+            {
+                if (hero != null && hero.guid == guid)
+                {
+                    findNext = true;
+                }
+                else if (findNext && hero != null)
+                {
+                    return hero;
+                }
+            }
+            //娌℃壘鍒� 鍙栫涓�涓�
+            return GetNextServerHero("");
+        }
+    }
+
+    //瀹㈡埛绔粠0寮�濮嬶紝鏈嶅姟绔粠1寮�濮�
     public int GetEmptyPosition()
     {
-        for (int i = 0; i < teamHeros.Length; i++)
+        for (int i = 0; i < tempHeroes.Length; i++)
         {
-            if (teamHeros[i] == null)
+            if (tempHeroes[i] == null)
             {
                 return i;
             }
@@ -222,78 +315,115 @@
         return -1; // No empty position
     }
 
-    //  甯冮樀鎺ュ彛
-    public void SetTeamHero(int posNum, TeamHero hero)
-    {
-        teamHeros[posNum] = hero;
+    public int GetPosition(string guid)
+    { 
+        foreach (var hero in serverHeroes)
+        {
+            if (hero != null && hero.guid == guid)
+            {
+                return hero.positionNum;
+            }
+        }
+        return  -1;
     }
 
     //  甯冮樀鎺ュ彛
-    public void SetServerTeamHero(int posNum, TeamHero hero)
+    private void SetTeamHero(int posNum, TeamHero hero)
     {
-        serverData[posNum] = hero;
-        teamHeros[posNum] = hero;
+        tempHeroes[posNum] = hero;
     }
 
-    public void AddHero(HeroInfo heroInfo, int targetPosition)
+    //  甯冮樀鎺ュ彛
+    private void SetServerTeamHero(int posNum, TeamHero hero)
     {
-        if (targetPosition < 0 || targetPosition >= teamHeros.Length)
+        serverHeroes[posNum] = hero;
+        tempHeroes[posNum] = hero;
+    }
+
+    //  甯冮樀鎺ュ彛: 鎭㈠闃靛
+    public void RestoreTeam()
+    {
+        for (int i = 0; i < tempHeroes.Length; i++)
+        {
+            tempHeroes[i] = serverHeroes[i];
+        }
+    }
+    
+    //checkLock 锛氭槸鍚﹂獙璇佷笂闃典汉鏁伴檺鍒�
+    //targetPosition 浠�0寮�濮�
+    public void AddHero(HeroInfo heroInfo, int targetPosition, bool checkLock)
+    {
+        if (targetPosition < 0 || targetPosition >= tempHeroes.Length)
         {
             Debug.LogError("Invalid target position for adding hero.");
             return;
         }
 
-        TeamHero targetHero = teamHeros[targetPosition];
+        if (checkLock)
+        {
+            var lockCnt = HeroUIManager.Instance.lockIndexList.Count;
+            if (lockCnt > 0 && TeamConst.MaxTeamHeroCount - GetHerosOnTeam().Count <= lockCnt)
+            {
+                HeroUIManager.Instance.ShowUnLockTip(HeroUIManager.Instance.lockIndexList[0]);
+                return;
+            }
+        }
 
-        if (null == targetHero)
-        {
-            TeamHero newHero = new TeamHero(heroInfo, targetPosition, this);
-            SetTeamHero(targetPosition, newHero);
-        }
-        else
-        {
-            SetTeamHero(targetPosition, new TeamHero(heroInfo, targetPosition, this));
-        }
+        SetTeamHero(targetPosition, new TeamHero(heroInfo, targetPosition, this));
     }
 
 
-
+    //checkLock 锛氭槸鍚﹂獙璇佷笂闃典汉鏁伴檺鍒�
     //  add鍙彲鑳芥槸鐐逛笅闈㈠崱鐗�
-    public bool AddHero(HeroInfo heroInfo)
+    public bool AddHero(HeroInfo heroInfo, out int pos, bool checkLock)
     {
+        pos = -1;
         if (heroInfo == null || heroInfo.itemHero == null) return false;
 
-
-        //  濡傛灉褰撳墠鑻遍泟宸茬粡鍦ㄩ槦浼嶉噷浜� 灏变笉澶勭悊浜�
-        if (GetHero(heroInfo.itemHero.guid) != null)
+        if (checkLock)
         {
-            return false; // Hero already in team
+            var lockCnt = HeroUIManager.Instance.lockIndexList.Count;
+            if (lockCnt > 0 && TeamConst.MaxTeamHeroCount - GetHerosOnTeam().Count <= lockCnt)
+            {
+                HeroUIManager.Instance.ShowUnLockTip(HeroUIManager.Instance.lockIndexList[0]);
+                return false;
+            }
+        }
+
+
+        // 鍚屼竴鑻遍泟 鍙兘涓婇樀涓�涓�
+        if (GetHeroByHeroID(heroInfo.heroId) != null)
+        {
+            SysNotifyMgr.Instance.ShowTip("HeroFunc2");
+            return false;
         }
         else
         {
-            int emptyPosition = GetEmptyPosition();
+            pos = GetEmptyPosition();
 
-            if (emptyPosition < 0)
+            if (pos < 0)
             {
-                Debug.LogError("No empty position available in the team.");
+                SysNotifyMgr.Instance.ShowTip("HeroFunc1");
                 return false; // No empty position available
             }
 
-            TeamHero teamHero = new TeamHero(heroInfo, GetEmptyPosition(), this);
+            TeamHero teamHero = new TeamHero(heroInfo, pos, this);
             SetTeamHero(teamHero.positionNum, teamHero);
             return true;
         }
     }
 
 
-    public bool RemoveHero(HeroInfo heroInfo)
+    public bool RemoveHero(HeroInfo heroInfo, out int pos)
     {
+        pos = -1;
         if (heroInfo == null || heroInfo.itemHero == null) return false;
 
         TeamHero teamHero = GetHero(heroInfo.itemHero.guid);
 
         if (teamHero != null)
         {
+            pos = teamHero.positionNum;
             //  浠庡綋鍓嶉槦浼嶉噷绉婚櫎璇ヨ嫳闆�
             SetTeamHero(teamHero.positionNum, null);
             return true;
@@ -308,9 +438,9 @@
     {
         if (teamHero == null) return false;
 
-        for (int i = 0; i < teamHeros.Length; i++)
+        for (int i = 0; i < tempHeroes.Length; i++)
         {
-            if (teamHeros[i] != null && teamHeros[i].guid == teamHero.guid)
+            if (tempHeroes[i] != null && tempHeroes[i].guid == teamHero.guid)
             {
                 SetTeamHero(i, null);
                 return true; // Hero removed successfully
@@ -319,21 +449,33 @@
         return false; // Hero not found
     }
 
+    public bool RemoveHero(int pos)
+    {
+        SetTeamHero(pos, null);
+        return true;
+    }
+
+    public void RemoveAllHeroes()
+    {
+        tempHeroes = new TeamHero[TeamConst.MaxTeamHeroCount];
+    }
+
+
     public void SwapPosition(int index1, int index2)
     {
-        if (index1 < 0 || index1 >= teamHeros.Length || index2 < 0 || index2 >= teamHeros.Length)
+        if (index1 < 0 || index1 >= tempHeroes.Length || index2 < 0 || index2 >= tempHeroes.Length)
         {
             Debug.LogError("Invalid indices for swapping positions.");
             return;
         }
 
-        TeamHero temp = teamHeros[index1];
-        teamHeros[index1] = teamHeros[index2];
-        teamHeros[index2] = temp;
+        TeamHero temp = tempHeroes[index1];
+        tempHeroes[index1] = tempHeroes[index2];
+        tempHeroes[index2] = temp;
 
         //  鏇存柊浣嶇疆缂栧彿
-        if (teamHeros[index1] != null) teamHeros[index1].positionNum = index1;
-        if (teamHeros[index2] != null) teamHeros[index2].positionNum = index2;
+        if (tempHeroes[index1] != null) tempHeroes[index1].positionNum = index1;
+        if (tempHeroes[index2] != null) tempHeroes[index2].positionNum = index2;
     }
     
 }
\ No newline at end of file

--
Gitblit v1.8.0