mirror of
https://github.com/D1GQ/BetterAmongUs.git
synced 2026-10-19 15:51:52 +00:00
Merge branch 'dev' into main
This commit is contained in:
27 files changed
+192
-237
No files matched your search
+2
-2
@@ -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,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()
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user