hch
2025-12-02 0c589b36181e570c3e345dfc455b5c5e35f5d9ee
129 【战斗】战斗系统 - 增加战报下载,同步像素正式环境配置
16个文件已修改
256 ■■■■ 已修改文件
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleFailWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleVictoryWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleConst.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/BattleManager.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ClientVersion/VersionConfig.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/FirstCharge/FirstChargeManager.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildBossManager.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Login/ServerListCenter.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Settlement/BattleFailWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Settlement/BattleSettlementManager.cs 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Settlement/BattleVictoryWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Settlement/BoneBattleFailWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Settlement/BoneBattleVictoryWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Settlement/TianziBillboradVictoryWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/TianziBillborad/TianziBillboradManager.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
@@ -21,6 +21,7 @@
        string guid = UIHelper.ServerStringTrim(vNetData.GUID);
        canAddPack = false;
        Debug.Log("战斗时序 B430 开始处理战斗 " + Time.time);
        //约定 B430 内容(小包1长度WORD + 包1 + 小包2长度WORD + 包2)
        //约定第一个包是B424,先发过来的过滤报错通知
        try
@@ -86,11 +87,11 @@
#if UNITY_EDITOR
            string originPack = string.Empty;
            BattleField battleField = BattleManager.Instance.GetBattleField(guid);
            for (int i = 0; i < vPackList.Count; i++)
            {
                var pack = vPackList[i];
                if (pack is HB427_tagSCUseSkill skill)
                {
                    string heroName = skill.ObjID.ToString();
@@ -102,7 +103,7 @@
                            heroName = battleObj.teamHero.name;
                        }
                    }
                    string skillName = SkillConfig.Get((int)skill.SkillID)?.SkillName ?? "Unknown";
                    originPack += $"[{pack.packUID}] HB427_tagSCUseSkill - ObjID:{skill.ObjID} HeroName:{heroName} SkillID:{skill.SkillID} SkillName:{skillName}\n";
                }
@@ -134,36 +135,36 @@
            vPackList = AnalysisPackQueueAndDistribute(guid, vPackList);
#if UNITY_EDITOR
if (Launch.Instance.isOpenSkillLogFile)
{
string packDetail = "处理前 : " + originPack + "\n";
packDetail += "AnalysisPackQueueAndDistribute 处理后的包列表:\n";
packDetail += PrintPackListDetail(vPackList, 0, guid);
            if (Launch.Instance.isOpenSkillLogFile)
            {
                string packDetail = "处理前 : " + originPack + "\n";
                packDetail += "AnalysisPackQueueAndDistribute 处理后的包列表:\n";
                packDetail += PrintPackListDetail(vPackList, 0, guid);
// 分段打印,避免消息被截断
int chunkSize = 15000; // Unity日志单条消息最大长度约16000字符
if (packDetail.Length > chunkSize)
{
    int totalChunks = (packDetail.Length + chunkSize - 1) / chunkSize;
    for (int i = 0; i < totalChunks; i++)
    {
        int startIndex = i * chunkSize;
        int length = Mathf.Min(chunkSize, packDetail.Length - startIndex);
        string chunk = packDetail.Substring(startIndex, length);
        Debug.LogError($"[Part {i + 1}/{totalChunks}]\n{chunk}");
    }
}
else
{
    Debug.LogError(packDetail);
}
                // 分段打印,避免消息被截断
                int chunkSize = 15000; // Unity日志单条消息最大长度约16000字符
                if (packDetail.Length > chunkSize)
                {
                    int totalChunks = (packDetail.Length + chunkSize - 1) / chunkSize;
                    for (int i = 0; i < totalChunks; i++)
                    {
                        int startIndex = i * chunkSize;
                        int length = Mathf.Min(chunkSize, packDetail.Length - startIndex);
                        string chunk = packDetail.Substring(startIndex, length);
                        Debug.LogError($"[Part {i + 1}/{totalChunks}]\n{chunk}");
                    }
                }
                else
                {
                    Debug.LogError(packDetail);
                }
// 或者写入文件
string filePath = Application.dataPath + "/../BattleReport/PackageAnalysis_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(filePath));
System.IO.File.WriteAllText(filePath, packDetail);
Debug.LogError("包分析结果已保存到: " + filePath);
}
                // 或者写入文件
                string filePath = Application.dataPath + "/../BattleReport/PackageAnalysis_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".txt";
                System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(filePath));
                System.IO.File.WriteAllText(filePath, packDetail);
                Debug.LogError("包分析结果已保存到: " + filePath);
            }
#endif
            for (int i = 0; i < vPackList.Count; i++)
Main/System/Arena/ArenaBattleFailWin.cs
@@ -15,7 +15,7 @@
     [SerializeField] TextEx txtFuncName;
    [SerializeField] ScrollerController scroller;
    JsonData jsonData;
    string battleName = "ArenaBattleField";
    string battleName = BattleConst.ArenaBattleField;
    protected override void InitComponent()
    {
Main/System/Arena/ArenaBattleVictoryWin.cs
@@ -79,7 +79,7 @@
    [SerializeField] TextEx txtFuncName;
    [SerializeField] ScrollerController scroller;
    JsonData jsonData;
    string battleName = "ArenaBattleField";
    string battleName = BattleConst.ArenaBattleField;
    protected override void OnPreOpen()
    {
        scroller.OnRefreshCell += OnRefreshCell;
Main/System/Battle/BattleConst.cs
@@ -14,22 +14,41 @@
        typeof(TianziBillboradBattleWin),
    };
    // 战场名称
    public const string StoryBattleField = "StoryBattleField";
    public const string StoryBossBattleField = "StoryBossBattleField";
    public const string ArenaBattleField = "ArenaBattleField";
    public const string BoneBattleField = "BoneBattleField";
    public const string TianziBillboradBattleField = "TianziBillboradBattleField";
    public static Dictionary<string, string> battleNameToWinName = new Dictionary<string, string>()
    {
        { "StoryBattleField", "BattleWin" },
        { "StoryBossBattleField", "StoryBossBattleWin" },
        { "ArenaBattleField", "ArenaBattleWin" },
        { "BoneBattleField", "BoneFieldBattleWin" },
        { "TianziBillboradBattleField", "TianziBillboradBattleWin" },
        { StoryBattleField, "BattleWin" },
        { StoryBossBattleField, "StoryBossBattleWin" },
        { ArenaBattleField, "ArenaBattleWin" },
        { BoneBattleField, "BoneFieldBattleWin" },
        { TianziBillboradBattleField, "TianziBillboradBattleWin" },
    };
    public static Dictionary<string, int> FieldNameToIndex = new Dictionary<string, int>()
    {
        { "StoryBossBattleField", 1 },
        { "ArenaBattleField", 2 },
        { "BoneBattleField", 3},
        { "TianziBillboradBattleField", 4 },
        { StoryBossBattleField, 1 },
        { ArenaBattleField, 2 },
        { BoneBattleField, 3},
        { TianziBillboradBattleField, 4 },
    };
    //和 CreateBattleField 里的对应
    public static Dictionary<int, string> mapIDToBattleNameDic = new Dictionary<int, string>()
    {
        {1, StoryBattleField},
        {2, StoryBossBattleField},
        {3, ArenaBattleField},
        {30010, BoneBattleField},
        {30020, TianziBillboradBattleField},
    };
    
    #endregion
Main/System/Battle/BattleManager.cs
@@ -635,6 +635,7 @@
            pack.ValueCount = (byte)valueList.Length;
        }
        GameNetSystem.Instance.SendInfo(pack);
        Debug.Log("战斗时序 发起 " + Time.time);
    }
    // 获取当前正在显示的战斗场景名称,如果没有则返回空字符串
Main/System/ClientVersion/VersionConfig.cs
@@ -79,7 +79,7 @@
                }
                else
                {
                    m_GameId = "xbqy";
                    m_GameId = "xssg";
                }
            }
Main/System/FirstCharge/FirstChargeManager.cs
@@ -140,7 +140,7 @@
    {
        if (battleName == null || battleName == string.Empty)
            return;
        if (battleName == "TianziBillboradBattleField")
        if (battleName == BattleConst.TianziBillboradBattleField)
            return;
        if (!IsFuncOpen())
            return;
Main/System/Guild/GuildBossManager.cs
@@ -92,5 +92,40 @@
        return null;
    }
    int lastGuildBossTime;
    // 获取公会中的伤害记录做排名
    public void UpdateGuildBossInfo(HA513_tagMCFamilyActionInfo vNetData)
    {
        if (vNetData.ActionType != GuildManager.GuildBossActionType)
        {
            return;
        }
        GuildManager.Instance.TryGetFamilyActions(GuildManager.GuildBossActionType, out var familyActions);
        if (familyActions == null)
        {
            return;
        }
        foreach (var action in familyActions)
        {
            if (action.Value1 == 1)
            {
                return;
            }
        }
    }
}
public class PlayerGuildBossAtkInfo
{
    public int playerID;
    public int atkTime;
    public int bzTime;
    public int atkCount;
    public long totalHurtValue;
    public int boxCnt;
}
Main/System/Login/ServerListCenter.cs
@@ -180,6 +180,18 @@
        return data.name.Replace("@gm", "");
    }
    // 获取服务器地址
    public string GetServerUrl(int id, string defaultHead = "http://", int replacePort = 0)
    {
        var data = GetServerDataEx(id);
        if (replacePort > 0)
        {
            return $"{defaultHead}{data.region_domain}:{replacePort}";
        }
        return $"{defaultHead}{data.region_domain}:{data.login_port}";
    }
    public void RequestJumpUrl()
    {
        if (VersionUtility.Instance.InIosAuditTime())
Main/System/Settlement/BattleFailWin.cs
@@ -11,7 +11,7 @@
    [SerializeField] Button tipEquipBtn;
    [SerializeField] Button tipHeroPosBtn;
    string battleName = "StoryBossBattleField";
    string battleName = BattleConst.StoryBossBattleField;
    protected override void InitComponent()
    {
        tipEquipBtn.AddListener(() =>
Main/System/Settlement/BattleSettlementManager.cs
@@ -11,6 +11,8 @@
{
    //结算后需清除 <battleName,JsonData>
    Dictionary<string, JsonData> battleSettlementDic = new Dictionary<string, JsonData>();
    Dictionary<string, JsonData> battleAwardDic = new Dictionary<string, JsonData>();   //B431 另外通报奖励
    // public string notifyGuid = string.Empty;
@@ -31,6 +33,7 @@
    public void OnBeforePlayerDataInitialize()
    {
        battleSettlementDic.Clear();
        battleAwardDic.Clear();
    }
    public void AddPop(string battleName, int result)
@@ -38,13 +41,13 @@
        bool isWin = result == 1;
        switch (battleName)
        {
            case "ArenaBattleField":
            case BattleConst.ArenaBattleField:
                PopupWindowsProcessor.Instance.Add(isWin ? "ArenaBattleVictoryWin" : "ArenaBattleFailWin", false);
                break;
            case "BoneBattleField":
            case BattleConst.BoneBattleField:
                PopupWindowsProcessor.Instance.Add(isWin ? "BoneBattleVictoryWin" : "BoneBattleFailWin", false);
                break;
            case "TianziBillboradBattleField":
            case BattleConst.TianziBillboradBattleField:
                PopupWindowsProcessor.Instance.Add("TianziBillboradVictoryWin", false);
                break;
            default:
@@ -58,7 +61,7 @@
        bool isWin = result == 1;
        switch (battleName)
        {
            case "ArenaBattleField":
            case BattleConst.ArenaBattleField:
                if (isWin)
                {
                    UIManager.Instance.OpenWindow<ArenaBattleVictoryWin>();
@@ -68,7 +71,7 @@
                    UIManager.Instance.OpenWindow<ArenaBattleFailWin>();
                }
                break;
            case "BoneBattleField":
            case BattleConst.BoneBattleField:
                if (isWin)
                {
                    UIManager.Instance.OpenWindow<BoneBattleVictoryWin>();
@@ -78,7 +81,7 @@
                    UIManager.Instance.OpenWindow<BoneBattleFailWin>();
                }
                break;
            case "TianziBillboradBattleField":
            case BattleConst.TianziBillboradBattleField:
                TianziBillboradManager.Instance.isSweepVictory = false;
                UIManager.Instance.OpenWindow<TianziBillboradVictoryWin>();
                break;
@@ -110,6 +113,15 @@
            return;
        var battleName = battle.ToString();
        battleSettlementDic[battleName] = _data;
        if (battleAwardDic.ContainsKey(battleName))
        {
            //合并战报和结算数据
            JsonData extendData = battleAwardDic[battleName];
            foreach (var key in extendData.Keys)
            {
                _data[key] = extendData[key];
            }
        }
        string activeBattleName = BattleManager.Instance.GetActiveBattleName();
@@ -132,6 +144,7 @@
    public void WinShowOver(string battleName)
    {
        battleSettlementDic.Remove(battleName);
        battleAwardDic.Remove(battleName);
        var battle = BattleManager.Instance.GetActiveBattleFieldByName(battleName);
        if (battle != null)
@@ -147,29 +160,66 @@
        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 date = UIHelper.ServerStringTrim(netData.PathDate);
        RequestTurnFightData(guid, date, (int)netData.MapID);
        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<string, JsonData>(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 = "http://mobile.secondworld.net.cn:53080";
        var url = ServerListCenter.Instance.GetServerUrl(serverID, replacePort:53080);
        string assetVersionUrl = string.Empty;
        
        if (string.IsNullOrEmpty(date))
        {
            //公共战报  路径: C:\TurnFightReport\S服务器编号\功能地图ID\战报GUID
            assetVersionUrl = $"{url}/S{serverID}/{mapID}//{guid}.tfr";
            assetVersionUrl = $"{url}/S{serverID}/{mapID}/{guid}.tfr";
        }
        else
        {
            //个人战报  路径: C:\TurnFightReport\S服务器编号\日期\玩家ID\战报GUID
            assetVersionUrl = $"{url}/S{serverID}/{date}/{PlayerDatas.Instance.baseData.PlayerID}/{guid}.tfr";
            //个人战报  路径: C:\TurnFightReport\S服务器编号\日期\玩家ID\功能地图ID\战报GUID
            assetVersionUrl = $"{url}/S{serverID}/{date}/{PlayerDatas.Instance.baseData.PlayerID}/{mapID}/{guid}.tfr";
        }
        HttpRequest.Instance.UnityWebRequestTurnFightGet(assetVersionUrl, guid, 3, OnGetTurnFightData);
@@ -183,8 +233,7 @@
        }
    }
    GameNetEncode encoder = new GameNetEncode();
    //单独
    //战报存储的是B430封包,所以需要转发B430封包
    private void ReadTurnFightInfo(byte[] vBytes)
    {
        try
@@ -194,11 +243,8 @@
            byte[] vCmdBytes = new byte[2];
            ServerType socketType = ServerType.B430;
            // vPackBytes = encoder.BaseXorSub(vPackBytes);
            Array.Copy(vPackBytes, 0, vCmdBytes, 0, 2);
            var cmd = (ushort)((ushort)(vCmdBytes[0] << 8) + vCmdBytes[1]);
            bool isRegist = false;  // 未注册封包处理
            // 处理主工程的封包
            if (PackageRegedit.Contain(cmd))
@@ -207,17 +253,9 @@
                if (vNetpack != null)
                {
                    GameNetSystem.Instance.PushPackage(vNetpack, socketType);
                    isRegist = true;
                }
            }
            // 未注册封包处理
            if (!isRegist)
            {
#if UNITY_EDITOR
                PackageRegedit.TransPack(socketType, cmd, vPackBytes);
#endif
            }
        }
        catch (Exception ex)
        {
Main/System/Settlement/BattleVictoryWin.cs
@@ -75,7 +75,7 @@
    [SerializeField] ScrollerController scroller;
    string battleName = "StoryBossBattleField";
    string battleName = BattleConst.StoryBossBattleField;
    protected override void OnPreOpen()
    {
        scroller.OnRefreshCell += OnRefreshCell;
Main/System/Settlement/BoneBattleFailWin.cs
@@ -11,7 +11,7 @@
    [SerializeField] TextEx txtFuncName;
    [SerializeField] Button tipEquipBtn;
    [SerializeField] Button tipHeroPosBtn;
    string battleName = "BoneBattleField";
    string battleName = BattleConst.BoneBattleField;
    protected override void InitComponent()
    {
        tipEquipBtn.AddListener(() =>
Main/System/Settlement/BoneBattleVictoryWin.cs
@@ -7,7 +7,7 @@
    [SerializeField] TextEx txtFuncName;
    [SerializeField] ScrollerController scroller;
    string battleName = "BoneBattleField";
    string battleName = BattleConst.BoneBattleField;
    protected override void OnPreOpen()
    {
        scroller.OnRefreshCell += OnRefreshCell;
Main/System/Settlement/TianziBillboradVictoryWin.cs
@@ -7,7 +7,7 @@
    [SerializeField] ScrollerController scroller;
    [SerializeField] TextEx txtHunt;
    bool isSweepVictory = false;
    string battleName = "TianziBillboradBattleField";
    string battleName = BattleConst.TianziBillboradBattleField;
    protected override void OnPreOpen()
    {
        base.OnPreOpen();
Main/System/TianziBillborad/TianziBillboradManager.cs
@@ -113,7 +113,7 @@
        if (battle == null)
            return;
        var battleName = battle.ToString();
        if (battleName != "TianziBillboradBattleField")
        if (battleName != BattleConst.TianziBillboradBattleField)
            return;
        if (data == null || !data.ContainsKey("totalHurt"))
            return;