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;
}
}
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)
{
@@ -324,6 +332,7 @@ internal static class BetterDataManager
BetterDataFile.SickoData.Clear();
BetterDataFile.AUMData.Clear();
BetterDataFile.KNData.Clear();
BetterDataFile.MMCData.Clear();
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;
namespace BetterAmongUs.Data.Json;
@@ -34,10 +36,49 @@ internal sealed class BetterDataFile : AbstractJsonFile
/// <returns>True if saving was successful, false otherwise.</returns>
internal override bool Save()
{
AllCheatData = [.. CheatData, .. SickoData, .. AUMData, .. KNData];
AllCheatData = [.. CheatData, .. SickoData, .. AUMData, .. KNData, .. MMCData];
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>
/// Checks if player data matches any known cheat entries.
/// </summary>
@@ -101,8 +142,14 @@ internal sealed class BetterDataFile : AbstractJsonFile
public HashSet<UserInfo> AUMData { get; set; } = [];
/// <summary>
/// Gets or sets the collection of KN cheat user data.
/// Gets or sets the collection of Kill Network cheat user data.
/// </summary>
[JsonPropertyName("knData")]
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>
internal enum CustomRPC : int
{
// ========================================
// Known Cheat RPCS
// ========================================
// Cheat RPC's
/// <summary>
/// RPC identifier for Sicko cheat detection.
@@ -31,19 +35,28 @@ internal enum CustomRPC : int
/// </summary>
KillNetworkChat = 119,
/// <summary>
/// RPC identifier for ModMenuCrew chat communication.
/// </summary>
ModMenuCrewChat = 201,
// ========================================
// BAU RPCS
// ========================================
// Better Among Us
/// <summary>
/// Legacy RPC for BetterAmongUs checks (currently unused).
/// </summary>
LegacyBetterCheck = 150, // Unused
/// <summary>
/// RPC for sending a shared secret to another player.
/// </summary>
SendSecretToPlayer,
SendSecretToPlayer = 151,
/// <summary>
/// RPC for checking the hash of a shared secret received from another player.
/// </summary>
CheckSecretHashFromPlayer,
CheckSecretHashFromPlayer = 152,
}
+15 -6
View File
@@ -7,18 +7,22 @@ namespace BetterAmongUs.Helpers;
/// </summary>
internal static class Colors
{
// Convert a string to a colored string using a Unity Color object
/// <summary>
/// Converts the provided string into a colored string by wrapping it with a
/// <color> tag using the Unity Color object. The Unity Color is automatically
/// converted to its hexadecimal representation before being applied to the string.
/// Converts the provided string into a colored string.
/// </summary>
/// <param name="str">The string to be colored.</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>
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>
/// 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.
@@ -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>
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>
/// 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
@@ -136,4 +139,10 @@ internal static class Colors
/// Standard impostor red color.
/// </summary>
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);
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)))
{
string reason = Translator.GetString("AntiCheat.Reason.KnownCheater");
@@ -19,33 +19,52 @@ internal sealed class AUMChatHandler : RPCHandler
internal override void HandleCheatRpcCheck(PlayerControl? sender, MessageReader reader)
{
var nameString = reader.ReadString();
var msgString = reader.ReadString();
var colorId = reader.ReadInt32();
var flag3 = sender.BetterData().AntiCheatInfo.AUMChats.Count > 0 && sender.BetterData().AntiCheatInfo.AUMChats.Last() == msgString;
if (!flag3)
try
{
Utils.AddChatPrivate($"{msgString}", overrideName: $"<b><color=#870000>AUM Chat</color> - {sender.GetPlayerNameAndColor()}</b>");
sender.BetterData().AntiCheatInfo.AUMChats.Add(msgString);
var nameString = reader.ReadString();
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"));
}
}
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)))
catch
{
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"));
if (BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_Anticheat))
return;
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)
{
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();
@@ -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)
{
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"));
BetterDataManager.BetterDataFile.Save();
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.KN"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
}
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
BetterDataManager.BetterDataFile.KNData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "KillNetwork RPC"));
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)
{
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"));
BetterDataManager.BetterDataFile.Save();
BetterNotificationManager.NotifyCheat(sender, Translator.GetString("AntiCheat.Cheat.Sicko"), newText: Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2"));
}
sender.ReportPlayer(ReportReasons.Cheating_Hacking);
BetterDataManager.BetterDataFile.SickoData.Add(new(sender?.BetterData().RealName ?? sender.Data.PlayerName, sender.GetHashPuid(), sender.Data.FriendCode, "Sicko RPC"));
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.Helpers;
using BetterAmongUs.Modules;
using BetterAmongUs.Structs;
using Il2CppInterop.Runtime.Attributes;
using System.Text;
using TMPro;
@@ -33,10 +32,6 @@ internal sealed class MeetingInfoDisplay : PlayerInfoDisplay
/// </summary>
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 DisconnectAntiCheat = Translator.GetString("DisconnectReasonMeeting.AntiCheat");
internal readonly string DisconnectBanned = Translator.GetString("DisconnectReasonMeeting.Banned");
@@ -177,14 +172,10 @@ internal sealed class MeetingInfoDisplay : PlayerInfoDisplay
if (_player.Data == null)
return;
if (ContainsPlayerData(BetterDataManager.BetterDataFile.SickoData, _player.Data))
sbTag.Append($"<color=#00f583>{_cachedTranslations.SickoUser}</color>+++");
else if (ContainsPlayerData(BetterDataManager.BetterDataFile.AUMData, _player.Data))
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>+++");
if (BetterDataManager.BetterDataFile.TryGetCheatInfo(_player.Data, out var info))
{
sbTag.Append(info.title.ToColor(info.hexColor) + "+++");
}
}
/// <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>
/// Updates display for disconnected players.
/// </summary>
+8 -44
View File
@@ -5,7 +5,6 @@ using BetterAmongUs.Data.Config;
using BetterAmongUs.Helpers;
using BetterAmongUs.Modules;
using BetterAmongUs.Patches.Gameplay.UI.Settings;
using BetterAmongUs.Structs;
using HarmonyLib;
using Il2CppInterop.Runtime.Attributes;
using System.Text;
@@ -45,10 +44,11 @@ internal class PlayerInfoDisplay : MonoBehaviour
/// </summary>
private static readonly Dictionary<string, Color32> _cachedColors = new()
{
["#00f583"] = Utils.HexToColor32("#00f583"),
["#4f0000"] = Utils.HexToColor32("#4f0000"),
["#fc0000"] = Utils.HexToColor32("#fc0000"),
["#8731e7"] = Utils.HexToColor32("#8731e7")
[Colors.SickoHexColor] = Utils.HexToColor32(Colors.SickoHexColor),
[Colors.AUMHexColor] = Utils.HexToColor32(Colors.AUMHexColor),
[Colors.KNHexColor] = Utils.HexToColor32(Colors.KNHexColor),
[Colors.MMCHexColor] = Utils.HexToColor32(Colors.MMCHexColor),
[Colors.CheaterHexColor] = Utils.HexToColor32(Colors.CheaterHexColor)
};
/// <summary>
@@ -59,10 +59,6 @@ internal class PlayerInfoDisplay : MonoBehaviour
internal readonly string Loading = Translator.GetString("Player.Loading");
internal readonly string PlatformHidden = Translator.GetString("Player.PlatformHidden");
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");
}
@@ -361,25 +357,10 @@ internal class PlayerInfoDisplay : MonoBehaviour
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>+++");
_player.SetOutlineByHex(true, "#00f583");
}
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");
sbTag.Append(info.title.ToColor(info.hexColor) + "+++");
_player.SetOutlineByHex(true, info.hexColor);
}
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>
/// Sets lobby specific information.
/// </summary>
+4 -8
View File
@@ -179,14 +179,10 @@ internal static class ChatPatch
}
// Show mod-specific tags based on player data
if (BetterDataManager.BetterDataFile.SickoData.Any(info => info.CheckPlayerData(sourcePlayer.Data)))
sbTag.Append($"<color=#00f583>{Translator.GetString("Player.SickoUser")}</color>+++");
else if (BetterDataManager.BetterDataFile.AUMData.Any(info => info.CheckPlayerData(sourcePlayer.Data)))
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>+++");
if (BetterDataManager.BetterDataFile.TryGetCheatInfo(sourcePlayer.Data, out var info))
{
sbTag.Append(info.title.ToColor(info.hexColor) + "+++");
}
}
// Hide roles from alive players (unless same team)
+3 -1
View File
@@ -28,7 +28,8 @@
"Player.SickoUser": "Sicko User",
"Player.AUMUser": "AUM User",
"Player.KNUser": "KN User",
"Player.KnownCheater": "Flagged Player",
"Player.MMCUser": "MMC User",
"Player.FlaggedPlayer": "Flagged Player",
"DisconnectReason.Left": "{0} Left the game!",
"DisconnectReason.Disconnect": "{0} Disconnected!",
@@ -129,6 +130,7 @@
"AntiCheat.Cheat.AUM": "AUM",
"AntiCheat.Cheat.KN": "Kill Network",
"AntiCheat.Cheat.KNC": "KN Chat",
"AntiCheat.Cheat.MMCC": "MMC Chat",
"AntiCheat.Reason.InvalidFriendCode": "Invalid Friend Code",
"AntiCheat.Reason.PlatformSpoofer": "Platform Spoofer",
"AntiCheat.Reason.RPCSentPS": "RPC Spam",