Decompiled source of DioUck v1.0.0

BepInEx/plugins/Muck_TimeStop/Muck_TimeStop.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
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 HarmonyLib;
using Microsoft.CodeAnalysis;
using MuckTimeStop.Networking;
using MuckTimeStop.Patches;
using PacketHelper;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Rendering.PostProcessing;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.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;
		}
	}
}
namespace MuckTimeStop
{
	public static class AmbientParticleFreeze
	{
		private static readonly List<ParticleSystem> FrozenSystems = new List<ParticleSystem>();

		public static void Apply(bool frozen)
		{
			if (frozen)
			{
				FrozenSystems.Clear();
				ParticleSystem[] array = Object.FindObjectsOfType<ParticleSystem>();
				ParticleSystem[] array2 = array;
				foreach (ParticleSystem val in array2)
				{
					if (!((Object)(object)val == (Object)null) && val.isPlaying)
					{
						val.Pause(true);
						FrozenSystems.Add(val);
					}
				}
				return;
			}
			foreach (ParticleSystem frozenSystem in FrozenSystems)
			{
				if (!((Object)(object)frozenSystem == (Object)null))
				{
					frozenSystem.Play(true);
				}
			}
			FrozenSystems.Clear();
		}
	}
	public static class HostPermissions
	{
		private static readonly HashSet<int> AllowedClientIds = new HashSet<int>();

		public static bool IsAllowed(int clientId)
		{
			if (LocalClient.serverOwner && clientId == LocalClient.instance.myId)
			{
				return true;
			}
			return AllowedClientIds.Contains(clientId);
		}

		public static void Allow(int clientId)
		{
			AllowedClientIds.Add(clientId);
		}

		public static void Deny(int clientId)
		{
			AllowedClientIds.Remove(clientId);
		}
	}
	public static class MobFreeze
	{
		public static void Apply(bool frozen)
		{
			if ((Object)(object)MobManager.Instance == (Object)null || MobManager.Instance.mobs == null)
			{
				return;
			}
			foreach (Mob value in MobManager.Instance.mobs.Values)
			{
				if ((Object)(object)value == (Object)null)
				{
					continue;
				}
				if ((Object)(object)value.agent != (Object)null && value.agent.isOnNavMesh)
				{
					value.agent.isStopped = frozen;
					value.agent.updateRotation = !frozen;
				}
				if ((Object)(object)value.animator != (Object)null)
				{
					value.animator.speed = (frozen ? 0f : 1f);
				}
				AudioSource[] componentsInChildren = ((Component)value).GetComponentsInChildren<AudioSource>();
				AudioSource[] array = componentsInChildren;
				foreach (AudioSource val in array)
				{
					if (frozen)
					{
						val.Pause();
					}
					else
					{
						val.UnPause();
					}
				}
			}
		}
	}
	public static class ModTick
	{
		public static void Tick()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if (Input.GetKeyDown(Plugin.PauseKey.Value))
			{
				PauseController.LocalKeyPressed();
			}
			if (LocalClient.serverOwner && PauseState.IsPaused && Time.realtimeSinceStartup >= PauseState.PauseEndsAtRealtime)
			{
				PauseController.ResumeFromHost();
			}
			if (PauseState.IsPaused)
			{
				MobFreeze.Apply(frozen: true);
			}
			PauseEffects.Tick();
			PinkBubble.Tick();
			PauseAudio.Tick();
		}
	}
	public static class PauseAudio
	{
		private class PendingLoad
		{
			public UnityWebRequest Request;

			public UnityWebRequestAsyncOperation Operation;

			public string Name;

			public Action<AudioClip> OnLoaded;
		}

		private static readonly List<PendingLoad> Pending = new List<PendingLoad>();

		private static AudioClip _pauseClip;

		private static AudioClip _resumeClip;

		private static bool _pausePlayRequested;

		private static bool _resumePlayRequested;

		private static bool _loadStarted;

		private static AudioSource _audioSource;

		public static void LoadClips()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (_loadStarted)
			{
				return;
			}
			_loadStarted = true;
			GameObject val = new GameObject("MuckTimeStopAudio");
			Object.DontDestroyOnLoad((Object)(object)val);
			_audioSource = val.AddComponent<AudioSource>();
			_audioSource.spatialBlend = 0f;
			_audioSource.playOnAwake = false;
			StartLoad("pause", "MuckTimeStop.Resources.pause_sfx.mp3", delegate(AudioClip clip)
			{
				_pauseClip = clip;
				if (_pausePlayRequested)
				{
					_pausePlayRequested = false;
					PlayOneShot(clip);
				}
			});
			StartLoad("resume", "MuckTimeStop.Resources.resume_sfx.mp3", delegate(AudioClip clip)
			{
				_resumeClip = clip;
				if (_resumePlayRequested)
				{
					_resumePlayRequested = false;
					PlayOneShot(clip);
				}
			});
		}

		public static void Tick()
		{
			if (Pending.Count == 0)
			{
				return;
			}
			for (int num = Pending.Count - 1; num >= 0; num--)
			{
				PendingLoad pendingLoad = Pending[num];
				if (((AsyncOperation)pendingLoad.Operation).isDone)
				{
					if (!pendingLoad.Request.isNetworkError && !pendingLoad.Request.isHttpError)
					{
						Plugin.Log.LogInfo((object)("[PauseAudio] Loaded " + pendingLoad.Name + " clip successfully."));
						pendingLoad.OnLoaded(DownloadHandlerAudioClip.GetContent(pendingLoad.Request));
					}
					else
					{
						Plugin.Log.LogWarning((object)("[PauseAudio] Failed to load " + pendingLoad.Name + " clip: " + pendingLoad.Request.error));
					}
					pendingLoad.Request.Dispose();
					Pending.RemoveAt(num);
				}
			}
		}

		public static void PlayPause()
		{
			if ((Object)(object)_pauseClip != (Object)null)
			{
				PlayOneShot(_pauseClip);
			}
			else
			{
				_pausePlayRequested = true;
			}
		}

		public static void PlayResume()
		{
			if ((Object)(object)_resumeClip != (Object)null)
			{
				PlayOneShot(_resumeClip);
			}
			else
			{
				_resumePlayRequested = true;
			}
		}

		private static void PlayOneShot(AudioClip clip)
		{
			if (!((Object)(object)clip == (Object)null) && !((Object)(object)_audioSource == (Object)null))
			{
				_audioSource.PlayOneShot(clip);
			}
		}

		private static void StartLoad(string name, string resourceName, Action<AudioClip> onLoaded)
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			using Stream stream = executingAssembly.GetManifestResourceStream(resourceName);
			if (stream == null)
			{
				Plugin.Log.LogWarning((object)("[PauseAudio] Embedded resource not found: " + resourceName));
				return;
			}
			string text = Path.Combine(Path.GetTempPath(), Path.GetFileName(resourceName));
			using (FileStream destination = File.Create(text))
			{
				stream.CopyTo(destination);
			}
			UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip("file://" + text, (AudioType)13);
			UnityWebRequestAsyncOperation operation = audioClip.SendWebRequest();
			Pending.Add(new PendingLoad
			{
				Request = audioClip,
				Operation = operation,
				Name = name,
				OnLoaded = onLoaded
			});
		}
	}
	public static class PauseController
	{
		public static void LocalKeyPressed()
		{
			if (!((Object)(object)LocalClient.instance == (Object)null))
			{
				int myId = LocalClient.instance.myId;
				if (LocalClient.serverOwner)
				{
					HostHandleToggleRequest(myId);
				}
				else
				{
					PauseNetworking.SendToggleRequest();
				}
			}
		}

		public static void HostHandleToggleRequest(int senderClientId)
		{
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: 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_008b: Unknown result type (might be due to invalid IL or missing references)
			PlayerManager value;
			if (PauseState.IsPaused)
			{
				if (senderClientId == PauseState.CasterClientId)
				{
					ResumeFromHost();
				}
			}
			else if (HostPermissions.IsAllowed(senderClientId) && !PauseState.IsOnCooldown(senderClientId) && GameManager.players.TryGetValue(senderClientId, out value) && !((Object)(object)value == (Object)null))
			{
				int timeLimitSeconds = Mathf.CeilToInt(Plugin.PauseTimeLimitSeconds.Value);
				Vector3 position = ((Component)value).transform.position;
				ApplyStateChange(isPaused: true, senderClientId, position, timeLimitSeconds);
				PauseNetworking.BroadcastStateChanged(isPaused: true, senderClientId, position, timeLimitSeconds);
			}
		}

		public static void ResumeFromHost()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			int casterClientId = PauseState.CasterClientId;
			Vector3 casterPosition = PauseState.CasterPosition;
			PauseState.StartCooldown(casterClientId, Plugin.PauseCooldownSeconds.Value);
			ApplyStateChange(isPaused: false, casterClientId, casterPosition, 0);
			PauseNetworking.BroadcastStateChanged(isPaused: false, casterClientId, casterPosition, 0);
		}

		public static void ApplyStateChange(bool isPaused, int casterClientId, Vector3 casterPos, int timeLimitSeconds)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: 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)
			PauseState.IsPaused = isPaused;
			PauseState.CasterClientId = casterClientId;
			PauseState.CasterPosition = casterPos;
			if (isPaused)
			{
				PauseState.PauseEndsAtRealtime = Time.realtimeSinceStartup + (float)timeLimitSeconds;
			}
			PlayerFreeze.Apply();
			MobFreeze.Apply(isPaused);
			AmbientParticleFreeze.Apply(isPaused);
			if (isPaused)
			{
				PauseEffects.BeginPause();
				PinkBubble.Spawn(casterPos);
				PauseAudio.PlayPause();
			}
			else
			{
				PauseEffects.EndPause();
				MobDamageQueue.ReplayAndClear();
				PlayerDamageQueue.ReplayAndClear();
				PauseAudio.PlayResume();
			}
		}
	}
	public static class PauseEffects
	{
		private static ColorGrading _colorGrading;

		private static ChromaticAberration _chromaticAberration;

		private static bool _initialized;

		private static float _lerpT;

		private static bool _fadingIn;

		private const float FadeDuration = 0.4f;

		private static void EnsureInit()
		{
			if (_initialized || (Object)(object)PPController.Instance == (Object)null)
			{
				return;
			}
			PostProcessVolume component = ((Component)PPController.Instance).GetComponent<PostProcessVolume>();
			if (!((Object)(object)component == (Object)null) && !((Object)(object)component.profile == (Object)null))
			{
				PostProcessProfile profile = component.profile;
				_colorGrading = profile.GetSetting<ColorGrading>();
				if ((Object)(object)_colorGrading == (Object)null)
				{
					_colorGrading = profile.AddSettings<ColorGrading>();
				}
				((PostProcessEffectSettings)_colorGrading).active = true;
				((ParameterOverride<bool>)(object)((PostProcessEffectSettings)_colorGrading).enabled).value = true;
				((ParameterOverride)((PostProcessEffectSettings)_colorGrading).enabled).overrideState = true;
				((ParameterOverride)_colorGrading.saturation).overrideState = true;
				((ParameterOverride<float>)(object)_colorGrading.saturation).value = 0f;
				((ParameterOverride)_colorGrading.gradingMode).overrideState = false;
				_chromaticAberration = profile.GetSetting<ChromaticAberration>();
				if ((Object)(object)_chromaticAberration == (Object)null)
				{
					_chromaticAberration = profile.AddSettings<ChromaticAberration>();
				}
				((PostProcessEffectSettings)_chromaticAberration).active = true;
				((ParameterOverride)_chromaticAberration.intensity).overrideState = true;
				((ParameterOverride)((PostProcessEffectSettings)_chromaticAberration).enabled).overrideState = true;
				((ParameterOverride<float>)(object)_chromaticAberration.intensity).value = 0f;
				_initialized = true;
			}
		}

		public static void BeginPause()
		{
			EnsureInit();
			_fadingIn = true;
		}

		public static void EndPause()
		{
			EnsureInit();
			_fadingIn = false;
		}

		public static void Tick()
		{
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			EnsureInit();
			if (!((Object)(object)_colorGrading == (Object)null) && !((Object)(object)_chromaticAberration == (Object)null))
			{
				float num = (_fadingIn ? 1f : 0f);
				_lerpT = Mathf.MoveTowards(_lerpT, num, Time.unscaledDeltaTime / 0.4f);
				if (_lerpT > 0f)
				{
					((ParameterOverride)_colorGrading.gradingMode).overrideState = true;
					((ParameterOverride<GradingMode>)(object)_colorGrading.gradingMode).value = (GradingMode)0;
				}
				else
				{
					((ParameterOverride)_colorGrading.gradingMode).overrideState = false;
				}
				((ParameterOverride<float>)(object)_colorGrading.saturation).value = Mathf.Lerp(0f, -100f, _lerpT);
				((ParameterOverride<bool>)(object)((PostProcessEffectSettings)_chromaticAberration).enabled).value = _lerpT > 0f;
				((ParameterOverride<float>)(object)_chromaticAberration.intensity).value = Mathf.Lerp(0f, 1f, _lerpT);
			}
		}
	}
	public static class PauseState
	{
		public static bool IsPaused;

		public static int CasterClientId = -1;

		public static Vector3 CasterPosition;

		public static float PauseEndsAtRealtime;

		private static readonly Dictionary<int, float> CooldownEndsAtRealtime = new Dictionary<int, float>();

		public static bool IsOnCooldown(int clientId)
		{
			float value;
			return CooldownEndsAtRealtime.TryGetValue(clientId, out value) && Time.realtimeSinceStartup < value;
		}

		public static void StartCooldown(int clientId, float seconds)
		{
			CooldownEndsAtRealtime[clientId] = Time.realtimeSinceStartup + seconds;
		}
	}
	public static class PinkBubble
	{
		private static GameObject _bubble;

		private static Material _material;

		private static float _elapsed;

		private const float ExpandDuration = 0.4f;

		private const float MaxScale = 12f;

		public static void Spawn(Vector3 position)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_bubble != (Object)null)
			{
				Object.Destroy((Object)(object)_bubble);
			}
			_bubble = GameObject.CreatePrimitive((PrimitiveType)0);
			Object.Destroy((Object)(object)_bubble.GetComponent<Collider>());
			_bubble.transform.position = position;
			_bubble.transform.localScale = Vector3.zero;
			Renderer component = _bubble.GetComponent<Renderer>();
			_material = CreateBubbleMaterial();
			component.material = _material;
			_elapsed = 0f;
		}

		public static void Tick()
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_bubble == (Object)null))
			{
				_elapsed += Time.unscaledDeltaTime;
				float num = Mathf.Clamp01(_elapsed / 0.4f);
				_bubble.transform.localScale = Vector3.one * Mathf.Lerp(0f, 12f, num);
				if ((Object)(object)_material != (Object)null && _material.HasProperty("_Color"))
				{
					Color color = _material.color;
					color.a = Mathf.Lerp(0.6f, 0f, num);
					_material.color = color;
				}
				if (num >= 1f)
				{
					Object.Destroy((Object)(object)_bubble);
					_bubble = null;
					_material = null;
				}
			}
		}

		private static Material CreateBubbleMaterial()
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			string[] array = new string[3] { "UI/Default", "Sprites/Default", "Legacy Shaders/Transparent/Diffuse" };
			string[] array2 = array;
			foreach (string text in array2)
			{
				Shader val = Shader.Find(text);
				if (!((Object)(object)val == (Object)null))
				{
					Material val2 = new Material(val);
					if (val2.HasProperty("_Color"))
					{
						val2.color = new Color(1f, 0.2f, 0.8f, 0.6f);
					}
					Plugin.Log.LogInfo((object)("[PinkBubble] Using shader: " + text));
					return val2;
				}
			}
			Plugin.Log.LogWarning((object)"[PinkBubble] None of the candidate transparent shaders were found in the build - falling back to the primitive's default (opaque) material.");
			Material material = _bubble.GetComponent<Renderer>().material;
			if (material.HasProperty("_Color"))
			{
				material.color = new Color(1f, 0.2f, 0.8f, 1f);
			}
			return material;
		}
	}
	public static class PlayerFreeze
	{
		public static void Apply()
		{
			if (!((Object)(object)PlayerInput.Instance == (Object)null))
			{
				bool flag = (Object)(object)LocalClient.instance != (Object)null && LocalClient.instance.myId == PauseState.CasterClientId;
				PlayerInput.Instance.active = !PauseState.IsPaused || flag;
			}
		}
	}
	[BepInPlugin("com.paul.MuckTimeStop", "Muck Time Stop", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public static ConfigEntry<KeyCode> PauseKey;

		public static ConfigEntry<float> PauseTimeLimitSeconds;

		public static ConfigEntry<float> PauseCooldownSeconds;

		private Harmony _harmony;

		public static ManualLogSource Log { get; private set; }

		private void Awake()
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			PauseKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "PauseKey", (KeyCode)106, "Key used to toggle time stop.");
			PauseTimeLimitSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("General", "PauseTimeLimitSeconds", 30f, "Maximum seconds a time-stop lasts before auto-resuming.");
			PauseCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("General", "PauseCooldownSeconds", 5f, "Per-player cooldown in seconds after resuming before that player can cast again.");
			_harmony = new Harmony("com.paul.MuckTimeStop");
			_harmony.PatchAll();
			PauseAudio.LoadClips();
			Log.LogInfo((object)"Muck Time Stop loaded.");
		}
	}
}
namespace MuckTimeStop.Patches
{
	[HarmonyPatch(typeof(CauldronSync), "Update")]
	public static class CauldronFreezePatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch(typeof(FurnaceSync), "Update")]
	public static class FurnaceFreezePatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch(typeof(ChatBox), "SendMessage", new Type[] { typeof(string) })]
	public static class ChatCommandPatch
	{
		[HarmonyPostfix]
		private static void Postfix(ChatBox __instance, string message)
		{
			if (string.IsNullOrEmpty(message) || message[0] != '/' || !LocalClient.serverOwner)
			{
				return;
			}
			string[] array = message.Substring(1).Split(new char[1] { ' ' });
			if (array.Length < 2)
			{
				return;
			}
			string text = array[0].ToLower();
			if (text != "allow" && text != "deny")
			{
				return;
			}
			string b = array[1];
			foreach (KeyValuePair<int, PlayerManager> player in GameManager.players)
			{
				if ((Object)(object)player.Value == (Object)null || !string.Equals(player.Value.username, b, StringComparison.OrdinalIgnoreCase))
				{
					continue;
				}
				if (text == "allow")
				{
					HostPermissions.Allow(player.Key);
					__instance.AppendMessage(-1, "Allowed " + player.Value.username + " to use time stop.", "");
				}
				else
				{
					HostPermissions.Deny(player.Key);
					__instance.AppendMessage(-1, "Denied " + player.Value.username + " from using time stop.", "");
				}
				break;
			}
		}
	}
	[HarmonyPatch(typeof(DayCycle), "Update")]
	public static class DayCyclePatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch(typeof(Grass), "Awake")]
	public static class GrassDiagnosticPatch
	{
		private static bool _logged;

		[HarmonyPostfix]
		private static void Postfix(Grass __instance)
		{
			if (_logged)
			{
				return;
			}
			_logged = true;
			Renderer val = (((Object)(object)__instance.grass != (Object)null) ? __instance.grass.GetComponentInChildren<Renderer>() : null);
			if ((Object)(object)val == (Object)null || (Object)(object)val.sharedMaterial == (Object)null)
			{
				Plugin.Log.LogInfo((object)"[GrassDiagnostic] No renderer/material found on Grass.grass prefab.");
				return;
			}
			Material sharedMaterial = val.sharedMaterial;
			Shader shader = sharedMaterial.shader;
			Plugin.Log.LogInfo((object)("[GrassDiagnostic] Grass shader: " + ((Object)shader).name));
			string[] array = new string[12]
			{
				"_WindSpeed", "_WindStrength", "_WindIntensity", "_Wind", "_WindDirection", "_WindFrequency", "_SwaySpeed", "_SwayStrength", "_BendSpeed", "_BendStrength",
				"_ShiverSpeed", "_ShiverStrength"
			};
			bool flag = false;
			string[] array2 = array;
			foreach (string text in array2)
			{
				if (sharedMaterial.HasProperty(text))
				{
					flag = true;
					Plugin.Log.LogInfo((object)$"[GrassDiagnostic]   found property {text} = {sharedMaterial.GetFloat(text)}");
				}
			}
			if (!flag)
			{
				Plugin.Log.LogInfo((object)"[GrassDiagnostic] No common wind property name matched - sway is likely driven by a global (e.g. _Time) read in the shader with no per-material override.");
			}
		}
	}
	public static class MobDamageQueue
	{
		private class QueuedHit
		{
			public HitableMob Target;

			public int Damage;

			public float Sharpness;

			public int HitEffect;

			public Vector3 HitPos;

			public int HitWeaponType;
		}

		private static readonly List<QueuedHit> Queue = new List<QueuedHit>();

		public static void Enqueue(HitableMob target, int damage, float sharpness, int hitEffect, Vector3 hitPos, int hitWeaponType)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			Queue.Add(new QueuedHit
			{
				Target = target,
				Damage = damage,
				Sharpness = sharpness,
				HitEffect = hitEffect,
				HitPos = hitPos,
				HitWeaponType = hitWeaponType
			});
		}

		public static void ReplayAndClear()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			List<QueuedHit> list = new List<QueuedHit>(Queue);
			Queue.Clear();
			foreach (QueuedHit item in list)
			{
				if (!((Object)(object)item.Target == (Object)null))
				{
					((Hitable)item.Target).Hit(item.Damage, item.Sharpness, item.HitEffect, item.HitPos, item.HitWeaponType);
				}
			}
		}
	}
	[HarmonyPatch(typeof(HitableMob), "Hit")]
	public static class MobDamagePatch
	{
		[HarmonyPrefix]
		private static bool Prefix(HitableMob __instance, int damage, float sharpness, int hitEffect, Vector3 hitPos, int hitWeaponType)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if (!PauseState.IsPaused)
			{
				return true;
			}
			MobDamageQueue.Enqueue(__instance, damage, sharpness, hitEffect, hitPos, hitWeaponType);
			return false;
		}
	}
	[HarmonyPatch(typeof(Mob), "Update")]
	public static class MobUpdatePatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch(typeof(Mob), "LateUpdate")]
	public static class MobLateUpdatePatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch(typeof(MobServer), "Update")]
	public static class MobServerUpdatePatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch(typeof(MobServer), "SyncFindNextPosition")]
	public static class MobServerSyncFindNextPositionPatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch(typeof(Mob), "SetDestination")]
	public static class MobSetDestinationPatch
	{
		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	[HarmonyPatch]
	public static class MobServerBehaviourPatch
	{
		private static IEnumerable<MethodBase> TargetMethods()
		{
			Type[] types = typeof(MobServer).Assembly.GetTypes();
			foreach (Type type in types)
			{
				if (typeof(MobServer).IsAssignableFrom(type) && !(type == typeof(MobServer)))
				{
					MethodInfo method = type.GetMethod("Behaviour", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (method != null)
					{
						yield return method;
					}
				}
			}
		}

		[HarmonyPrefix]
		private static bool Prefix()
		{
			return !PauseState.IsPaused;
		}
	}
	public static class PlayerDamageQueue
	{
		private class QueuedHit
		{
			public HitableActor Target;

			public int Damage;

			public float Sharpness;

			public int HitEffect;

			public Vector3 Pos;

			public int HitWeaponType;
		}

		private static readonly List<QueuedHit> Queue = new List<QueuedHit>();

		public static void Enqueue(HitableActor target, int damage, float sharpness, int hitEffect, Vector3 pos, int hitWeaponType)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			Queue.Add(new QueuedHit
			{
				Target = target,
				Damage = damage,
				Sharpness = sharpness,
				HitEffect = hitEffect,
				Pos = pos,
				HitWeaponType = hitWeaponType
			});
		}

		public static void ReplayAndClear()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			List<QueuedHit> list = new List<QueuedHit>(Queue);
			Queue.Clear();
			foreach (QueuedHit item in list)
			{
				if (!((Object)(object)item.Target == (Object)null))
				{
					((Hitable)item.Target).Hit(item.Damage, item.Sharpness, item.HitEffect, item.Pos, item.HitWeaponType);
				}
			}
		}
	}
	[HarmonyPatch(typeof(HitableActor), "Hit")]
	public static class PlayerDamagePatch
	{
		[HarmonyPrefix]
		private static bool Prefix(HitableActor __instance, int damage, float sharpness, int hitEffect, Vector3 pos, int hitWeaponType)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if (!PauseState.IsPaused)
			{
				return true;
			}
			PlayerDamageQueue.Enqueue(__instance, damage, sharpness, hitEffect, pos, hitWeaponType);
			return false;
		}
	}
	[HarmonyPatch(typeof(PlayerInput), "Update")]
	public static class PlayerTickPatch
	{
		[HarmonyPostfix]
		private static void Postfix()
		{
			ModTick.Tick();
		}
	}
}
namespace MuckTimeStop.Networking
{
	public static class PauseNetworking
	{
		private const string GuidSeed = "com.paul.MuckTimeStop";

		private const string ToggleRequestName = "MTS_ToggleRequest";

		private const string StateChangedName = "MTS_StateChanged";

		private static Session _serverSession;

		private static Session _clientSession;

		public static void RegisterServerPackets()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			_serverSession = new Session("com.paul.MuckTimeStop");
			_serverSession.CreateNewServerPacket("MTS_ToggleRequest", (Action<int, Packet>)HandleToggleRequestOnServer);
		}

		public static void RegisterClientPackets()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			_clientSession = new Session("com.paul.MuckTimeStop");
			_clientSession.CreateNewClientPacket("MTS_StateChanged", (Action<Packet>)HandleStateChangedOnClient);
		}

		public static void SendToggleRequest()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			Session clientSession = _clientSession;
			if (clientSession != null)
			{
				clientSession.SendPacketToServer("MTS_ToggleRequest", new Data());
			}
		}

		public static void BroadcastStateChanged(bool isPaused, int casterClientId, Vector3 casterPos, int timeLimitSeconds)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			Data val = new Data();
			val.ints = new int[2] { casterClientId, timeLimitSeconds };
			val.bools = new bool[1] { isPaused };
			val.vector3s = (Vector3[])(object)new Vector3[1] { casterPos };
			Data val2 = val;
			Session serverSession = _serverSession;
			if (serverSession != null)
			{
				serverSession.SendPacketToAllClients("MTS_StateChanged", val2);
			}
		}

		private static void HandleToggleRequestOnServer(int senderClientId, Packet packet)
		{
			PauseController.HostHandleToggleRequest(senderClientId);
		}

		private static void HandleStateChangedOnClient(Packet packet)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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)
			int casterClientId = packet.ReadInt(true);
			int timeLimitSeconds = packet.ReadInt(true);
			bool isPaused = packet.ReadBool(true);
			Vector3 casterPos = packet.ReadVector3(true);
			PauseController.ApplyStateChange(isPaused, casterClientId, casterPos, timeLimitSeconds);
		}
	}
	[HarmonyPatch(typeof(Server), "InitializeServerPackets")]
	public static class ServerPacketReregisterPatch
	{
		[HarmonyPostfix]
		private static void Postfix()
		{
			PauseNetworking.RegisterServerPackets();
		}
	}
	[HarmonyPatch(typeof(LocalClient), "InitializeClientData")]
	public static class ClientPacketReregisterPatch
	{
		[HarmonyPostfix]
		private static void Postfix()
		{
			PauseNetworking.RegisterClientPackets();
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}