From 958e1371a63734f5c8038620c9a326f75c13364d Mon Sep 17 00:00:00 2001 From: D1GQ Date: Thu, 5 Feb 2026 15:45:55 -0600 Subject: [PATCH] add Level Restriction --- .../AntiCheat/RPCHandlers/SetLevelHandler.cs | 14 ++++++++++++-- .../Gameplay/UI/Settings/GameSettingsPatch.cs | 4 +++- src/Resources/Lang/en_US.json | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Modules/AntiCheat/RPCHandlers/SetLevelHandler.cs b/src/Modules/AntiCheat/RPCHandlers/SetLevelHandler.cs index 3e9e6a7..5665102 100644 --- a/src/Modules/AntiCheat/RPCHandlers/SetLevelHandler.cs +++ b/src/Modules/AntiCheat/RPCHandlers/SetLevelHandler.cs @@ -12,6 +12,16 @@ internal sealed class SetLevelHandler : RPCHandler { internal override byte CallId => (byte)RpcCalls.SetLevel; + internal override void Handle(PlayerControl? sender, MessageReader reader) + { + uint level = reader.ReadPackedUInt32() + 1; + + if (level < BetterGameSettings.KickLevelBelow.GetInt()) + { + sender.Kick(setReasonInfo: $" is level {level}, level must be equal or above {BetterGameSettings.KickLevelBelow.GetInt()} to join"); + } + } + internal override bool HandleAntiCheatCancel(PlayerControl? sender, MessageReader reader) { if (sender.DataIsCollected() == true && sender.BetterData().AntiCheatInfo.HasSetLevel && !GameState.IsLocalGame && GameState.IsVanillaServer) @@ -31,9 +41,9 @@ internal sealed class SetLevelHandler : RPCHandler internal override void HandleAntiCheat(PlayerControl? sender, MessageReader reader) { - uint level = reader.ReadPackedUInt32(); + uint level = reader.ReadPackedUInt32() + 1; - if (level + 1 > BetterGameSettings.DetectedLevelAbove.GetInt()) + if (level > BetterGameSettings.DetectedLevelAbove.GetInt()) { if (BetterNotificationManager.NotifyCheat(sender, string.Format(Translator.GetString("AntiCheat.InvalidLevelRPC"), level))) { diff --git a/src/Patches/Gameplay/UI/Settings/GameSettingsPatch.cs b/src/Patches/Gameplay/UI/Settings/GameSettingsPatch.cs index bab5c23..2f49306 100644 --- a/src/Patches/Gameplay/UI/Settings/GameSettingsPatch.cs +++ b/src/Patches/Gameplay/UI/Settings/GameSettingsPatch.cs @@ -19,6 +19,7 @@ class BetterGameSettings internal static OptionCheckboxItem? UseBanWordListOnlyLobby; internal static OptionIntItem? HideAndSeekImpNum; internal static OptionIntItem? DetectedLevelAbove; + internal static OptionIntItem? KickLevelBelow; internal static OptionCheckboxItem? DetectCheatClients; internal static OptionCheckboxItem? DetectInvalidRPCs; internal static OptionStringItem? RoleRandomizer; @@ -44,7 +45,7 @@ internal static class GameSettingsPatch internal static void SetupSettings(bool IsPreload = false) { - // Use 1700 next ID + // Use 1800 next ID BetterSettingsTab = OptionTab.Create(3, "BetterSetting", "BetterSetting.Description", Color.green); @@ -71,6 +72,7 @@ internal static class GameSettingsPatch OptionTitleItem.Create(BetterSettingsTab, "BetterSetting.TextHeader.Detections"); BetterGameSettings.CensorDetectionReason = OptionCheckboxItem.Create(1300, BetterSettingsTab, "BetterSetting.Setting.CensorDetectionReason", false); BetterGameSettings.DetectedLevelAbove = OptionIntItem.Create(600, BetterSettingsTab, "BetterSetting.Setting.DetectedLevelAbove", (100, 10000, 5), 500, ("Lv ", "")); + BetterGameSettings.KickLevelBelow = OptionIntItem.Create(1700, BetterSettingsTab, "BetterSetting.Setting.KickLevelBelow", (0, 10000, 1), 0, ("Lv ", "")); BetterGameSettings.DetectCheatClients = OptionCheckboxItem.Create(700, BetterSettingsTab, "BetterSetting.Setting.DetectCheatClients", true); BetterGameSettings.DetectInvalidRPCs = OptionCheckboxItem.Create(800, BetterSettingsTab, "BetterSetting.Setting.DetectInvalidRPCs", true); } diff --git a/src/Resources/Lang/en_US.json b/src/Resources/Lang/en_US.json index ce3211a..b6ba2d6 100644 --- a/src/Resources/Lang/en_US.json +++ b/src/Resources/Lang/en_US.json @@ -87,6 +87,7 @@ "BetterSetting.Setting.ShowRoleForClients": "Show role in name for clients", "BetterSetting.Setting.CensorDetectionReason": "Censor detection reason", "BetterSetting.Setting.DetectedLevelAbove": "Detected player levels >", + "BetterSetting.Setting.KickLevelBelow": "Kick player levels <", "BetterSetting.Setting.DetectCheatClients": "Detect cheat clients", "BetterSetting.Setting.DetectInvalidRPCs": "Detect invalid RPCs", "BetterSetting.Setting.RoleRandomizer": "Randomizer",