using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Microsoft.CodeAnalysis; using Mirror; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("BigWalk-ModerationPlus")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BigWalk-ModerationPlus")] [assembly: AssemblyTitle("BigWalk-ModerationPlus")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } public static class thisisthebanstorepleasebuyanyban { private static readonly string pathforbans = Path.Combine(Paths.PluginPath, "bayturtles-moderationplus-bans.txt"); private static readonly HashSet peoplebanned = new HashSet(); public static void load() { if (!File.Exists(pathforbans)) { return; } string[] array = File.ReadAllLines(pathforbans); foreach (string text in array) { if (!string.IsNullOrWhiteSpace(text)) { peoplebanned.Add(text.Trim()); } } } public static void savebanss() { File.WriteAllLines(pathforbans, peoplebanned); } public static bool alreadybanned(string id) { if (!string.IsNullOrEmpty(id)) { return peoplebanned.Contains(id); } return false; } public static void doban(string id) { if (!string.IsNullOrWhiteSpace(id)) { peoplebanned.Add(id.Trim()); savebanss(); } } public static void getridofban(string id) { peoplebanned.Remove(id); savebanss(); } public static IEnumerable all() { return peoplebanned.OrderBy((string x) => x); } } public static class turtlesimpleanticheat { private class followdata { public Vector3 posoflast; public float lastymovetime; public float lastypositiony; } public static bool enabled = false; public static float fastlimit = 15f; public static float limittobeinginair = 3f; public static List modlogheythatrhymes = new List(); private static Dictionary trackedplayersss = new Dictionary(); private static List registeredplayers = new List(); public static void registerplayer(PlayerCharacter character) { if (!((Object)(object)character == (Object)null) && !registeredplayers.Contains(character)) { registeredplayers.Add(character); } } public static void unregisterplayer(PlayerCharacter character) { if (!((Object)(object)character == (Object)null)) { registeredplayers.Remove(character); PlayerNetworking playerNetworking = character.playerNetworking; if ((Object)(object)playerNetworking != (Object)null && !string.IsNullOrEmpty(playerNetworking.identifier)) { trackedplayersss.Remove(playerNetworking.identifier); } } } public static void seedfromscene() { registeredplayers.Clear(); foreach (PlayerCharacter item in Object.FindObjectsOfType()) { registerplayer(item); } } public static IReadOnlyList getcharacters() { return registeredplayers; } public static void tick() { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || Time.deltaTime <= 0f) { return; } for (int num = registeredplayers.Count - 1; num >= 0; num--) { PlayerCharacter val = registeredplayers[num]; if ((Object)(object)val == (Object)null) { registeredplayers.RemoveAt(num); continue; } if (((NetworkBehaviour)val).isLocalPlayer) { continue; } PlayerNetworking playerNetworking = val.playerNetworking; if ((Object)(object)playerNetworking == (Object)null) { continue; } string identifier = playerNetworking.identifier; if (string.IsNullOrEmpty(identifier)) { continue; } Vector3 position = ((Component)val).transform.position; if (!trackedplayersss.TryGetValue(identifier, out var value)) { trackedplayersss[identifier] = new followdata { posoflast = position, lastymovetime = Time.time, lastypositiony = position.y }; continue; } Vector2 val2 = new Vector2(position.x - value.posoflast.x, position.z - value.posoflast.z); float num2 = ((Vector2)(ref val2)).magnitude / Time.deltaTime; int num3; if (val.ground != null) { num3 = (val.ground.isGrounded ? 1 : 0); if (num3 != 0) { goto IL_0138; } } else { num3 = 0; } if (position.y < value.lastypositiony - 0.05f) { goto IL_0138; } goto IL_0152; IL_0138: value.lastymovetime = Time.time; value.lastypositiony = position.y; goto IL_0152; IL_0152: float num4 = Time.time - value.lastymovetime; bool flag = num3 == 0 && num4 > limittobeinginair; bool flag2 = num2 > fastlimit; if (enabled && (flag || flag2)) { string text = (flag ? "aretheyflying" : "aretheyusingbigrun"); makelogg(playerNetworking.username + " kicked for " + text); playerNetworking.RPCKickUser(((NetworkBehaviour)playerNetworking).connectionToClient); trackedplayersss.Remove(identifier); } else { value.posoflast = position; } } } private static void makelogg(string message) { modlogheythatrhymes.Insert(0, message); if (modlogheythatrhymes.Count > 50) { modlogheythatrhymes.RemoveAt(modlogheythatrhymes.Count - 1); } } } public class theuipart : MonoBehaviour { private static ConfigEntry togglekey; private static ConfigEntry uiscale; private bool showui; private int tab; private Rect windowsizess = new Rect(60f, 60f, 480f, 360f); private Vector2 playerscrollthing; private Vector2 bannedscrollthing; private string banidmanua = ""; public theuipart(IntPtr ptr) : base(ptr) { }//IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) public static void init(ConfigFile config) { config.SaveOnConfigSet = false; togglekey = config.Bind("general", "togglekey", (KeyCode)287, "key to show the mod panel"); uiscale = config.Bind("general", "uiscale", 1f, "scale of the moderation panel"); thisisthebanstorepleasebuyanyban.load(); turtlesimpleanticheat.seedfromscene(); } private void Update() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown(togglekey.Value)) { showui = !showui; if (!showui) { ((ConfigEntryBase)uiscale).ConfigFile.Save(); } } turtlesimpleanticheat.tick(); } private void OnGUI() { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) if (showui) { Matrix4x4 matrix = GUI.matrix; GUIUtility.ScaleAroundPivot(new Vector2(uiscale.Value, uiscale.Value), ((Rect)(ref windowsizess)).position); windowsizess = GUI.Window(834112, windowsizess, WindowFunction.op_Implicit((Action)makepanel), "BayTurtle's Moderation+"); GUI.matrix = matrix; } } private void makepanel(int id) { //IL_0141: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginHorizontal((Il2CppReferenceArray)null); GUILayout.Label("ui scale", (Il2CppReferenceArray)null); uiscale.Value = GUILayout.HorizontalSlider(uiscale.Value, 0.6f, 2f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(140f) }); GUILayout.Label(uiscale.Value.ToString("0.00"), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(40f) }); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal((Il2CppReferenceArray)null); if (GUILayout.Toggle(tab == 0, "players", GUI.skin.button, (Il2CppReferenceArray)null)) { tab = 0; } if (GUILayout.Toggle(tab == 1, "anti cheat", GUI.skin.button, (Il2CppReferenceArray)null)) { tab = 1; } if (GUILayout.Toggle(tab == 2, "bans", GUI.skin.button, (Il2CppReferenceArray)null)) { tab = 2; } GUILayout.EndHorizontal(); if (tab == 0) { showplrs(); } if (tab == 1) { makeanticheathing(); } if (tab == 2) { showbanned(); } GUI.DragWindow(new Rect(0f, 0f, ((Rect)(ref windowsizess)).width, 20f)); } private void showplrs() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) playerscrollthing = GUILayout.BeginScrollView(playerscrollthing, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(240f) }); foreach (PlayerCharacter item in turtlesimpleanticheat.getcharacters()) { if ((Object)(object)item == (Object)null || ((NetworkBehaviour)item).isLocalPlayer) { continue; } PlayerNetworking playerNetworking = item.playerNetworking; if ((Object)(object)playerNetworking == (Object)null) { continue; } string identifier = playerNetworking.identifier; GUILayout.BeginHorizontal((Il2CppReferenceArray)null); GUILayout.Label(playerNetworking.username + " (" + identifier + ")", (Il2CppReferenceArray)null); if (GUILayout.Button("kick", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) })) { playerNetworking.RPCKickUser(((NetworkBehaviour)playerNetworking).connectionToClient); } if (thisisthebanstorepleasebuyanyban.alreadybanned(identifier)) { if (GUILayout.Button("unban", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(55f) })) { thisisthebanstorepleasebuyanyban.getridofban(identifier); } } else if (GUILayout.Button("ban", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) })) { thisisthebanstorepleasebuyanyban.doban(identifier); playerNetworking.RPCKickUser(((NetworkBehaviour)playerNetworking).connectionToClient); } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); } private void makeanticheathing() { turtlesimpleanticheat.enabled = GUILayout.Toggle(turtlesimpleanticheat.enabled, "flying/speed hack autokick", Array.Empty()); GUILayout.Label("max speed before detected as speed hack: " + turtlesimpleanticheat.fastlimit.ToString("0.0"), (Il2CppReferenceArray)null); turtlesimpleanticheat.fastlimit = GUILayout.HorizontalSlider(turtlesimpleanticheat.fastlimit, 3f, 40f, Array.Empty()); GUILayout.Label("max airtime before detected as flying : " + turtlesimpleanticheat.limittobeinginair.ToString("0.0") + "s", (Il2CppReferenceArray)null); turtlesimpleanticheat.limittobeinginair = GUILayout.HorizontalSlider(turtlesimpleanticheat.limittobeinginair, 1f, 10f, Array.Empty()); GUILayout.Label("recently kicked/found:", (Il2CppReferenceArray)null); foreach (string modlogheythatrhyme in turtlesimpleanticheat.modlogheythatrhymes) { GUILayout.Label(modlogheythatrhyme, (Il2CppReferenceArray)null); } } private void showbanned() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginHorizontal((Il2CppReferenceArray)null); banidmanua = GUILayout.TextField(banidmanua, (Il2CppReferenceArray)null); if (GUILayout.Button("ban", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(110f) })) { thisisthebanstorepleasebuyanyban.doban(banidmanua); banidmanua = ""; } GUILayout.EndHorizontal(); bannedscrollthing = GUILayout.BeginScrollView(bannedscrollthing, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(240f) }); foreach (string item in thisisthebanstorepleasebuyanyban.all()) { GUILayout.BeginHorizontal((Il2CppReferenceArray)null); GUILayout.Label(item, (Il2CppReferenceArray)null); if (GUILayout.Button("unban", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(55f) })) { thisisthebanstorepleasebuyanyban.getridofban(item); } GUILayout.EndHorizontal(); } GUILayout.EndScrollView(); } } [HarmonyPatch(typeof(PlayerNetworking), "OnSetIdentifier")] public static class banemm { private static void Postfix(PlayerNetworking __instance, string valold, string valnew) { if (NetworkServer.active && !string.IsNullOrEmpty(valnew) && thisisthebanstorepleasebuyanyban.alreadybanned(valnew)) { __instance.RPCKickUser(((NetworkBehaviour)__instance).connectionToClient); } } } [HarmonyPatch(typeof(PlayerNetworking), "OnStartClient")] public static class trackwhentheyjoin { private static void Postfix(PlayerNetworking __instance) { PlayerCharacter val = ((Component)__instance).GetComponent(); if ((Object)(object)val == (Object)null) { val = ((Component)__instance).GetComponentInParent(); } turtlesimpleanticheat.registerplayer(val); } } [HarmonyPatch(typeof(PlayerNetworking), "OnStopClient")] public static class andtrackwhentheyleavee { private static void Postfix(PlayerNetworking __instance) { PlayerCharacter val = ((Component)__instance).GetComponent(); if ((Object)(object)val == (Object)null) { val = ((Component)__instance).GetComponentInParent(); } turtlesimpleanticheat.unregisterplayer(val); } } [BepInPlugin("bayturtleking.moderationpluss", "Moderation+", "1.0.0")] public class plugin : BasePlugin { internal static ManualLogSource modlogheythatrhymes; public override void Load() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) modlogheythatrhymes = ((BasePlugin)this).Log; ClassInjector.RegisterTypeInIl2Cpp(); theuipart.init(((BasePlugin)this).Config); GameObject val = new GameObject("moderationtoolsholder"); Object.DontDestroyOnLoad((Object)val); val.AddComponent(); new Harmony("bayturtleking.moderationpluss").PatchAll(); modlogheythatrhymes.LogInfo((object)"moderationplus by bayturtle loaded"); } }