Skip to content

Commit e70690a

Browse files
authored
Merge pull request #137 from Goobwabber/1.16.3
1.18 Update
2 parents d047e8d + fed2450 commit e70690a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1259
-1609
lines changed

MultiplayerExtensions/Beatmaps/PreviewBeatmapStub.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using BeatSaverSharp;
1+
using BeatSaverSharp.Models;
22
using System;
33
using System.Threading;
44
using System.Threading.Tasks;
@@ -23,7 +23,7 @@ public Task<bool> isDownloadable
2323

2424
if (_downloadableTask == null)
2525
{
26-
_downloadableTask = Plugin.BeatSaver.Hash(levelHash).ContinueWith<bool>(r => r.Exception == null && r.Result is Beatmap);
26+
_downloadableTask = Plugin.BeatSaver.BeatmapByHash(levelHash).ContinueWith<bool>(r => r.Exception == null && r.Result is Beatmap);
2727
_downloadableTask.ContinueWith(r => _downloadable = r.Result ? DownloadableState.True : DownloadableState.False);
2828
}
2929

@@ -85,14 +85,14 @@ public PreviewBeatmapStub(PreviewBeatmapPacket packet)
8585
this.songDuration = packet.songDuration;
8686
}
8787

88-
public PreviewBeatmapStub(string levelID, Beatmap bm)
88+
public PreviewBeatmapStub(string levelID, string hash, Beatmap bm)
8989
{
9090
this._beatmap = bm;
9191
this._downloadable = DownloadableState.True;
9292
this.isDownloaded = false;
9393

9494
this.levelID = levelID;
95-
this.levelHash = bm.Hash;
95+
this.levelHash = hash;
9696

9797
this.songName = bm.Metadata.SongName;
9898
this.songSubName = bm.Metadata.SongSubName;
@@ -113,17 +113,16 @@ public async Task<Sprite> GetCoverImageAsync(CancellationToken cancellationToken
113113
{
114114
try
115115
{
116-
Sprite? cover = Utilities.Sprites.GetSprite(await _beatmap.CoverImageBytes());
116+
Sprite? cover = Utilities.Sprites.GetSprite(await _beatmap.Versions[0].DownloadCoverImage());
117117
if (cover != null)
118118
return cover;
119119
}
120120
catch(Exception ex)
121121
{
122122
Plugin.Log?.Warn($"Failed to fetch beatmap cover: {ex.Message}");
123123
}
124-
125124
}
126-
125+
127126
return Sprite.Create(Texture2D.blackTexture, new Rect(0, 0, 2, 2), new Vector2(0, 0), 100.0f);
128127
}
129128

MultiplayerExtensions/Downloader.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
using System.Threading.Tasks;
55
using MultiplayerExtensions.Utilities;
66
using System.Collections.Concurrent;
7-
using BeatSaverSharp;
87
using System.Diagnostics;
8+
using BeatSaverSharp.Models;
9+
using System.Linq;
910
#nullable enable
1011

1112
namespace MultiplayerExtensions
@@ -25,14 +26,14 @@ public static bool TryGetDownload(string levelId, out Task<IPreviewBeatmapLevel?
2526

2627
private static async Task<IPreviewBeatmapLevel?> DownloadSong(string hash, CancellationToken cancellationToken)
2728
{
28-
Beatmap? bm = await Plugin.BeatSaver.Hash(hash);
29+
Beatmap? bm = await Plugin.BeatSaver.BeatmapByHash(hash);
2930

3031
if (bm == null)
3132
{
3233
Plugin.Log?.Warn($"Could not find song '{hash}' on Beat Saver.");
3334
return null;
3435
}
35-
Plugin.Log.Info($"Attempting to download song '({bm.Key}) {bm.Name ?? hash}'");
36+
Plugin.Log.Info($"Attempting to download song '({bm.ID}) {bm.Name ?? hash}'");
3637
#if DEBUG
3738
if((Plugin.Config.DebugConfig?.FailDownloads ?? false))
3839
{
@@ -43,16 +44,12 @@ public static bool TryGetDownload(string levelId, out Task<IPreviewBeatmapLevel?
4344
#endif
4445
Stopwatch sw = new Stopwatch();
4546
sw.Start();
46-
byte[] beatmapBytes = await bm.ZipBytes(false, new StandardRequestOptions()
47-
{
48-
Progress = new Progress<double>(d =>
49-
{
50-
#if DEBUG
51-
Plugin.Log.Debug($"Downloading '{hash}': {d}");
52-
#endif
53-
DownloadProgressChanged?.Invoke(hash, d);
54-
})
55-
});
47+
48+
Plugin.Log?.Info($"Target hash: '{hash}'");
49+
byte[]? beatmapBytes = await bm.Versions.ToList().Find(version => {
50+
Plugin.Log?.Info($"Version: '{version.Key}' '{version.Hash}'");
51+
return version.Hash.ToUpper() == hash;
52+
}).DownloadZIP(progress: UI.CenterScreenLoadingPanel.Instance);
5653
#if DEBUG
5754
TimeSpan delay = TimeSpan.FromSeconds(Plugin.Config.DebugConfig?.MinDownloadTime ?? 0) - TimeSpan.FromMilliseconds(sw.ElapsedMilliseconds);
5855
if (delay > TimeSpan.Zero)
@@ -62,7 +59,7 @@ public static bool TryGetDownload(string levelId, out Task<IPreviewBeatmapLevel?
6259
Plugin.Log.Debug($"Delay finished.");
6360
}
6461
#endif
65-
string folderPath = Utils.GetSongDirectoryName(bm.Key, bm.Metadata.SongName, bm.Metadata.LevelAuthorName);
62+
string folderPath = Utils.GetSongDirectoryName(bm.LatestVersion.Key, bm.Metadata.SongName, bm.Metadata.LevelAuthorName);
6663
folderPath = Path.Combine(CustomLevelsFolder, folderPath);
6764
using (var ms = new MemoryStream(beatmapBytes))
6865
{

MultiplayerExtensions/Environments/LobbyAvatarManager.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
using System;
22
using System.Collections.Generic;
33
using IPA.Utilities;
4-
using MultiplayerExtensions.Sessions;
4+
using MultiplayerExtensions.Extensions;
55
using UnityEngine;
66
using Zenject;
77

88
namespace MultiplayerExtensions.Environments
99
{
1010
public class LobbyAvatarManager : IInitializable, IDisposable
1111
{
12-
protected readonly IMultiplayerSessionManager _sessionManager;
13-
protected readonly ExtendedPlayerManager _playerManager;
12+
protected readonly ExtendedSessionManager _sessionManager;
1413
protected readonly MultiplayerLobbyAvatarManager _avatarManager;
1514

1615
protected Dictionary<string, MultiplayerLobbyAvatarController>? _refPlayerIdToAvatarMap;
1716

1817
private Dictionary<string, ExtendedPlayer> _extendedPlayers;
1918

20-
internal LobbyAvatarManager(IMultiplayerSessionManager sessionManager, ExtendedPlayerManager playerManager, MultiplayerLobbyAvatarManager avatarManager)
19+
internal LobbyAvatarManager(IMultiplayerSessionManager sessionManager, MultiplayerLobbyAvatarManager avatarManager)
2120
{
22-
_sessionManager = sessionManager;
23-
_playerManager = playerManager;
21+
_sessionManager = (sessionManager as ExtendedSessionManager)!;
2422
_avatarManager = avatarManager;
2523

2624
_refPlayerIdToAvatarMap = null;
@@ -32,14 +30,14 @@ public void Initialize()
3230
{
3331
MPEvents.LobbyAvatarCreated += HandleLobbyAvatarCreated;
3432
_sessionManager.playerDisconnectedEvent += HandlePlayerDisconnected;
35-
_playerManager.extendedPlayerConnectedEvent += HandleExtendedPlayerConnected;
33+
_sessionManager.extendedPlayerConnectedEvent += HandleExtendedPlayerConnected;
3634
}
3735

3836
public void Dispose()
3937
{
4038
MPEvents.LobbyAvatarCreated -= HandleLobbyAvatarCreated;
4139
_sessionManager.playerDisconnectedEvent -= HandlePlayerDisconnected;
42-
_playerManager.extendedPlayerConnectedEvent -= HandleExtendedPlayerConnected;
40+
_sessionManager.extendedPlayerConnectedEvent -= HandleExtendedPlayerConnected;
4341
}
4442

4543
#region Events

MultiplayerExtensions/Environments/LobbyAvatarNameTag.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Collections.Generic;
22
using HMUI;
3-
using MultiplayerExtensions.Sessions;
3+
using MultiplayerExtensions.Extensions;
44
using MultiplayerExtensions.Utilities;
55
using UnityEngine;
66
using UnityEngine.UI;

MultiplayerExtensions/Environments/LobbyEnvironmentManager.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,46 @@
11
using System;
22
using IPA.Utilities;
3-
using MultiplayerExtensions.Sessions;
4-
using System;
3+
using MultiplayerExtensions.Extensions;
54
using UnityEngine;
65
using Zenject;
76

87
namespace MultiplayerExtensions.Environments
98
{
109
public class LobbyEnvironmentManager : IInitializable, IDisposable
1110
{
12-
protected readonly IMultiplayerSessionManager _sessionManager;
11+
protected readonly ExtendedSessionManager _sessionManager;
1312
protected readonly ILobbyStateDataModel _lobbyStateDataModel;
1413
protected readonly MenuEnvironmentManager _menuEnvironmentManager;
1514
protected readonly MultiplayerLobbyAvatarPlaceManager _placeManager;
1615
protected readonly MultiplayerLobbyCenterStageManager _stageManager;
17-
protected readonly ExtendedPlayerManager _playerManager;
1816

1917
private LobbyAvatarPlaceLighting[] _avatarPlaces = Array.Empty<LobbyAvatarPlaceLighting>();
2018
private float _innerCircleRadius;
2119
private float _minOuterCircleRadius;
2220
private float _angleBetweenPlayersWithEvenAdjustment;
2321
private float _outerCircleRadius;
2422

25-
internal LobbyEnvironmentManager(IMultiplayerSessionManager sessionManager, ILobbyStateDataModel lobbyStateDataModel, MenuEnvironmentManager menuEnvironmentManager, MultiplayerLobbyAvatarPlaceManager placeManager, MultiplayerLobbyCenterStageManager stageManager, ExtendedPlayerManager playerManager)
23+
internal LobbyEnvironmentManager(IMultiplayerSessionManager sessionManager, ILobbyStateDataModel lobbyStateDataModel, MenuEnvironmentManager menuEnvironmentManager, MultiplayerLobbyAvatarPlaceManager placeManager, MultiplayerLobbyCenterStageManager stageManager)
2624
{
27-
_sessionManager = sessionManager;
25+
_sessionManager = (sessionManager as ExtendedSessionManager)!;
2826
_lobbyStateDataModel = lobbyStateDataModel;
2927
_menuEnvironmentManager = menuEnvironmentManager;
3028
_placeManager = placeManager;
3129
_stageManager = stageManager;
32-
_playerManager = playerManager;
3330
}
3431

3532
public void Initialize()
3633
{
3734
MPEvents.LobbyEnvironmentLoaded += HandleLobbyEnvironmentLoaded;
38-
_playerManager.extendedPlayerConnectedEvent += HandleExtendedPlayerConnected;
35+
_sessionManager.extendedPlayerConnectedEvent += HandleExtendedPlayerConnected;
3936
_sessionManager.playerConnectedEvent += HandlePlayerConnected;
4037
_sessionManager.playerDisconnectedEvent += HandlePlayerDisconnected;
4138
}
4239

4340
public void Dispose()
4441
{
4542
MPEvents.LobbyEnvironmentLoaded -= HandleLobbyEnvironmentLoaded;
46-
_playerManager.extendedPlayerConnectedEvent -= HandleExtendedPlayerConnected;
43+
_sessionManager.extendedPlayerConnectedEvent -= HandleExtendedPlayerConnected;
4744
_sessionManager.playerConnectedEvent -= HandlePlayerConnected;
4845
_sessionManager.playerDisconnectedEvent -= HandlePlayerDisconnected;
4946
}
@@ -81,12 +78,12 @@ private void HandleLobbyEnvironmentLoaded(object sender, System.EventArgs e)
8178
public void SetDefaultPlayerPlaceColors()
8279
{
8380
SetAllPlayerPlaceColors(Color.black, true);
84-
SetPlayerPlaceColor(_sessionManager.localPlayer, ExtendedPlayerManager.localColor, true);
81+
SetPlayerPlaceColor(_sessionManager.localPlayer, ExtendedSessionManager.localExtendedPlayer.playerColor, true);
8582

8683
foreach (var player in _sessionManager.connectedPlayers)
8784
SetPlayerPlaceColor(player, ExtendedPlayer.DefaultColor, false);
8885

89-
foreach (var extendedPlayer in _playerManager.players.Values)
86+
foreach (var extendedPlayer in _sessionManager.extendedPlayers.Values)
9087
SetPlayerPlaceColor(extendedPlayer, extendedPlayer.playerColor, true);
9188
}
9289

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using MultiplayerExtensions.Sessions;
1+
using MultiplayerExtensions.Extensions;
22
using UnityEngine;
33
using Zenject;
44

@@ -8,28 +8,32 @@ public class MultiplayerActivePlayer : MonoBehaviour
88
{
99
protected IConnectedPlayer _connectedPlayer = null!;
1010
protected MultiplayerController _multiplayerController = null!;
11-
protected ExtendedPlayerManager _extendedPlayerManager = null!;
11+
protected ExtendedSessionManager _sessionManager = null!;
1212
protected IScoreSyncStateManager _scoreProvider = null!;
1313
protected MultiplayerLeadPlayerProvider _leadPlayerProvider = null!;
1414

1515
[Inject]
16-
internal void Inject(IConnectedPlayer connectedPlayer, MultiplayerController multiplayerController, ExtendedPlayerManager extendedPlayerManager, IScoreSyncStateManager scoreProvider, MultiplayerLeadPlayerProvider leadPlayerProvider)
16+
internal void Inject(IConnectedPlayer connectedPlayer, MultiplayerController multiplayerController, IMultiplayerSessionManager sessionManager, IScoreSyncStateManager scoreProvider, MultiplayerLeadPlayerProvider leadPlayerProvider)
1717
{
1818
_connectedPlayer = connectedPlayer;
1919
_multiplayerController = multiplayerController;
20-
_extendedPlayerManager = extendedPlayerManager;
20+
_sessionManager = (sessionManager as ExtendedSessionManager)!;
2121
_scoreProvider = scoreProvider;
2222
_leadPlayerProvider = leadPlayerProvider;
2323
}
2424

2525
protected void Awake()
2626
{
27+
MultiplayerGameplayAnimator gameplayAnimator = transform.GetComponentInChildren<MultiplayerGameplayAnimator>();
28+
2729
if (Plugin.Config.MissLighting)
2830
{
29-
MultiplayerGameplayAnimator gameplayAnimator = transform.GetComponentInChildren<MultiplayerGameplayAnimator>();
3031
MultiplayerGameplayLighting gameplayLighting = gameplayAnimator.gameObject.AddComponent<MultiplayerGameplayLighting>();
31-
gameplayLighting.Construct(_connectedPlayer, _multiplayerController, _scoreProvider, _leadPlayerProvider, gameplayAnimator, _extendedPlayerManager);
32+
gameplayLighting.Construct(_connectedPlayer, _multiplayerController, _scoreProvider, _leadPlayerProvider, gameplayAnimator, _sessionManager);
3233
}
34+
35+
MultiplayerGameplayHud gameplayHud = gameplayAnimator.gameObject.AddComponent<MultiplayerGameplayHud>();
36+
gameplayHud.Construct(_connectedPlayer, gameplayAnimator);
3337
}
3438
}
3539
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using HMUI;
2+
using IPA.Utilities;
3+
using UnityEngine;
4+
5+
namespace MultiplayerExtensions.Environments
6+
{
7+
class MultiplayerGameplayHud : MonoBehaviour
8+
{
9+
protected IConnectedPlayer _connectedPlayer = null!;
10+
protected MultiplayerGameplayAnimator _gameplayAnimator = null!;
11+
12+
protected CoreGameHUDController _coreGameHUDController = null!;
13+
protected GameObject _songProgressPanelGO = null!;
14+
protected GameObject _energyPanelGO = null!;
15+
16+
internal void Construct(IConnectedPlayer connectedPlayer, MultiplayerGameplayAnimator gameplayAnimator)
17+
{
18+
_connectedPlayer = connectedPlayer;
19+
_gameplayAnimator = gameplayAnimator;
20+
21+
if (gameplayAnimator is MultiplayerLocalActivePlayerGameplayAnimator localGameplayAnimator)
22+
{
23+
_coreGameHUDController = localGameplayAnimator.GetField<CoreGameHUDController, MultiplayerLocalActivePlayerGameplayAnimator>("_coreGameHUDController");
24+
25+
_songProgressPanelGO = _coreGameHUDController.GetField<GameObject, CoreGameHUDController>("_songProgressPanelGO");
26+
_energyPanelGO = _coreGameHUDController.GetField<GameObject, CoreGameHUDController>("_energyPanelGO");
27+
}
28+
}
29+
30+
internal void Start()
31+
{
32+
if (Plugin.Config.SingleplayerHUD && _coreGameHUDController != null)
33+
{
34+
Plugin.Log?.Debug("Setting up multiplayer HUD");
35+
36+
_coreGameHUDController.transform.position = new Vector3(0f, 0f, 10f);
37+
_coreGameHUDController.transform.eulerAngles = new Vector3(270f, 0f, 0f);
38+
39+
_energyPanelGO.transform.localPosition = new Vector3(0f, 4f, 0f);
40+
_energyPanelGO.transform.localEulerAngles = new Vector3(90f, 0f, 0f);
41+
42+
if (!_coreGameHUDController.transform.Find("LeftPanel"))
43+
{
44+
Transform comboPanel = _coreGameHUDController.transform.Find("ComboPanel");
45+
Transform scoreCanvas = _coreGameHUDController.transform.Find("ScoreCanvas");
46+
Transform multiplierCanvas = _coreGameHUDController.transform.Find("MultiplierCanvas");
47+
48+
GameObject leftPanel = new GameObject();
49+
GameObject rightPanel = new GameObject();
50+
leftPanel.name = "LeftPanel";
51+
rightPanel.name = "RightPanel";
52+
leftPanel.transform.parent = _coreGameHUDController.transform;
53+
rightPanel.transform.parent = _coreGameHUDController.transform;
54+
leftPanel.transform.localPosition = new Vector3(-2.5f, 0f, 1f);
55+
rightPanel.transform.localPosition = new Vector3(2.5f, 0f, 1f);
56+
57+
_songProgressPanelGO.transform.SetParent(rightPanel.transform, true);
58+
_songProgressPanelGO.transform.localPosition = new Vector3(0f, -1.1f, 0f);
59+
_songProgressPanelGO.transform.SetParent(_coreGameHUDController.transform, true);
60+
61+
multiplierCanvas.transform.SetParent(rightPanel.transform, true);
62+
multiplierCanvas.transform.localPosition = new Vector3(0f, 0f, 0f);
63+
multiplierCanvas.transform.SetParent(_coreGameHUDController.transform, true);
64+
65+
comboPanel.transform.SetParent(leftPanel.transform, true);
66+
comboPanel.transform.localPosition = new Vector3(0f, 0f, 0f);
67+
comboPanel.transform.SetParent(_coreGameHUDController.transform, true);
68+
69+
scoreCanvas.transform.SetParent(leftPanel.transform, true);
70+
scoreCanvas.transform.localPosition = new Vector3(0f, -1.1f, 0f);
71+
scoreCanvas.transform.SetParent(_coreGameHUDController.transform, true);
72+
73+
foreach (CurvedTextMeshPro panel in scoreCanvas.GetComponentsInChildren<CurvedTextMeshPro>())
74+
{
75+
panel.enabled = true;
76+
}
77+
}
78+
}
79+
}
80+
}
81+
}

MultiplayerExtensions/Environments/MultiplayerGameplayLighting.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using IPA.Utilities;
2-
using MultiplayerExtensions.Sessions;
2+
using MultiplayerExtensions.Extensions;
33
using UnityEngine;
44

55
namespace MultiplayerExtensions.Environments
@@ -11,7 +11,7 @@ class MultiplayerGameplayLighting : MonoBehaviour
1111
protected IScoreSyncStateManager _scoreProvider = null!;
1212
protected MultiplayerLeadPlayerProvider _leadPlayerProvider = null!;
1313
protected MultiplayerGameplayAnimator _gameplayAnimator = null!;
14-
protected ExtendedPlayerManager _extendedPlayerManager = null!;
14+
protected ExtendedSessionManager _sessionManager = null!;
1515

1616
protected LightsAnimator[] _allLights = null!;
1717
protected LightsAnimator[] _gameplayLights = null!;
@@ -26,14 +26,14 @@ class MultiplayerGameplayLighting : MonoBehaviour
2626

2727
protected MultiplayerSyncState<StandardScoreSyncState, StandardScoreSyncState.Score, int> _syncState = null!;
2828

29-
internal void Construct(IConnectedPlayer connectedPlayer, MultiplayerController multiplayerController, IScoreSyncStateManager scoreProvider, MultiplayerLeadPlayerProvider leadPlayerProvider, MultiplayerGameplayAnimator gameplayAnimator, ExtendedPlayerManager extendedPlayerManager)
29+
internal void Construct(IConnectedPlayer connectedPlayer, MultiplayerController multiplayerController, IScoreSyncStateManager scoreProvider, MultiplayerLeadPlayerProvider leadPlayerProvider, MultiplayerGameplayAnimator gameplayAnimator, ExtendedSessionManager sessionManager)
3030
{
3131
_connectedPlayer = connectedPlayer;
3232
_multiplayerController = multiplayerController;
3333
_scoreProvider = scoreProvider;
3434
_leadPlayerProvider = leadPlayerProvider;
3535
_gameplayAnimator = gameplayAnimator;
36-
_extendedPlayerManager = extendedPlayerManager;
36+
_sessionManager = sessionManager;
3737

3838
_allLights = gameplayAnimator.GetField<LightsAnimator[], MultiplayerGameplayAnimator>("_allLightsAnimators");
3939
_gameplayLights = gameplayAnimator.GetField<LightsAnimator[], MultiplayerGameplayAnimator>("_gameplayLightsAnimators");

0 commit comments

Comments
 (0)