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