Decompiled source of Stop Time v0.1.4

plugins\A2.StopTime.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
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.1.4.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.4.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.1.4";

	public const string PluginFullVersion = "0.1.4.0";
}
namespace System.Runtime.CompilerServices
{
	[EditorBrowsable(EditorBrowsableState.Never)]
	internal static class IsExternalInit
	{
	}
}
namespace A2.StopTime
{
	[BepInPlugin("A2.StopTime", "Stop Time", "0.1.4")]
	[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 <ClientReceiveTimeResume>d__14 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ClientReceiveTimeResume>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 <ClientReceiveTimeStop>d__13 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ClientReceiveTimeStop>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 <ServerReceiveTimeResume>d__12 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public long sender;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ServerReceiveTimeResume>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 <ServerReceiveTimeStop>d__11 : IEnumerator<object>, IDisposable, IEnumerator
		{
			private int <>1__state;

			private object <>2__current;

			public long sender;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <ServerReceiveTimeStop>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<bool>? 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<bool>("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<ZNetPeer> 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<ZNetPeer> 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(<ServerReceiveTimeStop>d__11))]
		private static IEnumerator ServerReceiveTimeStop(long sender, ZPackage package)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ServerReceiveTimeStop>d__11(0)
			{
				sender = sender
			};
		}

		[IteratorStateMachine(typeof(<ServerReceiveTimeResume>d__12))]
		private static IEnumerator ServerReceiveTimeResume(long sender, ZPackage package)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ServerReceiveTimeResume>d__12(0)
			{
				sender = sender
			};
		}

		[IteratorStateMachine(typeof(<ClientReceiveTimeStop>d__13))]
		private static IEnumerator ClientReceiveTimeStop(long sender, ZPackage package)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ClientReceiveTimeStop>d__13(0);
		}

		[IteratorStateMachine(typeof(<ClientReceiveTimeResume>d__14))]
		private static IEnumerator ClientReceiveTimeResume(long sender, ZPackage package)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <ClientReceiveTimeResume>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<ZNetPeer> 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<ZNetPeer> 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<ZNetPeer> 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<ZNetPeer> 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<ZNetPeer> 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<ZNetPeer> 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);
			}
		}
	}
}