hch
2026-01-06 9406f16ae0496f02adc301d6084af71240cba514
Merge branch 'master' of http://mobile.secondworld.net.cn:10010/r/Project_SG_scripts
10个文件已修改
290 ■■■■ 已修改文件
Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB424_tagSCTurnFightInit.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeWin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaManager.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordWin.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/ArenaBattleWin.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs 143 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/PlayerProfile/PlayerProfileWin.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Team/TeamHero.Properties.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Team/TeamHero.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Core/NetworkPackage/ServerPack/HB4_FightDefine/HB424_tagSCTurnFightInit.cs
@@ -49,6 +49,8 @@
                    TransBytes (out FactionList[i].LineupList[j].ObjList[k].LV, vBytes, NetDataType.WORD);
                    TransBytes (out FactionList[i].LineupList[j].ObjList[k].PosNum, vBytes, NetDataType.BYTE);
                    TransBytes (out FactionList[i].LineupList[j].ObjList[k].AngreXP, vBytes, NetDataType.WORD);
                    TransBytes (out FactionList[i].LineupList[j].ObjList[k].FightPower, vBytes, NetDataType.DWORD);
                    TransBytes (out FactionList[i].LineupList[j].ObjList[k].FightPowerEx, vBytes, NetDataType.DWORD);
                }
            }
        }
@@ -72,6 +74,8 @@
        public ushort LV;        // 等级,玩家的武将等级或NPC成长等级,等级显示以该值为准
        public byte PosNum;        // 在本阵容中的站位,从1开始,非主战斗武将为0,如红颜
        public ushort AngreXP;        // 当前怒气值
        public uint FightPower;        // 战力,求余亿部分
        public uint FightPowerEx;        // 战力,整除亿部分
    }
    public class tagSCTurnFightLineup {
Main/System/Arena/ArenaChallengeWin.cs
@@ -77,7 +77,8 @@
    {
        CreateScroller();
        voucher.Display();
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
        long myFightPower = ArenaManager.Instance.GetMyFightPower();
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(myFightPower);
        imgMoneyIcon.SetIconWithMoneyType(ArenaManager.Instance.currencyType);
        txtMoneyCount.text = UIHelper.ShowUseMoney(ArenaManager.Instance.currencyType, ArenaManager.Instance.currencyValue);
    }
Main/System/Arena/ArenaManager.cs
@@ -304,8 +304,16 @@
        sortedList.Sort((a, b) => b.Time.CompareTo(a.Time)); // 按时间从大到小排序
        return true;
    }
}
    //优先取进攻队伍的战力,没有进攻队伍,取主线战力
    public long GetMyFightPower()
    {
        var arenaDefenseTeam = TeamManager.Instance.GetTeam(TeamType.Arena);
        return arenaDefenseTeam.IsEmpty() || arenaDefenseTeam.GetTeamHeroCount() <= 0 ?
            PlayerDatas.Instance.baseData.FightPower :
            FightPowerManager.Instance.GetTeamFightPower(TeamType.Arena, false);
    }
}
Main/System/Arena/ArenaRecordWin.cs
@@ -82,6 +82,7 @@
    {
        CreateScroller();
        voucher.Display();
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
        long myFightPower = ArenaManager.Instance.GetMyFightPower();
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(myFightPower);
    }
}
Main/System/Battle/ArenaBattleWin.cs
@@ -172,6 +172,22 @@
    }
    private long GetFightPonit(List<BattleObject> Team)
    {
        if (Team.IsNullOrEmpty())
        {
            return 0;
        }
        long res = 0;
        foreach (var obj in Team)
        {
            if (obj.teamHero == null)
                continue;
            res += obj.teamHero.fightPower;
        }
        return res;
    }
    private void DisplayPlayerInfo()
    {
        if (battleField == null)
@@ -186,7 +202,7 @@
        txtEnemyLV.text = Language.Get("Arena22", info.Lv);
        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
        txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(info.FightPower);
        txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(GetFightPonit(enemyTeam));
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic));
        enemyAvatarCell.SetListener(() =>
        {
@@ -197,7 +213,8 @@
        txtMyLV.text = Language.Get("Arena22", PlayerDatas.Instance.baseData.LV);
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
        txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(PlayerDatas.Instance.baseData.FightPower);
        long myFightPower = GetFightPonit(myTeam);
        txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(myFightPower);
        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic));
        team = GetTeamHeroList(myTeam);
        myCountry.RefreshOnTeamCountry(team, true);
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
@@ -199,6 +199,18 @@
        return res;
    }
    public bool TryGetFightPointByTeamType(int playerID, int teamType, out long fightPower)
    {
        fightPower = 0;
        var lineupDic = GetViewPlayerData(playerID)?.rolePlusData?.LineupDic;
        if (lineupDic != null && lineupDic.TryGetValue(teamType, out var lineupData))
        {
            fightPower = lineupData.FightPower;
            return true;
        }
        return false;
    }
    public Dictionary<int, RolePlusData.EquipData> GetEquipDataDict(int playerID)
    {
        ViewPlayerData viewPlayerData = GetViewPlayerData(playerID);
@@ -325,6 +337,20 @@
        return GetUseData(hero, 73);
    }
    // 获取红颜属性值
    public RolePlusData.BeautyData GetBeautyData(int playerID)
    {
        ViewPlayerData viewPlayerData = GetViewPlayerData(playerID);
        return viewPlayerData?.rolePlusData?.beautyData;
    }
    // 获取坐骑数据对象
    public RolePlusData.HorseData GetHorseData(int playerID)
    {
        ViewPlayerData viewPlayerData = GetViewPlayerData(playerID);
        return viewPlayerData?.rolePlusData?.horseData;
    }
    #endregion
    #region 解析PlusData
    public class ViewPlayerData
@@ -358,6 +384,27 @@
        // 阵容字典 <阵容ID, 阵容数据>
        public Dictionary<int, LineupData> LineupDic = new Dictionary<int, LineupData>();
        // 红颜数据
        public BeautyData beautyData;
        // 坐骑数据
        public HorseData horseData;
        // 红颜数据类
        public class BeautyData
        {
            public int Cnt; // 已解锁数
            public Dictionary<int, long> AttrDict = new Dictionary<int, long>(); // 属性
        }
        // 坐骑数据类
        public class HorseData
        {
            public int LV;       // 等级
            public int ClassLV;  // 阶级
            public Dictionary<int, long> AttrDict = new Dictionary<int, long>(); // 属性
        }
        // 装备数据类
        public class EquipData
@@ -393,18 +440,43 @@
            public Dictionary<int, List<int>> Data = new Dictionary<int, List<int>>();
        }
        // --- 解析逻辑 ---
        // 通用的属性解析方法
        private Dictionary<int, long> ParseAttrDict(JsonData jd, string key)
        {
            Dictionary<int, long> result = new Dictionary<int, long>();
            if (jd.Keys.Contains(key))
            {
                JsonData attrs = jd[key];
                foreach (string attrKey in attrs.Keys)
                {
                    if (int.TryParse(attrKey, out int attrId))
                    {
                        JsonData v = attrs[attrKey];
                        long val = 0;
                        // 健壮性数值转换
                        if (v.IsLong) val = (long)v;
                        else if (v.IsInt) val = (long)(int)v;
                        else if (v.IsDouble) val = (long)(double)v;
                        else if (v.IsString) long.TryParse(v.ToString(), out val);
                        result[attrId] = val;
                    }
                }
            }
            return result;
        }
        // --- 解析逻辑 ---
        public void AnalysisRolePlusData(string jsonStr)
        {
            try
            {
                if (string.IsNullOrEmpty(jsonStr)) return;
                // 清除旧数据,防止重用对象时数据堆叠
                EquipDic.Clear();
                LineupDic.Clear();
                beautyData = null; // 必须置空,防止显示上一个玩家的数据
                horseData = null;  // 必须置空
                // 1. 转为 JsonData 对象
                JsonData jd = JsonMapper.ToObject(jsonStr);
@@ -429,7 +501,33 @@
                        }
                    }
                }
                // 【新增】解析红颜 (Beauty)
                if (jd.Keys.Contains("Beauty"))
                {
                    JsonData beautyJd = jd["Beauty"];
                    beautyData = new BeautyData();
                    if (beautyJd.Keys.Contains("Cnt"))
                        beautyData.Cnt = (int)beautyJd["Cnt"];
                    // 解析属性
                    beautyData.AttrDict = ParseAttrDict(beautyJd, "Attr");
                }
                // 【新增】解析坐骑 (Horse)
                if (jd.Keys.Contains("Horse"))
                {
                    JsonData horseJd = jd["Horse"];
                    horseData = new HorseData();
                    if (horseJd.Keys.Contains("LV"))
                        horseData.LV = (int)horseJd["LV"];
                    if (horseJd.Keys.Contains("ClassLV"))
                        horseData.ClassLV = (int)horseJd["ClassLV"];
                    // 解析属性
                    horseData.AttrDict = ParseAttrDict(horseJd, "Attr");
                }
                // 3. 解析阵容 (Lineup)
                if (jd.Keys.Contains("Lineup"))
                {
@@ -481,43 +579,7 @@
                                                heroData.SkillIDList.Add((int)skills[i]);
                                            }
                                        }
                                        // 【修改点 2】: 属性解析逻辑更新
                                        if (heroJd.Keys.Contains("AttrDict"))
                                        {
                                            JsonData attrs = heroJd["AttrDict"];
                                            foreach (string attrKey in attrs.Keys)
                                            {
                                                if (int.TryParse(attrKey, out int attrId))
                                                {
                                                    JsonData v = attrs[attrKey];
                                                    long val = 0;
                                                    // 健壮性判断:无论Json里是int, long还是double,都安全转为long
                                                    if (v.IsLong)
                                                    {
                                                        val = (long)v;
                                                    }
                                                    else if (v.IsInt)
                                                    {
                                                        val = (long)(int)v;
                                                    }
                                                    else if (v.IsDouble)
                                                    {
                                                        // 如果服务端发了小数,这里会截断取整,防止报错
                                                        val = (long)(double)v;
                                                    }
                                                    else if (v.IsString)
                                                    {
                                                        // 防止有些极端情况数值变成了字符串
                                                        long.TryParse(v.ToString(), out val);
                                                    }
                                                    heroData.AttrDict[attrId] = val;
                                                }
                                            }
                                        }
                                        heroData.AttrDict = ParseAttrDict(heroJd, "AttrDict");
                                        lineupData.HeroDic[heroPos] = heroData;
                                    }
                                }
@@ -526,6 +588,7 @@
                        }
                    }
                }
            }
            catch (Exception e)
            {
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using UnityEngine;
@@ -19,6 +20,10 @@
    [SerializeField] OtherEquipCardItem[] equipCards;
    [SerializeField] ButtonEx btnMM;
    [SerializeField] TextEx txtMMCnt;
    [SerializeField] ButtonEx btnHorse;
    [SerializeField] HorseController horseController;
    [SerializeField] TextEx txtHorseLV;
    [SerializeField] ImageEx imgHorseBG;
    [SerializeField] ButtonEx btnBlock;
    [SerializeField] ButtonEx btnReport;
    [SerializeField] ButtonEx btnAddFriend;
@@ -26,24 +31,45 @@
    OtherPlayerDetailManager.ViewPlayerData viewPlayerData;
    OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } }
    int viewPlayerLineupType = -1;
    int teamType = -1;
    protected override void InitComponent()
    {
        btnReport.SetListener(OnClickReport);
        btnCopy.SetListener(OnClickCopy);
        btnGuild.SetListener(OnClickGuild);
        btnMM.SetListener(OnClickMM);
        btnHorse.SetListener(OnClickHorse);
    }
    protected override void OnPreOpen()
    {
        viewPlayerLineupType = functionOrder;
        GuildManager.Instance.OnRefreshFairyList += OnRefreshFairyList;
        teamType = functionOrder;
        Display();
    }
    protected override void OnPreClose()
    {
        GuildManager.Instance.OnRefreshFairyList -= OnRefreshFairyList;
    }
    private void OnRefreshFairyList()
    {
        if (viewPlayerData == null)
        {
            return;
        }
        if (!GuildManager.Instance.guildsDict.ContainsKey(viewPlayerData.FamilyID))
        {
            return;
        }
        if (!UIManager.Instance.IsOpened<GuildPreviewWin>())
        {
            UIManager.Instance.OpenWindow<GuildPreviewWin>(viewPlayerData.FamilyID);
        }
    }
    private void Display()
@@ -56,27 +82,41 @@
            return;
        }
        DisplayMM();
        DisplayPlayerInfo(viewPlayerData);
        DisplayGuildInfo(viewPlayerData);
        int playerID = viewPlayerData.PlayerID;
        var heroList = manager.GetHeroDataSortList(playerID, viewPlayerLineupType);
        DisplayMM(playerID);
        var heroList = manager.GetHeroDataSortList(playerID, teamType);
        if (heroList.IsNullOrEmpty())
        {
            heroList = manager.GetHeroDataSortList(playerID, (int)TeamType.Story);
        }
        DisplayCard(heroList);
        long fightPonit;
        if (!manager.TryGetFightPointByTeamType(playerID, teamType, out fightPonit))
        {
            if (!manager.TryGetFightPointByTeamType(playerID, (int)TeamType.Story, out fightPonit))
            {
                fightPonit = 0;
            }
        }
        txtFightPower.text = UIHelper.ReplaceLargeArtNum(fightPonit);
        var equipDict = manager.GetEquipDataDict(playerID);
        DisplayEquip(equipDict);
    }
    private void DisplayMM()
    private void DisplayMM(int playerID)
    {
        txtMMCnt.text = Language.Get("OtherPlayerDetail08", 0);
        OtherPlayerDetailManager.RolePlusData.BeautyData beautyData = manager.GetBeautyData(playerID);
        txtMMCnt.text = Language.Get("OtherPlayerDetail08", beautyData == null ? 0 : beautyData.Cnt);
    }
    private void DisplayGuildInfo(OtherPlayerDetailManager.ViewPlayerData viewPlayerData)
    {
        if (viewPlayerData.FamilyEmblemID <= 0 || string.IsNullOrEmpty(viewPlayerData.FamilyEmblemWord))
@@ -87,7 +127,7 @@
        btnGuild.SetActive(true);
        guildEmblem.Display(viewPlayerData.FamilyEmblemID, viewPlayerData.FamilyEmblemWord, 0.35f);
        txtGuildName.text = viewPlayerData.FamilyName;
        GuildManager.Instance.SendFindGuildNoDecrypt(viewPlayerData.FamilyID.ToString());
    }
    private void DisplayPlayerInfo(OtherPlayerDetailManager.ViewPlayerData viewPlayerData)
@@ -95,7 +135,6 @@
        txtPlayerName.text = viewPlayerData.PlayerName;
        txtPlayerId.text = Language.Get("OtherPlayerDetail02", viewPlayerData.PlayerID);
        txtServerName.text = Language.Get("PlayerProfile11", ServerListCenter.Instance.GetServerName(viewPlayerData.ServerID));
        txtFightPower.text = UIHelper.ReplaceLargeArtNum(viewPlayerData.FightPower);
        txtLV.text = viewPlayerData.LV.ToString();
        avatarCell.InitUI(AvatarHelper.GetAvatarModel(viewPlayerData.PlayerID, viewPlayerData.Face, viewPlayerData.FacePic));
        officialTitle.InitUI(viewPlayerData.RealmLV, viewPlayerData.TitleID);
@@ -105,7 +144,7 @@
    private void DisplayHorseModel(OtherPlayerDetailManager.ViewPlayerData viewPlayerData)
    {
        int HorseSkinID = viewPlayerData.EquipShowSwitch % 1000;
        int horseSkinID = HorseManager.Instance.GetOtherPlayerHorseSkinID(viewPlayerData.EquipShowSwitch);
        int modelMark = viewPlayerData.ModelMark;
        // 如果 ModelMark 为 0,获取默认的 ModelMark
@@ -124,7 +163,15 @@
        var modelConfig = ModelConfig.Get(modelMark);
        int heroSkinID = modelConfig.SkinID;
        horseModel.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID(HorseSkinID), heroSkinID, 1);
        horseModel.Create(horseSkinID, heroSkinID, 1);
        OtherPlayerDetailManager.RolePlusData.HorseData horseData = manager.GetHorseData(viewPlayerData.PlayerID);
        imgHorseBG.SetActive(horseData != null);
        if (horseData != null)
        {
            txtHorseLV.text = Language.Get("Horse8", horseData == null ? 0 : horseData.ClassLV, horseData == null ? 0 : horseData.LV);
            horseController.Create(horseSkinID, 0, 0.6f);
        }
    }
    private void DisplayCard(List<OtherPlayerDetailManager.RolePlusData.HeroData> heros)
@@ -198,8 +245,32 @@
        {
            return;
        }
        UIManager.Instance.OpenWindow<GuildPreviewWin>(viewPlayerData.FamilyID);
        GuildManager.Instance.SendFindGuildNoDecrypt(viewPlayerData.FamilyID.ToString());
    }
    private void OnClickMM()
    {
        if (viewPlayerData == null)
        {
            return;
        }
        int playerID = viewPlayerData.PlayerID;
        OtherPlayerDetailManager.RolePlusData.BeautyData beautyData = manager.GetBeautyData(playerID);
        AttributeManager.Instance.OpenTotalAttributeWin(beautyData == null || beautyData.AttrDict == null ? new Dictionary<int, long>() : beautyData.AttrDict);
    }
    private void OnClickHorse()
    {
        if (viewPlayerData == null)
        {
            return;
        }
        int playerID = viewPlayerData.PlayerID;
        OtherPlayerDetailManager.RolePlusData.HorseData horseData = manager.GetHorseData(playerID);
        if (horseData == null)
        {
            return;
        }
        AttributeManager.Instance.OpenTotalAttributeWin(horseData.AttrDict == null ? new Dictionary<int, long>() : horseData.AttrDict);
    }
}
Main/System/PlayerProfile/PlayerProfileWin.cs
@@ -29,7 +29,12 @@
        btnSetting.SetListener(() => { UIManager.Instance.OpenWindow<SystemSetWin>(); });
        btnAnnouncement.SetListener(() => { GameNotice.OpenGameNoticeForce(); });
        btnSwitchServer.SetListener(() => { GameNetSystem.Instance.LoginOut(); });
        btnRedemptionCode.SetListener(() => { UIManager.Instance.OpenWindow<ExchangeCodeWin>(); });
        btnRedemptionCode.SetListener(() =>
        {
            if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mail, true))
                return;
            UIManager.Instance.OpenWindow<ExchangeCodeWin>();
        });
        btnCopy.SetListener(() =>
        {
            UIHelper.CopyToClipboard(PlayerDatas.Instance.baseData.PlayerID.ToString());
Main/System/Team/TeamHero.Properties.cs
@@ -11,5 +11,6 @@
    //  最大血量
    public long maxHp;
    //  战力
    public long fightPower;
}
Main/System/Team/TeamHero.cs
@@ -85,6 +85,7 @@
        curHp = (long)fightObj.HPEx * (long)Constants.ExpPointValue + (long)fightObj.HP;
        maxHp = (long)fightObj.MaxHPEx * (long)Constants.ExpPointValue + (long)fightObj.MaxHP;
        fightPower = (long)fightObj.FightPowerEx * (long)Constants.ExpPointValue + (long)fightObj.FightPower;
        rage = (int)fightObj.AngreXP;
        positionNum = fightObj.PosNum - 1;