using 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();
}
}
}