mirror of
https://github.com/ppy/osu.git
synced 2025-01-13 10:03:05 +08:00
Store server-side playlist instead of mutating client-side version
This commit is contained in:
parent
53dbbd6d64
commit
10dc08a855
@ -43,6 +43,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
private MultiplayerPlaylistItem? currentItem => Room?.Playlist[currentIndex];
|
private MultiplayerPlaylistItem? currentItem => Room?.Playlist[currentIndex];
|
||||||
|
|
||||||
private readonly TestMultiplayerRoomManager roomManager;
|
private readonly TestMultiplayerRoomManager roomManager;
|
||||||
|
private readonly List<MultiplayerPlaylistItem> serverSidePlaylist = new List<MultiplayerPlaylistItem>();
|
||||||
private int currentIndex;
|
private int currentIndex;
|
||||||
|
|
||||||
public TestMultiplayerClient(TestMultiplayerRoomManager roomManager)
|
public TestMultiplayerClient(TestMultiplayerRoomManager roomManager)
|
||||||
@ -162,6 +163,9 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
if (password != apiRoom.Password.Value)
|
if (password != apiRoom.Password.Value)
|
||||||
throw new InvalidOperationException("Invalid password.");
|
throw new InvalidOperationException("Invalid password.");
|
||||||
|
|
||||||
|
serverSidePlaylist.Clear();
|
||||||
|
serverSidePlaylist.AddRange(apiRoom.Playlist.Select(item => new MultiplayerPlaylistItem(item)));
|
||||||
|
|
||||||
var localUser = new MultiplayerRoomUser(api.LocalUser.Value.Id)
|
var localUser = new MultiplayerRoomUser(api.LocalUser.Value.Id)
|
||||||
{
|
{
|
||||||
User = api.LocalUser.Value
|
User = api.LocalUser.Value
|
||||||
@ -176,7 +180,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
Password = password,
|
Password = password,
|
||||||
QueueMode = apiRoom.QueueMode.Value
|
QueueMode = apiRoom.QueueMode.Value
|
||||||
},
|
},
|
||||||
Playlist = apiRoom.Playlist.Select(item => new MultiplayerPlaylistItem(item)).ToList(),
|
Playlist = serverSidePlaylist.ToList(),
|
||||||
Users = { localUser },
|
Users = { localUser },
|
||||||
Host = localUser
|
Host = localUser
|
||||||
};
|
};
|
||||||
@ -306,7 +310,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
// In host-only mode, the current item is re-used.
|
// In host-only mode, the current item is re-used.
|
||||||
item.ID = currentItem.ID;
|
item.ID = currentItem.ID;
|
||||||
|
|
||||||
Room.Playlist[currentIndex] = item;
|
serverSidePlaylist[currentIndex] = item;
|
||||||
await ((IMultiplayerClient)this).PlaylistItemChanged(item).ConfigureAwait(false);
|
await ((IMultiplayerClient)this).PlaylistItemChanged(item).ConfigureAwait(false);
|
||||||
|
|
||||||
// Note: Unlike the server, this is the easiest way to update the current item at this point.
|
// Note: Unlike the server, this is the easiest way to update the current item at this point.
|
||||||
@ -314,9 +318,9 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
item.ID = Room.Playlist.Last().ID + 1;
|
item.ID = serverSidePlaylist.Last().ID + 1;
|
||||||
|
|
||||||
Room.Playlist.Add(item);
|
serverSidePlaylist.Add(item);
|
||||||
await ((IMultiplayerClient)this).PlaylistItemAdded(item).ConfigureAwait(false);
|
await ((IMultiplayerClient)this).PlaylistItemAdded(item).ConfigureAwait(false);
|
||||||
|
|
||||||
await updateCurrentItem(Room).ConfigureAwait(false);
|
await updateCurrentItem(Room).ConfigureAwait(false);
|
||||||
@ -371,7 +375,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
Debug.Assert(currentItem != null);
|
Debug.Assert(currentItem != null);
|
||||||
|
|
||||||
// When changing to host-only mode, ensure that at least one non-expired playlist item exists by duplicating the current item.
|
// When changing to host-only mode, ensure that at least one non-expired playlist item exists by duplicating the current item.
|
||||||
if (newMode == QueueMode.HostOnly && Room.Playlist.All(item => item.Expired))
|
if (newMode == QueueMode.HostOnly && serverSidePlaylist.All(item => item.Expired))
|
||||||
await duplicateCurrentItem().ConfigureAwait(false);
|
await duplicateCurrentItem().ConfigureAwait(false);
|
||||||
|
|
||||||
// When changing modes, items could have been added (above) or the queueing order could have changed.
|
// When changing modes, items could have been added (above) or the queueing order could have changed.
|
||||||
@ -403,7 +407,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
|
|
||||||
var newItem = new MultiplayerPlaylistItem
|
var newItem = new MultiplayerPlaylistItem
|
||||||
{
|
{
|
||||||
ID = Room.Playlist.Last().ID + 1,
|
ID = serverSidePlaylist.Last().ID + 1,
|
||||||
BeatmapID = currentItem.BeatmapID,
|
BeatmapID = currentItem.BeatmapID,
|
||||||
BeatmapChecksum = currentItem.BeatmapChecksum,
|
BeatmapChecksum = currentItem.BeatmapChecksum,
|
||||||
RulesetID = currentItem.RulesetID,
|
RulesetID = currentItem.RulesetID,
|
||||||
@ -411,7 +415,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
AllowedMods = currentItem.AllowedMods
|
AllowedMods = currentItem.AllowedMods
|
||||||
};
|
};
|
||||||
|
|
||||||
Room.Playlist.Add(newItem);
|
serverSidePlaylist.Add(newItem);
|
||||||
await ((IMultiplayerClient)this).PlaylistItemAdded(newItem).ConfigureAwait(false);
|
await ((IMultiplayerClient)this).PlaylistItemAdded(newItem).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -423,7 +427,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
// Pick the single non-expired playlist item.
|
// Pick the single non-expired playlist item.
|
||||||
newItem = room.Playlist.FirstOrDefault(i => !i.Expired) ?? room.Playlist.Last();
|
newItem = serverSidePlaylist.FirstOrDefault(i => !i.Expired) ?? serverSidePlaylist.Last();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QueueMode.AllPlayersRoundRobin:
|
case QueueMode.AllPlayersRoundRobin:
|
||||||
@ -431,7 +435,7 @@ namespace osu.Game.Tests.Visual.Multiplayer
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
currentIndex = room.Playlist.IndexOf(newItem);
|
currentIndex = serverSidePlaylist.IndexOf(newItem);
|
||||||
|
|
||||||
long lastItem = room.Settings.PlaylistItemId;
|
long lastItem = room.Settings.PlaylistItemId;
|
||||||
room.Settings.PlaylistItemId = newItem.ID;
|
room.Settings.PlaylistItemId = newItem.ID;
|
||||||
|
Loading…
Reference in New Issue
Block a user