Skip to content

Commit 7594356

Browse files
authored
Merge pull request #90 from Zingabopp/dev
Improve networking / New BT support
2 parents 19c38c7 + f51ec62 commit 7594356

File tree

12 files changed

+118
-79
lines changed

12 files changed

+118
-79
lines changed

MultiplayerExtensions/Environments/PlayerColorManager.cs renamed to MultiplayerExtensions/Environments/LobbyEnvironmentManager.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
using MultiplayerExtensions.Packets;
22
using MultiplayerExtensions.Sessions;
33
using System;
4+
using System.Linq;
45
using UnityEngine;
56
using Zenject;
67

78
namespace MultiplayerExtensions.Environments
89
{
9-
public class PlayerColorManager : IInitializable, IDisposable
10+
public class LobbyEnvironmentManager : IInitializable, IDisposable
1011
{
1112
protected readonly PacketManager _packetManager;
1213
protected readonly IMultiplayerSessionManager _sessionManager;
1314
protected readonly LobbyPlaceManager _placeManager;
1415
protected readonly ExtendedPlayerManager _playerManager;
1516

16-
internal PlayerColorManager(PacketManager packetManager, IMultiplayerSessionManager sessionManager, LobbyPlaceManager placeManager, ExtendedPlayerManager playerManager)
17+
internal LobbyEnvironmentManager(PacketManager packetManager, IMultiplayerSessionManager sessionManager, LobbyPlaceManager placeManager, ExtendedPlayerManager playerManager)
1718
{
1819
_packetManager = packetManager;
1920
_sessionManager = sessionManager;
@@ -37,6 +38,10 @@ public void Dispose()
3738

3839
private void HandleLobbyEnvironmentLoaded(object sender, System.EventArgs e)
3940
{
41+
MenuEnvironmentManager envManager = Resources.FindObjectsOfTypeAll<MenuEnvironmentManager>().First();
42+
bool flag = _sessionManager.maxPlayerCount <= 30;
43+
envManager.transform.Find("NearBuildingLeft").gameObject.SetActive(flag);
44+
envManager.transform.Find("NearBuildingRight").gameObject.SetActive(flag);
4045
ReloadEnvironment();
4146
}
4247

MultiplayerExtensions/HarmonyPatches/HarmonyManager.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ internal static Harmony Harmony
2323

2424
internal static readonly HashSet<HarmonyPatchInfo> AppliedPatches = new HashSet<HarmonyPatchInfo>();
2525
internal static readonly HashSet<HarmonyPatchInfo> DefaultPatches = new HashSet<HarmonyPatchInfo>();
26-
internal static readonly Dictionary<HarmonyPatchInfo, string> DependentPatches = new Dictionary<HarmonyPatchInfo, string>();
2726

2827
static HarmonyManager()
2928
{
@@ -36,6 +35,12 @@ static HarmonyManager()
3635
AddDefaultPatch<SetLobbyCodePatch>();
3736
AddDefaultPatch<LobbyEnvironmentLoadPatch>();
3837
AddDefaultPatch<StartGameLevelEntitlementPatch>();
38+
AddDefaultPatch<UpdateReliableFrequencyPatch>();
39+
AddDefaultPatch<UpdateUnreliableFrequencyPatch>();
40+
AddDefaultPatch<PlayerPlacementAnglePatch>();
41+
AddDefaultPatch<IncreaseMaxPlayersClampPatch>();
42+
AddDefaultPatch<IncreaseMaxPlayersPatch>();
43+
//AddDefaultPatch<RemoveByteLimitPatch>(); (doesn't support generics)
3944
}
4045

4146
private static void AddDefaultPatch<T>() where T : class
@@ -92,12 +97,6 @@ internal static void ApplyDefaultPatches()
9297
Plugin.Log?.Debug($"Applying {patches.Length} Harmony patches.");
9398
for (int i = 0; i < patches.Length; i++)
9499
ApplyPatch(patches[i]);
95-
96-
foreach (HarmonyPatchInfo patch in DependentPatches.Keys)
97-
{
98-
if (IPA.Loader.PluginManager.GetPluginFromId(DependentPatches[patch]) != null)
99-
ApplyPatch(patch);
100-
}
101100
}
102101

103102
internal static void UnpatchAll()

MultiplayerExtensions/HarmonyPatches/MaxPlayerPatches.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
namespace MultiplayerExtensions.HarmonyPatches
88
{
99
[HarmonyPatch(typeof(MultiplayerPlayerPlacement), "GetAngleBetweenPlayersWithEvenAdjustment", MethodType.Normal)]
10-
class PlayerPlacementAnglePatch
10+
internal class PlayerPlacementAnglePatch
1111
{
12-
static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
12+
internal static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
1313
{
1414
var codes = instructions.ToList();
1515
bool flag = true;
@@ -31,29 +31,31 @@ static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> inst
3131
}
3232

3333
[HarmonyPatch(typeof(CreateServerFormController), "formData", MethodType.Getter)]
34-
class IncreaseMaxPlayersClampPatch
34+
internal class IncreaseMaxPlayersClampPatch
3535
{
36-
static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
36+
internal static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
3737
{
3838
var codes = instructions.ToList();
3939
for (int i = 0; i < codes.Count; i++)
4040
{
4141
if (codes[i].opcode == OpCodes.Ldc_R4 && codes[i].OperandIs(5))
4242
{
43-
codes[i] = new CodeInstruction(OpCodes.Ldc_R4, 20f);
43+
codes[i] = new CodeInstruction(OpCodes.Ldc_R4, (float)Plugin.Config.MaxPlayers);
4444
}
4545
}
4646
return codes.AsEnumerable();
4747
}
4848
}
4949

5050
[HarmonyPatch(typeof(CreateServerFormController), "Setup", MethodType.Normal)]
51-
class IncreaseMaxPlayersPatch
51+
internal class IncreaseMaxPlayersPatch
5252
{
53-
static void Prefix(CreateServerFormController __instance)
53+
internal static void Prefix(CreateServerFormController __instance)
5454
{
55+
int maxPlayers = MPState.CurrentMasterServer.isOfficial ? 5 : Plugin.Config.MaxPlayers;
56+
float[] playerValues = Enumerable.Range(2, maxPlayers-1).Select(x => (float)x).ToArray();
5557
FormattedFloatListSettingsController serverForm = __instance.GetField<FormattedFloatListSettingsController, CreateServerFormController>("_maxPlayersList");
56-
serverForm.values = new float[] { 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 10f, 11f, 12f, 13f, 14f, 15f, 16f, 17f, 18f, 19f, 20f };
58+
serverForm.values = playerValues;
5759
}
5860
}
5961
}
Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
using HarmonyLib;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection.Emit;
5+
using UnityEngine;
26

37
namespace MultiplayerExtensions.HarmonyPatches
48
{
@@ -8,32 +12,83 @@ namespace MultiplayerExtensions.HarmonyPatches
812
[HarmonyPatch(typeof(NetworkConfigSO), "masterServerEndPoint", MethodType.Getter)]
913
internal class GetMasterServerEndPointPatch
1014
{
11-
[HarmonyAfter("mod.serverbrowser")]
15+
[HarmonyAfter("mod.serverbrowser", "com.Python.BeatTogether")]
1216
[HarmonyPriority(Priority.Last)]
1317
internal static void Postfix(NetworkConfigSO __instance, ref MasterServerEndPoint __result)
1418
{
15-
if (__result != null)
16-
{
17-
MasterServerInfo info = new MasterServerInfo(__result);
18-
if (MPState.CurrentMasterServer.Equals(info))
19-
return;
20-
MPState.CurrentMasterServer = info;
21-
MPEvents.RaiseMasterServerChanged(__instance, info);
22-
}
19+
if (MPState.CurrentMasterServer.Equals(__result))
20+
return;
21+
MPState.CurrentMasterServer = new MasterServerInfo(__result.hostName, __result.port, __instance.masterServerStatusUrl);
22+
MPEvents.RaiseMasterServerChanged(__instance, MPState.CurrentMasterServer);
2323
}
2424
}
2525

26+
/// <summary>
27+
/// For retrieving the currently used Master Server Status URL.
28+
/// </summary>
2629
[HarmonyPatch(typeof(MultiplayerSettingsPanelController), "SetLobbyCode", MethodType.Normal)]
2730
internal class SetLobbyCodePatch
28-
{
29-
[HarmonyAfter("mod.serverbrowser")]
31+
{
32+
[HarmonyAfter("mod.serverbrowser", "com.Python.BeatTogether")]
3033
[HarmonyPriority(Priority.Last)]
31-
public static void Postfix(MultiplayerSettingsPanelController __instance, string code)
34+
internal static void Postfix(MultiplayerSettingsPanelController __instance, string code)
3235
{
3336
if (code == MPState.LastRoomCode)
3437
return;
3538
MPState.LastRoomCode = code;
3639
MPEvents.RaiseRoomCodeChanged(__instance, code);
3740
}
3841
}
42+
43+
[HarmonyPatch(typeof(ConnectedPlayerManager), "FlushReliableQueue", MethodType.Normal)]
44+
internal class UpdateReliableFrequencyPatch
45+
{
46+
private static float nextTime = 0f;
47+
private static float frequency = 0.1f;
48+
49+
internal static bool Prefix()
50+
{
51+
if (Time.time > nextTime)
52+
{
53+
nextTime = Time.time + frequency;
54+
return true;
55+
}
56+
return false;
57+
}
58+
}
59+
60+
[HarmonyPatch(typeof(ConnectedPlayerManager), "FlushUnreliableQueue", MethodType.Normal)]
61+
internal class UpdateUnreliableFrequencyPatch
62+
{
63+
private static float nextTime = 0f;
64+
private static float frequency = 0.1f;
65+
66+
internal static bool Prefix()
67+
{
68+
if (Time.time > nextTime)
69+
{
70+
nextTime = Time.time + frequency;
71+
return true;
72+
}
73+
return false;
74+
}
75+
}
76+
77+
//Make this work with harmony manager
78+
[HarmonyPatch(typeof(ConnectedPlayerManager), "SendUnreliable", MethodType.Normal)]
79+
internal class RemoveByteLimitPatch
80+
{
81+
internal static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
82+
{
83+
var codes = instructions.ToList();
84+
for (int i = 0; i < codes.Count; i++)
85+
{
86+
if (codes[i].opcode == OpCodes.Ble_S)
87+
{
88+
codes[i] = new CodeInstruction(OpCodes.Br_S, codes[i].operand);
89+
}
90+
}
91+
return codes.AsEnumerable();
92+
}
93+
}
3994
}

MultiplayerExtensions/Installers/InterfaceInstaller.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class InterfaceInstaller : MonoInstaller
1111
public override void InstallBindings()
1212
{
1313
Container.BindInterfacesAndSelfTo<LobbyPlaceManager>().AsSingle();
14-
Container.BindInterfacesAndSelfTo<PlayerColorManager>().AsSingle();
14+
Container.BindInterfacesAndSelfTo<LobbyEnvironmentManager>().AsSingle();
1515
}
1616

1717
public override void Start()

MultiplayerExtensions/Installers/MultiplayerInstaller.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ class MultiplayerInstaller : MonoInstaller
1010
public HarmonyPatchInfo? lobbyPlayerDataPatch;
1111
public HarmonyPatchInfo? levelLoaderPatch;
1212

13-
public override void InstallBindings()
14-
{
15-
Plugin.Log?.Info("Injecting Dependencies");
16-
Container.BindInterfacesAndSelfTo<PacketManager>().AsSingle();
17-
Container.BindInterfacesAndSelfTo<SessionManager>().AsSingle();
18-
Container.BindInterfacesAndSelfTo<ExtendedPlayerManager>().AsSingle();
19-
}
13+
public override void InstallBindings()
14+
{
15+
Plugin.Log?.Info("Injecting Dependencies");
16+
Container.BindInterfacesAndSelfTo<PacketManager>().AsSingle();
17+
Container.BindInterfacesAndSelfTo<SessionManager>().AsSingle();
18+
Container.BindInterfacesAndSelfTo<ExtendedPlayerManager>().AsSingle();
19+
var _ = Container.Resolve<NetworkConfigSO>().masterServerEndPoint;
20+
}
2021

2122
public override void Start()
2223
{

MultiplayerExtensions/MPEvents.cs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using MultiplayerExtensions.Utilities;
44

@@ -81,23 +81,14 @@ public struct MasterServerInfo : IEquatable<MasterServerInfo>, IEquatable<Master
8181
{
8282
public readonly string hostname;
8383
public readonly int port;
84+
public readonly string statusURL;
8485
public readonly bool isOfficial => hostname.Contains("beatsaber.com");
8586

86-
public MasterServerInfo(string hostname, int port)
87+
public MasterServerInfo(string hostname, int port, string statusURL)
8788
{
8889
this.hostname = hostname;
8990
this.port = port;
90-
}
91-
public MasterServerInfo(MasterServerEndPoint endPoint)
92-
{
93-
if (endPoint == null)
94-
{
95-
hostname = "localhost";
96-
port = 2328;
97-
return;
98-
}
99-
hostname = endPoint.hostName;
100-
port = endPoint.port;
91+
this.statusURL = statusURL;
10192
}
10293

10394
public override string ToString()
@@ -114,6 +105,11 @@ public bool Equals(MasterServerEndPoint endPoint)
114105
return endPoint.hostName == hostname && endPoint.port == port;
115106
}
116107

108+
public bool Equals(string status)
109+
{
110+
return status == statusURL;
111+
}
112+
117113
public override bool Equals(object obj)
118114
{
119115
if (obj is MasterServerEndPoint endPoint)

MultiplayerExtensions/MPState.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
{
33
public static class MPState
44
{
5-
private static MasterServerInfo _masterServerEndPoint = new MasterServerInfo("localhost", 2328);
5+
private static MasterServerInfo _masterServerEndPoint = new MasterServerInfo("localhost", 2328, "");
66
/// <summary>
77
/// The current known Master Server.
88
/// </summary>

MultiplayerExtensions/MultiplayerExtensions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<OutputType>Library</OutputType>
55
<AppDesignerFolder>Properties</AppDesignerFolder>
66
<AssemblyName>MultiplayerExtensions</AssemblyName>
7-
<AssemblyVersion>0.4.3</AssemblyVersion>
7+
<AssemblyVersion>0.4.4</AssemblyVersion>
88
<TargetFramework>net472</TargetFramework>
99
<DebugSymbols>true</DebugSymbols>
1010
<DebugType>portable</DebugType>

MultiplayerExtensions/Plugin.cs

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -53,34 +53,15 @@ public Plugin(IPALogger logger, Config conf, Zenjector zenjector, PluginMetadata
5353
public void OnApplicationStart()
5454
{
5555
Plugin.Log?.Info($"MultiplayerExtensions: '{VersionInfo.Description}'");
56+
57+
if (Plugin.Config.MaxPlayers > 100)
58+
Plugin.Config.MaxPlayers = 100;
59+
if (Plugin.Config.MaxPlayers < 10)
60+
Plugin.Config.MaxPlayers = 10;
61+
5662
HarmonyManager.ApplyDefaultPatches();
5763
Task versionTask = CheckVersion();
5864
MPEvents_Test();
59-
60-
playerPlacementAnglePatch = HarmonyManager.GetPatch<PlayerPlacementAnglePatch>()!;
61-
increaseMaxPlayersClampPatch = HarmonyManager.GetPatch<IncreaseMaxPlayersClampPatch>()!;
62-
increaseMaxPlayersPatch = HarmonyManager.GetPatch<IncreaseMaxPlayersPatch>()!;
63-
MPEvents.MasterServerChanged += MasterServerChanged;
64-
}
65-
66-
private HarmonyPatchInfo playerPlacementAnglePatch;
67-
private HarmonyPatchInfo increaseMaxPlayersClampPatch;
68-
private HarmonyPatchInfo increaseMaxPlayersPatch;
69-
70-
private void MasterServerChanged(object sender, MasterServerInfo e)
71-
{
72-
if (!e.isOfficial)
73-
{
74-
playerPlacementAnglePatch.ApplyPatch();
75-
increaseMaxPlayersClampPatch.ApplyPatch();
76-
increaseMaxPlayersPatch.ApplyPatch();
77-
}
78-
else
79-
{
80-
playerPlacementAnglePatch.RemovePatch();
81-
increaseMaxPlayersClampPatch.RemovePatch();
82-
increaseMaxPlayersPatch.RemovePatch();
83-
}
8465
}
8566

8667
[Conditional("DEBUG")]
@@ -93,7 +74,6 @@ public void MPEvents_Test()
9374
else
9475
Log?.Warn($"Beatmap Cleared by '{e.UserId}|{e.UserType.ToString()}'");
9576
};
96-
9777
}
9878

9979
[OnExit]

0 commit comments

Comments
 (0)