From a52a462c4f66ee379c79d8c55916feed58240c2a Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 28 一月 2026 17:13:21 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/ViewNPC/ViewNPCManager.cs |  172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 164 insertions(+), 8 deletions(-)

diff --git a/Main/System/ViewNPC/ViewNPCManager.cs b/Main/System/ViewNPC/ViewNPCManager.cs
index 8412697..f6a8b42 100644
--- a/Main/System/ViewNPC/ViewNPCManager.cs
+++ b/Main/System/ViewNPC/ViewNPCManager.cs
@@ -5,21 +5,145 @@
 
 public class ViewNPCManager : GameSystemManager<ViewNPCManager>
 {
+    // 缂撳瓨瀛楀吀缁撴瀯: MapID -> FuncLineID -> NPCID -> Attr
     public Dictionary<uint, Dictionary<uint, Dictionary<uint, ViewNPCAttr>>> dict = new Dictionary<uint, Dictionary<uint, Dictionary<uint, ViewNPCAttr>>>();
+    private BattleClickHeroData pendingData; // 鐢ㄤ簬璁板綍褰撳墠姝e湪璇锋眰鏌ョ湅鐨� NPC 淇℃伅锛屼互渚垮洖鍖呮椂鑷姩鎵撳紑鐣岄潰 ---
+    private bool isPendingOpen = false; // 鏄惁鏄偣鍑昏Е鍙戠殑璇锋眰锛堥渶瑕佽嚜鍔ㄦ墦寮�鐣岄潰锛�
+    OtherPlayerDetailManager otherPlayerManager { get { return OtherPlayerDetailManager.Instance; } }
     public override void Init()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
+        EventBroadcast.Instance.AddListener<BattleClickHeroData>(EventName.BATTLE_CLICK_HERO, OnBattleClickHero);
+        OtherPlayerDetailManager.Instance.OnRevPackage += OnRevPackage;
     }
 
     public override void Release()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
+        EventBroadcast.Instance.RemoveListener<BattleClickHeroData>(EventName.BATTLE_CLICK_HERO, OnBattleClickHero);
+        OtherPlayerDetailManager.Instance.OnRevPackage -= OnRevPackage;
     }
+
 
     private void OnBeforePlayerDataInitializeEventOnRelogin()
     {
         dict.Clear();
+        ResetPendingState();
     }
+
+    private void ResetPendingState()
+    {
+        isPendingOpen = false;
+        pendingData.isMySide = false;
+        pendingData.funcLineID = 0;
+        pendingData.mapID = 0;
+        pendingData.npcID = 0;
+        pendingData.teams = null;
+    }
+
+    private void OnBattleClickHero(BattleClickHeroData data)
+    {
+        pendingData = data;
+        // 涓荤嚎涓嶆樉绀篘PC淇℃伅
+        if (data.mapID == 1)
+            return;
+
+        // 鑷繁鐨勬暟鎹洿鎺ヨ鑳屽寘
+        if (data.isMySide)
+        {
+            OpenNPCDetailWin(pendingData, null);
+            return;
+        }
+
+        // pvp鐨勮蛋鏌ョ湅鐜╁鐨�
+        if (BattleManager.Instance.IsPvpBattle(data.battleName))
+        {
+            switch (data.battleName)
+            {
+                case BattleConst.ArenaBattleField:
+                    int playerId = (int)ArenaManager.Instance.atkPlayerId;
+                    OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerId, (int)ViewPlayerType.viewArenaBattleEnemyHero, (int)BattlePreSetType.Arena);
+                    break;
+            }
+            return;
+        }
+        // 闈瀙vp鐨勮蛋鏌ョ湅npc鐨�
+        // 灏濊瘯鐩存帴浠庣紦瀛樿幏鍙栨暟鎹�
+        if (TryGetNPCAttr((uint)data.mapID, (uint)data.funcLineID, (uint)data.npcID, out ViewNPCAttr attr))
+        {
+            OpenNPCDetailWin(pendingData, attr);
+        }
+        else
+        {
+            isPendingOpen = true;
+            SendViewNPCAttr(data);
+        }
+    }
+
+    private void OnRevPackage(int viewPlayerType, int playerID)
+    {
+        switch (viewPlayerType)
+        {
+            case (int)ViewPlayerType.viewArenaBattleEnemyHero:
+                ViewArenaBattleEnemyHero(playerID);
+                break;
+        }
+    }
+
+    private void ViewArenaBattleEnemyHero(int playerID)
+    {
+        int presetID = otherPlayerManager.GetFuncPresetID(playerID, OtherPlayerDetailManager.Instance.viewPreSetType, (int)FuncPresetType.Global);
+        var heroList = otherPlayerManager.GetHeroDataSortList(playerID, presetID);
+        if (heroList.IsNullOrEmpty())
+        {
+            heroList = otherPlayerManager.GetHeroDataSortList(playerID, FuncPresetManager.FuncDefaultPresetID);
+        }
+        var heroData = otherPlayerManager.GetHeroDataDict(playerID, presetID);
+        if (heroList.IsNullOrEmpty())
+        {
+            heroList = otherPlayerManager.GetHeroDataSortList(playerID, FuncPresetManager.FuncDefaultPresetID);
+        }
+        if (heroList == null || heroData == null)
+            return;
+        int posNum = pendingData.posNum + 1;
+        if (!heroData.ContainsKey(posNum))
+            return;
+        OtherPlayerDetailManager.Instance.viewHeroType = 0;
+        OtherPlayerDetailManager.Instance.clickHeroData = pendingData;
+        OtherPlayerDetailManager.Instance.heroData = heroData[posNum];
+        OtherPlayerDetailManager.Instance.heroDatas = heroList;
+
+        if (!UIManager.Instance.IsOpened<OtherHeroDetailWin>())
+        {
+            UIManager.Instance.OpenWindow<OtherHeroDetailWin>();
+        }
+    }
+
+
+    private void OpenNPCDetailWin(BattleClickHeroData data, ViewNPCAttr npcAttr)
+    {
+        OtherPlayerDetailManager.Instance.viewHeroType = 0;
+        OtherPlayerDetailManager.Instance.clickHeroData = data;
+        OtherPlayerDetailManager.Instance.viewNPCAttr = npcAttr;
+
+        if (data.isMySide)
+        {
+            if (!UIManager.Instance.IsOpened<OtherHeroDetailWin>())
+            {
+                UIManager.Instance.OpenWindow<OtherHeroDetailWin>();
+            }
+        }
+        else
+        {
+            if (!UIManager.Instance.IsOpened<OtherNPCDetailWin>())
+            {
+                UIManager.Instance.OpenWindow<OtherNPCDetailWin>();
+            }
+        }
+
+
+    }
+
     // --- 瑙f瀽灞炴�у瓧鍏� ---
     private Dictionary<int, long> ParseAttrDict(string jsonStr)
     {
@@ -34,18 +158,12 @@
                 if (int.TryParse(attrKey, out int attrId))
                 {
                     JsonData v = jd[attrKey];
-                    long val = 0;
-                    // 鍋ュ.鎬ф暟鍊艰浆鎹�
-                    if (v.IsLong) val = (long)v;
-                    else if (v.IsInt) val = (long)(int)v;
-                    else if (v.IsDouble) val = (long)(double)v;
-                    else if (v.IsString) long.TryParse(v.ToString(), out val);
-
+                    long.TryParse(v.ToString(), out long val);
                     result[attrId] = val;
                 }
             }
         }
-        catch (System.Exception e)
+        catch (Exception e)
         {
             Debug.LogWarning($"瑙f瀽NPC灞炴�SON澶辫触: {e.Message}");
         }
@@ -53,8 +171,10 @@
     }
 
     public event Action<uint, uint> OnUpdateViewNPCAttrRet;
+
     public void UpdateViewNPCAttrRet(HB432_tagSCViewNPCAttrRet vNetData)
     {
+        // 1. 鏇存柊瀛楀吀鏁版嵁
         if (!dict.ContainsKey(vNetData.MapID))
         {
             dict[vNetData.MapID] = new Dictionary<uint, Dictionary<uint, ViewNPCAttr>>();
@@ -102,8 +222,27 @@
                 };
             }
         }
+
+        // 妫�鏌ユ槸鍚﹂渶瑕佽嚜鍔ㄦ墦寮�鐣岄潰 (Pending 閫昏緫)
+        if (isPendingOpen)
+        {
+            // 妫�鏌ュ洖鍖呮槸鍚﹀搴斿綋鍓嶇殑璇锋眰 (MapID 鍜� FuncLineID 鍖归厤)
+            if (vNetData.MapID == pendingData.mapID && vNetData.FuncLineID == pendingData.funcLineID)
+            {
+                if (TryGetNPCAttr((uint)pendingData.mapID, (uint)pendingData.funcLineID, (uint)pendingData.npcID, out ViewNPCAttr targetAttr))
+                {
+                    OpenNPCDetailWin(pendingData, targetAttr);
+                }
+                // 澶勭悊瀹屾瘯锛岄噸缃姸鎬�
+                ResetPendingState();
+            }
+            return;
+        }
+
         OnUpdateViewNPCAttrRet?.Invoke(vNetData.MapID, vNetData.FuncLineID);
+
     }
+
 
 
     public bool TryGetNPCAttr(uint mapID, uint funcLineID, uint npcID, out ViewNPCAttr npcAttr)
@@ -121,6 +260,11 @@
         }
 
         return funcLineDict.TryGetValue(npcID, out npcAttr);
+    }
+
+    public void SendViewNPCAttr(BattleClickHeroData data)
+    {
+        SendViewNPCAttr((uint)data.mapID, (uint)data.funcLineID, (uint)data.npcID);
     }
 
     public void SendViewNPCAttr(uint mapID, uint funcLineID, uint viewNPCID)
@@ -143,4 +287,16 @@
     public byte BreakLV;        // 绐佺牬
     public byte AwakeLV;        // 瑙夐啋
     public Dictionary<int, long> AttrDict = new Dictionary<int, long>(); // 灞炴��;
+}
+
+public struct BattleClickHeroData
+{
+    public string battleName;
+    public bool isMySide;
+    public int heroID;
+    public int funcLineID;
+    public int mapID;
+    public int npcID;
+    public int posNum;
+    public List<BattleObject> teams;
 }
\ No newline at end of file

--
Gitblit v1.8.0