using System.Collections.Generic; using UnityEngine; public class CustomHB426CombinePack : GameNetPackBasic { public HB426_tagSCTurnFightTag startTag; public HB426_tagSCTurnFightTag endTag; public int fromIndex; public int toIndex; public string guid; public List packList = new List(); public override void ReadFromBytes(byte[] vBytes) { base.ReadFromBytes(vBytes); } public void SetHB426End(int _toIndex, HB426_tagSCTurnFightTag _endTag) { if (_endTag.Sign != 1) { Debug.LogError("HB426_tagSCTurnFightTag Sign must be 1 for end tag, but got: " + _endTag.Sign); return; } endTag = _endTag; toIndex = _toIndex; PrintAllPack(); } public void SetHB426Start(int _fromIndex, HB426_tagSCTurnFightTag tag) { if (tag.Sign != 0) { Debug.LogError("HB426_tagSCTurnFightTag Sign must be 0 for start tag, but got: " + tag.Sign); return; } fromIndex = _fromIndex; startTag = tag; } public void PrintAllPack() { string temp = "CustomHB426CombinePack startTag: " + (startTag != null ? startTag.Tag : "null") + " fromIndex: " + fromIndex + " toIndex: " + toIndex + "\n"; for (int i = 0; i < packList.Count; i++) { var pack = packList[i]; if (pack is CustomHB426CombinePack b426Pack) { temp += " pack type is " + pack.GetType().Name + " tag is " + (b426Pack.startTag != null ? b426Pack.startTag.Tag : "null") + "\n"; } else { temp += " pack type is " + pack.GetType().Name + "\n"; } } // BattleDebug.LogError(temp); } public void AddPack(GameNetPackBasic pack) { if (startTag == null) { Debug.LogError("startTag is null, please set it first."); return; } packList.Add(pack); } public bool IsEndPack(HB426_tagSCTurnFightTag tag) { if (tag == null) { return false; } if (startTag == null) { Debug.LogError("startTag is null, please set it first."); return false; } return startTag.Tag == tag.Tag && tag.Sign == 1; } public static List CombineToSkillPackFromList(string _guid, List b421SeriesPackList) { Dictionary combineDict = new Dictionary(); Dictionary indexDict = new Dictionary(); for (int i = 0; i < b421SeriesPackList.Count; i++) { var pack = b421SeriesPackList[i]; if (pack is HB426_tagSCTurnFightTag) { var tag = pack as HB426_tagSCTurnFightTag; CustomHB426CombinePack combinePack; if (!combineDict.TryGetValue(tag.Tag, out combinePack)) { combinePack = new CustomHB426CombinePack(); combinePack.guid = _guid; combineDict.Add(tag.Tag, combinePack); indexDict.Add(i, combinePack); } if (tag.Sign == 0) { combinePack.SetHB426Start(i, tag); continue; } // 找到对应的开始标签 if (combinePack.IsEndPack(tag)) { combinePack.SetHB426End(i, tag); continue; } Debug.LogError("No matching start tag or end tag found: " + tag.Tag); continue; } else { indexDict.Add(i, pack); } } // 嵌套包内的包合并 foreach (var combinePack in combineDict.Values) { for (int i = combinePack.fromIndex + 1; i < combinePack.toIndex; i++) { if (indexDict.TryGetValue(i, out var pack)) { indexDict.Remove(i); combinePack.AddPack(pack); if (pack is CustomHB426CombinePack) { // 如果是嵌套的包 加入之后 调整i i = (pack as CustomHB426CombinePack).toIndex; } } } } List newPackList = new List(); // string temp = string.Empty; for (int i = 0; i < b421SeriesPackList.Count; i++) { if (indexDict.TryGetValue(i, out var pack)) { newPackList.Add(pack); if (pack is CustomHB426CombinePack) { var cbpack = pack as CustomHB426CombinePack; // temp += "pack type is " + pack.GetType().Name + " tag is " + cbpack.startTag.Tag + "\n"; } else { // temp += "pack type is " + pack.GetType().Name + "\n"; } } } // newPackList = BattleManager.ParseBattlePackList(_guid, newPackList); // Debug.LogError(temp); return newPackList; } public void Distribute() { BattleField battleField = BattleManager.Instance.GetBattleField(guid); if (null == battleField) { Debug.LogError("BattleField not found for guid: " + guid); return; } var skillAction = CreateSkillAction(); if (null != skillAction) { battleField.PlayRecord(skillAction); } } public SkillRecordAction CreateSkillAction() { BattleField battleField = BattleManager.Instance.GetBattleField(guid); if (null == battleField) { Debug.LogError("BattleField not found for guid: " + guid); return null; } // 服务器修改了 现在第一个不一定是B427 也有可能是B428 先放Buff while (packList.Count > 0) { var pack = packList[0]; packList.RemoveAt(0); if (pack is HB427_tagSCUseSkill) { packList.Insert(0, pack); break; } else if (pack is CustomHB426CombinePack) { Debug.LogError("无法找到Skill包,先发现了嵌套包"); return null; } else { // Debug.LogError("发现非Skill包,先分发掉: " + pack.GetType().Name); PackageRegedit.Distribute(pack); } } if (startTag.Tag.StartsWith("Skill_")) { HB427_tagSCUseSkill skill = packList[0] as HB427_tagSCUseSkill; packList.RemoveAt(0); if (null == skill) { Debug.LogError("No HB427_tagSCUseSkill found in packList."); return null; } BattleObject _caster = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID); // BattleDebug.LogError("_caster == null : " + (_caster == null) + " skill.ObjID : " + skill.ObjID); SkillRecordAction skillAction = new SkillRecordAction(battleField, _caster, skill, packList); return skillAction; } return null; } #if UNITY_EDITOR public static CustomHB426CombinePack CreateCustomPack(string _guid, HB427_tagSCUseSkill skill) { CustomHB426CombinePack pack = new CustomHB426CombinePack(); pack.guid = string.Empty; pack.startTag = new HB426_tagSCTurnFightTag { Tag = "Skill_Start", Sign = 0 }; pack.packList.Add(skill); return pack; } #endif }