From 41f8d14a031579d24850448e5b1dd26584f0211a Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Thu, 25 Sep 2025 18:33:10 +0200 Subject: [PATCH 01/21] Support for New Create Game Menu - CreateGameOptions has been removed because it is unnecessary. - PingTracker has been removed, but replaced with the ReactorCredits. Tested on versions 16.0.0 - 17.0.0 and everything works correctly. --- src/AleLuduMod/AleLuduMod.csproj | 4 +- src/AleLuduMod/AleLuduModPlugin.cs | 20 +- .../Patches/CreateGameOptionsPatches.cs | 178 ------------------ src/AleLuduMod/Patches/GenericPatches.cs | 74 ++++++-- 4 files changed, 69 insertions(+), 207 deletions(-) delete mode 100644 src/AleLuduMod/Patches/CreateGameOptionsPatches.cs diff --git a/src/AleLuduMod/AleLuduMod.csproj b/src/AleLuduMod/AleLuduMod.csproj index 854a6e8..ca5a761 100644 --- a/src/AleLuduMod/AleLuduMod.csproj +++ b/src/AleLuduMod/AleLuduMod.csproj @@ -15,11 +15,11 @@ - + - + diff --git a/src/AleLuduMod/AleLuduModPlugin.cs b/src/AleLuduMod/AleLuduModPlugin.cs index 1502d84..b8b0926 100644 --- a/src/AleLuduMod/AleLuduModPlugin.cs +++ b/src/AleLuduMod/AleLuduModPlugin.cs @@ -1,30 +1,26 @@ -using AmongUs.GameOptions; -using BepInEx; +using BepInEx; +using BepInEx.Configuration; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Reactor; -using BepInEx.Configuration; -using System.Linq; +using Reactor.Utilities; namespace AleLuduMod; -[BepInAutoPlugin("pl.townofus.aleludu")] +[BepInAutoPlugin("pl.aleludumod.plugin")] [BepInProcess("Among Us.exe")] [BepInDependency(ReactorPlugin.Id)] [BepInDependency("gg.reactor.debugger", BepInDependency.DependencyFlags.SoftDependency)] // fix debugger overwriting MinPlayers -[BepInDependency("com.slushiegoose.townofus", BepInDependency.DependencyFlags.SoftDependency)] // load after town of us public partial class AleLuduModPlugin : BasePlugin { - public const int MaxPlayers = 36; - public const int MaxImpostors = 36 / 2; + public const int MaxPlayers = 35; + public const int MaxImpostors = MaxPlayers / 2; public static ConfigEntry Force4Columns { get; set; } private Harmony Harmony { get; } = new(Id); public override void Load() - { - NormalGameOptionsV09.RecommendedImpostors = NormalGameOptionsV09.MaxImpostors = Enumerable.Repeat(36, 36).ToArray(); - NormalGameOptionsV09.MinPlayers = Enumerable.Repeat(4, 36).ToArray(); - HideNSeekGameOptionsV09.MinPlayers = Enumerable.Repeat(4, 36).ToArray(); + { + ReactorCredits.Register(ReactorCredits.AlwaysShow); Force4Columns = Config.Bind("Settings", "Force 4 columns", true, "Always display 4 columns in meeting, vitals, etc."); diff --git a/src/AleLuduMod/Patches/CreateGameOptionsPatches.cs b/src/AleLuduMod/Patches/CreateGameOptionsPatches.cs deleted file mode 100644 index 722f751..0000000 --- a/src/AleLuduMod/Patches/CreateGameOptionsPatches.cs +++ /dev/null @@ -1,178 +0,0 @@ -using AmongUs.GameOptions; -using HarmonyLib; -using Reactor.Utilities.Extensions; -using System; -using TMPro; -using UnityEngine; - -namespace AleLuduMod.Patches; - -internal static class CreateGameOptionsPatches -{ - [HarmonyPatch(typeof(CreateOptionsPicker), nameof(CreateOptionsPicker.Awake))] - public static class CreateOptionsPicker_Awake - { - public static void Postfix(CreateOptionsPicker __instance) - { - if (__instance.mode != SettingsMode.Host) return; - - { - var firstButtonRenderer = __instance.MaxPlayerButtons[0]; - firstButtonRenderer.GetComponentInChildren().text = "-"; - firstButtonRenderer.enabled = false; - - var firstButtonButton = firstButtonRenderer.GetComponent(); - firstButtonButton.OnClick.RemoveAllListeners(); - firstButtonButton.OnClick.AddListener((Action)(() => - { - for (var i = 1; i < 11; i++) - { - var playerButton = __instance.MaxPlayerButtons[i]; - - var tmp = playerButton.GetComponentInChildren(); - var newValue = Mathf.Max(byte.Parse(tmp.text) - 10, byte.Parse(playerButton.name) - 2); - tmp.text = newValue.ToString(); - } - - __instance.UpdateMaxPlayersButtons(__instance.GetTargetOptions()); - })); - firstButtonRenderer.Destroy(); - - var lastButtonRenderer = __instance.MaxPlayerButtons[^1]; - lastButtonRenderer.GetComponentInChildren().text = "+"; - lastButtonRenderer.enabled = false; - - var lastButtonButton = lastButtonRenderer.GetComponent(); - lastButtonButton.OnClick.RemoveAllListeners(); - lastButtonButton.OnClick.AddListener((Action)(() => - { - for (var i = 1; i < 11; i++) - { - var playerButton = __instance.MaxPlayerButtons[i]; - - var tmp = playerButton.GetComponentInChildren(); - var newValue = Mathf.Min(byte.Parse(tmp.text) + 10, - AleLuduModPlugin.MaxPlayers - 14 + byte.Parse(playerButton.name)); - tmp.text = newValue.ToString(); - } - - __instance.UpdateMaxPlayersButtons(__instance.GetTargetOptions()); - })); - lastButtonRenderer.Destroy(); - - for (var i = 1; i < 11; i++) - { - var playerButton = __instance.MaxPlayerButtons[i].GetComponent(); - var text = playerButton.GetComponentInChildren(); - - playerButton.OnClick.RemoveAllListeners(); - playerButton.OnClick.AddListener((Action)(() => - { - var maxPlayers = byte.Parse(text.text); - var maxImp = Mathf.Min(__instance.GetTargetOptions().NumImpostors, maxPlayers / 2); - __instance.GetTargetOptions().SetInt(Int32OptionNames.NumImpostors, maxImp); - __instance.ImpostorButtons[1].TextMesh.text = maxImp.ToString(); - __instance.SetMaxPlayersButtons(maxPlayers); - })); - } - - foreach (var button in __instance.MaxPlayerButtons) - { - button.enabled = button.GetComponentInChildren().text == __instance.GetTargetOptions().MaxPlayers.ToString(); - } - } - - if (__instance.GetTargetOptions().GameMode is GameModes.Normal or GameModes.NormalFools) - { - var secondButton = __instance.ImpostorButtons[1]; - secondButton.SpriteRenderer.enabled = false; - secondButton.transform.FindChild("ConsoleHighlight").gameObject.Destroy(); - secondButton.PassiveButton.Destroy(); - secondButton.BoxCollider.Destroy(); - - var secondButtonText = secondButton.TextMesh; - secondButtonText.text = __instance.GetTargetOptions().NumImpostors.ToString(); - - var firstButton = __instance.ImpostorButtons[0]; - firstButton.SpriteRenderer.enabled = false; - firstButton.TextMesh.text = "-"; - - var firstPassiveButton = firstButton.PassiveButton; - firstPassiveButton.OnClick.RemoveAllListeners(); - firstPassiveButton.OnClick.AddListener((Action)(() => - { - var newVal = Mathf.Clamp( - byte.Parse(secondButtonText.text) - 1, - 1, - __instance.GetTargetOptions().MaxPlayers / 2 - ); - __instance.SetImpostorButtons(newVal); - secondButtonText.text = newVal.ToString(); - })); - - var thirdButton = __instance.ImpostorButtons[2]; - thirdButton.SpriteRenderer.enabled = false; - thirdButton.TextMesh.text = "+"; - - var thirdPassiveButton = thirdButton.PassiveButton; - thirdPassiveButton.OnClick.RemoveAllListeners(); - thirdPassiveButton.OnClick.AddListener((Action)(() => - { - var newVal = Mathf.Clamp( - byte.Parse(secondButtonText.text) + 1, - 1, - __instance.GetTargetOptions().MaxPlayers / 2 - ); - __instance.SetImpostorButtons(newVal); - secondButtonText.text = newVal.ToString(); - })); - } - } - } - - [HarmonyPatch(typeof(CreateOptionsPicker), nameof(CreateOptionsPicker.UpdateMaxPlayersButtons))] - public static class CreateOptionsPicker_UpdateMaxPlayersButtons - { - public static bool Prefix(CreateOptionsPicker __instance, [HarmonyArgument(0)] IGameOptions opts) - { - if (__instance.mode != SettingsMode.Host) return true; - if (__instance.CrewArea) - { - __instance.CrewArea.SetCrewSize(opts.MaxPlayers, opts.NumImpostors); - } - - var selectedAsString = opts.MaxPlayers.ToString(); - for (var i = 1; i < __instance.MaxPlayerButtons.Count - 1; i++) - { - __instance.MaxPlayerButtons[i].enabled = __instance.MaxPlayerButtons[i].GetComponentInChildren().text == selectedAsString; - } - - return false; - } - } - - [HarmonyPatch(typeof(CreateOptionsPicker), nameof(CreateOptionsPicker.UpdateImpostorsButtons))] - public static class CreateOptionsPicker_UpdateImpostorsButtons - { - public static bool Prefix(CreateOptionsPicker __instance) - { - if (__instance.mode == SettingsMode.Host) return false; - return true; - } - } - - [HarmonyPatch(typeof(CreateOptionsPicker), nameof(CreateOptionsPicker.Refresh))] - public static class CreateOptionsPicker_Refresh - { - public static bool Prefix(CreateOptionsPicker __instance) - { - IGameOptions targetOptions = __instance.GetTargetOptions(); - __instance.UpdateImpostorsButtons(targetOptions.NumImpostors); - __instance.UpdateMaxPlayersButtons(targetOptions); - __instance.UpdateLanguageButton((uint)targetOptions.Keywords); - __instance.MapMenu.UpdateMapButtons((int)targetOptions.MapId); - __instance.GameModeText.text = DestroyableSingleton.Instance.GetString(GameModesHelpers.ModeToName[GameOptionsManager.Instance.CurrentGameOptions.GameMode]); - return false; - } - } -} diff --git a/src/AleLuduMod/Patches/GenericPatches.cs b/src/AleLuduMod/Patches/GenericPatches.cs index a18c20b..651d269 100644 --- a/src/AleLuduMod/Patches/GenericPatches.cs +++ b/src/AleLuduMod/Patches/GenericPatches.cs @@ -1,13 +1,14 @@ using AmongUs.GameOptions; using HarmonyLib; +using Il2CppInterop.Runtime.InteropTypes.Arrays; +using Il2CppSystem.Reflection; +using Reactor.Utilities; using System.Linq; namespace AleLuduMod.Patches; internal static class GenericPatches { - - // 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(LegacyGameOptions), nameof(LegacyGameOptions.AreInvalid))] @@ -23,30 +24,73 @@ __instance.KillDistance is < 0 or > 2 || } } - - [HarmonyPatch(typeof(PingTracker), nameof(PingTracker.Update))] - public static class PingShowerPatch + [HarmonyPatch(typeof(GameStartManager), nameof(GameStartManager.Update))] + public static class GameStartManagerUpdatePatch { - public static void Postfix(PingTracker __instance) + [HarmonyPostfix] + [HarmonyPatch(typeof(CreateGameOptions), nameof(CreateGameOptions.Show))] + public static void CreateGameOptionsShowPostfix(CreateGameOptions __instance) { - __instance.text.text += "\ntownofus.pl"; + var numberOption = __instance.gameObject.GetComponentInChildren(true); + if (numberOption != null) + { + numberOption.ValidRange.max = AleLuduModPlugin.MaxPlayers; + } } } + private static void TryAdjustOptionsRecommendations(GameOptionsManager manager) + { + const int MaxPlayers = AleLuduModPlugin.MaxPlayers; + var type = manager.GetGameOptions(); + var options = manager.GameHostOptions.Cast(); - [HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Initialize))] - public static class GameOptionsMenu_Initialize + var maxRecommendation = ((Il2CppStructArray)Enumerable.Repeat(MaxPlayers, MaxPlayers + 1).ToArray()) + .Cast(); + var minRecommendation = ((Il2CppStructArray)Enumerable.Repeat(4, MaxPlayers + 1).ToArray()) + .Cast(); + var killRecommendation = ((Il2CppStructArray)Enumerable.Repeat(0, MaxPlayers + 1).ToArray()) + .Cast(); + + + const BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static; + // all these fields are currently static, but we're doing a forward compat + // static fields ignore object param so non-null instance is ok + type.GetField("RecommendedImpostors", flags)?.SetValue(options, maxRecommendation); + type.GetField("MaxImpostors", flags)?.SetValue(options, maxRecommendation); + type.GetField("RecommendedKillCooldown", flags)?.SetValue(options, killRecommendation); + type.GetField("MinPlayers", flags)?.SetValue(options, minRecommendation); + } + + [HarmonyPatch(typeof(GameOptionsManager), nameof(GameOptionsManager.GameHostOptions), MethodType.Setter)] + public static class GameOptionsManager_set_GameHostOptions { - public static void Postfix(GameOptionsMenu __instance) + public static void Postfix(GameOptionsManager __instance) { - var numberOptions = __instance.GetComponentsInChildren(); - - var impostorsOption = numberOptions.FirstOrDefault(o => o.Title == StringNames.GameNumImpostors); - if (impostorsOption != null) + try { - impostorsOption.ValidRange = new FloatRange(1, AleLuduModPlugin.MaxImpostors); + TryAdjustOptionsRecommendations(__instance); } + catch (System.Exception e) + { + Logger.Error($"Failed to adjust options recommendations: {e}"); + } + } + } + [HarmonyPatch(typeof(GameOptionsManager), nameof(GameOptionsManager.SwitchGameMode))] + public static class GameOptionsManager_SwitchGameMode + { + public static void Postfix(GameOptionsManager __instance) + { + try + { + TryAdjustOptionsRecommendations(__instance); + } + catch (System.Exception e) + { + Logger.Error($"Failed to adjust options recommendations: {e}"); + } } } } From 9cef64d5db90bbdf413e5ef4f7f0a508db9b2939 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Fri, 26 Sep 2025 08:36:08 +0200 Subject: [PATCH 02/21] Revert one changes --- src/AleLuduMod/AleLuduModPlugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AleLuduMod/AleLuduModPlugin.cs b/src/AleLuduMod/AleLuduModPlugin.cs index b8b0926..f94a1f9 100644 --- a/src/AleLuduMod/AleLuduModPlugin.cs +++ b/src/AleLuduMod/AleLuduModPlugin.cs @@ -7,7 +7,7 @@ namespace AleLuduMod; -[BepInAutoPlugin("pl.aleludumod.plugin")] +[BepInAutoPlugin("pl.townofus.aleludu")] [BepInProcess("Among Us.exe")] [BepInDependency(ReactorPlugin.Id)] [BepInDependency("gg.reactor.debugger", BepInDependency.DependencyFlags.SoftDependency)] // fix debugger overwriting MinPlayers From 7e86a78514a614ffeebab075856be4458f3ef8ce Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Fri, 26 Sep 2025 09:18:05 +0200 Subject: [PATCH 03/21] Update GenericPatches.cs --- src/AleLuduMod/Patches/GenericPatches.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/AleLuduMod/Patches/GenericPatches.cs b/src/AleLuduMod/Patches/GenericPatches.cs index 651d269..3fd0a54 100644 --- a/src/AleLuduMod/Patches/GenericPatches.cs +++ b/src/AleLuduMod/Patches/GenericPatches.cs @@ -93,4 +93,20 @@ public static void Postfix(GameOptionsManager __instance) } } } + + [HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Initialize))] + public static class GameOptionsMenu_Initialize + { + public static void Postfix(GameOptionsMenu __instance) + { + var numberOptions = __instance.GetComponentsInChildren(); + + var impostorsOption = numberOptions.FirstOrDefault(o => o.Title == StringNames.GameNumImpostors); + if (impostorsOption != null) + { + impostorsOption.ValidRange = new FloatRange(1, AleLuduModPlugin.MaxImpostors); + } + + } + } } From f513093188421024ecf80ee2c5b6afd64e35087e Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Fri, 26 Sep 2025 09:18:46 +0200 Subject: [PATCH 04/21] Update GenericPatches.cs --- src/AleLuduMod/Patches/GenericPatches.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/AleLuduMod/Patches/GenericPatches.cs b/src/AleLuduMod/Patches/GenericPatches.cs index 3fd0a54..b0506fe 100644 --- a/src/AleLuduMod/Patches/GenericPatches.cs +++ b/src/AleLuduMod/Patches/GenericPatches.cs @@ -106,7 +106,6 @@ public static void Postfix(GameOptionsMenu __instance) { impostorsOption.ValidRange = new FloatRange(1, AleLuduModPlugin.MaxImpostors); } - } } } From 7c54427c8ea19558bee75f47e6bbc42b3066e9fa Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Sat, 27 Sep 2025 21:29:39 +0200 Subject: [PATCH 05/21] Two new features. - SecurityLoggerPatch on Mira HQ - The server drop-down menu has been improved. --- src/AleLuduMod/Patches/ChatCommands.cs | 3 +- src/AleLuduMod/Patches/GenericPatches.cs | 11 +---- .../Patches/SecurityLoggerPatches.cs | 16 ++++++++ .../Patches/ServerDropdownPatches.cs | 40 +++++++++++++++++++ 4 files changed, 59 insertions(+), 11 deletions(-) create mode 100644 src/AleLuduMod/Patches/SecurityLoggerPatches.cs create mode 100644 src/AleLuduMod/Patches/ServerDropdownPatches.cs diff --git a/src/AleLuduMod/Patches/ChatCommands.cs b/src/AleLuduMod/Patches/ChatCommands.cs index 1f2c481..97be01b 100644 --- a/src/AleLuduMod/Patches/ChatCommands.cs +++ b/src/AleLuduMod/Patches/ChatCommands.cs @@ -14,8 +14,7 @@ public class Commands { public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] PlayerControl sourcePlayer , ref string chatText) { - if (__instance != HudManager.Instance.Chat) - return true; + if (__instance != HudManager.Instance.Chat) return true; // After entering the command, when you try to join the lobby it will show "X/15". Only after the game is over will there be a larger lobby. if (chatText.StartsWith("!limit ")) diff --git a/src/AleLuduMod/Patches/GenericPatches.cs b/src/AleLuduMod/Patches/GenericPatches.cs index b0506fe..6ae23aa 100644 --- a/src/AleLuduMod/Patches/GenericPatches.cs +++ b/src/AleLuduMod/Patches/GenericPatches.cs @@ -2,7 +2,6 @@ using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem.Reflection; -using Reactor.Utilities; using System.Linq; namespace AleLuduMod.Patches; @@ -71,10 +70,7 @@ public static void Postfix(GameOptionsManager __instance) { TryAdjustOptionsRecommendations(__instance); } - catch (System.Exception e) - { - Logger.Error($"Failed to adjust options recommendations: {e}"); - } + catch { } } } @@ -87,10 +83,7 @@ public static void Postfix(GameOptionsManager __instance) { TryAdjustOptionsRecommendations(__instance); } - catch (System.Exception e) - { - Logger.Error($"Failed to adjust options recommendations: {e}"); - } + catch { } } } diff --git a/src/AleLuduMod/Patches/SecurityLoggerPatches.cs b/src/AleLuduMod/Patches/SecurityLoggerPatches.cs new file mode 100644 index 0000000..c6ea7e6 --- /dev/null +++ b/src/AleLuduMod/Patches/SecurityLoggerPatches.cs @@ -0,0 +1,16 @@ +using HarmonyLib; +using Il2CppInterop.Runtime.InteropTypes.Arrays; + +namespace AleLuduMod.Patches; + +internal static class SecurityLoggerPatches +{ + [HarmonyPatch(typeof(SecurityLogger), nameof(SecurityLogger.Awake))] + public static class SecurityLoggerPatch + { + public static void Postfix(SecurityLogger __instance) + { + __instance.Timers = new Il2CppStructArray(AleLuduModPlugin.MaxPlayers); + } + } +} diff --git a/src/AleLuduMod/Patches/ServerDropdownPatches.cs b/src/AleLuduMod/Patches/ServerDropdownPatches.cs new file mode 100644 index 0000000..6ca86be --- /dev/null +++ b/src/AleLuduMod/Patches/ServerDropdownPatches.cs @@ -0,0 +1,40 @@ +using HarmonyLib; +using Il2CppInterop.Runtime.InteropTypes.Arrays; +using System; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace AleLuduMod.Patches; + +[HarmonyPatch(typeof(ServerDropdown), nameof(ServerDropdown.FillServerOptions))] +public static class ServerDropdownPatches +{ + public static bool Prefix(ServerDropdown __instance) + { + if (SceneManager.GetActiveScene().name == "FindAGame") return true; + SpriteRenderer bg = __instance.background; + bg.size = new Vector2(4, 1); + ServerManager sm = ServerManager.Instance; + TranslationController tc = TranslationController.Instance; + int totalCols = Mathf.Max(1, Mathf.CeilToInt(sm.AvailableRegions.Length / (float)5)); + int rowLimit = Mathf.Min(sm.AvailableRegions.Length, 5); + + for (var index = 0; index < sm.AvailableRegions.Length; index++) + { + IRegionInfo ri = sm.AvailableRegions[index]; + var b = __instance.ButtonPool.Get(); + b.transform.localPosition = new Vector3(((index / 5) - ((totalCols - 1) / 2f)) * 3.15f, __instance.y_posButton - (0.5f * (index % 5)), -1f); + b.Text.text = tc.GetStringWithDefault(ri.TranslateName, ri.Name, new Il2CppReferenceArray(0)); + b.Text.ForceMeshUpdate(); + b.Button.OnClick.RemoveAllListeners(); + b.Button.OnClick.AddListener((Action)(() => __instance.ChooseOption(ri))); + __instance.controllerSelectable.Add(b.Button); + } + + float h = 1.2f + (0.5f * (rowLimit - 1)); + float w = totalCols > 1 ? (3.15f * (totalCols - 1)) + bg.size.x : bg.size.x; + bg.transform.localPosition = new Vector3(0f, __instance.initialYPos - ((h - 1.2f) / 2f), 0f); + bg.size = new Vector2(w, h); + return false; + } +} \ No newline at end of file From a7e9f3464deff1923a9c538d60d1647518cbe082 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Wed, 1 Oct 2025 17:14:34 +0200 Subject: [PATCH 06/21] Cleaning code --- .../Components/MeetingHudBehaviour.cs | 27 +++++-------------- .../Components/ShapeshifterMenuBehaviour.cs | 26 +++++++----------- .../Components/VitalsHudBehaviour.cs | 9 +------ 3 files changed, 17 insertions(+), 45 deletions(-) diff --git a/src/AleLuduMod/Components/MeetingHudBehaviour.cs b/src/AleLuduMod/Components/MeetingHudBehaviour.cs index ec3d4ce..5bed6ee 100644 --- a/src/AleLuduMod/Components/MeetingHudBehaviour.cs +++ b/src/AleLuduMod/Components/MeetingHudBehaviour.cs @@ -10,10 +10,7 @@ namespace AleLuduMod.Components; [RegisterInIl2Cpp] public class MeetingHudBehaviour : MonoBehaviour { - public MeetingHudBehaviour(IntPtr ptr) : base(ptr) - { - } - + public MeetingHudBehaviour(IntPtr ptr) : base(ptr) {} internal MeetingHud meetingHud = null!; [HideFromIl2Cpp] @@ -21,31 +18,21 @@ public MeetingHudBehaviour(IntPtr ptr) : base(ptr) public void Start() { - - if (Targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value) - { - // dont change layout if players count is below 16 - return; - } - + if (Targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value) return; // dont change layout if players count is below 16 var i = 0; foreach (var button in Targets) { - button.gameObject.SetActive(true); - var row = i / 4; var col = i % 4; var buttonTransform = button.transform; buttonTransform.localScale *= 0.75f; - buttonTransform.localPosition = meetingHud.VoteOrigin + - new Vector3( - meetingHud.VoteButtonOffsets.x * col * 0.75f - 0.375f, - meetingHud.VoteButtonOffsets.y * row * 0.75f, - buttonTransform.localPosition.z - ); + buttonTransform.localPosition = meetingHud.VoteOrigin + new Vector3( + meetingHud.VoteButtonOffsets.x * col * 0.75f - 0.375f, + meetingHud.VoteButtonOffsets.y * row * 0.75f, + buttonTransform.localPosition.z + ); i++; } } - } diff --git a/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs b/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs index b52a698..0a91b4d 100644 --- a/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs +++ b/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs @@ -1,8 +1,8 @@ -using System; +using Il2CppInterop.Runtime.Attributes; +using Reactor.Utilities.Attributes; +using System; using System.Collections.Generic; using System.Linq; -using Il2CppInterop.Runtime.Attributes; -using Reactor.Utilities.Attributes; using UnityEngine; namespace AleLuduMod.Components; @@ -10,27 +10,19 @@ namespace AleLuduMod.Components; [RegisterInIl2Cpp] public class ShapeshifterBehaviour : MonoBehaviour { - public ShapeshifterBehaviour(IntPtr ptr) : base(ptr) - { - } + public ShapeshifterBehaviour(IntPtr ptr) : base(ptr){} + internal ShapeshifterMinigame shapeshifterMinigame = null!; - public ShapeshifterMinigame shapeshifterMinigame = null!; - [HideFromIl2Cpp] public IEnumerable Targets => shapeshifterMinigame.potentialVictims.ToArray(); + [HideFromIl2Cpp] + public IEnumerable Targets => shapeshifterMinigame.potentialVictims.ToArray(); public void Start() { - if (Targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value) - { - // dont change layout if players count is below 16 - return; - } - + if (Targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value) return; // dont change layout if players count is below 16 var i = 0; - foreach (var panel in Targets) { panel.gameObject.SetActive(true); - var row = i / 4; var col = i % 4; var buttonTransform = panel.transform; @@ -39,7 +31,7 @@ public void Start() shapeshifterMinigame.XStart + shapeshifterMinigame.XOffset * col * 0.75f - 0.375f, shapeshifterMinigame.YStart + shapeshifterMinigame.YOffset * row * 0.75f, buttonTransform.localPosition.z - ); + ); i++; } } diff --git a/src/AleLuduMod/Components/VitalsHudBehaviour.cs b/src/AleLuduMod/Components/VitalsHudBehaviour.cs index c0e4d46..7c3e7e1 100644 --- a/src/AleLuduMod/Components/VitalsHudBehaviour.cs +++ b/src/AleLuduMod/Components/VitalsHudBehaviour.cs @@ -11,7 +11,6 @@ namespace AleLuduMod.Components; public class VitalsHudBehaviour : MonoBehaviour { public VitalsHudBehaviour(IntPtr ptr) : base(ptr) {} - internal VitalsMinigame vitalsMinigame = null!; [HideFromIl2Cpp] @@ -19,13 +18,7 @@ public VitalsHudBehaviour(IntPtr ptr) : base(ptr) {} public void Start() { - - if (Targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value) - { - // dont change layout if players count is below 16 - return; - } - + if (Targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value) return; // dont change layout if players count is below 16 var i = 0; foreach (var panel in Targets) { From ae7243c5a40c6393633a446763793d7fbaf0e835 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Thu, 2 Oct 2025 20:14:56 +0200 Subject: [PATCH 07/21] You can no longer use !limit during a round. --- .../Components/MeetingHudBehaviour.cs | 2 +- .../Components/ShapeshifterMenuBehaviour.cs | 2 +- .../Components/VitalsHudBehaviour.cs | 10 ++++---- src/AleLuduMod/Patches/ChatCommands.cs | 23 +++++++++++-------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/AleLuduMod/Components/MeetingHudBehaviour.cs b/src/AleLuduMod/Components/MeetingHudBehaviour.cs index 5bed6ee..2a32032 100644 --- a/src/AleLuduMod/Components/MeetingHudBehaviour.cs +++ b/src/AleLuduMod/Components/MeetingHudBehaviour.cs @@ -10,7 +10,7 @@ namespace AleLuduMod.Components; [RegisterInIl2Cpp] public class MeetingHudBehaviour : MonoBehaviour { - public MeetingHudBehaviour(IntPtr ptr) : base(ptr) {} + public MeetingHudBehaviour(IntPtr ptr) : base(ptr) { } internal MeetingHud meetingHud = null!; [HideFromIl2Cpp] diff --git a/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs b/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs index 0a91b4d..546b0db 100644 --- a/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs +++ b/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs @@ -10,7 +10,7 @@ namespace AleLuduMod.Components; [RegisterInIl2Cpp] public class ShapeshifterBehaviour : MonoBehaviour { - public ShapeshifterBehaviour(IntPtr ptr) : base(ptr){} + public ShapeshifterBehaviour(IntPtr ptr) : base(ptr) { } internal ShapeshifterMinigame shapeshifterMinigame = null!; [HideFromIl2Cpp] diff --git a/src/AleLuduMod/Components/VitalsHudBehaviour.cs b/src/AleLuduMod/Components/VitalsHudBehaviour.cs index 7c3e7e1..582b624 100644 --- a/src/AleLuduMod/Components/VitalsHudBehaviour.cs +++ b/src/AleLuduMod/Components/VitalsHudBehaviour.cs @@ -10,7 +10,7 @@ namespace AleLuduMod.Components; [RegisterInIl2Cpp] public class VitalsHudBehaviour : MonoBehaviour { - public VitalsHudBehaviour(IntPtr ptr) : base(ptr) {} + public VitalsHudBehaviour(IntPtr ptr) : base(ptr) { } internal VitalsMinigame vitalsMinigame = null!; [HideFromIl2Cpp] @@ -28,10 +28,10 @@ public void Start() var panelTransform = panel.transform; panelTransform.localScale *= 0.75f; panelTransform.localPosition = new Vector3( - vitalsMinigame.XStart + vitalsMinigame.XOffset * (col * 0.75f - 0.25f), - vitalsMinigame.YStart + vitalsMinigame.YOffset * row * 0.75f, - panelTransform.localPosition.z - ); + vitalsMinigame.XStart + vitalsMinigame.XOffset * (col * 0.75f - 0.25f), + vitalsMinigame.YStart + vitalsMinigame.YOffset * row * 0.75f, + panelTransform.localPosition.z + ); i++; } } diff --git a/src/AleLuduMod/Patches/ChatCommands.cs b/src/AleLuduMod/Patches/ChatCommands.cs index 97be01b..fec3428 100644 --- a/src/AleLuduMod/Patches/ChatCommands.cs +++ b/src/AleLuduMod/Patches/ChatCommands.cs @@ -19,7 +19,16 @@ public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] Player // After entering the command, when you try to join the lobby it will show "X/15". Only after the game is over will there be a larger lobby. if (chatText.StartsWith("!limit ")) { - if (GameData.Instance.GetHost() == sourcePlayer.Data) + if ((AmongUsClient.Instance.GameState == InnerNet.InnerNetClient.GameStates.Started || AmongUsClient.Instance.NetworkMode == NetworkModes.FreePlay) && sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) + { + if (sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) + { + chatText = "You cannot use this command during the game!"; + error = true; + } + return sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId; + } + if (GameData.Instance.GetHost() == sourcePlayer.Data && sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) { string[] args = chatText.Split(' '); if (args.Length > 1 && int.TryParse(args[1], out int newLimit)) @@ -31,10 +40,9 @@ public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] Player GameOptionsManager.Instance.CurrentGameOptions.SetInt(Int32OptionNames.MaxPlayers, newLimit); if (sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) { + chatText = $"Player limit has been set for: {newLimit}"; system = true; - HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, $"A player limit has been set for: {newLimit}"); } - return false; } catch { } } @@ -42,20 +50,18 @@ public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] Player { if (sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) { + chatText = "The !limit command has a range of 4 - 35!"; error = true; - HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, "The limit must be between 4 and 35."); } - return false; } } else { if (sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) { + chatText = "Use !limit [number]. Example: !limit 20"; error = true; - HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, "Use !limit [number]. Example: !limit 20"); } - return false; } } else if (sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) @@ -63,9 +69,8 @@ public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] Player if (sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) { noaccess = true; - HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, "You don't have access to this command!"); + chatText = "You don't have access to this command!"; } - return false; } return sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId; } From ca8f947d0361e3558e876bd82d87efc2cb8f06dd Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:26:59 +0200 Subject: [PATCH 08/21] Update ChatCommands.cs --- src/AleLuduMod/Patches/ChatCommands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AleLuduMod/Patches/ChatCommands.cs b/src/AleLuduMod/Patches/ChatCommands.cs index fec3428..20e9843 100644 --- a/src/AleLuduMod/Patches/ChatCommands.cs +++ b/src/AleLuduMod/Patches/ChatCommands.cs @@ -68,8 +68,8 @@ public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] Player { if (sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId) { - noaccess = true; chatText = "You don't have access to this command!"; + noaccess = true; } } return sourcePlayer.PlayerId == PlayerControl.LocalPlayer.PlayerId; From 2c907e49632e6ff1dedd06fced378db39038d216 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Mon, 6 Oct 2025 16:52:08 +0200 Subject: [PATCH 09/21] Rewrite Server Dropdown --- src/AleLuduMod/Patches/ServerDropdownPatch.cs | 69 +++++++++++++++++++ .../Patches/ServerDropdownPatches.cs | 40 ----------- 2 files changed, 69 insertions(+), 40 deletions(-) create mode 100644 src/AleLuduMod/Patches/ServerDropdownPatch.cs delete mode 100644 src/AleLuduMod/Patches/ServerDropdownPatches.cs diff --git a/src/AleLuduMod/Patches/ServerDropdownPatch.cs b/src/AleLuduMod/Patches/ServerDropdownPatch.cs new file mode 100644 index 0000000..023faa6 --- /dev/null +++ b/src/AleLuduMod/Patches/ServerDropdownPatch.cs @@ -0,0 +1,69 @@ +using System.Linq; +using HarmonyLib; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.SceneManagement; + +namespace AleLuduMod.Patches; + +[HarmonyPatch(typeof(ServerDropdown), nameof(ServerDropdown.FillServerOptions))] +public static class ServerDropdownPatch +{ + public static bool RegionEquals(this IRegionInfo region, IRegionInfo other) + { + return region.Name == other.Name && + region.TranslateName == other.TranslateName && + region.PingServer == other.PingServer && + region.TargetServer == other.TargetServer && + region.Servers.All(s => other.Servers.Any(x => x.Equals(s))); + } + + public static bool Prefix(ServerDropdown __instance) + { + var num = 0; + __instance.background.size = new Vector2(8.4f, 4.8f); + + foreach (var regionInfo in ServerManager.Instance.AvailableRegions) + { + var findingGame = SceneManager.GetActiveScene().name is "FindAGame"; + + if (ServerManager.Instance.CurrentRegion.RegionEquals(regionInfo)) + { + __instance.defaultButtonSelected = __instance.firstOption; + __instance.firstOption.ChangeButtonText( + TranslationController.Instance.GetStringWithDefault( + regionInfo.TranslateName, + regionInfo.Name)); + } + else + { + var region = regionInfo; + var serverListButton = __instance.ButtonPool.Get(); + var x = num % 2 == 0 ? -2 : 2; + if (findingGame) + { + x += 2; + } + var y = -0.55f * (num / 2f); + serverListButton.transform.localPosition = new Vector3(x, __instance.y_posButton + y, -1f); + serverListButton.transform.localScale = Vector3.one; + serverListButton.Text.text = + TranslationController.Instance.GetStringWithDefault( + regionInfo.TranslateName, + regionInfo.Name); + serverListButton.Text.ForceMeshUpdate(); + serverListButton.Button.OnClick.RemoveAllListeners(); + serverListButton.Button.OnClick.AddListener((UnityAction)(() => { __instance.ChooseOption(region); })); + __instance.controllerSelectable.Add(serverListButton.Button); + __instance.background.transform.localPosition = new Vector3( + findingGame ? 2f : 0f, + __instance.initialYPos + -0.3f * (num / 2f), + 0f); + __instance.background.size = new Vector2(__instance.background.size.x, 1.2f + 0.6f * (num / 2f)); + num++; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/AleLuduMod/Patches/ServerDropdownPatches.cs b/src/AleLuduMod/Patches/ServerDropdownPatches.cs deleted file mode 100644 index 6ca86be..0000000 --- a/src/AleLuduMod/Patches/ServerDropdownPatches.cs +++ /dev/null @@ -1,40 +0,0 @@ -using HarmonyLib; -using Il2CppInterop.Runtime.InteropTypes.Arrays; -using System; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace AleLuduMod.Patches; - -[HarmonyPatch(typeof(ServerDropdown), nameof(ServerDropdown.FillServerOptions))] -public static class ServerDropdownPatches -{ - public static bool Prefix(ServerDropdown __instance) - { - if (SceneManager.GetActiveScene().name == "FindAGame") return true; - SpriteRenderer bg = __instance.background; - bg.size = new Vector2(4, 1); - ServerManager sm = ServerManager.Instance; - TranslationController tc = TranslationController.Instance; - int totalCols = Mathf.Max(1, Mathf.CeilToInt(sm.AvailableRegions.Length / (float)5)); - int rowLimit = Mathf.Min(sm.AvailableRegions.Length, 5); - - for (var index = 0; index < sm.AvailableRegions.Length; index++) - { - IRegionInfo ri = sm.AvailableRegions[index]; - var b = __instance.ButtonPool.Get(); - b.transform.localPosition = new Vector3(((index / 5) - ((totalCols - 1) / 2f)) * 3.15f, __instance.y_posButton - (0.5f * (index % 5)), -1f); - b.Text.text = tc.GetStringWithDefault(ri.TranslateName, ri.Name, new Il2CppReferenceArray(0)); - b.Text.ForceMeshUpdate(); - b.Button.OnClick.RemoveAllListeners(); - b.Button.OnClick.AddListener((Action)(() => __instance.ChooseOption(ri))); - __instance.controllerSelectable.Add(b.Button); - } - - float h = 1.2f + (0.5f * (rowLimit - 1)); - float w = totalCols > 1 ? (3.15f * (totalCols - 1)) + bg.size.x : bg.size.x; - bg.transform.localPosition = new Vector3(0f, __instance.initialYPos - ((h - 1.2f) / 2f), 0f); - bg.size = new Vector2(w, h); - return false; - } -} \ No newline at end of file From dbfc3997e12cd8742db9d9299ca1600913dfc722 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Sun, 8 Mar 2026 23:48:28 +0100 Subject: [PATCH 10/21] v1.1.1 Source Code --- src/AleLuduMod/AleLuduMod.csproj | 4 +- src/AleLuduMod/AleLuduModPlugin.cs | 2 + .../Components/MeetingHudBehaviour.cs | 2 +- .../Components/ShapeshifterMenuBehaviour.cs | 2 +- .../Components/VitalsHudBehaviour.cs | 4 +- src/AleLuduMod/ModCompatibility.cs | 75 +++++++++++++++++++ src/AleLuduMod/Patches/ChatCommands.cs | 4 +- src/AleLuduMod/Patches/GenericPatches.cs | 34 ++++----- .../Patches/SecurityLoggerPatches.cs | 2 +- src/AleLuduMod/Patches/ServerDropdownPatch.cs | 4 +- 10 files changed, 103 insertions(+), 30 deletions(-) create mode 100644 src/AleLuduMod/ModCompatibility.cs diff --git a/src/AleLuduMod/AleLuduMod.csproj b/src/AleLuduMod/AleLuduMod.csproj index ca5a761..32f527c 100644 --- a/src/AleLuduMod/AleLuduMod.csproj +++ b/src/AleLuduMod/AleLuduMod.csproj @@ -2,7 +2,7 @@ net6.0 - 1.1.0 + 1.1.1 townofus.pl, OrzechMC, Bubeu, gitq latest @@ -11,7 +11,7 @@ Steam - 2025.3.25 + 2025.9.9 diff --git a/src/AleLuduMod/AleLuduModPlugin.cs b/src/AleLuduMod/AleLuduModPlugin.cs index f94a1f9..e091921 100644 --- a/src/AleLuduMod/AleLuduModPlugin.cs +++ b/src/AleLuduMod/AleLuduModPlugin.cs @@ -22,6 +22,8 @@ public override void Load() { ReactorCredits.Register(ReactorCredits.AlwaysShow); + IL2CPPChainloader.Instance.Finished += ModCompatibility.Initialize; + Force4Columns = Config.Bind("Settings", "Force 4 columns", true, "Always display 4 columns in meeting, vitals, etc."); Harmony.PatchAll(); diff --git a/src/AleLuduMod/Components/MeetingHudBehaviour.cs b/src/AleLuduMod/Components/MeetingHudBehaviour.cs index 2a32032..1f6b037 100644 --- a/src/AleLuduMod/Components/MeetingHudBehaviour.cs +++ b/src/AleLuduMod/Components/MeetingHudBehaviour.cs @@ -35,4 +35,4 @@ public void Start() i++; } } -} +} \ No newline at end of file diff --git a/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs b/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs index 546b0db..aa7cf73 100644 --- a/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs +++ b/src/AleLuduMod/Components/ShapeshifterMenuBehaviour.cs @@ -13,7 +13,7 @@ public class ShapeshifterBehaviour : MonoBehaviour public ShapeshifterBehaviour(IntPtr ptr) : base(ptr) { } internal ShapeshifterMinigame shapeshifterMinigame = null!; - [HideFromIl2Cpp] + [HideFromIl2Cpp] public IEnumerable Targets => shapeshifterMinigame.potentialVictims.ToArray(); public void Start() diff --git a/src/AleLuduMod/Components/VitalsHudBehaviour.cs b/src/AleLuduMod/Components/VitalsHudBehaviour.cs index 582b624..8329d9c 100644 --- a/src/AleLuduMod/Components/VitalsHudBehaviour.cs +++ b/src/AleLuduMod/Components/VitalsHudBehaviour.cs @@ -29,10 +29,10 @@ public void Start() panelTransform.localScale *= 0.75f; panelTransform.localPosition = new Vector3( vitalsMinigame.XStart + vitalsMinigame.XOffset * (col * 0.75f - 0.25f), - vitalsMinigame.YStart + vitalsMinigame.YOffset * row * 0.75f, + vitalsMinigame.YStart + vitalsMinigame.YOffset * row * 0.75f, panelTransform.localPosition.z ); i++; } } -} +} \ No newline at end of file diff --git a/src/AleLuduMod/ModCompatibility.cs b/src/AleLuduMod/ModCompatibility.cs new file mode 100644 index 0000000..7504571 --- /dev/null +++ b/src/AleLuduMod/ModCompatibility.cs @@ -0,0 +1,75 @@ +using BepInEx.Unity.IL2CPP; +using HarmonyLib; +using Reactor.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; + +namespace AleLuduMod; + +public static class ModCompatibility +{ + public const string MiraApiGuid = "mira.api"; + public static bool MiraApiLoaded { get; private set; } + private static BasePlugin MiraApiPlugin { get; set; } + private static Assembly MiraApiAssembly { get; set; } + private static Type[] MiraApiTypes { get; set; } + public static float XStart = -0.8f; + public static float YStart = 2.15f; + public static float XOffset = 1.95f; + public static float YOffset = -0.65f; + + public static void Initialize() + { + InitMiraApi(); + } + + private static void InitMiraApi() + { + if (!IL2CPPChainloader.Instance.Plugins.TryGetValue(MiraApiGuid, out var value)) + { + return; + } + + MiraApiPlugin = (value.Instance as BasePlugin)!; + MiraApiAssembly = MiraApiPlugin.GetType().Assembly; + + MiraApiTypes = AccessTools.GetTypesFromAssembly(MiraApiAssembly); + + var playerMenu = MiraApiTypes.First(t => t.Name == "CustomPlayerMenu"); + var menuBegin = AccessTools.Method(playerMenu, "Begin", new[] { typeof(Func), typeof(Action) }); + + var compatType = typeof(ModCompatibility); + var harmony = new Harmony("aleludu.miraapi.patch"); + harmony.Patch(menuBegin, null, + new HarmonyMethod(AccessTools.Method(compatType, nameof(BeginPostfix)))); + + MiraApiLoaded = true; + Logger.Message("MiraAPI was detected and patched"); + } + public static void BeginPostfix(dynamic __instance, Func playerMatch, Action onClick) + { + var targets = __instance.potentialVictims as List; + if (targets == null || targets.Count() < 16 && !AleLuduModPlugin.Force4Columns.Value) return; + + var i = 0; + + foreach (var panel in targets) + { + panel.gameObject.SetActive(true); + + var row = i / 4; + var col = i % 4; + var buttonTransform = panel.transform; + buttonTransform.localScale *= 0.75f; + buttonTransform.localPosition = new Vector3( + XStart + XOffset * col * 1.1f - 2.4f, + YStart + YOffset * row * 0.9255f - 0.65f, + buttonTransform.localPosition.z + ); + i++; + } + } +} \ No newline at end of file diff --git a/src/AleLuduMod/Patches/ChatCommands.cs b/src/AleLuduMod/Patches/ChatCommands.cs index 20e9843..80a5265 100644 --- a/src/AleLuduMod/Patches/ChatCommands.cs +++ b/src/AleLuduMod/Patches/ChatCommands.cs @@ -12,7 +12,7 @@ public class ChatCommands [HarmonyPatch(typeof(ChatController), nameof(ChatController.AddChat))] public class Commands { - public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] PlayerControl sourcePlayer , ref string chatText) + public static bool Prefix(ChatController __instance, [HarmonyArgument(0)] PlayerControl sourcePlayer, ref string chatText) { if (__instance != HudManager.Instance.Chat) return true; @@ -117,4 +117,4 @@ public static bool Prefix(ChatBubble __instance) } } } -} +} \ No newline at end of file diff --git a/src/AleLuduMod/Patches/GenericPatches.cs b/src/AleLuduMod/Patches/GenericPatches.cs index 6ae23aa..c322f34 100644 --- a/src/AleLuduMod/Patches/GenericPatches.cs +++ b/src/AleLuduMod/Patches/GenericPatches.cs @@ -66,11 +66,7 @@ public static class GameOptionsManager_set_GameHostOptions { public static void Postfix(GameOptionsManager __instance) { - try - { - TryAdjustOptionsRecommendations(__instance); - } - catch { } + TryAdjustOptionsRecommendations(__instance); } } @@ -79,26 +75,26 @@ public static class GameOptionsManager_SwitchGameMode { public static void Postfix(GameOptionsManager __instance) { - try - { - TryAdjustOptionsRecommendations(__instance); - } - catch { } + TryAdjustOptionsRecommendations(__instance); } } - [HarmonyPatch(typeof(GameOptionsMenu), nameof(GameOptionsMenu.Initialize))] - public static class GameOptionsMenu_Initialize + [HarmonyPatch(typeof(GameManager), nameof(GameManager.Awake))] + public static class GameManager_Awake { - public static void Postfix(GameOptionsMenu __instance) + public static void Postfix(GameManager __instance) { - var numberOptions = __instance.GetComponentsInChildren(); - - var impostorsOption = numberOptions.FirstOrDefault(o => o.Title == StringNames.GameNumImpostors); - if (impostorsOption != null) + foreach (var category in __instance.GameSettingsList.AllCategories) { - impostorsOption.ValidRange = new FloatRange(1, AleLuduModPlugin.MaxImpostors); + foreach (var option in category.AllGameSettings) + { + if (option is IntGameSetting intOption && option.Title == StringNames.GameNumImpostors) + { + intOption.ValidRange = new IntRange(1, AleLuduModPlugin.MaxImpostors); + return; + } + } } } } -} +} \ No newline at end of file diff --git a/src/AleLuduMod/Patches/SecurityLoggerPatches.cs b/src/AleLuduMod/Patches/SecurityLoggerPatches.cs index c6ea7e6..727feeb 100644 --- a/src/AleLuduMod/Patches/SecurityLoggerPatches.cs +++ b/src/AleLuduMod/Patches/SecurityLoggerPatches.cs @@ -13,4 +13,4 @@ public static void Postfix(SecurityLogger __instance) __instance.Timers = new Il2CppStructArray(AleLuduModPlugin.MaxPlayers); } } -} +} \ No newline at end of file diff --git a/src/AleLuduMod/Patches/ServerDropdownPatch.cs b/src/AleLuduMod/Patches/ServerDropdownPatch.cs index 023faa6..7785ec3 100644 --- a/src/AleLuduMod/Patches/ServerDropdownPatch.cs +++ b/src/AleLuduMod/Patches/ServerDropdownPatch.cs @@ -1,5 +1,5 @@ -using System.Linq; -using HarmonyLib; +using HarmonyLib; +using System.Linq; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; From 78b8a8809e4d6a71b6c7f52bece7dab50b8efe05 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Mon, 9 Mar 2026 00:41:09 +0100 Subject: [PATCH 11/21] Update README.md Updated README to clarify features of the mod. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 427a283..550550e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [Our Discord](https://discord.townofus.pl) # AleLuduMod -This mod unlocks the possibility to show more than 15 players on screen during an emergency meeting, on vitals, and on the Transporter/Glitch screen. +This mod unlocks the possibility to show more than 15 players on screen during an emergency meeting, vitals and shapeshifter menu. Works on **latest** Among Us Steam version. From dfa9d7901c160053fca3ddd10bcdb5054d96cd78 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Mon, 9 Mar 2026 18:59:16 +0100 Subject: [PATCH 12/21] Update README.md --- README.md | 56 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 550550e..961ca90 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,59 @@ -[Our Discord](https://discord.townofus.pl) +

+ +

+ + +
+ +

+ +
+ +![Downloads](https://img.shields.io/github/downloads/raspberrygitq/AleLuduMod/total) +![Latest Version](https://img.shields.io/github/v/release/raspberrygitq/AleLuduMod) # AleLuduMod -This mod unlocks the possibility to show more than 15 players on screen during an emergency meeting, vitals and shapeshifter menu. +This mod unlocks the possibility to show more than 15 players on screen during an meeting hud, vitals and shapeshifter menu. Works on **latest** Among Us Steam version. +> ### :warning: **WARNING** :warning: +> AleLuduMod **doesn't** work with official servers from Innersloth. It is recommended to use modded servers. + ## Presentation ![AleLuduModEmergencyMeeting](https://github.com/townofus-pl/AleLuduMod/blob/main/aleludumeeting.png) ## Versions -| Mod version | Downloads | Notes | -|-------------|---------------------------------------------------------------------------------------------|-------| -| v1.0.6 | [GitHub](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.6/AleLuduMod.dll) | | -| v1.0.5.beta | [GitHub](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.5.beta/AleLuduMod.dll) | Doesn't include creating 15+ players lobby. | -| v1.0.4 | [GitHub](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.4/AleLuduMod.dll) | | -| v1.0.3 | [GitHub](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.3/AleLuduMod.dll) | | -| v1.0.2 | [GitHub](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.2/AleLuduMod.dll) | | -| v1.0.1 | [GitHub](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.1/AleLuduMod.dll) | | -| v1.0.0 | [GitHub](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.0/AleLuduMod.dll) | | + +| Mod Version | Among Us - Version | Downloads | +|-------------|--------------------|-----------| +| v1.1.1 | 17.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.1/AleLuduMod.dll) | +| v1.1.0 | 16.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.0/AleLuduMod.dll) | + +
+ Archive + +| Mod version | Among Us - Version | Downloads | +|-------------|--------------------|---------------------------------------------------------------------------------------------| +| v1.0.6 | 16.0.2 - 16.1.0 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.6/AleLuduMod.dll) | +| v1.0.5.beta | 16.0.0 - 16.0.2 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.5.beta/AleLuduMod.dll) | +| v1.0.4 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.4/AleLuduMod.dll) | +| v1.0.3 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.3/AleLuduMod.dll) | +| v1.0.2 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.2/AleLuduMod.dll) | +| v1.0.1 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.1/AleLuduMod.dll) | +| v1.0.0 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.0/AleLuduMod.dll) | + +
## Installation -Drop it into `\BepInEx\plugins\` folder inside your Among Us + TownOfUs folder installation. +Drop it into `\BepInEx\plugins\` folder inside your Among Us + Modded folder installation. ## Commands - `!limit ` - Set the maximum number of players in lobby (from 4 to 35). ## Authors -- [TownOfUs.pl](http://townofus.pl/) +- [TownOfUs.pl](https://townofus.pl/) - OrzechMC - Bubeu - gitq @@ -35,4 +61,6 @@ Drop it into `\BepInEx\plugins\` folder inside your Among Us + TownOfUs folder i ## Credits - [CrowdedMods](https://github.com/CrowdedMods/CrowdedMod) - current authors of CrowdedMod that we used as a base for our mod - [andry08/100-player-mod](https://github.com/andry08/100-player-mod) - original author of the CrowdedMod plugin (andry08) - +--- +> This mod is not affiliated with Among Us or Innersloth LLC, and the content contained therein is not endorsed or otherwise sponsored by Innersloth LLC. Portions of the materials contained herein are property of Innersloth LLC.\ +> © Innersloth LLC. \ No newline at end of file From 8e8a00862e53646c2146c162ed2c96c5a7d2910b Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:49:43 +0100 Subject: [PATCH 13/21] Update README.md Updated compatibility range for mod version v1.1.0. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 961ca90..2cc411b 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Works on **latest** Among Us Steam version. | Mod Version | Among Us - Version | Downloads | |-------------|--------------------|-----------| | v1.1.1 | 17.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.1/AleLuduMod.dll) | -| v1.1.0 | 16.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.0/AleLuduMod.dll) | +| v1.1.0 | 16.0.0 - 16.1.0 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.0/AleLuduMod.dll) |
Archive @@ -63,4 +63,4 @@ Drop it into `\BepInEx\plugins\` folder inside your Among Us + Modded folder ins - [andry08/100-player-mod](https://github.com/andry08/100-player-mod) - original author of the CrowdedMod plugin (andry08) --- > This mod is not affiliated with Among Us or Innersloth LLC, and the content contained therein is not endorsed or otherwise sponsored by Innersloth LLC. Portions of the materials contained herein are property of Innersloth LLC.\ -> © Innersloth LLC. \ No newline at end of file +> © Innersloth LLC. From 4b99c3a8492f3518bfc88338fec74999b67ba303 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Tue, 10 Mar 2026 23:43:08 +0100 Subject: [PATCH 14/21] Update README.md --- README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 2cc411b..891ae3d 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,17 @@ -

+

-
- - -
+# AleLuduMod -

+[![Discord](https://img.shields.io/badge/Discord-Join%20Server-5662f6?style=for-the-badge&logo=discord&logoColor=white)](https://discord.townofus.pl) +[![Download](https://img.shields.io/badge/Download-Latest-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/raspberrygitq/AleLuduMod/releases/latest) -
+![GitHub Downloads](https://img.shields.io/github/downloads/raspberrygitq/AleLuduMod/total.svg?style=flat-square) +![GitHub Release](https://img.shields.io/github/release/raspberrygitq/AleLuduMod.svg?style=flat-square) -![Downloads](https://img.shields.io/github/downloads/raspberrygitq/AleLuduMod/total) -![Latest Version](https://img.shields.io/github/v/release/raspberrygitq/AleLuduMod) +
+ +--- -# AleLuduMod This mod unlocks the possibility to show more than 15 players on screen during an meeting hud, vitals and shapeshifter menu. Works on **latest** Among Us Steam version. @@ -26,8 +25,8 @@ Works on **latest** Among Us Steam version. ## Versions -| Mod Version | Among Us - Version | Downloads | -|-------------|--------------------|-----------| +| Mod Version | Among Us - Version | Downloads | +|-------------|--------------------|-------------------------------------------------------------------------------------------------| | v1.1.1 | 17.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.1/AleLuduMod.dll) | | v1.1.0 | 16.0.0 - 16.1.0 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.0/AleLuduMod.dll) | From 9d59f4fb4862afdffafe7644e6c6a29c5c469515 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Wed, 11 Mar 2026 19:26:47 +0100 Subject: [PATCH 15/21] v1.1.2 Source Code Support for ModExplorer --- README.md | 12 +++++++----- src/AleLuduMod/AleLuduMod.csproj | 7 ++++++- src/AleLuduMod/Resources/Icon.png | Bin 0 -> 62670 bytes src/AleLuduMod/modinfo.json | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 src/AleLuduMod/Resources/Icon.png create mode 100644 src/AleLuduMod/modinfo.json diff --git a/README.md b/README.md index 891ae3d..26ad9b0 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,7 @@ ---- - +# This mod unlocks the possibility to show more than 15 players on screen during an meeting hud, vitals and shapeshifter menu. Works on **latest** Among Us Steam version. @@ -27,6 +26,7 @@ Works on **latest** Among Us Steam version. | Mod Version | Among Us - Version | Downloads | |-------------|--------------------|-------------------------------------------------------------------------------------------------| +| v1.1.2 | 17.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.2/AleLuduMod.dll) | | v1.1.1 | 17.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.1/AleLuduMod.dll) | | v1.1.0 | 16.0.0 - 16.1.0 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.0/AleLuduMod.dll) | @@ -42,11 +42,12 @@ Works on **latest** Among Us Steam version. | v1.0.2 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.2/AleLuduMod.dll) | | v1.0.1 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.1/AleLuduMod.dll) | | v1.0.0 | 2024.11.26 | [Download](https://github.com/townofus-pl/AleLuduMod/releases/download/v1.0.0/AleLuduMod.dll) | -
## Installation -Drop it into `\BepInEx\plugins\` folder inside your Among Us + Modded folder installation. +Drop `AleLuduMod.dll` it the **`BepInEx\plugins`** folder with other mods or download the zip package. +> [!Warning] +> The mod needs [BepInEx](https://builds.bepinex.dev/projects/bepinex_be) and [Reactor](https://github.com/nuclearpowered/reactor) to work properly. While **BepInEx** is used by every mod and shouldn't be a problem, without **Reactor** you can't launch the mod. ## Commands - `!limit ` - Set the maximum number of players in lobby (from 4 to 35). @@ -62,4 +63,5 @@ Drop it into `\BepInEx\plugins\` folder inside your Among Us + Modded folder ins - [andry08/100-player-mod](https://github.com/andry08/100-player-mod) - original author of the CrowdedMod plugin (andry08) --- > This mod is not affiliated with Among Us or Innersloth LLC, and the content contained therein is not endorsed or otherwise sponsored by Innersloth LLC. Portions of the materials contained herein are property of Innersloth LLC.\ -> © Innersloth LLC. +> © Innersloth LLC.\ +> [License](./LICENSE) \ No newline at end of file diff --git a/src/AleLuduMod/AleLuduMod.csproj b/src/AleLuduMod/AleLuduMod.csproj index 32f527c..89a74b3 100644 --- a/src/AleLuduMod/AleLuduMod.csproj +++ b/src/AleLuduMod/AleLuduMod.csproj @@ -2,7 +2,7 @@ net6.0 - 1.1.1 + 1.1.2 townofus.pl, OrzechMC, Bubeu, gitq latest @@ -21,6 +21,11 @@
+ + + + + diff --git a/src/AleLuduMod/Resources/Icon.png b/src/AleLuduMod/Resources/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5236af9ef33fa3bda2543ce9a79ec0f2dae7ee01 GIT binary patch literal 62670 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 literal 0 HcmV?d00001 diff --git a/src/AleLuduMod/modinfo.json b/src/AleLuduMod/modinfo.json new file mode 100644 index 0000000..0591b36 --- /dev/null +++ b/src/AleLuduMod/modinfo.json @@ -0,0 +1,19 @@ +{ + "Name": "AleLuduMod", + "Description": "This mod unlocks the possibility to show more than 15 players on screen during an meeting hud, vitals and shapeshifter menu.", + "Tags": [ + "hud", + "mods" + ], + "Icon": "AleLuduMod.Resources.Icon.png", + "License": "MIT", + "Authors": [ + "TownOfUs.pl", + "OrzechMC", + "Bubeu", + "gitq" + ], + "Links": { + "Source": "https://github.com/raspberrygitq/AleLuduMod" + } +} \ No newline at end of file From 2f4891446012da63333da81dc6446785b1c2aa49 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Fri, 13 Mar 2026 10:26:51 +0100 Subject: [PATCH 16/21] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 26ad9b0..ec71a35 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ This mod unlocks the possibility to show more than 15 players on screen during a Works on **latest** Among Us Steam version. -> ### :warning: **WARNING** :warning: +> [!Warning] > AleLuduMod **doesn't** work with official servers from Innersloth. It is recommended to use modded servers. ## Presentation @@ -64,4 +64,4 @@ Drop `AleLuduMod.dll` it the **`BepInEx\plugins`** folder with other mods or dow --- > This mod is not affiliated with Among Us or Innersloth LLC, and the content contained therein is not endorsed or otherwise sponsored by Innersloth LLC. Portions of the materials contained herein are property of Innersloth LLC.\ > © Innersloth LLC.\ -> [License](./LICENSE) \ No newline at end of file +> [License](./LICENSE) From e64d4719f268585d1975b4789a1267deee5872d9 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Tue, 17 Mar 2026 19:52:38 +0100 Subject: [PATCH 17/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec71a35..468ec98 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Works on **latest** Among Us Steam version. | Mod Version | Among Us - Version | Downloads | |-------------|--------------------|-------------------------------------------------------------------------------------------------| -| v1.1.2 | 17.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.2/AleLuduMod.dll) | +| v1.1.2 | 17.0.0 - 17.2.2 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.2/AleLuduMod.dll) | | v1.1.1 | 17.0.0 - 17.2.1 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.1/AleLuduMod.dll) | | v1.1.0 | 16.0.0 - 16.1.0 | [Download](https://github.com/raspberrygitq/AleLuduMod/releases/download/v1.1.0/AleLuduMod.dll) | From 98842a234ff630790afce092c570242fcc9100a2 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Thu, 26 Mar 2026 18:05:40 +0100 Subject: [PATCH 18/21] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 468ec98..dee375e 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,12 @@ Drop `AleLuduMod.dll` it the **`BepInEx\plugins`** folder with other mods or dow > [!Warning] > The mod needs [BepInEx](https://builds.bepinex.dev/projects/bepinex_be) and [Reactor](https://github.com/nuclearpowered/reactor) to work properly. While **BepInEx** is used by every mod and shouldn't be a problem, without **Reactor** you can't launch the mod. +## Mod Compatibility + +AleLuduMod should be compatible with most mods that don't significantly alter the graphical interface in the meetings / vitals / shapeshifter menus. +> [!Caution] +> Mods that use code from **CrowdedMod** are incompatible with AleLuduMod, which is a host-only mod. CrowdedMod itself is **incompatible** with AleLuduMod because it modifies the interface in the same way as AleLuduMod. + ## Commands - `!limit ` - Set the maximum number of players in lobby (from 4 to 35). From 416965a1299cd78fce2ad82ebb15f93c5116beb7 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Thu, 26 Mar 2026 19:55:39 +0100 Subject: [PATCH 19/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dee375e..124dfd4 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Drop `AleLuduMod.dll` it the **`BepInEx\plugins`** folder with other mods or dow AleLuduMod should be compatible with most mods that don't significantly alter the graphical interface in the meetings / vitals / shapeshifter menus. > [!Caution] -> Mods that use code from **CrowdedMod** are incompatible with AleLuduMod, which is a host-only mod. CrowdedMod itself is **incompatible** with AleLuduMod because it modifies the interface in the same way as AleLuduMod. +> Host-only mods that use code from CrowdedMod are incompatible with AleLuduMod. CrowdedMod itself is **incompatible** with AleLuduMod because it modifies the interface in the same way as AleLuduMod. ## Commands - `!limit ` - Set the maximum number of players in lobby (from 4 to 35). From fe9cfeeb58e00665823b7bea4483604a75f96099 Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Fri, 27 Mar 2026 11:33:49 +0100 Subject: [PATCH 20/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 124dfd4..5c638a7 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Drop `AleLuduMod.dll` it the **`BepInEx\plugins`** folder with other mods or dow ## Mod Compatibility -AleLuduMod should be compatible with most mods that don't significantly alter the graphical interface in the meetings / vitals / shapeshifter menus. +AleLuduMod should be compatible with most mods that don't significantly alter interface in the meetings / vitals / shapeshifter menus. > [!Caution] > Host-only mods that use code from CrowdedMod are incompatible with AleLuduMod. CrowdedMod itself is **incompatible** with AleLuduMod because it modifies the interface in the same way as AleLuduMod. From 9befb5d3ece3fe3fb930d17ea60d94261939a9bc Mon Sep 17 00:00:00 2001 From: gitq <90698953+raspberrygitq@users.noreply.github.com> Date: Fri, 27 Mar 2026 11:43:25 +0100 Subject: [PATCH 21/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c638a7..54108eb 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Drop `AleLuduMod.dll` it the **`BepInEx\plugins`** folder with other mods or dow AleLuduMod should be compatible with most mods that don't significantly alter interface in the meetings / vitals / shapeshifter menus. > [!Caution] -> Host-only mods that use code from CrowdedMod are incompatible with AleLuduMod. CrowdedMod itself is **incompatible** with AleLuduMod because it modifies the interface in the same way as AleLuduMod. +> Host-only mods that use code from CrowdedMod are incompatible. CrowdedMod itself is **incompatible** with AleLuduMod because it modifies the interface in the same way as AleLuduMod. ## Commands - `!limit ` - Set the maximum number of players in lobby (from 4 to 35).