联机bug修复

This commit is contained in:
daixiawu 2026-05-28 15:52:40 +08:00
parent 0335855c15
commit 464fbde2e8
11 changed files with 6857 additions and 5975 deletions

View File

@ -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
}
]
}

View File

@ -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

View File

@ -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();

View File

@ -273,8 +273,9 @@ namespace TH1_Logic.Steam
public void MarkLobbyDataSyncRequired()
{
if (!_needLobbyDataFromHost)
_lastRequestLobbyDataTime = -RequestLobbyDataCooldown;
_needLobbyDataFromHost = true;
_lastRequestLobbyDataTime = -RequestLobbyDataCooldown;
}
public void MarkLobbyDataSyncedFromHost()

View File

@ -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)

View File

@ -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);
}

View File

@ -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();
}
}
}

View File

@ -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