mirror of
https://github.com/D1GQ/BetterAmongUs.git
synced 2026-10-20 01:46:19 +00:00
Add detections to ModMenuCrew and clean up tag handling
This commit is contained in:
1 parent
ae71542e6a
commit
eb44df4c56
14 files changed
+252
-134
No files matched your search
@@ -306,6 +306,14 @@ internal static class BetterDataManager
|
|||||||
didFind = true;
|
didFind = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
foreach (var info in BetterDataFile.MMCData.ToArray())
|
||||||
|
{
|
||||||
|
if (info.PlayerName.Replace(' ', '_') == identifier || info.HashPuid == identifier || info.FriendCode == identifier)
|
||||||
|
{
|
||||||
|
BetterDataFile.MMCData.Remove(info);
|
||||||
|
didFind = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (didFind)
|
if (didFind)
|
||||||
{
|
{
|
||||||
@@ -324,6 +332,7 @@ internal static class BetterDataManager
|
|||||||
BetterDataFile.SickoData.Clear();
|
BetterDataFile.SickoData.Clear();
|
||||||
BetterDataFile.AUMData.Clear();
|
BetterDataFile.AUMData.Clear();
|
||||||
BetterDataFile.KNData.Clear();
|
BetterDataFile.KNData.Clear();
|
||||||
|
BetterDataFile.MMCData.Clear();
|
||||||
BetterDataFile.Save();
|
BetterDataFile.Save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
using BetterAmongUs.Structs;
|
using BetterAmongUs.Helpers;
|
||||||
|
using BetterAmongUs.Modules;
|
||||||
|
using BetterAmongUs.Structs;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace BetterAmongUs.Data.Json;
|
namespace BetterAmongUs.Data.Json;
|
||||||
@@ -34,10 +36,49 @@ internal sealed class BetterDataFile : AbstractJsonFile
|
|||||||
/// <returns>True if saving was successful, false otherwise.</returns>
|
/// <returns>True if saving was successful, false otherwise.</returns>
|
||||||
internal override bool Save()
|
internal override bool Save()
|
||||||
{
|
{
|
||||||
AllCheatData = [.. CheatData, .. SickoData, .. AUMData, .. KNData];
|
AllCheatData = [.. CheatData, .. SickoData, .. AUMData, .. KNData, .. MMCData];
|
||||||
return base.Save();
|
return base.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to get cheat information for the specified player.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">The player information to check.</param>
|
||||||
|
/// <param name="info">When this method returns, contains the title and hex color if cheat info is found; otherwise, empty strings.</param>
|
||||||
|
/// <returns>True if cheat information was found for the player; otherwise, false.</returns>
|
||||||
|
internal bool TryGetCheatInfo(NetworkedPlayerInfo data, out (string title, string hexColor) info)
|
||||||
|
{
|
||||||
|
info = ("", "");
|
||||||
|
|
||||||
|
if (SickoData.Any(info => info.CheckPlayerData(data)))
|
||||||
|
{
|
||||||
|
info = (Translator.GetString("Player.SickoUser"), Colors.SickoHexColor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (AUMData.Any(info => info.CheckPlayerData(data)))
|
||||||
|
{
|
||||||
|
info = (Translator.GetString("Player.AUMUser"), Colors.AUMHexColor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (KNData.Any(info => info.CheckPlayerData(data)))
|
||||||
|
{
|
||||||
|
info = (Translator.GetString("Player.KNUser"), Colors.KNHexColor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (MMCData.Any(info => info.CheckPlayerData(data)))
|
||||||
|
{
|
||||||
|
info = (Translator.GetString("Player.MMCUser"), Colors.MMCHexColor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (CheatData.Any(info => info.CheckPlayerData(data)))
|
||||||
|
{
|
||||||
|
info = (Translator.GetString("Player.FlaggedPlayer"), Colors.CheaterHexColor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks if player data matches any known cheat entries.
|
/// Checks if player data matches any known cheat entries.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -101,8 +142,14 @@ internal sealed class BetterDataFile : AbstractJsonFile
|
|||||||
public HashSet<UserInfo> AUMData { get; set; } = [];
|
public HashSet<UserInfo> AUMData { get; set; } = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the collection of KN cheat user data.
|
/// Gets or sets the collection of Kill Network cheat user data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("knData")]
|
[JsonPropertyName("knData")]
|
||||||
public HashSet<UserInfo> KNData { get; set; } = [];
|
public HashSet<UserInfo> KNData { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the collection of Mod Menu Crew cheat user data.
|
||||||
|
/// </summary>
|
||||||
|
[JsonPropertyName("mmcData")]
|
||||||
|
public HashSet<UserInfo> MMCData { get; set; } = [];
|
||||||
}
|
}
|
||||||
+15
-2
@@ -5,6 +5,10 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal enum CustomRPC : int
|
internal enum CustomRPC : int
|
||||||
{
|
{
|
||||||
|
// ========================================
|
||||||
|
// Known Cheat RPCS
|
||||||
|
// ========================================
|
||||||
|
|
||||||
// Cheat RPC's
|
// Cheat RPC's
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// RPC identifier for Sicko cheat detection.
|
/// RPC identifier for Sicko cheat detection.
|
||||||
@@ -31,19 +35,28 @@ internal enum CustomRPC : int
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
KillNetworkChat = 119,
|
KillNetworkChat = 119,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// RPC identifier for ModMenuCrew chat communication.
|
||||||
|
/// </summary>
|
||||||
|
ModMenuCrewChat = 201,
|
||||||
|
|
||||||
|
// ========================================
|
||||||
|
// BAU RPCS
|
||||||
|
// ========================================
|
||||||
|
|
||||||
// Better Among Us
|
// Better Among Us
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Legacy RPC for BetterAmongUs checks (currently unused).
|
/// Legacy RPC for BetterAmongUs checks (currently unused).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
LegacyBetterCheck = 150, // Unused
|
LegacyBetterCheck = 150, // Unused
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// RPC for sending a shared secret to another player.
|
/// RPC for sending a shared secret to another player.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
SendSecretToPlayer,
|
SendSecretToPlayer = 151,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// RPC for checking the hash of a shared secret received from another player.
|
/// RPC for checking the hash of a shared secret received from another player.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
CheckSecretHashFromPlayer,
|
CheckSecretHashFromPlayer = 152,
|
||||||
}
|
}
|
||||||
+15
-6
@@ -7,18 +7,22 @@ namespace BetterAmongUs.Helpers;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
internal static class Colors
|
internal static class Colors
|
||||||
{
|
{
|
||||||
// Convert a string to a colored string using a Unity Color object
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Converts the provided string into a colored string by wrapping it with a
|
/// Converts the provided string into a colored string.
|
||||||
/// <color> tag using the Unity Color object. The Unity Color is automatically
|
|
||||||
/// converted to its hexadecimal representation before being applied to the string.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="str">The string to be colored.</param>
|
/// <param name="str">The string to be colored.</param>
|
||||||
/// <param name="color">The Unity Color object representing the desired color.</param>
|
/// <param name="color">The Unity Color object representing the desired color.</param>
|
||||||
/// <returns>A string wrapped in a color tag, displaying the string in the specified Unity color.</returns>
|
/// <returns>A string wrapped in a color tag, displaying the string in the specified Unity color.</returns>
|
||||||
internal static string ToColor(this string str, Color color) => $"<{Color32ToHex(color)}>{str}</color>";
|
internal static string ToColor(this string str, Color color) => $"<{Color32ToHex(color)}>{str}</color>";
|
||||||
|
|
||||||
// Modify the alpha value of an existing color
|
/// <summary>
|
||||||
|
/// Converts the provided string into a colored string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">The string to be colored.</param>
|
||||||
|
/// <param name="hex">The Hex Color representing the desired color.</param>
|
||||||
|
/// <returns>A string wrapped in a color tag, displaying the string in the specified hex color.</returns>
|
||||||
|
internal static string ToColor(this string str, string hex) => $"<{hex}>{str}</color>";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a new color that preserves the RGB (Red, Green, Blue) values of the
|
/// Returns a new color that preserves the RGB (Red, Green, Blue) values of the
|
||||||
/// original color, but applies a new alpha (opacity) value from the provided new color.
|
/// original color, but applies a new alpha (opacity) value from the provided new color.
|
||||||
@@ -29,7 +33,6 @@ internal static class Colors
|
|||||||
/// <returns>A new color with the same RGB values as the original color, but with the new alpha value.</returns>
|
/// <returns>A new color with the same RGB values as the original color, but with the new alpha value.</returns>
|
||||||
internal static Color ToColor(this Color oldColor, Color newColor) => new(newColor.r, newColor.g, newColor.b, oldColor.a);
|
internal static Color ToColor(this Color oldColor, Color newColor) => new(newColor.r, newColor.g, newColor.b, oldColor.a);
|
||||||
|
|
||||||
// Set a new alpha value while keeping the original RGB values
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates and returns a new color with the same RGB values as the original color,
|
/// Creates and returns a new color with the same RGB values as the original color,
|
||||||
/// but with the specified alpha (transparency) value. This method is useful for
|
/// but with the specified alpha (transparency) value. This method is useful for
|
||||||
@@ -136,4 +139,10 @@ internal static class Colors
|
|||||||
/// Standard impostor red color.
|
/// Standard impostor red color.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static readonly Color ImpostorRed = new Color32(byte.MaxValue, 25, 25, byte.MaxValue);
|
internal static readonly Color ImpostorRed = new Color32(byte.MaxValue, 25, 25, byte.MaxValue);
|
||||||
|
|
||||||
|
internal static readonly string SickoHexColor = "#00f583";
|
||||||
|
internal static readonly string AUMHexColor = "#4f0000";
|
||||||
|
internal static readonly string KNHexColor = "#8731e7";
|
||||||
|
internal static readonly string MMCHexColor = "#9c8200";
|
||||||
|
internal static readonly string CheaterHexColor = "#fc0000";
|
||||||
}
|
}
|
||||||
@@ -61,6 +61,12 @@ internal static class BetterAntiCheat
|
|||||||
string kickMessage = string.Format(Translator.GetString("AntiCheat.KickMessage"), Translator.GetString("AntiCheat.ByAntiCheat"), reason);
|
string kickMessage = string.Format(Translator.GetString("AntiCheat.KickMessage"), Translator.GetString("AntiCheat.ByAntiCheat"), reason);
|
||||||
player.Kick(true, kickMessage, true);
|
player.Kick(true, kickMessage, true);
|
||||||
}
|
}
|
||||||
|
else if (BetterDataManager.BetterDataFile.MMCData.Any(info => info.CheckPlayerData(player.Data)))
|
||||||
|
{
|
||||||
|
string reason = Translator.GetString("AntiCheat.Reason.MMCUser");
|
||||||
|
string kickMessage = string.Format(Translator.GetString("AntiCheat.KickMessage"), Translator.GetString("AntiCheat.ByAntiCheat"), reason);
|
||||||
|
player.Kick(true, kickMessage, true);
|
||||||
|
}
|
||||||
else if (BetterDataManager.BetterDataFile.CheatData.Any(info => info.CheckPlayerData(player.Data)))
|
else if (BetterDataManager.BetterDataFile.CheatData.Any(info => info.CheckPlayerData(player.Data)))
|
||||||
{
|
{
|
||||||
string reason = Translator.GetString("AntiCheat.Reason.KnownCheater");
|
string reason = Translator.GetString("AntiCheat.Reason.KnownCheater");
|
||||||
|
|||||||
@@ -19,33 +19,52 @@ internal sealed class AUMChatHandler : RPCHandler
|
|||||||
|
|
||||||
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
||||||
{
|
{
|
||||||
var nameString = reader.ReadString();
|
try
|
||||||
var msgString = reader.ReadString();
|
|
||||||
var colorId = reader.ReadInt32();
|
|
||||||
|
|
||||||
var flag3 = sender.BetterData().AntiCheatInfo.AUMChats.Count > 0 && sender.BetterData().AntiCheatInfo.AUMChats.Last() == msgString;
|
|
||||||
if (!flag3)
|
|
||||||
{
|
{
|
||||||
Utils.AddChatPrivate($"{msgString}", overrideName: $"<b><color=#870000>AUM Chat</color> - {sender.GetPlayerNameAndColor()}</b>");
|
var nameString = reader.ReadString();
|
||||||
sender.BetterData().AntiCheatInfo.AUMChats.Add(msgString);
|
var msgString = reader.ReadString();
|
||||||
|
var colorId = reader.ReadInt32();
|
||||||
|
|
||||||
|
var flag3 = sender.BetterData().AntiCheatInfo.AUMChats.Count > 0 && sender.BetterData().AntiCheatInfo.AUMChats.Last() == msgString;
|
||||||
|
if (!flag3)
|
||||||
|
{
|
||||||
|
Utils.AddChatPrivate($"{msgString}", overrideName: $"<b><color=#870000>AUM Chat</color> - {sender.GetPlayerNameAndColor()}</b>");
|
||||||
|
sender.BetterData().AntiCheatInfo.AUMChats.Add(msgString);
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger_.Log($"{sender.Data.PlayerName} -> {msgString}", "AUMChatLog");
|
||||||
|
|
||||||
|
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!BAUConfigs.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
var flag = string.IsNullOrEmpty(nameString) && string.IsNullOrEmpty(msgString);
|
||||||
|
|
||||||
|
if (!flag && !BetterDataManager.BetterDataFile.AUMData.Any(info => info.CheckPlayerData(sender.Data)))
|
||||||
|
{
|
||||||
|
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
||||||
|
BetterDataManager.BetterDataFile.AUMData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "AUM Chat RPC"));
|
||||||
|
BetterDataManager.BetterDataFile.Save();
|
||||||
|
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.AUM"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
Logger_.Log($"{sender.Data.PlayerName} -> {msgString}", "AUMChatLog");
|
|
||||||
|
|
||||||
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!BAUConfigs.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool())
|
|
||||||
return;
|
|
||||||
|
|
||||||
var flag = string.IsNullOrEmpty(nameString) && string.IsNullOrEmpty(msgString);
|
|
||||||
|
|
||||||
if (!flag && !BetterDataManager.BetterDataFile.AUMData.Any(info => info.CheckPlayerData(sender.Data)))
|
|
||||||
{
|
{
|
||||||
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
|
||||||
BetterDataManager.BetterDataFile.AUMData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "AUM Chat RPC"));
|
return;
|
||||||
BetterDataManager.BetterDataFile.Save();
|
|
||||||
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.AUM"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
if (!BAUConfigs.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!BetterDataManager.BetterDataFile.AUMData.Any(info => info.CheckPlayerData(sender.Data)))
|
||||||
|
{
|
||||||
|
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
||||||
|
BetterDataManager.BetterDataFile.AUMData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "AUM Chat RPC"));
|
||||||
|
BetterDataManager.BetterDataFile.Save();
|
||||||
|
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.AUM"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,7 +19,13 @@ internal sealed class AUMHandler : RPCHandler
|
|||||||
|
|
||||||
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
||||||
{
|
{
|
||||||
if (BAUConfigs.AntiCheat.Value && !BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat) && BetterGameSettings.DetectCheatClients.GetBool())
|
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!BAUConfigs.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
{
|
{
|
||||||
var aumid = reader.ReadByte();
|
var aumid = reader.ReadByte();
|
||||||
|
|
||||||
@@ -34,5 +40,15 @@ internal sealed class AUMHandler : RPCHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if (!BetterDataManager.BetterDataFile.AUMData.Any(info => info.CheckPlayerData(sender.Data)))
|
||||||
|
{
|
||||||
|
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
||||||
|
BetterDataManager.BetterDataFile.AUMData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "AUM RPC"));
|
||||||
|
BetterDataManager.BetterDataFile.Save();
|
||||||
|
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.AUM"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,15 +19,18 @@ internal sealed class KillNetworkHandler : RPCHandler
|
|||||||
|
|
||||||
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
||||||
{
|
{
|
||||||
if (BAUConfigs.AntiCheat.Value && !BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat) && BetterGameSettings.DetectCheatClients.GetBool())
|
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!BAUConfigs.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!BetterDataManager.BetterDataFile.KNData.Any(info => info.CheckPlayerData(sender.Data)))
|
||||||
{
|
{
|
||||||
if (!BetterDataManager.BetterDataFile.KNData.Any(info => info.CheckPlayerData(sender.Data)))
|
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
||||||
{
|
BetterDataManager.BetterDataFile.KNData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "KillNetwork RPC"));
|
||||||
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
BetterDataManager.BetterDataFile.Save();
|
||||||
BetterDataManager.BetterDataFile.KNData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "KillNetwork RPC"));
|
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.KN"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
||||||
BetterDataManager.BetterDataFile.Save();
|
|
||||||
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.KN"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
using BetterAmongUs.Attributes;
|
||||||
|
using BetterAmongUs.Data;
|
||||||
|
using BetterAmongUs.Data.Config;
|
||||||
|
using BetterAmongUs.Enums;
|
||||||
|
using BetterAmongUs.Helpers;
|
||||||
|
using BetterAmongUs.Managers;
|
||||||
|
using BetterAmongUs.Modules.Support;
|
||||||
|
using BetterAmongUs.Mono;
|
||||||
|
using BetterAmongUs.Patches.Gameplay.UI.Settings;
|
||||||
|
using Hazel;
|
||||||
|
using InnerNet;
|
||||||
|
|
||||||
|
namespace BetterAmongUs.Modules.AntiCheat;
|
||||||
|
|
||||||
|
[RegisterRPCHandler]
|
||||||
|
internal sealed class ModMenuCrewChatHandler : RPCHandler
|
||||||
|
{
|
||||||
|
internal override byte CallId => unchecked((byte)CustomRPC.ModMenuCrewChat);
|
||||||
|
|
||||||
|
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
||||||
|
{
|
||||||
|
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!BAUConfigs.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var tag = reader.ReadByte();
|
||||||
|
var senderId = reader.ReadPackedInt32();
|
||||||
|
var senderName = reader.ReadString();
|
||||||
|
var content = reader.ReadString();
|
||||||
|
var timestamp = reader.ReadUInt64();
|
||||||
|
var type = reader.ReadByte();
|
||||||
|
|
||||||
|
if (!BetterDataManager.BetterDataFile.MMCData.Any(info => info.CheckPlayerData(sender.Data)))
|
||||||
|
{
|
||||||
|
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
||||||
|
BetterDataManager.BetterDataFile.MMCData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "ModMenuCrew Chat RPC"));
|
||||||
|
BetterDataManager.BetterDataFile.Save();
|
||||||
|
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.MMCC"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
if (!BetterDataManager.BetterDataFile.MMCData.Any(info => info.CheckPlayerData(sender.Data)))
|
||||||
|
{
|
||||||
|
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
||||||
|
BetterDataManager.BetterDataFile.MMCData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "ModMenuCrew Chat RPC"));
|
||||||
|
BetterDataManager.BetterDataFile.Save();
|
||||||
|
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.MMCC"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,15 +19,18 @@ internal sealed class SickoHandler : RPCHandler
|
|||||||
|
|
||||||
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
|
||||||
{
|
{
|
||||||
if (BAUConfigs.AntiCheat.Value && !BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat) && BetterGameSettings.DetectCheatClients.GetBool())
|
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!BAUConfigs.AntiCheat.Value || !BetterGameSettings.DetectCheatClients.GetBool())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (reader.BytesRemaining == 0 && !BetterDataManager.BetterDataFile.SickoData.Any(info => info.CheckPlayerData(sender.Data)))
|
||||||
{
|
{
|
||||||
if (reader.BytesRemaining == 0 && !BetterDataManager.BetterDataFile.SickoData.Any(info => info.CheckPlayerData(sender.Data)))
|
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
||||||
{
|
BetterDataManager.BetterDataFile.SickoData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "Sicko RPC"));
|
||||||
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
|
BetterDataManager.BetterDataFile.Save();
|
||||||
BetterDataManager.BetterDataFile.SickoData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "Sicko RPC"));
|
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.Sicko"), newText: Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
||||||
BetterDataManager.BetterDataFile.Save();
|
|
||||||
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.Sicko"), newText: Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
using BetterAmongUs.Data;
|
using BetterAmongUs.Data;
|
||||||
using BetterAmongUs.Helpers;
|
using BetterAmongUs.Helpers;
|
||||||
using BetterAmongUs.Modules;
|
using BetterAmongUs.Modules;
|
||||||
using BetterAmongUs.Structs;
|
|
||||||
using Il2CppInterop.Runtime.Attributes;
|
using Il2CppInterop.Runtime.Attributes;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using TMPro;
|
using TMPro;
|
||||||
@@ -33,10 +32,6 @@ internal sealed class MeetingInfoDisplay : PlayerInfoDisplay
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private class CachedTranslations
|
private class CachedTranslations
|
||||||
{
|
{
|
||||||
internal readonly string SickoUser = Translator.GetString("Player.SickoUser");
|
|
||||||
internal readonly string AUMUser = Translator.GetString("Player.AUMUser");
|
|
||||||
internal readonly string KNUser = Translator.GetString("Player.KNUser");
|
|
||||||
internal readonly string KnownCheater = Translator.GetString("Player.KnownCheater");
|
|
||||||
internal readonly string DisconnectLeft = Translator.GetString("DisconnectReasonMeeting.Left");
|
internal readonly string DisconnectLeft = Translator.GetString("DisconnectReasonMeeting.Left");
|
||||||
internal readonly string DisconnectAntiCheat = Translator.GetString("DisconnectReasonMeeting.AntiCheat");
|
internal readonly string DisconnectAntiCheat = Translator.GetString("DisconnectReasonMeeting.AntiCheat");
|
||||||
internal readonly string DisconnectBanned = Translator.GetString("DisconnectReasonMeeting.Banned");
|
internal readonly string DisconnectBanned = Translator.GetString("DisconnectReasonMeeting.Banned");
|
||||||
@@ -177,14 +172,10 @@ internal sealed class MeetingInfoDisplay : PlayerInfoDisplay
|
|||||||
if (_player.Data == null)
|
if (_player.Data == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (ContainsPlayerData(BetterDataManager.BetterDataFile.SickoData, _player.Data))
|
if (BetterDataManager.BetterDataFile.TryGetCheatInfo(_player.Data, out var info))
|
||||||
sbTag.Append($"<color=#00f583>{_cachedTranslations.SickoUser}</color>+++");
|
{
|
||||||
else if (ContainsPlayerData(BetterDataManager.BetterDataFile.AUMData, _player.Data))
|
sbTag.Append(info.title.ToColor(info.hexColor) + "+++");
|
||||||
sbTag.Append($"<color=#4f0000>{_cachedTranslations.AUMUser}</color>+++");
|
}
|
||||||
else if (ContainsPlayerData(BetterDataManager.BetterDataFile.KNData, _player.Data))
|
|
||||||
sbTag.Append($"<color=#8731e7>{_cachedTranslations.KNUser}</color>+++");
|
|
||||||
else if (ContainsPlayerData(BetterDataManager.BetterDataFile.CheatData, _player.Data))
|
|
||||||
sbTag.Append($"<color=#fc0000>{_cachedTranslations.KnownCheater}</color>+++");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -283,22 +274,6 @@ internal sealed class MeetingInfoDisplay : PlayerInfoDisplay
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Checks if player data exists in a HashSet of UserInfo.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dataList">HashSet of UserInfo to check.</param>
|
|
||||||
/// <param name="playerData">Player data to look for.</param>
|
|
||||||
/// <returns>True if player data exists in the HashSet.</returns>
|
|
||||||
private static bool ContainsPlayerData(HashSet<UserInfo> dataList, NetworkedPlayerInfo playerData)
|
|
||||||
{
|
|
||||||
foreach (var info in dataList)
|
|
||||||
{
|
|
||||||
if (info.CheckPlayerData(playerData))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates display for disconnected players.
|
/// Updates display for disconnected players.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ using BetterAmongUs.Data.Config;
|
|||||||
using BetterAmongUs.Helpers;
|
using BetterAmongUs.Helpers;
|
||||||
using BetterAmongUs.Modules;
|
using BetterAmongUs.Modules;
|
||||||
using BetterAmongUs.Patches.Gameplay.UI.Settings;
|
using BetterAmongUs.Patches.Gameplay.UI.Settings;
|
||||||
using BetterAmongUs.Structs;
|
|
||||||
using HarmonyLib;
|
using HarmonyLib;
|
||||||
using Il2CppInterop.Runtime.Attributes;
|
using Il2CppInterop.Runtime.Attributes;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -45,10 +44,11 @@ internal class PlayerInfoDisplay : MonoBehaviour
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly Dictionary<string, Color32> _cachedColors = new()
|
private static readonly Dictionary<string, Color32> _cachedColors = new()
|
||||||
{
|
{
|
||||||
["#00f583"] = Utils.HexToColor32("#00f583"),
|
[Colors.SickoHexColor] = Utils.HexToColor32(Colors.SickoHexColor),
|
||||||
["#4f0000"] = Utils.HexToColor32("#4f0000"),
|
[Colors.AUMHexColor] = Utils.HexToColor32(Colors.AUMHexColor),
|
||||||
["#fc0000"] = Utils.HexToColor32("#fc0000"),
|
[Colors.KNHexColor] = Utils.HexToColor32(Colors.KNHexColor),
|
||||||
["#8731e7"] = Utils.HexToColor32("#8731e7")
|
[Colors.MMCHexColor] = Utils.HexToColor32(Colors.MMCHexColor),
|
||||||
|
[Colors.CheaterHexColor] = Utils.HexToColor32(Colors.CheaterHexColor)
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -59,10 +59,6 @@ internal class PlayerInfoDisplay : MonoBehaviour
|
|||||||
internal readonly string Loading = Translator.GetString("Player.Loading");
|
internal readonly string Loading = Translator.GetString("Player.Loading");
|
||||||
internal readonly string PlatformHidden = Translator.GetString("Player.PlatformHidden");
|
internal readonly string PlatformHidden = Translator.GetString("Player.PlatformHidden");
|
||||||
internal readonly string NoFriendCode = Translator.GetString("Player.NoFriendCode");
|
internal readonly string NoFriendCode = Translator.GetString("Player.NoFriendCode");
|
||||||
internal readonly string SickoUser = Translator.GetString("Player.SickoUser");
|
|
||||||
internal readonly string AUMUser = Translator.GetString("Player.AUMUser");
|
|
||||||
internal readonly string KNUser = Translator.GetString("Player.KNUser");
|
|
||||||
internal readonly string KnownCheater = Translator.GetString("Player.KnownCheater");
|
|
||||||
internal readonly string BetterUser = Translator.GetString("Player.BetterUser");
|
internal readonly string BetterUser = Translator.GetString("Player.BetterUser");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,25 +357,10 @@ internal class PlayerInfoDisplay : MonoBehaviour
|
|||||||
|
|
||||||
var color = _player.cosmetics.currentBodySprite.BodySprite.material.GetColor("_OutlineColor");
|
var color = _player.cosmetics.currentBodySprite.BodySprite.material.GetColor("_OutlineColor");
|
||||||
|
|
||||||
if (ContainsPlayerData(BetterDataManager.BetterDataFile.SickoData, _player.Data))
|
if (BetterDataManager.BetterDataFile.TryGetCheatInfo(_player.Data, out var info))
|
||||||
{
|
{
|
||||||
sbTag.Append($"<color=#00f583>{_cachedTranslations.SickoUser}</color>+++");
|
sbTag.Append(info.title.ToColor(info.hexColor) + "+++");
|
||||||
_player.SetOutlineByHex(true, "#00f583");
|
_player.SetOutlineByHex(true, info.hexColor);
|
||||||
}
|
|
||||||
else if (ContainsPlayerData(BetterDataManager.BetterDataFile.AUMData, _player.Data))
|
|
||||||
{
|
|
||||||
sbTag.Append($"<color=#4f0000>{_cachedTranslations.AUMUser}</color>+++");
|
|
||||||
_player.SetOutlineByHex(true, "#4f0000");
|
|
||||||
}
|
|
||||||
else if (ContainsPlayerData(BetterDataManager.BetterDataFile.KNData, _player.Data))
|
|
||||||
{
|
|
||||||
sbTag.Append($"<color=#8731e7>{_cachedTranslations.KNUser}</color>+++");
|
|
||||||
_player.SetOutlineByHex(true, "#8731e7");
|
|
||||||
}
|
|
||||||
else if (ContainsPlayerData(BetterDataManager.BetterDataFile.CheatData, _player.Data))
|
|
||||||
{
|
|
||||||
sbTag.Append($"<color=#fc0000>{_cachedTranslations.KnownCheater}</color>+++");
|
|
||||||
_player.SetOutlineByHex(true, "#fc0000");
|
|
||||||
}
|
}
|
||||||
else if (_cachedColors.Any(kvp => color == kvp.Value))
|
else if (_cachedColors.Any(kvp => color == kvp.Value))
|
||||||
{
|
{
|
||||||
@@ -387,23 +368,6 @@ internal class PlayerInfoDisplay : MonoBehaviour
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Checks if player data exists in a HashSet of UserInfo.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dataList">HashSet of UserInfo to check.</param>
|
|
||||||
/// <param name="playerData">Player data to look for.</param>
|
|
||||||
/// <returns>True if player data exists in the HashSet.</returns>
|
|
||||||
[HideFromIl2Cpp]
|
|
||||||
private static bool ContainsPlayerData(HashSet<UserInfo> dataList, NetworkedPlayerInfo playerData)
|
|
||||||
{
|
|
||||||
foreach (var info in dataList)
|
|
||||||
{
|
|
||||||
if (info.CheckPlayerData(playerData))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets lobby specific information.
|
/// Sets lobby specific information.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -179,14 +179,10 @@ internal static class ChatPatch
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show mod-specific tags based on player data
|
// Show mod-specific tags based on player data
|
||||||
if (BetterDataManager.BetterDataFile.SickoData.Any(info => info.CheckPlayerData(sourcePlayer.Data)))
|
if (BetterDataManager.BetterDataFile.TryGetCheatInfo(sourcePlayer.Data, out var info))
|
||||||
sbTag.Append($"<color=#00f583>{Translator.GetString("Player.SickoUser")}</color>+++");
|
{
|
||||||
else if (BetterDataManager.BetterDataFile.AUMData.Any(info => info.CheckPlayerData(sourcePlayer.Data)))
|
sbTag.Append(info.title.ToColor(info.hexColor) + "+++");
|
||||||
sbTag.Append($"<color=#4f0000>{Translator.GetString("Player.AUMUser")}</color>+++");
|
}
|
||||||
else if (BetterDataManager.BetterDataFile.KNData.Any(info => info.CheckPlayerData(sourcePlayer.Data)))
|
|
||||||
sbTag.Append($"<color=#8731e7>{Translator.GetString("Player.KNUser")}</color>+++");
|
|
||||||
else if (BetterDataManager.BetterDataFile.CheatData.Any(info => info.CheckPlayerData(sourcePlayer.Data)))
|
|
||||||
sbTag.Append($"<color=#fc0000>{Translator.GetString("Player.KnownCheater")}</color>+++");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hide roles from alive players (unless same team)
|
// Hide roles from alive players (unless same team)
|
||||||
|
|||||||
@@ -28,7 +28,8 @@
|
|||||||
"Player.SickoUser": "Sicko User",
|
"Player.SickoUser": "Sicko User",
|
||||||
"Player.AUMUser": "AUM User",
|
"Player.AUMUser": "AUM User",
|
||||||
"Player.KNUser": "KN User",
|
"Player.KNUser": "KN User",
|
||||||
"Player.KnownCheater": "Flagged Player",
|
"Player.MMCUser": "MMC User",
|
||||||
|
"Player.FlaggedPlayer": "Flagged Player",
|
||||||
|
|
||||||
"DisconnectReason.Left": "{0} Left the game!",
|
"DisconnectReason.Left": "{0} Left the game!",
|
||||||
"DisconnectReason.Disconnect": "{0} Disconnected!",
|
"DisconnectReason.Disconnect": "{0} Disconnected!",
|
||||||
@@ -129,6 +130,7 @@
|
|||||||
"AntiCheat.Cheat.AUM": "AUM",
|
"AntiCheat.Cheat.AUM": "AUM",
|
||||||
"AntiCheat.Cheat.KN": "Kill Network",
|
"AntiCheat.Cheat.KN": "Kill Network",
|
||||||
"AntiCheat.Cheat.KNC": "KN Chat",
|
"AntiCheat.Cheat.KNC": "KN Chat",
|
||||||
|
"AntiCheat.Cheat.MMCC": "MMC Chat",
|
||||||
"AntiCheat.Reason.InvalidFriendCode": "Invalid Friend Code",
|
"AntiCheat.Reason.InvalidFriendCode": "Invalid Friend Code",
|
||||||
"AntiCheat.Reason.PlatformSpoofer": "Platform Spoofer",
|
"AntiCheat.Reason.PlatformSpoofer": "Platform Spoofer",
|
||||||
"AntiCheat.Reason.RPCSentPS": "RPC Spam",
|
"AntiCheat.Reason.RPCSentPS": "RPC Spam",
|
||||||
|
|||||||
Reference in new issue
Block a user