From 7e1b529dc232b1b3f1012aedf31f94402f28b9c4 Mon Sep 17 00:00:00 2001 From: D1GQ Date: Wed, 14 Aug 2024 21:42:56 -0500 Subject: [PATCH] skip better user --- Modules/ExtendedInnerNetClient.cs | 11 ++++++++--- Modules/ExtendedPlayerInfo.cs | 31 +++++++++++++++++++++++++++++++ Patches/RoleManagerPatch.cs | 15 ++++++++++----- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/Modules/ExtendedInnerNetClient.cs b/Modules/ExtendedInnerNetClient.cs index 72d6e5d..e40a2c1 100644 --- a/Modules/ExtendedInnerNetClient.cs +++ b/Modules/ExtendedInnerNetClient.cs @@ -25,9 +25,9 @@ static class ExtendedInnerNetClient messageWriter.ForEach(mW => mW.Write("RPC TEST")); AmongUsClient.Instance.FinishRpcDesync(messageWriter); */ - public static List StartRpcDesync(this InnerNetClient client, uint playerNetId, byte callId, SendOption option, int ignoreClientId = -1) + public static List StartRpcDesync(this InnerNetClient client, uint playerNetId, byte callId, SendOption option, int ignoreClientId = -1, Func clientCheck = null) { - List messageWriters = []; + List messageWriters = new List(); if (ignoreClientId < 0) { @@ -37,13 +37,18 @@ static class ExtendedInnerNetClient { foreach (var allClients in AmongUsClient.Instance.allClients.ToArray().Where(c => c.Id != ignoreClientId)) { - messageWriters.Add(client.StartRpcImmediately(playerNetId, callId, option, allClients.Id)); + if (clientCheck == null || clientCheck.Invoke(allClients)) + { + messageWriters.Add(client.StartRpcImmediately(playerNetId, callId, option, allClients.Id)); + } } } return messageWriters; } + + public static void FinishRpcDesync(this InnerNetClient client, List messageWriters) { foreach (var msg in messageWriters) diff --git a/Modules/ExtendedPlayerInfo.cs b/Modules/ExtendedPlayerInfo.cs index 7e37586..425bdfe 100644 --- a/Modules/ExtendedPlayerInfo.cs +++ b/Modules/ExtendedPlayerInfo.cs @@ -1,4 +1,5 @@ using AmongUs.GameOptions; +using InnerNet; namespace BetterAmongUs; @@ -18,6 +19,7 @@ public static class PlayerControlExtensions { private static readonly Dictionary playerInfo = []; + // Get BetterData from PlayerControl public static ExtendedPlayerInfo BetterData(this PlayerControl player) { if (!playerInfo.ContainsKey(player.Data)) @@ -27,4 +29,33 @@ public static class PlayerControlExtensions return playerInfo[player.Data]; } + + // Get BetterData from NetworkedPlayerInfo + public static ExtendedPlayerInfo BetterData(this NetworkedPlayerInfo info) + { + if (!playerInfo.ContainsKey(info)) + { + playerInfo[info] = new ExtendedPlayerInfo(); + } + + return playerInfo[info]; + } + + // Get BetterData from ClientData + public static ExtendedPlayerInfo? BetterData(this ClientData data) + { + var player = Utils.PlayerFromClientId(data.Id); + + if (player != null) + { + if (!playerInfo.ContainsKey(player.Data)) + { + playerInfo[player.Data] = new ExtendedPlayerInfo(); + } + + return playerInfo[player.Data]; + } + + return null; + } } diff --git a/Patches/RoleManagerPatch.cs b/Patches/RoleManagerPatch.cs index 9adec09..4995d0c 100644 --- a/Patches/RoleManagerPatch.cs +++ b/Patches/RoleManagerPatch.cs @@ -11,6 +11,11 @@ public class RoleManagerPatch public static Dictionary ImpostorMultiplier = []; // HashPuid, Multiplier private static Random random = new Random(); + static readonly Func clientCheck = (clientData) => + { + return clientData?.BetterData()?.IsBetterUser != true; + }; + // Better role algorithm [HarmonyPatch(nameof(RoleManager.SelectRoles))] [HarmonyPrefix] @@ -123,14 +128,14 @@ public class RoleManagerPatch // Desync role to other clients to prevent revealing the true role if (IsImpostorRole(role) && role is not RoleTypes.Phantom) { - List messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId()); + List messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Impostor)); messageWriter.ForEach(mW => mW.Write(false)); AmongUsClient.Instance.FinishRpcDesync(messageWriter); } else if (role is not RoleTypes.Noisemaker) { - List messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId()); + List messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Crewmate)); messageWriter.ForEach(mW => mW.Write(false)); AmongUsClient.Instance.FinishRpcDesync(messageWriter); @@ -176,7 +181,7 @@ public class RoleManagerPatch // Desync role to other clients to prevent revealing the true role if (kvp.Key is not RoleTypes.Phantom) { - List messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId()); + List messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId(), clientCheck); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Impostor)); messageWriter.ForEach(mW => mW.Write(false)); AmongUsClient.Instance.FinishRpcDesync(messageWriter); @@ -210,7 +215,7 @@ public class RoleManagerPatch // Desync role to other clients to prevent revealing the true role if (kvp.Key is not RoleTypes.Noisemaker) { - List messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId()); + List messageWriter = AmongUsClient.Instance.StartRpcDesync(pc.NetId, (byte)RpcCalls.SetRole, SendOption.None, pc.GetClientId(), clientCheck); messageWriter.ForEach(mW => mW.Write((ushort)RoleTypes.Crewmate)); messageWriter.ForEach(mW => mW.Write(false)); AmongUsClient.Instance.FinishRpcDesync(messageWriter); @@ -283,7 +288,7 @@ public class RoleManagerPatch { player.RpcSetRole(kvp.Key); // Desync role to other clients to prevent revealing the true role - List messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId()); + List messageWriter = AmongUsClient.Instance.StartRpcDesync(player.NetId, (byte)RpcCalls.SetRole, SendOption.None, player.GetClientId(), clientCheck); messageWriter.ForEach(mW => mW.Write((ushort)player.Data.Role.DefaultGhostRole)); messageWriter.ForEach(mW => mW.Write(false)); AmongUsClient.Instance.FinishRpcDesync(messageWriter);