lcy
2026-01-06 7dc59be24d527d92a28c2e6227c178f8b96ab6e0
282 查看他人-客户端 支持显示红颜和坐骑
2个文件已修改
184 ■■■■ 已修改文件
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
@@ -337,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
@@ -370,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
@@ -405,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);
@@ -441,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"))
                {
@@ -493,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;
                                    }
                                }
@@ -538,6 +588,7 @@
                        }
                    }
                }
            }
            catch (Exception e)
            {
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
@@ -20,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;
@@ -34,6 +38,8 @@
        btnReport.SetListener(OnClickReport);
        btnCopy.SetListener(OnClickCopy);
        btnGuild.SetListener(OnClickGuild);
        btnMM.SetListener(OnClickMM);
        btnHorse.SetListener(OnClickHorse);
    }
    protected override void OnPreOpen()
@@ -76,11 +82,14 @@
            return;
        }
        DisplayMM();
        DisplayPlayerInfo(viewPlayerData);
        DisplayGuildInfo(viewPlayerData);
        int playerID = viewPlayerData.PlayerID;
        DisplayMM(playerID);
        var heroList = manager.GetHeroDataSortList(playerID, teamType);
        if (heroList.IsNullOrEmpty())
        {
@@ -103,11 +112,11 @@
        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))
@@ -135,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
@@ -154,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)
@@ -231,5 +248,29 @@
        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);
    }
}