1
0
mirror of https://github.com/ppy/osu.git synced 2024-09-21 19:27:24 +08:00

Join multiplayer match when clicking the invite notification

This commit is contained in:
Marvin Schürz 2023-10-03 01:31:30 +02:00
parent 8e73dbc894
commit a171fa7649
3 changed files with 35 additions and 6 deletions

View File

@ -46,6 +46,7 @@ using osu.Game.IO;
using osu.Game.Localisation;
using osu.Game.Online;
using osu.Game.Online.Chat;
using osu.Game.Online.Rooms;
using osu.Game.Overlays;
using osu.Game.Overlays.BeatmapListing;
using osu.Game.Overlays.Music;
@ -58,6 +59,7 @@ using osu.Game.Rulesets.Mods;
using osu.Game.Scoring;
using osu.Game.Screens;
using osu.Game.Screens.Menu;
using osu.Game.Screens.OnlinePlay.Multiplayer;
using osu.Game.Screens.Play;
using osu.Game.Screens.Ranking;
using osu.Game.Screens.Select;
@ -643,6 +645,25 @@ namespace osu.Game
});
}
/// <summary>
/// Join a multiplayer match immediately.
/// </summary>
/// <param name="room">The room to join.</param>
/// <param name="password">The password to join the room, if any is given.</param>
public void PresentMultiplayerMatch(Room room, string password)
{
PerformFromScreen(screen =>
{
Multiplayer multiplayer = new Multiplayer();
multiplayer.OnLoadComplete += _ =>
{
multiplayer.Join(room, password);
};
screen.Push(multiplayer);
});
}
/// <summary>
/// Present a score's replay immediately.
/// The user should have already requested this interactively.
@ -853,6 +874,7 @@ namespace osu.Game
ScoreManager.PresentImport = items => PresentScore(items.First().Value);
MultiplayerClient.PostNotification = n => Notifications.Post(n);
MultiplayerClient.InviteAccepted = PresentMultiplayerMatch;
// make config aware of how to lookup skins for on-screen display purposes.
// if this becomes a more common thing, tracked settings should be reconsidered to allow local DI.

View File

@ -7,6 +7,7 @@ using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Logging;
using osu.Framework.Screens;
using osu.Game.Online.Multiplayer;
using osu.Game.Online.Rooms;
using osu.Game.Screens.OnlinePlay.Components;
using osu.Game.Screens.OnlinePlay.Lounge;
@ -90,6 +91,11 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
protected override LoungeSubScreen CreateLounge() => new MultiplayerLoungeSubScreen();
public void Join(Room room, string? password)
{
LoungeSubScreen.Join(room, password);
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);

View File

@ -32,8 +32,9 @@ namespace osu.Game.Screens.OnlinePlay
// while leases may be taken out by a subscreen.
public override bool DisallowExternalBeatmapRulesetChanges => true;
protected LoungeSubScreen LoungeSubScreen;
private MultiplayerWaveContainer waves;
private LoungeSubScreen loungeSubScreen;
private ScreenStack screenStack;
[Cached(Type = typeof(IRoomManager))]
@ -89,7 +90,7 @@ namespace osu.Game.Screens.OnlinePlay
screenStack.ScreenPushed += screenPushed;
screenStack.ScreenExited += screenExited;
screenStack.Push(loungeSubScreen = CreateLounge());
screenStack.Push(LoungeSubScreen = CreateLounge());
apiState.BindTo(API.State);
apiState.BindValueChanged(onlineStateChanged, true);
@ -120,10 +121,10 @@ namespace osu.Game.Screens.OnlinePlay
Mods.SetDefault();
if (loungeSubScreen.IsCurrentScreen())
loungeSubScreen.OnEntering(e);
if (LoungeSubScreen.IsCurrentScreen())
LoungeSubScreen.OnEntering(e);
else
loungeSubScreen.MakeCurrent();
LoungeSubScreen.MakeCurrent();
}
public override void OnResuming(ScreenTransitionEvent e)
@ -158,7 +159,7 @@ namespace osu.Game.Screens.OnlinePlay
public override bool OnExiting(ScreenExitEvent e)
{
while (screenStack.CurrentScreen != null && screenStack.CurrentScreen is not LoungeSubScreen)
while (screenStack.CurrentScreen != null && screenStack.CurrentScreen is not Lounge.LoungeSubScreen)
{
var subScreen = (Screen)screenStack.CurrentScreen;
if (subScreen.IsLoaded && subScreen.OnExiting(e))