using System; using System.Collections.Generic; using System.Linq; using System.Text; using LitJson; using UnityEngine; public partial class BattleSettlementManager : GameSystemManager { //结算后需清除 Dictionary battleSettlementDic = new Dictionary(); Dictionary battleAwardDic = new Dictionary(); //B431 另外通报奖励 // public string notifyGuid = string.Empty; public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitialize; EventBroadcast.Instance.AddListener(EventName.BATTLE_END, OnSettlement); } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitialize; EventBroadcast.Instance.RemoveListener(EventName.BATTLE_END, OnSettlement); } public void OnBeforePlayerDataInitialize() { battleSettlementDic.Clear(); battleAwardDic.Clear(); } public void AddPop(string battleName, int result) { bool isWin = result == 1; switch (battleName) { case BattleConst.ArenaBattleField: PopupWindowsProcessor.Instance.Add(isWin ? "ArenaBattleVictoryWin" : "ArenaBattleFailWin", false, BattleConst.ArenaBattleField); break; case BattleConst.BoneBattleField: PopupWindowsProcessor.Instance.Add(isWin ? "BoneBattleVictoryWin" : "BoneBattleFailWin", false, BattleConst.BoneBattleField); break; case BattleConst.TianziBillboradBattleField: PopupWindowsProcessor.Instance.Add("TianziBillboradVictoryWin", false, BattleConst.TianziBillboradBattleField); break; default: PopupWindowsProcessor.Instance.Add(isWin ? "BattleVictoryWin" : "BattleFailWin", false, BattleConst.StoryBossBattleField); break; } } public void ShowResultWin(string battleName, int result) { bool isWin = result == 1; switch (battleName) { case BattleConst.ArenaBattleField: if (isWin) { UIManager.Instance.OpenWindow(); } else { UIManager.Instance.OpenWindow(); } break; case BattleConst.BoneBattleField: if (isWin) { UIManager.Instance.OpenWindow(); } else { UIManager.Instance.OpenWindow(); } break; case BattleConst.TianziBillboradBattleField: TianziBillboradManager.Instance.isSweepVictory = false; UIManager.Instance.OpenWindow(); break; default: if (isWin) { UIManager.Instance.OpenWindow(); } else { UIManager.Instance.OpenWindow(); } break; } if (isWin) { SoundPlayer.Instance.PlayUIAudio(57); } } //"Msg":{"itemInfo":[{"ItemID":5,"Count":2},{"ItemID":3,"Count":40}],"winFaction":1,"statInfo":{"1":{"1":{"1":{"NPCID":0,"DefHurt":727,"CureHP":0,"AtkHurt":1891,"ObjID":1,"HeroID":530004},"3":{"NPCID":0,"DefHurt":483,"CureHP":1511,"AtkHurt":782,"ObjID":6,"HeroID":520001},"2":{"NPCID":0,"DefHurt":953,"CureHP":0,"AtkHurt":1712,"ObjID":5,"HeroID":510003}}},"2":{"1":{"1":{"NPCID":10101091,"DefHurt":638,"CureHP":0,"AtkHurt":140,"ObjID":2,"HeroID":610001},"3":{"NPCID":10101092,"DefHurt":625,"CureHP":0,"AtkHurt":126,"ObjID":3,"HeroID":610001},"5":{"NPCID":10101093,"DefHurt":3122,"CureHP":0,"AtkHurt":1897,"ObjID":4,"HeroID":510003}}}}} public void OnSettlement(string _guid, JsonData _data) { if (string.Empty == _guid) return; Debug.Log($"OnBattleEnd 结算 guid {_guid}"); var battle = BattleManager.Instance.GetBattleField(_guid); if (battle == null) return; var battleName = battle.ToString(); try { battleSettlementDic[battleName] = _data; if (battleAwardDic.ContainsKey(battleName)) { //合并战报和结算数据 JsonData extendData = battleAwardDic[battleName]; foreach (var key in extendData.Keys) { _data[key] = extendData[key]; } } } catch (Exception e) { Debug.LogError(e.ToString()); } string activeBattleName = BattleManager.Instance.GetActiveBattleName(); if (_data.ContainsKey("winFaction")) { var result = (int)_data["winFaction"]; if (battleName == activeBattleName) { //自己场景结算 ShowResultWin(battleName, result); } else { AddPop(battleName, result); } } } public void WinShowOver(string battleName) { battleSettlementDic.Remove(battleName); battleAwardDic.Remove(battleName); var battle = BattleManager.Instance.GetActiveBattleFieldByName(battleName); if (battle != null) battle.WhaleFall(); } public JsonData GetBattleSettlement(string battleName) { if (!battleSettlementDic.ContainsKey(battleName)) { return null; } return battleSettlementDic[battleName]; } public JsonData GetBattleSettlementByMapID(int mapID) { if (BattleConst.mapIDToBattleNameDic.ContainsKey(mapID)) { return GetBattleSettlement(BattleConst.mapIDToBattleNameDic[mapID]); } return null; } public void UpdateSettlementData(HB431_tagSCTurnFightRet netData) { // 先获得战斗结果,如果需要展示战斗,则请求战报 (如有些跳过战斗表现直接结算) bool needBattleData = true; var guid = UIHelper.ServerStringTrim(netData.GUID); var mapID = (int)netData.MapID; JsonData extendData2 = JsonMapper.ToObject(netData.AwardMsg); battleAwardDic[BattleConst.mapIDToBattleNameDic[mapID]] = extendData2; if (needBattleData) { Debug.Log("战斗时序 收到B431 并请求下载战报" + Time.time); var date = UIHelper.ServerStringTrim(netData.PathDate); RequestTurnFightData(guid, date, mapID); } else { JsonData extendData1 = JsonMapper.ToObject(netData.BatStatMsg); JsonData turnFightStateData = new JsonData(); foreach (var key in extendData1.Keys) { turnFightStateData[key] = extendData1[key]; } foreach (var key in extendData2.Keys) { turnFightStateData[key] = extendData2[key]; } EventBroadcast.Instance.Broadcast(EventName.BATTLE_END, guid, turnFightStateData); } } public void RequestTurnFightData(string guid, string date, int mapID) { //mobile.secondworld.net.cn:53080\S9006\20251202\3042602\5b11338f-cf2c-11f0-a0a0-000c29b22418.tfr var serverID = UIHelper.GetServerIDByAccount(PlayerDatas.Instance.baseData.AccID); var url = ServerListCenter.Instance.GetServerUrl(serverID); string assetVersionUrl = string.Empty; if (string.IsNullOrEmpty(date)) { //公共战报 路径: C:\TurnFightReport\S服务器编号\功能地图ID\战报GUID assetVersionUrl = $"{url}/S{serverID}/{mapID}/{guid}.tfr"; } else { //个人战报 路径: C:\TurnFightReport\S服务器编号\日期\玩家ID\功能地图ID\战报GUID assetVersionUrl = $"{url}/S{serverID}/{date}/{PlayerDatas.Instance.baseData.PlayerID}/{mapID}/{guid}.tfr"; } Debug.Log($"请求战报: {assetVersionUrl}"); HttpRequest.Instance.UnityWebRequestTurnFightGet(assetVersionUrl, guid, 3, OnGetTurnFightData); } void OnGetTurnFightData(bool _ok, string guid, byte[] _result) { if (_ok) { ReadTurnFightInfo(_result); } } //战报存储的是B430封包,所以需要转发B430封包 private void ReadTurnFightInfo(byte[] vBytes) { try { byte[] vPackBytes = vBytes; GameNetPackBasic vNetpack; byte[] vCmdBytes = new byte[2]; ServerType socketType = ServerType.B430; Array.Copy(vPackBytes, 0, vCmdBytes, 0, 2); var cmd = (ushort)((ushort)(vCmdBytes[0] << 8) + vCmdBytes[1]); // 处理主工程的封包 if (PackageRegedit.Contain(cmd)) { vNetpack = PackageRegedit.TransPack(socketType, cmd, vPackBytes); if (vNetpack != null) { GameNetSystem.Instance.PushPackage(vNetpack, socketType); } } } catch (Exception ex) { Debug.LogErrorFormat("ReadTurnFightInfo 分析战报异常:{0}", ex); } } #region 战斗结果详情 public BattleDetailMsg msg = new BattleDetailMsg(); public string BattleDetailBattleName = string.Empty; public string BattleDetailMyName = string.Empty; public string BattleDetailEnemyName = string.Empty; public void OpenBattleDetailWin(string battleName) { if (UIManager.Instance.IsOpened()) return; JsonData battleSettlement = GetBattleSettlement(battleName); if (battleSettlement == null) return; msg = ParserBattleDetail(battleSettlement); if (msg == null) return; BattleDetailBattleName = battleName; UIManager.Instance.OpenWindow(); } //战斗结果详情界面获取 我方发起的战斗的中敌方名字 public string GetBattleDetailEnemyNameByMyStart(string battleName) { string detailName = string.Empty; BattleField battleField = BattleManager.Instance.GetActiveBattleFieldByName(battleName); if (battleField == null) return detailName; switch (battleName) { // 敌方名字是Boss名字 case BattleConst.StoryBossBattleField: case BattleConst.BoneBattleField: case BattleConst.TianziBillboradBattleField: BattleObject bossBattleObject = battleField.FindBoss(); if (bossBattleObject == null || bossBattleObject.teamHero == null) return detailName; detailName = bossBattleObject.teamHero.name; break; // 敌方名字是对方玩家名字 case BattleConst.ArenaBattleField: if (!ArenaManager.Instance.TryGetPlayerInfo(ArenaManager.Instance.atkPlayerId, out ArenaMatchInfo info) || info == null) return detailName; detailName = info.PlayerName; break; } return detailName; } public BattleDetailMsg ParserBattleDetail(JsonData jsonMsg) { if (jsonMsg == null) return null; try { string jsonStr = jsonMsg.ToJson(); BattleDetailMsg result = JsonMapper.ToObject(jsonStr); return result; } catch (Exception ex) { Debug.Log("解析战斗数据异常: " + ex.Message); } return null; } // 左蓝右红 // 目前玩家主动发起的阵容一定是1,对方是 2, 如果是那种系统自动打的,一般1-左,2-右 public string GetFaction(bool isBlue) { return isBlue ? "1" : "2"; } public List GetHeroInfoByFaction(BattleDetailMsg msg, string faction) { if (msg == null || msg.statInfo.IsNullOrEmpty()) return null; int winFaction = msg.winFaction; // 获胜阵营 Dictionary> lineupInfo = new Dictionary>(); if (!msg.statInfo.TryGetValue(faction, out lineupInfo) || lineupInfo.IsNullOrEmpty()) return null; var lineupInfoKeyList = lineupInfo.Keys.ToList(); if (lineupInfoKeyList.IsNullOrEmpty()) return null; // 目前只取第一个阵容的信息 string key = lineupInfoKeyList[0]; if (!lineupInfo.TryGetValue(key, out var heroInfoDict) || heroInfoDict.IsNullOrEmpty()) return null; var heroInfoKeyList = heroInfoDict.Keys.ToList(); heroInfoKeyList = heroInfoKeyList .OrderBy(key => int.Parse(key)) // 将字符串键解析为整数后进行排序 .ToList(); // 将排序后的结果转回 List List res = new List(); foreach (var heroInfoKey in heroInfoKeyList) { if (!heroInfoDict.TryGetValue(heroInfoKey, out var heroInfo)) continue; res.Add(heroInfo); } return res; } #endregion } public class BattleDetailMsg { public List itemInfo; public int winFaction; // 对应 "statInfo" // 结构:<阵营编号, <阵容编号, <站位编号, 武将数据>>> // 注意:JSON中的键 "1", "2" 是字符串,所以字典 Key 用 string public Dictionary>> statInfo; } public class BattleDetailHeroInfo { public int ObjID; // 实例ID public int HeroID; // 玩家阵容武将ID public int NPCID; // NPCID public int LV; // 武将等级 public int Star; // 武将星级 public int Skin; // 武将皮肤ID public long DefHurt; // 总承伤 public long CureHP; // 总治疗 public long AtkHurt; // 总输出 public int Dead; // 是否阵亡 } public class BattleDetailRewardItem { public int ItemID; public int Count; }