Merge branch 'dev' into main

This commit is contained in:
D1GQ authored and GitHub committed 2025-07-09 20:08:06 -05:00
commit 2604c1f72b
27 files changed
+192 -237

No files matched your search

+2 -2
View File
@@ -17,7 +17,7 @@ class Logger
{
if (hostOnly && !GameState.IsHost) return;
string mark = $"{DateTime.Now:HH:mm} [BetterRoleLog][{tag}]";
string mark = $"{DateTime.Now:HH:mm} [BetterLog][{tag}]";
string logFilePath = Path.Combine(BetterDataManager.filePathFolder, "better-log.txt");
string newLine = $"{mark}: {Utils.RemoveHtmlText(info)}";
File.AppendAllText(logFilePath, newLine + Environment.NewLine);
@@ -110,7 +110,7 @@ class Logger
}
#endif
string mark = $"{DateTime.Now:HH:mm} [BetterRoleLog][PrivateLog][{tag}]";
string mark = $"{DateTime.Now:HH:mm} [BetterLog][PrivateLog][{tag}]";
string logFilePath = Path.Combine(BetterDataManager.filePathFolder, "better-log.txt");
string newLine = $"{mark}: " + Encryptor.Encrypt($"{info}");
File.AppendAllText(logFilePath, newLine + Environment.NewLine);
+1 -2
View File
@@ -1,5 +1,4 @@
using AmongUs.GameOptions;
using BepInEx.Unity.IL2CPP.Utils;
using BetterAmongUs.Items;
using BetterAmongUs.Managers;
using BetterAmongUs.Modules;
@@ -32,7 +31,7 @@ internal class ExtendedPlayerInfo : MonoBehaviour, IMonoExtension<NetworkedPlaye
private void Awake()
{
if (!MonoExtensionManager.RegisterExtension(this)) return;
this.StartCoroutine(HandshakeHandler.CoSendSecretToPlayer());
HandshakeHandler.WaitSendSecretToPlayer();
}
private void OnDestroy()
+15 -2
View File
@@ -40,8 +40,21 @@ static class PlayerControlHelper
}
}
internal static void DirtyName(this PlayerControl player) => player.BetterData().IsDirtyInfo = true;
internal static void DirtyName(this NetworkedPlayerInfo data) => data.BetterData().IsDirtyInfo = true;
internal static void DirtyName(this PlayerControl player)
{
if (player.BetterData() != null)
{
player.BetterData().IsDirtyInfo = true;
}
}
internal static void DirtyName(this NetworkedPlayerInfo data)
{
if (data.BetterData() != null)
{
data.BetterData().IsDirtyInfo = true;
}
}
internal static void DirtyNameDelay(this PlayerControl player, float delay = 1f) => player.Data.DirtyNameDelay(delay);
internal static void DirtyNameDelay(this NetworkedPlayerInfo data, float delay = 1f)
{
-108
View File
@@ -1,108 +0,0 @@
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using System.Linq.Expressions;
using System.Reflection;
namespace BetterAmongUs.Items.Attributes;
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
internal abstract class MethodPatchAttribute : Attribute
{
private static readonly HashSet<Assembly> _registeredAssemblies = new();
private static readonly Dictionary<MethodInfo, MethodPatchAttribute> _methodPatchAttributes = [];
private static readonly HarmonyMethod _prefixHarmonyMethod = new(typeof(MethodPatchAttribute), nameof(PatchPrefix));
private static readonly HarmonyMethod _postfixHarmonyMethod = new(typeof(MethodPatchAttribute), nameof(PatchPostfix));
private static readonly HashSet<MethodInfo> _methodsToPatch = [];
protected MethodBase? PatchedMethod { get; private set; }
protected Delegate? DelegateMethod { get; private set; }
private bool runOriginal;
public static void Register(Assembly assembly, BasePlugin plugin)
{
if (_registeredAssemblies.Contains(assembly)) return;
_registeredAssemblies.Add(assembly);
foreach (var type in assembly.GetTypes())
{
foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
{
if (method.GetCustomAttribute<MethodPatchAttribute>(true) is MethodPatchAttribute attribute)
{
if (method?.DeclaringType != null && attribute.ShouldPatch(plugin, method.DeclaringType, method, method.GetParameters()))
{
attribute.PatchedMethod = method;
_methodPatchAttributes[method] = attribute;
_methodsToPatch.Add(method);
}
}
}
}
}
internal static void Finished()
{
foreach (var method in _methodsToPatch.OrderBy(method => method.Name))
{
var attribute = _methodPatchAttributes[method];
if (method is not MethodInfo methodInfo)
throw new InvalidOperationException("OriginalMethod is not a MethodInfo");
var paramTypes = methodInfo.GetParameters().Select(p => p.ParameterType).ToArray();
var delegateType = methodInfo.IsStatic
? Expression.GetDelegateType(paramTypes.Concat(new[] { methodInfo.ReturnType }).ToArray())
: Expression.GetDelegateType([methodInfo.DeclaringType!, .. paramTypes, .. new[] { methodInfo.ReturnType }]);
attribute.DelegateMethod = methodInfo.CreateDelegate(delegateType);
var patch = Main.Harmony.Patch(method, _prefixHarmonyMethod, _postfixHarmonyMethod);
}
}
private static bool PatchPrefix(object __instance, MethodBase __originalMethod, object[] __args)
{
if (_methodPatchAttributes.TryGetValue((MethodInfo)__originalMethod, out var attribute))
{
if (attribute.runOriginal)
{
attribute.runOriginal = false;
return true;
}
return attribute.RunPrefix(__instance, __args);
}
return true;
}
private static void PatchPostfix(object __instance, MethodBase __originalMethod, object[] __args)
{
if (_methodPatchAttributes.TryGetValue((MethodInfo)__originalMethod, out var attribute))
{
attribute.RunPostfix(__instance, __args);
}
}
internal object? InvokeOriginal(object? instance, object[] args)
{
if (DelegateMethod == null) return null;
var allArgs = PatchedMethod?.IsStatic == false
? new[] { instance }.Concat(args).ToArray()
: args;
runOriginal = true;
return DelegateMethod.DynamicInvoke(allArgs);
}
internal virtual bool ShouldPatch(BasePlugin plugin, Type declaringType, MethodBase method, ParameterInfo[] args) => true;
internal abstract bool RunPrefix(object instance, object[] args);
internal abstract void RunPostfix(object instance, object[] args);
internal static void Initialize()
{
IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => Register(assembly, plugin);
IL2CPPChainloader.Instance.Finished += Finished;
}
}
-33
View File
@@ -1,33 +0,0 @@
using BepInEx.Unity.IL2CPP;
using System.Collections.Concurrent;
using System.Reflection;
internal abstract class RegisterAttribute : Attribute
{
private readonly static ConcurrentDictionary<Type, RegisterAttribute> RegisteredAttributes = new();
public abstract void Register(Assembly assembly, BasePlugin plugin);
public virtual void Finished() { }
public static void Initialize<T>() where T : RegisterAttribute
{
if (RegisteredAttributes.ContainsKey(typeof(T)))
return;
try
{
if (Activator.CreateInstance(typeof(T)) is not T instance)
throw new InvalidOperationException($"Failed to create instance of {typeof(T)}");
if (RegisteredAttributes.TryAdd(typeof(T), instance))
{
IL2CPPChainloader.Instance.PluginLoad += (_, assembly, plugin) => instance.Register(assembly, plugin);
IL2CPPChainloader.Instance.Finished += instance.Finished;
}
}
catch (Exception ex)
{
throw new InvalidOperationException($"Failed to initialize {typeof(T)}", ex);
}
}
}
+6 -4
View File
@@ -41,8 +41,10 @@ class BetterNotificationManager
}
}
internal static void NotifyCheat(PlayerControl player, string reason, string newText = "", bool kickPlayer = true, bool forceBan = false)
internal static bool NotifyCheat(PlayerControl player, string reason, string newText = "", bool kickPlayer = true, bool forceBan = false)
{
if (player.IsCheater() || player?.Data == null) return false;
if (player.IsLocalPlayer())
{
/*
@@ -51,11 +53,9 @@ class BetterNotificationManager
Utils.DisconnectSelf("Tampered client detected!");
Utils.DisconnectAccountFromOnline();
*/
return;
return false;
}
if (player?.Data == null) return;
var Reason = reason;
if (BetterGameSettings.CensorDetectionReason.GetBool())
{
@@ -94,6 +94,8 @@ class BetterNotificationManager
string kickMessage = string.Format(Translator.GetString("AntiCheat.KickMessage"), byAntiCheat, Reason);
player.Kick(true, kickMessage, true, false, forceBan);
}
return true;
}
+17 -11
View File
@@ -158,8 +158,10 @@ class BetterAntiCheat
or (byte)RpcCalls.ExtendLobbyTimer
or (byte)RpcCalls.CloseMeeting)
{
BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidHostRPC"), Enum.GetName((RpcCalls)callId)));
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {!player.IsHost()}");
if (BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidHostRPC"), Enum.GetName((RpcCalls)callId))))
{
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {!player.IsHost()}");
}
return false;
}
}
@@ -173,8 +175,10 @@ class BetterAntiCheat
or (byte)RpcCalls.SetPet_Deprecated
or (byte)RpcCalls.SetNamePlate_Deprecated)
{
BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidSetRPC"), Enum.GetName((RpcCalls)callId)));
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {GameState.IsInGamePlay}");
if (BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidSetRPC"), Enum.GetName((RpcCalls)callId))))
{
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {GameState.IsInGamePlay}");
}
return false;
}
}
@@ -197,20 +201,22 @@ class BetterAntiCheat
or (byte)RpcCalls.EnterVent
or (byte)RpcCalls.ExitVent
or (byte)RpcCalls.CloseDoorsOfType
or (byte)RpcCalls.MurderPlayer
or (byte)RpcCalls.CheckMurder
or (byte)RpcCalls.MurderPlayer
or (byte)RpcCalls.CheckShapeshift
or (byte)RpcCalls.Shapeshift
or (byte)RpcCalls.RejectShapeshift
or (byte)RpcCalls.CheckShapeshift
or (byte)RpcCalls.CheckProtect
or (byte)RpcCalls.ProtectPlayer
or (byte)RpcCalls.StartAppear
or (byte)RpcCalls.StartVanish
or (byte)RpcCalls.CheckAppear
or (byte)RpcCalls.CheckVanish)
or (byte)RpcCalls.StartAppear
or (byte)RpcCalls.CheckVanish
or (byte)RpcCalls.StartVanish)
{
BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidLobbyRPC"), Enum.GetName((RpcCalls)callId)));
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {GameState.IsInGame} && {GameState.IsLobby}");
if (BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidLobbyRPC"), Enum.GetName((RpcCalls)callId))))
{
Logger.LogCheat($"{player.BetterData().RealName} {Enum.GetName((RpcCalls)callId)}: {GameState.IsInGame} && {GameState.IsLobby}");
}
return false;
}
}
@@ -18,10 +18,12 @@ internal sealed class CheckNameHandler : RPCHandler
if (sender.DataIsCollected() == true && sender.BetterData().AntiCheatInfo.HasSetName && !GameState.IsLocalGame && GameState.IsVanillaServer)
{
BetterNotificationManager.NotifyCheat(sender, GetFormatSetText());
Utils.AddChatPrivate($"{sender.GetPlayerNameAndColor()} Has tried to change their name to '{name}' but has been undone!");
Logger.LogCheat($"{sender.BetterData().RealName} Has tried to change their name to '{name}' but has been undone!");
LogRpcInfo($"{sender.DataIsCollected() == true} && {!GameState.IsLocalGame} && {GameState.IsVanillaServer}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatSetText()))
{
Utils.AddChatPrivate($"{sender.GetPlayerNameAndColor()} Has tried to change their name to '{name}' but has been undone!");
Logger.LogCheat($"{sender.BetterData().RealName} Has tried to change their name to '{name}' but has been undone!");
LogRpcInfo($"{sender.DataIsCollected() == true} && {!GameState.IsLocalGame} && {GameState.IsVanillaServer}");
}
return false;
}
@@ -13,8 +13,10 @@ internal sealed class CloseDoorsOfTypeHandler : RPCHandler
{
if (!sender.IsImpostorTeam())
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{!sender.IsImpostorTeam()}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{!sender.IsImpostorTeam()}");
}
}
}
}
@@ -23,9 +23,11 @@ internal sealed class CompleteTaskHandler : RPCHandler
|| sender.BetterData().AntiCheatInfo.LastTaskId == taskId || (sender.BetterData().AntiCheatInfo.LastTaskId != taskId
&& sender.BetterData().AntiCheatInfo.TimeSinceLastTask < 1.25f))
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{sender.IsImpostorTeam()} || {!sender.Data.Tasks.ToArray().Any(task => task.Id == taskId)} ||" +
$" {sender.BetterData().AntiCheatInfo.LastTaskId == taskId} || ({sender.BetterData().AntiCheatInfo.LastTaskId != taskId} && {sender.BetterData().AntiCheatInfo.TimeSinceLastTask < 1.25f})");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{sender.IsImpostorTeam()} || {!sender.Data.Tasks.ToArray().Any(task => task.Id == taskId)} ||" +
$" {sender.BetterData().AntiCheatInfo.LastTaskId == taskId} || ({sender.BetterData().AntiCheatInfo.LastTaskId != taskId} && {sender.BetterData().AntiCheatInfo.TimeSinceLastTask < 1.25f})");
}
}
sender.BetterData().AntiCheatInfo.TimeSinceLastTask = 0f;
@@ -15,8 +15,10 @@ internal sealed class EnterVentHandler : RPCHandler
{
if (!sender.IsImpostorTeam() && !sender.Is(RoleTypes.Engineer))
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{sender.IsImpostorTeam()} && {!sender.Is(RoleTypes.Engineer)}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{sender.IsImpostorTeam()} && {!sender.Is(RoleTypes.Engineer)}");
}
}
}
}
@@ -30,8 +30,10 @@ internal sealed class MurderPlayerHandler : RPCHandler
if (target.BetterData().AntiCheatInfo.TimesAttemptedKilled >= 5 && !target.IsAlive())
{
BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidAction"), Translator.GetString("AntiCheat.TryBanExploit")));
LogRpcInfo($"{target.BetterData().AntiCheatInfo.TimesAttemptedKilled >= 5} && {!target.IsAlive()}");
if (BetterNotificationManager.NotifyCheat(player, string.Format(Translator.GetString("AntiCheat.InvalidAction"), Translator.GetString("AntiCheat.TryBanExploit"))))
{
LogRpcInfo($"{target.BetterData().AntiCheatInfo.TimesAttemptedKilled >= 5} && {!target.IsAlive()}");
}
return false;
}
@@ -54,9 +56,11 @@ internal sealed class MurderPlayerHandler : RPCHandler
{
if (!sender.IsImpostorTeam() || !sender.IsAlive() || sender.IsInVanish() || target.IsImpostorTeam())
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{!sender.IsImpostorTeam()} || {sender.IsInVanish()}" +
$" || {!target.IsAlive()} || {target.IsImpostorTeam()}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{!sender.IsImpostorTeam()} || {sender.IsInVanish()}" +
$" || {!target.IsAlive()} || {target.IsImpostorTeam()}");
}
}
}
}
@@ -16,8 +16,10 @@ internal class DeserializeNetObjectHandler : RPCHandler
{
var player = innerNetObject.Cast<CustomNetworkTransform>()?.myPlayer;
if (player == null) return;
BetterNotificationManager.NotifyCheat(player, "Attempting to move in meeting", forceBan: true);
LogRpcInfo($"{innerNetObject.TryCast<CustomNetworkTransform>() is CustomNetworkTransform} && {GameState.IsMeeting} && {MeetingHud.Instance.state != MeetingHud.VoteStates.Animating}", player);
if (BetterNotificationManager.NotifyCheat(player, "Attempting to move in meeting", forceBan: true))
{
LogRpcInfo($"{innerNetObject.TryCast<CustomNetworkTransform>() is CustomNetworkTransform} && {GameState.IsMeeting} && {MeetingHud.Instance.state != MeetingHud.VoteStates.Animating}", player);
}
}
}
}
+4 -2
View File
@@ -12,8 +12,10 @@ internal sealed class PetHandler : RPCHandler
{
if (sender?.CurrentOutfit?.PetId == "pet_EmptyPet")
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{sender?.CurrentOutfit?.PetId == "pet_EmptyPet"}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{sender?.CurrentOutfit?.PetId == "pet_EmptyPet"}");
}
}
}
}
@@ -15,8 +15,10 @@ internal sealed class ProtectPlayerHandler : RPCHandler
{
if (!sender.Is(RoleTypes.GuardianAngel))
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{!sender.Is(RoleTypes.GuardianAngel)}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{!sender.Is(RoleTypes.GuardianAngel)}");
}
}
}
}
@@ -14,8 +14,10 @@ internal sealed class ReportDeadBodyHandler : RPCHandler
{
if (!GameState.IsInGamePlay || !Main.AllPlayerControls.All(pc => pc.roleAssigned))
{
BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId)), forceBan: true);
LogRpcInfo($"{!GameState.IsInGamePlay} || {!Main.AllPlayerControls.All(pc => pc.roleAssigned)}");
if (BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId)), forceBan: true))
{
LogRpcInfo($"{!GameState.IsInGamePlay} || {!Main.AllPlayerControls.All(pc => pc.roleAssigned)}");
}
return CancelAsHost;
}
@@ -23,9 +25,11 @@ internal sealed class ReportDeadBodyHandler : RPCHandler
if (GameState.IsMeeting && MeetingHudPatch.timeOpen > 5f || GameState.IsHideNSeek || sender.IsInVent() || sender.shapeshifting
|| sender.inMovingPlat || sender.onLadder || sender.MyPhysics.Animations.IsPlayingAnyLadderAnimation())
{
BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId)));
LogRpcInfo($"{GameState.IsMeeting} && {MeetingHudPatch.timeOpen > 0.5f} || {sender.IsInVent()} || {sender.shapeshifting}" +
$" || {sender.inMovingPlat} || {sender.onLadder} || {sender.MyPhysics.Animations.IsPlayingAnyLadderAnimation()}");
if (BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId))))
{
LogRpcInfo($"{GameState.IsMeeting} && {MeetingHudPatch.timeOpen > 0.5f} || {sender.IsInVent()} || {sender.shapeshifting}" +
$" || {sender.inMovingPlat} || {sender.onLadder} || {sender.MyPhysics.Animations.IsPlayingAnyLadderAnimation()}");
}
return CancelAsHost;
}
@@ -37,8 +41,10 @@ internal sealed class ReportDeadBodyHandler : RPCHandler
{
if (!deadPlayerInfo.IsDead || deadPlayerInfo == sender.Data)
{
BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId)));
LogRpcInfo($"{!deadPlayerInfo.IsDead} || {deadPlayerInfo == sender.Data}");
if (BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId))))
{
LogRpcInfo($"{!deadPlayerInfo.IsDead} || {deadPlayerInfo == sender.Data}");
}
return CancelAsHost;
}
@@ -47,9 +53,11 @@ internal sealed class ReportDeadBodyHandler : RPCHandler
{
if (sender.RemainingEmergencies <= 0)
{
BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId)));
LogRpcInfo($"{sender.RemainingEmergencies} -> {GameOptionsManager.Instance.currentNormalGameOptions.NumEmergencyMeetings}" +
$" - {sender.RemainingEmergencies <= 0}");
if (BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidActionRPC"), Enum.GetName((RpcCalls)CallId))))
{
LogRpcInfo($"{sender.RemainingEmergencies} -> {GameOptionsManager.Instance.currentNormalGameOptions.NumEmergencyMeetings}" +
$" - {sender.RemainingEmergencies <= 0}");
}
return CancelAsHost;
}
@@ -31,8 +31,10 @@ internal sealed class SendChatHandler : RPCHandler
{
if (sender.IsAlive() && GameState.IsInGamePlay && !GameState.IsMeeting && !GameState.IsExilling || DataManager.Settings.Multiplayer.ChatMode == InnerNet.QuickChatModes.QuickChatOnly)
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{sender.IsAlive()} && {GameState.IsInGamePlay} && {!GameState.IsMeeting} && {!GameState.IsExilling} || {DataManager.Settings.Multiplayer.ChatMode == InnerNet.QuickChatModes.QuickChatOnly}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{sender.IsAlive()} && {GameState.IsInGamePlay} && {!GameState.IsMeeting} && {!GameState.IsExilling} || {DataManager.Settings.Multiplayer.ChatMode == InnerNet.QuickChatModes.QuickChatOnly}");
}
}
}
}
@@ -14,8 +14,10 @@ internal sealed class SendQuickChatHandler : RPCHandler
{
if (sender.IsAlive() && GameState.IsInGamePlay && !GameState.IsMeeting && !GameState.IsExilling || reader.BytesRemaining == 0)
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText(), forceBan: reader.BytesRemaining == 0);
LogRpcInfo($"{sender.IsAlive()} && {GameState.IsInGamePlay} && {!GameState.IsMeeting} && {!GameState.IsExilling} || {reader.BytesRemaining == 0}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText(), forceBan: reader.BytesRemaining == 0))
{
LogRpcInfo($"{sender.IsAlive()} && {GameState.IsInGamePlay} && {!GameState.IsMeeting} && {!GameState.IsExilling} || {reader.BytesRemaining == 0}");
}
}
}
}
@@ -15,8 +15,10 @@ internal sealed class SetLevelHandler : RPCHandler
{
if (sender.DataIsCollected() == true && sender.BetterData().AntiCheatInfo.HasSetLevel && !GameState.IsLocalGame && GameState.IsVanillaServer)
{
BetterNotificationManager.NotifyCheat(sender, GetFormatSetText());
LogRpcInfo($"{sender.DataIsCollected() == true} && {!GameState.IsLocalGame} && {GameState.IsVanillaServer}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatSetText()))
{
LogRpcInfo($"{sender.DataIsCollected() == true} && {!GameState.IsLocalGame} && {GameState.IsVanillaServer}");
}
return false;
}
@@ -32,8 +34,10 @@ internal sealed class SetLevelHandler : RPCHandler
if (level + 1 > BetterGameSettings.DetectedLevelAbove.GetInt())
{
BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidLevelRPC"), level));
LogRpcInfo($"{level > BetterGameSettings.DetectedLevelAbove.GetInt()} - {level} > {BetterGameSettings.DetectedLevelAbove.GetInt()}");
if (BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidLevelRPC"), level)))
{
LogRpcInfo($"{level > BetterGameSettings.DetectedLevelAbove.GetInt()} - {level} > {BetterGameSettings.DetectedLevelAbove.GetInt()}");
}
}
}
}
@@ -24,10 +24,12 @@ internal sealed class SetNameHandler : RPCHandler
if (sender.DataIsCollected() == true && sender.BetterData().AntiCheatInfo.HasSetName && !GameState.IsLocalGame && GameState.IsVanillaServer)
{
BetterNotificationManager.NotifyCheat(sender, GetFormatSetText());
Utils.AddChatPrivate($"{sender.GetPlayerNameAndColor()} Has tried to change their name to '{name}' but has been undone!");
Logger.LogCheat($"{sender.BetterData().RealName} Has tried to change their name to '{name}' but has been undone!");
LogRpcInfo($"{sender.DataIsCollected() == true} && {!GameState.IsLocalGame} && {GameState.IsVanillaServer}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatSetText()))
{
Utils.AddChatPrivate($"{sender.GetPlayerNameAndColor()} Has tried to change their name to '{name}' but has been undone!");
Logger.LogCheat($"{sender.BetterData().RealName} Has tried to change their name to '{name}' but has been undone!");
LogRpcInfo($"{sender.DataIsCollected() == true} && {!GameState.IsLocalGame} && {GameState.IsVanillaServer}");
}
return false;
}
@@ -19,14 +19,18 @@ internal sealed class ShapeshiftHandler : RPCHandler
if (!sender.Is(RoleTypes.Shapeshifter) || !sender.IsAlive())
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{!sender.Is(RoleTypes.Shapeshifter)} || {!sender.IsAlive()}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{!sender.Is(RoleTypes.Shapeshifter)} || {!sender.IsAlive()}");
}
return false;
}
else if (!flag && !GameState.IsMeeting && !GameState.IsExilling && !sender.IsInVent())
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{!flag} && {!GameState.IsMeeting} && {!GameState.IsExilling} && {!sender.IsInVent()}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{!flag} && {!GameState.IsMeeting} && {!GameState.IsExilling} && {!sender.IsInVent()}");
}
return false;
}
@@ -20,10 +20,13 @@ internal sealed class StartAppearHandler : RPCHandler
if (!shouldAnimate && (!sender.IsInVent() && !GameState.IsMeeting && !GameState.IsExilling))
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{!shouldAnimate} && ({!sender.IsInVent()} && {!GameState.IsMeeting} && {!GameState.IsExilling})");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{!shouldAnimate} && ({!sender.IsInVent()} && {!GameState.IsMeeting} && {!GameState.IsExilling})");
sender.HandleServerAppear(true);
}
sender.HandleServerAppear(true);
return false;
}
@@ -20,8 +20,10 @@ internal sealed class StartVanishHandler : RPCHandler
if (sender.IsInVent())
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{sender.IsInVent()}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{sender.IsInVent()}");
}
}
return true;
@@ -31,8 +33,10 @@ internal sealed class StartVanishHandler : RPCHandler
{
if (!sender.Is(RoleTypes.Phantom) || !sender.IsAlive())
{
BetterNotificationManager.NotifyCheat(sender, GetFormatActionText());
LogRpcInfo($"{!sender.Is(RoleTypes.Phantom)} || {!sender.IsAlive()}");
if (BetterNotificationManager.NotifyCheat(sender, GetFormatActionText()))
{
LogRpcInfo($"{!sender.Is(RoleTypes.Phantom)} || {!sender.IsAlive()}");
}
return false;
}
+26 -7
View File
@@ -14,6 +14,12 @@ internal class BetterPingTracker : MonoBehaviour
internal void SetUp(TextMeshPro pingText, AspectPosition pingAspectPosition)
{
if (Instance != null) return;
if (pingText == null || pingAspectPosition == null)
{
Logger.Error("BetterPingTracker.SetUp() called with null parameters!");
return;
}
Instance = this;
text = pingText;
aspectPosition = pingAspectPosition;
@@ -21,15 +27,17 @@ internal class BetterPingTracker : MonoBehaviour
private void Update()
{
if (aspectPosition == null || text == null) return;
// Update position and appearance
aspectPosition.DistanceFromEdge = new Vector3(4f, 0.1f, -5);
aspectPosition.Alignment = AspectPosition.EdgeAlignments.RightTop;
text.outlineWidth = 0.3f;
PlayerControl Host = AmongUsClient.Instance.GetHost().Character;
StringBuilder sb = new();
if (!GameState.IsFreePlay)
// Check AmongUsClient.Instance
if (AmongUsClient.Instance != null && !GameState.IsFreePlay)
{
sb.AppendFormat("{0}: <b>{1}</b>\n", Translator.GetString("Ping").ToUpper(), GetPingColor(AmongUsClient.Instance.Ping));
}
@@ -41,7 +49,6 @@ internal class BetterPingTracker : MonoBehaviour
sb.Append($"<color=#00dbdb><size=75%>BetterAmongUs {Main.GetVersionText(true)}</size></color>\n");
sb.Append("<size=68%><color=#8040bf>By</color> <color=#bc4345>The Enhanced Network</color></size>\n");
// sb.Append($"<size=50%><color=#b5b5b5>{Main.Github}</color></size>\n");
if (GameState.IsTOHEHostLobby) sb.Append($"<size=75%><color=#e197dc>TOHE Lobby</color></size>\n");
@@ -52,12 +59,24 @@ internal class BetterPingTracker : MonoBehaviour
}
// Add Host Info if not in lobby
if (GameState.IsInGamePlay && !GameState.IsFreePlay && Host != null)
if (GameState.IsInGamePlay && !GameState.IsFreePlay && AmongUsClient.Instance != null)
{
sb.AppendFormat("<size=75%>{0}: {1}</size>\n", Translator.GetString("Host"), Host.GetPlayerNameAndColor());
var hostInfo = AmongUsClient.Instance.GetHost();
if (hostInfo?.Character != null)
{
sb.AppendFormat("<size=75%>{0}: {1}</size>\n", Translator.GetString("Host"), hostInfo.Character.GetPlayerNameAndColor());
}
}
text.text = sb.ToString();
text?.SetText(sb.ToString());
}
private void OnDestroy()
{
if (Instance == this)
{
Instance = null;
}
}
private static string GetPingColor(int ping)
+10 -4
View File
@@ -1,4 +1,5 @@
using BetterAmongUs.Data;
using BepInEx.Unity.IL2CPP.Utils;
using BetterAmongUs.Data;
using BetterAmongUs.Helpers;
using Hazel;
using System.Collections;
@@ -10,7 +11,12 @@ internal class HandshakeHandler(ExtendedPlayerInfo extendedPlayerInfo)
{
private readonly ExtendedPlayerInfo extendedData = extendedPlayerInfo;
internal IEnumerator CoSendSecretToPlayer()
internal void WaitSendSecretToPlayer()
{
extendedData.StartCoroutine(CoWaitSendSecretToPlayer());
}
private IEnumerator CoWaitSendSecretToPlayer()
{
if (!Main.SendBetterRpc.Value) yield break;
@@ -40,7 +46,7 @@ internal class HandshakeHandler(ExtendedPlayerInfo extendedPlayerInfo)
if (HasSendSharedSecret) return;
HasSendSharedSecret = true;
var writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SendSecret, SendOption.Reliable, extendedData._Data.ClientId);
var writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SendSecretToPlayer, SendOption.Reliable, extendedData._Data.ClientId);
writer.WriteBytes(SharedSecret.GetPublicKey());
writer.Write(SharedSecret.GetTempKey());
AmongUsClient.Instance.FinishRpcImmediately(writer);
@@ -77,7 +83,7 @@ internal class HandshakeHandler(ExtendedPlayerInfo extendedPlayerInfo)
int hash = SharedSecret.GetSharedSecretHash();
// Logger.Log($"Sending secret hash: {hash} (tempKey: {tempKey})");
var writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CheckSecret, SendOption.Reliable, senderClientId);
var writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.CheckSecretHashFromPlayer, SendOption.Reliable, senderClientId);
writer.Write(tempKey);
writer.Write(hash);
AmongUsClient.Instance.FinishRpcImmediately(writer);
+7 -9
View File
@@ -17,9 +17,9 @@ enum CustomRPC : int
RequestRetryVersionCheck = 81,
//Better Among Us
LegacyBetterCheck = 150,
SendSecret,
CheckSecret,
LegacyBetterCheck = 150, // Unused
SendSecretToPlayer,
CheckSecretHashFromPlayer,
}
enum HandleGameDataTags : byte
@@ -79,6 +79,7 @@ internal static class RPC
switch (callId)
{
/*
case (byte)CustomRPC.LegacyBetterCheck:
{
var SetBetterUser = reader.ReadBoolean();
@@ -86,22 +87,18 @@ internal static class RPC
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} - " +
@@ -112,12 +109,13 @@ internal static class RPC
Utils.DirtyAllNames();
}
break;
case (byte)CustomRPC.SendSecret:
*/
case (byte)CustomRPC.SendSecretToPlayer:
{
player.BetterData().HandshakeHandler.HandleSecretFromSender(reader);
}
break;
case (byte)CustomRPC.CheckSecret:
case (byte)CustomRPC.CheckSecretHashFromPlayer:
{
player.BetterData().HandshakeHandler.HandleSecretHashFromPlayer(reader);
}
+6
View File
@@ -25,6 +25,12 @@ internal static class VoteBanSystemPatch
var client = Utils.ClientFromClientId(srcClient);
if (client == null) return false;
// Skip if host client
if (client.Id == AmongUsClient.Instance.GetHost().Id)
{
return true;
}
void TryFlagPlayer()
{
var player = client.Character;