From 9c3fb79c2a6433d53cc872758942dbc02253dd06 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期一, 05 一月 2026 10:58:49 +0800
Subject: [PATCH] 282 查看他人-客户端

---
 Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs    |    4 
 Main/System/Chat/ChatPlayerMineCell.cs                          |    4 
 Main/System/Arena/ArenaRecordCell.cs                            |    4 
 Main/System/Arena/ArenaChallengeCell.cs                         |    5 
 Main/System/Arena/ArenaPlayerRankCell.cs                        |    8 
 Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs.meta  |    0 
 Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs.meta |   11 
 Main/System/Arena/ArenaBattleFailWin.cs                         |    5 
 Main/System/OtherPlayerDetail/OtherEquipTipWin.cs.meta          |   11 
 Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs             |  386 ++++++++++++
 Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs           |  205 ++++++
 Main/System/BillboardRank/PlayerTop3Cell.cs                     |    5 
 Main/System/OtherPlayerDetail/OtherEquipTipWin.cs               |  141 ++++
 Main/System/OtherPlayerDetail/OtherEquipCardItem.cs.meta        |   11 
 Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs      |   96 +++
 Main/System/Guild/GuildMemberCell.cs                            |    2 
 Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs.meta      |   11 
 Main/System/PhantasmPavilion/AvatarCell.cs                      |   38 +
 Main/System/Arena/ArenaPlayerTop3Cell.cs                        |    4 
 Main/System/Guild/GuildManager.cs                               |   39 
 Main/System/PlayerProfile/PlayerProfileWin.cs                   |    2 
 Main/Utility/EnumHelper.cs                                      |    8 
 Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs.meta        |   11 
 Main/System/BillboardRank/PlayerRankCell.cs                     |   12 
 Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs       |  541 ++++++++++++++++
 Main/System/Arena/ArenaBattleVictoryWin.cs                      |    7 
 Main/System/TianziBillborad/TianziBillboradPlayerTop3Cell.cs    |    4 
 Main/System/OtherPlayerDetail/OtherEquipCardItem.cs             |   60 +
 Main/System/Chat/ChatPlayerOtherCell.cs                         |    5 
 Main/System/PhantasmPavilion/AvatarHelper.cs                    |    9 
 /dev/null                                                       |  214 ------
 Main/System/Guild/GuildPreviewWin.cs                            |    2 
 Main/System/Main/MainWin.cs                                     |    2 
 Main/System/OtherPlayerDetail.meta                              |    2 
 Main/System/Battle/ArenaBattleWin.cs                            |    5 
 35 files changed, 1,623 insertions(+), 251 deletions(-)

diff --git a/Main/System/Arena/ArenaBattleFailWin.cs b/Main/System/Arena/ArenaBattleFailWin.cs
index c728f54..ee83bc2 100644
--- a/Main/System/Arena/ArenaBattleFailWin.cs
+++ b/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);
diff --git a/Main/System/Arena/ArenaBattleVictoryWin.cs b/Main/System/Arena/ArenaBattleVictoryWin.cs
index 092b65c..43a97c1 100644
--- a/Main/System/Arena/ArenaBattleVictoryWin.cs
+++ b/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);
diff --git a/Main/System/Arena/ArenaChallengeCell.cs b/Main/System/Arena/ArenaChallengeCell.cs
index 2ec152f..89c7798 100644
--- a/Main/System/Arena/ArenaChallengeCell.cs
+++ b/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));
diff --git a/Main/System/Arena/ArenaPlayerRankCell.cs b/Main/System/Arena/ArenaPlayerRankCell.cs
index 917c711..f3d24dd 100644
--- a/Main/System/Arena/ArenaPlayerRankCell.cs
+++ b/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);
             });
         }
     }
diff --git a/Main/System/Arena/ArenaPlayerTop3Cell.cs b/Main/System/Arena/ArenaPlayerTop3Cell.cs
index 3351459..aeb9bfd 100644
--- a/Main/System/Arena/ArenaPlayerTop3Cell.cs
+++ b/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);
+        });
     }
 
 
diff --git a/Main/System/Arena/ArenaRecordCell.cs b/Main/System/Arena/ArenaRecordCell.cs
index e8ab917..bdc07e1 100644
--- a/Main/System/Arena/ArenaRecordCell.cs
+++ b/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);
diff --git a/Main/System/Battle/ArenaBattleWin.cs b/Main/System/Battle/ArenaBattleWin.cs
index 8cce6cd..d7e7d50 100644
--- a/Main/System/Battle/ArenaBattleWin.cs
+++ b/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);
 
diff --git a/Main/System/BillboardRank/PlayerRankCell.cs b/Main/System/BillboardRank/PlayerRankCell.cs
index 7748a7e..ca9b32d 100644
--- a/Main/System/BillboardRank/PlayerRankCell.cs
+++ b/Main/System/BillboardRank/PlayerRankCell.cs
@@ -13,12 +13,13 @@
     [SerializeField] Text rankValueText;    //鎺掑悕姣旇緝鍐呭
     [SerializeField] Text nameText;
     [SerializeField] OfficialTitleCell officialTitleCell;
-
+    [SerializeField] Button queryPlayerBtn; //鍚庣画娣诲姞鐐瑰嚮鏌ョ湅鐜╁璇︽儏
 
     // rank 涓�0 浠h〃鐜╁鑷繁
     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);
+            });
+        }
     }
 }
 
diff --git a/Main/System/BillboardRank/PlayerTop3Cell.cs b/Main/System/BillboardRank/PlayerTop3Cell.cs
index b336ab7..90a1e91 100644
--- a/Main/System/BillboardRank/PlayerTop3Cell.cs
+++ b/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);
+        });
     }
 
 
diff --git a/Main/System/Chat/ChatPlayerMineCell.cs b/Main/System/Chat/ChatPlayerMineCell.cs
index a265049..1830577 100644
--- a/Main/System/Chat/ChatPlayerMineCell.cs
+++ b/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)
diff --git a/Main/System/Chat/ChatPlayerOtherCell.cs b/Main/System/Chat/ChatPlayerOtherCell.cs
index f609c1e..246a2ff 100644
--- a/Main/System/Chat/ChatPlayerOtherCell.cs
+++ b/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);
diff --git a/Main/System/Guild/GuildManager.cs b/Main/System/Guild/GuildManager.cs
index efcfcdb..3fd3be9 100644
--- a/Main/System/Guild/GuildManager.cs
+++ b/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:鏁版嵁} 鐮嶄环琛屼负锛寁alue1涓虹帺瀹禝D锛岀壒娈婄害瀹氫负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)
+        {
+            //榛樿鏌ヨ绗竴椤靛嵆浠h〃閲嶆柊寮�濮嬫煡璇紝娓呯┖涔嬪墠鐨勬暟鎹�
+            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;
diff --git a/Main/System/Guild/GuildMemberCell.cs b/Main/System/Guild/GuildMemberCell.cs
index b33b09d..51c59fb 100644
--- a/Main/System/Guild/GuildMemberCell.cs
+++ b/Main/System/Guild/GuildMemberCell.cs
@@ -47,7 +47,7 @@
 
         fightPowerText.text = UIHelper.ReplaceLargeArtNum(playerInfo.FightPower);
 
-        avatarCell.button.AddListener(() =>
+        avatarCell.AddListener(() =>
         {
             OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerID);
         });
diff --git a/Main/System/Guild/GuildPreviewWin.cs b/Main/System/Guild/GuildPreviewWin.cs
index aae9466..fc4166c 100644
--- a/Main/System/Guild/GuildPreviewWin.cs
+++ b/Main/System/Guild/GuildPreviewWin.cs
@@ -45,7 +45,7 @@
             SysNotifyMgr.Instance.ShowTip("GuildSys8");
         });
 
-        leaderAvatar.button.AddListener(() =>
+        leaderAvatar.AddListener(() =>
         {
             OtherPlayerDetailManager.Instance.ViewPlayerDetail(leaderID);
         });
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 5eb3a31..926d3a4 100644
--- a/Main/System/Main/MainWin.cs
+++ b/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>();
         });
diff --git a/Main/System/RoleParticulars.meta b/Main/System/OtherPlayerDetail.meta
similarity index 77%
rename from Main/System/RoleParticulars.meta
rename to Main/System/OtherPlayerDetail.meta
index f1b5a2b..3bbff60 100644
--- a/Main/System/RoleParticulars.meta
+++ b/Main/System/OtherPlayerDetail.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 7f4be2a6d73bb8c40b77b85620ca4026
+guid: 776fe4907b83bde4eb75533ee79ae268
 folderAsset: yes
 DefaultImporter:
   externalObjects: {}
diff --git a/Main/System/OtherPlayerDetail/OtherEquipCardItem.cs b/Main/System/OtherPlayerDetail/OtherEquipCardItem.cs
new file mode 100644
index 0000000..d054914
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherEquipCardItem.cs
@@ -0,0 +1,60 @@
+锘縰sing 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>();
+            }
+        });
+    }
+
+
+}
+
diff --git a/Main/System/OtherPlayerDetail/OtherEquipCardItem.cs.meta b/Main/System/OtherPlayerDetail/OtherEquipCardItem.cs.meta
new file mode 100644
index 0000000..eeb2bf8
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherEquipCardItem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: fc508978e84be984fafbe320e2dd0f8d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OtherPlayerDetail/OtherEquipTipWin.cs b/Main/System/OtherPlayerDetail/OtherEquipTipWin.cs
new file mode 100644
index 0000000..a10690e
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherEquipTipWin.cs
@@ -0,0 +1,141 @@
+锘縰sing 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();
+        }
+    }
+
+
+
+}
+
+
+
+
+
diff --git a/Main/System/OtherPlayerDetail/OtherEquipTipWin.cs.meta b/Main/System/OtherPlayerDetail/OtherEquipTipWin.cs.meta
new file mode 100644
index 0000000..27141d4
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherEquipTipWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b22e83cf6038bb54c9b27407690ace89
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
new file mode 100644
index 0000000..1431ce4
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs
@@ -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} 瑙夐啋鎶�鑳絀D:{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锛岃В鍐冲祵濂桳ayout鍜孋ontentSizeFitter鐨勯噸鍙犻棶棰�
+    /// </summary>
+    async UniTask ForceRefreshLayout()
+    {
+        await UniTask.DelayFrame(2);
+        // 鍒锋柊鎵�鏈塋ayout缁勪欢
+        var layouts = allAttrScroll.GetComponentsInChildren<LayoutGroup>(true);
+        foreach (var layout in layouts)
+        {
+            LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
+        }
+        await UniTask.DelayFrame(2);
+        // 鍒锋柊鎵�鏈塋ayout缁勪欢
+        foreach (var layout in layouts)
+        {
+            LayoutRebuilder.ForceRebuildLayoutImmediate(layout.GetComponent<RectTransform>());
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs.meta b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs.meta
new file mode 100644
index 0000000..dcb6ee4
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherHeroDetailWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f7e36dee1de95fc478795e453dcde29a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs b/Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs
new file mode 100644
index 0000000..5a89bc7
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs
@@ -0,0 +1,96 @@
+锘縰sing 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>();
+        }
+    }
+}
+
diff --git a/Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs.meta b/Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs.meta
new file mode 100644
index 0000000..9d4998f
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherHeroFightingCardItem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9d90695eaf6736e418297ded40202c00
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs b/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
new file mode 100644
index 0000000..f7c13d0
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs
@@ -0,0 +1,541 @@
+锘縰sing 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>();
+
+    // 鏌ョ湅绫诲瀷锛岀帺瀹禝D
+    public event Action<int, int> OnRevPackage; //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊
+
+    // 鑾峰彇鍏朵粬鐜╁鏈湴缂撳瓨鏁版嵁
+    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鐣岄潰锛屼笓鐢ㄦ帴鍙e叾浠栧湴鏂逛笉瑕佽皟鐢�
+    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);
+    }
+
+    //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊锛屾瘮濡傚悓鏃跺彂閫佷袱涓笉鍚岀殑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;
+    }
+
+    //鍩虹灞炴�D鍒楄〃
+    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);
+    }
+
+    //鎴樻枟灞炴�D鍒楄〃
+    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 瑙f瀽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>();
+            // 灞炴�у瓧鍏� <灞炴�D, 灞炴�у��>
+            public Dictionary<int, long> AttrDict = new Dictionary<int, long>();
+            // 鑻遍泟涓撳睘UserData (鏍煎紡涓庣墿鍝乁serData鐩稿悓)
+            // 浣跨敤 Dictionary<int, List<int>> 缁撴瀯锛宬ey涓篒temUseDataKey鏋氫妇鍊�
+            public Dictionary<int, List<int>> Data = new Dictionary<int, List<int>>();
+        }
+
+        // --- 瑙f瀽閫昏緫 ---
+
+        public void AnalysisRolePlusData(string jsonStr)
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(jsonStr)) return;
+
+                // 娓呴櫎鏃ф暟鎹紝闃叉閲嶇敤瀵硅薄鏃舵暟鎹爢鍙�
+                EquipDic.Clear();
+                LineupDic.Clear();
+
+                // 1. 杞负 JsonData 瀵硅薄
+                JsonData jd = JsonMapper.ToObject(jsonStr);
+
+                // 2. 瑙f瀽瑁呭 (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. 瑙f瀽闃靛 (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"];
+
+                            // 瑙f瀽闃靛涓嬬殑鑻遍泟 (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());
+                                        // 瑙f瀽Data瀛楁锛堟灏嗙墿鍝乁serData锛�
+                                        if (heroJd.Keys.Contains("Data") && !string.IsNullOrEmpty((string)heroJd["Data"]))
+                                        {
+                                            heroData.Data = ConfigParse.Analysis((string)heroJd["Data"]);
+                                        }
+
+                                        // 瑙f瀽鎶�鑳藉垪琛� 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
+
+
+}
+
diff --git a/Main/System/RoleParticulars/OtherPlayerDetailManager.cs.meta b/Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs.meta
similarity index 100%
rename from Main/System/RoleParticulars/OtherPlayerDetailManager.cs.meta
rename to Main/System/OtherPlayerDetail/OtherPlayerDetailManager.cs.meta
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
new file mode 100644
index 0000000..8225678
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs
@@ -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 鏈壘鍒扮帺瀹禝D{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);
+    }
+
+
+}
diff --git a/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs.meta b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs.meta
new file mode 100644
index 0000000..55a2498
--- /dev/null
+++ b/Main/System/OtherPlayerDetail/OtherPlayerDetailWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 684d231e50deab144b92606e0f6373fa
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/PhantasmPavilion/AvatarCell.cs b/Main/System/PhantasmPavilion/AvatarCell.cs
index dead145..851c3de 100644
--- a/Main/System/PhantasmPavilion/AvatarCell.cs
+++ b/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;
     }
 }
\ No newline at end of file
diff --git a/Main/System/PhantasmPavilion/AvatarHelper.cs b/Main/System/PhantasmPavilion/AvatarHelper.cs
index bd87f6d..f9a4cbf 100644
--- a/Main/System/PhantasmPavilion/AvatarHelper.cs
+++ b/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;
diff --git a/Main/System/PlayerProfile/PlayerProfileWin.cs b/Main/System/PlayerProfile/PlayerProfileWin.cs
index 01f71a1..45aa211 100644
--- a/Main/System/PlayerProfile/PlayerProfileWin.cs
+++ b/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>();
         });
diff --git a/Main/System/RoleParticulars/OtherPlayerDetailManager.cs b/Main/System/RoleParticulars/OtherPlayerDetailManager.cs
deleted file mode 100644
index 63bcb49..0000000
--- a/Main/System/RoleParticulars/OtherPlayerDetailManager.cs
+++ /dev/null
@@ -1,214 +0,0 @@
-锘縰sing System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using LitJson;
-using System.Linq;
-
-
-//鏌ョ湅鍏朵粬鐜╁鐨勭畝鐭俊鎭�, 璇ユā鍧楀鐞嗘暟鎹紝鍏朵粬鐢卞悇鑷姛鑳芥ā鍧楀鐞� 閫氳繃OnRevPackage
-public class OtherPlayerDetailManager : GameSystemManager<OtherPlayerDetailManager>
-{
-
-    public override void Init()
-    {
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
-    }
-
-    public override void Release()
-    {
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
-    }
-
-
-    public void OnBeforePlayerDataInitialize()
-    {
-        viewPlayerType = -1;
-    }
-
-    public int viewPlayer { get; private set; }
-
-    // 鏌ヨ绫诲瀷锛氭牴鎹被鍨嬪仛涓嶅悓澶勭悊
-    // 鎸夊姛鑳借嚜瀹氫箟鏋氫妇鍊� EnumHelper鐨� ViewPlayerType
-    public int viewPlayerType { get; private set; }
-
-    private Dictionary<int, ViewPlayerData> viewPlayerDataDic = new Dictionary<int, ViewPlayerData>();
-    
-    // 鏌ョ湅绫诲瀷锛岀帺瀹禝D
-    public event Action<int, int> OnRevPackage; //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊
-
-    // 鑾峰彇鍏朵粬鐜╁鏈湴缂撳瓨鏁版嵁
-    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)
-    {
-        if (_playerId == PlayerDatas.Instance.baseData.PlayerID)
-        {
-            return;
-        }
-        viewPlayerType = viewType;
-        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鐣岄潰锛屼笓鐢ㄦ帴鍙e叾浠栧湴鏂逛笉瑕佽皟鐢�
-    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.Name = 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.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 = package.FamilyName;
-        viewPlayerData.FamilyEmblemID = (int)package.FamilyEmblemID;
-
-
-        if (viewPlayerData.rolePlusData == null)
-        {
-            //绗竴娆″垵濮嬪寲
-            viewPlayerData.rolePlusData = new RolePlusData();
-        }
-        if (package.PlusDataSize != 0)
-        {
-            viewPlayerData.rolePlusData.AnalysisRolePlusData(package.PlusData);
-        }
-
-
-        ShowRoleParticulars((int)package.PlayerID);
-    }
-
-
-
-
-
-    //灏介噺涓嶈鐢ㄧ涓�涓弬鏁皏iewtype鍋氬垽鏂紝瀹规槗鍑洪敊锛屾瘮濡傚悓鏃跺彂閫佷袱涓笉鍚岀殑viewPlayerType璇锋眰鐨勬椂鍊�
-    private void ShowRoleParticulars(int playerID)
-    {
-        // if (viewPlayerType == (int)ViewPlayerType.viewPlayerData)
-        // {
-        //     if (!WindowCenter.Instance.IsOpen<RoleParticularsWin>())
-        //     {
-        //         RoleParticularsWin.viewType = viewPlayerType;
-        //         WindowCenter.Instance.Open<RoleParticularsWin>();
-        //     }
-        // }
-
-
-        
-        OnRevPackage?.Invoke(viewPlayerType, playerID);
-        viewPlayerType = -1;
-    }
-
-    public class ViewPlayerData
-    {
-        public int PlayerID;
-        public int LV;
-        public int RealmLV;
-        public string Name;
-        public string FamilyName;
-        public int Job;
-        public int FamilyID;
-        public long FightPower;
-        public int TitleID;
-        public int ServerID;
-        public int FamilyEmblemID;
-        public int Face;    //鑴稿瀷
-        public int FacePic;    //鑴稿瀷澶栨
-
-        public RolePlusData rolePlusData;
-
-        public DateTime getTime;
-
-
-    }
-
-
-
-
-    public class RolePlusData
-    {
-
-        public void AnalysisRolePlusData(string jsonStr)
-        {
-            try
-            {
-                
-                
-            }
-            catch (Exception e)
-            {
-                Debug.Log(e.StackTrace);
-            }
-        }
-
-    }
-
-}
-
diff --git a/Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs b/Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs
index 4e614d6..88fb295 100644
--- a/Main/System/TianziBillborad/TianziBillboradPlayerRankCell.cs
+++ b/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);
             });
         }
     }
diff --git a/Main/System/TianziBillborad/TianziBillboradPlayerTop3Cell.cs b/Main/System/TianziBillborad/TianziBillboradPlayerTop3Cell.cs
index 7bd702a..8fad005 100644
--- a/Main/System/TianziBillborad/TianziBillboradPlayerTop3Cell.cs
+++ b/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);
+        });
     }
 
 
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 8f36ad4..83ffe8b 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -1844,4 +1844,12 @@
     viewPlayerData = 0,  //鏌ョ湅鐜╁鍩烘湰淇℃伅锛屽叕鐢ㄦ墦寮�鐣岄潰
     viewGuildLeader = 1,  //鏌ョ湅鐜╁鐨勫叕浼氭棌闀夸俊鎭�
 
+}
+
+//鏌ヨ鍏朵粬鐜╁鏁版嵁 灞曠ず鐨勯樀瀹�
+public enum ViewPlayerLineupType
+{
+    Story = 1,      //涓荤嚎
+    ArenaAtk = 2,   //绔炴妧鍦鸿繘鏀�
+    ArenaDef = 3,   //绔炴妧鍦洪槻瀹�
 }
\ No newline at end of file

--
Gitblit v1.8.0