diff --git a/Managers/CustomLoadingBarManager.cs b/Managers/CustomLoadingBarManager.cs new file mode 100644 index 0000000..7532a86 --- /dev/null +++ b/Managers/CustomLoadingBarManager.cs @@ -0,0 +1,18 @@ +namespace BetterAmongUs.Managers; + +internal class CustomLoadingBarManager +{ + internal static AmongUsLoadingBar? LoadingBar => DestroyableSingleton.Instance?.loadingBar; + + internal static void ToggleLoadingBar(bool on) + { + DestroyableSingleton.Instance.loadingBar.gameObject.SetActive(on); + } + + internal static void SetLoadingPercent(float percent, string loadText) + { + var loadingBar = DestroyableSingleton.Instance.loadingBar; + loadingBar.SetLoadingPercent(percent, StringNames.None); + loadingBar.loadingText.SetText(loadText); + } +} diff --git a/Patches/ClientPatch.cs b/Patches/ClientPatch.cs index 8470008..22a7e15 100644 --- a/Patches/ClientPatch.cs +++ b/Patches/ClientPatch.cs @@ -1,10 +1,12 @@ -using BetterAmongUs.Helpers; +using BepInEx.Unity.IL2CPP.Utils; +using BetterAmongUs.Helpers; using BetterAmongUs.Items; using BetterAmongUs.Managers; using BetterAmongUs.Modules; using HarmonyLib; using Hazel; using InnerNet; +using System.Collections; using UnityEngine; using UnityEngine.SceneManagement; @@ -126,7 +128,54 @@ internal class ClientPatch } }, 0.6f, shouldLog: false); } + + [HarmonyPatch(nameof(AmongUsClient.CoStartGame))] + [HarmonyPostfix] + internal static void CoStartGame_Postfix(AmongUsClient __instance) + { + __instance.StartCoroutine(CoLoading()); + } + + private static IEnumerator CoLoading() + { + CustomLoadingBarManager.ToggleLoadingBar(true); + + try + { + while (Main.AllPlayerControls.Count > 0 && Main.AllPlayerControls.Any(pc => !pc.roleAssigned)) + { + if (!GameState.IsInGame) + { + yield break; + } + + int totalPlayers = Main.AllPlayerControls.Count; + if (totalPlayers == 0) yield break; + + int playersWithRoles = Main.AllPlayerControls.Count(pc => pc.roleAssigned); + float progress = (float)playersWithRoles / totalPlayers; + + int percent = Mathf.RoundToInt(progress * 100f); + + string loadingText = (GameState.IsHost && playersWithRoles > 0) + ? "Assigning Roles" + : "Loading"; + + CustomLoadingBarManager.SetLoadingPercent(progress, loadingText); + + yield return null; + } + + CustomLoadingBarManager.SetLoadingPercent(100f, "Complete"); + yield return new WaitForSeconds(0.5f); + } + finally + { + CustomLoadingBarManager.ToggleLoadingBar(false); + } + } } + [HarmonyPatch(typeof(InnerNetClient))] internal class InnerNetClientPatch { diff --git a/Patches/FindAGameManagerPatch.cs b/Patches/FindAGameManagerPatch.cs index efee946..32f73d8 100644 --- a/Patches/FindAGameManagerPatch.cs +++ b/Patches/FindAGameManagerPatch.cs @@ -64,8 +64,25 @@ internal class FindAGameManagerPatch [HarmonyPatch(nameof(FindAGameManager.HandleList))] [HarmonyPostfix] - internal static void HandleList_Postfix(FindAGameManager __instance) + internal static void HandleList_Postfix(FindAGameManager __instance, HttpMatchmakerManager.FindGamesListFilteredResponse response) { + GameListing[] games = response.Games.ToArray(); + + games = [.. games.OrderByDescending(game => game.PlayerCount).ThenBy(game => game.TrueHostName)]; + int gameNum = 0; + int count = 0; + while (count < __instance.gameContainers.Length && count < games.Count()) + { + if (games[count].Options != null) + { + __instance.gameContainers[gameNum].gameObject.SetActive(true); + __instance.gameContainers[gameNum].SetGameListing(games[count]); + __instance.gameContainers[gameNum].SetupGameInfo(); + gameNum++; + } + count++; + } + foreach (var container in __instance.gameContainers) { Transform child = container.transform.Find("Container"); diff --git a/Patches/LoadingBarManagerPatch.cs b/Patches/LoadingBarManagerPatch.cs new file mode 100644 index 0000000..57fae78 --- /dev/null +++ b/Patches/LoadingBarManagerPatch.cs @@ -0,0 +1,21 @@ +using HarmonyLib; + +namespace BetterAmongUs.Patches; + +[HarmonyPatch(typeof(LoadingBarManager))] +internal class LoadingBarManagerPatch +{ + [HarmonyPatch(nameof(LoadingBarManager.SetLoadingPercent))] + [HarmonyPrefix] + private static bool SetLoadingPercent_Prefix() + { + return false; + } + + [HarmonyPatch(nameof(LoadingBarManager.ToggleLoadingBar))] + [HarmonyPrefix] + private static bool ToggleLoadingBart_Prefix() + { + return false; + } +} diff --git a/Patches/ServerDropdownPatch.cs b/Patches/ServerDropdownPatch.cs index 4dcabd3..f2392c2 100644 --- a/Patches/ServerDropdownPatch.cs +++ b/Patches/ServerDropdownPatch.cs @@ -1,12 +1,30 @@ using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes.Arrays; using UnityEngine; +using UnityEngine.SceneManagement; namespace BetterAmongUs.Patches; [HarmonyPatch] internal class ServerDropdownPatch { + [HarmonyPatch(typeof(FindAGameManager))] + [HarmonyPatch(nameof(FindAGameManager.Start))] + [HarmonyPrefix] + internal static void Start_Prefix(FindAGameManager __instance) + { + var aspectPosition = __instance.serverDropdown.transform.parent.GetComponent(); + if (aspectPosition != null) + { + aspectPosition.Alignment = AspectPosition.EdgeAlignments.Top; + aspectPosition.anchorPoint = Vector3.zero; + aspectPosition.DistanceFromEdge = new Vector3(-1.2f, 0.3f, 0f); + aspectPosition.AdjustPosition(); + } + + __instance.modeText.transform.localPosition -= new Vector3(0.4f, 0f, 0f); + } + [HarmonyPatch(typeof(ServerDropdown))] [HarmonyPatch(nameof(ServerDropdown.FillServerOptions))] [HarmonyPrefix] @@ -16,7 +34,7 @@ internal class ServerDropdownPatch int num = 0; int column = 0; - const int maxPerColumn = 6; + int maxPerColumn = SceneManager.GetActiveScene().name == "FindAGame" ? 10 : 6; const float columnWidth = 3.5f; const float buttonSpacing = 0.5f;