From 1dc621b15bada49b7970ec0578b00506774fd22b Mon Sep 17 00:00:00 2001 From: D1GQ Date: Wed, 9 Jul 2025 20:10:42 -0500 Subject: [PATCH 1/4] fix --- BetterAmongUs.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BetterAmongUs.csproj b/BetterAmongUs.csproj index d24d483..2f85271 100644 --- a/BetterAmongUs.csproj +++ b/BetterAmongUs.csproj @@ -1,4 +1,4 @@ - + net6.0 enable From 2ec40f0edfcbf7babdbf572bd03adf99eba567bb Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sun, 13 Jul 2025 20:44:17 -0500 Subject: [PATCH 2/4] Beta and only clear player chats --- Helpers/InnerNetClientHelper.cs | 22 ++++++++++++++++- Helpers/Utils.cs | 4 +-- Managers/PrivateOnlyLobbyManager.cs | 33 +++++++++++++++++++++++-- Modules/AntiCheat/RPCHandler.cs | 8 ------ Modules/RPC.cs | 19 ++------------- Patches/ChatPatch.cs | 38 +++++++++++++++++++++++++++-- Patches/MeetingHudPatch.cs | 2 +- main.cs | 10 ++++---- 8 files changed, 98 insertions(+), 38 deletions(-) diff --git a/Helpers/InnerNetClientHelper.cs b/Helpers/InnerNetClientHelper.cs index 244cf94..77fdd07 100644 --- a/Helpers/InnerNetClientHelper.cs +++ b/Helpers/InnerNetClientHelper.cs @@ -1,4 +1,5 @@ -using Hazel; +using AmongUs.InnerNet.GameDataMessages; +using Hazel; using InnerNet; using System.Globalization; @@ -6,6 +7,25 @@ namespace BetterAmongUs.Helpers; static class InnerNetClientHelper { + internal static void BroadcastRpc(this BaseRpcMessage rpcMessage, bool reliable = true) + { + if (rpcMessage.TryCast(out var data)) + { + if (reliable) + AmongUsClient.Instance.reliableMessageQueue.Enqueue(data); + else + AmongUsClient.Instance.unreliableMessageQueue.Enqueue(data); + } + } + + internal static void BroadcastData(this BaseGameDataMessage rpcMessage) + { + if (rpcMessage.TryCast(out var data)) + { + AmongUsClient.Instance.reliableMessageQueue.Enqueue(data); + } + } + /// /// Writes an array of boolean values to a MessageWriter in a packed format to save space. /// Each byte stores up to 8 boolean values as bits. diff --git a/Helpers/Utils.cs b/Helpers/Utils.cs index 616ed53..165dd01 100644 --- a/Helpers/Utils.cs +++ b/Helpers/Utils.cs @@ -60,9 +60,9 @@ internal static class Utils var data = PlayerControl.LocalPlayer?.Data; if (data == null) return; ChatBubble pooledBubble = chat.GetPooledBubble(); - string MsgName = $"({Translator.GetString("SystemMessage")})"; + string MsgName = $"({Translator.GetString("SystemMessage")})" + ChatPatch.CommandPostfixName; if (overrideName != "") - MsgName = overrideName; + MsgName = overrideName + ChatPatch.CommandPostfixName; try { pooledBubble.transform.SetParent(chat.scroller.Inner); diff --git a/Managers/PrivateOnlyLobbyManager.cs b/Managers/PrivateOnlyLobbyManager.cs index d516ceb..6104d6f 100644 --- a/Managers/PrivateOnlyLobbyManager.cs +++ b/Managers/PrivateOnlyLobbyManager.cs @@ -1,4 +1,5 @@ -using BetterAmongUs.Modules; +using BetterAmongUs.Helpers; +using BetterAmongUs.Modules; using BetterAmongUs.Patches; using HarmonyLib; @@ -7,8 +8,36 @@ namespace BetterAmongUs.Managers; [HarmonyPatch] internal static class PrivateOnlyLobbyManager { - internal static void SyncNames() + private static void SyncNamesAsHost() { + if (!GameState.IsHost || !GameState.IsPrivateOnlyLobby || !GameState.InGame) return; + + foreach (var target in PlayerControl.AllPlayerControls) + { + if (target.IsHost() || target.BetterData().IsBetterUser) continue; + + foreach (var player in PlayerControl.AllPlayerControls) + { + if (GameState.IsMeeting) + { + SetNameMeeting(player, target); + } + else + { + SetNameGameplay(player, target); + } + } + } + } + + private static void SetNameGameplay(PlayerControl player, PlayerControl target) + { + player.RpcSetNamePrivate("", target); + } + + private static void SetNameMeeting(PlayerControl player, PlayerControl target) + { + player.RpcSetNamePrivate("", target); } [HarmonyPatch(typeof(PlayerControl))] diff --git a/Modules/AntiCheat/RPCHandler.cs b/Modules/AntiCheat/RPCHandler.cs index b89c582..52633c2 100644 --- a/Modules/AntiCheat/RPCHandler.cs +++ b/Modules/AntiCheat/RPCHandler.cs @@ -2,7 +2,6 @@ using BetterAmongUs.Items.Attributes; using Hazel; using InnerNet; -using System.Reflection; using UnityEngine; namespace BetterAmongUs.Modules.AntiCheat; @@ -20,13 +19,6 @@ internal enum HandlerFlag internal abstract class RPCHandler { internal static readonly RPCHandler?[] allHandlers = [.. RegisterRPCHandlerAttribute.Instances]; - - internal static RPCHandler?[] GetAllHandlerInstances() => Assembly.GetExecutingAssembly() - .GetTypes() - .Where(t => t.IsSubclassOf(typeof(RPCHandler)) && !t.IsAbstract) - .Select(t => (RPCHandler?)Activator.CreateInstance(t)) - .ToArray(); - internal InnerNetClient innerNetClient => AmongUsClient.Instance; internal virtual byte CallId => byte.MaxValue; internal virtual byte GameDataTag => byte.MaxValue; diff --git a/Modules/RPC.cs b/Modules/RPC.cs index 1752e6f..2036c90 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -33,22 +33,6 @@ enum HandleGameDataTags : byte internal static class RPC { - internal static void RpcSyncSettings() - { - if (!AmongUsClient.Instance.AmHost) - { - return; - } - - foreach (var player in Main.AllPlayerControls.Where(pc => !pc.IsLocalPlayer())) - { - var optionsByteArray = GameOptionsManager.Instance.gameOptionsFactory.ToBytes(GameOptionsManager.Instance.CurrentGameOptions, false); - MessageWriter messageWriter = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.SyncSettings, SendOption.None, player.GetClientId()); - messageWriter.WriteBytesAndSize(optionsByteArray); - AmongUsClient.Instance.FinishRpcImmediately(messageWriter); - } - } - internal static void RpcSetNamePrivate(PlayerControl player, string name, PlayerControl target) { if (!GameState.IsHost || !GameState.IsVanillaServer) @@ -65,7 +49,8 @@ internal static class RPC internal static void RpcExile(PlayerControl player) { MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.Exiled, SendOption.Reliable, -1); - AmongUsClient.Instance.FinishRpcImmediately(writer); + AmongUsClient.Instance.FinishRpcImmediately(writer); + player.Exiled(); } diff --git a/Patches/ChatPatch.cs b/Patches/ChatPatch.cs index 7d511dc..1c1b453 100644 --- a/Patches/ChatPatch.cs +++ b/Patches/ChatPatch.cs @@ -9,18 +9,52 @@ using UnityEngine; namespace BetterAmongUs.Patches; -// History and dark mode from: https://github.com/0xDrMoe/TownofHost-Enhanced - class ChatPatch { internal static List ChatHistory = []; internal static int CurrentHistorySelection = -1; + internal const string CommandPostfixName = "IsCommand"; + internal static void ClearChat() { + if (!HudManager.InstanceExists) return; + HudManager.Instance.Chat.chatBubblePool.ReclaimAll(); } + internal static void ClearPlayerChats() + { + if (!HudManager.InstanceExists) return; + + foreach (var obj in HudManager.Instance.Chat.chatBubblePool.activeChildren.ToArray()) + { + var chatBubble = obj.GetComponent(); + if (chatBubble != null) + { + if (chatBubble.NameText.text.EndsWith(CommandPostfixName)) continue; + HudManager.Instance.Chat.chatBubblePool.Reclaim(chatBubble); + } + } + HudManager.Instance.Chat.AlignAllBubbles(); + } + + internal static void ClearCommands() + { + if (!HudManager.InstanceExists) return; + + foreach (var obj in HudManager.Instance.Chat.chatBubblePool.activeChildren.ToArray()) + { + var chatBubble = obj.GetComponent(); + if (chatBubble != null) + { + if (!chatBubble.NameText.text.EndsWith(CommandPostfixName)) continue; + HudManager.Instance.Chat.chatBubblePool.Reclaim(chatBubble); + } + } + HudManager.Instance.Chat.AlignAllBubbles(); + } + [HarmonyPatch(typeof(ChatController))] internal class ChatControllerPatch { diff --git a/Patches/MeetingHudPatch.cs b/Patches/MeetingHudPatch.cs index d800f54..11b7f19 100644 --- a/Patches/MeetingHudPatch.cs +++ b/Patches/MeetingHudPatch.cs @@ -221,7 +221,7 @@ class MeetingHudPatch if (Main.ChatInGameplay.Value && !GameState.IsFreePlay && PlayerControl.LocalPlayer.IsAlive()) { - ChatPatch.ClearChat(); + ChatPatch.ClearPlayerChats(); } } } \ No newline at end of file diff --git a/main.cs b/main.cs index 2e66b14..75f2dcb 100644 --- a/main.cs +++ b/main.cs @@ -28,13 +28,13 @@ internal enum ReleaseTypes : int [BepInProcess("Among Us.exe")] internal class Main : BasePlugin { - internal static readonly ReleaseTypes ReleaseBuildType = ReleaseTypes.Release; - internal const string BetaNum = "0"; + internal static readonly ReleaseTypes ReleaseBuildType = ReleaseTypes.Beta; + internal const string BetaNum = "1"; internal const string HotfixNum = "0"; internal const bool IsHotFix = false; internal const string PluginGuid = "com.ten.betteramongus"; internal const string PluginVersion = "1.2.0"; - internal const string ReleaseDate = "07.09.2025"; // mm/dd/yyyy + internal const string ReleaseDate = "07.13.2025"; // mm/dd/yyyy internal const string Github = "https://github.com/EnhancedNetwork/BetterAmongUs-Public"; internal const string Discord = "https://discord.gg/ten"; internal static UserData MyData = UserData.AllUsers.First(); @@ -65,10 +65,10 @@ internal class Main : BasePlugin text = $"v{BetterAmongUsVersion}"; break; case ReleaseTypes.Beta: - text = $"v{BetterAmongUsVersion}{newLineText}Beta {Main.BetaNum}"; + text = $"v{BetterAmongUsVersion}{newLineText}Beta {BetaNum}"; break; case ReleaseTypes.Dev: - text = $"v{BetterAmongUsVersion}{newLineText}Dev {Main.ReleaseDate}"; + text = $"v{BetterAmongUsVersion}{newLineText}Dev {ReleaseDate}"; break; default: break; From 53fd4ff1b188920ef39bb957d294d62fad0f12ef Mon Sep 17 00:00:00 2001 From: D1GQ Date: Mon, 14 Jul 2025 04:50:04 -0500 Subject: [PATCH 3/4] Fix Announcements --- Patches/AnnouncementPatch.cs | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/Patches/AnnouncementPatch.cs b/Patches/AnnouncementPatch.cs index d609cfd..9f70f55 100644 --- a/Patches/AnnouncementPatch.cs +++ b/Patches/AnnouncementPatch.cs @@ -1,11 +1,9 @@ using AmongUs.Data; using AmongUs.Data.Player; using Assets.InnerNet; -using BepInEx.Unity.IL2CPP.Utils.Collections; using BetterAmongUs.Helpers; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes.Arrays; -using System.Collections; using System.Reflection; using UnityEngine; @@ -128,20 +126,11 @@ internal class ModNews } } - [HarmonyPatch(typeof(AnnouncementPopUp), nameof(AnnouncementPopUp.Init)), HarmonyPostfix] - internal static void Initialize(ref Il2CppSystem.Collections.IEnumerator __result) - { - static IEnumerator FetchBlacklist() - { - ProcessModNewsFiles(); - yield return null; - } - __result = Effects.Sequence(FetchBlacklist().WrapToIl2Cpp(), __result); - } - [HarmonyPatch(typeof(PlayerAnnouncementData), nameof(PlayerAnnouncementData.SetAnnouncements)), HarmonyPrefix] internal static bool SetModAnnouncements(PlayerAnnouncementData __instance, [HarmonyArgument(0)] ref Il2CppReferenceArray aRange) { + ProcessModNewsFiles(); + AllModNews.Sort((a1, a2) => DateTime.Compare(DateTime.Parse(a2.Date), DateTime.Parse(a1.Date))); List finalAllNews = new List(); From b27f80aa9caba58f0090d8172ba33f5a60d08491 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Mon, 14 Jul 2025 21:07:22 -0500 Subject: [PATCH 4/4] Update date --- main.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cs b/main.cs index 75f2dcb..ec2b1cd 100644 --- a/main.cs +++ b/main.cs @@ -34,7 +34,7 @@ internal class Main : BasePlugin internal const bool IsHotFix = false; internal const string PluginGuid = "com.ten.betteramongus"; internal const string PluginVersion = "1.2.0"; - internal const string ReleaseDate = "07.13.2025"; // mm/dd/yyyy + internal const string ReleaseDate = "07.14.2025"; // mm/dd/yyyy internal const string Github = "https://github.com/EnhancedNetwork/BetterAmongUs-Public"; internal const string Discord = "https://discord.gg/ten"; internal static UserData MyData = UserData.AllUsers.First();