mirror of
https://github.com/osukey/osukey.git
synced 2025-08-05 15:44:04 +09:00
Merge pull request #19189 from peppy/peform-actions-after-reconnect
Fix creating multiplayer game during server migration not joining new room correctly
This commit is contained in:
@ -64,26 +64,26 @@ namespace osu.Game.Online
|
|||||||
this.preferMessagePack = preferMessagePack;
|
this.preferMessagePack = preferMessagePack;
|
||||||
|
|
||||||
apiState.BindTo(api.State);
|
apiState.BindTo(api.State);
|
||||||
apiState.BindValueChanged(_ => connectIfPossible(), true);
|
apiState.BindValueChanged(_ => Task.Run(connectIfPossible), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reconnect()
|
public Task Reconnect()
|
||||||
{
|
{
|
||||||
Logger.Log($"{clientName} reconnecting...", LoggingTarget.Network);
|
Logger.Log($"{clientName} reconnecting...", LoggingTarget.Network);
|
||||||
Task.Run(connectIfPossible);
|
return Task.Run(connectIfPossible);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void connectIfPossible()
|
private async Task connectIfPossible()
|
||||||
{
|
{
|
||||||
switch (apiState.Value)
|
switch (apiState.Value)
|
||||||
{
|
{
|
||||||
case APIState.Failing:
|
case APIState.Failing:
|
||||||
case APIState.Offline:
|
case APIState.Offline:
|
||||||
Task.Run(() => disconnect(true));
|
await disconnect(true);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case APIState.Online:
|
case APIState.Online:
|
||||||
Task.Run(connect);
|
await connect();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.SignalR.Client;
|
using Microsoft.AspNetCore.SignalR.Client;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
@ -32,6 +33,6 @@ namespace osu.Game.Online
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reconnect if already connected.
|
/// Reconnect if already connected.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void Reconnect();
|
Task Reconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,6 @@ using osu.Game.Online.Rooms.RoomStatuses;
|
|||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Rulesets.Mods;
|
using osu.Game.Rulesets.Mods;
|
||||||
using osu.Game.Utils;
|
using osu.Game.Utils;
|
||||||
using APIUser = osu.Game.Online.API.Requests.Responses.APIUser;
|
|
||||||
|
|
||||||
namespace osu.Game.Online.Multiplayer
|
namespace osu.Game.Online.Multiplayer
|
||||||
{
|
{
|
||||||
@ -91,7 +90,7 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The joined <see cref="MultiplayerRoom"/>.
|
/// The joined <see cref="MultiplayerRoom"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public virtual MultiplayerRoom? Room
|
public virtual MultiplayerRoom? Room // virtual for moq
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -150,7 +149,7 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
// clean up local room state on server disconnect.
|
// clean up local room state on server disconnect.
|
||||||
if (!connected.NewValue && Room != null)
|
if (!connected.NewValue && Room != null)
|
||||||
{
|
{
|
||||||
Logger.Log("Connection to multiplayer server was lost.", LoggingTarget.Runtime, LogLevel.Important);
|
Logger.Log("Clearing room due to multiplayer server connection loss.", LoggingTarget.Runtime, LogLevel.Important);
|
||||||
LeaveRoom();
|
LeaveRoom();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
@ -85,7 +85,13 @@ namespace osu.Game.Online.Multiplayer
|
|||||||
catch (HubException exception)
|
catch (HubException exception)
|
||||||
{
|
{
|
||||||
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
|
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
|
||||||
connector?.Reconnect();
|
{
|
||||||
|
Debug.Assert(connector != null);
|
||||||
|
|
||||||
|
await connector.Reconnect();
|
||||||
|
return await JoinRoom(roomId, password);
|
||||||
|
}
|
||||||
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,14 @@ namespace osu.Game.Online.Spectator
|
|||||||
catch (HubException exception)
|
catch (HubException exception)
|
||||||
{
|
{
|
||||||
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
|
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
|
||||||
connector?.Reconnect();
|
{
|
||||||
|
Debug.Assert(connector != null);
|
||||||
|
|
||||||
|
await connector.Reconnect();
|
||||||
|
await BeginPlayingInternal(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,12 +70,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
|
|||||||
client.LoadRequested += onLoadRequested;
|
client.LoadRequested += onLoadRequested;
|
||||||
client.RoomUpdated += onRoomUpdated;
|
client.RoomUpdated += onRoomUpdated;
|
||||||
|
|
||||||
isConnected.BindTo(client.IsConnected);
|
if (!client.IsConnected.Value)
|
||||||
isConnected.BindValueChanged(connected =>
|
handleRoomLost();
|
||||||
{
|
|
||||||
if (!connected.NewValue)
|
|
||||||
handleRoomLost();
|
|
||||||
}, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Drawable CreateMainContent() => new Container
|
protected override Drawable CreateMainContent() => new Container
|
||||||
|
Reference in New Issue
Block a user