diff --git a/src/CrowdedMod/CrowdedMod.csproj b/src/CrowdedMod/CrowdedMod.csproj index 2789976..881faf4 100644 --- a/src/CrowdedMod/CrowdedMod.csproj +++ b/src/CrowdedMod/CrowdedMod.csproj @@ -11,7 +11,7 @@ Steam - 2024.9.4 + 2025.9.9 diff --git a/src/CrowdedMod/CrowdedModPlugin.cs b/src/CrowdedMod/CrowdedModPlugin.cs index 7a18fb2..b7b937a 100644 --- a/src/CrowdedMod/CrowdedModPlugin.cs +++ b/src/CrowdedMod/CrowdedModPlugin.cs @@ -5,7 +5,9 @@ using Reactor.Networking; using Reactor.Networking.Attributes; using Reactor.Utilities; +using System; using System.Linq; +using UnityEngine.SceneManagement; namespace CrowdedMod; @@ -16,7 +18,7 @@ namespace CrowdedMod; [BepInDependency("gg.reactor.debugger", BepInDependency.DependencyFlags.SoftDependency)] public partial class CrowdedModPlugin : BasePlugin { - public const int MaxPlayers = 254; // allegedly. should stick to 127 tho + public const int MaxPlayers = 250; // allegedly. should stick to 127 tho public const int MaxImpostors = MaxPlayers / 2; public static bool ForceDisableFreeColor { get; set; } = false; @@ -29,7 +31,13 @@ public override void Load() Harmony.PatchAll(); - RemoveVanillaServer(); + SceneManager.add_sceneLoaded((Action)((scene, _) => + { + if (scene.name == "MainMenu") + { + RemoveVanillaServer(); + } + })); } public static void RemoveVanillaServer() diff --git a/src/CrowdedMod/Patches/GenericPatches.cs b/src/CrowdedMod/Patches/GenericPatches.cs index 4a8802e..ec90602 100644 --- a/src/CrowdedMod/Patches/GenericPatches.cs +++ b/src/CrowdedMod/Patches/GenericPatches.cs @@ -1,5 +1,6 @@ using System.Linq; using AmongUs.GameOptions; +using AmongUs.Data; using CrowdedMod.Net; using HarmonyLib; using Hazel; @@ -73,19 +74,27 @@ public static bool Prefix(PlayerTab __instance) // I did not find a use of this method, but still patching for future updates // maxExpectedPlayers is unknown, looks like server code tbh - [HarmonyPatch(typeof(GameOptionsData), nameof(GameOptionsData.AreInvalid))] - public static class InvalidOptionsPatches + [HarmonyPatch(typeof(HideNSeekGameOptionsV10), nameof(HideNSeekGameOptionsV10.AreInvalid))] + public static class InvalidHnSOptionsPatches { - public static bool Prefix(GameOptionsData __instance, [HarmonyArgument(0)] int maxExpectedPlayers) - { - return __instance.MaxPlayers > maxExpectedPlayers || - __instance.NumImpostors < 1 || - __instance.NumImpostors + 1 > maxExpectedPlayers / 2 || - __instance.KillDistance is < 0 or > 2 || - __instance.PlayerSpeedMod is <= 0f or > 3f; - } + public static bool Prefix(HideNSeekGameOptionsV10 __instance, [HarmonyArgument(0)] int maxExpectedPlayers) + => IsOptionValid(__instance.Cast(), maxExpectedPlayers); + } + + [HarmonyPatch(typeof(NormalGameOptionsV10), nameof(NormalGameOptionsV10.AreInvalid))] + public static class InvalidNormalOptionsPatches + { + public static bool Prefix(NormalGameOptionsV10 __instance, [HarmonyArgument(0)] int maxExpectedPlayers) + => IsOptionValid(__instance.Cast(), maxExpectedPlayers); } + private static bool IsOptionValid(IGameOptions option, int maxExpectedPlayers) + => option.MaxPlayers > maxExpectedPlayers || + option.NumImpostors < 1 || + option.NumImpostors + 1 > maxExpectedPlayers / 2 || + option.GetInt(Int32OptionNames.KillDistance) is < 0 or > 2 || + option.GetFloat(FloatOptionNames.PlayerSpeedMod) is <= 0f or > 3f; + [HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))] public static class GameStartManagerUpdatePatch { @@ -147,7 +156,6 @@ public static bool Prefix(InnerNetServer __instance, [HarmonyArgument(0)] InnerN { client.LimboState = LimboStates.NotLimbo; } - var writer = MessageWriter.Get(SendOption.Reliable); try { @@ -170,6 +178,20 @@ public static bool Prefix(InnerNetServer __instance, [HarmonyArgument(0)] InnerN } } + [HarmonyPatch(typeof(CreateGameOptions), nameof(CreateGameOptions.Show))] + public static class CreateGameOptionsShowPatch + { + [HarmonyPostfix, HarmonyPriority(Priority.Last)] + public static void Postfix(CreateGameOptions __instance) + { + var numberOption = __instance.gameObject.GetComponentInChildren(true); + if (numberOption != null) + { + numberOption.ValidRange.max = CrowdedModPlugin.MaxPlayers; + } + } + } + private static void TryAdjustOptionsRecommendations(GameOptionsManager manager) { const int MaxPlayers = CrowdedModPlugin.MaxPlayers; @@ -229,13 +251,15 @@ public static void Postfix(GameOptionsManager __instance) [HarmonyPatch(typeof(GameManager), nameof(GameManager.Awake))] public static class GameManager_Awake { + [HarmonyPostfix, HarmonyPriority(Priority.Last)] public static void Postfix(GameManager __instance) { foreach (var category in __instance.GameSettingsList.AllCategories) { foreach (var option in category.AllGameSettings) { - if (option is IntGameSetting intOption && option.Title == StringNames.GameNumImpostors) + var intOption = option.TryCast(); + if (intOption != null && option.Title == StringNames.GameNumImpostors) { intOption.ValidRange = new IntRange(1, CrowdedModPlugin.MaxImpostors); return; @@ -244,13 +268,4 @@ public static void Postfix(GameManager __instance) } } } - - [HarmonyPatch(typeof(MainMenuManager), nameof(MainMenuManager.Start))] - public static class RemoveVanillaServerPatch - { - public static void Postfix() - { - CrowdedModPlugin.RemoveVanillaServer(); - } - } } \ No newline at end of file