hch
8 天以前 af6e207c6d185ed66125e85e18c02c63bea597f9
Main/System/Battle/BattleManager.cs
@@ -10,10 +10,27 @@
    //  同时只能有一场战斗在进行 guid, battlefield
    protected Dictionary<string, BattleField> battleFields = new Dictionary<string, BattleField>();
    public float[] speedGear; //战斗倍数对应的实际速率
    public int speedIndex
    {
        get
        {
            return QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.BattleSpeed, 0);
        }
        set
        {
            QuickSetting.Instance.SetQuickSetting(QuickSettingType.BattleSpeed, value);
            QuickSetting.Instance.SendPackage();
        }
    }
    public int fightGuideID;
    public int fightGuideMainLevelLimit;
    public int fightGuideNoClickSeconds;
    public Action<string, BattleField> onBattleFieldCreate;
    public Action<string, BattleField> onBattleFieldDestroy;
    public Action onBattleFieldDestroy;
    public bool isWaitServerStory = false;  //主线等服务端回报 0425
@@ -24,8 +41,21 @@
        LogicEngine.Instance.OnUpdate += Run;
        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerInit;
        ParseConfig();
        
    }
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("AutoGuaji");
        speedGear = JsonMapper.ToObject<float[]>(config.Numerical4);
        config = FuncConfigConfig.Get("FightGuide");
        fightGuideID = int.Parse(config.Numerical1);
        fightGuideMainLevelLimit = int.Parse(config.Numerical2);
        fightGuideNoClickSeconds = int.Parse(config.Numerical3);
    }
    public override void Release()
    {
@@ -63,7 +93,11 @@
            redTeamList.Add(storyTeam);
            CreateBattleField(string.Empty, MapID, FuncLineID, extendData, redTeamList, blueTeamList);
            HB424_tagSCTurnFightInit vNetData = new HB424_tagSCTurnFightInit();
            vNetData.MapID = (uint)MapID;
            vNetData.FuncLineID = (uint)FuncLineID;
            CreateBattleField(string.Empty, vNetData, extendData, redTeamList, blueTeamList);
        }
        else
        {
@@ -125,50 +159,76 @@
        List<GameNetPackBasic> packQueueSnapshot = new List<GameNetPackBasic>(packQueue);
        List<GameNetPackBasic> newPackList = new List<GameNetPackBasic>();
        HashSet<int> skipIndexes = new HashSet<int>();
        List<GameNetPackBasic> newPackList = ParseBattlePackList(string.Empty, packQueueSnapshot);
        // 这里已经是按照Dequeue的顺序了
        for (int i = 0; i < packQueueSnapshot.Count; i++)
        Action printNewPack = () =>
        {
            if (skipIndexes.Contains(i)) continue;
            GameNetPackBasic pack = packQueueSnapshot[i];
            // 碰到B421 截断 往下收集b421里的全部内容
            if (pack is HB421_tagMCTurnFightObjAction)
            string temp = "After AnalysisPackQueueAndDistribute newPackList count: " + newPackList.Count + "\n";
            foreach (var pack in newPackList)
            {
                HB421_tagMCTurnFightObjAction b421Pack = pack as HB421_tagMCTurnFightObjAction;
                List<GameNetPackBasic> b421PackList = new List<GameNetPackBasic>();
                i++;    // 跳过当前的B421包
                // 收集所有非B421包,直到遇到下一个B421或队列结束
                for (; i < packQueueSnapshot.Count; i++)
                if (pack is CustomHB426CombinePack b426Pack)
                {
                    GameNetPackBasic nextPack = packQueueSnapshot[i];
                    if (nextPack is HB421_tagMCTurnFightObjAction)
                    {
                        i--; // 回退一个位置,留给外层循环处理
                        break;
                    }
                    else
                    {
                        b421PackList.Add(nextPack);
                        skipIndexes.Add(i); // 标记已被合包
                    }
                    temp += "  pack type is " + pack.GetType().Name + " tag is " + (b426Pack.startTag != null ? b426Pack.startTag.Tag : "null") + "\n";
                }
                // 合并所有相关包
                CustomB421ActionPack actionPack = CustomB421ActionPack.CreateB421ActionPack(GetGUID(b421Pack.packUID), b421PackList);
                newPackList.Add(actionPack);
                else if (pack is CustomB421ActionPack b421Pack)
                {
                    temp += "  pack type is " + pack.GetType().Name + " guid is " + b421Pack.guid + "\n";
                }
                else
                {
                    temp += "  pack type is " + pack.GetType().Name + "\n";
                }
            }
            else
            {
                newPackList.Add(pack);
            }
        }
            Debug.LogWarning(temp);
        };
        printNewPack();
        // HashSet<int> skipIndexes = new HashSet<int>();
        // // 这里已经是按照Dequeue的顺序了
        // for (int i = 0; i < packQueueSnapshot.Count; i++)
        // {
        //     if (skipIndexes.Contains(i)) continue;
        //     GameNetPackBasic pack = packQueueSnapshot[i];
        //     // 碰到B421 截断 往下收集b421里的全部内容
        //     if (pack is HB421_tagMCTurnFightObjAction)
        //     {
        //         HB421_tagMCTurnFightObjAction b421Pack = pack as HB421_tagMCTurnFightObjAction;
        //         List<GameNetPackBasic> b421PackList = new List<GameNetPackBasic>();
        //         i++;    // 跳过当前的B421包
        //         // 收集所有非B421包,直到遇到下一个B421或队列结束
        //         for (; i < packQueueSnapshot.Count; i++)
        //         {
        //             GameNetPackBasic nextPack = packQueueSnapshot[i];
        //             if (nextPack is HB421_tagMCTurnFightObjAction)
        //             {
        //                 i--; // 回退一个位置,留给外层循环处理
        //                 break;
        //             }
        //             else
        //             {
        //                 b421PackList.Add(nextPack);
        //                 skipIndexes.Add(i); // 标记已被合包
        //             }
        //         }
        //         // 合并所有相关包
        //         CustomB421ActionPack actionPack = CustomB421ActionPack.CreateB421ActionPack(GetGUID(b421Pack.packUID), b421PackList);
        //         newPackList.Add(actionPack);
        //     }
        //     else
        //     {
        //         newPackList.Add(pack);
        //     }
        // }
        // 防范机制:连续多次没有战斗片段封包时自动回城
        if (newPackList.Count == 0)
@@ -191,9 +251,32 @@
        // b421跟b426的包已经处理完了
            packQueue = new Queue<GameNetPackBasic>(newPackList);
        packQueue.Clear();
        for (int i = 0; i < newPackList.Count; i++)
        {
            var pack = newPackList[i];
            packQueue.Enqueue(pack);
        }
            // packQueue = new Queue<GameNetPackBasic>(newPackList);
        DistributeNextPackage();
    }
    public static List<GameNetPackBasic> ParseBattlePackList(string guid, List<GameNetPackBasic> packQueueSnapshot)
    {
        var list = CustomHB426CombinePack.CombineToSkillPackFromList(guid, packQueueSnapshot);
        string str = "ParseBattlePackList \n";
        for (int i = 0; i < list.Count; i++)
        {
            str += "  " + list[i].GetType().Name + "\n";
        }
        // BattleDebug.LogError(str);
        return list;
    }
    //  专属于主线战斗的派发
@@ -277,6 +360,7 @@
        if (!battleReportDict.TryGetValue(guid, out queue))
        {
            queue = new Queue<GameNetPackBasic>();
            battleReportDict.Add(guid, queue);
        }
        queue.Enqueue(vNetPack);
@@ -289,12 +373,38 @@
            battlePackRelationList.Add(guid, uidList);
        }
        uidList.Add(vNetPack.packUID);
        if (!uidList.Contains(vNetPack.packUID))
        {
            uidList.Add(vNetPack.packUID);
        }
    }
    public void PushPackUID(string guid, ulong packUID)
    {
        List<ulong> uidList = null;
        if (!battlePackRelationList.TryGetValue(guid, out uidList))
        {
            uidList = new List<ulong>();
            battlePackRelationList.Add(guid, uidList);
        }
        if (!uidList.Contains(packUID))
        {
            uidList.Add(packUID);
        }
    }
    public BattleField GetBattleField(ulong packUID)
    {
        return GetBattleField(GetGUID(packUID));
        string guid = GetGUID(packUID);
        BattleField battleField = GetBattleField(GetGUID(packUID));
        if (battleField == null || battleField.rejectNewPackage)
        {
            return null;
        }
        return battleField;
    }
    public BattleField GetBattleField(string guid)
@@ -320,28 +430,50 @@
    {
        Queue<GameNetPackBasic> queue = null;
        if (!battleReportDict.TryGetValue(guid, out queue))
        {
            BattleDebug.LogError("DistributeNextReportPackage could not find queue for guid : " + guid);
            return;
        }
        var pack = queue.Dequeue();
        PackageRegedit.Distribute(pack);
        if (queue.Count <= 0)
        {
            battleReportDict.Remove(guid);
            battlePackRelationList.Remove(guid);
            return;
        }
        var pack = queue.Dequeue();
        // Debug.LogError("DistributeNextReportPackage for guid : " + guid + " pack type : " + pack.GetType());
        try
        {
            if (pack is CustomHB426CombinePack combinePack)
            {
                combinePack.Distribute();
            }
            else if (pack is CustomB421ActionPack actionPack)
            {
                actionPack.Distribute();
            }
            else
            {
                PackageRegedit.Distribute(pack);
            }
        }
        catch (Exception ex)
        {
            Debug.LogError("DistributeNextPackage: 分发包异常 " + ex);
        }
    }
    #endregion
    public BattleField CreateBattleField(string guid, int MapID, int FuncLineID, JsonData extendData, List<TeamBase> redTeamList, List<TeamBase> blueTeamList)
    public BattleField CreateBattleField(string guid, HB424_tagSCTurnFightInit vNetData, JsonData extendData, List<TeamBase> redTeamList, List<TeamBase> blueTeamList)
    {
        BattleField battleField = null;
        int MapID = (int)vNetData.MapID;
        int FuncLineID = (int)vNetData.FuncLineID;
        bool isCreate = true;
        if (battleFields.TryGetValue(guid, out battleField))
@@ -359,7 +491,7 @@
        }
        if (isCreate)
        {
        {
            battleField = BattleFieldFactory.CreateBattleField(guid, MapID, FuncLineID, extendData, redTeamList, blueTeamList);
            if (string.IsNullOrEmpty(guid))
@@ -372,7 +504,7 @@
        battleField.Init(MapID, FuncLineID, extendData, redTeamList, blueTeamList);
        battleField.Init(MapID, FuncLineID, extendData, redTeamList, blueTeamList, vNetData.TurnMax);
        return battleField;
    }
@@ -385,14 +517,13 @@
            return;
        }
        onBattleFieldDestroy?.Invoke(battleField.guid, battleField);
        battleField.Release();
        string guid = battleField.guid;
        if (battleFields.ContainsKey(guid))
        {
            battleFields.Remove(guid);
        }
        battleFields.Remove(guid);
        battleReportDict.Remove(guid);
        battlePackRelationList.Remove(guid);
        if (storyBattleField == battleField)
        {
@@ -400,6 +531,9 @@
        }
        GameObject.DestroyImmediate(battleField.battleRootNode.gameObject);
        onBattleFieldDestroy?.Invoke();
    }
@@ -411,6 +545,7 @@
    // 4-继续战斗          -   玩家主线战斗中(包含主线小怪、主线boss),前端表现完后端同步的战斗片段后,可再回复该值,后端会根据战斗逻辑及流程自动回复下一段的战斗片段封包,一直循环
    public void MainFightRequest(byte reqType, uint reqValue = 0)
    {
        // Debug.LogError("MainFightRequest reqType " + reqType + " reqValue " + reqValue);
        CB413_tagCSMainFightReq req = new CB413_tagCSMainFightReq();
        req.ReqType = reqType;
        req.ReqValue = reqValue;
@@ -425,9 +560,11 @@
    {
        try
        {
            foreach (var battleField in battleFields)
            List<string> keys = new List<string>(battleFields.Keys);
            for (int i = keys.Count - 1; i >= 0; i--)
            {
                battleField.Value?.Run();
                var battleField = battleFields[keys[i]];
                battleField?.Run();
            }
        }
        catch (System.Exception ex)
@@ -436,4 +573,53 @@
        }
    }
    public BattleField GetBattleFieldByMapID(int v)
    {
        foreach (var battleField in battleFields)
        {
            if (battleField.Value.MapID == v)
            {
                return battleField.Value;
            }
        }
        return null;
    }
    /// <summary>
    /// 检查是否有非主线战斗(如竞技场、白骨等)正在进行
    /// </summary>
    /// <returns>如果有任何非主线战斗且未结束,则返回true</returns>
    public bool IsOtherBattleInProgress()
    {
        foreach (var kvp in battleFields)
        {
            BattleField battleField = kvp.Value;
            // 检查战场是否有效且尚未结束
            if (battleField == null || battleField.IsBattleFinish)
                continue;
            // MapID 1 (StoryBattleField) 和 2 (StoryBossBattleField) 都是主线
            if (battleField.MapID == 1 || battleField.MapID == 2)
                continue;
            return true;
        }
        return false;
    }
    // 获取当前正在显示的战斗场景名称,如果没有则返回空字符串
    public string GetActiveBattleName()
    {
        foreach (var kvp in battleFields)
        {
            BattleField battleField = kvp.Value;
            if (battleField == null)
                continue;
            var battleName = battleField.ToString();
            if (BattleConst.battleNameToWinName.ContainsKey(battleName)
            && UIManager.Instance.IsOpened(BattleConst.battleNameToWinName[battleName]))
                return battleName;
        }
        return "";
    }
}