From 86520d7f2b6fd9b0ae5164a09e6fe4442110ab61 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Sun, 19 Oct 2025 22:51:39 -0500 Subject: [PATCH] Add custom names --- Helpers/ExtendedPlayerControl.cs | 2 + Helpers/PlayerControlHelper.cs | 20 +- Helpers/Utils.cs | 15 ++ Managers/HostManager.cs | 130 +++++++++++ Managers/NetworkManager.cs | 1 + Managers/PrivateOnlyLobbyManager.cs | 35 +-- Modules/AntiCheat/BetterAntiCheat.cs | 1 + Modules/AntiCheat/RPCHandler.cs | 1 + .../AntiCheat/RPCHandlers/AUMChatHandler.cs | 1 + Modules/AntiCheat/RPCHandlers/AUMHandler.cs | 1 + .../RPCHandlers/KillNetworkChatHandler.cs | 1 + .../RPCHandlers/KillNetworkHandler.cs | 1 + .../DeserializeNetObjectHandler.cs | 1 + .../DespawnNetObjectHandler.cs | 1 + Modules/AntiCheat/RPCHandlers/SickoHandler.cs | 1 + Modules/HandshakeHandler.cs | 1 + Mono/PlayerInfoDisplay.cs | 23 +- {Modules => Network}/RPC.cs | 219 +++++++++--------- Patches/Gameplay/GameManagersPatch.cs | 9 +- Patches/Gameplay/Player/PlayerControlPatch.cs | 19 ++ Patches/Gameplay/UI/MeetingHudPatch.cs | 8 + .../UI/Settings/GameSettingMenuPatch.cs | 2 +- Patches/Managers/HudManagerPatch.cs | 7 + 23 files changed, 319 insertions(+), 181 deletions(-) create mode 100644 Managers/HostManager.cs rename {Modules => Network}/RPC.cs (93%) diff --git a/Helpers/ExtendedPlayerControl.cs b/Helpers/ExtendedPlayerControl.cs index 3affa27..f779925 100644 --- a/Helpers/ExtendedPlayerControl.cs +++ b/Helpers/ExtendedPlayerControl.cs @@ -44,6 +44,8 @@ internal class ExtendedPlayerControl : MonoBehaviour, IMonoExtension NameSetLastFor = []; } internal static class PlayerControlExtension diff --git a/Helpers/PlayerControlHelper.cs b/Helpers/PlayerControlHelper.cs index 6ceb690..df356aa 100644 --- a/Helpers/PlayerControlHelper.cs +++ b/Helpers/PlayerControlHelper.cs @@ -1,6 +1,7 @@ using AmongUs.GameOptions; using BetterAmongUs.Data; using BetterAmongUs.Modules; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.Player; using BetterAmongUs.Patches.Gameplay.UI.Settings; using InnerNet; @@ -129,13 +130,7 @@ static class PlayerControlHelper } } } - // RPCs - // Set name for Target - internal static void RpcSetNamePrivate(this PlayerControl player, string name, PlayerControl target) - { - if (player == null || target == null) return; - RPC.RpcSetNamePrivate(player, name, target); - } + // Exile player internal static void RpcExile(this PlayerControl player) { @@ -197,11 +192,12 @@ static class PlayerControlHelper return false; } // Get hex color for team - internal static string GetTeamHexColor(this PlayerControl player) + internal static string GetTeamHexColor(this PlayerControl player) => player.Data.GetTeamHexColor(); + internal static string GetTeamHexColor(this NetworkedPlayerInfo data) { - if (player == null) return "#ffffff"; + if (data == null) return "#ffffff"; - if (player.IsImpostorTeam()) + if (data.IsImpostorTeam()) { return "#f00202"; } @@ -210,12 +206,14 @@ static class PlayerControlHelper return "#8cffff"; } } + // Check if player is role type internal static bool Is(this PlayerControl player, RoleTypes role) => player?.Data?.RoleType == role; // Check if player is Ghost role type internal static bool IsGhostRole(this PlayerControl player) => player?.Data?.RoleType is RoleTypes.GuardianAngel; // Check if player is on imposter team - internal static bool IsImpostorTeam(this PlayerControl player) => player?.Data != null && player.Data.RoleType is RoleTypes.Impostor or RoleTypes.ImpostorGhost or RoleTypes.Shapeshifter or RoleTypes.Phantom or RoleTypes.Viper; + internal static bool IsImpostorTeam(this PlayerControl player) => player?.Data?.IsImpostorTeam() == true; + internal static bool IsImpostorTeam(this NetworkedPlayerInfo data) => data?.RoleType is RoleTypes.Impostor or RoleTypes.ImpostorGhost or RoleTypes.Shapeshifter or RoleTypes.Phantom or RoleTypes.Viper; // Check if player is a imposter teammate internal static bool IsImpostorTeammate(this PlayerControl player) => player != null && PlayerControl.LocalPlayer != null && diff --git a/Helpers/Utils.cs b/Helpers/Utils.cs index 908ccff..b259dd6 100644 --- a/Helpers/Utils.cs +++ b/Helpers/Utils.cs @@ -25,6 +25,21 @@ internal static class Utils return text; } + internal static string FormatInfo(StringBuilder source) + { + if (source.Length == 0) return string.Empty; + + var sb = new StringBuilder(); + foreach (var part in source.ToString().Split("+++")) + { + if (!string.IsNullOrEmpty(Utils.RemoveHtmlText(part))) + { + sb.Append(part).Append(" - "); + } + } + return sb.ToString().TrimEnd(" - ".ToCharArray()); + } + internal static bool IsInternetAvailable() { if (Application.internetReachability == NetworkReachability.NotReachable) diff --git a/Managers/HostManager.cs b/Managers/HostManager.cs new file mode 100644 index 0000000..d6d03eb --- /dev/null +++ b/Managers/HostManager.cs @@ -0,0 +1,130 @@ +using AmongUs.GameOptions; +using BepInEx.Unity.IL2CPP.Utils; + +using BetterAmongUs.Helpers; +using BetterAmongUs.Modules; +using BetterAmongUs.Network; +using BetterAmongUs.Patches.Gameplay.UI.Settings; +using System.Collections; +using System.Text; +using UnityEngine; + +namespace BetterAmongUs.Managers; + +internal static class HostManager +{ + internal enum SyncType + { + Reset, + Gameplay, + Meeting + } + + private static Coroutine? syncCoroutine = null; + + internal static void SyncNames(SyncType syncType, float sDelay, int repeat = 1) + { + if (!GameState.IsHost || !BetterGameSettings.ShowRoleForClients.GetValue()) return; + + if (syncCoroutine != null && GameData.Instance != null) + { + GameData.Instance.StopCoroutine(syncCoroutine); + syncCoroutine = null; + } + + if (GameData.Instance != null) + { + syncCoroutine = GameData.Instance.StartCoroutine(CoSyncNamesDelay(syncType, sDelay, repeat)); + } + } + + private static IEnumerator CoSyncNamesDelay(SyncType syncType, float sDelay, int repeat) + { + for (int i = 0; i < repeat; i++) + { + yield return new WaitForSeconds(sDelay); + SyncNames(syncType); + } + + syncCoroutine = null; + } + + internal static void SyncNames(SyncType syncType) + { + if (!GameState.IsHost || !BetterGameSettings.ShowRoleForClients.GetValue()) return; + + StringBuilder sb = new(); + + foreach (var player in BAUPlugin.AllPlayerControls) + { + if (syncType is SyncType.Reset) + { + SyncResetName(player); + continue; + } + + foreach (var target in BAUPlugin.AllPlayerControls) + { + if (target.IsLocalPlayer() || target.BetterData().IsVerifiedBetterUser) continue; + + switch (syncType) + { + case SyncType.Gameplay: + case SyncType.Meeting: + var shapeshift = player.shapeshiftTargetPlayerId == -1 ? player.Data : Utils.PlayerDataFromPlayerId(player.shapeshiftTargetPlayerId); + SyncNamesForGameplay(shapeshift, target, sb, player.Data, syncType == SyncType.Meeting); + break; + } + + var newName = sb.ToString(); + sb.Clear(); + + if (player.BetterPlayerControl().NameSetLastFor.TryGetValue(target.Data, out var lastName) && lastName == newName) + continue; + + player.BetterPlayerControl().NameSetLastFor[target.Data] = newName; + + RPC.RpcSetNameForTarget(player, newName, target); + Logger.Warning($"Setting {player.BetterData().RealName} name to {newName}, for {target.BetterData().RealName}"); + } + } + } + + private static void SyncResetName(PlayerControl player) + { + player.RpcSetName(player.BetterData().RealName); + } + + private static void SyncNamesForGameplay(NetworkedPlayerInfo playerData, PlayerControl target, StringBuilder sb, NetworkedPlayerInfo playerNonShapeshift, bool isMeeting) + { + bool hasInfo = false; + + if ((playerNonShapeshift.IsImpostorTeam() && target.IsImpostorTeam()) + || playerNonShapeshift.PlayerId == target.Data.PlayerId // Self + || (!target.IsAlive() && !target.Is(RoleTypes.GuardianAngel))) + { + string roleInfo = $"{playerNonShapeshift.RoleType.GetRoleName()}"; + + if (!playerNonShapeshift.IsImpostorTeam() && playerNonShapeshift.Tasks.Count > 0) + { + int completedTasks = playerNonShapeshift.Tasks.ToArray().Count(task => task.Complete); + roleInfo += $" ({completedTasks}/{playerNonShapeshift.Tasks.Count})"; + } + + sb.Append(roleInfo.Size(60f)); + hasInfo = true; + } + + if (hasInfo) + sb.Append('\n'); + + sb.Append($"{playerData.BetterData().RealName}"); + + if (hasInfo && !isMeeting) + sb.Append("\n "); + } + + internal static void SetCustomEjectMessage(string msg) + { + } +} diff --git a/Managers/NetworkManager.cs b/Managers/NetworkManager.cs index e9af2b1..45ee3aa 100644 --- a/Managers/NetworkManager.cs +++ b/Managers/NetworkManager.cs @@ -3,6 +3,7 @@ using BetterAmongUs.Helpers; using BetterAmongUs.Items.Structs; using BetterAmongUs.Modules; using BetterAmongUs.Modules.AntiCheat; +using BetterAmongUs.Network; using HarmonyLib; using Hazel; using InnerNet; diff --git a/Managers/PrivateOnlyLobbyManager.cs b/Managers/PrivateOnlyLobbyManager.cs index 02c1ebb..bb25676 100644 --- a/Managers/PrivateOnlyLobbyManager.cs +++ b/Managers/PrivateOnlyLobbyManager.cs @@ -1,5 +1,4 @@ -using BetterAmongUs.Helpers; -using BetterAmongUs.Modules; +using BetterAmongUs.Modules; using BetterAmongUs.Patches.Gameplay.UI.Settings; using HarmonyLib; @@ -8,38 +7,6 @@ namespace BetterAmongUs.Managers; [HarmonyPatch] internal static class PrivateOnlyLobbyManager { - 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))] [HarmonyPatch(nameof(PlayerControl.Die))] [HarmonyPostfix] diff --git a/Modules/AntiCheat/BetterAntiCheat.cs b/Modules/AntiCheat/BetterAntiCheat.cs index 844160c..10eea6a 100644 --- a/Modules/AntiCheat/BetterAntiCheat.cs +++ b/Modules/AntiCheat/BetterAntiCheat.cs @@ -2,6 +2,7 @@ using BetterAmongUs.Helpers; using BetterAmongUs.Items.Attributes; using BetterAmongUs.Managers; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.UI.Settings; using HarmonyLib; using Hazel; diff --git a/Modules/AntiCheat/RPCHandler.cs b/Modules/AntiCheat/RPCHandler.cs index 52633c2..c8bd294 100644 --- a/Modules/AntiCheat/RPCHandler.cs +++ b/Modules/AntiCheat/RPCHandler.cs @@ -1,5 +1,6 @@ using BetterAmongUs.Helpers; using BetterAmongUs.Items.Attributes; +using BetterAmongUs.Network; using Hazel; using InnerNet; using UnityEngine; diff --git a/Modules/AntiCheat/RPCHandlers/AUMChatHandler.cs b/Modules/AntiCheat/RPCHandlers/AUMChatHandler.cs index 5ea3f02..533d7d0 100644 --- a/Modules/AntiCheat/RPCHandlers/AUMChatHandler.cs +++ b/Modules/AntiCheat/RPCHandlers/AUMChatHandler.cs @@ -2,6 +2,7 @@ using BetterAmongUs.Data; using BetterAmongUs.Helpers; using BetterAmongUs.Items.Attributes; using BetterAmongUs.Managers; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.UI.Settings; using Hazel; using InnerNet; diff --git a/Modules/AntiCheat/RPCHandlers/AUMHandler.cs b/Modules/AntiCheat/RPCHandlers/AUMHandler.cs index ad414a6..60c145e 100644 --- a/Modules/AntiCheat/RPCHandlers/AUMHandler.cs +++ b/Modules/AntiCheat/RPCHandlers/AUMHandler.cs @@ -2,6 +2,7 @@ using BetterAmongUs.Data; using BetterAmongUs.Helpers; using BetterAmongUs.Items.Attributes; using BetterAmongUs.Managers; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.UI.Settings; using Hazel; using InnerNet; diff --git a/Modules/AntiCheat/RPCHandlers/KillNetworkChatHandler.cs b/Modules/AntiCheat/RPCHandlers/KillNetworkChatHandler.cs index ef50792..c1f830d 100644 --- a/Modules/AntiCheat/RPCHandlers/KillNetworkChatHandler.cs +++ b/Modules/AntiCheat/RPCHandlers/KillNetworkChatHandler.cs @@ -2,6 +2,7 @@ using BetterAmongUs.Data; using BetterAmongUs.Helpers; using BetterAmongUs.Items.Attributes; using BetterAmongUs.Managers; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.UI.Settings; using Hazel; using InnerNet; diff --git a/Modules/AntiCheat/RPCHandlers/KillNetworkHandler.cs b/Modules/AntiCheat/RPCHandlers/KillNetworkHandler.cs index 819942e..c928024 100644 --- a/Modules/AntiCheat/RPCHandlers/KillNetworkHandler.cs +++ b/Modules/AntiCheat/RPCHandlers/KillNetworkHandler.cs @@ -2,6 +2,7 @@ using BetterAmongUs.Data; using BetterAmongUs.Helpers; using BetterAmongUs.Items.Attributes; using BetterAmongUs.Managers; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.UI.Settings; using Hazel; using InnerNet; diff --git a/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DeserializeNetObjectHandler.cs b/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DeserializeNetObjectHandler.cs index cc442a9..bf08fc2 100644 --- a/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DeserializeNetObjectHandler.cs +++ b/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DeserializeNetObjectHandler.cs @@ -1,4 +1,5 @@ using BetterAmongUs.Managers; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.UI; using Hazel; using InnerNet; diff --git a/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DespawnNetObjectHandler.cs b/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DespawnNetObjectHandler.cs index cf10f12..a59a674 100644 --- a/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DespawnNetObjectHandler.cs +++ b/Modules/AntiCheat/RPCHandlers/NetObjectHandlers/DespawnNetObjectHandler.cs @@ -1,4 +1,5 @@ using BetterAmongUs.Managers; +using BetterAmongUs.Network; using Hazel; using InnerNet; diff --git a/Modules/AntiCheat/RPCHandlers/SickoHandler.cs b/Modules/AntiCheat/RPCHandlers/SickoHandler.cs index 6dabb70..826dfc8 100644 --- a/Modules/AntiCheat/RPCHandlers/SickoHandler.cs +++ b/Modules/AntiCheat/RPCHandlers/SickoHandler.cs @@ -2,6 +2,7 @@ using BetterAmongUs.Data; using BetterAmongUs.Helpers; using BetterAmongUs.Items.Attributes; using BetterAmongUs.Managers; +using BetterAmongUs.Network; using BetterAmongUs.Patches.Gameplay.UI.Settings; using Hazel; using InnerNet; diff --git a/Modules/HandshakeHandler.cs b/Modules/HandshakeHandler.cs index 0a322c9..4669a66 100644 --- a/Modules/HandshakeHandler.cs +++ b/Modules/HandshakeHandler.cs @@ -1,6 +1,7 @@ using BepInEx.Unity.IL2CPP.Utils; using BetterAmongUs.Data; using BetterAmongUs.Helpers; +using BetterAmongUs.Network; using Hazel; using Il2CppInterop.Runtime.Attributes; using System.Collections; diff --git a/Mono/PlayerInfoDisplay.cs b/Mono/PlayerInfoDisplay.cs index cc40a6e..b233409 100644 --- a/Mono/PlayerInfoDisplay.cs +++ b/Mono/PlayerInfoDisplay.cs @@ -121,12 +121,12 @@ internal class PlayerInfoDisplay : MonoBehaviour else { var targetData = Utils.PlayerDataFromPlayerId(_player.shapeshiftTargetPlayerId); - if (targetData != null) _player.RawSetName(targetData.BetterData().RealName); + if (targetData != null) _player.RawSetName(targetData.BetterData()?.RealName ?? targetData.PlayerName); } - _topText?.SetText(FormatInfo(sbTagTop)); - _bottomText?.SetText(FormatInfo(sbTagBottom)); - _infoText?.SetText(FormatInfo(sbTag)); + _topText?.SetText(Utils.FormatInfo(sbTagTop)); + _bottomText?.SetText(Utils.FormatInfo(sbTagBottom)); + _infoText?.SetText(Utils.FormatInfo(sbTag)); } private string ValidateFriendCode(out string color) @@ -263,19 +263,4 @@ internal class PlayerInfoDisplay : MonoBehaviour text.transform.localPosition = new Vector3(0f, -1.5f, 0.4999f); } } - - private static string FormatInfo(StringBuilder source) - { - if (source.Length == 0) return string.Empty; - - var sb = new StringBuilder(); - foreach (var part in source.ToString().Split("+++")) - { - if (!string.IsNullOrEmpty(Utils.RemoveHtmlText(part))) - { - sb.Append(part).Append(" - "); - } - } - return sb.ToString().TrimEnd(" - ".ToCharArray()); - } } \ No newline at end of file diff --git a/Modules/RPC.cs b/Network/RPC.cs similarity index 93% rename from Modules/RPC.cs rename to Network/RPC.cs index 2036c90..485f370 100644 --- a/Modules/RPC.cs +++ b/Network/RPC.cs @@ -1,136 +1,137 @@ using BetterAmongUs.Helpers; +using BetterAmongUs.Modules; using Hazel; -namespace BetterAmongUs.Modules; +namespace BetterAmongUs.Network; enum CustomRPC : int { // Cheat RPC's Sicko = 420, // Results in 164 AUM = 42069, // Results in 85 - AUMChat = 101, - KillNetwork = 250, - KillNetworkChat = 119, - - // TOHE + AUMChat = 101, + KillNetwork = 250, + KillNetworkChat = 119, + + // TOHE VersionCheck = 80, - RequestRetryVersionCheck = 81, - - //Better Among Us - LegacyBetterCheck = 150, // Unused - SendSecretToPlayer, + RequestRetryVersionCheck = 81, + + //Better Among Us + LegacyBetterCheck = 150, // Unused + SendSecretToPlayer, CheckSecretHashFromPlayer, -} - +} + enum HandleGameDataTags : byte -{ - NetObjectDeserialize = 1, - NetObjectHandleRPC = 2, - NetObjectSpawn = 4, - NetObjectDespawn = 5, +{ + NetObjectDeserialize = 1, + NetObjectHandleRPC = 2, + NetObjectSpawn = 4, + NetObjectDespawn = 5, ClientDataReady = 7, } internal static class RPC -{ - internal static void RpcSetNamePrivate(PlayerControl player, string name, PlayerControl target) - { - if (!GameState.IsHost || !GameState.IsVanillaServer) - { - return; - } +{ + internal static void RpcSetNameForTarget(PlayerControl player, string name, PlayerControl target) + { + if (!GameState.IsHost) + { + return; + } - MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.SetName, SendOption.Reliable, target.GetClientId()); - writer.Write(player.Data.NetId); + MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(player.NetId, (byte)RpcCalls.SetName, SendOption.Reliable, target.GetClientId()); + writer.Write(player.Data.NetId); writer.Write(name); AmongUsClient.Instance.FinishRpcImmediately(writer); - } - + } + 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(); - } - - internal static void HandleCustomRPC(PlayerControl player, byte callId, MessageReader oldReader) - { - if (player == null || player.IsLocalPlayer() || player.Data == null || Enum.IsDefined(typeof(RpcCalls), callId)) return; - - if (Enum.IsDefined(typeof(CustomRPC), (int)unchecked(callId))) - { - MessageReader reader = MessageReader.Get(oldReader); - - switch (callId) - { - /* - case (byte)CustomRPC.LegacyBetterCheck: - { - var SetBetterUser = reader.ReadBoolean(); - var Signature = reader.ReadString(); - var Version = reader.ReadString(); - var IsVerified = Signature == Main.ModSignature.ToString(); - - if (string.IsNullOrEmpty(Signature) || string.IsNullOrEmpty(Version)) - { - BetterNotificationManager.NotifyCheat(player, $"Invalid Action RPC: {Enum.GetName((CustomRPC)callId)} called with invalid info"); - break; - } - - player.BetterData().IsBetterUser = SetBetterUser; - - if (IsVerified) - { - player.BetterData().IsVerifiedBetterUser = true; - } - - Logger.Log($"Received better user RPC from: {player.Data.PlayerName}:{player.Data.FriendCode}:{Utils.GetHashPuid(player)} - " + - $"BetterUser: {SetBetterUser} - " + - $"Version: {Version} - " + - $"Verified: {IsVerified} - " + - $"Signature: {Signature}"); - - Utils.DirtyAllNames(); - } - break; - */ - case (byte)CustomRPC.SendSecretToPlayer: - { - player.BetterData().HandshakeHandler.HandleSecretFromSender(reader); - } - break; - case (byte)CustomRPC.CheckSecretHashFromPlayer: - { - player.BetterData().HandshakeHandler.HandleSecretHashFromPlayer(reader); - } - break; - /* - case (byte)CustomRPC.VersionCheck or (byte)CustomRPC.RequestRetryVersionCheck: - if (player.IsHost()) - { - player.BetterData().IsTOHEHost = true; - } - break; - */ - } - } + } + + internal static void HandleCustomRPC(PlayerControl player, byte callId, MessageReader oldReader) + { + if (player == null || player.IsLocalPlayer() || player.Data == null || Enum.IsDefined(typeof(RpcCalls), callId)) return; + + if (Enum.IsDefined(typeof(CustomRPC), (int)unchecked(callId))) + { + MessageReader reader = MessageReader.Get(oldReader); + + switch (callId) + { + /* + case (byte)CustomRPC.LegacyBetterCheck: + { + var SetBetterUser = reader.ReadBoolean(); + var Signature = reader.ReadString(); + var Version = reader.ReadString(); + var IsVerified = Signature == Main.ModSignature.ToString(); + + if (string.IsNullOrEmpty(Signature) || string.IsNullOrEmpty(Version)) + { + BetterNotificationManager.NotifyCheat(player, $"Invalid Action RPC: {Enum.GetName((CustomRPC)callId)} called with invalid info"); + break; + } + + player.BetterData().IsBetterUser = SetBetterUser; + + if (IsVerified) + { + player.BetterData().IsVerifiedBetterUser = true; + } + + Logger.Log($"Received better user RPC from: {player.Data.PlayerName}:{player.Data.FriendCode}:{Utils.GetHashPuid(player)} - " + + $"BetterUser: {SetBetterUser} - " + + $"Version: {Version} - " + + $"Verified: {IsVerified} - " + + $"Signature: {Signature}"); + + Utils.DirtyAllNames(); + } + break; + */ + case (byte)CustomRPC.SendSecretToPlayer: + { + player.BetterData().HandshakeHandler.HandleSecretFromSender(reader); + } + break; + case (byte)CustomRPC.CheckSecretHashFromPlayer: + { + player.BetterData().HandshakeHandler.HandleSecretHashFromPlayer(reader); + } + break; + /* + case (byte)CustomRPC.VersionCheck or (byte)CustomRPC.RequestRetryVersionCheck: + if (player.IsHost()) + { + player.BetterData().IsTOHEHost = true; + } + break; + */ + } + } else if (!Enum.IsDefined(typeof(CustomRPC), (int)unchecked(callId))) - { - try - { - if (!GameState.IsHost && !GameState.IsTOHEHostLobby) - { - if (player.IsHost()) - { - var Icon = Translator.GetString("BAUMark"); - var BAU = $"{Icon}{Translator.GetString("BAU")}{Icon}"; - Utils.DisconnectSelf(string.Format(Translator.GetString("ModdedLobbyMsg"), BAU)); - } - } - } - catch { } - } + { + try + { + if (!GameState.IsHost && !GameState.IsTOHEHostLobby) + { + if (player.IsHost()) + { + var Icon = Translator.GetString("BAUMark"); + var BAU = $"{Icon}{Translator.GetString("BAU")}{Icon}"; + Utils.DisconnectSelf(string.Format(Translator.GetString("ModdedLobbyMsg"), BAU)); + } + } + } + catch { } + } } } diff --git a/Patches/Gameplay/GameManagersPatch.cs b/Patches/Gameplay/GameManagersPatch.cs index cb3adf6..7021c59 100644 --- a/Patches/Gameplay/GameManagersPatch.cs +++ b/Patches/Gameplay/GameManagersPatch.cs @@ -1,4 +1,5 @@ using BetterAmongUs.Helpers; +using BetterAmongUs.Managers; using BetterAmongUs.Modules; using HarmonyLib; using System.Text; @@ -17,13 +18,7 @@ internal static class GameManagersPatch [HarmonyPostfix] private static void EndGame_Postfix(/*GameManager __instance*/) { - if (GameState.IsHost) - { - foreach (PlayerControl player in BAUPlugin.AllPlayerControls) - { - player.RpcSetName(player.Data.PlayerName); - } - } + HostManager.SyncNames(HostManager.SyncType.Reset); } } diff --git a/Patches/Gameplay/Player/PlayerControlPatch.cs b/Patches/Gameplay/Player/PlayerControlPatch.cs index 3750c8d..230b173 100644 --- a/Patches/Gameplay/Player/PlayerControlPatch.cs +++ b/Patches/Gameplay/Player/PlayerControlPatch.cs @@ -1,5 +1,6 @@ using BetterAmongUs.Helpers; using BetterAmongUs.Items.OptionItems; +using BetterAmongUs.Managers; using HarmonyLib; namespace BetterAmongUs.Patches.Gameplay.Player; @@ -32,6 +33,8 @@ internal static class PlayerControlPatch Logger.LogPrivate($"{__instance.Data.PlayerName} Has killed {target.Data.PlayerName} as {__instance.Data.RoleType.GetRoleName()}", "EventLog"); __instance.BetterData().RoleInfo.Kills += 1; + + HostManager.SyncNames(HostManager.SyncType.Gameplay); } [HarmonyPatch(nameof(PlayerControl.Shapeshift))] @@ -44,6 +47,22 @@ internal static class PlayerControlPatch Logger.LogPrivate($"{__instance.Data.PlayerName} Has Shapeshifted into {target.Data.PlayerName}, did animate: {animate}", "EventLog"); else Logger.LogPrivate($"{__instance.Data.PlayerName} Has Un-Shapeshifted, did animate: {animate}", "EventLog"); + + HostManager.SyncNames(HostManager.SyncType.Gameplay, 0.2f, 30); + } + + [HarmonyPatch(nameof(PlayerControl.CompleteTask))] + [HarmonyPostfix] + private static void CompleteTask_Postfix(PlayerControl __instance) + { + HostManager.SyncNames(HostManager.SyncType.Gameplay); + } + + [HarmonyPatch(nameof(PlayerControl.StartMeeting))] + [HarmonyPrefix] + private static void StartMeeting_Prefix(PlayerControl __instance) + { + HostManager.SyncNames(HostManager.SyncType.Meeting); } [HarmonyPatch(nameof(PlayerControl.SetRoleInvisibility))] diff --git a/Patches/Gameplay/UI/MeetingHudPatch.cs b/Patches/Gameplay/UI/MeetingHudPatch.cs index 7641e59..14d59fe 100644 --- a/Patches/Gameplay/UI/MeetingHudPatch.cs +++ b/Patches/Gameplay/UI/MeetingHudPatch.cs @@ -1,4 +1,5 @@ using BetterAmongUs.Helpers; +using BetterAmongUs.Managers; using BetterAmongUs.Modules; using BetterAmongUs.Mono; using BetterAmongUs.Patches.Gameplay.UI.Chat; @@ -45,4 +46,11 @@ internal static class MeetingHudPatch ChatPatch.ClearPlayerChats(); } } + + [HarmonyPatch(nameof(MeetingHud.SetMasksEnabled))] + [HarmonyPostfix] + private static void SetMasksEnabled_Postfix(MeetingHud __instance) + { + HostManager.SyncNames(HostManager.SyncType.Reset); + } } \ No newline at end of file diff --git a/Patches/Gameplay/UI/Settings/GameSettingMenuPatch.cs b/Patches/Gameplay/UI/Settings/GameSettingMenuPatch.cs index 5723fec..1084812 100644 --- a/Patches/Gameplay/UI/Settings/GameSettingMenuPatch.cs +++ b/Patches/Gameplay/UI/Settings/GameSettingMenuPatch.cs @@ -64,7 +64,7 @@ internal static class GameSettingMenuPatch BetterGameSettings.UseBanWordList = OptionCheckboxItem.Create(500, BetterSettingsTab, "BetterSetting.Setting.UseBanWordList", true); BetterGameSettings.UseBanWordListOnlyLobby = OptionCheckboxItem.Create(1400, BetterSettingsTab, "BetterSetting.Setting.UseBanWordListOnlyLobby", true, BetterGameSettings.UseBanWordList); OptionDividerItem.Create(BetterSettingsTab); - BetterGameSettings.ShowRoleForClients = OptionCheckboxItem.Create(1700, BetterSettingsTab, "BetterSetting.Setting.ShowRoleForClient", false); + BetterGameSettings.ShowRoleForClients = OptionCheckboxItem.Create(1700, BetterSettingsTab, "BetterSetting.Setting.ShowRoleForClients", false); OptionDividerItem.Create(BetterSettingsTab); } diff --git a/Patches/Managers/HudManagerPatch.cs b/Patches/Managers/HudManagerPatch.cs index 5b8bfac..3846443 100644 --- a/Patches/Managers/HudManagerPatch.cs +++ b/Patches/Managers/HudManagerPatch.cs @@ -17,6 +17,13 @@ internal static class HudManagerPatch private static bool HasBeenWelcomed = false; + [HarmonyPatch(nameof(HudManager.CoShowIntro))] + [HarmonyPostfix] + private static void CoShowIntro_Postfix(HudManager __instance) + { + HostManager.SyncNames(HostManager.SyncType.Gameplay, 0.25f, 20); + } + [HarmonyPatch(nameof(HudManager.Start))] [HarmonyPostfix] private static void Start_Postfix(HudManager __instance)