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