diff --git a/Modules/AntiCheat.cs b/Modules/AntiCheat.cs index b458b5a..e8ba09b 100644 --- a/Modules/AntiCheat.cs +++ b/Modules/AntiCheat.cs @@ -11,6 +11,7 @@ class AntiCheat public static Dictionary PlayerData = []; // HashPuid, FriendCode public static Dictionary SickoData = []; // HashPuid, FriendCode public static Dictionary AUMData = []; // HashPuid, FriendCode + public static Dictionary KNData = []; // HashPuid, FriendCode private static bool IsEnabled = true; public static void Update() @@ -204,7 +205,23 @@ class AntiCheat return; } + + if (callId is unchecked((byte)CustomRPC.Killnetwork) && Main.AntiCheat.Value && BetterGameSettings.DetectCheatClients.GetBool()) + { + var flag = KNData.ContainsKey(Utils.GetHashPuid(player)); + + if (!flag) + { + player.ReportPlayer(ReportReasons.Cheating_Hacking); + KNData[Utils.GetHashPuid(player)] = player.Data.FriendCode; + BetterDataManager.SaveCheatData(Utils.GetHashPuid(player), player.Data.FriendCode, player.Data.PlayerName, "knData", "KN RPC"); + BetterNotificationManager.NotifyCheat(player, Translator.GetString("AntiCheat.Cheat.KN"), Translator.GetString("AntiCheat.HasBeenDetectedWithCheat2")); + } + + return; + } } + // Check and notify for invalid rpcs public static void CheckRPC(PlayerControl player, byte callId, MessageReader Oldreader) { @@ -563,7 +580,7 @@ class AntiCheat return false; } - if (callId is (byte)RpcCalls.StartMeeting) + if (callId is (byte)RpcCalls.StartMeeting or (byte)RpcCalls.ReportDeadBody) { if (GameStates.IsMeeting && MeetingHudUpdatePatch.timeOpen > 0.5f || GameStates.IsHideNSeek || !player.IsAlive() || player.IsInVent() || player.shapeshifting || player.inMovingPlat || player.onLadder || player.MyPhysics.Animations.IsPlayingAnyLadderAnimation()) diff --git a/Modules/BetterDataManager.cs b/Modules/BetterDataManager.cs index a5f3c21..da0c28e 100644 --- a/Modules/BetterDataManager.cs +++ b/Modules/BetterDataManager.cs @@ -61,12 +61,13 @@ class BetterDataManager { // Initialize with predefined categories var initialData = new Dictionary>> - { - { "Data", new Dictionary>() }, // Default category - { "cheatData", new Dictionary>() }, - { "sickoData", new Dictionary>() }, - { "aumData", new Dictionary>() } - }; + { + { "Data", new Dictionary>() }, // Default category + { "cheatData", new Dictionary>() }, + { "sickoData", new Dictionary>() }, + { "aumData", new Dictionary>() }, + { "knData", new Dictionary>() } + }; string json = JsonSerializer.Serialize(initialData, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(filePath, json); @@ -94,19 +95,23 @@ class BetterDataManager // Check and add missing categories if (!jsonData.ContainsKey("Data")) { - jsonData["Data"] = new Dictionary>(); + jsonData["Data"] = []; } if (!jsonData.ContainsKey("cheatData")) { - jsonData["cheatData"] = new Dictionary>(); + jsonData["cheatData"] = []; } if (!jsonData.ContainsKey("sickoData")) { - jsonData["sickoData"] = new Dictionary>(); + jsonData["sickoData"] = []; } if (!jsonData.ContainsKey("aumData")) { - jsonData["aumData"] = new Dictionary>(); + jsonData["aumData"] = []; + } + if (!jsonData.ContainsKey("knData")) + { + jsonData["knData"] = []; } // Write the updated JSON data back to the file @@ -468,6 +473,14 @@ class BetterDataManager AntiCheat.AUMData[item.Value["HashPUID"]] = item.Value["FriendCode"]; } } + + if (jsonData.ContainsKey("knData")) + { + foreach (var item in jsonData["knData"]) + { + AntiCheat.KNData[item.Value["HashPUID"]] = item.Value["FriendCode"]; + } + } } } catch (Exception ex) diff --git a/Modules/RPC.cs b/Modules/RPC.cs index 26c21e5..6548a29 100644 --- a/Modules/RPC.cs +++ b/Modules/RPC.cs @@ -10,6 +10,7 @@ enum CustomRPC : int Sicko = 420, // Results in 164 AUM = 42069, // Results in 85 AUMChat = 101, + Killnetwork = 250, // TOHE VersionCheck = 80, diff --git a/Patches/MeetingHudPatch.cs b/Patches/MeetingHudPatch.cs index db93568..897bccb 100644 --- a/Patches/MeetingHudPatch.cs +++ b/Patches/MeetingHudPatch.cs @@ -124,11 +124,13 @@ class MeetingHudUpdatePatch // Put +++ at the end of each tag if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.SickoData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.SickoData.ContainsValue(friendCode)) - sbTag.Append("Sicko User+++"); + sbTag.Append($"{Translator.GetString("Player.SickoUser")}+++"); else if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.AUMData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.AUMData.ContainsValue(friendCode)) - sbTag.Append("AUM User+++"); + sbTag.Append($"{Translator.GetString("Player.AUMUser")}+++"); + else if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.KNData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.KNData.ContainsValue(friendCode)) + sbTag.Append($"{Translator.GetString("Player.KNUser")}+++"); else if (!string.IsNullOrEmpty(hashPuid) && AntiCheat.PlayerData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && AntiCheat.PlayerData.ContainsValue(friendCode)) - sbTag.Append("Known Cheater+++"); + sbTag.Append($"{Translator.GetString("Player.KnownCheater")}+++"); for (int i = 0; i < sbTag.ToString().Split("+++").Length; i++) { diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs index 591b372..d509b93 100644 --- a/Patches/PlayerControlPatch.cs +++ b/Patches/PlayerControlPatch.cs @@ -151,6 +151,13 @@ class PlayerControlPatch player.SetOutlineByHex(true, "#4f0000"); } + else if (!string.IsNullOrEmpty(hashPuid) && hashPuid.Length > 0 && AntiCheat.KNData.ContainsKey(hashPuid) + || !string.IsNullOrEmpty(friendCode) && friendCode.Length > 0 && AntiCheat.KNData.ContainsValue(friendCode)) + { + sbTag.Append($"{Translator.GetString("Player.KNUser")}+++"); + player.SetOutlineByHex(true, "#8731e7"); + } + else if (!string.IsNullOrEmpty(hashPuid) && hashPuid.Length > 0 && AntiCheat.PlayerData.ContainsKey(hashPuid) || !string.IsNullOrEmpty(friendCode) && friendCode.Length > 0 && AntiCheat.PlayerData.ContainsValue(friendCode)) { @@ -161,7 +168,8 @@ class PlayerControlPatch else { var color = player.cosmetics.currentBodySprite.BodySprite.material.GetColor("_OutlineColor"); - if (color == Utils.HexToColor32("#00f583") || color == Utils.HexToColor32("#4f0000") || color == Utils.HexToColor32("#fc0000")) + if (color == Utils.HexToColor32("#00f583") || color == Utils.HexToColor32("#4f0000") + || color == Utils.HexToColor32("#8731e7") || color == Utils.HexToColor32("#fc0000")) { player.SetOutline(false, null); } diff --git a/Resources/Lang/en_US.json b/Resources/Lang/en_US.json index 5506321..589db83 100644 --- a/Resources/Lang/en_US.json +++ b/Resources/Lang/en_US.json @@ -25,6 +25,7 @@ "Player.BetterHost": "Better Host", "Player.SickoUser": "Sicko User", "Player.AUMUser": "AUM User", + "Player.KNUser": "KN User", "Player.KnownCheater": "Known Cheater", "DisconnectReason.Left": "{0} Left the game!", @@ -114,10 +115,12 @@ "AntiCheat.TryBanExploit": "Attempted To Ban Exploit", "AntiCheat.Cheat.Sicko": "Sicko Menu", "AntiCheat.Cheat.AUM": "AUM", + "AntiCheat.Cheat.KN": "Kill Network", "AntiCheat.Reason.InvalidFriendCode": "Invalid Friend Code", "AntiCheat.Reason.PlatformSpoofer": "Platform Spoofer", "AntiCheat.Reason.SickoMenuUser": "Known Sicko User", "AntiCheat.Reason.AUMUser": "Known AUM User", + "AntiCheat.Reason.KNUser": "Known KN User", "AntiCheat.Reason.KnownCheater": "Known Cheater", "GameSummary": "Game Summary",