From 6e648692a80e2cc862522bf1e35a6185ed569052 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Fri, 10 Apr 2026 01:42:07 -0500 Subject: [PATCH] Better vent tracking and chat censoring --- src/Helpers/PlayerControlHelper.cs | 24 ++++++++++--------- .../AntiCheat/RPCHandlers/EnterVentHandler.cs | 6 +++++ .../AntiCheat/RPCHandlers/ExitVentHandler.cs | 6 +++++ src/Mono/Extended/ExtendedPlayerInfo.cs | 21 ++++++++++++++-- src/Patches/Client/ClientPatch.cs | 8 ++----- .../Gameplay/Player/PlayerControlPatch.cs | 11 +++++++++ src/Patches/Gameplay/UI/MeetingHudPatch.cs | 14 +++++------ 7 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/Helpers/PlayerControlHelper.cs b/src/Helpers/PlayerControlHelper.cs index 1b5a38c..47ff70d 100644 --- a/src/Helpers/PlayerControlHelper.cs +++ b/src/Helpers/PlayerControlHelper.cs @@ -253,18 +253,20 @@ internal static class PlayerControlHelper if (player == null) return false; - if (player.inVent || player.walkingToVent) - return true; + if (player.IsLocalPlayer()) + { + return player.inVent || player.walkingToVent; + } + else + { + var extendedData = player.ExtendedData(); + if (extendedData != null) + { + return extendedData.GameplayInfo.InVent; + } + } - var physics = player.MyPhysics; - if (physics == null) - return false; - - var animations = physics.Animations; - if (animations == null) - return false; - - return animations.IsPlayingEnterVentAnimation(); + return false; } /// diff --git a/src/Modules/AntiCheat/RPCHandlers/EnterVentHandler.cs b/src/Modules/AntiCheat/RPCHandlers/EnterVentHandler.cs index 6b88d79..02b34be 100644 --- a/src/Modules/AntiCheat/RPCHandlers/EnterVentHandler.cs +++ b/src/Modules/AntiCheat/RPCHandlers/EnterVentHandler.cs @@ -2,6 +2,7 @@ using AmongUs.GameOptions; using BetterAmongUs.Attributes; using BetterAmongUs.Helpers; using BetterAmongUs.Managers; +using BetterAmongUs.Mono.Extended; using Hazel; namespace BetterAmongUs.Modules.AntiCheat.RPCHandlers; @@ -21,4 +22,9 @@ internal sealed class EnterVentHandler : RPCHandler } } } + + internal override void Handle(PlayerControl? sender, MessageReader reader) + { + sender.ExtendedData().GameplayInfo.InVent = true; + } } diff --git a/src/Modules/AntiCheat/RPCHandlers/ExitVentHandler.cs b/src/Modules/AntiCheat/RPCHandlers/ExitVentHandler.cs index 3c2c2ab..d455d68 100644 --- a/src/Modules/AntiCheat/RPCHandlers/ExitVentHandler.cs +++ b/src/Modules/AntiCheat/RPCHandlers/ExitVentHandler.cs @@ -2,6 +2,7 @@ using AmongUs.GameOptions; using BetterAmongUs.Attributes; using BetterAmongUs.Helpers; using BetterAmongUs.Managers; +using BetterAmongUs.Mono.Extended; using Hazel; namespace BetterAmongUs.Modules.AntiCheat.RPCHandlers; @@ -21,4 +22,9 @@ internal sealed class ExitVentHandler : RPCHandler } } } + + internal override void Handle(PlayerControl? sender, MessageReader reader) + { + sender.ExtendedData().GameplayInfo.InVent = false; + } } diff --git a/src/Mono/Extended/ExtendedPlayerInfo.cs b/src/Mono/Extended/ExtendedPlayerInfo.cs index 7838d00..d0830b0 100644 --- a/src/Mono/Extended/ExtendedPlayerInfo.cs +++ b/src/Mono/Extended/ExtendedPlayerInfo.cs @@ -151,12 +151,18 @@ internal sealed class ExtendedPlayerInfo : MonoBehaviour, IMonoExtension [HideFromIl2Cpp] internal ExtendedAntiCheatInfo? AntiCheatInfo { get; } = new(); + + /// + /// Gets extended gameplay information. + /// + [HideFromIl2Cpp] + internal ExtendedGameplayInfo? GameplayInfo { get; } = new(); } /// /// Contains anti-cheat monitoring information for a player. /// -internal class ExtendedAntiCheatInfo +internal sealed class ExtendedAntiCheatInfo { /// /// Maximum allowed RPCs per second. @@ -222,7 +228,7 @@ internal class ExtendedAntiCheatInfo /// /// Contains extended role information for a player. /// -internal class ExtendedRoleInfo +internal sealed class ExtendedRoleInfo { /// /// Gets or sets the number of kills. @@ -240,6 +246,17 @@ internal class ExtendedRoleInfo internal RoleTypes DeadDisplayRole { get; set; } } +/// +/// Represents the gameplay information for a player. +/// +internal sealed class ExtendedGameplayInfo +{ + /// + /// Gets or sets a value indicating whether the player is currently in a vent. + /// + internal bool InVent { get; set; } +} + /// /// Extension methods for accessing extended player data. /// diff --git a/src/Patches/Client/ClientPatch.cs b/src/Patches/Client/ClientPatch.cs index ec91cb7..d47fc25 100644 --- a/src/Patches/Client/ClientPatch.cs +++ b/src/Patches/Client/ClientPatch.cs @@ -1,5 +1,4 @@ using BepInEx.Unity.IL2CPP.Utils; -using BetterAmongUs.Data.Config; using BetterAmongUs.Helpers; using BetterAmongUs.Managers; using BetterAmongUs.Modules; @@ -111,11 +110,8 @@ internal static class ClientPatch [HarmonyPostfix] private static void AmongUsClient_CoStartGame_Postfix(AmongUsClient __instance) { - // Clear in-game chat if chat feature is enabled - if (BAUConfigs.ChatInGameplay.Value) - { - ChatPatch.ClearChat(); - } + // Censor in-game chat + ChatPatch.CensorPlayerChats(); // Start custom loading sequence __instance.StartCoroutine(CoLoading()); diff --git a/src/Patches/Gameplay/Player/PlayerControlPatch.cs b/src/Patches/Gameplay/Player/PlayerControlPatch.cs index 61ff5ed..61b044f 100644 --- a/src/Patches/Gameplay/Player/PlayerControlPatch.cs +++ b/src/Patches/Gameplay/Player/PlayerControlPatch.cs @@ -5,6 +5,7 @@ using BetterAmongUs.Helpers; using BetterAmongUs.Modules; using BetterAmongUs.Modules.OptionItems; using BetterAmongUs.Mono.Extended; +using BetterAmongUs.Patches.Gameplay.UI.Chat; using HarmonyLib; using System.Collections; using UnityEngine; @@ -56,6 +57,16 @@ internal static class PlayerControlPatch OptionPlayerItem.UpdateAllValues(); } + [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.Die))] + [HarmonyPostfix] + private static void PlayerControl_Die_Postfix(PlayerControl __instance) + { + if (__instance.IsLocalPlayer()) + { + ChatPatch.UncensorPlayerChats(); + } + } + [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.MurderPlayer))] [HarmonyPostfix] private static void PlayerControl_MurderPlayer_Postfix(PlayerControl __instance, PlayerControl target) diff --git a/src/Patches/Gameplay/UI/MeetingHudPatch.cs b/src/Patches/Gameplay/UI/MeetingHudPatch.cs index 01d5f34..3c1afb9 100644 --- a/src/Patches/Gameplay/UI/MeetingHudPatch.cs +++ b/src/Patches/Gameplay/UI/MeetingHudPatch.cs @@ -1,4 +1,3 @@ -using BetterAmongUs.Data.Config; using BetterAmongUs.Helpers; using BetterAmongUs.Modules; using BetterAmongUs.Mono; @@ -17,7 +16,8 @@ internal static class MeetingHudPatch [HarmonyPostfix] private static void MeetingHud_Start_Postfix(MeetingHud __instance) { - if (BAUConfigs.ChatInGameplay.Value && PlayerControl.LocalPlayer.IsAlive()) + // Uncensor chats when meeting starts + if (PlayerControl.LocalPlayer.IsAlive()) { ChatPatch.UncensorPlayerChats(); } @@ -92,13 +92,13 @@ internal static class MeetingHudPatch [HarmonyPostfix] private static void MeetingHud_Close_Postfix() { - timeOpen = 0f; - Logger_.LogHeader("Meeting Has Ended"); - - // Clear chat when meeting ends if gameplay chat is enabled - if (BAUConfigs.ChatInGameplay.Value && PlayerControl.LocalPlayer.IsAlive()) + // Censor chats when meeting ends + if (PlayerControl.LocalPlayer.IsAlive()) { ChatPatch.CensorPlayerChats(); } + + timeOpen = 0f; + Logger_.LogHeader("Meeting Has Ended"); } } \ No newline at end of file