From 7d8cf80dc843476008bf70e24cb41782734fbefb Mon Sep 17 00:00:00 2001 From: D1GQ Date: Wed, 21 Aug 2024 12:47:34 -0500 Subject: [PATCH 01/22] Role Color In Intro --- Modules/AntiCheat.cs | 9 +-------- Modules/RPC.cs | 17 +++++++++++++++- Modules/Utils.cs | 2 ++ Patches/GamePlayManagerPatch.cs | 36 +++++++++++++++++++++++++++++++++ main.cs | 25 ++++++++++++++++++----- 5 files changed, 75 insertions(+), 14 deletions(-) diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index b05d097..708388f 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -332,12 +332,6 @@ class AntiCheat // Check game states when sabotaging public static bool RpcUpdateSystemCheck(PlayerControl player, SystemTypes systemType, byte amount) { - if (!GameStates.IsHost || PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer || player.BetterData().IsBetterHost || !IsEnabled || !Main.AntiCheat.Value - || GameStates.IsBetterHostLobby && !GameStates.IsHost) return true; - - // Needs fixing! - return true; - byte hostNum = 128; // Only host should ever send this number byte singleFixNum = 0; byte minLightNum = 0; @@ -368,8 +362,7 @@ class AntiCheat } } - if (!GameStates.IsHost || PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer - || player.BetterData().IsBetterHost || !IsEnabled || !Main.AntiCheat.Value + if (!GameStates.IsHost || PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer || player.BetterData().IsBetterHost || !IsEnabled || !Main.AntiCheat.Value || GameStates.IsBetterHostLobby && !GameStates.IsHost) return true; // Single Fix: 0 diff --git a/Modules/RPC.cs b/Modules/RPC.cs index 7353430..5413dc0 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -22,7 +22,7 @@ enum CustomRPC : int } [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.HandleRpc))] -internal class RPCHandlerPatch +internal class PlayerControlRPCHandlerPatch { public static bool Prefix(PlayerControl __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) { @@ -58,6 +58,21 @@ internal class RPCHandlerPatch } } +[HarmonyPatch(typeof(PlayerPhysics), nameof(PlayerPhysics.HandleRpc))] +internal class PlayerPhysicsRPCHandlerPatch +{ + public static void Prefix(PlayerPhysics __instance, [HarmonyArgument(0)] byte callId, [HarmonyArgument(1)] MessageReader reader) + { + if (AntiCheat.CheckCancelRPC(__instance.myPlayer, callId, reader) != true) + { + Logger.LogCheat($"RPC canceled by Anti-Cheat: {Enum.GetName((RpcCalls)callId)}{Enum.GetName((CustomRPC)callId)} - {callId}"); + } + + AntiCheat.CheckRPC(__instance.myPlayer, callId, reader); + RPC.HandleRPC(__instance.myPlayer, callId, reader); + } +} + [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.UpdateSystem), typeof(SystemTypes), typeof(PlayerControl), typeof(MessageReader))] public static class MessageReaderUpdateSystemPatch { diff --git a/Modules/Utils.cs b/Modules/Utils.cs index 6972ff8..07c9046 100644 --- a/Modules/Utils.cs +++ b/Modules/Utils.cs @@ -132,6 +132,8 @@ public static class Utils // Get name for role public static string GetRoleName(RoleTypes role) => Main.GetRoleName[(int)role]; + // Get color for role + public static string GetRoleColor(RoleTypes role) => Main.GetRoleColor[(int)role]; // Get hex color for team public static string GetTeamHexColor(RoleTeamTypes team) { diff --git a/Patches/GamePlayManagerPatch.cs b/Patches/GamePlayManagerPatch.cs index 3d8f9a8..a60fc06 100644 --- a/Patches/GamePlayManagerPatch.cs +++ b/Patches/GamePlayManagerPatch.cs @@ -61,6 +61,42 @@ class GamePlayManager } } + [HarmonyPatch(typeof(IntroCutscene))] + public class IntroCutscenePatch + { + [HarmonyPatch(nameof(IntroCutscene.ShowRole))] + [HarmonyPostfix] + private static void ShowRole_Postfix(IntroCutscene __instance) + { + static Color HexToColor(string hex) + { + if (hex.StartsWith("#")) + { + hex = hex.Substring(1); + } + + byte r = byte.Parse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber); + byte g = byte.Parse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber); + byte b = byte.Parse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber); + + return new Color32(r, g, b, 255); + } + + _ = new LateTask(() => + { + Color RoleColor = HexToColor(Utils.GetRoleColor(PlayerControl.LocalPlayer.Data.RoleType)); + + __instance.ImpostorText.gameObject.SetActive(false); + __instance.TeamTitle.gameObject.SetActive(false); + __instance.FrontMost.gameObject.SetActive(false); + __instance.BackgroundBar.material.color = RoleColor; + __instance.YouAreText.color = RoleColor; + __instance.RoleText.color = RoleColor; + __instance.RoleBlurbText.color = RoleColor; + }, 0.0025f, shoudLog: false); + } + } + [HarmonyPatch(typeof(GameManager))] public class GameManagerPatch { diff --git a/main.cs b/main.cs index 811c706..9853792 100644 --- a/main.cs +++ b/main.cs @@ -24,11 +24,11 @@ public class Main : BasePlugin { public const ReleaseTypes ReleaseBuildType = ReleaseTypes.Release; public const string CanaryNum = "0"; - public const string HotfixNum = "2"; - public const bool IsHotFix = true; + public const string HotfixNum = "0"; + public const bool IsHotFix = false; public const string PluginGuid = "com.d1gq.betteramongus"; - public const string PluginVersion = "1.0.4"; - public const string ReleaseDate = "08.20.2024"; // mm/dd/yyyy + public const string PluginVersion = "1.0.5"; + public const string ReleaseDate = "08.21.2024"; // mm/dd/yyyy public const string Github = "https://github.com/D1GQ/BetterAmongUs-Public"; public const string Discord = "https://discord.gg/vjYrXpzNAn"; @@ -99,7 +99,7 @@ public class Main : BasePlugin public static PlayerControl[] AllAlivePlayerControls => AllPlayerControls.ToArray().Where(pc => pc.IsAlive()).ToArray(); - public static Dictionary GetRoleName = new Dictionary + public static Dictionary GetRoleName => new Dictionary { { 0, "Crewmate" }, { 1, "Impostor" }, @@ -114,6 +114,21 @@ public class Main : BasePlugin { 10, "Tracker" } }; + public static Dictionary GetRoleColor => new Dictionary + { + { 0, "#8cffff" }, + { 1, "#f00202" }, + { 2, "#00d9d9" }, + { 3, "#8f8f8f" }, + { 4, "#8cffff" }, + { 5, "#f06102" }, + { 6, "#8cffff" }, + { 7, "#f00202" }, + { 8, "#fc7c7c" }, + { 9, "#d100b9" }, + { 10, "#59f002" } + }; + public static ManualLogSource Logger; public static DebugMenu debugmenu { get; set; } = null; From e1056dce6a7afcedbd140b9e42e23b9ef16565aa Mon Sep 17 00:00:00 2001 From: D1GQ Date: Wed, 21 Aug 2024 14:09:57 -0500 Subject: [PATCH 02/22] fix no name and error --- Modules/ExtendedPlayerInfo.cs | 8 +++++++- Modules/RPC.cs | 5 +++++ Patches/GamePlayManagerPatch.cs | 25 ++++++++++++++----------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Modules/ExtendedPlayerInfo.cs b/Modules/ExtendedPlayerInfo.cs index de66476..0864588 100644 --- a/Modules/ExtendedPlayerInfo.cs +++ b/Modules/ExtendedPlayerInfo.cs @@ -9,7 +9,7 @@ public static class PlayerControlDataExtension public class ExtendedPlayerInfo { public NetworkedPlayerInfo? _Data { get; set; } - public string RealName { get; set; } = string.Empty; + public string? RealName { get; set; } public Dictionary LastNameSetFor { get; set; } = []; public bool IsBetterUser { get; set; } = false; public bool IsBetterHost { get; set; } = false; @@ -58,6 +58,11 @@ public static class PlayerControlDataExtension if (player.IsAlive() || player.Data.RoleType == RoleTypes.GuardianAngel) player.BetterData().RoleInfo.DeadDisplayRole = player.Data.RoleType; } + + if (string.IsNullOrEmpty(player.BetterData().RealName)) + { + player.BetterData().RealName = player.Data.PlayerName; + } } // Get BetterData from PlayerControl @@ -104,6 +109,7 @@ public static class PlayerControlDataExtension playerInfo[player.Data.Puid] = new ExtendedPlayerInfo { _Data = player.Data, + RealName = player.Data.PlayerName, RoleInfo = new ExtendedRoleInfo() }; } diff --git a/Modules/RPC.cs b/Modules/RPC.cs index 5413dc0..0c5853d 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -226,6 +226,11 @@ internal static class RPC switch (callId) { + case (byte)RpcCalls.SetName: + reader.ReadUInt32(); + var name = reader.ReadString(); + player.BetterData().RealName = name; + break; case (byte)RpcCalls.SendChat: var text = reader.ReadString(); diff --git a/Patches/GamePlayManagerPatch.cs b/Patches/GamePlayManagerPatch.cs index a60fc06..125ef54 100644 --- a/Patches/GamePlayManagerPatch.cs +++ b/Patches/GamePlayManagerPatch.cs @@ -21,21 +21,24 @@ class GamePlayManager } // Clear unused Better Data - var keysToRemove = new List(); - - foreach (var betterInfo in PlayerControlDataExtension.playerInfo) + try { - if (!Main.AllPlayerControls.Any(pc => pc.Data.Puid == betterInfo.Key)) + var keysToRemove = new List(); + + foreach (var betterInfo in PlayerControlDataExtension.playerInfo) { - keysToRemove.Add(betterInfo.Key); + if (!Main.AllPlayerControls.Any(pc => pc.Data.Puid == betterInfo.Key)) + { + keysToRemove.Add(betterInfo.Key); + } + } + + foreach (var key in keysToRemove) + { + PlayerControlDataExtension.playerInfo.Remove(key); } } - - foreach (var key in keysToRemove) - { - PlayerControlDataExtension.playerInfo.Remove(key); - } - + catch { } } [HarmonyPatch(nameof(LobbyBehaviour.Start))] [HarmonyPostfix] From 33615ed08049b480fbaa662c72fc861ae8ebb09d Mon Sep 17 00:00:00 2001 From: D1GQ Date: Wed, 21 Aug 2024 17:28:31 -0500 Subject: [PATCH 03/22] fix --- Modules/AntiCheat.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index 708388f..4bd3c0e 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -230,14 +230,6 @@ class AntiCheat { PlayerControl target = reader.ReadNetObject(); - if (GameStates.IsHost) - { - BetterNotificationManager.NotifyCheat(player, $"Invalid Action RPC: {Enum.GetName((RpcCalls)callId)}"); - Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {GameStates.IsHost}"); - - return; - } - if (target != null) { if (!player.IsImpostorTeam() || !player.IsAlive() || player.IsInVanish() || target.IsImpostorTeam()) @@ -332,6 +324,8 @@ class AntiCheat // Check game states when sabotaging public static bool RpcUpdateSystemCheck(PlayerControl player, SystemTypes systemType, byte amount) { + return true; + byte hostNum = 128; // Only host should ever send this number byte singleFixNum = 0; byte minLightNum = 0; From fb93a419d660bb7a59acbde18145fd055f614436 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Wed, 21 Aug 2024 17:29:15 -0500 Subject: [PATCH 04/22] Hotfix 3 --- main.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.cs b/main.cs index 9853792..d91994f 100644 --- a/main.cs +++ b/main.cs @@ -24,10 +24,10 @@ public class Main : BasePlugin { public const ReleaseTypes ReleaseBuildType = ReleaseTypes.Release; public const string CanaryNum = "0"; - public const string HotfixNum = "0"; - public const bool IsHotFix = false; + public const string HotfixNum = "3"; + public const bool IsHotFix = true; public const string PluginGuid = "com.d1gq.betteramongus"; - public const string PluginVersion = "1.0.5"; + public const string PluginVersion = "1.0.4"; public const string ReleaseDate = "08.21.2024"; // mm/dd/yyyy public const string Github = "https://github.com/D1GQ/BetterAmongUs-Public"; public const string Discord = "https://discord.gg/vjYrXpzNAn"; From c5d55782759be4bef78d285b98cacba55581437c Mon Sep 17 00:00:00 2001 From: D1GQ Date: Wed, 21 Aug 2024 22:59:23 -0500 Subject: [PATCH 05/22] fixes --- Modules/FileChecker.cs | 4 ++-- Patches/ChatPatch.cs | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Modules/FileChecker.cs b/Modules/FileChecker.cs index 550263a..7ab5ce7 100644 --- a/Modules/FileChecker.cs +++ b/Modules/FileChecker.cs @@ -19,13 +19,13 @@ class FileChecker // Set up if unauthorized files have been found. public static void UpdateUnauthorizedFiles() { - if (Enabled == false) return; - if (GameStates.IsDev) { HasTrySpoofFriendCode = false; } + if (Enabled == false) return; + GameObject PlayButton = GameObject.Find("Main Buttons/PlayButton"); // Disable play button diff --git a/Patches/ChatPatch.cs b/Patches/ChatPatch.cs index b471ea4..68e577d 100644 --- a/Patches/ChatPatch.cs +++ b/Patches/ChatPatch.cs @@ -53,8 +53,9 @@ class ChatPatch class ChatControllerPatch { [HarmonyPatch(nameof(ChatController.Update))] - [HarmonyPostfix] - public static void Update_Postfix(ChatController __instance) + [HarmonyPrefix] + [HarmonyPriority(Priority.First)] + public static void Update_Prefix(ChatController __instance) { for (int i = 0; i < __instance.scroller.Inner.gameObject.transform.childCount; i++) { @@ -107,6 +108,7 @@ class ChatPatch [HarmonyPatch(nameof(ChatController.AddChat))] [HarmonyPrefix] + [HarmonyPriority(Priority.First)] public static bool AddChat_Prefix(ChatController __instance, [HarmonyArgument(0)] PlayerControl sourcePlayer, [HarmonyArgument(1)] string chatText) { bool censor = false; From e570da17cdcd540f55cbd60d8935d77350b721b3 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Thu, 22 Aug 2024 12:06:18 -0500 Subject: [PATCH 06/22] New Intro --- Patches/ModManagerPatch.cs | 5 ++- Patches/SplashIntroPatch.cs | 64 +++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 Patches/SplashIntroPatch.cs diff --git a/Patches/ModManagerPatch.cs b/Patches/ModManagerPatch.cs index 868d020..9d452c4 100644 --- a/Patches/ModManagerPatch.cs +++ b/Patches/ModManagerPatch.cs @@ -10,7 +10,10 @@ public class ModManagerPatch [HarmonyPostfix] public static void LateUpdate_Postfix(ModManager __instance) { - __instance.ShowModStamp(); + if (SplashIntroPatch.IsReallyDoneLoading) + { + __instance.ShowModStamp(); + } if (__instance.ModStamp.gameObject.active == true) __instance.ModStamp.GetComponent().sprite = Utils.LoadSprite("BetterAmongUs.Resources.Images.BetterAmongUs-Mod.png", 250f); diff --git a/Patches/SplashIntroPatch.cs b/Patches/SplashIntroPatch.cs new file mode 100644 index 0000000..329fe98 --- /dev/null +++ b/Patches/SplashIntroPatch.cs @@ -0,0 +1,64 @@ +using HarmonyLib; +using UnityEngine; +using UnityEngine.Rendering; + +namespace BetterAmongUs.Patches; + +class SplashIntroPatch +{ + public static bool BetterIntro = false; + public static bool IsReallyDoneLoading = false; + private static float ShowTime = 0f; + + [HarmonyPatch(typeof(SplashManager))] + class SplashManagerPatch + { + [HarmonyPatch(nameof(SplashManager.Update))] + [HarmonyPrefix] + public static bool Update_Prefix(SplashManager __instance) + { + ShowTime += Time.deltaTime; + + if (Input.GetKeyDown(KeyCode.Mouse0) || Input.GetKeyDown(KeyCode.Mouse1)) + { + if (ShowTime > 1.5f) + { + __instance.StopAllCoroutines(); + UnityEngine.Object.Destroy(__instance.logoAnimFinish.gameObject); + __instance.sceneChanger.AllowFinishLoadingScene(); + __instance.startedSceneLoad = true; + __instance.loadingObject.SetActive(true); + IsReallyDoneLoading = true; + } + } + + if (__instance.doneLoadingRefdata && !__instance.startedSceneLoad && Time.time - __instance.startTime > __instance.minimumSecondsBeforeSceneChange) + { + if (!BetterIntro) + { + __instance.startTime = Time.time; + __instance.logoAnimFinish.gameObject.SetActive(false); + __instance.logoAnimFinish.gameObject.SetActive(true); + GameObject Innerlogo = __instance.logoAnimFinish.transform.Find("LogoRoot/ISLogo").gameObject; + if (Innerlogo != null) + { + Innerlogo.GetComponent().sprite = Utils.LoadSprite("BetterAmongUs.Resources.Images.BetterAmongUs-Logo.png", 150f); + } + } + + __instance.startedSceneLoad = BetterIntro; + BetterIntro = true; + + if (__instance.startedSceneLoad && BetterIntro) + { + __instance.sceneChanger.AllowFinishLoadingScene(); + __instance.startedSceneLoad = true; + __instance.loadingObject.SetActive(true); + IsReallyDoneLoading = true; + } + } + + return false; + } + } +} \ No newline at end of file From 1c0c8d0a846fcb30c5395c138080884c0bf34a6e Mon Sep 17 00:00:00 2001 From: D1GQ Date: Thu, 22 Aug 2024 14:15:12 -0500 Subject: [PATCH 07/22] update intro --- Patches/SplashIntroPatch.cs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Patches/SplashIntroPatch.cs b/Patches/SplashIntroPatch.cs index 329fe98..6f6d000 100644 --- a/Patches/SplashIntroPatch.cs +++ b/Patches/SplashIntroPatch.cs @@ -9,16 +9,29 @@ class SplashIntroPatch public static bool BetterIntro = false; public static bool IsReallyDoneLoading = false; private static float ShowTime = 0f; + private static GameObject BetterLogo; [HarmonyPatch(typeof(SplashManager))] class SplashManagerPatch { + [HarmonyPatch(nameof(SplashManager.Start))] + [HarmonyPrefix] + public static void Start_Prefix(SplashManager __instance) + { + __instance.logoAnimFinish.transform.Find("BlackOverlay").transform.SetLocalY(100f); + } + [HarmonyPatch(nameof(SplashManager.Update))] [HarmonyPrefix] public static bool Update_Prefix(SplashManager __instance) { ShowTime += Time.deltaTime; + if (ShowTime > 6f && BetterIntro) + { + UnityEngine.Object.Destroy(__instance.logoAnimFinish.GetComponent()); + } + if (Input.GetKeyDown(KeyCode.Mouse0) || Input.GetKeyDown(KeyCode.Mouse1)) { if (ShowTime > 1.5f) @@ -39,11 +52,12 @@ class SplashIntroPatch __instance.startTime = Time.time; __instance.logoAnimFinish.gameObject.SetActive(false); __instance.logoAnimFinish.gameObject.SetActive(true); - GameObject Innerlogo = __instance.logoAnimFinish.transform.Find("LogoRoot/ISLogo").gameObject; - if (Innerlogo != null) - { - Innerlogo.GetComponent().sprite = Utils.LoadSprite("BetterAmongUs.Resources.Images.BetterAmongUs-Logo.png", 150f); - } + GameObject InnerLogo = __instance.logoAnimFinish.transform.Find("LogoRoot/ISLogo").gameObject; + BetterLogo = UnityEngine.Object.Instantiate(InnerLogo, InnerLogo.transform.parent); + GameObject.Destroy(InnerLogo); + BetterLogo.name = "BetterLogo"; + BetterLogo.GetComponent().sprite = Utils.LoadSprite("BetterAmongUs.Resources.Images.BetterAmongUs-Logo.png", 150f); + __instance.logoAnimFinish.transform.Find("BlackOverlay").transform.SetLocalY(0f); } __instance.startedSceneLoad = BetterIntro; From 20a5660c14b434c134eeb7ffdd961892882d0a02 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Fri, 23 Aug 2024 17:03:30 -0500 Subject: [PATCH 08/22] Custom Settings --- BetterAmongUs.csproj | 3 + Modules/BetterDataManager.cs | 91 +++++++++- Modules/GameState.cs | 2 +- .../OptionItems/BetterOptionCheckboxItem.cs | 84 +++++++++ Modules/OptionItems/BetterOptionFloatItem.cs | 155 +++++++++++++++++ Modules/OptionItems/BetterOptionHeaderItem.cs | 32 ++++ Modules/OptionItems/BetterOptionIntItem.cs | 155 +++++++++++++++++ Modules/OptionItems/BetterOptionItem.cs | 63 +++++++ Modules/OptionItems/BetterOptionStringItem.cs | 127 ++++++++++++++ Patches/GameSettingMenuPatch.cs | 163 ++++++++++++++++++ 10 files changed, 872 insertions(+), 3 deletions(-) create mode 100644 Modules/OptionItems/BetterOptionCheckboxItem.cs create mode 100644 Modules/OptionItems/BetterOptionFloatItem.cs create mode 100644 Modules/OptionItems/BetterOptionHeaderItem.cs create mode 100644 Modules/OptionItems/BetterOptionIntItem.cs create mode 100644 Modules/OptionItems/BetterOptionItem.cs create mode 100644 Modules/OptionItems/BetterOptionStringItem.cs create mode 100644 Patches/GameSettingMenuPatch.cs diff --git a/BetterAmongUs.csproj b/BetterAmongUs.csproj index 1d0bb6b..612220b 100644 --- a/BetterAmongUs.csproj +++ b/BetterAmongUs.csproj @@ -25,4 +25,7 @@ + + + \ No newline at end of file diff --git a/Modules/BetterDataManager.cs b/Modules/BetterDataManager.cs index 63506eb..93418c6 100644 --- a/Modules/BetterDataManager.cs +++ b/Modules/BetterDataManager.cs @@ -1,4 +1,5 @@ -using System.Text.Json; +using BetterAmongUs.Patches; +using System.Text.Json; namespace BetterAmongUs; @@ -7,6 +8,8 @@ class BetterDataManager private static string filePath = GetFilePath("BetterData"); public static string filePathFolder = Path.Combine(Main.GetGamePathToAmongUs(), $"Better_Data"); public static string filePathFolderSaveInfo = Path.Combine(filePathFolder, $"SaveInfo"); + public static string filePathFolderSettings = Path.Combine(filePathFolder, $"Settings"); + public static string SettingsFile = Path.Combine(filePathFolderSettings, "Preset.json"); public static string banPlayerListFile = Path.Combine(filePathFolderSaveInfo, "BanPlayerList.txt"); public static string banNameListFile = Path.Combine(filePathFolderSaveInfo, "BanNameList.txt"); public static string banWordListFile = Path.Combine(filePathFolderSaveInfo, "BanWordList.txt"); @@ -23,6 +26,11 @@ class BetterDataManager Directory.CreateDirectory(filePathFolder); } + if (!Directory.Exists(filePathFolderSettings)) + { + Directory.CreateDirectory(filePathFolderSettings); + } + if (!Directory.Exists(filePathFolderSaveInfo)) { Directory.CreateDirectory(filePathFolderSaveInfo); @@ -43,6 +51,15 @@ class BetterDataManager File.WriteAllText(banWordListFile, "// Example\nStart"); } + if (!File.Exists(SettingsFile)) + { + var initialData = new Dictionary(); + string json = JsonSerializer.Serialize(initialData, new JsonSerializerOptions { WriteIndented = true }); + File.WriteAllText(SettingsFile, json); + } + + GameSettingMenuPatch.SetupSettings(true); + if (!File.Exists(filePath)) { // Initialize with predefined categories @@ -127,6 +144,77 @@ class BetterDataManager return string.Empty; } + public static void SaveSetting(int id, string input) + { + string filePath = SettingsFile; + + string json = File.ReadAllText(filePath); + var jsonData = JsonSerializer.Deserialize>(json) ?? new Dictionary(); + jsonData[id.ToString()] = input; + + json = JsonSerializer.Serialize(jsonData, new JsonSerializerOptions { WriteIndented = true }); + File.WriteAllText(filePath, json); + } + + public static bool CanLoadSetting(int id) + { + string filePath = SettingsFile; + string json = File.ReadAllText(filePath); + var jsonData = JsonSerializer.Deserialize>(json) ?? new Dictionary(); + + if (jsonData.ContainsKey(id.ToString())) + { + if (!string.IsNullOrEmpty(jsonData[id.ToString()])) + { + return true; + } + } + + return false; + } + + public static bool LoadBoolSetting(int id) + { + string filePath = SettingsFile; + string json = File.ReadAllText(filePath); + var jsonData = JsonSerializer.Deserialize>(json) ?? new Dictionary(); + + if (jsonData.ContainsKey(id.ToString())) + { + return bool.Parse(jsonData[id.ToString()]); + } + + return false; + } + + public static float LoadFloatSetting(int id) + { + string filePath = SettingsFile; + string json = File.ReadAllText(filePath); + var jsonData = JsonSerializer.Deserialize>(json) ?? new Dictionary(); + + if (jsonData.ContainsKey(id.ToString())) + { + return float.Parse(jsonData[id.ToString()]); + } + + return -1f; + } + + public static int LoadIntSetting(int id) + { + string filePath = SettingsFile; + string json = File.ReadAllText(filePath); + var jsonData = JsonSerializer.Deserialize>(json) ?? new Dictionary(); + + if (jsonData.ContainsKey(id.ToString())) + { + return int.Parse(jsonData[id.ToString()]); + } + + return -1; + } + public static void SaveBanList(string friendCode = "", string hashPUID = "") { if (!string.IsNullOrEmpty(friendCode) || !string.IsNullOrEmpty(hashPUID)) @@ -157,7 +245,6 @@ class BetterDataManager } } - public static void SaveCheatData(string puid, string friendCode, string name, string category = "cheatData", string reason = "None") { string filePath = GetFilePath("BetterData"); diff --git a/Modules/GameState.cs b/Modules/GameState.cs index d2e21d3..a96c642 100644 --- a/Modules/GameState.cs +++ b/Modules/GameState.cs @@ -10,7 +10,7 @@ public static class GameStates public static bool IsDev => EOSManager.Instance?.userId != null && Main.DevUser.Contains($"{Utils.GetHashPuid(EOSManager.Instance.userId.ToString())}+{EOSManager.Instance.friendCode}"); public static bool InGame => Main.AllPlayerControls.Any(); public static bool IsNormalGame => GameOptionsManager.Instance.CurrentGameOptions.GameMode is GameModes.Normal or GameModes.NormalFools; - public static bool IsHideNSeek => GameOptionsManager.Instance.CurrentGameOptions.GameMode is GameModes.HideNSeek or GameModes.SeekFools; + public static bool IsHideNSeek => GameOptionsManager.Instance != null && GameOptionsManager.Instance.CurrentGameOptions.GameMode is GameModes.HideNSeek or GameModes.SeekFools; public static bool SkeldIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Skeld; public static bool MiraHQIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Mira; public static bool PolusIsActive => (MapNames)GameOptionsManager.Instance.CurrentGameOptions.MapId == MapNames.Polus; diff --git a/Modules/OptionItems/BetterOptionCheckboxItem.cs b/Modules/OptionItems/BetterOptionCheckboxItem.cs new file mode 100644 index 0000000..f64b75b --- /dev/null +++ b/Modules/OptionItems/BetterOptionCheckboxItem.cs @@ -0,0 +1,84 @@ +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionCheckboxItem : BetterOptionItem +{ + private ToggleOption? ThisOption; + private bool? IsChecked; + + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, bool Default = true, BetterOptionItem Parent = null) + { + Id = id; + + if (gameOptionsMenu == null) + { + Load(Default); + return this; + } + + ToggleOption optionBehaviour = UnityEngine.Object.Instantiate(gameOptionsMenu.checkboxOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); + optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); + SetUp(optionBehaviour); + optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); + SpacingNum++; + + // Set data + optionBehaviour.CheckMark.GetComponent().enabled = Default; + IsChecked = Default; + Tab = gameOptionsMenu; + Name = name; + TitleText = optionBehaviour.TitleText; + Option = optionBehaviour; + ThisOption = optionBehaviour; + + Load(Default); + + BetterOptionItems.Add(this); + return this; + } + + public void Load(bool Default) + { + if (BetterDataManager.CanLoadSetting(Id)) + { + if (ThisOption != null) + { + var Bool = BetterDataManager.LoadBoolSetting(Id); + ThisOption.CheckMark.GetComponent().enabled = Bool; + IsChecked = Bool; + } + } + else + { + BetterDataManager.SaveSetting(Id, Default.ToString()); + } + } + + public override bool GetBool() + { + if (BetterDataManager.CanLoadSetting(Id)) + { + return BetterDataManager.LoadBoolSetting(Id); + } + else + { + return IsChecked ??= false; + } + } + + public override void SetData(OptionBehaviour optionBehaviour) + { + optionBehaviour.data = new BaseGameSetting + { + Title = StringNames.None, + Type = OptionTypes.Checkbox, + }; + } + + public override void ValueChanged(int id, OptionBehaviour optionBehaviour) + { + IsChecked = !IsChecked; + BetterDataManager.SaveSetting(Id, IsChecked.ToString()); + } +} diff --git a/Modules/OptionItems/BetterOptionFloatItem.cs b/Modules/OptionItems/BetterOptionFloatItem.cs new file mode 100644 index 0000000..a42c837 --- /dev/null +++ b/Modules/OptionItems/BetterOptionFloatItem.cs @@ -0,0 +1,155 @@ +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionFloatItem : BetterOptionItem +{ + public float CurrentValue; + public FloatRange floatRange = new(0f, 180f); + public float Increment = 2.5f; + private NumberOption? ThisOption; + private string PostFix; + + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, float[] values, float Default, string postFix = "", BetterOptionItem Parent = null) + { + Id = id; + + if (gameOptionsMenu == null) + { + Load(Default); + return this; + } + + if (values.Length is < 3 or > 3) return null; + + NumberOption optionBehaviour = UnityEngine.Object.Instantiate(gameOptionsMenu.numberOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); + optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); + SetUp(optionBehaviour); + optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); + SpacingNum++; + + // Fix Game Crash + foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) + { + optionBehaviour.data = rulesCategory.AllGameSettings.ToArray().FirstOrDefault(item => item.Type == OptionTypes.Number); + } + + optionBehaviour.PlusBtn.OnClick.RemoveAllListeners(); + optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); + optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase())); + optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease())); + + // Set data + Tab = gameOptionsMenu; + Name = name; + TitleText = optionBehaviour.TitleText; + Option = optionBehaviour; + PostFix = postFix; + ThisOption = optionBehaviour; + + floatRange = new(values[0], values[1]); + Increment = values[2]; + + if (Default < floatRange.min) Default = floatRange.min; + if (Default > floatRange.max) Default = floatRange.max; + CurrentValue = Default; + + Load(Default); + AdjustButtonsActiveState(); + + BetterOptionItems.Add(this); + return this; + } + + private void AdjustButtonsActiveState() + { + if (ThisOption == null) return; + + ThisOption.ValueText.text = CurrentValue.ToString() + PostFix; + + if (CurrentValue + Increment > floatRange.max) + { + ThisOption.PlusBtn.SetInteractable(false); + ThisOption.MinusBtn.SetInteractable(true); + } + else if (CurrentValue - Increment < floatRange.min) + { + ThisOption.PlusBtn.SetInteractable(true); + ThisOption.MinusBtn.SetInteractable(false); + } + else + { + ThisOption.PlusBtn.SetInteractable(true); + ThisOption.MinusBtn.SetInteractable(true); + } + + BetterDataManager.SaveSetting(Id, CurrentValue.ToString()); + } + + public void Increase() + { + if (CurrentValue + Increment <= floatRange.max) + { + CurrentValue += Increment; + AdjustButtonsActiveState(); + } + } + + public void Decrease() + { + if (CurrentValue - Increment >= floatRange.min) + { + CurrentValue -= Increment; + AdjustButtonsActiveState(); + } + } + + public void Load(float DefaultValue) + { + if (BetterDataManager.CanLoadSetting(Id)) + { + if (ThisOption != null) + { + var Float = BetterDataManager.LoadFloatSetting(Id); + CurrentValue = Float; + } + } + else + { + BetterDataManager.SaveSetting(Id, DefaultValue.ToString()); + } + } + + public override float GetFloat() + { + if (BetterDataManager.CanLoadSetting(Id)) + { + return BetterDataManager.LoadFloatSetting(Id); + } + else + { + return CurrentValue; + } + } + + public override int GetInt() + { + if (BetterDataManager.CanLoadSetting(Id)) + { + return (int)BetterDataManager.LoadFloatSetting(Id); + } + else + { + return (int)CurrentValue; + } + } + + public override void SetData(OptionBehaviour optionBehaviour) + { + optionBehaviour.data = new BaseGameSetting + { + Title = StringNames.None, + Type = OptionTypes.Float, + }; + } +} diff --git a/Modules/OptionItems/BetterOptionHeaderItem.cs b/Modules/OptionItems/BetterOptionHeaderItem.cs new file mode 100644 index 0000000..d11f3d9 --- /dev/null +++ b/Modules/OptionItems/BetterOptionHeaderItem.cs @@ -0,0 +1,32 @@ +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionHeaderItem : BetterOptionItem +{ + public BetterOptionItem Create(GameOptionsMenu gameOptionsMenu, string name) + { + if (gameOptionsMenu == null) + { + return this; + } + + Tab = gameOptionsMenu; + Name = name; + CategoryHeaderMasked categoryHeaderMasked = UnityEngine.Object.Instantiate(gameOptionsMenu.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); + categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f; + categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f - 0.45f * SpacingNum, -2f); + categoryHeaderMasked.Title.text = name; + categoryHeaderMasked.Background.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); + if (categoryHeaderMasked.Divider != null) + { + categoryHeaderMasked.Divider.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); + } + categoryHeaderMasked.Title.fontMaterial.SetFloat("_StencilComp", 3f); + categoryHeaderMasked.Title.fontMaterial.SetFloat("_Stencil", maskLayer); + + SpacingNum += 1.6f; + + return this; + } +} diff --git a/Modules/OptionItems/BetterOptionIntItem.cs b/Modules/OptionItems/BetterOptionIntItem.cs new file mode 100644 index 0000000..3610861 --- /dev/null +++ b/Modules/OptionItems/BetterOptionIntItem.cs @@ -0,0 +1,155 @@ +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionIntItem : BetterOptionItem +{ + public int CurrentValue; + public IntRange intRange = new(0, 180); + public int Increment = 1; + private NumberOption? ThisOption; + private string PostFix; + + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, int[] values, int DefaultValue, string postFix = "", BetterOptionItem Parent = null) + { + Id = id; + + if (gameOptionsMenu == null) + { + Load(DefaultValue); + return this; + } + + if (values.Length is < 3 or > 3) return null; + + NumberOption optionBehaviour = UnityEngine.Object.Instantiate(gameOptionsMenu.numberOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); + optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); + SetUp(optionBehaviour); + optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); + SpacingNum++; + + // Fix Game Crash + foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) + { + optionBehaviour.data = rulesCategory.AllGameSettings.ToArray().FirstOrDefault(item => item.Type == OptionTypes.Number); + } + + optionBehaviour.PlusBtn.OnClick.RemoveAllListeners(); + optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); + optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase())); + optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease())); + + // Set data + Tab = gameOptionsMenu; + Name = name; + TitleText = optionBehaviour.TitleText; + Option = optionBehaviour; + PostFix = postFix; + ThisOption = optionBehaviour; + + intRange = new(values[0], values[1]); + Increment = values[2]; + + if (DefaultValue < intRange.min) DefaultValue = intRange.min; + if (DefaultValue > intRange.max) DefaultValue = intRange.max; + CurrentValue = DefaultValue; + + Load(DefaultValue); + AdjustButtonsActiveState(); + + BetterOptionItems.Add(this); + return this; + } + + private void AdjustButtonsActiveState() + { + if (ThisOption == null) return; + + ThisOption.ValueText.text = CurrentValue.ToString() + PostFix; + + if (CurrentValue + Increment > intRange.max) + { + ThisOption.PlusBtn.SetInteractable(false); + ThisOption.MinusBtn.SetInteractable(true); + } + else if (CurrentValue - Increment < intRange.min) + { + ThisOption.PlusBtn.SetInteractable(true); + ThisOption.MinusBtn.SetInteractable(false); + } + else + { + ThisOption.PlusBtn.SetInteractable(true); + ThisOption.MinusBtn.SetInteractable(true); + } + + BetterDataManager.SaveSetting(Id, CurrentValue.ToString()); + } + + public void Increase() + { + if (CurrentValue + Increment <= intRange.max) + { + CurrentValue += Increment; + AdjustButtonsActiveState(); + } + } + + public void Decrease() + { + if (CurrentValue - Increment >= intRange.min) + { + CurrentValue -= Increment; + AdjustButtonsActiveState(); + } + } + + public void Load(int DefaultValue) + { + if (BetterDataManager.CanLoadSetting(Id)) + { + if (ThisOption != null) + { + var Int = BetterDataManager.LoadIntSetting(Id); + CurrentValue = Int; + } + } + else + { + BetterDataManager.SaveSetting(Id, DefaultValue.ToString()); + } + } + + public override float GetFloat() + { + if (BetterDataManager.CanLoadSetting(Id)) + { + return BetterDataManager.LoadIntSetting(Id); + } + else + { + return CurrentValue; + } + } + + public override int GetInt() + { + if (BetterDataManager.CanLoadSetting(Id)) + { + return BetterDataManager.LoadIntSetting(Id); + } + else + { + return CurrentValue; + } + } + + public override void SetData(OptionBehaviour optionBehaviour) + { + optionBehaviour.data = new BaseGameSetting + { + Title = StringNames.None, + Type = OptionTypes.Float, + }; + } +} diff --git a/Modules/OptionItems/BetterOptionItem.cs b/Modules/OptionItems/BetterOptionItem.cs new file mode 100644 index 0000000..622b674 --- /dev/null +++ b/Modules/OptionItems/BetterOptionItem.cs @@ -0,0 +1,63 @@ +using TMPro; +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionItem +{ + public float StaticSpacingNum => 0.45f; + public static List BetterOptionItems = []; + public static float SpacingNum = 0; + + public int maskLayer = 20; + public int Id = 0; + public GameOptionsMenu? Tab; + public OptionBehaviour? Option; + public string? Name = "None"; + public TextMeshPro? TitleText; + + public void SetUp(OptionBehaviour optionBehaviour) + { + SetData(optionBehaviour); + SpriteRenderer[] componentsInChildren = optionBehaviour.GetComponentsInChildren(true); + for (int i = 0; i < componentsInChildren.Length; i++) + { + componentsInChildren[i].material.SetInt(PlayerMaterial.MaskLayer, maskLayer); + } + foreach (TextMeshPro textMeshPro in optionBehaviour.GetComponentsInChildren(true)) + { + textMeshPro.fontMaterial.SetFloat("_StencilComp", 3f); + textMeshPro.fontMaterial.SetFloat("_Stencil", maskLayer); + } + } + + public virtual bool GetBool() + { + throw new NotImplementedException(); + } + + public virtual float GetFloat() + { + throw new NotImplementedException(); + } + + public virtual int GetInt() + { + throw new NotImplementedException(); + } + + public virtual int GetValue() + { + throw new NotImplementedException(); + } + + public virtual void SetData(OptionBehaviour optionBehaviour) + { + throw new NotImplementedException(); + } + + public virtual void ValueChanged(int id, OptionBehaviour optionBehaviour) + { + throw new NotImplementedException(); + } +} diff --git a/Modules/OptionItems/BetterOptionStringItem.cs b/Modules/OptionItems/BetterOptionStringItem.cs new file mode 100644 index 0000000..4cee80c --- /dev/null +++ b/Modules/OptionItems/BetterOptionStringItem.cs @@ -0,0 +1,127 @@ +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionStringItem : BetterOptionItem +{ + public string[] Values = []; + public int CurrentValue; + private StringOption? ThisOption; + + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, string[] strings, int Default = 0, BetterOptionItem Parent = null) + { + Id = id; + + if (gameOptionsMenu == null) + { + Load(Default); + return this; + } + + StringOption optionBehaviour = UnityEngine.Object.Instantiate(gameOptionsMenu.stringOptionOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); + optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); + SetUp(optionBehaviour); + optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); + SpacingNum++; + + optionBehaviour.PlusBtn.OnClick.RemoveAllListeners(); + optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); + optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase())); + optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease())); + + // Set data + Tab = gameOptionsMenu; + Name = name; + TitleText = optionBehaviour.TitleText; + Option = optionBehaviour; + Values = strings; + CurrentValue = Default; + ThisOption = optionBehaviour; + + Load(Default); + AdjustButtonsActiveState(); + + BetterOptionItems.Add(this); + return this; + } + + private void AdjustButtonsActiveState() + { + if (ThisOption == null) return; + + ThisOption.ValueText.text = Values[CurrentValue]; + + if (CurrentValue >= Values.Length - 1) + { + ThisOption.PlusBtn.SetInteractable(false); + ThisOption.MinusBtn.SetInteractable(true); + } + else if (CurrentValue <= 0) + { + ThisOption.PlusBtn.SetInteractable(true); + ThisOption.MinusBtn.SetInteractable(false); + } + else + { + ThisOption.PlusBtn.SetInteractable(true); + ThisOption.MinusBtn.SetInteractable(true); + } + + BetterDataManager.SaveSetting(Id, CurrentValue.ToString()); + } + + public void Increase() + { + if (CurrentValue < Values.Length) + { + CurrentValue++; + AdjustButtonsActiveState(); + } + } + + public void Decrease() + { + if (CurrentValue > 0) + { + CurrentValue--; + AdjustButtonsActiveState(); + } + } + + public void Load(int DefaultValue) + { + if (BetterDataManager.CanLoadSetting(Id)) + { + if (ThisOption != null) + { + var Int = BetterDataManager.LoadIntSetting(Id); + CurrentValue = Int; + } + } + else + { + BetterDataManager.SaveSetting(Id, DefaultValue.ToString()); + } + } + + public override int GetValue() + { + if (BetterDataManager.CanLoadSetting(Id)) + { + return BetterDataManager.LoadIntSetting(Id); + } + else + { + return CurrentValue; + } + } + + public override void SetData(OptionBehaviour optionBehaviour) + { + optionBehaviour.data = new BaseGameSetting + { + Title = StringNames.None, + Type = OptionTypes.String, + }; + } +} diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs new file mode 100644 index 0000000..738c98d --- /dev/null +++ b/Patches/GameSettingMenuPatch.cs @@ -0,0 +1,163 @@ +using HarmonyLib; +using UnityEngine; + +namespace BetterAmongUs.Patches; + + +class BetterGameSettings +{ + public static BetterOptionItem? WhenCheating; +} + +[HarmonyPatch(typeof(GameSettingMenu))] +static class GameSettingMenuPatch +{ + private static PassiveButton BetterSettingsButton; + private static GameOptionsMenu BetterSettingsTab; + + public static void SetupSettings(bool IsPreload = false) + { + BetterOptionItem.SpacingNum = 0; + + new BetterOptionHeaderItem().Create(BetterSettingsTab, "Anti-Cheat Settings"); + + BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(0, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); + + if (IsPreload || GameStates.IsHideNSeek) + { + new BetterOptionHeaderItem().Create(BetterSettingsTab, "Advanced Hide And Seek Settings"); + } + + /* + new BetterOptionCheckboxItem().Create(0, BetterSettingsTab, "CheckBox Test", true); + new BetterOptionStringItem().Create(1, BetterSettingsTab, "String Test", ["Test 1", "Test 2", "Test 3"]); + new BetterOptionFloatItem().Create(2, BetterSettingsTab, "Float Test 1", [0f, 180f, 2.5f], 0f, ""); + new BetterOptionIntItem().Create(5, BetterSettingsTab, "Int Test", [0, 5, 1], 0, ""); + new BetterOptionHeaderItem().Create(BetterSettingsTab, "Test Settings 2"); + */ + + if (BetterSettingsTab != null) + BetterSettingsTab.scrollBar.SetYBoundsMax(0.62f * BetterOptionItem.SpacingNum / 2); + } + + private static void Initialize() + { + _ = new LateTask(() => + { + foreach (var item in BetterOptionItem.BetterOptionItems) + { + if (item.TitleText != null) + { + item.TitleText.text = item.Name; + } + } + }, 0.005f, shoudLog: false); + } + + [HarmonyPatch(nameof(GameSettingMenu.Update))] + [HarmonyPostfix] + public static void Update_Postfix(/*GameSettingMenu __instance*/) + { + if (BetterSettingsButton != null) + { + BetterSettingsButton.buttonText.SetText("Better Settings"); + + if (!BetterSettingsButton.selected && !BetterSettingsButton.activeSprites.active) + { + BetterSettingsButton.buttonText.color = new Color(0f, 1f, 0f, 1f); + } + else + { + BetterSettingsButton.buttonText.color = new Color(0.35f, 1f, 0.35f, 1f); + } + } + } + + [HarmonyPatch(nameof(GameSettingMenu.Start))] + [HarmonyPostfix] + public static void Start_Postfix(GameSettingMenu __instance) + { + __instance.gameObject.transform.SetLocalY(-0.1f); + GameObject PanelSprite = __instance.gameObject.transform.Find("PanelSprite").gameObject; + if (PanelSprite != null && !GameStates.IsHideNSeek) + { + PanelSprite.transform.SetLocalY(-0.32f); + PanelSprite.transform.localScale = new Vector3(PanelSprite.transform.localScale.x, 0.625f); + } + + BetterSettingsButton = UnityEngine.Object.Instantiate(__instance.GameSettingsButton, __instance.GameSettingsButton.transform.parent); + + BetterSettingsButton.name = "BetterSettings"; + BetterSettingsButton.OnClick.RemoveAllListeners(); + BetterSettingsButton.OnMouseOver.RemoveAllListeners(); + + if (!GameStates.IsHideNSeek) + { + BetterSettingsButton.transform.position = BetterSettingsButton.transform.position - new Vector3(0f, 1.265f, 0f); + } + else + { + BetterSettingsButton.transform.position = BetterSettingsButton.transform.position - new Vector3(0f, 0.64f, 0f); + } + + BetterSettingsButton.activeSprites.GetComponent().color = new Color(0f, 1f, 0.35f, 1f); + BetterSettingsButton.inactiveSprites.GetComponent().color = new Color(0f, 1f, 0.35f, 1f); + BetterSettingsButton.selectedSprites.GetComponent().color = new Color(0f, 1f, 0.35f, 1f); + + + BetterSettingsButton.OnClick.AddListener(new Action(() => + { + __instance.ChangeTab(3, false); + })); + + BetterSettingsTab = UnityEngine.Object.Instantiate(__instance.GameSettingsTab, __instance.GameSettingsTab.transform.parent); + BetterSettingsTab.name = "BETTER SETTINGS TAB"; + BetterSettingsTab.scrollBar.Inner.DestroyChildren(); + + __instance.GamePresetsButton.OnMouseOver.RemoveAllListeners(); + __instance.GameSettingsButton.OnMouseOver.RemoveAllListeners(); + __instance.RoleSettingsButton.OnMouseOver.RemoveAllListeners(); + + __instance.ChangeTab(1, false); + + SetupSettings(); + } + + [HarmonyPatch(nameof(GameSettingMenu.ChangeTab))] + [HarmonyPrefix] + public static void ChangeTab_Prefix(GameSettingMenu __instance, [HarmonyArgument(0)] int tabNum, [HarmonyArgument(1)] bool previewOnly) + { + if (BetterSettingsTab == null || BetterSettingsButton == null) return; + + BetterSettingsTab.gameObject.SetActive(false); + BetterSettingsButton.SelectButton(false); + + if ((previewOnly && Controller.currentTouchType == Controller.TouchType.Joystick) || !previewOnly) + { + switch (tabNum) + { + case 3: + BetterSettingsTab.gameObject.SetActive(true); + __instance.MenuDescriptionText.text = "Edit better settings for your lobby and gameplay."; + break; + } + } + } + + [HarmonyPatch(nameof(GameSettingMenu.ChangeTab))] + [HarmonyPostfix] + public static void ChangeTab_Postfix(GameSettingMenu __instance, [HarmonyArgument(0)] int tabNum) + { + if (BetterSettingsTab == null || BetterSettingsButton == null) return; + + BetterSettingsButton.buttonText.color = new Color(0f, 1f, 0f, 1f); + + switch (tabNum) + { + case 3: + BetterSettingsButton.SelectButton(true); + Initialize(); + break; + } + } +} \ No newline at end of file From cd5c2c53396a7ee3765642478aee9190f4ae93f1 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Fri, 23 Aug 2024 20:54:21 -0500 Subject: [PATCH 09/22] add settings and fixes --- Modules/AntiCheat.cs | 6 +-- Modules/BetterNotificationManager.cs | 2 +- Modules/ExtendedPlayerControl.cs | 14 ++++++- Modules/OptionItems/BetterOptionTitleItem.cs | 42 ++++++++++++++++++++ Patches/GamePlayManagerPatch.cs | 40 +++++++++---------- Patches/GameSettingMenuPatch.cs | 13 +++++- Patches/PlayerControlPatch.cs | 8 ++++ Patches/RoleManagerPatch.cs | 2 +- main.cs | 8 ++-- 9 files changed, 102 insertions(+), 33 deletions(-) create mode 100644 Modules/OptionItems/BetterOptionTitleItem.cs diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index 4bd3c0e..7251cf8 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -27,15 +27,15 @@ class AntiCheat if (SickoData.ContainsKey(hashPuid)) { - player.Kick(true, $"banned by Anti-Cheat!\n Reason: Known Sicko Menu User", true); + player.Kick(true, "{0} by Anti-Cheat!\n Reason: Known Sicko Menu User", true); } else if (AUMData.ContainsKey(hashPuid)) { - player.Kick(true, $"banned by Anti-Cheat!\n Reason: Known AUM User", true); + player.Kick(true, "{0} by Anti-Cheat!\n Reason: Known AUM User", true); } else if (PlayerData.ContainsKey(hashPuid)) { - player.Kick(true, $"banned by Anti-Cheat!\n Reason: Known Cheater", true); + player.Kick(true, "{0} by Anti-Cheat!\n Reason: Known Cheater", true); } } } diff --git a/Modules/BetterNotificationManager.cs b/Modules/BetterNotificationManager.cs index 5a20c92..7c3ba8a 100644 --- a/Modules/BetterNotificationManager.cs +++ b/Modules/BetterNotificationManager.cs @@ -50,7 +50,7 @@ class BetterNotificationManager if (GameStates.IsHost && kickPlayer) { - player.Kick(true, $"banned by Anti-Cheat!\n Reason: {reason}", true); + player.Kick(true, "{0} " + $"by Anti-Cheat!\n Reason: {reason}", true); } } diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs index 7ed2ece..8ba467b 100644 --- a/Modules/ExtendedPlayerControl.cs +++ b/Modules/ExtendedPlayerControl.cs @@ -108,14 +108,24 @@ static class ExtendedPlayerControl return; } + if (AntiCheatBan) + { + if (BetterGameSettings.WhenCheating.GetValue() == 0) + { + return; + } + + ban = ban && BetterGameSettings.WhenCheating.GetValue() == 2; + } + if (setReasonInfo != "") { - GameDataShowNotificationPatch.BetterShowNotification(player.Data, forceReasonText: setReasonInfo); + GameDataShowNotificationPatch.BetterShowNotification(player.Data, forceReasonText: string.Format(setReasonInfo, ban ? "banned" : "kicked")); } AmongUsClient.Instance.KickPlayer(player.GetClientId(), ban); - player.BetterData().BannedByAntiCheat = AntiCheatBan && ban; + player.BetterData().BannedByAntiCheat = AntiCheatBan; } // RPCs diff --git a/Modules/OptionItems/BetterOptionTitleItem.cs b/Modules/OptionItems/BetterOptionTitleItem.cs new file mode 100644 index 0000000..3abc53f --- /dev/null +++ b/Modules/OptionItems/BetterOptionTitleItem.cs @@ -0,0 +1,42 @@ +using Rewired; +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionTitleItem : BetterOptionItem +{ + public BetterOptionItem Create(GameOptionsMenu gameOptionsMenu, string name) + { + if (gameOptionsMenu == null) + { + return this; + } + + ToggleOption optionBehaviour = UnityEngine.Object.Instantiate(gameOptionsMenu.checkboxOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); + optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); + SetUp(optionBehaviour); + SpacingNum++; + UnityEngine.Object.Destroy(optionBehaviour.CheckMark.transform.parent.gameObject); + optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Center; + optionBehaviour.TitleText.outlineColor = Color.black; + optionBehaviour.TitleText.outlineWidth = 0.2f; + + // Set data + Tab = gameOptionsMenu; + Name = $"{name}"; + Option = optionBehaviour; + TitleText = optionBehaviour.TitleText; + + BetterOptionItems.Add(this); + return this; + } + + public override void SetData(OptionBehaviour optionBehaviour) + { + optionBehaviour.data = new BaseGameSetting + { + Title = StringNames.None, + Type = OptionTypes.Checkbox, + }; + } +} diff --git a/Patches/GamePlayManagerPatch.cs b/Patches/GamePlayManagerPatch.cs index 125ef54..36a7b93 100644 --- a/Patches/GamePlayManagerPatch.cs +++ b/Patches/GamePlayManagerPatch.cs @@ -19,26 +19,6 @@ class GamePlayManager { AntiCheat.PauseAntiCheat(); } - - // Clear unused Better Data - try - { - var keysToRemove = new List(); - - foreach (var betterInfo in PlayerControlDataExtension.playerInfo) - { - if (!Main.AllPlayerControls.Any(pc => pc.Data.Puid == betterInfo.Key)) - { - keysToRemove.Add(betterInfo.Key); - } - } - - foreach (var key in keysToRemove) - { - PlayerControlDataExtension.playerInfo.Remove(key); - } - } - catch { } } [HarmonyPatch(nameof(LobbyBehaviour.Start))] [HarmonyPostfix] @@ -61,6 +41,26 @@ class GamePlayManager { if (Main.DisableLobbyTheme.Value) SoundManager.instance.StopSound(LobbyBehaviour.Instance.MapTheme); + + // Clear unused Better Data + try + { + var keysToRemove = new List(); + + foreach (var betterInfo in PlayerControlDataExtension.playerInfo) + { + if (Main.AllPlayerControls.Any(pc => pc.Data.Puid == betterInfo.Key)) + continue; + + keysToRemove.Add(betterInfo.Key); + } + + foreach (var key in keysToRemove) + { + PlayerControlDataExtension.playerInfo.Remove(key); + } + } + catch { } } } diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index 738c98d..ed58fc1 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -1,4 +1,5 @@ -using HarmonyLib; +using AmongUs.GameOptions; +using HarmonyLib; using UnityEngine; namespace BetterAmongUs.Patches; @@ -7,6 +8,8 @@ namespace BetterAmongUs.Patches; class BetterGameSettings { public static BetterOptionItem? WhenCheating; + public static BetterOptionItem? InvalidFriendCode; + public static BetterOptionItem? HideAndSeekImpNum; } [HarmonyPatch(typeof(GameSettingMenu))] @@ -22,10 +25,16 @@ static class GameSettingMenuPatch new BetterOptionHeaderItem().Create(BetterSettingsTab, "Anti-Cheat Settings"); BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(0, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); + BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(100, BetterSettingsTab, "Allow invalid friendCodes", true); if (IsPreload || GameStates.IsHideNSeek) { - new BetterOptionHeaderItem().Create(BetterSettingsTab, "Advanced Hide And Seek Settings"); + if (IsPreload || Main.BetterRoleAlgorithma.Value) + { + new BetterOptionHeaderItem().Create(BetterSettingsTab, "Hide & Seek Settings"); + new BetterOptionTitleItem().Create(BetterSettingsTab, $"Imposter"); + BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(200, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, ""); + } } /* diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs index 313ad15..18e0adc 100644 --- a/Patches/PlayerControlPatch.cs +++ b/Patches/PlayerControlPatch.cs @@ -115,6 +115,14 @@ class PlayerControlPatch { friendCode = "No Friend Code"; friendCodeColor = "#ff0000"; + + if (GameStates.IsHost) + { + if (BetterGameSettings.InvalidFriendCode.GetBool()) + { + player.Kick(true, "{0} by Anti-Cheat!\n Reason: Invalid Friend Code", true); + } + } } if (DataManager.Settings.Gameplay.StreamerMode == true) { diff --git a/Patches/RoleManagerPatch.cs b/Patches/RoleManagerPatch.cs index fde5685..eb4ad5f 100644 --- a/Patches/RoleManagerPatch.cs +++ b/Patches/RoleManagerPatch.cs @@ -268,7 +268,7 @@ public class RoleManagerPatch foreach (var addplayer in Main.AllPlayerControls.Where(pc => !ImpostorMultiplier.ContainsKey(Utils.GetHashPuid(pc)))) ImpostorMultiplier[Utils.GetHashPuid(addplayer)] = 0; - int NumImpostors = 1; + int NumImpostors = BetterGameSettings.HideAndSeekImpNum.GetInt(); int NumPlayers = Main.AllPlayerControls.Length; diff --git a/main.cs b/main.cs index d91994f..58e2ced 100644 --- a/main.cs +++ b/main.cs @@ -24,11 +24,11 @@ public class Main : BasePlugin { public const ReleaseTypes ReleaseBuildType = ReleaseTypes.Release; public const string CanaryNum = "0"; - public const string HotfixNum = "3"; - public const bool IsHotFix = true; + public const string HotfixNum = "0"; + public const bool IsHotFix = false; public const string PluginGuid = "com.d1gq.betteramongus"; - public const string PluginVersion = "1.0.4"; - public const string ReleaseDate = "08.21.2024"; // mm/dd/yyyy + public const string PluginVersion = "1.0.5"; + public const string ReleaseDate = "08.22.2024"; // mm/dd/yyyy public const string Github = "https://github.com/D1GQ/BetterAmongUs-Public"; public const string Discord = "https://discord.gg/vjYrXpzNAn"; From 111331fedc243d6325a26b601148a9749115f5c0 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Fri, 23 Aug 2024 20:54:47 -0500 Subject: [PATCH 10/22] oops --- BetterAmongUs.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/BetterAmongUs.csproj b/BetterAmongUs.csproj index 612220b..1d0bb6b 100644 --- a/BetterAmongUs.csproj +++ b/BetterAmongUs.csproj @@ -25,7 +25,4 @@ - - - \ No newline at end of file From 3ef7e2a255b15e225e095a000c755d05ef6d1ff8 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 03:05:59 -0500 Subject: [PATCH 11/22] ban list settings --- Modules/RPC.cs | 2 +- Patches/ClientOptionsPatch.cs | 6 ---- Patches/ClientPatch.cs | 2 +- Patches/GameSettingMenuPatch.cs | 12 +++++-- Patches/PlayerJoinAndLeftPatch.cs | 57 ++++++++++++++++--------------- main.cs | 2 -- 6 files changed, 41 insertions(+), 40 deletions(-) diff --git a/Modules/RPC.cs b/Modules/RPC.cs index 0c5853d..623b40a 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -244,7 +244,7 @@ internal static class RPC } // Check banned words - if (Main.UseBannedList.Value) + if (BetterGameSettings.UseBanWordList.GetBool()) { try { diff --git a/Patches/ClientOptionsPatch.cs b/Patches/ClientOptionsPatch.cs index a7efcb3..cc4f2d4 100644 --- a/Patches/ClientOptionsPatch.cs +++ b/Patches/ClientOptionsPatch.cs @@ -13,7 +13,6 @@ public static class OptionsMenuBehaviourPatch private static ClientOptionItem BetterHost; private static ClientOptionItem BetterRoleAlgorithma; private static ClientOptionItem BetterNotifications; - private static ClientOptionItem UseBannedList; private static ClientOptionItem LobbyPlayerInfo; private static ClientOptionItem DisableLobbyTheme; private static ClientOptionItem UnlockFPS; @@ -80,11 +79,6 @@ public static class OptionsMenuBehaviourPatch BetterNotificationManager.Notifying = false; } } - - if (UseBannedList == null || UseBannedList.ToggleButton == null) - { - UseBannedList = ClientOptionItem.Create("Use Ban Lists", Main.UseBannedList, __instance); - } if (LobbyPlayerInfo == null || LobbyPlayerInfo.ToggleButton == null) { diff --git a/Patches/ClientPatch.cs b/Patches/ClientPatch.cs index dc59b23..c97c6a0 100644 --- a/Patches/ClientPatch.cs +++ b/Patches/ClientPatch.cs @@ -77,7 +77,7 @@ public class ClientPatch [HarmonyPrefix] public static void KickPlayer_Prefix(ref int clientId, ref bool ban) { - if (ban && Main.UseBannedList.Value) + if (ban && BetterGameSettings.UseBanPlayerList.GetBool()) { NetworkedPlayerInfo info = Utils.PlayerFromClientId(clientId).Data; BetterDataManager.SaveBanList(info.FriendCode, info.Puid); diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index ed58fc1..ac415b7 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -9,6 +9,9 @@ class BetterGameSettings { public static BetterOptionItem? WhenCheating; public static BetterOptionItem? InvalidFriendCode; + public static BetterOptionItem? UseBanPlayerList; + public static BetterOptionItem? UseBanNameList; + public static BetterOptionItem? UseBanWordList; public static BetterOptionItem? HideAndSeekImpNum; } @@ -24,8 +27,11 @@ static class GameSettingMenuPatch new BetterOptionHeaderItem().Create(BetterSettingsTab, "Anti-Cheat Settings"); - BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(0, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); - BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(100, BetterSettingsTab, "Allow invalid friendCodes", true); + BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(100, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); + BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(200, BetterSettingsTab, "Allow invalid friendCodes", true); + BetterGameSettings.UseBanPlayerList = new BetterOptionCheckboxItem().Create(300, BetterSettingsTab, "Use Ban Player List", true); + BetterGameSettings.UseBanNameList = new BetterOptionCheckboxItem().Create(400, BetterSettingsTab, "Use Ban Name List", true); + BetterGameSettings.UseBanWordList = new BetterOptionCheckboxItem().Create(500, BetterSettingsTab, "Use Ban Word List", true); if (IsPreload || GameStates.IsHideNSeek) { @@ -33,7 +39,7 @@ static class GameSettingMenuPatch { new BetterOptionHeaderItem().Create(BetterSettingsTab, "Hide & Seek Settings"); new BetterOptionTitleItem().Create(BetterSettingsTab, $"Imposter"); - BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(200, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, ""); + BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(1000, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, ""); } } diff --git a/Patches/PlayerJoinAndLeftPatch.cs b/Patches/PlayerJoinAndLeftPatch.cs index 8784f25..17e9a4e 100644 --- a/Patches/PlayerJoinAndLeftPatch.cs +++ b/Patches/PlayerJoinAndLeftPatch.cs @@ -56,7 +56,7 @@ public static class OnPlayerJoinedPatch client.Character.RpcSendHostChat(HudManagerPatch.WelcomeMessage, sendToBetterUser: false); // Auto ban player on ban list - if (Main.UseBannedList.Value) + if (BetterGameSettings.UseBanPlayerList.GetBool()) { if (player != null) { @@ -77,34 +77,37 @@ public static class OnPlayerJoinedPatch } } catch { } - - try - { - // Normalize and remove spaces and special characters from names - Func normalizeName = name => new string(name.Where(c => char.IsLetterOrDigit(c)).ToArray()).ToLower(); - - // Read all banned names into a HashSet with normalized names - HashSet bannedNames = new HashSet( - File.ReadLines(BetterDataManager.banNameListFile) - .Select(normalizeName) - .Where(name => !string.IsNullOrWhiteSpace(name)) - ); - - string normalizedPlayerName = normalizeName(player.Data.PlayerName); - - // Check if any banned name is a prefix of the player's normalized name - bool isNameBanned = bannedNames.Any(bannedName => - normalizedPlayerName.StartsWith(bannedName) - ); - - if (!string.IsNullOrEmpty(normalizedPlayerName) && isNameBanned) - { - player.Kick(false, $"has been kicked due to their name being on the ban name list!"); - } - } - catch { } } } + + if (BetterGameSettings.UseBanNameList.GetBool()) + { + try + { + // Normalize and remove spaces and special characters from names + Func normalizeName = name => new string(name.Where(c => char.IsLetterOrDigit(c)).ToArray()).ToLower(); + + // Read all banned names into a HashSet with normalized names + HashSet bannedNames = new HashSet( + File.ReadLines(BetterDataManager.banNameListFile) + .Select(normalizeName) + .Where(name => !string.IsNullOrWhiteSpace(name)) + ); + + string normalizedPlayerName = normalizeName(player.Data.PlayerName); + + // Check if any banned name is a prefix of the player's normalized name + bool isNameBanned = bannedNames.Any(bannedName => + normalizedPlayerName.StartsWith(bannedName) + ); + + if (!string.IsNullOrEmpty(normalizedPlayerName) && isNameBanned) + { + player.Kick(false, $"has been kicked due to their name being on the ban name list!"); + } + } + catch { } + } } }, 2.5f, "OnPlayerJoinedPatch", false); } diff --git a/main.cs b/main.cs index 58e2ced..c92472a 100644 --- a/main.cs +++ b/main.cs @@ -176,7 +176,6 @@ public class Main : BasePlugin public static ConfigEntry BetterHost { get; private set; } public static ConfigEntry BetterRoleAlgorithma { get; private set; } public static ConfigEntry BetterNotifications { get; private set; } - public static ConfigEntry UseBannedList { get; private set; } public static ConfigEntry LobbyPlayerInfo { get; private set; } public static ConfigEntry DisableLobbyTheme { get; private set; } public static ConfigEntry UnlockFPS { get; private set; } @@ -188,7 +187,6 @@ public class Main : BasePlugin BetterHost = Config.Bind("Better Options", "BetterHost", false); BetterRoleAlgorithma = Config.Bind("Better Options", "BetterRoleAlgorithma", true); BetterNotifications = Config.Bind("Better Options", "BetterNotifications", true); - UseBannedList = Config.Bind("Better Options", "UseBannedList", true); LobbyPlayerInfo = Config.Bind("Better Options", "LobbyPlayerInfo", true); DisableLobbyTheme = Config.Bind("Better Options", "DisableLobbyTheme", true); UnlockFPS = Config.Bind("Better Options", "UnlockFPS", false); From 57be1ac849c3bfdc27edb7c124ae3ca654191824 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 05:34:56 -0500 Subject: [PATCH 12/22] More settings and fixes --- Modules/AntiCheat.cs | 13 +- .../OptionItems/BetterOptionCheckboxItem.cs | 2 +- Modules/OptionItems/BetterOptionFloatItem.cs | 2 +- Modules/OptionItems/BetterOptionIntItem.cs | 2 +- Modules/OptionItems/BetterOptionItem.cs | 3 +- Modules/OptionItems/BetterOptionStringItem.cs | 2 +- .../NoneOption/BetterOptionDividerItem.cs | 32 +++++ .../BetterOptionHeaderItem.cs | 6 +- .../{ => NoneOption}/BetterOptionTitleItem.cs | 6 +- Patches/GameSettingMenuPatch.cs | 126 ++++++++++++++---- 10 files changed, 152 insertions(+), 42 deletions(-) create mode 100644 Modules/OptionItems/NoneOption/BetterOptionDividerItem.cs rename Modules/OptionItems/{ => NoneOption}/BetterOptionHeaderItem.cs (91%) rename Modules/OptionItems/{ => NoneOption}/BetterOptionTitleItem.cs (83%) diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index 7251cf8..4206607 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -1,4 +1,5 @@ using AmongUs.GameOptions; +using BetterAmongUs.Patches; using HarmonyLib; using Hazel; using InnerNet; @@ -104,7 +105,7 @@ class AntiCheat if (player == PlayerControl.LocalPlayer || PlayerControl.LocalPlayer == null || player == null || !IsEnabled) return; - if (callId is unchecked((byte)CustomRPC.Sicko) && Main.AntiCheat.Value) + if (callId is unchecked((byte)CustomRPC.Sicko) && Main.AntiCheat.Value && BetterGameSettings.DetectCheatClients.GetBool()) { if (reader.BytesRemaining == 0) { @@ -122,7 +123,7 @@ class AntiCheat return; } - if (callId is unchecked((byte)CustomRPC.AUM) && Main.AntiCheat.Value) + if (callId is unchecked((byte)CustomRPC.AUM) && Main.AntiCheat.Value && BetterGameSettings.DetectCheatClients.GetBool()) { try { @@ -158,7 +159,7 @@ class AntiCheat PlayerControl AUMPlayer = Main.AllPlayerControls.First(pc => pc.Data.PlayerName == nameString && pc.CurrentOutfit.ColorId == colorId); - if (AUMPlayer == null || !Main.AntiCheat.Value) return; + if (AUMPlayer == null || !Main.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool()) return; var flag = string.IsNullOrEmpty(nameString) && string.IsNullOrEmpty(msgString); var flag2 = AUMData.ContainsKey(Utils.GetHashPuid(AUMPlayer)); @@ -185,7 +186,7 @@ class AntiCheat MessageReader reader = MessageReader.Get(Oldreader); if (PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer || player.BetterData().IsBetterHost || reader == null || !IsEnabled || !Main.AntiCheat.Value - || GameStates.IsBetterHostLobby && !GameStates.IsHost) return; + || (GameStates.IsBetterHostLobby && !GameStates.IsHost) || !BetterGameSettings.DetectInvalidRPCs.GetBool()) return; RoleTypes? Role = player?.Data?.RoleType; Role ??= RoleTypes.Crewmate; @@ -357,7 +358,7 @@ class AntiCheat } if (!GameStates.IsHost || PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer || player.BetterData().IsBetterHost || !IsEnabled || !Main.AntiCheat.Value - || GameStates.IsBetterHostLobby && !GameStates.IsHost) return true; + || (GameStates.IsBetterHostLobby && !GameStates.IsHost) || !BetterGameSettings.DetectInvalidRPCs.GetBool()) return true; // Single Fix: 0 // Lights: 0-1-2-3-4 @@ -494,7 +495,7 @@ class AntiCheat } } - if (!IsEnabled || !Main.AntiCheat.Value || GameStates.IsBetterHostLobby && !GameStates.IsHost) return true; + if (!IsEnabled || !Main.AntiCheat.Value || (GameStates.IsBetterHostLobby && !GameStates.IsHost) || !BetterGameSettings.DetectInvalidRPCs.GetBool()) return true; RoleTypes Role = player.Data.RoleType; bool IsImpostor = player.IsImpostorTeam(); diff --git a/Modules/OptionItems/BetterOptionCheckboxItem.cs b/Modules/OptionItems/BetterOptionCheckboxItem.cs index f64b75b..61c7d6c 100644 --- a/Modules/OptionItems/BetterOptionCheckboxItem.cs +++ b/Modules/OptionItems/BetterOptionCheckboxItem.cs @@ -21,7 +21,7 @@ public class BetterOptionCheckboxItem : BetterOptionItem optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); SetUp(optionBehaviour); optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); - SpacingNum++; + SpacingNum += StaticSpacingNumPlus; // Set data optionBehaviour.CheckMark.GetComponent().enabled = Default; diff --git a/Modules/OptionItems/BetterOptionFloatItem.cs b/Modules/OptionItems/BetterOptionFloatItem.cs index a42c837..c0fcbce 100644 --- a/Modules/OptionItems/BetterOptionFloatItem.cs +++ b/Modules/OptionItems/BetterOptionFloatItem.cs @@ -26,7 +26,7 @@ public class BetterOptionFloatItem : BetterOptionItem optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); SetUp(optionBehaviour); optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); - SpacingNum++; + SpacingNum += StaticSpacingNumPlus; // Fix Game Crash foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) diff --git a/Modules/OptionItems/BetterOptionIntItem.cs b/Modules/OptionItems/BetterOptionIntItem.cs index 3610861..fd16411 100644 --- a/Modules/OptionItems/BetterOptionIntItem.cs +++ b/Modules/OptionItems/BetterOptionIntItem.cs @@ -26,7 +26,7 @@ public class BetterOptionIntItem : BetterOptionItem optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); SetUp(optionBehaviour); optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); - SpacingNum++; + SpacingNum += StaticSpacingNumPlus; // Fix Game Crash foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) diff --git a/Modules/OptionItems/BetterOptionItem.cs b/Modules/OptionItems/BetterOptionItem.cs index 622b674..6b8c937 100644 --- a/Modules/OptionItems/BetterOptionItem.cs +++ b/Modules/OptionItems/BetterOptionItem.cs @@ -5,7 +5,8 @@ namespace BetterAmongUs; public class BetterOptionItem { - public float StaticSpacingNum => 0.45f; + public float StaticSpacingNum => 1f; + public float StaticSpacingNumPlus => 0.45f; public static List BetterOptionItems = []; public static float SpacingNum = 0; diff --git a/Modules/OptionItems/BetterOptionStringItem.cs b/Modules/OptionItems/BetterOptionStringItem.cs index 4cee80c..203b280 100644 --- a/Modules/OptionItems/BetterOptionStringItem.cs +++ b/Modules/OptionItems/BetterOptionStringItem.cs @@ -22,7 +22,7 @@ public class BetterOptionStringItem : BetterOptionItem optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); SetUp(optionBehaviour); optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); - SpacingNum++; + SpacingNum += StaticSpacingNumPlus; optionBehaviour.PlusBtn.OnClick.RemoveAllListeners(); optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); diff --git a/Modules/OptionItems/NoneOption/BetterOptionDividerItem.cs b/Modules/OptionItems/NoneOption/BetterOptionDividerItem.cs new file mode 100644 index 0000000..abdf623 --- /dev/null +++ b/Modules/OptionItems/NoneOption/BetterOptionDividerItem.cs @@ -0,0 +1,32 @@ +using UnityEngine; + +namespace BetterAmongUs; + +public class BetterOptionDividerItem : BetterOptionItem +{ + public BetterOptionItem Create(GameOptionsMenu gameOptionsMenu) + { + if (gameOptionsMenu == null) + { + return this; + } + + SpacingNum += 0.15f; + + Tab = gameOptionsMenu; + Name = "Divider"; + CategoryHeaderMasked categoryHeaderMasked = UnityEngine.Object.Instantiate(gameOptionsMenu.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); + categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f; + categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f - StaticSpacingNum * SpacingNum, -2f); + UnityEngine.Object.Destroy(categoryHeaderMasked.Background.gameObject); + UnityEngine.Object.Destroy(categoryHeaderMasked.Title.gameObject); + if (categoryHeaderMasked.Divider != null) + { + categoryHeaderMasked.Divider.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); + } + + SpacingNum += 0.45f; + + return this; + } +} diff --git a/Modules/OptionItems/BetterOptionHeaderItem.cs b/Modules/OptionItems/NoneOption/BetterOptionHeaderItem.cs similarity index 91% rename from Modules/OptionItems/BetterOptionHeaderItem.cs rename to Modules/OptionItems/NoneOption/BetterOptionHeaderItem.cs index d11f3d9..34cae00 100644 --- a/Modules/OptionItems/BetterOptionHeaderItem.cs +++ b/Modules/OptionItems/NoneOption/BetterOptionHeaderItem.cs @@ -11,11 +11,13 @@ public class BetterOptionHeaderItem : BetterOptionItem return this; } + SpacingNum += 0.1f; + Tab = gameOptionsMenu; Name = name; CategoryHeaderMasked categoryHeaderMasked = UnityEngine.Object.Instantiate(gameOptionsMenu.categoryHeaderOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); categoryHeaderMasked.transform.localScale = Vector3.one * 0.63f; - categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f - 0.45f * SpacingNum, -2f); + categoryHeaderMasked.transform.localPosition = new Vector3(-0.903f, 2f - StaticSpacingNum * SpacingNum, -2f); categoryHeaderMasked.Title.text = name; categoryHeaderMasked.Background.material.SetInt(PlayerMaterial.MaskLayer, maskLayer); if (categoryHeaderMasked.Divider != null) @@ -25,7 +27,7 @@ public class BetterOptionHeaderItem : BetterOptionItem categoryHeaderMasked.Title.fontMaterial.SetFloat("_StencilComp", 3f); categoryHeaderMasked.Title.fontMaterial.SetFloat("_Stencil", maskLayer); - SpacingNum += 1.6f; + SpacingNum += 0.75f; return this; } diff --git a/Modules/OptionItems/BetterOptionTitleItem.cs b/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs similarity index 83% rename from Modules/OptionItems/BetterOptionTitleItem.cs rename to Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs index 3abc53f..1441b80 100644 --- a/Modules/OptionItems/BetterOptionTitleItem.cs +++ b/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs @@ -15,11 +15,15 @@ public class BetterOptionTitleItem : BetterOptionItem ToggleOption optionBehaviour = UnityEngine.Object.Instantiate(gameOptionsMenu.checkboxOrigin, Vector3.zero, Quaternion.identity, gameOptionsMenu.settingsContainer); optionBehaviour.transform.localPosition = new Vector3(0.952f, 2f - StaticSpacingNum * SpacingNum, -2f); SetUp(optionBehaviour); - SpacingNum++; + SpacingNum += StaticSpacingNumPlus; + UnityEngine.Object.Destroy(optionBehaviour.CheckMark.transform.parent.gameObject); optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Center; optionBehaviour.TitleText.outlineColor = Color.black; optionBehaviour.TitleText.outlineWidth = 0.2f; + optionBehaviour.TitleText.transform.localPosition += new Vector3(0f, 0.05f, 0f); + optionBehaviour.LabelBackground.color = new Color(0.6f, 0.6f, 0.6f, 1f); + optionBehaviour.LabelBackground.transform.SetLocalZ(1f); // Set data Tab = gameOptionsMenu; diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index ac415b7..045afff 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -13,33 +13,60 @@ class BetterGameSettings public static BetterOptionItem? UseBanNameList; public static BetterOptionItem? UseBanWordList; public static BetterOptionItem? HideAndSeekImpNum; + public static BetterOptionItem? DetectCheatClients; + public static BetterOptionItem? DetectInvalidRPCs; } [HarmonyPatch(typeof(GameSettingMenu))] static class GameSettingMenuPatch { private static PassiveButton BetterSettingsButton; - private static GameOptionsMenu BetterSettingsTab; + public static GameOptionsMenu BetterSettingsTab; public static void SetupSettings(bool IsPreload = false) { BetterOptionItem.SpacingNum = 0; - new BetterOptionHeaderItem().Create(BetterSettingsTab, "Anti-Cheat Settings"); - - BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(100, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); - BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(200, BetterSettingsTab, "Allow invalid friendCodes", true); - BetterGameSettings.UseBanPlayerList = new BetterOptionCheckboxItem().Create(300, BetterSettingsTab, "Use Ban Player List", true); - BetterGameSettings.UseBanNameList = new BetterOptionCheckboxItem().Create(400, BetterSettingsTab, "Use Ban Name List", true); - BetterGameSettings.UseBanWordList = new BetterOptionCheckboxItem().Create(500, BetterSettingsTab, "Use Ban Word List", true); - - if (IsPreload || GameStates.IsHideNSeek) + // Anti-Cheat Settings { - if (IsPreload || Main.BetterRoleAlgorithma.Value) + new BetterOptionHeaderItem().Create(BetterSettingsTab, "Anti-Cheat Settings"); + + if (IsPreload || GameStates.IsHost) { - new BetterOptionHeaderItem().Create(BetterSettingsTab, "Hide & Seek Settings"); - new BetterOptionTitleItem().Create(BetterSettingsTab, $"Imposter"); - BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(1000, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, ""); + new BetterOptionTitleItem().Create(BetterSettingsTab, $"Host Only"); + BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(100, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); + BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(200, BetterSettingsTab, "Allow invalid friendCodes", true); + BetterGameSettings.UseBanPlayerList = new BetterOptionCheckboxItem().Create(300, BetterSettingsTab, "Use Ban Player List", true); + BetterGameSettings.UseBanNameList = new BetterOptionCheckboxItem().Create(400, BetterSettingsTab, "Use Ban Name List", true); + BetterGameSettings.UseBanWordList = new BetterOptionCheckboxItem().Create(500, BetterSettingsTab, "Use Ban Word List", true); + new BetterOptionDividerItem().Create(BetterSettingsTab); + } + + new BetterOptionTitleItem().Create(BetterSettingsTab, $"Detections"); + BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(600, BetterSettingsTab, "Detect Cheat Clients", true); + BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Invalid RPCs", true); + } + + // Gameplay Settings + { + if (IsPreload || GameStates.IsHost) + { + if (IsPreload || !GameStates.IsHideNSeek) + { + new BetterOptionHeaderItem().Create(BetterSettingsTab, "Gameplay Settings"); + } + else if (IsPreload || GameStates.IsHideNSeek) + { + new BetterOptionHeaderItem().Create(BetterSettingsTab, "Hide & Seek Settings"); + + if (IsPreload || Main.BetterRoleAlgorithma.Value) + { + new BetterOptionTitleItem().Create(BetterSettingsTab, $"Better Role Algorithma"); + BetterOptionItem.SpacingNum += 0.2f; + new BetterOptionTitleItem().Create(BetterSettingsTab, $"Imposter"); + BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(1000, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, ""); + } + } } } @@ -52,7 +79,7 @@ static class GameSettingMenuPatch */ if (BetterSettingsTab != null) - BetterSettingsTab.scrollBar.SetYBoundsMax(0.62f * BetterOptionItem.SpacingNum / 2); + BetterSettingsTab.scrollBar.SetYBoundsMax(1.15f * BetterOptionItem.SpacingNum / 2); } private static void Initialize() @@ -71,7 +98,7 @@ static class GameSettingMenuPatch [HarmonyPatch(nameof(GameSettingMenu.Update))] [HarmonyPostfix] - public static void Update_Postfix(/*GameSettingMenu __instance*/) + public static void Update_Postfix(GameSettingMenu __instance) { if (BetterSettingsButton != null) { @@ -85,6 +112,10 @@ static class GameSettingMenuPatch { BetterSettingsButton.buttonText.color = new Color(0.35f, 1f, 0.35f, 1f); } + if (BetterSettingsButton.selected) + { + __instance.MenuDescriptionText.text = "Edit better settings for your lobby and gameplay."; + } } } @@ -94,7 +125,7 @@ static class GameSettingMenuPatch { __instance.gameObject.transform.SetLocalY(-0.1f); GameObject PanelSprite = __instance.gameObject.transform.Find("PanelSprite").gameObject; - if (PanelSprite != null && !GameStates.IsHideNSeek) + if (PanelSprite != null) { PanelSprite.transform.SetLocalY(-0.32f); PanelSprite.transform.localScale = new Vector3(PanelSprite.transform.localScale.x, 0.625f); @@ -106,15 +137,6 @@ static class GameSettingMenuPatch BetterSettingsButton.OnClick.RemoveAllListeners(); BetterSettingsButton.OnMouseOver.RemoveAllListeners(); - if (!GameStates.IsHideNSeek) - { - BetterSettingsButton.transform.position = BetterSettingsButton.transform.position - new Vector3(0f, 1.265f, 0f); - } - else - { - BetterSettingsButton.transform.position = BetterSettingsButton.transform.position - new Vector3(0f, 0.64f, 0f); - } - BetterSettingsButton.activeSprites.GetComponent().color = new Color(0f, 1f, 0.35f, 1f); BetterSettingsButton.inactiveSprites.GetComponent().color = new Color(0f, 1f, 0.35f, 1f); BetterSettingsButton.selectedSprites.GetComponent().color = new Color(0f, 1f, 0.35f, 1f); @@ -133,7 +155,29 @@ static class GameSettingMenuPatch __instance.GameSettingsButton.OnMouseOver.RemoveAllListeners(); __instance.RoleSettingsButton.OnMouseOver.RemoveAllListeners(); - __instance.ChangeTab(1, false); + + BetterSettingsButton.transform.position = BetterSettingsButton.transform.position - new Vector3(0f, 1.265f, 0f); + if (!GameStates.IsHideNSeek && GameStates.IsHost) + { + __instance.ChangeTab(1, false); + } + else if (GameStates.IsHost) + { + __instance.RoleSettingsButton.gameObject.SetActive(true); + __instance.RoleSettingsButton.GetComponent().enabled = false; + __instance.RoleSettingsButton.inactiveSprites.GetComponent().color = new(0.5f, 0.5f, 0.5f, 1f); + __instance.ChangeTab(1, false); + } + else + { + __instance.GamePresetsButton.GetComponent().enabled = false; + __instance.GameSettingsButton.GetComponent().enabled = false; + __instance.RoleSettingsButton.GetComponent().enabled = false; + __instance.GamePresetsButton.inactiveSprites.GetComponent().color = new(0.5f, 0.5f, 0.5f, 1f); + __instance.GameSettingsButton.inactiveSprites.GetComponent().color = new(0.5f, 0.5f, 0.5f, 1f); + __instance.RoleSettingsButton.inactiveSprites.GetComponent().color = new(0.5f, 0.5f, 0.5f, 1f); + __instance.ChangeTab(3, false); + } SetupSettings(); } @@ -153,7 +197,6 @@ static class GameSettingMenuPatch { case 3: BetterSettingsTab.gameObject.SetActive(true); - __instance.MenuDescriptionText.text = "Edit better settings for your lobby and gameplay."; break; } } @@ -175,4 +218,31 @@ static class GameSettingMenuPatch break; } } +} + +[HarmonyPatch(typeof(GameOptionsMenu))] +static class GameOptionsMenuPatch +{ + [HarmonyPatch(nameof(GameOptionsMenu.CreateSettings))] + [HarmonyPrefix] + public static bool CreateSettings_Prefix(GameOptionsMenu __instance) + { + if (__instance == GameSettingMenuPatch.BetterSettingsTab) + { + return false; + } + + return true; + } +} + +[HarmonyPatch(typeof(OptionsConsole))] +static class OptionsConsolePatch +{ + [HarmonyPatch(nameof(OptionsConsole.CanUse))] + [HarmonyPrefix] + public static void CanUse_Prefix(OptionsConsole __instance) + { + __instance.HostOnly = false; + } } \ No newline at end of file From 34b86454bf1237e903d3eb82b1af9993e95e560a Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 05:51:05 -0500 Subject: [PATCH 13/22] Detected Level Above Setting --- Modules/AntiCheat.cs | 2 +- Modules/OptionItems/BetterOptionFloatItem.cs | 16 ++++++++++++---- Modules/OptionItems/BetterOptionIntItem.cs | 16 ++++++++++++---- Patches/GameSettingMenuPatch.cs | 7 +++++-- main.cs | 4 ++-- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index 4206607..0d43861 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -250,7 +250,7 @@ class AntiCheat if (reader.BytesRemaining > 0) { uint level = reader.ReadPackedUInt32(); - if (level >= 200) + if (level >= BetterGameSettings.DetectedLevelAbove.GetInt()) { BetterNotificationManager.NotifyCheat(player, $"Invalid Level: {level}"); Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {level >= 200}"); diff --git a/Modules/OptionItems/BetterOptionFloatItem.cs b/Modules/OptionItems/BetterOptionFloatItem.cs index c0fcbce..b86b0ac 100644 --- a/Modules/OptionItems/BetterOptionFloatItem.cs +++ b/Modules/OptionItems/BetterOptionFloatItem.cs @@ -88,18 +88,26 @@ public class BetterOptionFloatItem : BetterOptionItem public void Increase() { - if (CurrentValue + Increment <= floatRange.max) + int times = 1; + if (Input.GetKey(KeyCode.LeftShift)) + times = 5; + + if (CurrentValue + Increment * times <= floatRange.max) { - CurrentValue += Increment; + CurrentValue += Increment * times; AdjustButtonsActiveState(); } } public void Decrease() { - if (CurrentValue - Increment >= floatRange.min) + int times = 1; + if (Input.GetKey(KeyCode.LeftShift)) + times = 5; + + if (CurrentValue - Increment * times >= floatRange.min) { - CurrentValue -= Increment; + CurrentValue -= Increment * times; AdjustButtonsActiveState(); } } diff --git a/Modules/OptionItems/BetterOptionIntItem.cs b/Modules/OptionItems/BetterOptionIntItem.cs index fd16411..5444dc6 100644 --- a/Modules/OptionItems/BetterOptionIntItem.cs +++ b/Modules/OptionItems/BetterOptionIntItem.cs @@ -88,18 +88,26 @@ public class BetterOptionIntItem : BetterOptionItem public void Increase() { - if (CurrentValue + Increment <= intRange.max) + int times = 1; + if (Input.GetKey(KeyCode.LeftShift)) + times = 5; + + if (CurrentValue + Increment * times <= intRange.max) { - CurrentValue += Increment; + CurrentValue += Increment * times; AdjustButtonsActiveState(); } } public void Decrease() { - if (CurrentValue - Increment >= intRange.min) + int times = 1; + if (Input.GetKey(KeyCode.LeftShift)) + times = 5; + + if (CurrentValue - Increment * times >= intRange.min) { - CurrentValue -= Increment; + CurrentValue -= Increment * times; AdjustButtonsActiveState(); } } diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index 045afff..ef1e866 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -1,6 +1,7 @@ using AmongUs.GameOptions; using HarmonyLib; using UnityEngine; +using static Logger; namespace BetterAmongUs.Patches; @@ -13,6 +14,7 @@ class BetterGameSettings public static BetterOptionItem? UseBanNameList; public static BetterOptionItem? UseBanWordList; public static BetterOptionItem? HideAndSeekImpNum; + public static BetterOptionItem? DetectedLevelAbove; public static BetterOptionItem? DetectCheatClients; public static BetterOptionItem? DetectInvalidRPCs; } @@ -43,8 +45,9 @@ static class GameSettingMenuPatch } new BetterOptionTitleItem().Create(BetterSettingsTab, $"Detections"); - BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(600, BetterSettingsTab, "Detect Cheat Clients", true); - BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Invalid RPCs", true); + BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level # or >", [100, 1000, 5], 200, ""); + BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Cheat Clients", true); + BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(800, BetterSettingsTab, "Detect Invalid RPCs", true); } // Gameplay Settings diff --git a/main.cs b/main.cs index c92472a..d9a1642 100644 --- a/main.cs +++ b/main.cs @@ -27,8 +27,8 @@ public class Main : BasePlugin public const string HotfixNum = "0"; public const bool IsHotFix = false; public const string PluginGuid = "com.d1gq.betteramongus"; - public const string PluginVersion = "1.0.5"; - public const string ReleaseDate = "08.22.2024"; // mm/dd/yyyy + public const string PluginVersion = "1.1.0"; + public const string ReleaseDate = "08.24.2024"; // mm/dd/yyyy public const string Github = "https://github.com/D1GQ/BetterAmongUs-Public"; public const string Discord = "https://discord.gg/vjYrXpzNAn"; From a04cf9daa04d59332b720fa239a1bed59918ef07 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 06:03:30 -0500 Subject: [PATCH 14/22] num setting prefix --- Modules/OptionItems/BetterOptionFloatItem.cs | 18 +++++++++++++----- Modules/OptionItems/BetterOptionIntItem.cs | 18 +++++++++++++----- Patches/GameSettingMenuPatch.cs | 4 ++-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Modules/OptionItems/BetterOptionFloatItem.cs b/Modules/OptionItems/BetterOptionFloatItem.cs index b86b0ac..eca6b9e 100644 --- a/Modules/OptionItems/BetterOptionFloatItem.cs +++ b/Modules/OptionItems/BetterOptionFloatItem.cs @@ -8,9 +8,10 @@ public class BetterOptionFloatItem : BetterOptionItem public FloatRange floatRange = new(0f, 180f); public float Increment = 2.5f; private NumberOption? ThisOption; - private string PostFix; + private string? PostFix; + private string? PreFix; - public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, float[] values, float Default, string postFix = "", BetterOptionItem Parent = null) + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, float[] values, float Default, string preFix = "", string postFix = "", BetterOptionItem Parent = null) { Id = id; @@ -45,6 +46,7 @@ public class BetterOptionFloatItem : BetterOptionItem TitleText = optionBehaviour.TitleText; Option = optionBehaviour; PostFix = postFix; + PreFix = preFix; ThisOption = optionBehaviour; floatRange = new(values[0], values[1]); @@ -65,7 +67,7 @@ public class BetterOptionFloatItem : BetterOptionItem { if (ThisOption == null) return; - ThisOption.ValueText.text = CurrentValue.ToString() + PostFix; + ThisOption.ValueText.text = PreFix + CurrentValue.ToString() + PostFix; if (CurrentValue + Increment > floatRange.max) { @@ -91,12 +93,15 @@ public class BetterOptionFloatItem : BetterOptionItem int times = 1; if (Input.GetKey(KeyCode.LeftShift)) times = 5; + if (Input.GetKey(KeyCode.LeftControl)) + times = 10; if (CurrentValue + Increment * times <= floatRange.max) { CurrentValue += Increment * times; - AdjustButtonsActiveState(); } + + AdjustButtonsActiveState(); } public void Decrease() @@ -104,12 +109,15 @@ public class BetterOptionFloatItem : BetterOptionItem int times = 1; if (Input.GetKey(KeyCode.LeftShift)) times = 5; + if (Input.GetKey(KeyCode.LeftControl)) + times = 10; if (CurrentValue - Increment * times >= floatRange.min) { CurrentValue -= Increment * times; - AdjustButtonsActiveState(); } + + AdjustButtonsActiveState(); } public void Load(float DefaultValue) diff --git a/Modules/OptionItems/BetterOptionIntItem.cs b/Modules/OptionItems/BetterOptionIntItem.cs index 5444dc6..0f95c50 100644 --- a/Modules/OptionItems/BetterOptionIntItem.cs +++ b/Modules/OptionItems/BetterOptionIntItem.cs @@ -8,9 +8,10 @@ public class BetterOptionIntItem : BetterOptionItem public IntRange intRange = new(0, 180); public int Increment = 1; private NumberOption? ThisOption; - private string PostFix; + private string? PostFix; + private string? PreFix; - public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, int[] values, int DefaultValue, string postFix = "", BetterOptionItem Parent = null) + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, int[] values, int DefaultValue, string preFix = "", string postFix = "", BetterOptionItem Parent = null) { Id = id; @@ -45,6 +46,7 @@ public class BetterOptionIntItem : BetterOptionItem TitleText = optionBehaviour.TitleText; Option = optionBehaviour; PostFix = postFix; + PreFix = preFix; ThisOption = optionBehaviour; intRange = new(values[0], values[1]); @@ -65,7 +67,7 @@ public class BetterOptionIntItem : BetterOptionItem { if (ThisOption == null) return; - ThisOption.ValueText.text = CurrentValue.ToString() + PostFix; + ThisOption.ValueText.text = PreFix + CurrentValue.ToString() + PostFix; if (CurrentValue + Increment > intRange.max) { @@ -91,12 +93,15 @@ public class BetterOptionIntItem : BetterOptionItem int times = 1; if (Input.GetKey(KeyCode.LeftShift)) times = 5; + if (Input.GetKey(KeyCode.LeftControl)) + times = 10; if (CurrentValue + Increment * times <= intRange.max) { CurrentValue += Increment * times; - AdjustButtonsActiveState(); } + + AdjustButtonsActiveState(); } public void Decrease() @@ -104,12 +109,15 @@ public class BetterOptionIntItem : BetterOptionItem int times = 1; if (Input.GetKey(KeyCode.LeftShift)) times = 5; + if (Input.GetKey(KeyCode.LeftControl)) + times = 10; if (CurrentValue - Increment * times >= intRange.min) { CurrentValue -= Increment * times; - AdjustButtonsActiveState(); } + + AdjustButtonsActiveState(); } public void Load(int DefaultValue) diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index ef1e866..56ed8f9 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -45,7 +45,7 @@ static class GameSettingMenuPatch } new BetterOptionTitleItem().Create(BetterSettingsTab, $"Detections"); - BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level # or >", [100, 1000, 5], 200, ""); + BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level # or >", [100, 1000, 5], 200, "Lv ", ""); BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Cheat Clients", true); BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(800, BetterSettingsTab, "Detect Invalid RPCs", true); } @@ -67,7 +67,7 @@ static class GameSettingMenuPatch new BetterOptionTitleItem().Create(BetterSettingsTab, $"Better Role Algorithma"); BetterOptionItem.SpacingNum += 0.2f; new BetterOptionTitleItem().Create(BetterSettingsTab, $"Imposter"); - BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(1000, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, ""); + BetterGameSettings.HideAndSeekImpNum = new BetterOptionIntItem().Create(1000, BetterSettingsTab, "# Seekers", [1, 5, 1], 1, "", ""); } } } From 8eefea993a158de0140ad1f5b21226444923b374 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 06:22:35 -0500 Subject: [PATCH 15/22] Chat In Gameplay Setting --- Patches/ClientOptionsPatch.cs | 6 ++++++ Patches/HudManagerPatch.cs | 25 +++++++++++++++++++++++-- main.cs | 2 ++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Patches/ClientOptionsPatch.cs b/Patches/ClientOptionsPatch.cs index cc4f2d4..7f44a19 100644 --- a/Patches/ClientOptionsPatch.cs +++ b/Patches/ClientOptionsPatch.cs @@ -13,6 +13,7 @@ public static class OptionsMenuBehaviourPatch private static ClientOptionItem BetterHost; private static ClientOptionItem BetterRoleAlgorithma; private static ClientOptionItem BetterNotifications; + private static ClientOptionItem ChatInGameplay; private static ClientOptionItem LobbyPlayerInfo; private static ClientOptionItem DisableLobbyTheme; private static ClientOptionItem UnlockFPS; @@ -79,6 +80,11 @@ public static class OptionsMenuBehaviourPatch BetterNotificationManager.Notifying = false; } } + + if (ChatInGameplay == null || ChatInGameplay.ToggleButton == null) + { + ChatInGameplay = ClientOptionItem.Create("Chat In Gameplay", Main.ChatInGameplay, __instance); + } if (LobbyPlayerInfo == null || LobbyPlayerInfo.ToggleButton == null) { diff --git a/Patches/HudManagerPatch.cs b/Patches/HudManagerPatch.cs index f470522..50aea35 100644 --- a/Patches/HudManagerPatch.cs +++ b/Patches/HudManagerPatch.cs @@ -53,8 +53,29 @@ public class HudManagerPatch if (gameStart != null) gameStart.transform.SetLocalY(-2.8f); - if (GameStates.InGame && __instance?.Chat?.gameObject.active != true) - __instance.Chat.gameObject.SetActive(true); + + // Set chat + if (GameStates.InGame) + { + if (!Main.ChatInGameplay.Value) + { + if (!PlayerControl.LocalPlayer.IsAlive()) + { + __instance.Chat.gameObject.SetActive(true); + } + else if (GameStates.IsInGamePlay && !(GameStates.IsMeeting || GameStates.IsExilling)) + { + __instance.Chat.gameObject.SetActive(false); + } + } + else + { + if (__instance?.Chat?.gameObject.active == false) + { + __instance.Chat.gameObject.SetActive(true); + } + } + } } catch { } } diff --git a/main.cs b/main.cs index d9a1642..bbd2247 100644 --- a/main.cs +++ b/main.cs @@ -176,6 +176,7 @@ public class Main : BasePlugin public static ConfigEntry BetterHost { get; private set; } public static ConfigEntry BetterRoleAlgorithma { get; private set; } public static ConfigEntry BetterNotifications { get; private set; } + public static ConfigEntry ChatInGameplay { get; private set; } public static ConfigEntry LobbyPlayerInfo { get; private set; } public static ConfigEntry DisableLobbyTheme { get; private set; } public static ConfigEntry UnlockFPS { get; private set; } @@ -187,6 +188,7 @@ public class Main : BasePlugin BetterHost = Config.Bind("Better Options", "BetterHost", false); BetterRoleAlgorithma = Config.Bind("Better Options", "BetterRoleAlgorithma", true); BetterNotifications = Config.Bind("Better Options", "BetterNotifications", true); + ChatInGameplay = Config.Bind("Better Options", "ChatInGameplay", true); LobbyPlayerInfo = Config.Bind("Better Options", "LobbyPlayerInfo", true); DisableLobbyTheme = Config.Bind("Better Options", "DisableLobbyTheme", true); UnlockFPS = Config.Bind("Better Options", "UnlockFPS", false); From af7596c40671edacd3f1ebbf0fc138442cab948e Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 07:14:31 -0500 Subject: [PATCH 16/22] Allow settings bypass! --- Patches/GameSettingMenuPatch.cs | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index 56ed8f9..cb0891c 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -1,6 +1,7 @@ using AmongUs.GameOptions; using HarmonyLib; using UnityEngine; +using static Il2CppSystem.Linq.Expressions.Interpreter.CastInstruction.CastInstructionNoT; using static Logger; namespace BetterAmongUs.Patches; @@ -248,4 +249,76 @@ static class OptionsConsolePatch { __instance.HostOnly = false; } +} + +// Allow settings bypass +[HarmonyPatch(typeof(NumberOption))] +static class NumberOptionPatch +{ + [HarmonyPatch(nameof(NumberOption.Increase))] + [HarmonyPrefix] + public static bool Increase_Prefix(NumberOption __instance) + { + int times = 1; + if (Input.GetKey(KeyCode.LeftShift)) + times = 5; + if (Input.GetKey(KeyCode.LeftControl)) + times = 10; + + __instance.Value += __instance.Increment * times; + __instance.UpdateValue(); + return false; + } + [HarmonyPatch(nameof(NumberOption.Decrease))] + [HarmonyPrefix] + public static bool Decrease_Prefix(NumberOption __instance) + { + int times = 1; + if (Input.GetKey(KeyCode.LeftShift)) + times = 5; + if (Input.GetKey(KeyCode.LeftControl)) + times = 10; + + __instance.Value -= __instance.Increment * times; + __instance.UpdateValue(); + return false; + } + [HarmonyPatch(nameof(NumberOption.UpdateValue))] + [HarmonyPrefix] + public static bool UpdateValue_Prefix(NumberOption __instance) + { + if (__instance.floatOptionName != FloatOptionNames.Invalid) + { + GameOptionsManager.Instance.CurrentGameOptions.SetFloat(__instance.floatOptionName, __instance.GetFloat()); + return false; + } + if (__instance.intOptionName != Int32OptionNames.Invalid) + { + GameOptionsManager.Instance.CurrentGameOptions.SetInt(__instance.intOptionName, __instance.GetInt()); + return false; + } + return false; + } + [HarmonyPatch(nameof(NumberOption.FixedUpdate))] + [HarmonyPrefix] + public static bool FixedUpdate_Prefix(NumberOption __instance) + { + __instance.MinusBtn.SetInteractable(true); + __instance.PlusBtn.SetInteractable(true); + + if (__instance.oldValue != __instance.Value) + { + __instance.oldValue = __instance.Value; + + if (__instance.Value > __instance.ValidRange.max || __instance.Value < __instance.ValidRange.min) + { + __instance.ValueText.text = $"{__instance.data.GetValueString(__instance.Value)}"; + } + else + { + __instance.ValueText.text = __instance.data.GetValueString(__instance.Value); + } + } + return false; + } } \ No newline at end of file From d292cc8fd07ce044900275a12c2b94d0d6d3090e Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 08:12:47 -0500 Subject: [PATCH 17/22] Experimental setting and error fixes --- Modules/AntiCheat.cs | 5 +- .../OptionItems/BetterOptionCheckboxItem.cs | 6 ++ Modules/OptionItems/BetterOptionFloatItem.cs | 4 ++ Modules/OptionItems/BetterOptionIntItem.cs | 4 ++ Modules/OptionItems/BetterOptionStringItem.cs | 10 ++++ .../NoneOption/BetterOptionTitleItem.cs | 1 + Patches/GameSettingMenuPatch.cs | 59 +++++++++++++------ 7 files changed, 68 insertions(+), 21 deletions(-) diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index 0d43861..a7aa17b 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -325,8 +325,6 @@ class AntiCheat // Check game states when sabotaging public static bool RpcUpdateSystemCheck(PlayerControl player, SystemTypes systemType, byte amount) { - return true; - byte hostNum = 128; // Only host should ever send this number byte singleFixNum = 0; byte minLightNum = 0; @@ -360,6 +358,9 @@ class AntiCheat if (!GameStates.IsHost || PlayerControl.LocalPlayer == null || player == null || player == PlayerControl.LocalPlayer || player.BetterData().IsBetterHost || !IsEnabled || !Main.AntiCheat.Value || (GameStates.IsBetterHostLobby && !GameStates.IsHost) || !BetterGameSettings.DetectInvalidRPCs.GetBool()) return true; + if (!BetterGameSettings.ExperimentalDetectInvalidSabotage.GetBool()) + return true; + // Single Fix: 0 // Lights: 0-1-2-3-4 // Fix 1: 16 diff --git a/Modules/OptionItems/BetterOptionCheckboxItem.cs b/Modules/OptionItems/BetterOptionCheckboxItem.cs index 61c7d6c..3106594 100644 --- a/Modules/OptionItems/BetterOptionCheckboxItem.cs +++ b/Modules/OptionItems/BetterOptionCheckboxItem.cs @@ -23,6 +23,12 @@ public class BetterOptionCheckboxItem : BetterOptionItem optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); SpacingNum += StaticSpacingNumPlus; + // Fix Game Crash + foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) + { + optionBehaviour.data = rulesCategory.AllGameSettings.ToArray().FirstOrDefault(item => item.Type == OptionTypes.Checkbox); + } + // Set data optionBehaviour.CheckMark.GetComponent().enabled = Default; IsChecked = Default; diff --git a/Modules/OptionItems/BetterOptionFloatItem.cs b/Modules/OptionItems/BetterOptionFloatItem.cs index eca6b9e..c6a26a3 100644 --- a/Modules/OptionItems/BetterOptionFloatItem.cs +++ b/Modules/OptionItems/BetterOptionFloatItem.cs @@ -168,4 +168,8 @@ public class BetterOptionFloatItem : BetterOptionItem Type = OptionTypes.Float, }; } + + public override void ValueChanged(int id, OptionBehaviour optionBehaviour) + { + } } diff --git a/Modules/OptionItems/BetterOptionIntItem.cs b/Modules/OptionItems/BetterOptionIntItem.cs index 0f95c50..422eb2b 100644 --- a/Modules/OptionItems/BetterOptionIntItem.cs +++ b/Modules/OptionItems/BetterOptionIntItem.cs @@ -168,4 +168,8 @@ public class BetterOptionIntItem : BetterOptionItem Type = OptionTypes.Float, }; } + + public override void ValueChanged(int id, OptionBehaviour optionBehaviour) + { + } } diff --git a/Modules/OptionItems/BetterOptionStringItem.cs b/Modules/OptionItems/BetterOptionStringItem.cs index 203b280..90fd443 100644 --- a/Modules/OptionItems/BetterOptionStringItem.cs +++ b/Modules/OptionItems/BetterOptionStringItem.cs @@ -24,6 +24,12 @@ public class BetterOptionStringItem : BetterOptionItem optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); SpacingNum += StaticSpacingNumPlus; + // Fix Game Crash + foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) + { + optionBehaviour.data = rulesCategory.AllGameSettings.ToArray().FirstOrDefault(item => item.Type == OptionTypes.String); + } + optionBehaviour.PlusBtn.OnClick.RemoveAllListeners(); optionBehaviour.MinusBtn.OnClick.RemoveAllListeners(); optionBehaviour.PlusBtn.OnClick.AddListener(new Action(() => Increase())); @@ -124,4 +130,8 @@ public class BetterOptionStringItem : BetterOptionItem Type = OptionTypes.String, }; } + + public override void ValueChanged(int id, OptionBehaviour optionBehaviour) + { + } } diff --git a/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs b/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs index 1441b80..3014c3f 100644 --- a/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs +++ b/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs @@ -18,6 +18,7 @@ public class BetterOptionTitleItem : BetterOptionItem SpacingNum += StaticSpacingNumPlus; UnityEngine.Object.Destroy(optionBehaviour.CheckMark.transform.parent.gameObject); + UnityEngine.Object.Destroy(optionBehaviour.GetComponent()); optionBehaviour.TitleText.alignment = TMPro.TextAlignmentOptions.Center; optionBehaviour.TitleText.outlineColor = Color.black; optionBehaviour.TitleText.outlineWidth = 0.2f; diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index cb0891c..5293613 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -1,8 +1,6 @@ using AmongUs.GameOptions; using HarmonyLib; using UnityEngine; -using static Il2CppSystem.Linq.Expressions.Interpreter.CastInstruction.CastInstructionNoT; -using static Logger; namespace BetterAmongUs.Patches; @@ -18,6 +16,8 @@ class BetterGameSettings public static BetterOptionItem? DetectedLevelAbove; public static BetterOptionItem? DetectCheatClients; public static BetterOptionItem? DetectInvalidRPCs; + + public static BetterOptionItem? ExperimentalDetectInvalidSabotage; } [HarmonyPatch(typeof(GameSettingMenu))] @@ -25,30 +25,37 @@ static class GameSettingMenuPatch { private static PassiveButton BetterSettingsButton; public static GameOptionsMenu BetterSettingsTab; + private static List TitleList = []; public static void SetupSettings(bool IsPreload = false) { BetterOptionItem.SpacingNum = 0; + BetterOptionItem.BetterOptionItems.Clear(); + TitleList.Clear(); // Anti-Cheat Settings { - new BetterOptionHeaderItem().Create(BetterSettingsTab, "Anti-Cheat Settings"); + TitleList.Add(new BetterOptionHeaderItem().Create(BetterSettingsTab, "Anti-Cheat Settings")); if (IsPreload || GameStates.IsHost) { - new BetterOptionTitleItem().Create(BetterSettingsTab, $"Host Only"); + TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"Host Only")); BetterGameSettings.WhenCheating = new BetterOptionStringItem().Create(100, BetterSettingsTab, "When a player is caught cheating", ["Do Nothing", "Kick", "Ban"], 2); BetterGameSettings.InvalidFriendCode = new BetterOptionCheckboxItem().Create(200, BetterSettingsTab, "Allow invalid friendCodes", true); BetterGameSettings.UseBanPlayerList = new BetterOptionCheckboxItem().Create(300, BetterSettingsTab, "Use Ban Player List", true); BetterGameSettings.UseBanNameList = new BetterOptionCheckboxItem().Create(400, BetterSettingsTab, "Use Ban Name List", true); BetterGameSettings.UseBanWordList = new BetterOptionCheckboxItem().Create(500, BetterSettingsTab, "Use Ban Word List", true); - new BetterOptionDividerItem().Create(BetterSettingsTab); + TitleList.Add(new BetterOptionDividerItem().Create(BetterSettingsTab)); } - new BetterOptionTitleItem().Create(BetterSettingsTab, $"Detections"); + TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"Detections")); BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level # or >", [100, 1000, 5], 200, "Lv ", ""); BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Cheat Clients", true); BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(800, BetterSettingsTab, "Detect Invalid RPCs", true); + + TitleList.Add(new BetterOptionDividerItem().Create(BetterSettingsTab)); + TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"Experimental")); + BetterGameSettings.ExperimentalDetectInvalidSabotage = new BetterOptionCheckboxItem().Create(100000, BetterSettingsTab, "Detect Invalid Sabotages", false); } // Gameplay Settings @@ -83,7 +90,7 @@ static class GameSettingMenuPatch */ if (BetterSettingsTab != null) - BetterSettingsTab.scrollBar.SetYBoundsMax(1.15f * BetterOptionItem.SpacingNum / 2); + BetterSettingsTab.scrollBar.SetYBoundsMax(1.25f * BetterOptionItem.SpacingNum / 2); } private static void Initialize() @@ -92,9 +99,12 @@ static class GameSettingMenuPatch { foreach (var item in BetterOptionItem.BetterOptionItems) { - if (item.TitleText != null) + if (item != null) { - item.TitleText.text = item.Name; + if (item.TitleText != null) + { + item.TitleText.text = item.Name; + } } } }, 0.005f, shoudLog: false); @@ -269,6 +279,7 @@ static class NumberOptionPatch __instance.UpdateValue(); return false; } + [HarmonyPatch(nameof(NumberOption.Decrease))] [HarmonyPrefix] public static bool Decrease_Prefix(NumberOption __instance) @@ -283,6 +294,7 @@ static class NumberOptionPatch __instance.UpdateValue(); return false; } + [HarmonyPatch(nameof(NumberOption.UpdateValue))] [HarmonyPrefix] public static bool UpdateValue_Prefix(NumberOption __instance) @@ -299,26 +311,35 @@ static class NumberOptionPatch } return false; } + [HarmonyPatch(nameof(NumberOption.FixedUpdate))] [HarmonyPrefix] public static bool FixedUpdate_Prefix(NumberOption __instance) { - __instance.MinusBtn.SetInteractable(true); - __instance.PlusBtn.SetInteractable(true); - - if (__instance.oldValue != __instance.Value) + try { - __instance.oldValue = __instance.Value; - - if (__instance.Value > __instance.ValidRange.max || __instance.Value < __instance.ValidRange.min) + if (__instance.MinusBtn != null && __instance.PlusBtn != null) { - __instance.ValueText.text = $"{__instance.data.GetValueString(__instance.Value)}"; + __instance.MinusBtn.SetInteractable(true); + __instance.PlusBtn.SetInteractable(true); } - else + + if (__instance.oldValue != __instance.Value) { - __instance.ValueText.text = __instance.data.GetValueString(__instance.Value); + __instance.oldValue = __instance.Value; + + if (__instance.Value > __instance.ValidRange.max || __instance.Value < __instance.ValidRange.min) + { + __instance.ValueText.text = $"{__instance.data.GetValueString(__instance.Value)}"; + } + else + { + __instance.ValueText.text = __instance.data.GetValueString(__instance.Value); + } } } + catch { } + return false; } } \ No newline at end of file From bde161ad87ddfe4772c457e59cd7ba8638001f72 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 08:22:20 -0500 Subject: [PATCH 18/22] clean up --- Modules/AntiCheat.cs | 3 --- Modules/BetterNotificationManager.cs | 2 +- Modules/ClientOptionItem.cs | 4 ++-- Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs | 3 +-- Modules/RPC.cs | 1 - Patches/ClientOptionsPatch.cs | 3 +-- Patches/CommandsPatch.cs | 4 ++-- Patches/GamePlayManagerPatch.cs | 1 - Patches/MainMenuPatch.cs | 2 +- Patches/MeetingHudPatch.cs | 2 +- Patches/PlayerControlPatch.cs | 3 --- Patches/SplashIntroPatch.cs | 1 - Patches/VersionShowerPatch.cs | 2 +- 13 files changed, 10 insertions(+), 21 deletions(-) diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index a7aa17b..f7c2436 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -3,9 +3,6 @@ using BetterAmongUs.Patches; using HarmonyLib; using Hazel; using InnerNet; -using UnityEngine; -using UnityEngine.Purchasing; -using UnityEngine.Rendering; namespace BetterAmongUs; diff --git a/Modules/BetterNotificationManager.cs b/Modules/BetterNotificationManager.cs index 7c3ba8a..5dfc5f6 100644 --- a/Modules/BetterNotificationManager.cs +++ b/Modules/BetterNotificationManager.cs @@ -17,7 +17,7 @@ class BetterNotificationManager if (BAUNotificationManagerObj != null) { - if (Notifying) + if (Notifying) { if (text == BAUNotificationManagerObj.transform.Find("Sizer/ChatText (TMP)").GetComponent().text) return; diff --git a/Modules/ClientOptionItem.cs b/Modules/ClientOptionItem.cs index 52a1826..a64692e 100644 --- a/Modules/ClientOptionItem.cs +++ b/Modules/ClientOptionItem.cs @@ -84,8 +84,8 @@ public class ClientOptionItem // ボタン生成 ToggleButton = Object.Instantiate(mouseMoveToggle, CustomBackground.transform); - ToggleButton.transform.localPosition = new Vector3( - // 現在のオプション数を基に位置を計算 + ToggleButton.transform.localPosition = new Vector3( + // 現在のオプション数を基に位置を計算 numOptions % 2 == 0 ? -1.3f : 1.3f, 2.2f - (0.5f * (numOptions / 2)), -6f); diff --git a/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs b/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs index 3014c3f..5c712be 100644 --- a/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs +++ b/Modules/OptionItems/NoneOption/BetterOptionTitleItem.cs @@ -1,5 +1,4 @@ -using Rewired; -using UnityEngine; +using UnityEngine; namespace BetterAmongUs; diff --git a/Modules/RPC.cs b/Modules/RPC.cs index 623b40a..9642569 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -1,7 +1,6 @@ using BetterAmongUs.Patches; using HarmonyLib; using Hazel; -using InnerNet; namespace BetterAmongUs; diff --git a/Patches/ClientOptionsPatch.cs b/Patches/ClientOptionsPatch.cs index 7f44a19..f811f98 100644 --- a/Patches/ClientOptionsPatch.cs +++ b/Patches/ClientOptionsPatch.cs @@ -1,6 +1,5 @@ using HarmonyLib; using UnityEngine; -using static Rewired.Data.UserDataStore_PlayerPrefs.ControllerAssignmentSaveInfo; namespace BetterAmongUs.Patches; @@ -80,7 +79,7 @@ public static class OptionsMenuBehaviourPatch BetterNotificationManager.Notifying = false; } } - + if (ChatInGameplay == null || ChatInGameplay.ToggleButton == null) { ChatInGameplay = ClientOptionItem.Create("Chat In Gameplay", Main.ChatInGameplay, __instance); diff --git a/Patches/CommandsPatch.cs b/Patches/CommandsPatch.cs index 5712f37..faa81dc 100644 --- a/Patches/CommandsPatch.cs +++ b/Patches/CommandsPatch.cs @@ -175,7 +175,7 @@ class CommandsPatch sb.Append("\n\n"); } Utils.AddChatPrivate(sb.ToString()); - break; + break; case "whisper" or "w": if (HandlePlayerArgument(command, subArgs) == true) { @@ -410,7 +410,7 @@ class CommandsPatch RPC.SyncAllNames(force: true); Utils.AddChatPrivate("All player names have been updated and synced!"); } - break; + break; case "suicide": if (HandleIsHost(command) == true) { diff --git a/Patches/GamePlayManagerPatch.cs b/Patches/GamePlayManagerPatch.cs index 36a7b93..dde1357 100644 --- a/Patches/GamePlayManagerPatch.cs +++ b/Patches/GamePlayManagerPatch.cs @@ -1,5 +1,4 @@ using HarmonyLib; -using Newtonsoft.Json.Utilities; using System.Text; using TMPro; using UnityEngine; diff --git a/Patches/MainMenuPatch.cs b/Patches/MainMenuPatch.cs index d9d1e11..c54a34e 100644 --- a/Patches/MainMenuPatch.cs +++ b/Patches/MainMenuPatch.cs @@ -99,7 +99,7 @@ internal class MainMenuPatch bool Flag = __instance?.screenTint?.GetComponent() != null && !__instance.screenTint.GetComponent().enabled; - foreach (var item in buttonsObj) + foreach (var item in buttonsObj) { item.SetActive(Flag); } diff --git a/Patches/MeetingHudPatch.cs b/Patches/MeetingHudPatch.cs index b9a80f2..7ca3320 100644 --- a/Patches/MeetingHudPatch.cs +++ b/Patches/MeetingHudPatch.cs @@ -99,7 +99,7 @@ class MeetingHudUpdatePatch case DisconnectReasons.Hacking: DisconnectText = "Banned By Server"; break; - default: + default: DisconnectText = "Disconnected"; break; } diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs index 18e0adc..dbf63fb 100644 --- a/Patches/PlayerControlPatch.cs +++ b/Patches/PlayerControlPatch.cs @@ -1,9 +1,6 @@ using AmongUs.Data; -using AmongUs.GameOptions; using HarmonyLib; -using Hazel; using Il2CppSystem.Linq; -using InnerNet; using LibCpp2IL; using System.Text; using System.Text.RegularExpressions; diff --git a/Patches/SplashIntroPatch.cs b/Patches/SplashIntroPatch.cs index 6f6d000..2e1482c 100644 --- a/Patches/SplashIntroPatch.cs +++ b/Patches/SplashIntroPatch.cs @@ -1,6 +1,5 @@ using HarmonyLib; using UnityEngine; -using UnityEngine.Rendering; namespace BetterAmongUs.Patches; diff --git a/Patches/VersionShowerPatch.cs b/Patches/VersionShowerPatch.cs index f952dfb..f3a489e 100644 --- a/Patches/VersionShowerPatch.cs +++ b/Patches/VersionShowerPatch.cs @@ -9,6 +9,6 @@ public class VersionShowerPatch [HarmonyPostfix] public static void Postfix(VersionShower __instance) { - __instance.text.text = $"♻BetterAmongUs♻ {Main.GetVersionText()} - " + __instance.text.text; + __instance.text.text = $"♻BetterAmongUs♻ {Main.GetVersionText()} - " + __instance.text.text; } } From c79f56458f127dd8ea17d34bd6bade82b132d0f6 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 09:08:14 -0500 Subject: [PATCH 19/22] fix and cleanup --- .../OptionItems/BetterOptionCheckboxItem.cs | 18 +++++------ Modules/OptionItems/BetterOptionFloatItem.cs | 29 +++++++++-------- Modules/OptionItems/BetterOptionIntItem.cs | 22 +++++++------ Modules/OptionItems/BetterOptionStringItem.cs | 31 ++++++++++++------- 4 files changed, 57 insertions(+), 43 deletions(-) diff --git a/Modules/OptionItems/BetterOptionCheckboxItem.cs b/Modules/OptionItems/BetterOptionCheckboxItem.cs index 3106594..69c34a8 100644 --- a/Modules/OptionItems/BetterOptionCheckboxItem.cs +++ b/Modules/OptionItems/BetterOptionCheckboxItem.cs @@ -7,13 +7,16 @@ public class BetterOptionCheckboxItem : BetterOptionItem private ToggleOption? ThisOption; private bool? IsChecked; - public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, bool Default = true, BetterOptionItem Parent = null) + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, bool DefaultValue = true, BetterOptionItem Parent = null) { Id = id; + Tab = gameOptionsMenu; + Name = name; + IsChecked = DefaultValue; if (gameOptionsMenu == null) { - Load(Default); + Load(DefaultValue); return this; } @@ -30,21 +33,18 @@ public class BetterOptionCheckboxItem : BetterOptionItem } // Set data - optionBehaviour.CheckMark.GetComponent().enabled = Default; - IsChecked = Default; - Tab = gameOptionsMenu; - Name = name; + optionBehaviour.CheckMark.GetComponent().enabled = DefaultValue; TitleText = optionBehaviour.TitleText; Option = optionBehaviour; ThisOption = optionBehaviour; - Load(Default); + Load(DefaultValue); BetterOptionItems.Add(this); return this; } - public void Load(bool Default) + public void Load(bool DefaultValue) { if (BetterDataManager.CanLoadSetting(Id)) { @@ -57,7 +57,7 @@ public class BetterOptionCheckboxItem : BetterOptionItem } else { - BetterDataManager.SaveSetting(Id, Default.ToString()); + BetterDataManager.SaveSetting(Id, DefaultValue.ToString()); } } diff --git a/Modules/OptionItems/BetterOptionFloatItem.cs b/Modules/OptionItems/BetterOptionFloatItem.cs index c6a26a3..860e4e8 100644 --- a/Modules/OptionItems/BetterOptionFloatItem.cs +++ b/Modules/OptionItems/BetterOptionFloatItem.cs @@ -1,4 +1,5 @@ using UnityEngine; +using static Il2CppSystem.Net.Http.Headers.Parser; namespace BetterAmongUs; @@ -11,13 +12,18 @@ public class BetterOptionFloatItem : BetterOptionItem private string? PostFix; private string? PreFix; - public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, float[] values, float Default, string preFix = "", string postFix = "", BetterOptionItem Parent = null) + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, float[] values, float DefaultValue, string preFix = "", string postFix = "", BetterOptionItem Parent = null) { Id = id; + floatRange = new(values[0], values[1]); + Increment = values[2]; + if (DefaultValue < floatRange.min) DefaultValue = floatRange.min; + if (DefaultValue > floatRange.max) DefaultValue = floatRange.max; + CurrentValue = DefaultValue; if (gameOptionsMenu == null) { - Load(Default); + Load(DefaultValue); return this; } @@ -49,14 +55,7 @@ public class BetterOptionFloatItem : BetterOptionItem PreFix = preFix; ThisOption = optionBehaviour; - floatRange = new(values[0], values[1]); - Increment = values[2]; - - if (Default < floatRange.min) Default = floatRange.min; - if (Default > floatRange.max) Default = floatRange.max; - CurrentValue = Default; - - Load(Default); + Load(DefaultValue); AdjustButtonsActiveState(); BetterOptionItems.Add(this); @@ -124,11 +123,15 @@ public class BetterOptionFloatItem : BetterOptionItem { if (BetterDataManager.CanLoadSetting(Id)) { - if (ThisOption != null) + var Float = BetterDataManager.LoadFloatSetting(Id); + + if (Float > floatRange.max || Float < floatRange.min) { - var Float = BetterDataManager.LoadFloatSetting(Id); - CurrentValue = Float; + Float = DefaultValue; + BetterDataManager.SaveSetting(Id, DefaultValue.ToString()); } + + CurrentValue = Float; } else { diff --git a/Modules/OptionItems/BetterOptionIntItem.cs b/Modules/OptionItems/BetterOptionIntItem.cs index 422eb2b..f0a8dee 100644 --- a/Modules/OptionItems/BetterOptionIntItem.cs +++ b/Modules/OptionItems/BetterOptionIntItem.cs @@ -14,6 +14,11 @@ public class BetterOptionIntItem : BetterOptionItem public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, int[] values, int DefaultValue, string preFix = "", string postFix = "", BetterOptionItem Parent = null) { Id = id; + intRange = new(values[0], values[1]); + Increment = values[2]; + if (DefaultValue < intRange.min) DefaultValue = intRange.min; + if (DefaultValue > intRange.max) DefaultValue = intRange.max; + CurrentValue = DefaultValue; if (gameOptionsMenu == null) { @@ -49,13 +54,6 @@ public class BetterOptionIntItem : BetterOptionItem PreFix = preFix; ThisOption = optionBehaviour; - intRange = new(values[0], values[1]); - Increment = values[2]; - - if (DefaultValue < intRange.min) DefaultValue = intRange.min; - if (DefaultValue > intRange.max) DefaultValue = intRange.max; - CurrentValue = DefaultValue; - Load(DefaultValue); AdjustButtonsActiveState(); @@ -124,11 +122,15 @@ public class BetterOptionIntItem : BetterOptionItem { if (BetterDataManager.CanLoadSetting(Id)) { - if (ThisOption != null) + var Int = BetterDataManager.LoadIntSetting(Id); + + if (Int > intRange.max || Int < intRange.min) { - var Int = BetterDataManager.LoadIntSetting(Id); - CurrentValue = Int; + Int = DefaultValue; + BetterDataManager.SaveSetting(Id, DefaultValue.ToString()); } + + CurrentValue = Int; } else { diff --git a/Modules/OptionItems/BetterOptionStringItem.cs b/Modules/OptionItems/BetterOptionStringItem.cs index 90fd443..450ea60 100644 --- a/Modules/OptionItems/BetterOptionStringItem.cs +++ b/Modules/OptionItems/BetterOptionStringItem.cs @@ -8,13 +8,19 @@ public class BetterOptionStringItem : BetterOptionItem public int CurrentValue; private StringOption? ThisOption; - public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, string[] strings, int Default = 0, BetterOptionItem Parent = null) + public BetterOptionItem Create(int id, GameOptionsMenu gameOptionsMenu, string name, string[] strings, int DefaultValue = 0, BetterOptionItem Parent = null) { Id = id; + Values = strings; + Tab = gameOptionsMenu; + Name = name; + if (DefaultValue < 0) DefaultValue = 0; + if (DefaultValue > Values.Length) DefaultValue = Values.Length; + CurrentValue = DefaultValue; if (gameOptionsMenu == null) { - Load(Default); + Load(DefaultValue); return this; } @@ -36,15 +42,11 @@ public class BetterOptionStringItem : BetterOptionItem optionBehaviour.MinusBtn.OnClick.AddListener(new Action(() => Decrease())); // Set data - Tab = gameOptionsMenu; - Name = name; TitleText = optionBehaviour.TitleText; Option = optionBehaviour; - Values = strings; - CurrentValue = Default; ThisOption = optionBehaviour; - Load(Default); + Load(DefaultValue); AdjustButtonsActiveState(); BetterOptionItems.Add(this); @@ -55,7 +57,10 @@ public class BetterOptionStringItem : BetterOptionItem { if (ThisOption == null) return; - ThisOption.ValueText.text = Values[CurrentValue]; + if (CurrentValue <= Values.Length - 1 && CurrentValue >= 0) + { + ThisOption.ValueText.text = Values[CurrentValue]; + } if (CurrentValue >= Values.Length - 1) { @@ -98,11 +103,15 @@ public class BetterOptionStringItem : BetterOptionItem { if (BetterDataManager.CanLoadSetting(Id)) { - if (ThisOption != null) + var Int = BetterDataManager.LoadIntSetting(Id); + + if (Int > Values.Length - 1 || Int < 0) { - var Int = BetterDataManager.LoadIntSetting(Id); - CurrentValue = Int; + Int = DefaultValue; + BetterDataManager.SaveSetting(Id, DefaultValue.ToString()); } + + CurrentValue = Int; } else { From 23ebedcc13a55820db30d21a0d0db0384c628dcb Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 09:13:23 -0500 Subject: [PATCH 20/22] = or > --- Patches/GameSettingMenuPatch.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index 5293613..a9f2ad7 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -49,7 +49,7 @@ static class GameSettingMenuPatch } TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"Detections")); - BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level # or >", [100, 1000, 5], 200, "Lv ", ""); + BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level = or >", [100, 1000, 5], 200, "Lv ", ""); BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Cheat Clients", true); BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(800, BetterSettingsTab, "Detect Invalid RPCs", true); From 2fd1279995d1dee26706cb3a3b0b579e3f0728c6 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 09:25:28 -0500 Subject: [PATCH 21/22] checkbox fix! --- Modules/OptionItems/BetterOptionCheckboxItem.cs | 17 +++++------------ Patches/GameSettingMenuPatch.cs | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/Modules/OptionItems/BetterOptionCheckboxItem.cs b/Modules/OptionItems/BetterOptionCheckboxItem.cs index 69c34a8..c638ed2 100644 --- a/Modules/OptionItems/BetterOptionCheckboxItem.cs +++ b/Modules/OptionItems/BetterOptionCheckboxItem.cs @@ -26,12 +26,6 @@ public class BetterOptionCheckboxItem : BetterOptionItem optionBehaviour.OnValueChanged = new Action((option) => ValueChanged(id, option)); SpacingNum += StaticSpacingNumPlus; - // Fix Game Crash - foreach (RulesCategory rulesCategory in GameManager.Instance.GameSettingsList.AllCategories) - { - optionBehaviour.data = rulesCategory.AllGameSettings.ToArray().FirstOrDefault(item => item.Type == OptionTypes.Checkbox); - } - // Set data optionBehaviour.CheckMark.GetComponent().enabled = DefaultValue; TitleText = optionBehaviour.TitleText; @@ -48,12 +42,11 @@ public class BetterOptionCheckboxItem : BetterOptionItem { if (BetterDataManager.CanLoadSetting(Id)) { - if (ThisOption != null) - { - var Bool = BetterDataManager.LoadBoolSetting(Id); - ThisOption.CheckMark.GetComponent().enabled = Bool; - IsChecked = Bool; - } + if (ThisOption == null) return; + + var Bool = BetterDataManager.LoadBoolSetting(Id); + ThisOption.CheckMark.GetComponent().enabled = Bool; + IsChecked = Bool; } else { diff --git a/Patches/GameSettingMenuPatch.cs b/Patches/GameSettingMenuPatch.cs index a9f2ad7..357bd57 100644 --- a/Patches/GameSettingMenuPatch.cs +++ b/Patches/GameSettingMenuPatch.cs @@ -49,7 +49,7 @@ static class GameSettingMenuPatch } TitleList.Add(new BetterOptionTitleItem().Create(BetterSettingsTab, $"Detections")); - BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level = or >", [100, 1000, 5], 200, "Lv ", ""); + BetterGameSettings.DetectedLevelAbove = new BetterOptionIntItem().Create(600, BetterSettingsTab, "Detected player level = or >", [100, 5000, 5], 200, "Lv ", ""); BetterGameSettings.DetectCheatClients = new BetterOptionCheckboxItem().Create(700, BetterSettingsTab, "Detect Cheat Clients", true); BetterGameSettings.DetectInvalidRPCs = new BetterOptionCheckboxItem().Create(800, BetterSettingsTab, "Detect Invalid RPCs", true); From c31aa9bada578e2be3c8de499cb60deecb4dd89f Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sat, 24 Aug 2024 09:33:44 -0500 Subject: [PATCH 22/22] Fix host color --- Modules/ExtendedPlayerControl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/ExtendedPlayerControl.cs b/Modules/ExtendedPlayerControl.cs index 8ba467b..312eee7 100644 --- a/Modules/ExtendedPlayerControl.cs +++ b/Modules/ExtendedPlayerControl.cs @@ -35,7 +35,7 @@ static class ExtendedPlayerControl try { - return $"{player.Data.PlayerName}"; + return $"{player.Data.PlayerName}"; } catch {