联机bug修复
This commit is contained in:
parent
0335855c15
commit
464fbde2e8
@ -1,5 +1,5 @@
|
||||
{
|
||||
"nextId": 272,
|
||||
"nextId": 273,
|
||||
"bugs": [
|
||||
{
|
||||
"id": 2,
|
||||
@ -2694,6 +2694,17 @@
|
||||
"longTerm": false,
|
||||
"createdAt": 1779891352529,
|
||||
"updatedAt": 1779891352529
|
||||
},
|
||||
{
|
||||
"id": 272,
|
||||
"title": "早苗升级的英文问题",
|
||||
"description": "",
|
||||
"status": "open",
|
||||
"priority": "medium",
|
||||
"module": "",
|
||||
"longTerm": false,
|
||||
"createdAt": 1779954580654,
|
||||
"updatedAt": 1779954580654
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -382,7 +382,6 @@ GameObject:
|
||||
- component: {fileID: 4208484589109369530}
|
||||
- component: {fileID: 3795164220530813026}
|
||||
- component: {fileID: 845308667534849763}
|
||||
- component: {fileID: 642137905484125701}
|
||||
m_Layer: 5
|
||||
m_Name: ErrorRecord
|
||||
m_TagString: Untagged
|
||||
@ -520,25 +519,6 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier:
|
||||
m_HorizontalFit: 0
|
||||
m_VerticalFit: 2
|
||||
--- !u!114 &642137905484125701
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5084579344674831282}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 6b27f832d22e4a8d916272b644937774, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
Ban: 0
|
||||
NoExport: 0
|
||||
FontBan: 0
|
||||
Preset: 0
|
||||
ID: 20076
|
||||
FontID: 0
|
||||
TextCfg: []
|
||||
--- !u!1 &5277186255209122562
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
@ -16,34 +16,58 @@ namespace TH1_Logic.Net
|
||||
public class NetworkPlayerTipManager
|
||||
{
|
||||
public static NetworkPlayerTipManager Instance { get; } = new NetworkPlayerTipManager();
|
||||
private const int MaxRecentPayloadCount = 100;
|
||||
|
||||
public event Action<NetworkPlayerTipPayload> OnTipRequested;
|
||||
|
||||
private readonly Dictionary<NetworkPlayerTipType, float> _nextTipTimes =
|
||||
new Dictionary<NetworkPlayerTipType, float>();
|
||||
private readonly Queue<NetworkPlayerTipPayload> _recentPayloads =
|
||||
new Queue<NetworkPlayerTipPayload>();
|
||||
|
||||
private NetworkPlayerTipDataAssets _dataAssets;
|
||||
|
||||
public bool Request(NetworkPlayerTipType tipType)
|
||||
{
|
||||
return Request(tipType, null);
|
||||
}
|
||||
|
||||
public bool Request(NetworkPlayerTipType tipType, string detailMessage, bool ignoreCooldown = false)
|
||||
{
|
||||
if (tipType == NetworkPlayerTipType.None) return false;
|
||||
|
||||
var info = GetTipInfo(tipType);
|
||||
var cooldownSeconds = GetCooldownSeconds(info);
|
||||
var now = Time.unscaledTime;
|
||||
if (_nextTipTimes.TryGetValue(tipType, out var nextTipTime) && now < nextTipTime) return false;
|
||||
if (!ignoreCooldown && _nextTipTimes.TryGetValue(tipType, out var nextTipTime) && now < nextTipTime) return false;
|
||||
|
||||
_nextTipTimes[tipType] = now + cooldownSeconds;
|
||||
OnTipRequested?.Invoke(new NetworkPlayerTipPayload
|
||||
var message = ResolveText(info?.Message, tipType.ToString());
|
||||
if (!string.IsNullOrWhiteSpace(detailMessage)
|
||||
&& !string.Equals(message, detailMessage, StringComparison.Ordinal))
|
||||
{
|
||||
message = string.IsNullOrEmpty(message)
|
||||
? detailMessage
|
||||
: $"{message}\n{detailMessage}";
|
||||
}
|
||||
|
||||
var payload = new NetworkPlayerTipPayload
|
||||
{
|
||||
TipType = tipType,
|
||||
TipInfo = info,
|
||||
Title = ResolveText(info?.Title, tipType.ToString()),
|
||||
Message = ResolveText(info?.Message, tipType.ToString())
|
||||
});
|
||||
Message = message
|
||||
};
|
||||
AddRecentPayload(payload);
|
||||
OnTipRequested?.Invoke(payload);
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<NetworkPlayerTipPayload> GetRecentPayloads()
|
||||
{
|
||||
return new List<NetworkPlayerTipPayload>(_recentPayloads);
|
||||
}
|
||||
|
||||
public bool TryGetTipInfo(NetworkPlayerTipType tipType, out NetworkPlayerTipInfo info)
|
||||
{
|
||||
info = GetTipInfo(tipType);
|
||||
@ -73,6 +97,14 @@ namespace TH1_Logic.Net
|
||||
_nextTipTimes.Clear();
|
||||
}
|
||||
|
||||
private void AddRecentPayload(NetworkPlayerTipPayload payload)
|
||||
{
|
||||
while (_recentPayloads.Count >= MaxRecentPayloadCount)
|
||||
_recentPayloads.Dequeue();
|
||||
|
||||
_recentPayloads.Enqueue(payload);
|
||||
}
|
||||
|
||||
private NetworkPlayerTipInfo GetTipInfo(NetworkPlayerTipType tipType)
|
||||
{
|
||||
var dataAssets = GetDataAssets();
|
||||
|
||||
@ -273,8 +273,9 @@ namespace TH1_Logic.Steam
|
||||
|
||||
public void MarkLobbyDataSyncRequired()
|
||||
{
|
||||
if (!_needLobbyDataFromHost)
|
||||
_lastRequestLobbyDataTime = -RequestLobbyDataCooldown;
|
||||
_needLobbyDataFromHost = true;
|
||||
_lastRequestLobbyDataTime = -RequestLobbyDataCooldown;
|
||||
}
|
||||
|
||||
public void MarkLobbyDataSyncedFromHost()
|
||||
|
||||
@ -188,7 +188,7 @@ namespace TH1_Logic.Steam
|
||||
var reason = $"Failed to connect to {steamID}";
|
||||
MarkConnectionFailure(reason);
|
||||
OnConnectionErrorEvent?.Invoke(reason);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionFailed);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionFailed, reason, true);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -296,7 +296,7 @@ namespace TH1_Logic.Steam
|
||||
var reason = $"Connection to {steamID} timed out";
|
||||
MarkConnectionFailure(reason);
|
||||
LogSystem.LogError(reason);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionTimeout);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionTimeout, reason, true);
|
||||
_connectionTimeouts.Remove(steamID);
|
||||
|
||||
if (_connections.TryGetValue(steamID, out var conn))
|
||||
@ -436,8 +436,9 @@ namespace TH1_Logic.Steam
|
||||
case ESteamNetworkingConnectionState.k_ESteamNetworkingConnectionState_ProblemDetectedLocally:
|
||||
LogSystem.LogWarning($"Connection problem detected locally: {remote}");
|
||||
LogSystem.LogWarning($"Problem details: {info.m_info.m_szEndDebug}");
|
||||
MarkConnectionFailure($"Connection problem detected locally: {remote}, {info.m_info.m_szEndDebug}");
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionFailed);
|
||||
var problemReason = $"Connection problem detected locally: {remote}, {info.m_info.m_szEndDebug}";
|
||||
MarkConnectionFailure(problemReason);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionFailed, problemReason, true);
|
||||
HandleDisconnection(remote, info.m_hConn);
|
||||
break;
|
||||
|
||||
@ -445,12 +446,13 @@ namespace TH1_Logic.Steam
|
||||
// 检查具体的失败原因
|
||||
var endReason = info.m_info.m_eEndReason;
|
||||
LogSystem.LogError($"Connection failed - Reason: {endReason}");
|
||||
MarkConnectionFailure($"Connection failed: {remote}, reason: {endReason}");
|
||||
var failureReason = $"Connection failed: {remote}, reason: {endReason}";
|
||||
MarkConnectionFailure(failureReason);
|
||||
var isTimeout = endReason == (int)ESteamNetConnectionEnd.k_ESteamNetConnectionEnd_Misc_Timeout
|
||||
|| endReason == (int)ESteamNetConnectionEnd.k_ESteamNetConnectionEnd_Remote_Timeout;
|
||||
NetworkPlayerTipManager.Instance.Request(isTimeout
|
||||
? NetworkPlayerTipType.P2PConnectionTimeout
|
||||
: NetworkPlayerTipType.P2PConnectionFailed);
|
||||
: NetworkPlayerTipType.P2PConnectionFailed, failureReason, true);
|
||||
|
||||
// 提供更详细的错误信息
|
||||
switch (endReason)
|
||||
|
||||
@ -1726,14 +1726,14 @@ namespace TH1_Logic.Steam
|
||||
private void OnP2PConnectionError(string error)
|
||||
{
|
||||
LogSystem.LogError($"P2P connection error: {error}");
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionFailed);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PConnectionFailed, error);
|
||||
}
|
||||
|
||||
private void OnP2PMessageSendFailed(CSteamID steamID, string reason)
|
||||
{
|
||||
var error = $"P2P message send failed: target={steamID}, reason={reason}";
|
||||
LogSystem.LogError(error);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PMessageSendFailed);
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.P2PMessageSendFailed, error);
|
||||
if (_suppressP2PSendFailureLobbyErrors <= 0) OnLobbyErrorEvent?.Invoke(error);
|
||||
}
|
||||
|
||||
|
||||
@ -44,6 +44,10 @@ namespace TH1_UI.View.Common
|
||||
}
|
||||
|
||||
SetLogAreaVisible(false);
|
||||
foreach (var payload in NetworkPlayerTipManager.Instance.GetRecentPayloads())
|
||||
AddLog(payload, false);
|
||||
RebuildLogLayout();
|
||||
|
||||
NetworkPlayerTipManager.Instance.OnTipRequested += OnNetworkPlayerTipRequested;
|
||||
}
|
||||
|
||||
@ -62,7 +66,7 @@ namespace TH1_UI.View.Common
|
||||
|
||||
private void OnNetworkPlayerTipRequested(NetworkPlayerTipPayload payload)
|
||||
{
|
||||
AddLog(payload);
|
||||
AddLog(payload, true);
|
||||
}
|
||||
|
||||
private void ToggleLogArea()
|
||||
@ -77,7 +81,7 @@ namespace TH1_UI.View.Common
|
||||
LogArea.SetActive(visible);
|
||||
}
|
||||
|
||||
private void AddLog(NetworkPlayerTipPayload payload)
|
||||
private void AddLog(NetworkPlayerTipPayload payload, bool rebuildLayout)
|
||||
{
|
||||
if (Content == null || LogItemPrefab == null)
|
||||
{
|
||||
@ -101,6 +105,15 @@ namespace TH1_UI.View.Common
|
||||
|
||||
_logItems.Enqueue(go);
|
||||
|
||||
if (rebuildLayout)
|
||||
RebuildLogLayout();
|
||||
}
|
||||
|
||||
private void RebuildLogLayout()
|
||||
{
|
||||
if (Content != null)
|
||||
LayoutRebuilder.ForceRebuildLayoutImmediate(Content);
|
||||
|
||||
if (ScrollRect != null)
|
||||
{
|
||||
Canvas.ForceUpdateCanvases();
|
||||
@ -131,6 +144,7 @@ namespace TH1_UI.View.Common
|
||||
if (go != null)
|
||||
Destroy(go);
|
||||
}
|
||||
RebuildLogLayout();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -321,6 +321,8 @@ namespace TH1_UI.View.Outside
|
||||
OnRefreshLobbyClicked();
|
||||
|
||||
//Step #4 绑定房间数据更新的委托,在网络数据变化的时候,刷新房间数据
|
||||
_lobby.OnMembersChangedEvent -= RefreshAll;
|
||||
_lobby.OnLobbyLeftEvent -= RefreshAll;
|
||||
_lobby.OnMembersChangedEvent += RefreshAll;
|
||||
_lobby.OnLobbyLeftEvent += RefreshAll;
|
||||
|
||||
@ -735,13 +737,13 @@ namespace TH1_UI.View.Outside
|
||||
bool canEdit = _lobby.IsLobbyOwner();
|
||||
if (AddRoomSeatButton != null)
|
||||
{
|
||||
AddRoomSeatButton.gameObject.SetActive(true);
|
||||
AddRoomSeatButton.gameObject.SetActive(canEdit);
|
||||
AddRoomSeatButton.interactable = canEdit && _roomSeatCount < maxSeatCount;
|
||||
}
|
||||
|
||||
if (ReduceRoomSeatButton != null)
|
||||
{
|
||||
ReduceRoomSeatButton.gameObject.SetActive(true);
|
||||
ReduceRoomSeatButton.gameObject.SetActive(canEdit);
|
||||
ReduceRoomSeatButton.interactable = canEdit && _roomSeatCount > minSeatCount;
|
||||
}
|
||||
}
|
||||
@ -1091,7 +1093,6 @@ namespace TH1_UI.View.Outside
|
||||
|
||||
// 只有房主才能修改房间设置
|
||||
bool isOwner = _lobby.IsLobbyOwner();
|
||||
Debug.Log($"[SetRoomInfoSetting] IsLobbyOwner={isOwner}, SelfID={_lobby.SelfID}, OwnerID={_lobby.GetLobbyOwnerId()}");
|
||||
SetRoomNameEditMode(false);
|
||||
|
||||
// 绑定回调(先绑再 Init,保证 OnGameModeOptionClicked 触发时回调已就位)
|
||||
@ -1435,6 +1436,7 @@ namespace TH1_UI.View.Outside
|
||||
|
||||
if (!string.IsNullOrEmpty(reason))
|
||||
Debug.LogWarning($"[UIOutsideMultiplay] Cannot create room: {reason}");
|
||||
NetworkPlayerTipManager.Instance.Request(NetworkPlayerTipType.LobbyCreateFailed, reason, true);
|
||||
|
||||
CreateRoomPanelMono?.Hide();
|
||||
CreateRoomPanel?.SetActive(false);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user