| | |
| | | // 同时只能有一场战斗在进行 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 |
| | | |
| | |
| | | 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() |
| | | { |
| | |
| | | |
| | | 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 |
| | | { |
| | |
| | | |
| | | 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) |
| | |
| | | |
| | | |
| | | // 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; |
| | | |
| | | } |
| | | |
| | | // 专属于主线战斗的派发 |
| | |
| | | if (!battleReportDict.TryGetValue(guid, out queue)) |
| | | { |
| | | queue = new Queue<GameNetPackBasic>(); |
| | | battleReportDict.Add(guid, queue); |
| | | } |
| | | |
| | | queue.Enqueue(vNetPack); |
| | |
| | | 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) |
| | |
| | | { |
| | | 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)) |
| | |
| | | } |
| | | |
| | | if (isCreate) |
| | | { |
| | | { |
| | | battleField = BattleFieldFactory.CreateBattleField(guid, MapID, FuncLineID, extendData, redTeamList, blueTeamList); |
| | | |
| | | if (string.IsNullOrEmpty(guid)) |
| | |
| | | |
| | | |
| | | |
| | | battleField.Init(MapID, FuncLineID, extendData, redTeamList, blueTeamList); |
| | | battleField.Init(MapID, FuncLineID, extendData, redTeamList, blueTeamList, vNetData.TurnMax); |
| | | |
| | | return battleField; |
| | | } |
| | |
| | | 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) |
| | | { |
| | |
| | | } |
| | | |
| | | GameObject.DestroyImmediate(battleField.battleRootNode.gameObject); |
| | | |
| | | onBattleFieldDestroy?.Invoke(); |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | // 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; |
| | |
| | | { |
| | | 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) |
| | |
| | | } |
| | | } |
| | | |
| | | 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 ""; |
| | | } |
| | | } |