Merge pull request #7848 from smoogipoo/fix-match-subscreen-crashes

Replace hashcode override with local equality comparer
This commit is contained in:
Dean Herbert 2020-02-16 17:01:22 +09:00 committed by GitHub
commit 80462014d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 16 deletions

View File

@ -179,6 +179,16 @@ namespace osu.Game.Tests.Visual.Multiplayer
AddAssert("item 0 is selected", () => playlist.SelectedItem.Value == playlist.Items[0]);
}
[Test]
public void TestChangeBeatmapAndRemove()
{
createPlaylist(true, true);
AddStep("change beatmap of first item", () => playlist.Items[0].BeatmapID = 30);
moveToDeleteButton(0);
AddStep("click delete button", () => InputManager.Click(MouseButton.Left));
}
private void moveToItem(int index, Vector2? offset = null)
=> AddStep($"move mouse to item {index}", () => InputManager.MoveMouseTo(playlist.ChildrenOfType<OsuRearrangeableListItem<PlaylistItem>>().ElementAt(index), offset));

View File

@ -93,12 +93,5 @@ namespace osu.Game.Online.Multiplayer
public bool ShouldSerializeapiBeatmap() => false;
public bool Equals(PlaylistItem other) => ID == other?.ID && BeatmapID == other.BeatmapID && RulesetID == other.RulesetID;
public override int GetHashCode()
{
// ReSharper disable NonReadonlyMemberInGetHashCode
return HashCode.Combine(ID, BeatmapID, RulesetID);
// ReSharper restore NonReadonlyMemberInGetHashCode
}
}
}

View File

@ -124,19 +124,20 @@ namespace osu.Game.Online.Multiplayer
var localItem = Playlist.FirstOrDefault(i => i.BeatmapID == item.BeatmapID);
if (localItem != null)
{
item.Beatmap.Value.Metadata = localItem.Beatmap.Value.Metadata;
}
}
foreach (var removeableItem in Playlist.Except(other.Playlist).ToArray())
Playlist.Remove(removeableItem);
if (!Playlist.SequenceEqual(other.Playlist))
{
Playlist.Clear();
Playlist.AddRange(other.Playlist);
}
Playlist.AddRange(other.Playlist.Except(Playlist).ToArray());
foreach (var removedItem in Participants.Except(other.Participants).ToArray())
Participants.Remove(removedItem);
Participants.AddRange(other.Participants.Except(Participants).ToArray());
if (!Participants.SequenceEqual(other.Participants))
{
Participants.Clear();
Participants.AddRange(other.Participants);
}
Position = other.Position;
}