Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of HelpDesk v1.0.2
plugins/AdminCheats.dll
Decompiled 14 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("AdminCheats")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+04a6f40c234702a90518ebd6fd6e194b07bf9d70")] [assembly: AssemblyProduct("AdminCheats")] [assembly: AssemblyTitle("AdminCheats")] [assembly: AssemblyVersion("1.0.0.0")] namespace AdminCheats; public static class Helpers { private static FieldInfo _commandsField; private static MethodInfo _updateCommandListMethod; public static Dictionary<string, ConsoleCommand> GetCommands() { if (_commandsField == null) { _commandsField = typeof(Terminal).GetField("commands", BindingFlags.Static | BindingFlags.NonPublic); } return (Dictionary<string, ConsoleCommand>)_commandsField.GetValue(null); } public static void UpdateCommandList(Terminal terminal) { if (_updateCommandListMethod == null) { _updateCommandListMethod = typeof(Terminal).GetMethod("updateCommandList", BindingFlags.Instance | BindingFlags.NonPublic); } _updateCommandListMethod.Invoke(terminal, null); } } public static class Overrides { public static bool Cheats; public static bool Server; public static bool Network; public static bool Secret; public const string green = "#aaffaa"; public const string red = "#ff6666"; public const string yellow = "#ffff88"; public static bool EffectiveCheats(bool real) { return Cheats || real; } public static bool EffectiveServer(bool real) { return Server || real; } public static bool EffectiveNetwork(bool real) { return Network || real; } public static bool EffectiveSecret(bool real) { return Secret || real; } public static string FormatFlag(string name, bool real, bool overridden) { if (overridden && !real) { return "<color=#ffff88>" + name + "=OVERRIDE</color>"; } string arg = (real ? "#aaffaa" : "#ff6666"); return $"<color={arg}>{name}={real}</color>"; } public static string FormatStatus(string name, bool real, bool forced) { if (forced && !real) { return "<color=#ffff88>" + name + "</color>"; } return "<color=" + (real ? "#aaffaa" : "#ff6666") + ">" + name + "</color>"; } public static void PrintStatus(Terminal context) { bool flag = Object.op_Implicit((Object)(object)ZNet.instance); bool real = flag && ZNet.instance.IsServer(); if (flag) { ZNet.instance.LocalPlayerIsAdminOrHost(); } else _ = 0; bool real2 = context.IsCheatsEnabled(); context.AddString("Override status:"); context.AddString(" cheats: " + FormatFlag("real", real2, overridden: false) + " " + FormatFlag("override", Cheats, overridden: false) + " => " + FormatFlag("effective", EffectiveCheats(real2), overridden: false)); context.AddString(" server: " + FormatFlag("real", real, overridden: false) + " " + FormatFlag("override", Server, overridden: false) + " => " + FormatFlag("effective", EffectiveServer(real), overridden: false)); context.AddString(" network: " + FormatFlag("real", flag, overridden: false) + " " + FormatFlag("override", Network, overridden: false) + " => " + FormatFlag("effective", EffectiveNetwork(flag), overridden: false)); context.AddString(" secret: " + FormatFlag("override", Secret, overridden: false)); } } [HarmonyPatch(typeof(Terminal), "IsCheatsEnabled")] public static class IsCheatsEnabledPatch { private static void Postfix(ref bool __result) { if (!__result) { if (Overrides.EffectiveCheats(real: false)) { __result = true; } else if ((Object)(object)ZNet.instance != (Object)null && ZNet.instance.LocalPlayerIsAdminOrHost()) { __result = true; } } } } [HarmonyPatch(typeof(ConsoleCommand), "IsValid")] public static class IsValidPatch { private static void Postfix(ConsoleCommand __instance, Terminal context, ref bool __result) { if (__result) { return; } bool flag = Object.op_Implicit((Object)(object)ZNet.instance); if (flag && ZNet.instance.LocalPlayerIsAdminOrHost()) { bool num = !__instance.IsCheat || Overrides.EffectiveCheats(context.IsCheatsEnabled()); bool flag2 = !__instance.IsNetwork || Overrides.EffectiveNetwork(flag); if (num && flag2) { __result = true; } return; } bool num2 = !__instance.IsCheat || Overrides.EffectiveCheats(context.IsCheatsEnabled()); bool flag3 = !__instance.IsNetwork || Overrides.EffectiveNetwork(flag); bool flag4 = !__instance.OnlyServer || Overrides.EffectiveServer(flag && ZNet.instance.IsServer()); if (num2 && flag3 && flag4) { __result = true; } } } [HarmonyPatch(typeof(ConsoleCommand), "ShowCommand")] public static class ShowCommandPatch { private static void Postfix(ConsoleCommand __instance, ref bool __result) { if (!__result && (!__instance.IsSecret || Overrides.Secret) && ((Object.op_Implicit((Object)(object)ZNet.instance) && ZNet.instance.LocalPlayerIsAdminOrHost()) || Overrides.Secret)) { __result = true; } } } [HarmonyPatch(typeof(Terminal), "TryRunCommand")] public static class TryRunCommandPatch { private static bool Prefix(Terminal __instance, string text, bool silentFail) { string text2 = text.Split(' ')[0].ToLower(); if (!Helpers.GetCommands().TryGetValue(text2, out var value)) { return true; } if (value.IsValid(__instance, false)) { return true; } if (silentFail) { return true; } bool flag = Object.op_Implicit((Object)(object)ZNet.instance); bool val2 = flag && ZNet.instance.IsServer(); bool val3 = flag && ZNet.instance.LocalPlayerIsAdminOrHost(); bool val4 = __instance.IsCheatsEnabled(); __instance.AddString("<color=#ff6666>'" + text2 + "' failed validation. Diagnostics:</color>"); __instance.AddString(" " + CV("IsCheat", value.IsCheat, needsTrue: false) + " " + CV("IsCheatsEnabled", val4, needsTrue: true)); __instance.AddString(" " + CV("OnlyServer", value.OnlyServer, needsTrue: false) + " " + CV("IsServer", val2, needsTrue: true)); __instance.AddString(" " + CV("OnlyAdmin", value.OnlyAdmin, needsTrue: false) + " " + CV("IsAdmin", val3, needsTrue: true)); __instance.AddString(" " + CV("IsNetwork", value.IsNetwork, needsTrue: false) + " " + CV("HasZNet", flag, needsTrue: true)); __instance.AddString(" " + CV("RemoteCommand", value.RemoteCommand, needsTrue: false)); __instance.AddString(" " + CV("IsSecret", value.IsSecret, needsTrue: false)); __instance.AddString("Tip: use <color=#ffff88>flags [flag]</color> to toggle overrides."); return false; static string CV(string label, bool val, bool needsTrue) { string arg = ((val == needsTrue) ? "#aaffaa" : "#ff6666"); return $"<color={arg}>{label}={val}</color>"; } } } public static class ModSync { private static Terminal _pendingContext; public static void Register() { ZRoutedRpc.instance.Register("HelpDesk_RequestMods", (Action<long>)OnRequestMods); ZRoutedRpc.instance.Register<string>("HelpDesk_ReceiveMods", (Action<long, string>)OnReceiveMods); ZRoutedRpc.instance.Register<long>("HelpDesk_RequestClientMods", (Action<long, long>)OnRequestClientMods); ZRoutedRpc.instance.Register<string, string>("HelpDesk_ReceiveClientMods", (Action<long, string, string>)OnReceiveClientMods); } private static void OnRequestMods(long sender) { if (ZNet.instance.IsServer()) { ZRoutedRpc.instance.InvokeRoutedRPC(sender, "HelpDesk_ReceiveMods", new object[1] { BuildModString() }); ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "HelpDesk_RequestClientMods", new object[1] { sender }); } } private static void OnReceiveMods(long sender, string data) { if (!((Object)(object)_pendingContext == (Object)null)) { PrintModList(_pendingContext, "Server", data); } } private static void OnRequestClientMods(long sender, long requesterPeerID) { if (!((Object)(object)ZNet.instance == (Object)null) && !ZNet.instance.IsServer() && ZNet.GetUID() != requesterPeerID) { string text = (((Object)(object)Player.m_localPlayer != (Object)null) ? Player.m_localPlayer.GetPlayerName() : "Unknown"); ZRoutedRpc.instance.InvokeRoutedRPC(requesterPeerID, "HelpDesk_ReceiveClientMods", new object[2] { text, BuildModString() }); } } private static void OnReceiveClientMods(long sender, string playerName, string data) { if (!((Object)(object)_pendingContext == (Object)null)) { PrintModList(_pendingContext, playerName, data); } } private static void PrintModList(Terminal context, string label, string data) { string[] array = data.Split('\n'); context.AddString(string.Format("<color={0}>--- {1} mods ({2}) ---</color>", "#aaffaa", label, array.Length)); string[] array2 = array; for (int i = 0; i < array2.Length; i++) { string[] array3 = array2[i].Split('|'); if (array3.Length == 3) { context.AddString(" <color=#aaffaa>" + array3[0] + "</color> <color=#ffff88>v" + array3[1] + "</color> <color=#888888>" + array3[2] + "</color>"); } } } public static string BuildModString() { List<string> list = new List<string>(); foreach (PluginInfo value in Chainloader.PluginInfos.Values) { list.Add($"{value.Metadata.Name}|{value.Metadata.Version}|{value.Metadata.GUID}"); } return string.Join("\n", list); } public static void RequestFromServer(Terminal context) { _pendingContext = context; ZRoutedRpc.instance.InvokeRoutedRPC("HelpDesk_RequestMods", Array.Empty<object>()); } } public static class PingManager { private static FieldInfo _peersField; private static Terminal _pendingContext; private static long _requesterPeerID; private static readonly Dictionary<long, long> _probeTimestamps = new Dictionary<long, long>(); private static readonly Dictionary<long, long> _results = new Dictionary<long, long>(); private static List<ZNetPeer> _probedPeers = new List<ZNetPeer>(); private static float _elapsed; private static bool _waiting; private const float Timeout = 3f; public static void Register() { ZRoutedRpc.instance.Register("HelpDesk_RequestPing", (Action<long>)OnRequestPing); ZRoutedRpc.instance.Register("HelpDesk_PingProbe", (Action<long>)OnPingProbe); ZRoutedRpc.instance.Register("HelpDesk_PingPong", (Action<long>)OnPingPong); ZRoutedRpc.instance.Register<string>("HelpDesk_PingResults", (Action<long, string>)OnPingResults); } private static List<ZNetPeer> GetPeers() { if (_peersField == null) { _peersField = typeof(ZRoutedRpc).GetField("m_peers", BindingFlags.Instance | BindingFlags.NonPublic); } return (List<ZNetPeer>)_peersField.GetValue(ZRoutedRpc.instance); } public static void RequestPings(Terminal context) { _pendingContext = context; ZRoutedRpc.instance.InvokeRoutedRPC("HelpDesk_RequestPing", Array.Empty<object>()); } public static void RunPingsLocally(Terminal context) { StartProbing(context, 0L); } private static void OnRequestPing(long sender) { if (ZNet.instance.IsServer()) { StartProbing(null, sender); } } private static void StartProbing(Terminal context, long requesterPeerID) { _pendingContext = context; _requesterPeerID = requesterPeerID; _probeTimestamps.Clear(); _results.Clear(); _probedPeers = new List<ZNetPeer>(); _elapsed = 0f; _waiting = true; foreach (ZNetPeer peer in GetPeers()) { if (peer.IsReady()) { _probeTimestamps[peer.m_uid] = DateTime.UtcNow.Ticks; _probedPeers.Add(peer); ZRoutedRpc.instance.InvokeRoutedRPC(peer.m_uid, "HelpDesk_PingProbe", Array.Empty<object>()); } } if (_probedPeers.Count == 0) { FlushResults(); } } private static void OnPingProbe(long sender) { ZRoutedRpc.instance.InvokeRoutedRPC("HelpDesk_PingPong", Array.Empty<object>()); } private static void OnPingPong(long sender) { if (_waiting) { if (_probeTimestamps.TryGetValue(sender, out var value)) { _results[sender] = (DateTime.UtcNow.Ticks - value) / 10000; } if (_results.Count >= _probedPeers.Count) { FlushResults(); } } } public static void OnUpdate() { if (_waiting) { _elapsed += Time.deltaTime; if (_elapsed >= 3f) { FlushResults(); } } } private static void FlushResults() { if (!_waiting) { return; } _waiting = false; List<string> list = new List<string>(); foreach (ZNetPeer probedPeer in _probedPeers) { string text = ((probedPeer.m_playerName.Length > 0) ? probedPeer.m_playerName : $"uid:{probedPeer.m_uid}"); long value; string text2 = (_results.TryGetValue(probedPeer.m_uid, out value) ? value.ToString() : "timeout"); list.Add(text + "|" + text2); } string text3 = string.Join("\n", list); if (_requesterPeerID != 0L) { ZRoutedRpc.instance.InvokeRoutedRPC(_requesterPeerID, "HelpDesk_PingResults", new object[1] { text3 }); } else { PrintResults(_pendingContext, text3); } _pendingContext = null; } private static void OnPingResults(long sender, string data) { if (!((Object)(object)_pendingContext == (Object)null)) { PrintResults(_pendingContext, data); _pendingContext = null; } } public static void PrintResults(Terminal context, string data) { if ((Object)(object)context == (Object)null) { return; } if (string.IsNullOrEmpty(data)) { context.AddString("No connected peers."); return; } context.AddString("<color=#aaffaa>--- Ping results ---</color>"); string[] array = data.Split('\n'); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split('|'); if (array2.Length == 2) { bool num = array2[1] == "timeout"; string text = (num ? "#ff6666" : "#aaffaa"); string text2 = (num ? "timeout" : (array2[1] + "ms")); context.AddString(" <color=#aaffaa>" + array2[0] + "</color> <color=" + text + ">" + text2 + "</color>"); } } } } [HarmonyPatch(typeof(ZNet), "Start")] public static class ZNetStartPatch { private static void Postfix() { ModSync.Register(); PingManager.Register(); } } [HarmonyPatch(typeof(ZNet), "Update")] public static class ZNetUpdatePatch { private static void Postfix() { PingManager.OnUpdate(); } } [HarmonyPatch(typeof(Terminal), "InitTerminal")] public static class CommandRegistration { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static ConsoleEvent <>9__0_0; public static ConsoleOptionsFetcher <>9__0_1; public static ConsoleEvent <>9__0_2; public static ConsoleEvent <>9__0_3; public static ConsoleEvent <>9__0_4; internal void <Postfix>b__0_0(ConsoleEventArgs args) { if (args.Length < 2) { Overrides.PrintStatus(args.Context); return; } string text = args[1].ToLower(); switch (text) { case "cheats": case "cheat": Overrides.Cheats = !Overrides.Cheats; args.Context.AddString(string.Format("Cheats override: <color={0}>{1}</color>", Overrides.Cheats ? "#aaffaa" : "#ff6666", Overrides.Cheats)); break; case "server": Overrides.Server = !Overrides.Server; args.Context.AddString(string.Format("Server override: <color={0}>{1}</color>", Overrides.Server ? "#aaffaa" : "#ff6666", Overrides.Server)); break; case "network": Overrides.Network = !Overrides.Network; args.Context.AddString(string.Format("Network override: <color={0}>{1}</color>", Overrides.Network ? "#aaffaa" : "#ff6666", Overrides.Network)); break; case "secret": Overrides.Secret = !Overrides.Secret; args.Context.AddString(string.Format("Secret override: <color={0}>{1}</color>", Overrides.Secret ? "#aaffaa" : "#ff6666", Overrides.Secret)); break; case "all": { bool num = Overrides.Cheats && Overrides.Server && Overrides.Network && Overrides.Secret; Overrides.Cheats = !num; Overrides.Server = !num; Overrides.Network = !num; Overrides.Secret = !num; string text2 = ((!num) ? "<color=#aaffaa>ON</color>" : "<color=#ff6666>OFF</color>"); args.Context.AddString("All overrides: " + text2); break; } case "reset": case "off": Overrides.Cheats = false; Overrides.Server = false; Overrides.Network = false; Overrides.Secret = false; args.Context.AddString("All overrides: <color=#ff6666>OFF</color>"); break; default: args.Context.AddString("Unknown flag '" + text + "'. Use: cheats, server, network, secret, all, off"); break; } Helpers.UpdateCommandList(args.Context); } internal List<string> <Postfix>b__0_1() { return new List<string> { "cheats", "server", "network", "secret", "all", "off" }; } internal void <Postfix>b__0_2(ConsoleEventArgs args) { bool flag = Object.op_Implicit((Object)(object)ZNet.instance); bool real = flag && ZNet.instance.IsServer(); bool real2 = flag && ZNet.instance.LocalPlayerIsAdminOrHost(); bool real3 = args.Context.IsCheatsEnabled(); List<string> list = new List<string>(); List<string> list2 = new List<string>(); foreach (KeyValuePair<string, ConsoleCommand> command in Helpers.GetCommands()) { ConsoleCommand value = command.Value; if (!(value.Command == "help")) { List<string> list3 = new List<string>(); if (value.IsCheat) { list3.Add(Overrides.FormatStatus("cheat", real3, Overrides.Cheats)); } if (value.OnlyServer) { list3.Add(Overrides.FormatStatus("server", real, Overrides.Server)); } if (value.OnlyAdmin) { list3.Add(Overrides.FormatStatus("admin", real2, forced: false)); } if (value.IsNetwork) { list3.Add(Overrides.FormatStatus("network", flag, Overrides.Network)); } if (value.RemoteCommand) { list3.Add("<color=#aaffaa>remote</color>"); } if (value.IsSecret) { list3.Add(Overrides.FormatStatus("secret", real: false, Overrides.Secret)); } string text = ((list3.Count > 0) ? (" [" + string.Join(", ", list3) + "]") : ""); string item = value.Command + " - " + value.Description + text; if (value.IsValid(args.Context, false)) { list.Add(item); } else { list2.Add(item); } } } list.Sort(); list2.Sort(); args.Context.AddString(string.Format("<color={0}>--- Allowed ({1}) ---</color>", "#aaffaa", list.Count)); foreach (string item2 in list) { args.Context.AddString(" " + item2); } if (list2.Count > 0) { args.Context.AddString(string.Format("<color={0}>--- Blocked ({1}) ---</color>", "#ff6666", list2.Count)); foreach (string item3 in list2) { args.Context.AddString(" " + item3); } } args.Context.AddString(""); args.Context.AddString("Context: " + Overrides.FormatFlag("cheats", real3, Overrides.Cheats) + ", " + Overrides.FormatFlag("server", real, Overrides.Server)); } internal void <Postfix>b__0_3(ConsoleEventArgs args) { if ((Object)(object)ZNet.instance == (Object)null) { args.Context.AddString("Not connected."); return; } args.Context.AddString("<color=#ffff88>Pinging all peers...</color>"); if (ZNet.instance.IsServer()) { PingManager.RunPingsLocally(args.Context); } else { PingManager.RequestPings(args.Context); } } internal void <Postfix>b__0_4(ConsoleEventArgs args) { Dictionary<string, PluginInfo> pluginInfos = Chainloader.PluginInfos; args.Context.AddString(string.Format("<color={0}>--- Client mods ({1}) ---</color>", "#aaffaa", pluginInfos.Count)); foreach (KeyValuePair<string, PluginInfo> item in pluginInfos) { BepInPlugin metadata = item.Value.Metadata; args.Context.AddString(string.Format(" <color={0}>{1}</color> <color={2}>v{3}</color> <color=#888888>{4}</color>", "#aaffaa", metadata.Name, "#ffff88", metadata.Version, metadata.GUID)); } if (!((Object)(object)ZNet.instance == (Object)null)) { if (!ZNet.instance.IsServer()) { args.Context.AddString("<color=#ffff88>Requesting server mod list...</color>"); ModSync.RequestFromServer(args.Context); } else { args.Context.AddString("<color=#888888>(Host/server — server mods same as client)</color>"); } } } } private static void Postfix() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected O, but got Unknown object obj = <>c.<>9__0_0; if (obj == null) { ConsoleEvent val = delegate(ConsoleEventArgs args) { if (args.Length < 2) { Overrides.PrintStatus(args.Context); } else { string text2 = args[1].ToLower(); switch (text2) { case "cheats": case "cheat": Overrides.Cheats = !Overrides.Cheats; args.Context.AddString(string.Format("Cheats override: <color={0}>{1}</color>", Overrides.Cheats ? "#aaffaa" : "#ff6666", Overrides.Cheats)); break; case "server": Overrides.Server = !Overrides.Server; args.Context.AddString(string.Format("Server override: <color={0}>{1}</color>", Overrides.Server ? "#aaffaa" : "#ff6666", Overrides.Server)); break; case "network": Overrides.Network = !Overrides.Network; args.Context.AddString(string.Format("Network override: <color={0}>{1}</color>", Overrides.Network ? "#aaffaa" : "#ff6666", Overrides.Network)); break; case "secret": Overrides.Secret = !Overrides.Secret; args.Context.AddString(string.Format("Secret override: <color={0}>{1}</color>", Overrides.Secret ? "#aaffaa" : "#ff6666", Overrides.Secret)); break; case "all": { bool num = Overrides.Cheats && Overrides.Server && Overrides.Network && Overrides.Secret; Overrides.Cheats = !num; Overrides.Server = !num; Overrides.Network = !num; Overrides.Secret = !num; string text3 = ((!num) ? "<color=#aaffaa>ON</color>" : "<color=#ff6666>OFF</color>"); args.Context.AddString("All overrides: " + text3); break; } case "reset": case "off": Overrides.Cheats = false; Overrides.Server = false; Overrides.Network = false; Overrides.Secret = false; args.Context.AddString("All overrides: <color=#ff6666>OFF</color>"); break; default: args.Context.AddString("Unknown flag '" + text2 + "'. Use: cheats, server, network, secret, all, off"); break; } Helpers.UpdateCommandList(args.Context); } }; <>c.<>9__0_0 = val; obj = (object)val; } object obj2 = <>c.<>9__0_1; if (obj2 == null) { ConsoleOptionsFetcher val2 = () => new List<string> { "cheats", "server", "network", "secret", "all", "off" }; <>c.<>9__0_1 = val2; obj2 = (object)val2; } new ConsoleCommand("flags", "[flag] toggle overrides: cheats, server, network, secret. No args = show status.", (ConsoleEvent)obj, false, false, false, false, false, (ConsoleOptionsFetcher)obj2, false, false, false); object obj3 = <>c.<>9__0_2; if (obj3 == null) { ConsoleEvent val3 = delegate(ConsoleEventArgs args) { bool flag = Object.op_Implicit((Object)(object)ZNet.instance); bool real = flag && ZNet.instance.IsServer(); bool real2 = flag && ZNet.instance.LocalPlayerIsAdminOrHost(); bool real3 = args.Context.IsCheatsEnabled(); List<string> list = new List<string>(); List<string> list2 = new List<string>(); foreach (KeyValuePair<string, ConsoleCommand> command in Helpers.GetCommands()) { ConsoleCommand value = command.Value; if (!(value.Command == "help")) { List<string> list3 = new List<string>(); if (value.IsCheat) { list3.Add(Overrides.FormatStatus("cheat", real3, Overrides.Cheats)); } if (value.OnlyServer) { list3.Add(Overrides.FormatStatus("server", real, Overrides.Server)); } if (value.OnlyAdmin) { list3.Add(Overrides.FormatStatus("admin", real2, forced: false)); } if (value.IsNetwork) { list3.Add(Overrides.FormatStatus("network", flag, Overrides.Network)); } if (value.RemoteCommand) { list3.Add("<color=#aaffaa>remote</color>"); } if (value.IsSecret) { list3.Add(Overrides.FormatStatus("secret", real: false, Overrides.Secret)); } string text = ((list3.Count > 0) ? (" [" + string.Join(", ", list3) + "]") : ""); string item = value.Command + " - " + value.Description + text; if (value.IsValid(args.Context, false)) { list.Add(item); } else { list2.Add(item); } } } list.Sort(); list2.Sort(); args.Context.AddString(string.Format("<color={0}>--- Allowed ({1}) ---</color>", "#aaffaa", list.Count)); foreach (string item2 in list) { args.Context.AddString(" " + item2); } if (list2.Count > 0) { args.Context.AddString(string.Format("<color={0}>--- Blocked ({1}) ---</color>", "#ff6666", list2.Count)); foreach (string item3 in list2) { args.Context.AddString(" " + item3); } } args.Context.AddString(""); args.Context.AddString("Context: " + Overrides.FormatFlag("cheats", real3, Overrides.Cheats) + ", " + Overrides.FormatFlag("server", real, Overrides.Server)); }; <>c.<>9__0_2 = val3; obj3 = (object)val3; } new ConsoleCommand("help", "Shows all console commands with permission status", (ConsoleEvent)obj3, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); object obj4 = <>c.<>9__0_3; if (obj4 == null) { ConsoleEvent val4 = delegate(ConsoleEventArgs args) { if ((Object)(object)ZNet.instance == (Object)null) { args.Context.AddString("Not connected."); } else { args.Context.AddString("<color=#ffff88>Pinging all peers...</color>"); if (ZNet.instance.IsServer()) { PingManager.RunPingsLocally(args.Context); } else { PingManager.RequestPings(args.Context); } } }; <>c.<>9__0_3 = val4; obj4 = (object)val4; } new ConsoleCommand("ping", "Measure ping to all connected clients", (ConsoleEvent)obj4, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); object obj5 = <>c.<>9__0_4; if (obj5 == null) { ConsoleEvent val5 = delegate(ConsoleEventArgs args) { Dictionary<string, PluginInfo> pluginInfos = Chainloader.PluginInfos; args.Context.AddString(string.Format("<color={0}>--- Client mods ({1}) ---</color>", "#aaffaa", pluginInfos.Count)); foreach (KeyValuePair<string, PluginInfo> item4 in pluginInfos) { BepInPlugin metadata = item4.Value.Metadata; args.Context.AddString(string.Format(" <color={0}>{1}</color> <color={2}>v{3}</color> <color=#888888>{4}</color>", "#aaffaa", metadata.Name, "#ffff88", metadata.Version, metadata.GUID)); } if (!((Object)(object)ZNet.instance == (Object)null)) { if (!ZNet.instance.IsServer()) { args.Context.AddString("<color=#ffff88>Requesting server mod list...</color>"); ModSync.RequestFromServer(args.Context); } else { args.Context.AddString("<color=#888888>(Host/server — server mods same as client)</color>"); } } }; <>c.<>9__0_4 = val5; obj5 = (object)val5; } new ConsoleCommand("mods", "List loaded BepInEx mods on client and server", (ConsoleEvent)obj5, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false); } } [BepInPlugin("helpdesk", "HelpDesk", "1.0.2")] public class Plugin : BaseUnityPlugin { public const string PluginGUID = "helpdesk"; public const string PluginName = "HelpDesk"; public const string PluginVersion = "1.0.2"; internal static ManualLogSource Log; private Harmony _harmony; private void Awake() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; _harmony = new Harmony("helpdesk"); _harmony.PatchAll(); Log.LogInfo((object)"HelpDesk v1.0.2 loaded."); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } }