lcy
2026-01-05 9c3fb79c2a6433d53cc872758942dbc02253dd06
282 查看他人-客户端
2 文件已重命名
21个文件已修改
11个文件已添加
1个文件已删除
1874 ■■■■ 已修改文件
Main/System/Arena/ArenaBattleFailWin.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleVictoryWin.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaChallengeCell.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerRankCell.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaPlayerTop3Cell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaRecordCell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Battle/ArenaBattleWin.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerRankCell.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/BillboardRank/PlayerTop3Cell.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Chat/ChatPlayerMineCell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Chat/ChatPlayerOtherCell.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildManager.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildMemberCell.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Guild/GuildPreviewWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/MainWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherEquipCardItem.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherEquipCardItem.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherEquipTipWin.cs 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherEquipTipWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs 386 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs 541 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs.meta 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/PhantasmPavilion/AvatarCell.cs 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/PhantasmPavilion/AvatarHelper.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/PlayerProfile/PlayerProfileWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/RoleParticulars/OtherPlayerDetailManager.cs 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/TianziBillborad/TianziBillboradPlayerTop3Cell.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/EnumHelper.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Arena/ArenaBattleFailWin.cs
@@ -71,6 +71,11 @@
                                                PlayerDatas.Instance.baseData.face,
                                                PlayerDatas.Instance.baseData.facePic));
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
        enemyAvatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
        });
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
        txtMyScore.text = Language.Get("Arena17", atkAddScore);
Main/System/Arena/ArenaBattleVictoryWin.cs
@@ -16,7 +16,7 @@
    [SerializeField] ButtonEx detailBtn;
    JsonData jsonData;
    string battleName = BattleConst.ArenaBattleField;
    protected override void InitComponent()
    {
        detailBtn.SetListener(() =>
@@ -65,6 +65,11 @@
                                                PlayerDatas.Instance.baseData.face,
                                                PlayerDatas.Instance.baseData.facePic));
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
        enemyAvatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
        });
        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
        txtMyScore.text = Language.Get("Arena17", atkAddScore);
Main/System/Arena/ArenaChallengeCell.cs
@@ -33,6 +33,11 @@
        arenaMatchInfo = list[index];
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaMatchInfo.PlayerID, (int)arenaMatchInfo.Face, (int)arenaMatchInfo.FacePic));
        avatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)arenaMatchInfo.PlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
        });
        txtName.text = UIHelper.ServerStringTrim(arenaMatchInfo.PlayerName);
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaMatchInfo.FightPower);
        txtAddScore.text = Language.Get("Arena16", ArenaManager.Instance.GetChallengePoints(index));
Main/System/Arena/ArenaPlayerRankCell.cs
@@ -15,6 +15,7 @@
    public void Display(int rankType, int rank, string valueFormat)
    {
        RankData rankData = null;
        int viewPlayerId = (int)PlayerDatas.Instance.baseData.PlayerID;
        if (rank != 0)
        {
            rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
@@ -45,10 +46,15 @@
        }
        else
        {
            viewPlayerId = (int)rankData.id;
            officialTitleCell.SetActive(true);
            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
            avatarCell.SetActive(true);
            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
            avatarCell.SetListener(() =>
            {
                AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
            });
            nameText.text = rankData.name1;
            rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue));
        }
@@ -58,7 +64,7 @@
        {
            queryPlayerBtn.AddListener(() =>
            {
                AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
            });
        }
    }
Main/System/Arena/ArenaPlayerTop3Cell.cs
@@ -25,6 +25,10 @@
        nameText.text = rankData.name1;
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, 1);
        queryPlayerBtn.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
        });
    }
Main/System/Arena/ArenaRecordCell.cs
@@ -65,6 +65,10 @@
        }
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)arenaGameRec.Value3, (int)arenaGameRec.Value5, (int)arenaGameRec.Value6));
        avatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)arenaGameRec.Value3, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
        });
        txtName.text = arenaGameRec.Name;
        txtFightPoint.text = UIHelper.ReplaceLargeArtNum(arenaGameRec.FightPower);
        officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
Main/System/Battle/ArenaBattleWin.cs
@@ -188,7 +188,10 @@
        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
        txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(info.FightPower);
        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic));
        enemyAvatarCell.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)info.PlayerID, viewPlayerLineupType: (int)ViewPlayerLineupType.ArenaDef);
        });
        var team = GetTeamHeroList(enemyTeam);
        enemyCountry.RefreshOnTeamCountry(team, true);
Main/System/BillboardRank/PlayerRankCell.cs
@@ -13,12 +13,13 @@
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    // rank 为0 代表玩家自己
    public void Display(int rankType, int rank)
    {
        RankData rankData = null;
        int viewPlayerId = (int)PlayerDatas.Instance.baseData.PlayerID;
        if (rank != 0)
        {
            rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
@@ -53,12 +54,19 @@
            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
            avatarCell.SetActive(true);
            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
            viewPlayerId = (int)rankData.id;
            nameText.text = rankData.name1;
            rankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue); ;
        }
        rankText.text = rank.ToString();
        if (queryPlayerBtn != null)
        {
            queryPlayerBtn.AddListener(() =>
            {
                AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId);
            });
        }
    }
}
Main/System/BillboardRank/PlayerTop3Cell.cs
@@ -11,6 +11,7 @@
    [SerializeField] Text rankValueText;    //排名比较内容
    [SerializeField] Text nameText;
    [SerializeField] OfficialTitleCell officialTitleCell;
    [SerializeField] Button queryPlayerBtn; //后续添加点击查看玩家详情
    [SerializeField] HorseController model;
    public void Display(int rankType, int rank)
@@ -29,6 +30,10 @@
        nameText.text = rankData.name1;
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, rank == 1 ? 1f : 0.8f);
        queryPlayerBtn.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id);
        });
    }
Main/System/Chat/ChatPlayerMineCell.cs
@@ -23,10 +23,6 @@
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
                                                PlayerDatas.Instance.baseData.face,
                                                PlayerDatas.Instance.baseData.facePic));
        avatarCell.button.SetListener(() =>
        {
        });
        title.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
        if (manager.nowChatTab == ChatTab.World)
Main/System/Chat/ChatPlayerOtherCell.cs
@@ -22,10 +22,7 @@
        TalkData data = hasNewPlayerInfo ? newPlayerInfo : nowData;
        avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)data.PlayerID, (int)data.Face, (int)data.FacePic, data.Job));
        avatarCell.button.SetListener(() =>
        {
        });
        title.InitUI(data.RealmLV, (int)data.TitleID);
        int bubbleID = ChatBubbleHelper.GetOtherChatBubbleID(data.Job, (int)data.BubbleBox);
        m_ChatBubble.DisplayBubble(bubbleID, (int)data.PlayerID);
Main/System/Guild/GuildManager.cs
@@ -68,12 +68,12 @@
    void OnPlayerLoginOk()
    {
        UpdateDonateRedPoint();
    }
    void PlayerDataRefreshEvent(PlayerDataType type)
    {
        if(type == PlayerDataType.default33)
        if (type == PlayerDataType.default33)
        {
            UpdateDonateRedPoint();
        }
@@ -93,7 +93,7 @@
        familyZBGActions.Clear();
        sortPlayerCut.Clear();
    }
    //退出公会
    public void AfterQuitGuild()
    {
@@ -107,7 +107,7 @@
        // zhenbaogeCutState = 0;
        // familyZBGActions.Clear();
        // sortPlayerCut.Clear();
        UpdateZBGRedpoint();
        UpdateDonateRedPoint();
        EnterOrQuitGuildEvent?.Invoke(false);
@@ -154,7 +154,7 @@
    public int renameFairyNameMoneyType;
    //珍宝阁(行商)
    public int zhenbaogeCutState = 0;
@@ -163,7 +163,7 @@
    public event Action UpdateZhenbaogeEvent;
    public bool isQueryZBGYet = false;
    public float lastZBGStartTime = 0; //过天刷新用
    //{id:数据} 砍价行为,value1为玩家ID,特殊约定为1时为家族的数据
    public Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction> familyZBGActions = new Dictionary<int, HA513_tagMCFamilyActionInfo.tagMCFamilyAction>();
    public List<int> sortPlayerCut = new List<int>();
@@ -567,6 +567,21 @@
        GameNetSystem.Instance.SendInfo(pack);
    }
    public void SendFindGuildNoDecrypt(string msg, int pageIndex = 0, int pageSize = 20)
    {
        if (pageIndex == 0)
        {
            //默认查询第一页即代表重新开始查询,清空之前的数据
            guildsDict.Clear();
            pageIndexList.Clear();
        }
        var pack = new CA620_tagCMViewFamilyPage();
        pack.Msg = msg;
        pack.MsgLen = (byte)msg.Length;
        pack.PageIndex = (byte)pageIndex;
        pack.ShowCount = (byte)pageSize;
        GameNetSystem.Instance.SendInfo(pack);
    }
    public static void SetFairyViewData(FairyData data, HA523_tagMCFamilyViewList.tagMCFamilyView view)
    {
@@ -804,7 +819,7 @@
    #endregion
    #region 珍宝阁
    public void UpdateZhenbaogeInfo(HA512_tagMCFamilyZhenbaogeInfo netPack)
    {
@@ -913,7 +928,7 @@
    }
    public Dictionary <int, FairyMember> tmpNoCutMembers = new Dictionary<int, FairyMember>();
    public Dictionary<int, FairyMember> tmpNoCutMembers = new Dictionary<int, FairyMember>();
    //未议价成员
    public void CalcNoCutMembers()
@@ -925,7 +940,7 @@
            return;
        }
        foreach(var playerID in fairy.memberIDList)
        foreach (var playerID in fairy.memberIDList)
        {
            if (!familyZBGActions.ContainsKey(playerID))
            {
@@ -938,7 +953,7 @@
    #region 红点
    Redpoint donateRedpoint = new Redpoint(MainRedDot.guildHallRedpointID, MainRedDot.donateRedpointID);
    //珍宝阁(行商)
    Redpoint zbgRedpoint = new Redpoint(MainRedDot.MainGuildRedpoint, MainRedDot.hawkerRedpointID);
@@ -972,7 +987,7 @@
            }
        }
    }
    public void UpdateZBGRedpoint()
    {
        zbgRedpoint.state = RedPointState.None;
Main/System/Guild/GuildMemberCell.cs
@@ -47,7 +47,7 @@
        fightPowerText.text = UIHelper.ReplaceLargeArtNum(playerInfo.FightPower);
        avatarCell.button.AddListener(() =>
        avatarCell.AddListener(() =>
        {
            OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerID);
        });
Main/System/Guild/GuildPreviewWin.cs
@@ -45,7 +45,7 @@
            SysNotifyMgr.Instance.ShowTip("GuildSys8");
        });
        leaderAvatar.button.AddListener(() =>
        leaderAvatar.AddListener(() =>
        {
            OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID);
        });
Main/System/Main/MainWin.cs
@@ -40,7 +40,7 @@
    {
        base.InitComponent();
        avatarCell.redpoint.redpointId = MainRedDot.PhantasmPavilionRepoint;
        avatarCell.button.SetListener(() =>
        avatarCell.SetListener(() =>
        {
            UIManager.Instance.OpenWindow<PlayerProfileWin>();
        });
Main/System/OtherPlayerDetail.meta
File was renamed from Main/System/RoleParticulars.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 7f4be2a6d73bb8c40b77b85620ca4026
guid: 776fe4907b83bde4eb75533ee79ae268
folderAsset: yes
DefaultImporter:
  externalObjects: {}
Main/System/OtherPlayerDetail/OtherEquipCardItem.cs
New file
@@ -0,0 +1,60 @@
using UnityEngine;
using UnityEngine.UI;
public class OtherEquipCardItem : MonoBehaviour
{
    [SerializeField] Button btnClick;
    [SerializeField] Image imgQuality; //装备的底图,不同品质颜色
    [SerializeField] Image imgNull; //空装备的部位图标
    [SerializeField] Image imgIcon;   //装备图标
    [SerializeField] UIEffectPlayer uiEffect;
    [SerializeField] Text txtLv;
    OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } }
    public void Display(OtherPlayerDetailManager.RolePlusData.EquipData equip)
    {
        if (equip == null || !ItemConfig.HasKey(equip.ItemID))
        {
            imgQuality.SetSprite("equipQuality0");
            imgNull.SetActive(true);
            imgIcon.SetActive(false);
            uiEffect.Stop();
            txtLv.text = string.Empty;
            return;
        }
        ItemConfig config = ItemConfig.Get(equip.ItemID);
        imgNull.SetActive(false);
        imgIcon.SetActive(true);
        imgQuality.SetSprite("equipQuality" + config.ItemColor);
        imgIcon.SetOrgSprite(config.IconKey);
        txtLv.text = Language.Get("L1113", manager.GetEquipLV(equip));
        if (config.ItemColor >= 7)
        {
            uiEffect.effectId = 1026;
            uiEffect.PlayByArrIndex(config.ItemColor - 7, true, true);
        }
        else
        {
            uiEffect.Stop();
        }
        // //特效参考尺寸106*150 同比例缩放
        var rect = this.transform.GetComponent<RectTransform>();
        uiEffect.transform.localScale = new Vector3(rect.sizeDelta.x / 106f, rect.sizeDelta.y / 150f, 1);
        btnClick.SetListener(() =>
        {
            manager.equip = equip;
            if (!UIManager.Instance.IsOpened<OtherEquipTipWin>())
            {
                UIManager.Instance.OpenWindow<OtherEquipTipWin>();
            }
        });
    }
}
Main/System/OtherPlayerDetail/OtherEquipCardItem.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fc508978e84be984fafbe320e2dd0f8d
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/OtherPlayerDetail/OtherEquipTipWin.cs
New file
@@ -0,0 +1,141 @@
using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
//装备TIP界面
public class OtherEquipTipWin : UIBase
{
    [SerializeField] Image equipImage;
    [SerializeField] Text itemName;
    [SerializeField] OutlineEx itemNameOutline;
    [SerializeField] Text qualityName;
    [SerializeField] OutlineEx qualityNameOutline;
    [SerializeField] Text placeName;
    [SerializeField] Text lvText;
    [SerializeField] Image bgFlower;    //背景花纹变色
    [SerializeField] List<Text> baseAttrNames;
    [SerializeField] List<Text> baseAttrValues;
    [SerializeField] GameObject fightAttrGameObj;
    [SerializeField] List<GameObject> fightAttrLine;
    [SerializeField] List<Text> fightAttrNames;
    [SerializeField] List<Text> fightAttrValues;
    [SerializeField] UIEffectPlayer uieffect;
    [SerializeField] RectTransform bgRect;
    int equipID;
    ItemConfig itemConfig;
    OtherPlayerDetailManager.RolePlusData.EquipData equip;
    OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } }
    protected override void OnPreOpen()
    {
        equip = manager.equip;
        if (equip == null)
        {
            DelayCloseWindow().Forget();
            return;
        }
        equipID = equip.ItemID;
        if (!ItemConfig.HasKey(equipID))
        {
            DelayCloseWindow().Forget();
            return;
        }
        itemConfig = ItemConfig.Get(equipID);
        Display(itemConfig);
    }
    protected override void OnOpen()
    {
        //先缩小,这样不会因为间隔帧产生明显的闪烁
        uieffect.transform.localScale = Vector3.zero;
        //特效显示依赖rect的排版,放在下一帧
        RefreshEffect(itemConfig.ItemColor).Forget();
    }
    protected override void OnPreClose()
    {
    }
    public void Display(ItemConfig config)
    {
        equipImage.SetOrgSprite(config.IconKey);
        itemName.text = UIHelper.AppendColor(config.ItemColor, config.ItemName, true, 1);
        itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(config.ItemColor);
        qualityName.text = UIHelper.GetQualityNameWithColor(config.ItemColor, Language.Get("L1039"));
        qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(config.ItemColor);
        placeName.text = EquipModel.Instance.GetEquipPlaceName(config.EquipPlace);
        lvText.text = Language.Get("EquipExchangeWin7", manager.GetEquipLV(equip));
        bgFlower.color = UIHelper.GetUIColor(config.ItemColor);
        var baseAttrs = manager.GetEquipBaseAttrs(equip);
        var baseValues = manager.GetEquipBaseValues(equip);
        var fightAttrs = manager.GetEquipFightAttrs(equip);
        var fightValues = manager.GetEquipFightValues(equip);
        for (var i = 0; i < baseAttrNames.Count; i++)
        {
            if (i >= baseAttrs.Count)
            {
                baseAttrNames[i].text = "";
                baseAttrValues[i].text = "";
            }
            else
            {
                baseAttrNames[i].text = PlayerPropertyConfig.Get(baseAttrs[i]).Name;
                baseAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(baseAttrs[i], baseValues[i]);
            }
        }
        if (fightAttrs.IsNullOrEmpty())
        {
            fightAttrGameObj.SetActive(false);
        }
        else
        {
            fightAttrGameObj.SetActive(true);
            for (var i = 0; i < fightAttrNames.Count; i++)
            {
                if (i >= fightAttrs.Count)
                {
                    fightAttrNames[i].SetActive(false);
                }
                else
                {
                    fightAttrNames[i].SetActive(true);
                    fightAttrNames[i].text = PlayerPropertyConfig.Get(fightAttrs[i]).Name;
                    fightAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(fightAttrs[i], fightValues[i]);
                }
            }
        }
    }
    //延迟处理特效大小
    async UniTask RefreshEffect(int itemColor)
    {
        await UniTask.DelayFrame(3);
        int effectID = EquipModel.Instance.equipUIEffects[Math.Min(itemColor, EquipModel.Instance.equipUIEffects.Length) - 1];
        if (effectID == 0)
        {
            uieffect.Stop();
        }
        else
        {
            uieffect.effectId = effectID;
            //计算高度缩放比例 特效显示依赖rect的排版
            uieffect.transform.localScale = new Vector3(0.98f, bgRect.rect.height / uieffect.GetComponent<RectTransform>().rect.height, 1);
            uieffect.Play();
        }
    }
}
Main/System/OtherPlayerDetail/OtherEquipTipWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b22e83cf6038bb54c9b27407690ace89
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
New file
@@ -0,0 +1,386 @@
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
public class OtherHeroDetailWin : UIBase
{
    [SerializeField] SkillBaseCell normalSkillCell;
    [SerializeField] SkillBaseCell angerSkillCell;
    [SerializeField] HeroShowBaseCell heroShow;
    [SerializeField] ButtonEx btnTotalAttr;
    [SerializeField] TextEx[] attrs;
    [SerializeField] GiftBaseCell[] giftBaseCells;    //天赋
    [SerializeField] ScrollRect allAttrScroll;      //培养属性 滚动区
    [SerializeField] GameObject fetterGo;
    [SerializeField] Text[] fetterText;   //羁绊
    [SerializeField] Text[] fetterNameText;   //羁绊
    [SerializeField] GameObject potential;
    [SerializeField] GameObject potentialCell; //潜能和觉醒用于创建
    [SerializeField] Transform potentialCellParent; //潜能父节点
    [SerializeField] Transform awakeCellParent; //潜能父节点
    [SerializeField] GameObject awakeGo;
    OtherPlayerDetailManager.RolePlusData.HeroData heroData;
    List<OtherPlayerDetailManager.RolePlusData.HeroData> heroDatas;
    Dictionary<int, long> attrDict;
    OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } }
    protected override void InitComponent()
    {
        awakeCellList = new List<GameObject>();
        potentialCellList = new List<GameObject>();
        btnTotalAttr.SetListener(() => { AttributeManager.Instance.OpenTotalAttributeWin(attrDict); });
    }
    protected override void OnPreOpen()
    {
        // 重置所有滚动区到顶部
        if (allAttrScroll != null)
        {
            allAttrScroll.verticalNormalizedPosition = 1f;
        }
        heroData = manager.heroData;
        heroDatas = manager.heroDatas;
        attrDict = heroData.AttrDict;
        Display();
    }
    protected override void OnPreClose()
    {
    }
    private void Display()
    {
        if (heroDatas.IsNullOrEmpty() || heroData == null)
        {
            return;
        }
        int heroID = heroData.HeroID;
        if (!HeroConfig.HasKey(heroID))
        {
            return;
        }
        HeroConfig heroConfig = HeroConfig.Get(heroID);
        int skinID = heroData.SkinID;
        int lv = heroData.LV;
        int star = heroData.Star;
        int quality = heroConfig.Quality;
        int breakLevel = manager.GetBreakLevel(heroData);
        int awakeLevel = manager.GetAwakeLevel(heroData);
        int atkSkillID = heroConfig.AtkSkillID;
        int angerSkillID = heroConfig.AngerSkillID;
        List<int> talentIDList = manager.GetTalentIDList(heroData);
        List<int> talentLvList = manager.GetTalentLvList(heroData);
        int[] FetterIDList = heroConfig.FetterIDList;
        DisplaySkill(heroID, atkSkillID, angerSkillID);
        DisplayHeroShow(heroID, skinID, breakLevel, star, awakeLevel, lv);
        DisplayAttr(heroData);
        DisplayGiftBaseCell(heroID, awakeLevel, talentIDList, talentLvList);
        DisplayFetter(heroDatas, FetterIDList);
        DisplayPotential(heroID, breakLevel);
        RefreshAwake(heroID, quality, awakeLevel);
        ForceRefreshLayout();
    }
    List<GameObject> awakeCellList;   //觉醒
    void RefreshAwake(int heroID, int quality, int awakeLevel)
    {
        if (!HeroAwakeConfig.CanAwake(heroID, 1))
        {
            awakeGo.SetActive(false);
            return;
        }
        awakeGo.SetActive(true);
        var maxLV = HeroAwakeConfig.GetMaxAwakeLV(heroID);
        var starCnt = HeroQualityConfig.Get(quality).InitStarUpper;
        for (int i = 1; i <= maxLV; i++)
        {
            if (i > awakeCellList.Count)
            {
                awakeCellList.Add(Instantiate(potentialCell, awakeCellParent));
            }
            var go = awakeCellList[i - 1];
            var descText = go.GetComponent<Text>();
            var nameText = go.GetComponent<Text>("skillname");
            go.SetActive(true);
            var config = HeroAwakeConfig.GetHeroAwakeConfig(heroID, i);
            int type = config.UnlockTalentSlot != 0 ? 1 : config.SkillID != 0 ? 2 : 3;
            var awakeStr = string.Empty;
            if (type == 1)
            {
                starCnt += config.AddStarUpper;
                awakeStr = Language.Get("HeroAwake8", config.UnlockTalentSlot, starCnt);
            }
            else if (type == 2)
            {
                var skill = SkillConfig.Get(config.SkillID);
                if (skill != null)
                {
                    awakeStr = Language.Get("L1039", skill.SkillName) + skill.Description;
                }
                else
                {
                    Debug.LogError($"heroId:{heroID} 觉醒技能ID:{config.SkillID} 配置错误技能不存在");
                }
            }
            else
            {
                for (int k = 0; k < config.AttrIDList.Length; k++)
                {
                    awakeStr += (string.IsNullOrEmpty(config.SkillIName) ? string.Empty : Language.Get("L1039", config.SkillIName)) +
                    PlayerPropertyConfig.GetFullDescription(config.AttrIDList[k], config.AttrValueList[k], "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}"))
                    + (k == config.AttrIDList.Length - 1 ? "" : "\n");
                }
            }
            if (i - 1 < awakeLevel)
            {
                nameText.text = Language.Get("herocard12", i) + Language.Get("L1096");
                descText.text = awakeStr;
            }
            else
            {
                //置灰
                nameText.text = UIHelper.AppendColor(TextColType.NavyGray, Language.Get("herocard12", i) + Language.Get("L1096"));
                descText.text = UIHelper.AppendColor(TextColType.NavyGray, UIHelper.RemoveColor(awakeStr));
            }
        }
    }
    List<GameObject> potentialCellList;   //潜能
    void DisplayPotential(int heroID, int breakLevel)
    {
        if (!HeroBreakConfig.configDics.ContainsKey(heroID))
            return;
        var list = HeroBreakConfig.configDics[heroID].Keys.ToList();
        list.Sort();
        for (int i = 0; i < list.Count; i++)
        {
            var nextQualityBreakConfig = HeroBreakConfig.GetHeroBreakConfig(heroID, i + 1);
            if (nextQualityBreakConfig == null)
                break;
            List<string> attrStrArr = new List<string>();
            for (int j = 0; j < nextQualityBreakConfig.AttrIDList.Length; j++)
            {
                if (nextQualityBreakConfig.AttrIDList[j] == 0)
                    continue;
                string format = i < breakLevel ? "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}") : "{0}+{1}";
                attrStrArr.Add((string.IsNullOrEmpty(nextQualityBreakConfig.SkillIName) ? string.Empty : Language.Get("L1039", nextQualityBreakConfig.SkillIName)) +
                PlayerPropertyConfig.GetFullDescription(nextQualityBreakConfig.AttrIDList[j], nextQualityBreakConfig.AttrValueList[j], format));
            }
            if (nextQualityBreakConfig.SkillID != 0)
            {
                var skill = SkillConfig.Get(nextQualityBreakConfig.SkillID);
                if (skill != null)
                {
                    attrStrArr.Add(Language.Get("L1039", skill.SkillName) + skill.Description);
                }
                else
                {
                    Debug.LogError("未配置技能" + nextQualityBreakConfig.SkillID);
                }
            }
            if (i >= potentialCellList.Count)
            {
                potentialCellList.Add(Instantiate(potentialCell, potentialCellParent));
            }
            var go = potentialCellList[i];
            var descText = go.GetComponent<Text>();
            var nameText = go.GetComponent<Text>("skillname");
            go.SetActive(true);
            if (i < breakLevel)
            {
                nameText.text = Language.Get("herocard63", i + 1);
                descText.text = string.Join("\n", attrStrArr);
            }
            else
            {
                //置灰
                nameText.text = UIHelper.AppendColor(TextColType.NavyGray, Language.Get("herocard63", i + 1));
                descText.text = UIHelper.AppendColor(TextColType.NavyGray, UIHelper.RemoveColor(string.Join("\n", attrStrArr)));
            }
        }
    }
    private void DisplayAttr(OtherPlayerDetailManager.RolePlusData.HeroData heroData)
    {
        if (heroData == null || heroData.AttrDict == null)
        {
            return;
        }
        var attrDict = heroData.AttrDict;
        var baseAttrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.baseType];
        var fightAttrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.fightType];
        var totalAttrIDList = baseAttrIDList.Concat(fightAttrIDList).ToList();
        for (int i = 0; i < attrs.Length; i++)
        {
            if (i < totalAttrIDList.Count)
            {
                attrs[i].SetActive(true);
                int attrId = totalAttrIDList[i];
                long attrValue = attrDict.ContainsKey(attrId) ? attrDict[attrId] : 0;
                attrs[i].text = PlayerPropertyConfig.GetFullDescription(attrId, attrValue);
            }
            else
            {
                attrs[i].SetActive(false);
            }
        }
    }
    private bool HasFetterHero(List<OtherPlayerDetailManager.RolePlusData.HeroData> heroDatas, int heroID)
    {
        if (heroDatas.IsNullOrEmpty())
        {
            return false;
        }
        for (int i = 0; i < heroDatas.Count; i++)
        {
            if (heroDatas[i].HeroID == heroID)
            {
                return true;
            }
        }
        return false;
    }
    private void DisplayFetter(List<OtherPlayerDetailManager.RolePlusData.HeroData> heroDatas, int[] FetterIDList)
    {
        if (FetterIDList.IsNullOrEmpty() || heroDatas.IsNullOrEmpty())
        {
            fetterGo.SetActive(false);
            return;
        }
        for (int i = 0; i < fetterText.Length; i++)
        {
            if (i < FetterIDList.Length)
            {
                fetterText[i].SetActive(true);
                var fetterID = FetterIDList[i];
                HeroFetterConfig fetterConfig = HeroFetterConfig.Get(fetterID);
                List<string> heroNames = new List<string>();
                bool isAllCollect = true; //是否全收集
                foreach (var tmpHeroID in fetterConfig.HeroIDList)
                {
                    heroNames.Add(HeroConfig.Get(tmpHeroID).Name);
                    bool hasFetterHero = HasFetterHero(heroDatas, tmpHeroID);
                    if (!hasFetterHero)
                    {
                        isAllCollect = false;
                    }
                }
                fetterGo.SetActive(isAllCollect);
                var attrStr = string.Join(Language.Get("SplitString1"), heroNames) + Language.Get("herocard38");
                for (int j = 0; j < fetterConfig.AttrIDList.Length; j++)
                {
                    string format = !isAllCollect ? "{0}+{1}" : "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}");
                    attrStr += Language.Get("L1112") + PlayerPropertyConfig.GetFullDescription(fetterConfig.AttrIDList[j], fetterConfig.AttrValueList[j], format);
                }
                fetterText[i].text = attrStr;
                fetterText[i].color = UIHelper.GetUIColor(isAllCollect ? TextColType.NavyBrown : TextColType.NavyGray);
                fetterNameText[i].text = fetterConfig.FetterName;
                fetterNameText[i].color = UIHelper.GetUIColor(isAllCollect ? TextColType.NavyBrown : TextColType.NavyGray);
            }
            else
            {
                fetterText[i].SetActive(false);
            }
        }
    }
    private void DisplayGiftBaseCell(int heroID, int awakeLevel, List<int> talentIDList, List<int> talentLvList)
    {
        if (talentIDList == null || talentLvList == null)
        {
            return;
        }
        int showCount = HeroUIManager.Instance.GetGiftGirdMaxCount(heroID);
        for (int i = 0; i < giftBaseCells.Length; i++)
        {
            if (i >= showCount)
            {
                giftBaseCells[i].SetActive(false);
                continue;
            }
            giftBaseCells[i].SetActive(true);
            if (i < talentIDList.Count)
            {
                int giftID = talentIDList[i];
                int giftLV = talentLvList[i];
                int state = 0; //0:不显示 1:新增 2:提升
                giftBaseCells[i].Init(giftID, giftLV, state, heroID, i, awakeLevel);
            }
            else
            {
                //非对比的显示
                if (i < HeroUIManager.Instance.normalGiftMaxCnt)
                {
                    giftBaseCells[i].Init(0, 0);
                }
                else
                {
                    giftBaseCells[i].Init(-1, 0, 0, heroID, i);
                }
            }
        }
    }
    private void DisplayHeroShow(int heroID, int skinID, int breakLevel, int star, int awakeLevel, int lv)
    {
        heroShow.Init(heroID, skinID, breakLevel, star, awakeLevel, lv);
    }
    private void DisplaySkill(int heroID, int atkSkillID, int angerSkillID)
    {
        normalSkillCell.Init(atkSkillID, () =>
        {
            UIManager.Instance.OpenWindow<HeroSkillWin>(heroID);
        }, true);
        angerSkillCell.Init(angerSkillID, () =>
        {
            UIManager.Instance.OpenWindow<HeroSkillWin>(heroID);
        }, true);
    }
    /// <summary>
    /// 强制刷新Layout,解决嵌套Layout和ContentSizeFitter的重叠问题
    /// </summary>
    async UniTask ForceRefreshLayout()
    {
        await UniTask.DelayFrame(2);
        // 刷新所有Layout组件
        var layouts = allAttrScroll.GetComponentsInChildren<LayoutGroup>(true);
        foreach (var layout in layouts)
        {
            LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
        }
        await UniTask.DelayFrame(2);
        // 刷新所有Layout组件
        foreach (var layout in layouts)
        {
            LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
        }
    }
}
Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f7e36dee1de95fc478795e453dcde29a
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs
New file
@@ -0,0 +1,96 @@
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
public class OtherHeroFightingCardItem : MonoBehaviour
{
    [SerializeField] Button btnClick;
    [SerializeField] Image imgQuality;
    [SerializeField] Image imgHero;
    [SerializeField] Text txtLv;
    [SerializeField] Image imgCountry;
    [SerializeField] Transform rectStar;
    [SerializeField] List<Image> imgStars;
    OtherPlayerDetailManager.RolePlusData.HeroData heroData;
    List<OtherPlayerDetailManager.RolePlusData.HeroData> heros;
    OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } }
    public void Display(int index, List<OtherPlayerDetailManager.RolePlusData.HeroData> heros)
    {
        this.heros = heros;
        if (heros.IsNullOrEmpty() || index < 0 || index >= heros.Count)
        {
            return;
        }
        heroData = heros[index];
        var heroID = heroData.HeroID;
        if (!HeroConfig.HasKey(heroID))
        {
            return;
        }
        var heroConfig = HeroConfig.Get(heroID);
        imgQuality.SetSprite("herocBG" + heroConfig.Quality);
        imgCountry.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
        txtLv.text = heroData.LV == 0 ? "" : Language.Get("L1094") + heroData.LV;
        DisplayHero(heroData);
        DisplayStars(heroData);
        btnClick.SetListener(ClickHero);
    }
    void DisplayHero(OtherPlayerDetailManager.RolePlusData.HeroData heroData)
    {
        var sprite = UILoader.LoadSprite("HeroHead", HeroSkinConfig.Get(heroData.SkinID).RectangleIcon);
        if (sprite == null)
        {
            // 内网未配置时
            imgHero.SetSprite("herohead_big_default");
        }
        else
        {
            imgHero.overrideSprite = sprite;
        }
    }
    void DisplayStars(OtherPlayerDetailManager.RolePlusData.HeroData heroData)
    {
        var star = heroData.Star;
        if (star == 0)
        {
            rectStar.SetActive(false);
        }
        else
        {
            rectStar.SetActive(true);
            for (int i = 0; i < imgStars.Count; i++)
            {
                if ((star - 1) % imgStars.Count >= i)
                {
                    imgStars[i].SetActive(true);
                    imgStars[i].SetSprite("herostar" + (((star - 1) / imgStars.Count) + 1) * imgStars.Count);
                }
                else
                {
                    imgStars[i].SetActive(false);
                }
            }
        }
    }
    void ClickHero()
    {
        if (heroData == null)
        {
            return;
        }
        manager.heroData = heroData;
        manager.heroDatas = heros;
        if (!UIManager.Instance.IsOpened<OtherHeroDetailWin>())
        {
            UIManager.Instance.OpenWindow<OtherHeroDetailWin>();
        }
    }
}
Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9d90695eaf6736e418297ded40202c00
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
New file
@@ -0,0 +1,541 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.Linq;
//查看其他玩家的简短信息, 该模块处理数据,其他由各自功能模块处理 通过OnRevPackage
public class OtherPlayerDetailManager : GameSystemManager<OtherPlayerDetailManager>
{
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
    }
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
    }
    public void OnBeforePlayerDataInitializeEventOnRelogin()
    {
        viewPlayerType = -1;
        viewPlayerLineupType = -1;
    }
    public int viewPlayer { get; private set; }
    // 查询类型:根据类型做不同处理
    // 按功能自定义枚举值 EnumHelper的 ViewPlayerType
    public int viewPlayerType { get; private set; }
    public int viewPlayerLineupType { get; private set; }
    public RolePlusData.HeroData heroData;
    public List<RolePlusData.HeroData> heroDatas;
    public RolePlusData.EquipData equip;
    private Dictionary<int, ViewPlayerData> viewPlayerDataDic = new Dictionary<int, ViewPlayerData>();
    // 查看类型,玩家ID
    public event Action<int, int> OnRevPackage; //尽量不要用第一个参数viewtype做判断,容易出错
    // 获取其他玩家本地缓存数据
    public ViewPlayerData GetViewPlayerData(int player)
    {
        ViewPlayerData viewPlayerData = null;
        viewPlayerDataDic.TryGetValue(player, out viewPlayerData);
        return viewPlayerData;
    }
    // 向服务端请求其他玩家数据
    public void ViewPlayerDetail(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData, int viewPlayerLineupType = (int)ViewPlayerLineupType.Story)
    {
        if (_playerId == PlayerDatas.Instance.baseData.PlayerID)
        {
            return;
        }
        viewPlayerType = viewType;
        this.viewPlayerLineupType = viewPlayerLineupType;
        ViewRoleParticulars(_playerId);
    }
    // 向服务端请求玩家数据
    void ViewRoleParticulars(int playerID)
    {
        if (playerID == 0)
        {
            return;
        }
        viewPlayer = playerID;
        if (viewPlayerDataDic.ContainsKey(playerID))
        {
            ViewPlayerData viewPlayerData = viewPlayerDataDic[playerID];
            if ((DateTime.Now - viewPlayerData.getTime).TotalSeconds < 30)
            {
                ShowRoleParticulars(playerID);
                return;
            }
        }
        //CC002_tagCGViewCrossPlayerInfo c002 = new CC002_tagCGViewCrossPlayerInfo();
        CA212_tagCMViewPlayerInfo pak = new CA212_tagCMViewPlayerInfo();
        pak.PlayerID = (uint)playerID;
        GameNetSystem.Instance.SendInfo(pak);
    }
    //本服竞技场假查询模拟封包,返回查看机器人数据 打开RoleParticularsWin界面,专用接口其他地方不要调用
    public void ViewFairyArenaRobot(int playerID, ViewPlayerData _viewPlayerData)
    {
        ViewPlayerData viewPlayerData = null;
        viewPlayer = playerID;
        if (!viewPlayerDataDic.TryGetValue(playerID, out viewPlayerData))
        {
            viewPlayerDataDic.Add(playerID, _viewPlayerData);
        }
        else
        {
            viewPlayerDataDic[playerID] = _viewPlayerData;
        }
        viewPlayerType = (int)ViewPlayerType.viewPlayerData;
        ShowRoleParticulars(playerID);
    }
    public void OnRevRoleEquip(HA705_tagSCQueryPlayerCacheResult package)
    {
        ViewPlayerData viewPlayerData = null;
        if (!viewPlayerDataDic.TryGetValue((int)package.PlayerID, out viewPlayerData))
        {
            viewPlayerData = new ViewPlayerData();
            viewPlayerData.getTime = DateTime.Now;
            viewPlayerDataDic.Add((int)package.PlayerID, viewPlayerData);
        }
        viewPlayerData.getTime = DateTime.Now;
        viewPlayerData.PlayerID = (int)package.PlayerID;
        viewPlayerData.PlayerName = UIHelper.ServerStringTrim(package.PlayerName);
        viewPlayerData.LV = package.LV;
        viewPlayerData.Job = package.Job;
        viewPlayerData.RealmLV = package.RealmLV;
        viewPlayerData.Face = (int)package.Face;
        viewPlayerData.FacePic = (int)package.FacePic;
        viewPlayerData.ModelMark = (int)package.ModelMark;
        viewPlayerData.EquipShowSwitch = (int)package.EquipShowSwitch;
        viewPlayerData.TitleID = (int)package.TitleID;
        viewPlayerData.ServerID = (int)package.ServerID;
        viewPlayerData.FightPower = package.FightPower + package.FightPowerEx * (long)Constants.ExpPointValue;
        viewPlayerData.FamilyID = (int)package.FamilyID;
        viewPlayerData.FamilyName = UIHelper.ServerStringTrim(package.FamilyName);
        viewPlayerData.FamilyEmblemID = (int)package.FamilyEmblemID;
        viewPlayerData.FamilyEmblemWord = UIHelper.ServerStringTrim(package.FamilyEmblemWord);
        if (viewPlayerData.rolePlusData == null)
        {
            //第一次初始化
            viewPlayerData.rolePlusData = new RolePlusData();
        }
        if (package.PlusDataSize != 0)
        {
            viewPlayerData.rolePlusData.AnalysisRolePlusData(package.PlusData);
        }
        ShowRoleParticulars((int)package.PlayerID);
    }
    //尽量不要用第一个参数viewtype做判断,容易出错,比如同时发送两个不同的viewPlayerType请求的时候
    private void ShowRoleParticulars(int playerID)
    {
        if (viewPlayerType == (int)ViewPlayerType.viewPlayerData)
        {
            if (!UIManager.Instance.IsOpened<OtherPlayerDetailWin>())
            {
                UIManager.Instance.OpenWindow<OtherPlayerDetailWin>(viewPlayerLineupType);
            }
        }
        OnRevPackage?.Invoke(viewPlayerType, playerID);
        viewPlayerType = -1;
        viewPlayerLineupType = -1;
    }
    #region 获取PlusData中的数据
    public Dictionary<int, RolePlusData.HeroData> GetHeroDataDict(int playerID, int lineupType)
    {
        ViewPlayerData viewPlayerData = GetViewPlayerData(playerID);
        if (viewPlayerData?.rolePlusData?.LineupDic?.TryGetValue(lineupType, out var lineupData) != true)
        {
            return null;
        }
        return lineupData?.HeroDic;
    }
    public List<RolePlusData.HeroData> GetHeroDataSortList(int playerID, int lineupType)
    {
        var heroDataDict = GetHeroDataDict(playerID, lineupType);
        if (heroDataDict == null)
        {
            return null;
        }
        var res = new List<RolePlusData.HeroData>();
        List<int> keyList = heroDataDict.Keys.ToList();
        keyList.Sort();
        foreach (var num in keyList)
        {
            if (!heroDataDict.ContainsKey(num))
            {
                continue;
            }
            res.Add(heroDataDict[num]);
        }
        return res;
    }
    public Dictionary<int, RolePlusData.EquipData> GetEquipDataDict(int playerID)
    {
        ViewPlayerData viewPlayerData = GetViewPlayerData(playerID);
        return viewPlayerData?.rolePlusData?.EquipDic;
    }
    public int GetUseDataFirstValue(RolePlusData.EquipData equip, int key)
    {
        if (equip.UserData != null && equip.UserData.ContainsKey(key) && equip.UserData[key].Count > 0)
        {
            return equip.UserData[key][0];
        }
        return 0;
    }
    public int GetUseDataFirstValue(RolePlusData.HeroData hero, int key)
    {
        if (hero.Data != null && hero.Data.ContainsKey(key) && hero.Data[key].Count > 0)
        {
            return hero.Data[key][0];
        }
        return 0;
    }
    public int GetEquipLV(RolePlusData.EquipData equip)
    {
        if (equip == null)
        {
            return 0;
        }
        return GetUseDataFirstValue(equip, 22);
    }
    public List<int> GetUseData(RolePlusData.EquipData equip, int key)
    {
        List<int> list = null;
        if (equip.UserData != null)
        {
            equip.UserData.TryGetValue(key, out list);
        }
        return list == null ? new List<int>() : list;
    }
    public List<int> GetUseData(RolePlusData.HeroData hero, int key)
    {
        List<int> list = null;
        if (hero.Data != null)
        {
            hero.Data.TryGetValue(key, out list);
        }
        return list == null ? new List<int>() : list;
    }
    //基础属性ID列表
    public List<int> GetEquipBaseAttrs(RolePlusData.EquipData equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return GetUseData(equip, 21);
    }
    //基础属性值列表
    public List<int> GetEquipBaseValues(RolePlusData.EquipData equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return GetUseData(equip, 23);
    }
    //战斗属性ID列表
    public List<int> GetEquipFightAttrs(RolePlusData.EquipData equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return GetUseData(equip, 17);
    }
    //战斗属性值列表
    public List<int> GetEquipFightValues(RolePlusData.EquipData equip)
    {
        if (equip == null)
        {
            return new List<int>();
        }
        return GetUseData(equip, 19);
    }
    //  武将突破等级
    public int GetBreakLevel(RolePlusData.HeroData hero)
    {
        if (hero == null)
            return 0;
        return GetUseDataFirstValue(hero, 74);
    }
    //  武将觉醒等级
    public int GetAwakeLevel(RolePlusData.HeroData hero)
    {
        if (hero == null)
            return 0;
        return GetUseDataFirstValue(hero, 76);
    }
    // 71 # 英雄天赋ID列表
    public List<int> GetTalentIDList(RolePlusData.HeroData hero)
    {
        if (hero == null)
            return new List<int>();
        return GetUseData(hero, 71);
    }
    // 73 # 英雄天赋ID等级列表,对应71天赋ID的等级
    public List<int> GetTalentLvList(RolePlusData.HeroData hero)
    {
        if (hero == null)
            return new List<int>();
        return GetUseData(hero, 73);
    }
    #endregion
    #region 解析PlusData
    public class ViewPlayerData
    {
        public int PlayerID;
        public string PlayerName;
        public int LV;
        public int Job;
        public int RealmLV;
        public int Face;
        public int FacePic;
        public int ModelMark;          // 变形模型mark
        public int EquipShowSwitch;    // 其他外观信息
        public int TitleID;
        public int ServerID;
        public long FightPower;
        public int FamilyID;
        public string FamilyName;
        public int FamilyEmblemID;
        public string FamilyEmblemWord;
        public RolePlusData rolePlusData;
        public DateTime getTime;
    }
    public class RolePlusData
    {
        // --- 定义存储数据的结构 ---
        // 装备字典 <位置索引, 装备数据>
        public Dictionary<int, EquipData> EquipDic = new Dictionary<int, EquipData>();
        // 阵容字典 <阵容ID, 阵容数据>
        public Dictionary<int, LineupData> LineupDic = new Dictionary<int, LineupData>();
        // 装备数据类
        public class EquipData
        {
            public int ItemID;
            public Dictionary<int, List<int>> UserData = new Dictionary<int, List<int>>();
        }
        // 阵容数据类
        public class LineupData
        {
            public int PlayerID;
            public long FightPower;
            public int ShapeType;
            // 英雄字典 <站位, 英雄数据>
            public Dictionary<int, HeroData> HeroDic = new Dictionary<int, HeroData>();
        }
        // 英雄数据类
        public class HeroData
        {
            public int HeroID;
            public int SkinID;
            public int LV;
            public int Star;
            public long FightPower;
            public List<int> SkillIDList = new List<int>();
            // 属性字典 <属性ID, 属性值>
            public Dictionary<int, long> AttrDict = new Dictionary<int, long>();
            // 英雄专属UserData (格式与物品UserData相同)
            // 使用 Dictionary<int, List<int>> 结构,key为ItemUseDataKey枚举值
            public Dictionary<int, List<int>> Data = new Dictionary<int, List<int>>();
        }
        // --- 解析逻辑 ---
        public void AnalysisRolePlusData(string jsonStr)
        {
            try
            {
                if (string.IsNullOrEmpty(jsonStr)) return;
                // 清除旧数据,防止重用对象时数据堆叠
                EquipDic.Clear();
                LineupDic.Clear();
                // 1. 转为 JsonData 对象
                JsonData jd = JsonMapper.ToObject(jsonStr);
                // 2. 解析装备 (Equip)
                if (jd.Keys.Contains("Equip"))
                {
                    JsonData equipJd = jd["Equip"];
                    foreach (string key in equipJd.Keys)
                    {
                        if (int.TryParse(key, out int posIndex))
                        {
                            JsonData itemJd = equipJd[key];
                            EquipData equipData = new EquipData();
                            if (itemJd.Keys.Contains("ItemID"))
                                equipData.ItemID = (int)itemJd["ItemID"];
                            if (itemJd.Keys.Contains("UserData") && !string.IsNullOrEmpty((string)itemJd["UserData"]))
                                equipData.UserData = ConfigParse.Analysis((string)itemJd["UserData"]);
                            EquipDic[posIndex] = equipData;
                        }
                    }
                }
                // 3. 解析阵容 (Lineup)
                if (jd.Keys.Contains("Lineup"))
                {
                    JsonData lineupJd = jd["Lineup"];
                    foreach (string key in lineupJd.Keys)
                    {
                        if (int.TryParse(key, out int lineupId))
                        {
                            JsonData oneLineupJd = lineupJd[key];
                            LineupData lineupData = new LineupData();
                            if (oneLineupJd.Keys.Contains("PlayerID"))
                                lineupData.PlayerID = (int)oneLineupJd["PlayerID"];
                            if (oneLineupJd.Keys.Contains("FightPower"))
                                lineupData.FightPower = long.Parse(oneLineupJd["FightPower"].ToString());
                            if (oneLineupJd.Keys.Contains("ShapeType"))
                                lineupData.ShapeType = (int)oneLineupJd["ShapeType"];
                            // 解析阵容下的英雄 (Hero)
                            if (oneLineupJd.Keys.Contains("Hero"))
                            {
                                JsonData heroRootJd = oneLineupJd["Hero"];
                                foreach (string heroKey in heroRootJd.Keys)
                                {
                                    if (int.TryParse(heroKey, out int heroPos))
                                    {
                                        JsonData heroJd = heroRootJd[heroKey];
                                        HeroData heroData = new HeroData();
                                        if (heroJd.Keys.Contains("HeroID")) heroData.HeroID = (int)heroJd["HeroID"];
                                        if (heroJd.Keys.Contains("SkinID")) heroData.SkinID = (int)heroJd["SkinID"];
                                        if (heroJd.Keys.Contains("LV")) heroData.LV = (int)heroJd["LV"];
                                        if (heroJd.Keys.Contains("Star")) heroData.Star = (int)heroJd["Star"];
                                        if (heroJd.Keys.Contains("FightPower")) heroData.FightPower = long.Parse(heroJd["FightPower"].ToString());
                                        // 解析Data字段(武将物品UserData)
                                        if (heroJd.Keys.Contains("Data") && !string.IsNullOrEmpty((string)heroJd["Data"]))
                                        {
                                            heroData.Data = ConfigParse.Analysis((string)heroJd["Data"]);
                                        }
                                        // 解析技能列表 List<int>
                                        if (heroJd.Keys.Contains("SkillIDList"))
                                        {
                                            JsonData skills = heroJd["SkillIDList"];
                                            for (int i = 0; i < skills.Count; i++)
                                            {
                                                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;
                                                }
                                            }
                                        }
                                        lineupData.HeroDic[heroPos] = heroData;
                                    }
                                }
                            }
                            LineupDic[lineupId] = lineupData;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Debug.LogError("AnalysisRolePlusData Error: " + e.Message + "\nJSON: " + jsonStr);
            }
        }
    }
    #endregion
}
Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs.meta
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
New file
@@ -0,0 +1,205 @@
using System.Collections.Generic;
using UnityEngine;
public class OtherPlayerDetailWin : UIBase
{
    [SerializeField] AvatarCell avatarCell;
    [SerializeField] OfficialTitleCell officialTitle;
    [SerializeField] HorseController horseModel;
    [SerializeField] TextEx txtPlayerName;
    [SerializeField] TextEx txtPlayerId;
    [SerializeField] TextEx txtServerName;
    [SerializeField] TextEx txtLV;
    [SerializeField] TextEx txtFightPower;
    [SerializeField] ButtonEx btnCopy;
    [SerializeField] ButtonEx btnGuild;
    [SerializeField] GuildEmblemCell guildEmblem;
    [SerializeField] TextEx txtGuildName;
    [SerializeField] OtherHeroFightingCardItem[] heroFightingCards;
    [SerializeField] OtherEquipCardItem[] equipCards;
    [SerializeField] ButtonEx btnMM;
    [SerializeField] TextEx txtMMCnt;
    [SerializeField] ButtonEx btnBlock;
    [SerializeField] ButtonEx btnReport;
    [SerializeField] ButtonEx btnAddFriend;
    [SerializeField] ButtonEx btnPrivateChat;
    OtherPlayerDetailManager.ViewPlayerData viewPlayerData;
    OtherPlayerDetailManager manager { get { return OtherPlayerDetailManager.Instance; } }
    int viewPlayerLineupType = -1;
    protected override void InitComponent()
    {
        btnReport.SetListener(OnClickReport);
        btnCopy.SetListener(OnClickCopy);
        btnGuild.SetListener(OnClickGuild);
    }
    protected override void OnPreOpen()
    {
        viewPlayerLineupType = functionOrder;
        Display();
    }
    protected override void OnPreClose()
    {
    }
    private void Display()
    {
        viewPlayerData = manager.GetViewPlayerData(manager.viewPlayer);
        if (viewPlayerData == null)
        {
            Debug.LogError($"OtherPlayerDetailWin Display 未找到玩家ID{manager.viewPlayer}的数据");
            CloseWindow();
            return;
        }
        DisplayMM();
        DisplayPlayerInfo(viewPlayerData);
        DisplayGuildInfo(viewPlayerData);
        int playerID = viewPlayerData.PlayerID;
        var heroList = manager.GetHeroDataSortList(playerID, viewPlayerLineupType);
        if (heroList.IsNullOrEmpty())
        {
            heroList = manager.GetHeroDataSortList(playerID, (int)ViewPlayerLineupType.Story);
        }
        DisplayCard(heroList);
        var equipDict = manager.GetEquipDataDict(playerID);
        DisplayEquip(equipDict);
    }
    private void DisplayMM()
    {
        txtMMCnt.text = Language.Get("OtherPlayerDetail08", 0);
    }
    private void DisplayGuildInfo(OtherPlayerDetailManager.ViewPlayerData viewPlayerData)
    {
        if (viewPlayerData.FamilyEmblemID <= 0 || string.IsNullOrEmpty(viewPlayerData.FamilyEmblemWord))
        {
            btnGuild.SetActive(false);
            return;
        }
        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)
    {
        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);
        DisplayHorseModel(viewPlayerData);
    }
    private void DisplayHorseModel(OtherPlayerDetailManager.ViewPlayerData viewPlayerData)
    {
        int HorseSkinID = viewPlayerData.EquipShowSwitch % 1000;
        int modelMark = viewPlayerData.ModelMark;
        // 如果 ModelMark 为 0,获取默认的 ModelMark
        if (modelMark == 0)
        {
            PhantasmPavilionManager.Instance.TryGetDefaultID(PhantasmPavilionType.Model, viewPlayerData.Job, out modelMark);
        }
        if (!ModelConfig.HasKey(modelMark))
        {
            horseModel.SetActive(false);
            return;
        }
        horseModel.SetActive(true);
        var modelConfig = ModelConfig.Get(modelMark);
        int heroSkinID = modelConfig.SkinID;
        horseModel.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID(HorseSkinID), heroSkinID, 1);
    }
    private void DisplayCard(List<OtherPlayerDetailManager.RolePlusData.HeroData> heros)
    {
        if (heros.IsNullOrEmpty())
        {
            return;
        }
        //显示卡牌
        for (int i = 0; i < heroFightingCards.Length; i++)
        {
            if (i < heros.Count)
            {
                heroFightingCards[i].Display(i, heros);
                heroFightingCards[i].SetActive(true);
            }
            else
            {
                heroFightingCards[i].SetActive(false);
            }
        }
    }
    private void DisplayEquip(Dictionary<int, OtherPlayerDetailManager.RolePlusData.EquipData> equips)
    {
        if (equips.IsNullOrEmpty())
        {
            return;
        }
        for (int i = 0; i < equipCards.Length; i++)
        {
            equipCards[i].Display(equips.TryGetValue(i, out var equipData) ? equipData : null);
        }
    }
    private void OnClickReport()
    {
        ConfirmCancel.ShowPopConfirm(
                        Language.Get("L1003"),
                        Language.Get("OtherPlayerDetail06", "山寨名字"),
                        (bool isOK) =>
                        {
                            if (isOK)
                            {
                            }
                        });
    }
    private void OnClickCopy()
    {
        if (viewPlayerData == null)
        {
            return;
        }
        UIHelper.CopyToClipboard(viewPlayerData.PlayerID.ToString());
        SysNotifyMgr.Instance.ShowTip("CopySuccess");
    }
    private void OnClickGuild()
    {
        if (viewPlayerData == null)
        {
            return;
        }
        //自己的公会
        if (PlayerDatas.Instance.fairyData.HasFairy && PlayerDatas.Instance.fairyData.fairy.FamilyID == viewPlayerData.FamilyID)
        {
            return;
        }
        UIManager.Instance.OpenWindow<GuildPreviewWin>(viewPlayerData.FamilyID);
    }
}
Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 684d231e50deab144b92606e0f6373fa
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/PhantasmPavilion/AvatarCell.cs
@@ -1,5 +1,6 @@
using System;
using UnityEngine;
using UnityEngine.Events;
//头像模块
public class AvatarCell : MonoBehaviour
@@ -144,7 +145,7 @@
            return m_redpoint;
        }
    }
    public ViewPlayerLineupType lineupEnum = ViewPlayerLineupType.Story;
    GameObject prefab;
    AvatarModel avatarModel;
    PhantasmPavilionManager manager { get { return PhantasmPavilionManager.Instance; } }
@@ -221,7 +222,36 @@
        faceBGImage.SetNativeSize();
        faceImage.SetNativeSize();
        facePicImage.SetNativeSize();
        BindButtonClick(model);
    }
    // 添加标志位:是否已设置自定义监听器
    private bool hasCustomListener = false;
    public void SetListener(UnityAction action)
    {
        hasCustomListener = true;  // 标记已设置自定义监听
        button.SetListener(action);
    }
    public void AddListener(UnityAction action)
    {
        hasCustomListener = true;  // 标记已设置自定义监听
        button.SetListener(action);
    }
    private void BindButtonClick(AvatarModel model)
    {
        // 如果已经设置了自定义监听器,不覆盖
        if (hasCustomListener)
            return;
        button.SetListener(() =>
        {
            if (avatarModel == null)
            {
                return;
            }
            AvatarHelper.TryViewOtherPlayerInfo(avatarModel.playerID, (int)ViewPlayerType.viewPlayerData, (int)lineupEnum);
        });
    }
}
public class AvatarModel
@@ -229,15 +259,11 @@
    public int playerID { get; private set; }
    public int faceID { get; private set; }
    public int facePicID { get; private set; }
    public int redpointID { get; private set; }
    public Action clickAction { get; private set; }
    public AvatarModel(int playerID, int faceID, int facePicID, int redpointID = 0, Action clickAction = null)
    public AvatarModel(int playerID, int faceID, int facePicID)
    {
        this.playerID = playerID;
        this.faceID = faceID;
        this.facePicID = facePicID;
        this.redpointID = redpointID;
        this.clickAction = clickAction;
    }
}
Main/System/PhantasmPavilion/AvatarHelper.cs
@@ -1,5 +1,14 @@
using System;
public static class AvatarHelper
{
    public static void TryViewOtherPlayerInfo(int _playerId, int viewType = (int)ViewPlayerType.viewPlayerData, int viewPlayerLineupType = (int)ViewPlayerLineupType.Story)
    {
        if (_playerId == PlayerDatas.Instance.PlayerId || UIManager.Instance.IsOpened<OtherPlayerDetailWin>())
            return;
        OtherPlayerDetailManager.Instance.ViewPlayerDetail(_playerId, viewType, viewPlayerLineupType);
    }
    public static AvatarModel GetAvatarModel(int playerId, int face, int facePic, int job = 0)
    {
        bool isMyself = playerId == PlayerDatas.Instance.PlayerId;
Main/System/PlayerProfile/PlayerProfileWin.cs
@@ -47,7 +47,7 @@
            UIManager.Instance.OpenWindow<GameAgeWarnWin>();
        });
        avatarCell.redpoint.redpointId = MainRedDot.PhantasmPavilionRepoint;
        avatarCell.button.SetListener(() =>
        avatarCell.SetListener(() =>
        {
            UIManager.Instance.OpenWindow<PhantasmPavilionWin>();
        });
Main/System/RoleParticulars/OtherPlayerDetailManager.cs
File was deleted
Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs
@@ -20,6 +20,7 @@
    public void Display(int rankType, int rank, string valueFormat)
    {
        RankData rankData = null;
        int viewPlayerId = (int)PlayerDatas.Instance.baseData.PlayerID;
        if (rank != 0)
        {
            rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
@@ -54,6 +55,7 @@
            officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
            avatarCell.SetActive(true);
            avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
            viewPlayerId = (int)rankData.id;
            nameText.text = rankData.name1;
            rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue2 + rankData.cmpValue * Constants.ExpPointValue));
        }
@@ -63,7 +65,7 @@
        {
            queryPlayerBtn.AddListener(() =>
            {
                AvatarHelper.TryViewOtherPlayerInfo(viewPlayerId);
            });
        }
    }
Main/System/TianziBillborad/TianziBillboradPlayerTop3Cell.cs
@@ -32,6 +32,10 @@
        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
        model.SetActive(true);
        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, rank == 1 ? 1f : 0.8f);
        queryPlayerBtn.SetListener(() =>
        {
            AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id);
        });
    }
Main/Utility/EnumHelper.cs
@@ -1844,4 +1844,12 @@
    viewPlayerData = 0,  //查看玩家基本信息,公用打开界面
    viewGuildLeader = 1,  //查看玩家的公会族长信息
}
//查询其他玩家数据 展示的阵容
public enum ViewPlayerLineupType
{
    Story = 1,      //主线
    ArenaAtk = 2,   //竞技场进攻
    ArenaDef = 3,   //竞技场防守
}