Add detections to ModMenuCrew and clean up tag handling

This commit is contained in:
D1GQ committed 2026-03-19 15:13:28 -05:00
1 parent ae71542e6a
commit eb44df4c56
14 files changed
+252 -134

No files matched your search

+9
View File
@@ -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();
} }
} }
+50 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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";
} }
+6
View File
@@ -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"));
}
} }
} }
} }
+4 -29
View File
@@ -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>
+8 -44
View File
@@ -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>
+4 -8
View File
@@ -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)
+3 -1
View File
@@ -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",