using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using A2.StopTime.Commands; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Stop Time")] [assembly: AssemblyDescription("Allows you to break the laws of the universe and stop the flow of time.")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Stop Time")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7a21f3ee-a897-0940-f735-5e60a11c218f")] [assembly: AssemblyFileVersion("0.2.2.0")] [assembly: AssemblyVersion("0.2.2.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.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; } } } internal static class PluginInfo { public const string PluginGUID = "A2.StopTime"; public const string PluginName = "Stop Time"; public const string PluginDescription = "Allows you to break the laws of the universe and stop the flow of time."; public const string PluginSemanticVersion = "0.2.2"; public const string PluginFullVersion = "0.2.2.0"; } namespace A2.StopTime { [BepInPlugin("A2.StopTime", "Stop Time", "0.2.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] internal class Plugin : BaseUnityPlugin { [CompilerGenerated] private static class <>O { public static EventHandler <0>__OnIsTimeStoppedChanged; public static CoroutineHandler <1>__ServerReceiveTimeStop; public static CoroutineHandler <2>__ClientReceiveTimeStop; public static CoroutineHandler <3>__ServerReceiveTimeResume; public static CoroutineHandler <4>__ClientReceiveTimeResume; } [CompilerGenerated] private sealed class d__14 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__14(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; Console.instance.Print("Time resume command received from server."); <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; CommandUsed = true; IsTimeStopped = false; <>2__current = null; <>1__state = 2; return true; case 2: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__13 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; Console.instance.Print("Time stop command received from server."); <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; CommandUsed = true; IsTimeStopped = true; <>2__current = null; <>1__state = 2; return true; case 2: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__12 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public long sender; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; Console.instance.Print("Time resume command received from client."); <>2__current = null; <>1__state = 1; return true; case 1: { <>1__state = -1; ZNetPeer peer = ZNet.instance.GetPeer(sender); if (!ZNet.instance.IsAdmin(peer.m_socket.GetHostName())) { ZNet.instance.RemotePrint(peer.m_rpc, "You are not admin"); } else { IsTimeStopped = false; } <>2__current = null; <>1__state = 2; return true; } case 2: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__11 : IEnumerator, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public long sender; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; Console.instance.Print("Time stop command received from client."); <>2__current = null; <>1__state = 1; return true; case 1: { <>1__state = -1; ZNetPeer peer = ZNet.instance.GetPeer(sender); if (!ZNet.instance.IsAdmin(peer.m_socket.GetHostName())) { ZNet.instance.RemotePrint(peer.m_rpc, "You are not admin"); } else { IsTimeStopped = true; } <>2__current = null; <>1__state = 2; return true; } case 2: <>1__state = -1; return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static readonly Harmony _harmony = new Harmony("A2.StopTime"); private static ConfigEntry? IsTimeStopped_ConfigEntry; internal static bool CommandUsed = false; private static CustomRPC? TimeStopRPC; private static CustomRPC? TimeResumeRPC; internal static bool IsTimeStopped { get { if (IsTimeStopped_ConfigEntry == null) { return false; } return IsTimeStopped_ConfigEntry.Value; } set { if (IsTimeStopped_ConfigEntry != null) { IsTimeStopped_ConfigEntry.Value = value; } } } public void Awake() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Expected O, but got Unknown //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown ConfigurationManagerAttributes val = new ConfigurationManagerAttributes { IsAdminOnly = true }; IsTimeStopped_ConfigEntry = ((BaseUnityPlugin)this).Config.Bind("Stop time", "StopTime", false, new ConfigDescription("Stops the flow of time.", (AcceptableValueBase)null, new object[1] { val })); IsTimeStopped_ConfigEntry.SettingChanged += OnIsTimeStoppedChanged; NetworkManager instance = NetworkManager.Instance; object obj = <>O.<1>__ServerReceiveTimeStop; if (obj == null) { CoroutineHandler val2 = ServerReceiveTimeStop; <>O.<1>__ServerReceiveTimeStop = val2; obj = (object)val2; } object obj2 = <>O.<2>__ClientReceiveTimeStop; if (obj2 == null) { CoroutineHandler val3 = ClientReceiveTimeStop; <>O.<2>__ClientReceiveTimeStop = val3; obj2 = (object)val3; } TimeStopRPC = instance.AddRPC("TimeStopRPC", (CoroutineHandler)obj, (CoroutineHandler)obj2); NetworkManager instance2 = NetworkManager.Instance; object obj3 = <>O.<3>__ServerReceiveTimeResume; if (obj3 == null) { CoroutineHandler val4 = ServerReceiveTimeResume; <>O.<3>__ServerReceiveTimeResume = val4; obj3 = (object)val4; } object obj4 = <>O.<4>__ClientReceiveTimeResume; if (obj4 == null) { CoroutineHandler val5 = ClientReceiveTimeResume; <>O.<4>__ClientReceiveTimeResume = val5; obj4 = (object)val5; } TimeResumeRPC = instance2.AddRPC("TimeResumeRPC", (CoroutineHandler)obj3, (CoroutineHandler)obj4); CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new TimeStopCommand()); CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new TimeResumeCommand()); _harmony.PatchAll(); } internal static void TimeStopRPCSendPackage(List peers) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (TimeStopRPC != null) { TimeStopRPC.SendPackage(peers, new ZPackage()); } } internal static void TimeResumeRPCSendPackage(List peers) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (TimeResumeRPC != null) { TimeResumeRPC.SendPackage(peers, new ZPackage()); } } [IteratorStateMachine(typeof(d__11))] private static IEnumerator ServerReceiveTimeStop(long sender, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__11(0) { sender = sender }; } [IteratorStateMachine(typeof(d__12))] private static IEnumerator ServerReceiveTimeResume(long sender, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__12(0) { sender = sender }; } [IteratorStateMachine(typeof(d__13))] private static IEnumerator ClientReceiveTimeStop(long sender, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__13(0); } [IteratorStateMachine(typeof(d__14))] private static IEnumerator ClientReceiveTimeResume(long sender, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__14(0); } private static void OnIsTimeStoppedChanged(object sender, EventArgs args) { if (IsTimeStopped) { Console.instance.Print("Time stopped."); } else { Console.instance.Print("Time resumed."); } if (CommandUsed) { CommandUsed = false; } else if (ZNet.instance.IsServer()) { List list = ZNet.instance.m_peers.Where((ZNetPeer x) => !x.m_server).ToList(); if (IsTimeStopped) { Console.instance.Print($"Sending timestop command to clients. Targets: {list.Count}"); TimeStopRPCSendPackage(list); } else { Console.instance.Print($"Sending timeresume command to clients. Targets: {list.Count}"); TimeResumeRPCSendPackage(list); } } else { List list2 = ZNet.instance.m_peers.Where((ZNetPeer x) => x.m_server).ToList(); if (IsTimeStopped) { Console.instance.Print($"Sending timestop command to server. Targets: {list2.Count}"); TimeStopRPCSendPackage(list2); } else { Console.instance.Print($"Sending timeresume command to server. Targets: {list2.Count}"); TimeResumeRPCSendPackage(list2); } } } public void OnDestroy() { _harmony.UnpatchSelf(); } } } namespace A2.StopTime.Patches { public static class ZNetPatch { [HarmonyPatch(typeof(ZNet), "UpdateNetTime")] public static class InputText { public static bool Prefix(ZNet __instance, float dt) { return !Plugin.IsTimeStopped; } } } } namespace A2.StopTime.Commands { public class TimeResumeCommand : ConsoleCommand { public override string Name => "timeresume"; public override string Help => "Resumes the flow of time."; public override bool IsCheat => true; public override bool IsNetwork => true; public override bool IsSecret => false; public override bool OnlyServer => false; public override void Run(string[] args) { if (!SynchronizationManager.Instance.PlayerIsAdmin) { Console.instance.Print("You must be an admin to use this command."); return; } Plugin.CommandUsed = true; if (ZNet.instance.IsServer()) { List list = ZNet.instance.m_peers.Where((ZNetPeer x) => !x.m_server).ToList(); Console.instance.Print($"Sending timeresume command to clients. Targets: {list.Count}"); Plugin.TimeResumeRPCSendPackage(list); Plugin.IsTimeStopped = false; } else { List list2 = ZNet.instance.m_peers.Where((ZNetPeer x) => x.m_server).ToList(); Console.instance.Print($"Sending timeresume command to server. Targets: {list2.Count}"); Plugin.TimeResumeRPCSendPackage(list2); } } } internal class TimeStopCommand : ConsoleCommand { public override string Name => "timestop"; public override string Help => "Stops the flow of time."; public override bool IsCheat => true; public override bool IsNetwork => true; public override bool IsSecret => false; public override bool OnlyServer => false; public override void Run(string[] args) { if (!SynchronizationManager.Instance.PlayerIsAdmin) { Console.instance.Print("You must be an admin to use this command."); return; } Plugin.CommandUsed = true; if (ZNet.instance.IsServer()) { List list = ZNet.instance.m_peers.Where((ZNetPeer x) => !x.m_server).ToList(); Console.instance.Print($"Sending timestop command to clients. Targets: {list.Count}"); Plugin.TimeStopRPCSendPackage(list); Plugin.IsTimeStopped = true; } else { List list2 = ZNet.instance.m_peers.Where((ZNetPeer x) => x.m_server).ToList(); Console.instance.Print($"Sending timestop command to server. Targets: {list2.Count}"); Plugin.TimeStopRPCSendPackage(list2); } } } }