Decompiled source of ModdedCompany4th v1.4.1

BepInEx/plugins/plugins/AlwaysPickup.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;

[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: AssemblyCompany("AlwaysPickup")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("AlwaysPickup")]
[assembly: AssemblyTitle("AlwaysPickup")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace AlwaysPickup;

[BepInPlugin("NutNutty.AlwaysPickup", "Always Pickup", "1.0.0")]
public class AlwaysPickup : BaseUnityPlugin
{
	public void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		new Harmony("AlwaysPickup").PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Always Pickup plugin loaded!");
	}
}
[HarmonyPatch(typeof(GrabbableObject))]
public class GrabbableObjectPatch
{
	[HarmonyTranspiler]
	[HarmonyPatch("Start")]
	private static IEnumerable<CodeInstruction> TranspileGrabbableObject(IEnumerable<CodeInstruction> instructions)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Expected O, but got Unknown
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Expected O, but got Unknown
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Expected O, but got Unknown
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Expected O, but got Unknown
		return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, Array.Empty<CodeMatch>()).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[4]
		{
			new CodeInstruction(OpCodes.Ldarg_0, (object)null),
			new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.Field(typeof(GrabbableObject), "itemProperties")),
			new CodeInstruction(OpCodes.Ldc_I4_1, (object)null),
			new CodeInstruction(OpCodes.Stfld, (object)AccessTools.Field(typeof(Item), "canBeGrabbedBeforeGameStart"))
		}).InstructionEnumeration();
	}
}

BepInEx/plugins/plugins/BetterClock.dll

Decompiled a day ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("BetterClock")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BetterClock")]
[assembly: AssemblyCopyright("Copyright © BlueAmulet 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("de27b4d1-820d-4505-a953-6001420281e4")]
[assembly: AssemblyFileVersion("1.0.3")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.3.0")]
namespace BetterClock
{
	[BepInPlugin("BlueAmulet.BetterClock", "BetterClock", "1.0.3")]
	public class BetterClock : BaseUnityPlugin
	{
		internal const string Name = "BetterClock";

		internal const string Author = "BlueAmulet";

		internal const string ID = "BlueAmulet.BetterClock";

		internal const string Version = "1.0.3";

		public void Awake()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			Settings.InitConfig(((BaseUnityPlugin)this).Config);
			Harmony val = new Harmony("BlueAmulet.BetterClock");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Applying Harmony patches");
			val.PatchAll(Assembly.GetExecutingAssembly());
			int num = 0;
			foreach (MethodBase patchedMethod in val.GetPatchedMethods())
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Patched " + patchedMethod.DeclaringType.Name + "." + patchedMethod.Name));
				num++;
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)(num + " patches applied"));
		}
	}
	internal static class Settings
	{
		internal static ConfigEntry<bool> compact;

		internal static ConfigEntry<bool> leadingZero;

		internal static ConfigEntry<bool> darkZero;

		internal static ConfigEntry<bool> fasterUpdate;

		internal static ConfigEntry<bool> raiseClock;

		internal static ConfigEntry<bool> hours24;

		internal static ConfigEntry<bool> properTime;

		internal static ConfigEntry<float> visibilityShip;

		internal static ConfigEntry<float> visibilityOutside;

		internal static ConfigEntry<float> visibilityInside;

		internal static ConfigEntry<float> visibilityOverride;

		internal static ConfigEntry<KeyboardShortcut> overrideKeybind;

		internal static ConfigEntry<bool> overrideToggle;

		public static void InitConfig(ConfigFile config)
		{
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			compact = config.Bind<bool>("Clock", "CompactClock", true, "Makes the clock more compact");
			leadingZero = config.Bind<bool>("Clock", "LeadingZero", true, "Adds a leading zero to hours before 10");
			darkZero = config.Bind<bool>("Clock", "DarkZero", true, "Leading zeros are dark");
			fasterUpdate = config.Bind<bool>("Clock", "FasterUpdate", true, "Update the clock more often");
			raiseClock = config.Bind<bool>("Clock", "RaiseClock", true, "Raise the clock near the top of the screen");
			hours24 = config.Bind<bool>("Clock", "24Hours", false, "Use 24 hour time");
			properTime = config.Bind<bool>("Clock", "ProperTime", true, "Fix time formatting caused by the game or other mods");
			visibilityShip = config.Bind<float>("Clock", "VisibilityShip", 1f, "Visibility of clock inside ship");
			visibilityOutside = config.Bind<float>("Clock", "VisibilityOutside", 1f, "Visibility of clock outside");
			visibilityInside = config.Bind<float>("Clock", "VisibilityInside", 0.25f, "Visibility of clock inside factory");
			visibilityOverride = config.Bind<float>("Clock", "VisibilityOverride", 1f, "Visibility when using override keybind");
			overrideKeybind = config.Bind<KeyboardShortcut>("Clock", "OverrideKeybind", KeyboardShortcut.Empty, "Keybind to trigger visibility override");
			overrideToggle = config.Bind<bool>("Clock", "OverrideToggle", false, "Switch the override keybind between toggle or hold");
		}
	}
}
namespace BetterClock.Patches
{
	[HarmonyPatch(typeof(HUDManager))]
	internal static class ClockPatch
	{
		private static int lastTime = -1;

		private static bool overrideDisplay = false;

		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		public static void PostfixAwake(ref HUDManager __instance)
		{
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			if (!Settings.compact.Value)
			{
				return;
			}
			Transform parent = ((TMP_Text)__instance.clockNumber).transform.parent;
			if (Settings.raiseClock.Value)
			{
				Dictionary<string, PluginInfo> pluginInfos = Chainloader.PluginInfos;
				if (pluginInfos.ContainsKey("SolosRingCompass") || pluginInfos.ContainsKey("LineCompassPlugin"))
				{
					parent.localPosition += new Vector3(0f, 20f, 0f);
				}
				else
				{
					parent.localPosition += new Vector3(0f, 40f, 0f);
				}
			}
			RectTransform component = ((Component)parent).GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(component.sizeDelta.x, 50f);
			((TMP_Text)__instance.clockNumber).enableWordWrapping = false;
			RectTransform component2 = ((Component)__instance.clockIcon).GetComponent<RectTransform>();
			component2.sizeDelta *= 0.6f;
			if (!Settings.hours24.Value)
			{
				Transform transform = ((TMP_Text)__instance.clockNumber).transform;
				transform.localPosition += new Vector3(10f, -1f, 0f);
				Transform transform2 = ((Component)__instance.clockIcon).transform;
				transform2.localPosition += new Vector3(-25f, -2f, 0f);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("SetClockVisible")]
		public static bool PrefixVisible(ref HUDManager __instance)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			KeyboardShortcut value = Settings.overrideKeybind.Value;
			if (Settings.overrideToggle.Value)
			{
				if (((KeyboardShortcut)(ref value)).IsDown())
				{
					overrideDisplay = !overrideDisplay;
				}
			}
			else
			{
				overrideDisplay = ((KeyboardShortcut)(ref value)).IsPressed();
			}
			if (overrideDisplay)
			{
				__instance.Clock.targetAlpha = Settings.visibilityOverride.Value;
				return false;
			}
			GameNetworkManager instance = GameNetworkManager.Instance;
			PlayerControllerB val = null;
			if ((Object)(object)instance != (Object)null)
			{
				val = instance.localPlayerController;
			}
			if ((Object)(object)val != (Object)null)
			{
				if (val.isInHangarShipRoom)
				{
					__instance.Clock.targetAlpha = Settings.visibilityShip.Value;
				}
				else if (val.isInsideFactory)
				{
					__instance.Clock.targetAlpha = Settings.visibilityInside.Value;
				}
				else
				{
					__instance.Clock.targetAlpha = Settings.visibilityOutside.Value;
				}
				return false;
			}
			return true;
		}

		[HarmonyPostfix]
		[HarmonyPatch("SetClock")]
		public static void PostfixSetClock(ref HUDManager __instance, ref float timeNormalized, ref float numberOfHours)
		{
			int num = (int)(timeNormalized * (60f * numberOfHours)) + 360;
			int num2 = num / 60 % 24;
			int num3 = num % 60;
			string text = ((!Settings.hours24.Value) ? ((TMP_Text)__instance.clockNumber).text : $"{num2}:{num3:00}");
			if (Settings.properTime.Value)
			{
				if (text.Length >= 3 && text[0] == '0' && text[2] == ':')
				{
					text = text.Substring(1);
				}
				else if (text.StartsWith("24:"))
				{
					text = "0:" + text.Substring(3);
				}
				if (text.StartsWith("0:") && text.EndsWith("M"))
				{
					text = "12:" + text.Substring(2);
				}
				if (num2 < 12 && text.EndsWith("PM"))
				{
					text = text.Substring(0, text.Length - 2) + "AM";
				}
				else if (num2 >= 12 && text.EndsWith("AM"))
				{
					text = text.Substring(0, text.Length - 2) + "PM";
				}
			}
			if (Settings.compact.Value)
			{
				text = text.Replace('\n', ' ').Replace("   ", " ");
			}
			if (Settings.leadingZero.Value && (text.Length <= 4 || text.Length == 7))
			{
				text = ((!Settings.darkZero.Value) ? ("0" + text) : ("<color=#602000>0</color>" + text));
			}
			((TMP_Text)__instance.clockNumber).text = text;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(TimeOfDay))]
		[HarmonyPatch("MoveTimeOfDay")]
		public static void PostfixMoveTimeOfDay(ref TimeOfDay __instance, ref float ___changeHUDTimeInterval)
		{
			if (Settings.fasterUpdate.Value)
			{
				int num = (int)(__instance.normalizedTimeOfDay * (60f * (float)__instance.numberOfHours));
				if (num != lastTime)
				{
					lastTime = num;
					HUDManager.Instance.SetClock(__instance.normalizedTimeOfDay, (float)__instance.numberOfHours, true);
					___changeHUDTimeInterval = 0f;
				}
			}
		}
	}
}

BepInEx/plugins/plugins/BetterMonitor.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 BetterMonitor.Models;
using BetterMonitor.Patches.ManualCameraRendererPatch;
using BetterMonitor.Patches.ScrapShapePatch;
using BetterMonitor.Resources;
using BetterMonitor.Utilities;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("UnityEngine.CoreModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine")]
[assembly: AssemblyCompany("BetterMonitor")]
[assembly: AssemblyDescription("Enhances the on-board monitor. Makes identifying objects and telling the way home easier.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("BetterMonitor")]
[assembly: AssemblyTitle("BetterMonitor")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BetterMonitor
{
	public class Config
	{
		public ConfigEntry<bool> VerboseLogging { get; private set; }

		public ConfigEntry<bool> DisplayScrapByValue { get; private set; }

		public ConfigEntry<bool> AlignMonitorToPlayer { get; private set; }

		public ConfigEntry<CompassLocationType> CompassLocation { get; private set; }

		public Config(ConfigFile config)
		{
			VerboseLogging = config.Bind<bool>("Logging", "Verbose logging", true, "Log all events to the console (Useful for identifying issues during customization)");
			DisplayScrapByValue = config.Bind<bool>("Scraps", "Show value", true, "Scrap icon changes shape by their value (Customize the icons in the 'ScrapIcons' folder)");
			AlignMonitorToPlayer = config.Bind<bool>("Monitor", "Align view to player", true, "Rotate the camera view so that the player is always facing up");
			CompassLocation = config.Bind<CompassLocationType>("Monitor", "Compass location", CompassLocationType.AroundPlayerWithProximity, "Where the compass should be placed on the monitor");
		}
	}
	[BepInPlugin("BetterMonitor", "BetterMonitor", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public static Plugin Instance { get; private set; }

		public static Config Configuration { get; private set; }

		private void Awake()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			Instance = this;
			Configuration = new Config(((BaseUnityPlugin)this).Config);
			Harmony val = new Harmony("com.fumiko.bettermonitor");
			if (Configuration.DisplayScrapByValue.Value)
			{
				val.PatchAll(typeof(ScrapObjectPatch));
				ScrapObjectPatch.Initialize();
			}
			if (Configuration.CompassLocation.Value != 0)
			{
				val.PatchAll(typeof(MonitorPatch));
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin BetterMonitor is loaded!");
		}

		public static void LogError(string s)
		{
			if (Configuration.VerboseLogging.Value)
			{
				((BaseUnityPlugin)Instance).Logger.LogError((object)s);
			}
		}

		public static void LogInfo(string s)
		{
			if (Configuration.VerboseLogging.Value)
			{
				((BaseUnityPlugin)Instance).Logger.LogInfo((object)s);
			}
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "BetterMonitor";

		public const string PLUGIN_NAME = "BetterMonitor";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace BetterMonitor.Utilities
{
	public static class BytesExtensions
	{
		public static Sprite ToSprite(this byte[] bytes, int width = 256, int height = 256, float pixelsPerUnit = 100f, SpriteMeshType meshType = 1)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Texture2D texture = bytes.ToTexture2D(width, height);
			return texture.ToSprite(pixelsPerUnit, meshType);
		}

		public static Texture2D ToTexture2D(this byte[] bytes, int width = 256, int height = 256)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			Texture2D val = new Texture2D(width, height);
			return ImageConversion.LoadImage(val, bytes) ? val : null;
		}
	}
	public static class Texture2DExtensions
	{
		public static Sprite ToSprite(this Texture2D texture, float pixelsPerUnit = 100f, SpriteMeshType meshType = 1)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			return Sprite.Create(texture, new Rect(0f, 0f, (float)((Texture)texture).width, (float)((Texture)texture).height), Vector2.one * 0.5f, pixelsPerUnit, 0u, meshType);
		}
	}
}
namespace BetterMonitor.Resources
{
	public static class ModResources
	{
		private static readonly Assembly Assembly = typeof(ModResources).GetTypeInfo().Assembly;

		public static Stream Get(string path)
		{
			return Assembly.GetManifestResourceStream("BetterMonitor.Resources." + path);
		}
	}
}
namespace BetterMonitor.Patches.ScrapShapePatch
{
	[HarmonyPatch(typeof(GrabbableObject))]
	public static class ScrapObjectPatch
	{
		private static readonly string ScrapIconsPath = Path.Combine(Paths.PluginPath, "ScrapIcons");

		private static readonly int MainTexture = Shader.PropertyToID("_UnlitColorMap");

		private static readonly SortedList<int, Texture> ScrapIcons = new SortedList<int, Texture>();

		private static readonly Dictionary<string, Texture> NamedScrapReplacements = new Dictionary<string, Texture>();

		public static void Initialize()
		{
			if (!Directory.Exists(ScrapIconsPath))
			{
				InitializeDirectory();
			}
			LoadScrapIcons();
		}

		private static void LoadScrapIcons()
		{
			Plugin.LogInfo("Loading scrap icons from " + ScrapIconsPath);
			foreach (string item in Directory.EnumerateFiles(ScrapIconsPath))
			{
				string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(item);
				string extension = Path.GetExtension(item);
				if (!(extension.ToLowerInvariant() != ".png"))
				{
					Texture2D value = File.ReadAllBytes(item).ToTexture2D();
					if (int.TryParse(fileNameWithoutExtension, out var result))
					{
						ScrapIcons.Add(result, (Texture)(object)value);
						Plugin.LogInfo("Added icon for scrap value " + fileNameWithoutExtension);
					}
					else
					{
						NamedScrapReplacements.Add(fileNameWithoutExtension, (Texture)(object)value);
						Plugin.LogInfo("Added icon for scrap " + fileNameWithoutExtension);
					}
				}
			}
			if (ScrapIcons.Count > 0)
			{
				return;
			}
			using Stream stream = ModResources.Get("ScrapIcons.0.png");
			byte[] array = new byte[stream.Length];
			if (stream.Read(array, 0, array.Length) == 0)
			{
				ScrapIcons.Add(0, (Texture)(object)array.ToTexture2D());
			}
		}

		private static void InitializeDirectory()
		{
			Directory.CreateDirectory(ScrapIconsPath);
			string[] array = new string[3] { "0.png", "59.png", "89.png" };
			string[] array2 = array;
			foreach (string text in array2)
			{
				string path = Path.Combine(ScrapIconsPath, text);
				using FileStream destination = File.Create(path);
				ModResources.Get("ScrapIcons." + text).CopyTo(destination);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void StartPostfix(GrabbableObject __instance)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			MeshRenderer val = default(MeshRenderer);
			if (__instance.itemProperties.isScrap && ((Component)__instance.radarIcon).TryGetComponent<MeshRenderer>(ref val))
			{
				MaterialPropertyBlock val2 = new MaterialPropertyBlock();
				((Renderer)val).GetPropertyBlock(val2);
				val2.SetTexture(MainTexture, FindScrapIcon(__instance));
				((Renderer)val).SetPropertyBlock(val2);
			}
		}

		private static Texture FindScrapIcon(GrabbableObject item)
		{
			if (NamedScrapReplacements.TryGetValue(item.itemProperties.itemName, out var value))
			{
				return value;
			}
			for (int i = 0; i < ScrapIcons.Count; i++)
			{
				int num = ScrapIcons.Keys[i];
				if (num >= item.scrapValue)
				{
					return ScrapIcons.Values[Mathf.Max(0, i - 1)];
				}
			}
			IList<Texture> values = ScrapIcons.Values;
			return values[values.Count - 1];
		}
	}
}
namespace BetterMonitor.Patches.ManualCameraRendererPatch
{
	[HarmonyPatch(typeof(ManualCameraRenderer))]
	public static class MonitorPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		public static void UpdatePostfix(ManualCameraRenderer __instance)
		{
			TransformAndName val = __instance.radarTargets[__instance.targetTransformIndex];
			if (!((Object)(object)__instance.cam != (Object)(object)__instance.mapCamera) && !((Object)(object)val.transform == (Object)null))
			{
				AlignCameraToPlayer(((Component)__instance.cam).transform, val.transform);
				UpdateCompass(__instance, val.transform);
			}
		}

		private static void UpdateCompass(ManualCameraRenderer __instance, Transform radarTarget)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.shipArrowUI.activeSelf)
			{
				Vector3 val = StartOfRound.Instance.elevatorTransform.position - radarTarget.position;
				val.y = 0f;
				if (Plugin.Configuration.AlignMonitorToPlayer.Value)
				{
					Quaternion rotation = radarTarget.rotation;
					val = Quaternion.AngleAxis(0f - rotation.y, Vector3.up) * val;
				}
				if (Plugin.Configuration.CompassLocation.Value == CompassLocationType.AroundPlayer)
				{
					__instance.shipArrowPointer.localPosition = ((Vector3)(ref val)).normalized * 50f;
				}
				else
				{
					float num = Mathf.Lerp(40f, 90f, ((Vector3)(ref val)).sqrMagnitude / 196f);
					__instance.shipArrowPointer.localPosition = ((Vector3)(ref val)).normalized * num;
				}
				__instance.shipArrowPointer.forward = val;
			}
		}

		private static void AlignCameraToPlayer(Transform camera, Transform player)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.Configuration.AlignMonitorToPlayer.Value)
			{
				Quaternion rotation = player.rotation;
				camera.rotation = Quaternion.Euler(90f, ((Quaternion)(ref rotation)).eulerAngles.y, 0f);
			}
		}
	}
}
namespace BetterMonitor.Models
{
	public enum CompassLocationType
	{
		BottomRight,
		AroundPlayer,
		AroundPlayerWithProximity
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}

BepInEx/plugins/plugins/BetterSprayPaint.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BetterSprayPaint;
using BetterSprayPaint.NetcodePatcher;
using BetterSprayPaint.Ngo;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using Microsoft.CodeAnalysis;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: AssemblyCompany("BetterSprayPaint")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("2.0.9.0")]
[assembly: AssemblyInformationalVersion("2.0.9+67b14332f2c2ee64549a66c724edce78e6201b2c")]
[assembly: AssemblyProduct("BetterSprayPaint")]
[assembly: AssemblyTitle("BetterSprayPaint")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.0.9.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
		NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<float>();
		NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<float>();
		NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<bool>();
		NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<bool>();
		NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<Color>();
		NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<Color>();
		NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedINetworkSerializable<NetworkObjectReference>();
		NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<NetworkObjectReference>();
	}
}
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 class QuietLogSource : ILogSource, IDisposable
{
	private ManualLogSource innerLog;

	private static readonly TimeSpan baseRecentLogTimeout = TimeSpan.FromMilliseconds(5000.0);

	private Dictionary<string, (DateTime, int)> recentLogs = new Dictionary<string, (DateTime, int)>();

	private int logsSuppressed;

	private int lastReportedLogsSuppressed;

	private bool suppressLogs = true;

	private const int minimumBeforeSuppressal = 5;

	public string SourceName { get; }

	public event EventHandler<LogEventArgs> LogEvent
	{
		add
		{
			innerLog.LogEvent += value;
		}
		remove
		{
			innerLog.LogEvent -= value;
		}
	}

	public QuietLogSource(string sourceName)
	{
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Expected O, but got Unknown
		innerLog = new ManualLogSource(sourceName);
		SourceName = sourceName;
	}

	public void Dispose()
	{
		innerLog.Dispose();
	}

	private object AddStackTrace(object data)
	{
		if (data is string arg)
		{
			StackTrace arg2 = new StackTrace(3, fNeedFileInfo: true);
			return $"{arg}\n{arg2}";
		}
		return data;
	}

	public void Log(LogLevel level, object data, bool addStackTrace = false)
	{
		//IL_014e: Unknown result type (might be due to invalid IL or missing references)
		if (recentLogs.Count > 30)
		{
			KeyValuePair<string, (DateTime, int)>[] array = recentLogs.Where<KeyValuePair<string, (DateTime, int)>>((KeyValuePair<string, (DateTime, int)> kvp) => DateTime.UtcNow - kvp.Value.Item1 > baseRecentLogTimeout).ToArray();
			foreach (KeyValuePair<string, (DateTime, int)> keyValuePair in array)
			{
				recentLogs.Remove(keyValuePair.Key);
			}
		}
		if (data is string key)
		{
			if (recentLogs.TryGetValue(key, out var value))
			{
				TimeSpan timeSpan = ((value.Item2 < 100) ? baseRecentLogTimeout : (baseRecentLogTimeout * 2.0));
				if (DateTime.UtcNow - value.Item1 > timeSpan)
				{
					recentLogs[key] = (DateTime.UtcNow, (value.Item2 > 5) ? 5 : 0);
				}
				else
				{
					recentLogs[key] = (value.Item1, value.Item2 + 1);
					if (value.Item2 >= 5)
					{
						logsSuppressed++;
						if (suppressLogs)
						{
							return;
						}
					}
				}
			}
			else
			{
				recentLogs.Add(key, (DateTime.UtcNow, 0));
			}
		}
		innerLog.Log(level, addStackTrace ? AddStackTrace(data) : data);
		if (suppressLogs && logsSuppressed > lastReportedLogsSuppressed)
		{
			innerLog.LogInfo((object)$"{logsSuppressed - lastReportedLogsSuppressed} duplicate logs suppressed");
			lastReportedLogsSuppressed = logsSuppressed;
		}
	}

	public void LogInfo(object data)
	{
		Log((LogLevel)16, data);
	}

	public void LogError(object data, bool addStackTrace = true)
	{
		Log((LogLevel)2, data, addStackTrace);
	}

	public void LogWarning(object data, bool addStackTrace = true)
	{
		Log((LogLevel)4, data, addStackTrace);
	}

	public void LogLoud(string data)
	{
		for (int i = 0; i < 25; i++)
		{
			Log((LogLevel)16, $"{data} ({i})");
		}
	}
}
internal interface INetVar : IDisposable
{
	void Synchronize();

	static INetVar[] GetAllNetVars(object self)
	{
		object self2 = self;
		return (from field in self2.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
			where typeof(INetVar).IsAssignableFrom(field.FieldType)
			select (INetVar)field.GetValue(self2)).ToArray();
	}
}
internal class NetVar<T> : INetVar, IDisposable where T : IEquatable<T>
{
	public readonly NetworkVariable<T> networkVariable;

	private bool deferPending = true;

	private T deferredValue;

	private T _localValue;

	private readonly bool isGlued;

	private readonly Action<T>? setGlued;

	private readonly Func<T>? getGlued;

	private readonly Func<T, T>? validate;

	private readonly Func<bool> inControl;

	private readonly Action<T> SetOnServer;

	private readonly OnValueChangedDelegate<T>? onChange;

	private T localValue
	{
		get
		{
			return _localValue;
		}
		set
		{
			if (isGlued)
			{
				setGlued(value);
			}
			_localValue = value;
		}
	}

	public T Value
	{
		get
		{
			Synchronize();
			return localValue;
		}
		set
		{
			if (inControl())
			{
				deferPending = false;
				if (validate != null)
				{
					value = validate(value);
				}
				if (!EqualityComparer<T>.Default.Equals(localValue, value))
				{
					T prevValue = localValue;
					localValue = value;
					SetOnServer(value);
					OnChange(prevValue, value);
				}
			}
		}
	}

	public NetVar(out NetworkVariable<T> networkVariable, Action<T> SetOnServer, Func<bool> inControl, T initialValue = default(T), OnValueChangedDelegate<T>? onChange = null, Action<T>? setGlued = null, Func<T>? getGlued = null, Func<T, T>? validate = null)
	{
		isGlued = setGlued != null && getGlued != null;
		this.setGlued = setGlued;
		this.getGlued = getGlued;
		this.validate = validate;
		this.onChange = onChange;
		this.SetOnServer = SetOnServer;
		this.inControl = inControl;
		this.networkVariable = new NetworkVariable<T>(initialValue, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
		networkVariable = this.networkVariable;
		_localValue = initialValue;
		localValue = initialValue;
		deferredValue = initialValue;
		NetworkVariable<T> obj = networkVariable;
		obj.OnValueChanged = (OnValueChangedDelegate<T>)(object)Delegate.Combine((Delegate?)(object)obj.OnValueChanged, (Delegate?)(object)(OnValueChangedDelegate<T>)delegate(T prevValue, T currentValue)
		{
			if (!EqualityComparer<T>.Default.Equals(localValue, currentValue))
			{
				Synchronize();
				OnChange(prevValue, currentValue);
			}
		});
	}

	public void ServerSet(T value)
	{
		if (validate != null)
		{
			value = validate(value);
		}
		networkVariable.Value = value;
	}

	public void SetDeferred(T value)
	{
		deferredValue = value;
	}

	private void OnChange(T prevValue, T currentValue)
	{
		if (onChange != null)
		{
			onChange.Invoke(prevValue, currentValue);
		}
	}

	public void UpdateDeferred()
	{
		if (inControl() && deferPending)
		{
			Value = deferredValue;
		}
		deferPending = false;
	}

	public void Synchronize()
	{
		if (!inControl())
		{
			localValue = networkVariable.Value;
			deferPending = false;
		}
		else if (isGlued)
		{
			Value = getGlued();
		}
		else
		{
			Value = localValue;
		}
	}

	public void Dispose()
	{
		((NetworkVariableBase)networkVariable).Dispose();
	}
}
public class SprayPaintItemExt : MonoBehaviour
{
	public SprayPaintItem instance;

	public SprayPaintItemNetExt net;

	public DecalProjector previewDecal;

	private List<Action> cleanupActions = new List<Action>();

	private float previewFadeFactor = 1f;

	private Vector3 previewOriginalScale = Vector3.oneVector;

	public bool ItemActive()
	{
		if (net.HeldByLocalPlayer && net.InActiveSlot)
		{
			return Patches.CanUseItem(((GrabbableObject)instance).playerHeldBy);
		}
		return false;
	}

	public void Awake()
	{
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Expected O, but got Unknown
		instance = ((Component)this).GetComponent<SprayPaintItem>();
		net = instance.NetExt();
		GameObject val = Object.Instantiate<GameObject>(instance.sprayPaintPrefab);
		previewDecal = val.GetComponent<DecalProjector>();
		Object.DontDestroyOnLoad((Object)(object)val);
		previewDecal.material = new Material(net.baseDecalMaterial);
		((Behaviour)previewDecal).enabled = true;
		((Object)val).name = "PreviewDecal";
		val.SetActive(true);
		ActionSubscriptionBuilder actionSubscriptionBuilder = new ActionSubscriptionBuilder(cleanupActions, () => ItemActive());
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintEraseModifier, delegate
		{
			if (SessionData.AllowErasing)
			{
				net.IsErasing = true;
			}
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintErase, delegate
		{
			if (SessionData.AllowErasing)
			{
				net.IsErasing = true;
			}
			((GrabbableObject)instance).UseItemOnClient(true);
		}, delegate
		{
			((GrabbableObject)instance).UseItemOnClient(false);
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintNextColor, delegate
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			if (SessionData.AllowColorChange)
			{
				int num2 = net.ColorPalette.FindIndex((Color color) => color == net.CurrentColor);
				num2 = net.posmod(++num2, net.ColorPalette.Count);
				((MonoBehaviour)this).StartCoroutine(net.ChangeColorCoroutine(net.ColorPalette[num2]));
			}
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintPreviousColor, delegate
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			if (SessionData.AllowColorChange)
			{
				int num = net.ColorPalette.FindIndex((Color color) => color == net.CurrentColor);
				num = net.posmod(--num, net.ColorPalette.Count);
				((MonoBehaviour)this).StartCoroutine(net.ChangeColorCoroutine(net.ColorPalette[num]));
			}
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintColor1, delegate
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if (SessionData.AllowColorChange)
			{
				int index4 = net.posmod(0, net.ColorPalette.Count);
				((MonoBehaviour)this).StartCoroutine(net.ChangeColorCoroutine(net.ColorPalette[index4]));
			}
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintColor2, delegate
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if (SessionData.AllowColorChange)
			{
				int index3 = net.posmod(1, net.ColorPalette.Count);
				((MonoBehaviour)this).StartCoroutine(net.ChangeColorCoroutine(net.ColorPalette[index3]));
			}
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintColor3, delegate
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if (SessionData.AllowColorChange)
			{
				int index2 = net.posmod(2, net.ColorPalette.Count);
				((MonoBehaviour)this).StartCoroutine(net.ChangeColorCoroutine(net.ColorPalette[index2]));
			}
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintColor4, delegate
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if (SessionData.AllowColorChange)
			{
				int index = net.posmod(3, net.ColorPalette.Count);
				((MonoBehaviour)this).StartCoroutine(net.ChangeColorCoroutine(net.ColorPalette[index]));
			}
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintIncreaseSize, (object _, CallbackContext _) => ((MonoBehaviour)this).StartCoroutine(net.ChangeSizeCoroutine()), delegate(object _, CallbackContext _, Coroutine? coroutine)
		{
			((MonoBehaviour)this).StopCoroutine(coroutine);
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintDecreaseSize, (object _, CallbackContext _) => ((MonoBehaviour)this).StartCoroutine(net.ChangeSizeCoroutine()), delegate(object _, CallbackContext _, Coroutine? coroutine)
		{
			((MonoBehaviour)this).StopCoroutine(coroutine);
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintSize01, delegate
		{
			net.PaintSize = 0.1f;
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintSize1, delegate
		{
			net.PaintSize = 1f;
		});
		actionSubscriptionBuilder.Subscribe(Plugin.inputActions.SprayPaintSize2, delegate
		{
			net.PaintSize = 2f;
		});
	}

	public void Update()
	{
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: 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_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//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_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0181: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)previewDecal == (Object)null || (Object)(object)((Component)previewDecal).gameObject == (Object)null || (Object)(object)previewDecal.material == (Object)null)
		{
			return;
		}
		bool flag = false;
		if (ItemActive())
		{
			Vector3 position = ((Component)((GrabbableObject)instance).playerHeldBy.gameplayCamera).transform.position;
			Vector3 forward = ((Component)((GrabbableObject)instance).playerHeldBy.gameplayCamera).transform.forward;
			if (Patches.RaycastCustom(new Ray(position, forward), out var sprayHit, SessionData.Range, net.sprayPaintMask, (QueryTriggerInteraction)2, instance))
			{
				Patches.PositionSprayPaint(instance, ((Component)previewDecal).gameObject, sprayHit, setColor: false);
				previewOriginalScale = ((Component)previewDecal).transform.localScale;
				flag = true;
			}
		}
		Color currentColor = net.CurrentColor;
		float num = (Mathf.Sin(Time.timeSinceLevelLoad * 6f) + 1f) * 0.2f + 0.2f;
		previewFadeFactor = Utils.Lexp(previewFadeFactor, flag ? 1f : 0f, 15f * Time.deltaTime);
		previewDecal.material.color = new Color(Mathf.Lerp(currentColor.r, Math.Min(currentColor.r + 0.35f, 1f), num), Mathf.Lerp(currentColor.g, Math.Min(currentColor.g + 0.35f, 1f), num), Mathf.Lerp(currentColor.b, Math.Min(currentColor.b + 0.35f, 1f), num), Mathf.Clamp(Plugin.SprayPreviewOpacity, 0f, 1f) * previewFadeFactor);
		((Component)previewDecal).transform.localScale = previewOriginalScale * previewFadeFactor;
	}

	public void OnDestroy()
	{
		foreach (Action cleanupAction in cleanupActions)
		{
			cleanupAction();
		}
		Object.Destroy((Object)(object)previewDecal);
	}
}
namespace BetterSprayPaint
{
	[HarmonyPatch]
	internal class Patches
	{
		public static HashSet<string> CompanyCruiserColliderBlacklist = new HashSet<string> { "Meshes/DoorLeftContainer/Door/DoorTrigger", "CollisionTriggers/Cube", "PushTrigger", "Triggers/ItemDropRegion", "Triggers/BackPhysicsRegion", "Triggers/LeftShelfPlacementCollider/bounds", "Triggers/RightShelfPlacementCollider/bounds", "VehicleBounds", "InsideTruckNavBounds" };

		private static MethodInfo physicsRaycast = typeof(Physics).GetMethod("Raycast", new Type[5]
		{
			typeof(Ray),
			typeof(RaycastHit).MakeByRefType(),
			typeof(float),
			typeof(int),
			typeof(QueryTriggerInteraction)
		});

		private static MethodInfo raycastCustom = typeof(Patches).GetMethod("RaycastCustom");

		[HarmonyPrefix]
		[HarmonyPatch(typeof(StartOfRound), "EndOfGame")]
		public static void EndOfGame()
		{
			foreach (GameObject sprayPaintDecal in SprayPaintItem.sprayPaintDecals)
			{
				if ((Object)(object)sprayPaintDecal != (Object)null && !sprayPaintDecal.activeInHierarchy)
				{
					Object.Destroy((Object)(object)sprayPaintDecal);
				}
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(SprayPaintItem), "LateUpdate")]
		public static void LateUpdate(SprayPaintItem __instance, ref float ___sprayCanTank, ref float ___sprayCanShakeMeter, ref AudioSource ___sprayAudio, bool ___isSpraying)
		{
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.isWeedKillerSprayBottle)
			{
				return;
			}
			__instance.Ext();
			SprayPaintItemNetExt sprayPaintItemNetExt = __instance.NetExt();
			if ((Object)(object)sprayPaintItemNetExt == (Object)null)
			{
				return;
			}
			if (SessionData.InfiniteTank)
			{
				___sprayCanTank = 1f;
			}
			__instance.maxSprayPaintDecals = Plugin.MaxSprayPaintDecals;
			__instance.sprayIntervalSpeed = 0.01f * sprayPaintItemNetExt.PaintSize;
			if (SessionData.ShakingNotNeeded)
			{
				___sprayCanShakeMeter = 1f;
			}
			___sprayAudio.volume = Plugin.Volume;
			if (sprayPaintItemNetExt.HeldByLocalPlayer && sprayPaintItemNetExt.ShakeMeter.Value != ___sprayCanShakeMeter)
			{
				sprayPaintItemNetExt.UpdateShakeMeterServerRpc(___sprayCanShakeMeter);
			}
			else
			{
				___sprayCanShakeMeter = sprayPaintItemNetExt.ShakeMeter.Value;
			}
			NetworkObjectReference value;
			if (sprayPaintItemNetExt.HeldByLocalPlayer)
			{
				value = sprayPaintItemNetExt.PlayerHeldBy.Value;
				if (((NetworkObjectReference)(ref value)).NetworkObjectId != ((NetworkBehaviour)((GrabbableObject)__instance).playerHeldBy).NetworkObjectId)
				{
					sprayPaintItemNetExt.SetPlayerHeldByServerRpc(new NetworkObjectReference(((NetworkBehaviour)((GrabbableObject)__instance).playerHeldBy).NetworkObject));
					goto IL_00f8;
				}
			}
			value = sprayPaintItemNetExt.PlayerHeldBy.Value;
			NetworkObject val = default(NetworkObject);
			if (((NetworkObjectReference)(ref value)).TryGet(ref val, (NetworkManager)null))
			{
				((GrabbableObject)__instance).playerHeldBy = ((Component)val).GetComponent<PlayerControllerB>();
			}
			goto IL_00f8;
			IL_00f8:
			if (sprayPaintItemNetExt.HeldByLocalPlayer)
			{
				sprayPaintItemNetExt.IsErasing = Plugin.inputActions.SprayPaintEraseModifier.IsPressed() || Plugin.inputActions.SprayPaintErase.IsPressed();
			}
			if (___isSpraying && (___sprayCanTank <= 0f || ___sprayCanShakeMeter <= 0f))
			{
				sprayPaintItemNetExt.UpdateParticles();
				__instance.StopSpraying();
				PlayCanEmptyEffect(__instance, ___sprayCanTank <= 0f);
			}
			if (!((Object)(object)((GrabbableObject)__instance).playerHeldBy != (Object)null) || !Plugin.ShorterShakeAnimation)
			{
				return;
			}
			Animator playerBodyAnimator = ((GrabbableObject)__instance).playerHeldBy.playerBodyAnimator;
			AnimatorClipInfo[] currentAnimatorClipInfo = playerBodyAnimator.GetCurrentAnimatorClipInfo(2);
			for (int i = 0; i < currentAnimatorClipInfo.Length; i++)
			{
				AnimatorClipInfo val2 = currentAnimatorClipInfo[i];
				if (((Object)((AnimatorClipInfo)(ref val2)).clip).name == "ShakeItem")
				{
					AnimatorStateInfo currentAnimatorStateInfo = playerBodyAnimator.GetCurrentAnimatorStateInfo(2);
					if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).normalizedTime > 0.1f)
					{
						playerBodyAnimator.Play("HoldOneHandedItem");
					}
				}
			}
		}

		public static void EraseSprayPaintAtPoint(SprayPaintItem __instance, Vector3 pos)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			foreach (GameObject sprayPaintDecal in SprayPaintItem.sprayPaintDecals)
			{
				if ((Object)(object)sprayPaintDecal != (Object)null && Vector3.Distance(sprayPaintDecal.transform.position, pos) < Mathf.Max(0.15f, 0.5f * __instance.NetExt().PaintSize))
				{
					sprayPaintDecal.SetActive(false);
				}
			}
		}

		public static bool EraseSprayPaintLocal(SprayPaintItem __instance, Vector3 sprayPos, Vector3 sprayRot, out RaycastHit sprayHit)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: 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)
			if (RaycastCustom(new Ray(sprayPos, sprayRot), out sprayHit, SessionData.Range, __instance.NetExt().sprayPaintMask, (QueryTriggerInteraction)2, __instance))
			{
				EraseSprayPaintAtPoint(__instance, ((RaycastHit)(ref sprayHit)).point);
				return true;
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(SprayPaintItem), "TrySpraying")]
		public static bool TrySpraying(SprayPaintItem __instance, ref bool __result, ref RaycastHit ___sprayHit, ref float ___sprayCanShakeMeter)
		{
			//IL_0025: 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)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: 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)
			if (__instance.isWeedKillerSprayBottle)
			{
				return true;
			}
			SprayPaintItemNetExt sprayPaintItemNetExt = __instance.NetExt();
			Vector3 position = ((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.position;
			Vector3 forward = ((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.forward;
			sprayPaintItemNetExt.UpdateParticles();
			if (SessionData.AllowErasing && sprayPaintItemNetExt.IsErasing)
			{
				if (EraseSprayPaintLocal(__instance, position, forward, out var sprayHit))
				{
					__result = true;
					sprayPaintItemNetExt.EraseServerRpc(((RaycastHit)(ref sprayHit)).point);
				}
				return false;
			}
			if (AddSprayPaintLocal(__instance, position, forward))
			{
				__result = true;
				sprayPaintItemNetExt.SprayServerRpc(position, forward);
			}
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(SprayPaintItem), "ItemActivate")]
		public static void ItemActivate(SprayPaintItem __instance)
		{
			if (!__instance.isWeedKillerSprayBottle)
			{
				__instance.NetExt().UpdateParticles();
			}
		}

		public static bool RaycastCustom(Ray ray, out RaycastHit sprayHit, float _distance, int layerMask, QueryTriggerInteraction queryTriggerInteraction, SprayPaintItem __instance)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			PlayerControllerB playerHeldBy = ((GrabbableObject)__instance).playerHeldBy;
			GameObject val = null;
			if ((Object)(object)playerHeldBy != (Object)null && (Object)(object)((Component)playerHeldBy).gameObject != (Object)null)
			{
				val = ((Component)playerHeldBy).gameObject;
			}
			else
			{
				Plugin.log.LogWarning("Player GameObject is null");
			}
			bool result = false;
			RaycastHit val2 = default(RaycastHit);
			float num = SessionData.Range + 1f;
			int num2 = 1073742336;
			RaycastHit[] array = Physics.RaycastAll(ray, SessionData.Range, layerMask | num2, queryTriggerInteraction);
			for (int i = 0; i < array.Length; i++)
			{
				RaycastHit val3 = array[i];
				int num3 = 1 << ((Component)((RaycastHit)(ref val3)).collider).gameObject.layer;
				if ((Object)(object)val != (Object)null && ((RaycastHit)(ref val3)).transform.IsChildOf(val.transform))
				{
					continue;
				}
				if ((num3 & layerMask) == 0)
				{
					if ((num3 & num2) == 0)
					{
						continue;
					}
					Transform val4 = ((Component)((RaycastHit)(ref val3)).collider).gameObject.transform.GetAncestors().FirstOrDefault((Func<Transform, bool>)((Transform go) => ((Object)go).name.StartsWith("CompanyCruiser")));
					if ((Object)(object)val4 == (Object)null)
					{
						continue;
					}
					string path = ((Component)((RaycastHit)(ref val3)).collider).gameObject.transform.GetPath(val4);
					if (CompanyCruiserColliderBlacklist.Contains(path))
					{
						continue;
					}
				}
				if ((!((RaycastHit)(ref val3)).collider.isTrigger || !((Object)((RaycastHit)(ref val3)).collider).name.Contains("Trigger")) && ((RaycastHit)(ref val3)).distance < num)
				{
					num = ((RaycastHit)(ref val3)).distance;
					val2 = val3;
					result = true;
				}
			}
			sprayHit = val2;
			if (!SessionData.ClientsCanPaintShip)
			{
				bool flag = (Object)(object)((GrabbableObject)__instance).playerHeldBy != (Object)null && ((GrabbableObject)__instance).playerHeldBy.isHostPlayerObject;
				if ((((Object)(object)((RaycastHit)(ref sprayHit)).collider != (Object)null && ((Component)((RaycastHit)(ref sprayHit)).collider).transform.IsChildOf(StartOfRound.Instance.elevatorTransform)) || (Object)(object)RoundManager.Instance.mapPropsContainer == (Object)null) && !flag)
				{
					result = false;
				}
			}
			return result;
		}

		[HarmonyReversePatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPatch(typeof(SprayPaintItem), "AddSprayPaintLocal")]
		public static bool original_AddSprayPaintLocal(object instance, Vector3 sprayPos, Vector3 sprayRot)
		{
			throw new NotImplementedException("stub");
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(SprayPaintItem), "AddSprayPaintLocal")]
		private static IEnumerable<CodeInstruction> transpiler_AddSprayPaintLocal(IEnumerable<CodeInstruction> instructions)
		{
			bool foundMinNextDecalDistance = false;
			bool foundRaycastCall = false;
			bool addedWeedKillerSkip = false;
			foreach (CodeInstruction instruction in instructions)
			{
				if (!addedWeedKillerSkip)
				{
					addedWeedKillerSkip = true;
					foreach (CodeInstruction item in _transpiler_AddWeedKillerSkip(instruction, typeof(Patches).GetMethod("original_AddSprayPaintLocal")))
					{
						yield return item;
					}
				}
				else if (!foundMinNextDecalDistance && instruction.opcode == OpCodes.Ldc_R4 && (float)instruction.operand == 0.175f)
				{
					foundMinNextDecalDistance = true;
					yield return new CodeInstruction(OpCodes.Ldc_R4, (object)0.001f);
				}
				else if (!foundRaycastCall && instruction.opcode == OpCodes.Call && instruction.operand == physicsRaycast)
				{
					foundRaycastCall = true;
					yield return new CodeInstruction(OpCodes.Ldarg_0, (object)null);
					yield return new CodeInstruction(OpCodes.Call, (object)raycastCustom);
				}
				else
				{
					yield return instruction;
				}
			}
		}

		public static float TankCapacity()
		{
			if (SessionData.InfiniteTank)
			{
				return 25f;
			}
			return SessionData.TankCapacity;
		}

		private static IEnumerable<CodeInstruction> _transpiler_AddWeedKillerSkip(CodeInstruction instruction, MethodInfo original)
		{
			Label label = default(Label);
			yield return new CodeInstruction(OpCodes.Ldarg_0, (object)null);
			yield return new CodeInstruction(OpCodes.Ldfld, (object)typeof(SprayPaintItem).GetField("isWeedKillerSprayBottle"));
			yield return new CodeInstruction(OpCodes.Brfalse_S, (object)label);
			yield return new CodeInstruction(OpCodes.Jmp, (object)original);
			yield return CodeInstructionExtensions.WithLabels(instruction, new Label[1] { label });
		}

		[HarmonyReversePatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPatch(typeof(SprayPaintItem), "LateUpdate")]
		public static void original_LateUpdate(object instance)
		{
			throw new NotImplementedException("stub");
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(SprayPaintItem), "LateUpdate")]
		private static IEnumerable<CodeInstruction> transpiler_LateUpdate(IEnumerable<CodeInstruction> instructions)
		{
			bool foundTankCapacityDivisor = false;
			bool addedWeedKillerSkip = false;
			foreach (CodeInstruction instruction in instructions)
			{
				if (!addedWeedKillerSkip)
				{
					addedWeedKillerSkip = true;
					foreach (CodeInstruction item in _transpiler_AddWeedKillerSkip(instruction, typeof(Patches).GetMethod("original_LateUpdate")))
					{
						yield return item;
					}
				}
				else if (!foundTankCapacityDivisor && instruction.opcode == OpCodes.Ldc_R4 && (float)instruction.operand == 25f)
				{
					foundTankCapacityDivisor = true;
					yield return new CodeInstruction(OpCodes.Call, (object)typeof(Patches).GetMethod("TankCapacity"));
				}
				else
				{
					yield return instruction;
				}
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Update")]
		[HarmonyPostfix]
		public static void Player_Update_Postfix(PlayerControllerB __instance)
		{
			if (__instance.IsLocalPlayer())
			{
				Plugin.UpdateSessionData();
			}
		}

		[HarmonyReversePatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPatch(typeof(PlayerControllerB), "CanUseItem")]
		public static bool CanUseItem(object instance)
		{
			throw new NotImplementedException("stub");
		}

		[HarmonyReversePatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPatch(typeof(SprayPaintItem), "AddSprayPaintLocal")]
		public static bool _AddSprayPaintLocal(object instance, Vector3 sprayPos, Vector3 sprayRot)
		{
			Transpiler(null);
			return false;
			static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				bool foundMinNextDecalDistance = false;
				bool foundRaycastCall = false;
				foreach (CodeInstruction instruction in instructions)
				{
					if (!foundMinNextDecalDistance && instruction.opcode == OpCodes.Ldc_R4 && (float)instruction.operand == 0.175f)
					{
						foundMinNextDecalDistance = true;
						yield return new CodeInstruction(OpCodes.Ldc_R4, (object)0.001f);
					}
					else if (!foundRaycastCall && instruction.opcode == OpCodes.Call && instruction.operand == physicsRaycast)
					{
						foundRaycastCall = true;
						yield return new CodeInstruction(OpCodes.Ldarg_0, (object)null);
						yield return new CodeInstruction(OpCodes.Call, (object)raycastCustom);
					}
					else
					{
						yield return instruction;
					}
				}
			}
		}

		[HarmonyReversePatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPatch(typeof(SprayPaintItem), "PlayCanEmptyEffect")]
		public static void PlayCanEmptyEffect(object instance, bool isEmpty)
		{
			throw new NotImplementedException("stub");
		}

		public static void PositionSprayPaint(SprayPaintItem instance, GameObject gameObject, RaycastHit sprayHit, bool setColor = true)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			gameObject.transform.forward = -((RaycastHit)(ref sprayHit)).normal;
			gameObject.transform.position = ((RaycastHit)(ref sprayHit)).point;
			if (((Component)((RaycastHit)(ref sprayHit)).collider).gameObject.layer == 11 || ((Component)((RaycastHit)(ref sprayHit)).collider).gameObject.layer == 8 || ((Component)((RaycastHit)(ref sprayHit)).collider).gameObject.layer == 0)
			{
				if (((Component)((RaycastHit)(ref sprayHit)).collider).transform.IsChildOf(StartOfRound.Instance.elevatorTransform) || (Object)(object)RoundManager.Instance.mapPropsContainer == (Object)null)
				{
					gameObject.transform.SetParent(StartOfRound.Instance.elevatorTransform, true);
				}
				else
				{
					gameObject.transform.SetParent(RoundManager.Instance.mapPropsContainer.transform, true);
				}
			}
			DecalProjector component = gameObject.GetComponent<DecalProjector>();
			((Behaviour)component).enabled = true;
			SprayPaintItemNetExt sprayPaintItemNetExt = instance.NetExt();
			component.drawDistance = Plugin.DrawDistance;
			if (setColor)
			{
				component.material = sprayPaintItemNetExt.DecalMaterialForColor(sprayPaintItemNetExt.CurrentColor);
			}
			component.scaleMode = (DecalScaleMode)1;
			gameObject.transform.localScale = new Vector3(1f, 1f, 1f);
			Vector3 lossyScale = gameObject.transform.lossyScale;
			gameObject.transform.localScale = new Vector3(1f / lossyScale.x * sprayPaintItemNetExt.PaintSize, 1f / lossyScale.y * sprayPaintItemNetExt.PaintSize, 1f);
		}

		public static bool AddSprayPaintLocal(SprayPaintItem instance, Vector3 sprayPos, Vector3 sprayRot)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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)
			if (SprayPaintItem.sprayPaintDecalsIndex - SprayPaintItem.sprayPaintDecals.Count > 1)
			{
				SprayPaintItem.sprayPaintDecals.AddRange((IEnumerable<GameObject>)(object)new GameObject[SprayPaintItem.sprayPaintDecalsIndex - 2 - SprayPaintItem.sprayPaintDecals.Count]);
			}
			bool num = _AddSprayPaintLocal(instance, sprayPos, sprayRot);
			if (num && SprayPaintItem.sprayPaintDecals.Count > SprayPaintItem.sprayPaintDecalsIndex)
			{
				GameObject gameObject = SprayPaintItem.sprayPaintDecals[SprayPaintItem.sprayPaintDecalsIndex];
				RaycastHit value = Traverse.Create((object)instance).Field<RaycastHit>("sprayHit").Value;
				PositionSprayPaint(instance, gameObject, value);
			}
			return num;
		}

		[HarmonyReversePatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPatch(typeof(SprayPaintItem), "ItemInteractLeftRight")]
		public static void original_ItemInteractLeftRight(object instance, bool right)
		{
			throw new NotImplementedException("stub");
		}

		public static float _shakeRestoreAmount()
		{
			return SessionData.ShakeEfficiency;
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(SprayPaintItem), "ItemInteractLeftRight")]
		private static IEnumerable<CodeInstruction> transpiler_ItemInteractLeftRight(IEnumerable<CodeInstruction> instructions)
		{
			bool foundShakeRestoreAmount = false;
			bool addedWeedKillerSkip = false;
			foreach (CodeInstruction instruction in instructions)
			{
				if (!addedWeedKillerSkip)
				{
					addedWeedKillerSkip = true;
					foreach (CodeInstruction item in _transpiler_AddWeedKillerSkip(instruction, typeof(Patches).GetMethod("original_ItemInteractLeftRight")))
					{
						yield return item;
					}
				}
				else if (!foundShakeRestoreAmount && instruction.opcode == OpCodes.Ldc_R4 && (float)instruction.operand == 0.15f)
				{
					foundShakeRestoreAmount = true;
					yield return new CodeInstruction(OpCodes.Call, (object)typeof(Patches).GetMethod("_shakeRestoreAmount"));
				}
				else
				{
					yield return instruction;
				}
			}
		}
	}
	[BepInPlugin("taffyko.BetterSprayPaint", "BetterSprayPaint", "2.0.9")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		private delegate bool ParseConfigValue<T>(string input, out T output);

		public const string modGUID = "taffyko.BetterSprayPaint";

		public const string modName = "BetterSprayPaint";

		public const string modVersion = "2.0.9";

		internal static Harmony harmony;

		internal static QuietLogSource log;

		internal static List<Action> cleanupActions;

		internal static List<Action> sceneChangeActions;

		internal static PluginInputActions inputActions;

		public static bool AllowErasing { get; private set; }

		public static bool AllowColorChange { get; private set; }

		public static bool InfiniteTank { get; private set; }

		public static float TankCapacity { get; private set; }

		public static float ShakeEfficiency { get; private set; }

		public static bool ShakingNotNeeded { get; private set; }

		public static float Volume { get; private set; }

		public static float MaxSize { get; private set; }

		public static float Range { get; private set; }

		public static bool ShorterShakeAnimation { get; private set; }

		public static int MaxSprayPaintDecals { get; private set; }

		public static float DrawDistance { get; private set; }

		public static float SprayPreviewOpacity { get; private set; }

		public static bool ClientsCanPaintShip { get; private set; }

		static Plugin()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected O, but got Unknown
			harmony = new Harmony("taffyko.BetterSprayPaint");
			cleanupActions = new List<Action>();
			sceneChangeActions = new List<Action>();
			inputActions = new PluginInputActions();
			log = new QuietLogSource("BetterSprayPaint");
			Logger.Sources.Add((ILogSource)(object)log);
		}

		private void Awake()
		{
			log.LogInfo("Loading taffyko.BetterSprayPaint");
			ConfigInit();
			harmony.PatchAll(Assembly.GetExecutingAssembly());
		}

		private void OnDestroy()
		{
		}

		public static void UpdateSessionData()
		{
			SessionData instance = SessionData.instance;
			if ((Object)(object)instance != (Object)null && ((NetworkBehaviour)instance).IsServer)
			{
				instance.allowErasing.Value = AllowErasing;
				instance.allowColorChange.Value = AllowColorChange;
				instance.infiniteTank.Value = InfiniteTank;
				instance.tankCapacity.Value = TankCapacity;
				instance.shakeEfficiency.Value = ShakeEfficiency;
				instance.shakingNotNeeded.Value = ShakingNotNeeded;
				instance.range.Value = Range;
				instance.maxSize.Value = MaxSize;
				instance.clientsCanPaintShip.Value = ClientsCanPaintShip;
			}
		}

		private void ConfigInit()
		{
			((BaseUnityPlugin)this).Config.Bind<string>("README", "README", "", "All config values are text-based, as a workaround to make it possible for default values to change in future updates.\r\n\r\nSee https://github.com/taffyko/LCNiceChat/issues/3 for more information.\r\n\r\nIf you enter an invalid value, it will change back to \"default\" when the game starts.");
			ConfEntry("General", "AllowErasing", defaultValue: true, "When enabled, players can erase spray paint. (Note: With default controls, erasing is done by holding E and LMB at the same time)", bool.TryParse, hostControlled: true);
			ConfEntry("General", "AllowColorChange", defaultValue: true, "When enabled, players can control the color of their spray paint.", bool.TryParse, hostControlled: true);
			ConfEntry("General", "InfiniteTank", defaultValue: true, "When enabled, the spray can has infinite uses.", bool.TryParse, hostControlled: true);
			ConfEntry("General", "TankCapacity", 30f, "Amount of time (in seconds) that each can may spray for before running out (Has no effect when InfiniteTank is enabled.)", float.TryParse, 30f, hostControlled: true);
			ConfEntry("General", "ShakeEfficiency", 0.3f, "The percentage to restore on the \"shake meter\" each time the can is shaken.", float.TryParse, 0.15f, hostControlled: true);
			ConfEntry("General", "ShakingNotNeeded", defaultValue: false, "When enabled, the can never needs to be shaken.", bool.TryParse, hostControlled: true);
			ConfEntry("General", "MaxSize", 2f, "The maximum size of spray paint that players are allowed to create.", float.TryParse, hostControlled: true);
			ConfEntry("General", "Range", 7f, "The maximum distance that players can spray.", float.TryParse, 7f, hostControlled: true);
			ConfEntry("General", "ClientsCanPaintShip", defaultValue: true, "When disabled, only the host can paint on or within the ship.", bool.TryParse, hostControlled: true);
			ConfEntry("Client-side", "Volume", 0.1f, "Volume of spray paint sound effects.", float.TryParse, 1f);
			ConfEntry("Client-side", "ShorterShakeAnimation", defaultValue: true, "Whether to shorten the can-shaking animation.", bool.TryParse);
			ConfEntry("Client-side", "MaxSprayPaintDecals", 4000, "The maximum amount of spray paint decals that can exist at once. When the limit is reached, spray paint decals will start to disappear, starting with the oldest.", int.TryParse, 1000);
			ConfEntry("Client-side", "DrawDistance", 35f, "The maximum distance from which spray paint decals can be seen (Only applies to new spray paint drawn after the setting was changed, if changed mid-game).", float.TryParse, 20f);
			ConfEntry("Client-side", "SprayPreviewOpacity", 0.5f, "Opacity of the preview highlighting where spray paint will land when sprayed. Set to 0 to disable the preview altogether.", float.TryParse);
		}

		private static bool NoopParse(string input, out string output)
		{
			output = input;
			return true;
		}

		private void ConfEntry<T>(string category, string name, T defaultValue, string description, ParseConfigValue<T> tryParse, bool hostControlled = false)
		{
			ConfEntryInternal(category, name, defaultValue, description, tryParse, hostControlled);
		}

		private void ConfEntry<T>(string category, string name, T defaultValue, string description, ParseConfigValue<T> tryParse, T vanillaValue, bool hostControlled = false)
		{
			ConfEntryInternal(category, name, defaultValue, description, tryParse, hostControlled, ConfEntryToString(vanillaValue));
		}

		private void ConfEntryInternal<T>(string category, string name, T defaultValue, string description, ParseConfigValue<T> tryParse, bool hostControlled = false, string? vanillaValueText = null)
		{
			ParseConfigValue<T> tryParse2 = tryParse;
			T defaultValue2 = defaultValue;
			PropertyInfo property = typeof(Plugin).GetProperty(name);
			string text = "[default: " + ConfEntryToString(defaultValue2) + "]\n" + description;
			text += (hostControlled ? "\n(This setting is overridden by the lobby host)" : "\n(This setting's effect applies to you only)");
			if (vanillaValueText != null)
			{
				text = text + "\n(The original value of this setting in the base-game is " + vanillaValueText + ")";
			}
			ConfigEntry<string> config = ((BaseUnityPlugin)this).Config.Bind<string>(category, name, "default", text);
			if (string.IsNullOrEmpty(config.Value))
			{
				config.Value = "default";
			}
			T output;
			bool flag = tryParse2(config.Value, out output) && config.Value != "default";
			property.SetValue(null, flag ? output : defaultValue2);
			if (!flag)
			{
				config.Value = "default";
			}
			EventHandler loadConfig = delegate
			{
				T output2;
				bool flag2 = tryParse2(config.Value, out output2) && config.Value != "default";
				property.SetValue(null, flag2 ? output2 : defaultValue2);
			};
			config.SettingChanged += loadConfig;
			cleanupActions.Add(delegate
			{
				config.SettingChanged -= loadConfig;
				property.SetValue(null, defaultValue2);
			});
		}

		private string ConfEntryToString(object? value)
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (value == null)
			{
				return "null";
			}
			Type type = value.GetType();
			if (type == typeof(float))
			{
				return $"{(float)value:0.0#####}";
			}
			if (type == typeof(Color))
			{
				return "#" + ColorUtility.ToHtmlStringRGBA((Color)value);
			}
			return value.ToString();
		}
	}
	public class PluginInputActions : LcInputActions
	{
		[InputAction("<Keyboard>/e", Name = "Spray Paint Erase Modifier", ActionId = "SprayPaintEraseModifier", GamepadPath = "<Gamepad>/dpad/up")]
		public InputAction? SprayPaintEraseModifier { get; set; }

		[InputAction("", Name = "Spray Paint Erase", ActionId = "SprayPaintErase")]
		public InputAction? SprayPaintErase { get; set; }

		[InputAction("<Keyboard>/t", Name = "Spray Paint Next Color", ActionId = "SprayPaintNextColor")]
		public InputAction? SprayPaintNextColor { get; set; }

		[InputAction("", Name = "Spray Paint Previous Color", ActionId = "SprayPaintPreviousColor")]
		public InputAction? SprayPaintPreviousColor { get; set; }

		[InputAction("", Name = "Spray Paint Color 1", ActionId = "SprayPaintColor1")]
		public InputAction? SprayPaintColor1 { get; set; }

		[InputAction("", Name = "Spray Paint Color 2", ActionId = "SprayPaintColor2")]
		public InputAction? SprayPaintColor2 { get; set; }

		[InputAction("", Name = "Spray Paint Color 3", ActionId = "SprayPaintColor3")]
		public InputAction? SprayPaintColor3 { get; set; }

		[InputAction("", Name = "Spray Paint Color 4", ActionId = "SprayPaintColor4")]
		public InputAction? SprayPaintColor4 { get; set; }

		[InputAction("<Keyboard>/equals", Name = "Spray Paint Increase Size", ActionId = "SprayPaintIncreaseSize")]
		public InputAction? SprayPaintIncreaseSize { get; set; }

		[InputAction("<Keyboard>/minus", Name = "Spray Paint Decrease Size", ActionId = "SprayPaintDecreaseSize")]
		public InputAction? SprayPaintDecreaseSize { get; set; }

		[InputAction("", Name = "Spray Paint Set Size 0.1", ActionId = "SprayPaintSize01")]
		public InputAction? SprayPaintSize01 { get; set; }

		[InputAction("", Name = "Spray Paint Set Size 1.0", ActionId = "SprayPaintSize1")]
		public InputAction? SprayPaintSize1 { get; set; }

		[InputAction("", Name = "Spray Paint Set Size 2.0", ActionId = "SprayPaintSize2")]
		public InputAction? SprayPaintSize2 { get; set; }
	}
	public class ActionSubscriptionBuilder
	{
		public List<Action> cleanupActions;

		public Func<bool> active;

		public ActionSubscriptionBuilder(List<Action> cleanupActions, Func<bool> active)
		{
			this.cleanupActions = cleanupActions;
			this.active = active;
			base..ctor();
		}

		public void Subscribe(InputAction? action, EventHandler<CallbackContext> onStart, EventHandler<CallbackContext>? onStop = null)
		{
			EventHandler<CallbackContext> onStart2 = onStart;
			EventHandler<CallbackContext> onStop2 = onStop;
			Subscribe(action, delegate(object sender, CallbackContext e)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				onStart2(sender, e);
				return null;
			}, (onStop2 == null) ? null : ((Action<object, CallbackContext, object>)delegate(object sender, CallbackContext e, object? ret)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				onStop2(sender, e);
			}));
		}

		public void Subscribe<T>(InputAction? action, Func<object, CallbackContext, T> onStart, Action<object, CallbackContext, T?>? onStop = null)
		{
			Func<object, CallbackContext, T> onStart2 = onStart;
			Action<object, CallbackContext, T?> onStop2 = onStop;
			InputAction action2 = action;
			if (action2 == null)
			{
				Plugin.log.LogWarning("Subscribe called with null InputAction");
				return;
			}
			EventInfo startedEvent = typeof(InputAction).GetEvent("started");
			EventInfo canceledEvent = typeof(InputAction).GetEvent("canceled");
			T ret = default(T);
			bool actionHeld = false;
			Action<CallbackContext> startHandler = delegate(CallbackContext e)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				if (active())
				{
					actionHeld = true;
					ret = onStart2(this, e);
				}
			};
			Action<CallbackContext> cancelHandler = delegate(CallbackContext e)
			{
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				if (actionHeld && onStop2 != null)
				{
					onStop2(this, e, ret);
					actionHeld = false;
				}
			};
			startedEvent.AddEventHandler(action2, startHandler);
			cleanupActions.Add(delegate
			{
				startedEvent.RemoveEventHandler(action2, startHandler);
			});
			canceledEvent.AddEventHandler(action2, cancelHandler);
			cleanupActions.Add(delegate
			{
				canceledEvent.RemoveEventHandler(action2, cancelHandler);
			});
		}
	}
	public static class Utils
	{
		public static string GetPath(this Transform current, Transform? relativeTo = null)
		{
			if ((Object)(object)current == (Object)(object)relativeTo)
			{
				return "";
			}
			if ((Object)(object)current.parent == (Object)null)
			{
				return "/" + ((Object)current).name;
			}
			string path = current.parent.GetPath(relativeTo);
			if (path == "")
			{
				return ((Object)current).name;
			}
			return path + "/" + ((Object)current).name;
		}

		public static IEnumerable<Transform> GetAncestors(this Transform self, bool includeSelf = true)
		{
			Transform current = self;
			if (!includeSelf)
			{
				current = self.parent;
			}
			while ((Object)(object)current != (Object)null)
			{
				yield return current;
				current = current.parent;
			}
		}

		public static bool IsLocalPlayer(this PlayerControllerB? player)
		{
			if ((Object)(object)player != (Object)null)
			{
				return (Object)(object)player == (Object)(object)StartOfRound.Instance?.localPlayerController;
			}
			return false;
		}

		public static SprayPaintItemNetExt NetExt(this SprayPaintItem instance)
		{
			SprayPaintItemNetExt component = ((Component)instance).GetComponent<SprayPaintItemNetExt>();
			if ((Object)(object)component == (Object)null)
			{
				Plugin.log.LogError("SprayPaintItem.Ext() is null");
			}
			return component;
		}

		public static SprayPaintItemExt Ext(this SprayPaintItem instance)
		{
			SprayPaintItemExt sprayPaintItemExt = ((Component)instance).GetComponent<SprayPaintItemExt>();
			if ((Object)(object)sprayPaintItemExt == (Object)null)
			{
				sprayPaintItemExt = ((Component)instance).gameObject.AddComponent<SprayPaintItemExt>();
			}
			return sprayPaintItemExt;
		}

		public static PlayerNetExt? NetExt(this PlayerControllerB? instance)
		{
			PlayerNetExt result = default(PlayerNetExt);
			if ((Object)(object)instance != (Object)null && ((Component)instance).TryGetComponent<PlayerNetExt>(ref result))
			{
				return result;
			}
			return null;
		}

		public static void SyncWithNetworkObject(this NetworkBehaviour networkBehaviour, NetworkObject? networkObject)
		{
			networkObject = networkObject ?? networkBehaviour.NetworkObject;
			if (!networkObject.ChildNetworkBehaviours.Contains(networkBehaviour))
			{
				networkObject.ChildNetworkBehaviours.Add(networkBehaviour);
			}
			networkBehaviour.UpdateNetworkProperties();
		}

		public static float Lexp(float a, float b, float t)
		{
			return a + (b - a) * (1f - Mathf.Exp(0f - t));
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "BetterSprayPaint";

		public const string PLUGIN_NAME = "BetterSprayPaint";

		public const string PLUGIN_VERSION = "2.0.9";
	}
}
namespace BetterSprayPaint.Ngo
{
	public class PlayerNetExt : NetworkBehaviour
	{
		internal NetworkVariable<float> paintSize;

		internal NetVar<float> PaintSize;

		private INetVar[] netVars = Array.Empty<INetVar>();

		public PlayerControllerB instance => ((Component)this).GetComponent<PlayerControllerB>();

		[ServerRpc(RequireOwnership = false)]
		private void SetPaintSizeServerRpc(float value)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(58249432u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref value, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 58249432u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					PaintSize.ServerSet(value);
				}
			}
		}

		private PlayerNetExt()
		{
			PaintSize = new NetVar<float>(out paintSize, SetPaintSizeServerRpc, () => instance.IsLocalPlayer(), 1f, null, null, null, (float value) => Mathf.Clamp(value, 0.1f, SessionData.MaxSize));
			netVars = INetVar.GetAllNetVars(this);
		}

		public override void OnNetworkSpawn()
		{
			((NetworkBehaviour)this).OnNetworkSpawn();
		}

		private void Update()
		{
			INetVar[] array = netVars;
			for (int i = 0; i < array.Length; i++)
			{
				array[i].Synchronize();
			}
		}

		public override void OnNetworkDespawn()
		{
			((NetworkBehaviour)this).OnNetworkDespawn();
			INetVar[] array = netVars;
			for (int i = 0; i < array.Length; i++)
			{
				array[i].Dispose();
			}
		}

		protected override void __initializeVariables()
		{
			if (paintSize == null)
			{
				throw new Exception("PlayerNetExt.paintSize cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)paintSize).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)paintSize, "paintSize");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)paintSize);
			((NetworkBehaviour)this).__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_PlayerNetExt()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(58249432u, new RpcReceiveHandler(__rpc_handler_58249432));
		}

		private static void __rpc_handler_58249432(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: 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)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				float paintSizeServerRpc = default(float);
				((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref paintSizeServerRpc, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((PlayerNetExt)(object)target).SetPaintSizeServerRpc(paintSizeServerRpc);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "PlayerNetExt";
		}
	}
	internal static class NgoHelper
	{
		internal static List<Action> cleanupActions = new List<Action>();

		internal static GameObject? prefabContainer = null;

		private static List<(Type custom, Type native, Type? excluded)> BehaviourBindings { get; } = new List<(Type, Type, Type)>();


		internal static void RegisterPrefab<T>(GameObject prefab, string name) where T : MonoBehaviour
		{
			GameObject prefab2 = prefab;
			prefab2.AddComponent<T>();
			((Object)prefab2).hideFlags = (HideFlags)61;
			prefab2.transform.SetParent(prefabContainer.transform);
			NetworkObject obj = prefab2.AddComponent<NetworkObject>();
			string s = "taffyko.BetterSprayPaint." + name;
			byte[] value = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(s));
			obj.GlobalObjectIdHash = BitConverter.ToUInt32(value, 0);
			NetworkManager.Singleton.AddNetworkPrefab(prefab2);
			cleanupActions.Add(delegate
			{
				MonoBehaviour[] array = (MonoBehaviour[])(object)Resources.FindObjectsOfTypeAll<T>();
				array = array;
				foreach (MonoBehaviour obj2 in array)
				{
					NetworkManager.Singleton.RemoveNetworkPrefab(prefab2);
					Object.Destroy((Object)(object)((Component)obj2).gameObject);
				}
			});
		}

		internal static void AddScriptToInstances<TCustomBehaviour, TNativeBehaviour>(bool updatePrefabs = false, Type? excluded = null) where TCustomBehaviour : NetworkBehaviour where TNativeBehaviour : NetworkBehaviour
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			TNativeBehaviour[] array = Resources.FindObjectsOfTypeAll<TNativeBehaviour>();
			foreach (TNativeBehaviour val in array)
			{
				if ((excluded != null && ((object)val).GetType().IsInstanceOfType(excluded)) || (Object)(object)((Component)(object)val).gameObject.GetComponent<TCustomBehaviour>() != (Object)null)
				{
					continue;
				}
				Scene scene = ((Component)(object)val).gameObject.scene;
				bool flag = !((Scene)(ref scene)).IsValid();
				if (flag && updatePrefabs)
				{
					NetworkPrefabs prefabs = NetworkManager.Singleton.NetworkConfig.Prefabs;
					NetworkObject networkObject = ((Component)(object)val).gameObject.GetComponent<NetworkObject>();
					NetworkPrefab val2 = prefabs.m_Prefabs.Find((NetworkPrefab p) => p.SourcePrefabGlobalObjectIdHash == networkObject.GlobalObjectIdHash);
					foreach (NetworkPrefabsList networkPrefabsList in prefabs.NetworkPrefabsLists)
					{
						networkPrefabsList.Remove(val2);
					}
					NetworkManager.Singleton.RemoveNetworkPrefab(((Component)(object)val).gameObject);
					if (val2 != null)
					{
						_ = val2.SourcePrefabGlobalObjectIdHash;
						prefabs.NetworkPrefabOverrideLinks.Remove(val2.SourcePrefabGlobalObjectIdHash);
					}
					if (val2 != null)
					{
						_ = val2.TargetPrefabGlobalObjectIdHash;
						prefabs.OverrideToNetworkPrefab.Remove(val2.TargetPrefabGlobalObjectIdHash);
					}
				}
				((NetworkBehaviour)(object)((Component)(object)val).gameObject.AddComponent<TCustomBehaviour>()).SyncWithNetworkObject(((Component)(object)val).gameObject.GetComponent<NetworkObject>());
				if (flag && updatePrefabs)
				{
					NetworkManager.Singleton.AddNetworkPrefab(((Component)(object)val).gameObject);
				}
			}
		}

		internal static void RegisterScriptWithExistingPrefab<TCustomBehaviour, TNativeBehaviour>(Type? excluded = null) where TCustomBehaviour : NetworkBehaviour where TNativeBehaviour : NetworkBehaviour
		{
			Type excluded2 = excluded;
			AddScriptToInstances<TCustomBehaviour, TNativeBehaviour>(updatePrefabs: true, excluded2);
			UnityAction<Scene, LoadSceneMode> handler = delegate
			{
				AddScriptToInstances<TCustomBehaviour, TNativeBehaviour>(updatePrefabs: false, excluded2);
			};
			SceneManager.sceneLoaded += handler;
			cleanupActions.Add(delegate
			{
				SceneManager.sceneLoaded -= handler;
				TNativeBehaviour[] array = Resources.FindObjectsOfTypeAll<TNativeBehaviour>();
				for (int i = 0; i < array.Length; i++)
				{
					Object.Destroy((Object)(object)((Component)(object)array[i]).gameObject.GetComponent<TCustomBehaviour>());
				}
			});
			BindToPreExistingObjectByBehaviourPatch<TCustomBehaviour, TNativeBehaviour>(excluded2);
		}

		private static void RegisterCustomScripts()
		{
			NgoHelper.RegisterPrefab<SessionData>(SessionData.prefab, "SessionData");
			NetworkManager.Singleton.OnServerStarted += SessionData.ServerSpawn;
			cleanupActions.Add(delegate
			{
				NetworkManager.Singleton.OnServerStarted -= SessionData.ServerSpawn;
			});
			NetworkManager.Singleton.OnClientStopped += SessionData.Despawn;
			cleanupActions.Add(delegate
			{
				NetworkManager.Singleton.OnClientStopped -= SessionData.Despawn;
			});
			NgoHelper.RegisterScriptWithExistingPrefab<SprayPaintItemNetExt, SprayPaintItem>((Type?)null);
			NgoHelper.RegisterScriptWithExistingPrefab<PlayerNetExt, PlayerControllerB>((Type?)null);
		}

		public static void BindToPreExistingObjectByBehaviourPatch<TCustomBehaviour, TNativeBehaviour>(Type? excluded = null) where TCustomBehaviour : NetworkBehaviour where TNativeBehaviour : NetworkBehaviour
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			Type typeFromHandle = typeof(TCustomBehaviour);
			Type typeFromHandle2 = typeof(TNativeBehaviour);
			BehaviourBindings.Add((typeFromHandle, typeFromHandle2, excluded));
			MethodInfo methodInfo = null;
			try
			{
				methodInfo = typeFromHandle2.GetMethod("Awake", BindingFlags.Instance);
			}
			catch (Exception)
			{
			}
			if (methodInfo != null)
			{
				MethodBase methodBase = AccessTools.Method(typeFromHandle2, "Awake", (Type[])null, (Type[])null);
				HarmonyMethod val = new HarmonyMethod(typeof(NgoHelper), "BindBehaviourOnAwake", (Type[])null);
				Plugin.harmony.Patch(methodBase, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
		}

		internal static void BindBehaviourOnAwake(NetworkBehaviour __instance, MethodBase __originalMethod)
		{
			MethodBase __originalMethod2 = __originalMethod;
			Type type = ((object)__instance).GetType();
			Component val = default(Component);
			foreach (var item in BehaviourBindings.Where<(Type, Type, Type)>(((Type custom, Type native, Type excluded) obj) => (obj.native == __originalMethod2.DeclaringType || type == obj.native) && (obj.excluded == null || !type.IsInstanceOfType(obj.excluded))))
			{
				if (!((Component)__instance).gameObject.TryGetComponent(item.Item1, ref val))
				{
					Component obj2 = ((Component)__instance).gameObject.AddComponent(item.Item1);
					((NetworkBehaviour)(object)((obj2 is NetworkBehaviour) ? obj2 : null)).SyncWithNetworkObject(((Component)__instance).gameObject.GetComponent<NetworkObject>());
				}
			}
		}

		internal static void NetcodeInit()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			if ((Object)(object)prefabContainer != (Object)null)
			{
				throw new Exception("Ran NetcodeInit() more than once");
			}
			prefabContainer = new GameObject();
			prefabContainer.SetActive(false);
			((Object)prefabContainer).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)(object)prefabContainer);
			RegisterCustomScripts();
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			for (int i = 0; i < types.Length; i++)
			{
				MethodInfo[] methods = types[i].GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				foreach (MethodInfo methodInfo in methods)
				{
					if (methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false).Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}

		public static GameObject? FindBuiltinPrefabByScript<T>() where T : MonoBehaviour
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			GameObject result = null;
			T[] array = Resources.FindObjectsOfTypeAll<T>();
			foreach (T val in array)
			{
				Scene scene = ((Component)(object)val).gameObject.scene;
				if (!((Scene)(ref scene)).IsValid())
				{
					result = ((Component)(object)val).gameObject;
					break;
				}
			}
			return result;
		}

		public static void NetcodeUnload()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			Plugin.log.LogInfo("Unloading NGO for BetterSprayPaint");
			NetworkManager singleton = NetworkManager.Singleton;
			if (singleton != null && ((Behaviour)singleton).isActiveAndEnabled && (Object)(object)prefabContainer != (Object)null)
			{
				foreach (Transform item in prefabContainer.transform)
				{
					Transform val = item;
					NetworkManager.Singleton.RemoveNetworkPrefab(((Component)val).gameObject);
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
				Object.Destroy((Object)(object)prefabContainer);
			}
			foreach (Action cleanupAction in cleanupActions)
			{
				cleanupAction();
			}
			cleanupActions.Clear();
		}
	}
	[HarmonyPatch]
	internal class NetcodeInitPatch
	{
		private static bool loaded;

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameNetworkManager), "Start")]
		public static void GameNetworkManagerStart(GameNetworkManager __instance)
		{
			if (!loaded && (Object)(object)NetworkManager.Singleton != (Object)null)
			{
				if ((Object)(object)NgoHelper.prefabContainer == (Object)null)
				{
					NgoHelper.NetcodeInit();
				}
				loaded = true;
			}
		}
	}
	public class SessionData : NetworkBehaviour
	{
		internal static GameObject prefab = new GameObject("SessionData");

		internal static SessionData? instance = null;

		internal NetworkVariable<bool> allowColorChange = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<bool> allowErasing = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<bool> infiniteTank = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<float> tankCapacity = new NetworkVariable<float>(0f, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<float> shakeEfficiency = new NetworkVariable<float>(0f, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<bool> shakingNotNeeded = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<float> range = new NetworkVariable<float>(0f, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<float> maxSize = new NetworkVariable<float>(0f, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		internal NetworkVariable<bool> clientsCanPaintShip = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		public static bool AllowColorChange => instance?.allowColorChange?.Value ?? Plugin.AllowColorChange;

		public static bool AllowErasing => instance?.allowErasing?.Value ?? Plugin.AllowErasing;

		public static bool InfiniteTank => instance?.infiniteTank?.Value ?? Plugin.InfiniteTank;

		public static float TankCapacity => instance?.tankCapacity?.Value ?? Plugin.TankCapacity;

		public static float ShakeEfficiency => instance?.shakeEfficiency?.Value ?? Plugin.ShakeEfficiency;

		public static bool ShakingNotNeeded => instance?.shakingNotNeeded?.Value ?? Plugin.ShakingNotNeeded;

		public static float Range => instance?.range?.Value ?? Plugin.Range;

		public static float MaxSize => instance?.maxSize?.Value ?? Plugin.MaxSize;

		public static bool ClientsCanPaintShip => instance?.clientsCanPaintShip?.Value ?? Plugin.ClientsCanPaintShip;

		public override void OnNetworkSpawn()
		{
			instance = ((Component)this).GetComponent<SessionData>();
		}

		public override void OnDestroy()
		{
			instance = null;
		}

		internal static void ServerSpawn()
		{
			if (NetworkManager.Singleton.IsServer && (Object)(object)instance == (Object)null)
			{
				Object.Instantiate<GameObject>(prefab).GetComponent<NetworkObject>().Spawn(false);
			}
		}

		internal static void Despawn(bool _)
		{
			SessionData? sessionData = instance;
			Object.Destroy((Object)(object)((sessionData != null) ? ((Component)sessionData).gameObject : null));
		}

		protected override void __initializeVariables()
		{
			if (allowColorChange == null)
			{
				throw new Exception("SessionData.allowColorChange cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)allowColorChange).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)allowColorChange, "allowColorChange");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)allowColorChange);
			if (allowErasing == null)
			{
				throw new Exception("SessionData.allowErasing cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)allowErasing).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)allowErasing, "allowErasing");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)allowErasing);
			if (infiniteTank == null)
			{
				throw new Exception("SessionData.infiniteTank cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)infiniteTank).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)infiniteTank, "infiniteTank");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)infiniteTank);
			if (tankCapacity == null)
			{
				throw new Exception("SessionData.tankCapacity cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)tankCapacity).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)tankCapacity, "tankCapacity");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)tankCapacity);
			if (shakeEfficiency == null)
			{
				throw new Exception("SessionData.shakeEfficiency cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)shakeEfficiency).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)shakeEfficiency, "shakeEfficiency");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)shakeEfficiency);
			if (shakingNotNeeded == null)
			{
				throw new Exception("SessionData.shakingNotNeeded cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)shakingNotNeeded).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)shakingNotNeeded, "shakingNotNeeded");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)shakingNotNeeded);
			if (range == null)
			{
				throw new Exception("SessionData.range cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)range).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)range, "range");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)range);
			if (maxSize == null)
			{
				throw new Exception("SessionData.maxSize cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)maxSize).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)maxSize, "maxSize");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)maxSize);
			if (clientsCanPaintShip == null)
			{
				throw new Exception("SessionData.clientsCanPaintShip cannot be null. All NetworkVariableBase instances must be initialized.");
			}
			((NetworkVariableBase)clientsCanPaintShip).Initialize((NetworkBehaviour)(object)this);
			((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)clientsCanPaintShip, "clientsCanPaintShip");
			base.NetworkVariableFields.Add((NetworkVariableBase)(object)clientsCanPaintShip);
			((NetworkBehaviour)this).__initializeVariables();
		}

		protected internal override string __getTypeName()
		{
			return "SessionData";
		}
	}
	public class SprayPaintItemNetExt : NetworkBehaviour
	{
		private NetworkVariable<bool> _isErasing = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		private bool _localIsErasing;

		public NetworkVariable<float> ShakeMeter = new NetworkVariable<float>(1f, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		public NetworkVariable<Color> _currentColor = new NetworkVariable<Color>(default(Color), (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		private Color _localCurrentColor;

		public NetworkVariable<NetworkObjectReference> PlayerHeldBy = new NetworkVariable<NetworkObjectReference>(default(NetworkObjectReference), (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);

		public int sprayPaintMask;

		public Material? baseParticleMaterial;

		public Material? sprayEraseParticleMaterial;

		public Material? baseDecalMaterial;

		public ParticleSystem? sprayCanColorChangeParticle;

		private List<Action> cleanupActions = new List<Action>();

		public static Dictionary<Color, WeakReference<Material>> AllDecalMaterials = new Dictionary<Color, WeakReference<Material>>();

		public static Dictionary<Color, WeakReference<Material>> AllParticleMaterials = new Dictionary<Color, WeakReference<Material>>();

		public List<Color> ColorPalette = new List<Color>();

		private SprayPaintItem instance => ((Component)this).GetComponent<SprayPaintItem>();

		public bool HeldByLocalPlayer
		{
			get
			{
				if (((GrabbableObject)instance).playerHeldBy.IsLocalPlayer())
				{
					return ((GrabbableObject)instance).playerHeldBy.ItemSlots.Any((GrabbableObject item) => (Object)(object)item == (Object)(object)instance);
				}
				return false;
			}
		}

		public bool InActiveSlot
		{
			get
			{
				if ((Object)(object)((GrabbableObject)instance).playerHeldBy != (Object)null)
				{
					return (Object)(object)((GrabbableObject)instance).playerHeldBy.ItemSlots[((GrabbableObject)instance).playerHeldBy.currentItemSlot] == (Object)(object)instance;
				}
				return false;
			}
		}

		private static SessionData sessionData => SessionData.instance;

		public bool IsErasing
		{
			get
			{
				if (!HeldByLocalPlayer)
				{
					return _isErasing.Value;
				}
				return _localIsErasing;
			}
			set
			{
				if (_localIsErasing != value)
				{
					_localIsErasing = value;
					ToggleErasingServerRpc(value);
				}
			}
		}

		public float PaintSize
		{
			get
			{
				PlayerNetExt playerNetExt = null;
				if ((Object)(object)((GrabbableObject)instance).playerHeldBy != (Object)null)
				{
					playerNetExt = ((GrabbableObject)instance).playerHeldBy.NetExt();
				}
				if ((Object)(object)playerNetExt == (Object)null)
				{
					return 1f;
				}
				return playerNetExt.PaintSize.Value;
			}
			set
			{
				if ((Object)(object)((GrabbableObject)instance).playerHeldBy != (Object)null)
				{
					PlayerNetExt playerNetExt = ((GrabbableObject)instance).playerHeldBy.NetExt();
					if ((Object)(object)playerNetExt != (Object)null)
					{
						playerNetExt.PaintSize.Value = value;
					}
					else
					{
						Plugin.log.LogWarning("Tried to set PaintSize but playerHeldBy.NetExt() is null");
					}
				}
				else
				{
					Plugin.log.LogWarning("Tried to set PaintSize but playerHeldBy is null");
				}
			}
		}

		public Color CurrentColor
		{
			get
			{
				//IL_0015: 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)
				if (!HeldByLocalPlayer)
				{
					return _currentColor.Value;
				}
				return _localCurrentColor;
			}
			set
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				if (_localCurrentColor != value)
				{
					_localCurrentColor = value;
					SetCurrentColorServerRpc(value);
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void ToggleErasingServerRpc(bool active)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2165861534u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref active, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2165861534u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					_isErasing.Value = active;
				}
			}
		}

		public void OnChangeErasing(bool previous, bool current)
		{
			if (!HeldByLocalPlayer)
			{
				UpdateParticles();
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SetCurrentColorServerRpc(Color color)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3718705491u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe(ref color);
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3718705491u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					_currentColor.Value = color;
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void SetPlayerHeldByServerRpc(NetworkObjectReference playerRef)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1553169032u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref playerRef, default(ForNetworkSerializable));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1553169032u, val, (RpcDelivery)0);
				}
				NetworkObject val3 = default(NetworkObject);
				PlayerControllerB val4 = default(PlayerControllerB);
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && ((NetworkObjectReference)(ref playerRef)).TryGet(ref val3, (NetworkManager)null) && ((Component)val3).TryGetComponent<PlayerControllerB>(ref val4))
				{
					PlayerHeldBy.Value = playerRef;
				}
			}
		}

		public int posmod(int n, int d)
		{
			return (n % d + d) % d;
		}

		public Material DecalMaterialForColor(Color color)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//IL_004a: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			if (AllDecalMaterials.TryGetValue(color, out WeakReference<Material> value) && value.TryGetTarget(out var target) && (Object)(object)target != (Object)null && target.color == color)
			{
				return target;
			}
			target = new Material(baseDecalMaterial)
			{
				color = color
			};
			AllDecalMaterials[color] = new WeakReference<Material>(target);
			return target;
		}

		public Material ParticleMaterialForColor(Color color)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (AllParticleMaterials.TryGetValue(color, out WeakReference<Material> value) && value.TryGetTarget(out var target))
			{
				return target;
			}
			target = new Material(baseParticleMaterial)
			{
				color = color
			};
			AllParticleMaterials[color] = new WeakReference<Material>(target);
			return target;
		}

		public override void OnNetworkSpawn()
		{
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Expected O, but got Unknown
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_0233: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			((NetworkBehaviour)this).OnNetworkSpawn();
			if (!instance.isWeedKillerSprayBottle)
			{
				sprayPaintMask = Traverse.Create((object)instance).Field("sprayPaintMask").GetValue<int>();
				int value = Traverse.Create((object)instance).Field<int>("sprayCanMatsIndex").Value;
				baseParticleMaterial = instance.particleMats[value];
				baseDecalMaterial = instance.sprayCanMats[value];
				if (((NetworkBehaviour)this).IsServer)
				{
					Random random = new Random();
					Material val = instance.sprayCanMats[random.Next(instance.sprayCanMats.Length)];
					CurrentColor = val.color;
				}
				sprayEraseParticleMaterial = new Material(baseParticleMaterial);
				sprayEraseParticleMaterial.color = new Color(0.5f, 0.5f, 0.5f, 1f);
				ColorPalette = instance.sprayCanMats.Select((Material mat) => mat.color).ToList();
				Material[] sprayCanMats = instance.sprayCanMats;
				foreach (Material val2 in sprayCanMats)
				{
					AllDecalMaterials[val2.color] = new WeakReference<Material>(val2);
				}
				sprayCanMats = instance.particleMats;
				foreach (Material val3 in sprayCanMats)
				{
					AllParticleMaterials[val3.color] = new WeakReference<Material>(val3);
				}
				GameObject val4 = Object.Instantiate<GameObject>(((Component)instance.sprayCanNeedsShakingParticle).gameObject);
				((Object)val4).name = "ColorChangeParticle";
				sprayCanColorChangeParticle = val4.GetComponent<ParticleSystem>();
				((Component)sprayCanColorChangeParticle).transform.SetParent(((Component)instance).transform, false);
				MainModule main = sprayCanColorChangeParticle.main;
				((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)0;
				((MainModule)(ref main)).startSpeedMultiplier = 2f;
				((MainModule)(ref main)).startLifetimeMultiplier = 0.1f;
				EmissionModule emission = sprayCanColorChangeParticle.emission;
				((EmissionModule)(ref emission)).rateOverTimeMultiplier = 100f;
				ShapeModule shape = sprayCanColorChangeParticle.shape;
				((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)0;
				NetworkVariable<bool> isErasing = _isErasing;
				isErasing.OnValueChanged = (OnValueChangedDelegate<bool>)(object)Delegate.Combine((Delegate?)(object)isErasing.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<bool>(OnChangeErasing));
			}
		}

		public IEnumerator ChangeColorCoroutine(Color color)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			CurrentColor = color;
			UpdateParticles();
			if (Traverse.Create((object)instance).Field("sprayCanTank").GetValue<float>() > 0f)
			{
				sprayCanColorChangeParticle.Play();
				yield return (object)new WaitForSeconds(0.1f);
				sprayCanColorChangeParticle.Stop();
			}
		}

		public IEnumerator ChangeSizeCoroutine()
		{
			bool increase = Plugin.inputActions.SprayPaintIncreaseSize.IsPressed();
			bool decrease = Plugin.inputActions.SprayPaintDecreaseSize.IsPressed();
			PaintSize += (increase ? 0.1f : (-0.1f));
			yield return (object)new WaitForSeconds(0.1f);
			while (HeldByLocalPlayer && (increase || decrease))
			{
				increase = Plugin.inputActions.SprayPaintIncreaseSize.IsPressed();
				decrease = Plugin.inputActions.SprayPaintDecreaseSize.IsPressed();
				PaintSize += (increase ? 0.1f : (-0.1f));
				yield return (object)new WaitForSeconds(0.025f);
			}
		}

		public void UpdateParticles()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			ShapeModule shape = instance.sprayParticle.shape;
			MainModule main = instance.sprayParticle.main;
			float num = Mathf.Min(1.5f, PaintSize);
			((MainModule)(ref main)).startSizeMultiplier = 0.5f * num;
			((ShapeModule)(ref shape)).scale = new Vector3(num, num, num);
			Material material = ParticleMaterialForColor(CurrentColor);
			((Renderer)((Component)sprayCanColorChangeParticle).GetComponent<ParticleSystemRenderer>()).material = material;
			if (SessionData.AllowErasing && IsErasing)
			{
				Material material2 = sprayEraseParticleMaterial;
				((Renderer)((Component)instance.sprayCanNeedsShakingParticle).GetComponent<ParticleSystemRenderer>()).material = material2;
				((Renderer)((Component)instance.sprayParticle).GetComponent<ParticleSystemRenderer>()).material = material2;
				((ShapeModule)(ref shape)).angle = 5f;
				((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(50f);
				((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.1f);
			}
			else
			{
				((Renderer)((Component)instance.sprayCanNeedsShakingParticle).GetComponent<ParticleSystemRenderer>()).material = material;
				((Renderer)((Component)instance.sprayParticle).GetComponent<ParticleSystemRenderer>()).material = material;
				((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(100f);
				((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.05f);
				((ShapeModule)(ref shape)).angle = 0f;
			}
		}

		public override void OnNetworkDespawn()
		{
			((NetworkBehaviour)this).OnNetworkDespawn();
			if (instance.isWeedKillerSprayBottle)
			{
				return;
			}
			NetworkVariable<bool> isErasing = _isErasing;
			isErasing.OnValueChanged = (OnValueChangedDelegate<bool>)(object)Delegate.Remove((Delegate?)(object)isErasing.OnValueChanged, (Delegate?)(object)new OnValueChangedDelegate<bool>(OnChangeErasing));
			foreach (Action cleanupAction in cleanupActions)
			{
				cleanupAction();
			}
		}

		public void Update()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (!instance.isWeedKillerSprayBottle)
			{
				if (HeldByLocalPlayer && InActiveSlot)
				{
					UpdateTooltips();
				}
				if (!HeldByLocalPlayer && _localCurrentColor != _currentColor.Value)
				{
					_localCurrentColor = _currentColor.Value;
				}
				if (!HeldByLocalPlayer && (Object)(object)((GrabbableObject)instance).playerHeldBy != (Object)null)
				{
					UpdateParticles();
				}
			}
		}

		public void UpdateTooltips()
		{
			if (HUDManager.Instance.controlTipLines.Length >= 4)
			{
				((TMP_Text)HUDManager.Instance.controlTipLines[3]).text = $"Size : {PaintSize:0.0}";
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void UpdateShakeMeterServerRpc(float shakeMeter)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1150776642u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<float>(ref shakeMeter, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1150776642u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ShakeMeter.Value = shakeMeter;
				}
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void EraseServerRpc(Vector3 sprayPos, ServerRpcParams rpc = default(ServerRpcParams))
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					FastBufferWriter val = ((NetworkBehaviour)this).__beginSendServerRpc(1724506213u, rpc, (RpcDelivery)0);
					((FastBufferWriter)(ref val)).WriteValueSafe(ref sprayPos);
					((NetworkBehaviour)this).__endSendServerRpc(ref val, 1724506213u, rpc, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost) && SessionData.AllowErasing)
				{
					EraseClientRpc(sprayPos);
				}
			}
		}

		[ClientRpc]
		public void EraseClientRpc(Vector3 sprayPos)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: 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_00dd: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(641093140u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe(ref sprayPos);
					((NetworkBehaviour)this).__endSendClientRpc(ref val2, 641093140u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost) && SessionData.AllowErasing && !HeldByLocalPlayer)
				{
					Patches.EraseSprayPaintAtPoint(instance, 

BepInEx/plugins/plugins/BuyableShotgunShells.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
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 GameNetcodeStuff;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;

[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.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("BuyableShotgunShells")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyCopyright("Copyright © 2023 MegaPiggy")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d6d2c0f918043d4e4353ef5c47682e34337a1e68")]
[assembly: AssemblyProduct("BuyableShotgunShells")]
[assembly: AssemblyTitle("BuyableShotgunShells")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace BuyableShotgunShells
{
	[BepInDependency("evaisa.lethallib", "0.13.2")]
	[BepInPlugin("MegaPiggy.BuyableShotgunShells", "Buyable Shotgun Shells", "1.3.0")]
	public class BuyableShotgunShells : BaseUnityPlugin
	{
		public class ClonedItem : Item
		{
			public Item original;
		}

		internal class Unflagger : MonoBehaviour
		{
			public void Awake()
			{
				((Object)((Component)this).gameObject).hideFlags = (HideFlags)0;
			}
		}

		[HarmonyPatch]
		internal static class Patches
		{
			[CompilerGenerated]
			private static class <>O
			{
				public static HandleNamedMessageDelegate <0>__OnRequestSync;

				public static HandleNamedMessageDelegate <1>__OnReceiveSync;
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
			public static void ServerConnect()
			{
				//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_0084: 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_008f: Expected O, but got Unknown
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0045: Expected O, but got Unknown
				if (IsHost)
				{
					LoggerInstance.LogInfo((object)"Started hosting, using local settings");
					CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager;
					object obj = <>O.<0>__OnRequestSync;
					if (obj == null)
					{
						HandleNamedMessageDelegate val = OnRequestSync;
						<>O.<0>__OnRequestSync = val;
						obj = (object)val;
					}
					customMessagingManager.RegisterNamedMessageHandler("BuyableShotgunShells_OnRequestConfigSync", (HandleNamedMessageDelegate)obj);
					UpdateShopItemPrice();
				}
				else
				{
					LoggerInstance.LogInfo((object)"Connected to server, requesting settings");
					CustomMessagingManager customMessagingManager2 = NetworkManager.Singleton.CustomMessagingManager;
					object obj2 = <>O.<1>__OnReceiveSync;
					if (obj2 == null)
					{
						HandleNamedMessageDelegate val2 = OnReceiveSync;
						<>O.<1>__OnReceiveSync = val2;
						obj2 = (object)val2;
					}
					customMessagingManager2.RegisterNamedMessageHandler("BuyableShotgunShells_OnReceiveConfigSync", (HandleNamedMessageDelegate)obj2);
					NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("BuyableShotgunShells_OnRequestConfigSync", 0uL, new FastBufferWriter(0, (Allocator)2, -1), (NetworkDelivery)2);
				}
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(GameNetworkManager), "Start")]
			public static void Start()
			{
				LoggerInstance.LogWarning((object)"Game network manager start");
				CloneShells();
			}

			[HarmonyPostfix]
			[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
			public static void ServerDisconnect()
			{
				LoggerInstance.LogInfo((object)"Server disconnect");
				ShellPriceRemote = -1;
			}
		}

		private const string modGUID = "MegaPiggy.BuyableShotgunShells";

		private const string modName = "Buyable Shotgun Shells";

		private const string modVersion = "1.3.0";

		private readonly Harmony harmony = new Harmony("MegaPiggy.BuyableShotgunShells");

		private static BuyableShotgunShells Instance;

		private static ConfigEntry<int> ShellPriceConfig;

		internal static int ShellPriceRemote = -1;

		private static Dictionary<string, TerminalNode> infoNodes = new Dictionary<string, TerminalNode>();

		public static byte CurrentVersionByte = 1;

		private static ManualLogSource LoggerInstance => ((BaseUnityPlugin)Instance).Logger;

		public static List<Item> AllItems => Resources.FindObjectsOfTypeAll<Item>().Reverse().ToList();

		public static Item ShotgunShell => ((IEnumerable<Item>)AllItems).FirstOrDefault((Func<Item, bool>)((Item item) => ((Object)item).name.Equals("GunAmmo") && (Object)(object)item.spawnPrefab != (Object)null));

		public static ClonedItem ShotgunShellClone { get; private set; }

		public static int ShellPriceLocal => ShellPriceConfig.Value;

		public static int ShellPrice => (ShellPriceRemote > -1) ? ShellPriceRemote : ShellPriceLocal;

		private static bool IsHost => NetworkManager.Singleton.IsHost;

		private static ulong LocalClientId => NetworkManager.Singleton.LocalClientId;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Object.DontDestroyOnLoad((Object)(object)this);
				Instance = this;
			}
			harmony.PatchAll();
			ShellPriceConfig = ((BaseUnityPlugin)this).Config.Bind<int>("Prices", "ShotgunShellPrice", 20, "Credits needed to buy shotgun shells");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Buyable Shotgun Shells is loaded with version 1.3.0!");
		}

		private static ClonedItem CloneNonScrap(Item original, int price)
		{
			ClonedItem clonedItem = ScriptableObject.CreateInstance<ClonedItem>();
			Object.DontDestroyOnLoad((Object)(object)clonedItem);
			clonedItem.original = original;
			GameObject val = NetworkPrefabs.CloneNetworkPrefab(original.spawnPrefab, "Buyable" + ((Object)original).name);
			val.AddComponent<Unflagger>();
			Object.DontDestroyOnLoad((Object)(object)val);
			CopyFields(original, (Item)(object)clonedItem);
			val.GetComponent<GrabbableObject>().itemProperties = (Item)(object)clonedItem;
			((Item)clonedItem).spawnPrefab = val;
			((Object)clonedItem).name = "Buyable" + ((Object)original).name;
			((Item)clonedItem).creditsWorth = price;
			((Item)clonedItem).isScrap = false;
			return clonedItem;
		}

		public static void CopyFields(Item source, Item destination)
		{
			FieldInfo[] fields = typeof(Item).GetFields();
			FieldInfo[] array = fields;
			foreach (FieldInfo fieldInfo in array)
			{
				fieldInfo.SetValue(destination, fieldInfo.GetValue(source));
			}
		}

		private static TerminalNode CreateInfoNode(string name, string description)
		{
			if (infoNodes.ContainsKey(name))
			{
				return infoNodes[name];
			}
			TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>();
			val.clearPreviousText = true;
			((Object)val).name = name + "InfoNode";
			val.displayText = description + "\n\n";
			infoNodes.Add(name, val);
			return val;
		}

		private static void CloneShells()
		{
			if (!((Object)(object)ShotgunShell == (Object)null) && !((Object)(object)ShotgunShellClone != (Object)null))
			{
				ShotgunShellClone = CloneNonScrap(ShotgunShell, ShellPrice);
				((Item)ShotgunShellClone).itemName = "Shells";
				AddToShop();
			}
		}

		private static void AddToShop()
		{
			ClonedItem shotgunShellClone = ShotgunShellClone;
			int shellPrice = ShellPrice;
			Items.RegisterShopItem((Item)(object)shotgunShellClone, (TerminalNode)null, (TerminalNode)null, CreateInfoNode("ShotgunShell", "Ammo for the Nutcracker's Shotgun."), shellPrice);
			LoggerInstance.LogInfo((object)$"Shotgun Shell added to Shop for {ShellPrice} credits");
		}

		private static void UpdateShopItemPrice()
		{
			((Item)ShotgunShellClone).creditsWorth = ShellPrice;
			Items.UpdateShopItemPrice((Item)(object)ShotgunShellClone, ShellPrice);
			LoggerInstance.LogInfo((object)$"Shotgun Shell price updated to {ShellPrice} credits");
		}

		public static void WriteData(FastBufferWriter writer)
		{
			((FastBufferWriter)(ref writer)).WriteByte(CurrentVersionByte);
			((FastBufferWriter)(ref writer)).WriteBytes(BitConverter.GetBytes(ShellPriceLocal), -1, 0);
		}

		public static void ReadData(FastBufferReader reader)
		{
			byte b = default(byte);
			((FastBufferReader)(ref reader)).ReadByte(ref b);
			if (b == CurrentVersionByte)
			{
				byte[] value = new byte[4];
				((FastBufferReader)(ref reader)).ReadBytes(ref value, 4, 0);
				ShellPriceRemote = BitConverter.ToInt32(value, 0);
				UpdateShopItemPrice();
				LoggerInstance.LogInfo((object)"Host config set successfully");
				return;
			}
			throw new Exception("Invalid version byte");
		}

		public static void OnRequestSync(ulong clientID, FastBufferReader reader)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			if (!IsHost)
			{
				return;
			}
			LoggerInstance.LogInfo((object)("Sending config to client " + clientID));
			FastBufferWriter val = default(FastBufferWriter);
			((FastBufferWriter)(ref val))..ctor(5, (Allocator)2, 5);
			try
			{
				WriteData(val);
				NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("BuyableShotgunShells_OnReceiveConfigSync", clientID, val, (NetworkDelivery)2);
			}
			catch (Exception arg)
			{
				LoggerInstance.LogError((object)$"Failed to send config: {arg}");
			}
			finally
			{
				((FastBufferWriter)(ref val)).Dispose();
			}
		}

		public static void OnReceiveSync(ulong clientID, FastBufferReader reader)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			LoggerInstance.LogInfo((object)"Received config from host");
			try
			{
				ReadData(reader);
			}
			catch (Exception arg)
			{
				LoggerInstance.LogError((object)$"Failed to receive config: {arg}");
				ShellPriceRemote = -1;
			}
		}
	}
}

BepInEx/plugins/plugins/CoilHeadStare.dll

Decompiled a day ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using TDP.CoilHeadStare.Patch;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("CoilHeadStare")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CoilHeadStare")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("9d96f0c2-6393-4d02-99d7-34538a0dad5c")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace TDP.CoilHeadStare
{
	[BepInPlugin("TDP.CoilHeadStare", "CoilHeadStare", "1.0.9")]
	public class ModBase : BaseUnityPlugin
	{
		private const string modGUID = "TDP.CoilHeadStare";

		private const string modName = "CoilHeadStare";

		private const string modVersion = "1.0.9";

		private Harmony harmony;

		internal static ModBase instance;

		internal ManualLogSource mls;

		public static ConfigEntry<float> config_timeUntilStare;

		public static ConfigEntry<float> config_maxStareDistance;

		public static ConfigEntry<float> config_turnHeadSpeed;

		public static ConfigEntry<bool> config_shovelReact;

		private void Awake()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			if ((Object)(object)instance == (Object)null)
			{
				instance = this;
			}
			else
			{
				Object.Destroy((Object)(object)this);
			}
			ConfigFile();
			harmony = new Harmony("TDP.CoilHeadStare");
			harmony.PatchAll(typeof(CoilHeadPatch));
			mls = Logger.CreateLogSource("TDP.CoilHeadStare");
			mls.LogInfo((object)"CoilHeadStare 1.0.9 loaded.");
		}

		private void ConfigFile()
		{
			config_timeUntilStare = ((BaseUnityPlugin)this).Config.Bind<float>("CoilHeadStare", "Time Until Stare", 8f, "Time between moving and looking at closest player (in seconds)");
			config_maxStareDistance = ((BaseUnityPlugin)this).Config.Bind<float>("CoilHeadStare", "Max Stare Distance", 6f, "Coilhead will only stare at players closer than this (for reference: coilhead's height is ca. 4)");
			config_turnHeadSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("CoilHeadStare", "Head Turn Speed", 0.3f, "The speed at which the head turns towards the player");
			config_shovelReact = ((BaseUnityPlugin)this).Config.Bind<bool>("CoilHeadStare", "Head Bounce on Shovel Hit", true, "Should the coilhead spring wobble when hit with a shovel (or with anything else)");
			Stare.timeUntilStare = config_timeUntilStare.Value;
			Stare.maxStareDistance = config_maxStareDistance.Value;
			Stare.turnHeadSpeed = config_turnHeadSpeed.Value;
			CoilHeadPatch.shovelReact = config_shovelReact.Value;
		}
	}
}
namespace TDP.CoilHeadStare.Patch
{
	internal class CoilHeadPatch
	{
		public static bool shovelReact;

		[HarmonyPatch(typeof(EnemyAI), "Start")]
		[HarmonyPostfix]
		[HarmonyPriority(200)]
		private static void StartPostFix(EnemyAI __instance)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			if (__instance is SpringManAI)
			{
				Debug.Log((object)"CoilHead found. Adding stare script.");
				Stare stare = ((Component)__instance).gameObject.AddComponent<Stare>();
				stare.Initialize((SpringManAI)__instance);
			}
		}

		[HarmonyPatch(typeof(EnemyAI), "HitEnemy")]
		[HarmonyPrefix]
		public static void HitEnemyPreFix(EnemyAI __instance)
		{
			if (__instance is SpringManAI)
			{
				if ((Object)(object)__instance == (Object)null)
				{
					ModBase.instance.mls.LogError((object)"On player hit Coil Head: Coil Head instance is missing.");
				}
				else if ((Object)(object)__instance.creatureAnimator == (Object)null)
				{
					ModBase.instance.mls.LogError((object)"On player hit Coil Head: Coil Head animator is missing.");
				}
				else if (__instance.creatureAnimator.parameters.All((AnimatorControllerParameter x) => x.name == "springBoing"))
				{
					ModBase.instance.mls.LogError((object)"On player hit Coil Head: Coil Head animatorcontroller is missing the parameter \"springBoing\".");
				}
				else if (shovelReact)
				{
					__instance.creatureAnimator.SetTrigger("springBoing");
				}
			}
		}
	}
	public class Stare : MonoBehaviour
	{
		private SpringManAI coilHeadInstance;

		public static float timeUntilStare;

		public static float maxStareDistance;

		public static float turnHeadSpeed;

		private Transform head;

		private float timeSinceMoving;

		private bool isTurningHead;

		private PlayerControllerB stareTarget;

		public void Initialize(SpringManAI instance)
		{
			Debug.Log((object)"Initializing Stare on Coil Head.");
			coilHeadInstance = instance;
			if ((Object)(object)coilHeadInstance == (Object)null)
			{
				ModBase.instance.mls.LogError((object)"Coil Head instance missing. Harmony Patch failed?");
			}
			List<Transform> list = FindChildren(((Component)coilHeadInstance).transform, "springBone.002");
			if (list == null)
			{
				ModBase.instance.mls.LogError((object)"Search for head parent returned null. This should not be possible, something went wrong.");
			}
			else if (list.Count > 0)
			{
				if (list.Last().childCount > 0)
				{
					head = list.Last().GetChild(list.Last().childCount - 1);
				}
				else
				{
					ModBase.instance.mls.LogError((object)"Found head parent (springBone.002), but it has no child transforms.");
				}
			}
			else
			{
				ModBase.instance.mls.LogError((object)"Could not find head parent bone. Possibly missing or renamed? Head must be parented to \"springBone.002\".");
			}
			if ((Object)(object)head == (Object)null)
			{
				ModBase.instance.mls.LogError((object)"Could not find head transform. Destroying script. (Coil Head should be unaffected by this)");
				Object.Destroy((Object)(object)this);
			}
			else
			{
				ModBase.instance.mls.LogInfo((object)("Found head transform: " + ((Object)head).name));
			}
		}

		private List<Transform> FindChildren(Transform parent, string name)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			List<Transform> list = new List<Transform>();
			foreach (Transform item in parent)
			{
				Transform val = item;
				if (((Object)val).name == name)
				{
					list.Add(val);
				}
				else
				{
					list.AddRange(FindChildren(val, name));
				}
			}
			return list;
		}

		private void Start()
		{
			if ((Object)(object)head != (Object)null)
			{
				ModBase.instance.mls.LogInfo((object)"Stare initialization successful. \nNote: If a reskin is being used and the head does not turn it is most likely incompatible.");
			}
			else
			{
				ModBase.instance.mls.LogInfo((object)"Stare initialization unsuccessful. An error has probably occurred.");
			}
		}

		private void Update()
		{
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)coilHeadInstance == (Object)null)
			{
				return;
			}
			if ((Object)(object)head == (Object)null)
			{
				ModBase.instance.mls.LogError((object)"Head transform missing. Destroying script.");
				Object.Destroy((Object)(object)this);
				return;
			}
			if (!isTurningHead)
			{
				stareTarget = ((EnemyAI)coilHeadInstance).GetClosestPlayer(false, false, false);
			}
			if (!((Object)(object)stareTarget == (Object)null))
			{
				Vector3 val = ((Component)stareTarget.gameplayCamera).transform.position - head.position;
				float num = Vector3.Distance(head.position, ((Component)((EnemyAI)coilHeadInstance).GetClosestPlayer(false, false, false)).transform.position);
				if ((double)((EnemyAI)coilHeadInstance).creatureAnimator.GetFloat("walkSpeed") > 0.01 || num > maxStareDistance || Vector3.Angle(head.forward, val) < 5f)
				{
					timeSinceMoving = 0f;
				}
				else
				{
					timeSinceMoving += Time.deltaTime;
				}
				if (timeSinceMoving > timeUntilStare)
				{
					isTurningHead = true;
				}
				else
				{
					isTurningHead = false;
				}
				if (isTurningHead)
				{
					head.forward = Vector3.RotateTowards(head.forward, val, turnHeadSpeed * Time.deltaTime, 0f);
				}
			}
		}
	}
}

BepInEx/plugins/plugins/CrouchToStand.dll

Decompiled a day ago
using System.Collections;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using GameNetcodeStuff;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("CrouchToStand")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CrouchToStand")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("666C668E-9A5E-40B0-BA2F-6CD63B92BDAD")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8.1", FrameworkDisplayName = ".NET Framework 4.8.1")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace CrouchToStand;

[BepInPlugin("Mhz.CrouchToStand", "CrouchToStand", "1.0.0")]
public class StandUp : BaseUnityPlugin
{
	[HarmonyPatch(typeof(PlayerControllerB), "Jump_performed")]
	private class JumpPerformedPatch
	{
		private static void Prefix(PlayerControllerB __instance)
		{
			((MonoBehaviour)__instance).StartCoroutine(PerformDelayedAction(__instance));
		}
	}

	private static Harmony _harmony;

	private void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Expected O, but got Unknown
		_harmony = new Harmony("Mhz.CrouchToStand");
		_harmony.PatchAll();
	}

	private static IEnumerator PerformDelayedAction(PlayerControllerB instance)
	{
		yield return null;
		if (instance.isCrouching)
		{
			instance.Crouch(false);
		}
	}
}

BepInEx/plugins/plugins/CustomTranslatorCharLimit.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
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 UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: AssemblyCompany("CustomTranslatorCharLimit")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A template for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.2.0")]
[assembly: AssemblyInformationalVersion("1.0.2+43206f0475d7dae18e393eaa115cfd192399712f")]
[assembly: AssemblyProduct("CustomTranslatorCharLimit")]
[assembly: AssemblyTitle("CustomTranslatorCharLimit")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.2.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace CustomTranslatorCharLimit
{
	[BepInPlugin("CustomTranslatorCharLimit", "CustomTranslatorCharLimit", "1.0.2")]
	public class Plugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("CustomTranslatorCharLimit");

		private static Plugin Instance;

		public static ManualLogSource Logger;

		public static ConfigEntry<int> MaxCharLength;

		public static ConfigEntry<float> MinSecondsToWait;

		public static ConfigEntry<float> MaxSecondsToWait;

		public static ConfigEntry<float> SecondsToWait;

		public static ConfigEntry<bool> UseRNG;

		public static ConfigEntry<bool> AllowSpecialCharacters;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin CustomTranslatorCharLimit is loaded!");
			MaxCharLength = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaxCharLength", 10, "Maximum number of characters to be able to transmit with the Signal Translator");
			MinSecondsToWait = ((BaseUnityPlugin)this).Config.Bind<float>("General", "MinSecondsToWait", 0.7f, "Minimum number of seconds to potentially wait before sending another message");
			MaxSecondsToWait = ((BaseUnityPlugin)this).Config.Bind<float>("General", "MaxSecondsToWait", 2.7f, "Maximum number of seconds to potentially wait before sending another character");
			SecondsToWait = ((BaseUnityPlugin)this).Config.Bind<float>("General", "SecondsToWait", 0.7f, "Number of seconds to constantly wait before sending another character (RNG must be false for this)");
			UseRNG = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "UseRNG", true, "Use RNG to determine how long to wait before sending another character");
			AllowSpecialCharacters = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AllowSpecialCharacters", true, "Allow special characters (e.g. !@#$%^&*():) to be used in the terminal");
			harmony.PatchAll(Assembly.GetExecutingAssembly());
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "CustomTranslatorCharLimit";

		public const string PLUGIN_NAME = "CustomTranslatorCharLimit";

		public const string PLUGIN_VERSION = "1.0.2";
	}
}
namespace CustomTranslatorCharLimit.Patches
{
	[HarmonyPatch]
	internal class PatchHUDManger
	{
		[HarmonyPatch(typeof(HUDManager), "UseSignalTranslatorServerRpc")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> Patch(IEnumerable<CodeInstruction> codes)
		{
			return codes.Select(delegate(CodeInstruction code)
			{
				if (code.opcode == OpCodes.Ldc_I4_S && (sbyte)code.operand == 12)
				{
					code.opcode = OpCodes.Ldc_I4;
					code.operand = Plugin.MaxCharLength.Value + 2;
				}
				return code;
			});
		}

		[HarmonyPatch(typeof(HUDManager), "UseSignalTranslatorClientRpc")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> PatchUseSignalTranslatorClientRpc(IEnumerable<CodeInstruction> codes)
		{
			return codes.Select(delegate(CodeInstruction code)
			{
				if (code.opcode == OpCodes.Ldc_I4_S && (sbyte)code.operand == 10)
				{
					code.opcode = OpCodes.Ldc_I4;
					code.operand = Plugin.MaxCharLength.Value;
				}
				return code;
			});
		}

		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> TranspileMoveNext(IEnumerable<CodeInstruction> codes)
		{
			List<CodeInstruction> list = codes.ToList();
			if (Plugin.MinSecondsToWait.Value != 0.7f && Plugin.UseRNG.Value)
			{
				int num = list.FindIndex((CodeInstruction code) => code.opcode == OpCodes.Ldc_R4 && (float)code.operand == 0.7f);
				if (num == -1)
				{
					Plugin.Logger.LogError((object)"HUDManager::DisplaySignalTranslatorMessage: Could not find index of ldc.r4 0.7!");
					return list.AsEnumerable();
				}
				list[num].operand = Plugin.MinSecondsToWait.Value;
			}
			if (Plugin.MaxSecondsToWait.Value != 2.7f && Plugin.UseRNG.Value)
			{
				int num2 = list.FindIndex((CodeInstruction code) => code.opcode == OpCodes.Ldc_I4_M1) + 1;
				while (true)
				{
					num2 = list.FindIndex(num2 + 1, (CodeInstruction code) => code.opcode == OpCodes.Ldc_I4_M1) + 1;
					if (num2 != -1 && list[num2].opcode == OpCodes.Ldc_I4_4)
					{
						break;
					}
					if (num2 == -1)
					{
						Plugin.Logger.LogError((object)"HUDManager::DisplaySignalTranslatorMessage: Could not find index of ldc.i4.m1!");
						return list.AsEnumerable();
					}
				}
				float num3 = (Plugin.MaxSecondsToWait.Value - Plugin.MinSecondsToWait.Value) * 2f;
				float num4 = 0f - num3 / 2f;
				if (num3 < 0f - num4)
				{
					num3 = 0f - num4;
				}
				list[num2 - 1].opcode = OpCodes.Ldc_I4;
				list[num2 - 1].operand = Mathf.RoundToInt(num4);
				list[num2].opcode = OpCodes.Ldc_I4;
				list[num2].operand = Mathf.RoundToInt(num3);
			}
			if (!Plugin.UseRNG.Value && Plugin.SecondsToWait.Value != 0.7f)
			{
				int num5 = list.FindIndex((CodeInstruction code) => code.opcode == OpCodes.Ldc_R4 && (float)code.operand == 0.7f);
				if (num5 == -1)
				{
					return list.AsEnumerable();
				}
				list[num5].operand = Plugin.SecondsToWait.Value;
				list[num5 + 1].opcode = OpCodes.Ldc_R4;
				list[num5 + 1].operand = 0f;
			}
			return list.AsEnumerable();
		}
	}
	[HarmonyPatch]
	internal class PatchTerminal
	{
		[HarmonyPatch(typeof(Terminal), "ParsePlayerSentence")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> PatchParsePlayerSentence(IEnumerable<CodeInstruction> codes)
		{
			List<CodeInstruction> list = codes.ToList();
			int index = list.FindIndex((CodeInstruction code) => code.opcode == OpCodes.Call && code.operand.ToString().Contains("Min")) - 1;
			list[index].opcode = OpCodes.Ldc_I4;
			list[index].operand = ((Plugin.MaxCharLength.Value == 0) ? 10 : Plugin.MaxCharLength.Value);
			return list.AsEnumerable();
		}

		[HarmonyPatch(typeof(Terminal), "Start")]
		[HarmonyPostfix]
		public static void PatchStart(Terminal __instance)
		{
			foreach (TerminalNode specialNode in __instance.terminalNodes.specialNodes)
			{
				if ((((Object)specialNode).name == "Start" || ((Object)specialNode).name == "HelpCommands" || ((Object)specialNode).name == "ParserError1" || ((Object)specialNode).name == "SendSignalTranslator") && specialNode.maxCharactersToType <= 35)
				{
					specialNode.maxCharactersToType = 9999;
				}
			}
		}

		[HarmonyPatch(typeof(Terminal), "RemovePunctuation")]
		[HarmonyPrefix]
		public static bool PatchRemovePunctuation(ref string __result, string s)
		{
			if (Plugin.AllowSpecialCharacters.Value)
			{
				__result = s;
				return false;
			}
			return true;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}

BepInEx/plugins/plugins/DynamicDeadline1.2.2.dll

Decompiled a day ago
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using DynamicDeadlineMod.Patches;
using HarmonyLib;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("DynamicDeadlineMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DynamicDeadlineMod")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("78c98d39-8b11-4a2c-bccb-e32338f5bacf")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace DynamicDeadlineMod
{
	[BepInPlugin("Haha.DynamicDeadline", "Dynamic Deadline", "1.2.2")]
	public class DynamicDeadlineMod : BaseUnityPlugin
	{
		private const string modGUID = "Haha.DynamicDeadline";

		private const string modName = "Dynamic Deadline";

		private const string modVersion = "1.2.2";

		private readonly Harmony harmony = new Harmony("Haha.DynamicDeadline");

		public static DynamicDeadlineMod Instance;

		internal static ConfigEntry<float> MinScrapValuePerDay;

		internal static ConfigEntry<bool> legacyCal;

		internal static ConfigEntry<float> legacyDailyValue;

		internal static ConfigEntry<bool> useMinMax;

		internal static ConfigEntry<float> setMinimumDays;

		internal static ConfigEntry<float> setMaximumDays;

		internal ManualLogSource mls;

		internal void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("Dynamic Deadline");
			mls.LogInfo((object)"No more short deadlines for excessive quotas.");
			MinScrapValuePerDay = ((BaseUnityPlugin)this).Config.Bind<float>("Customizable Values", "Minimum Daily ScrapValue", 200f, "Set this value to the minimum scrap value you should achieve per day. This will ignore the calculation for daily scrap if it's below this number.");
			useMinMax = ((BaseUnityPlugin)this).Config.Bind<bool>("Customizable Values", "Use Custom Deadline Range", false, "Set to true if you want to use the custom minimum/maximum deadline range.");
			setMinimumDays = ((BaseUnityPlugin)this).Config.Bind<float>("Customizable Values", "Minimum Deadline", 3f, "If Use Custom Deadline Range is enabled, this is the minimum deadline you will have.");
			setMaximumDays = ((BaseUnityPlugin)this).Config.Bind<float>("Customizable Values", "Maximum Deadline", float.MaxValue, "If use Custom Deadline Range is enabled, this is the maximum deadline you will have.");
			legacyCal = ((BaseUnityPlugin)this).Config.Bind<bool>("Customizeable Values - Legacy", "Legacy Calculations", false, "Set to true if you want to use the deadline calculation from 1.1.0 prior.");
			legacyDailyValue = ((BaseUnityPlugin)this).Config.Bind<float>("Customizeable Values - Legacy", "Daily Scrap Value", 200f, "Set this number to the value of scrap you can reasonably achieve in a single day.");
			harmony.PatchAll(typeof(DynamicDeadlineMod));
			harmony.PatchAll(typeof(ProfitQuotaPatch));
		}
	}
}
namespace DynamicDeadlineMod.Patches
{
	[HarmonyPatch(typeof(TimeOfDay), "SyncTimeClientRpc")]
	public class FixTheDeadline
	{
		[HarmonyPrefix]
		public static void DeadlineBroke()
		{
			string currentSaveFileName = GameNetworkManager.Instance.currentSaveFileName;
			float num;
			if (ES3.KeyExists("totalOfAverage"))
			{
				num = ES3.Load<float>("totalOfAverage", currentSaveFileName, 0f);
			}
			else
			{
				ES3.Save<float>("totalOfAverage", 0f, currentSaveFileName);
				num = ES3.Load<float>("totalOfAverage", currentSaveFileName, 0f);
			}
			if (num < DynamicDeadlineMod.MinScrapValuePerDay.Value * (float)TimeOfDay.Instance.timesFulfilledQuota)
			{
				num = DynamicDeadlineMod.MinScrapValuePerDay.Value * (float)TimeOfDay.Instance.timesFulfilledQuota;
				float num2 = num / (float)TimeOfDay.Instance.timesFulfilledQuota;
				float num3 = Mathf.Clamp(Mathf.Ceil((float)TimeOfDay.Instance.profitQuota / num2), 3f, float.MaxValue);
				ES3.Save<float>("totalOfAverage", num, currentSaveFileName);
				TimeOfDay.Instance.timeUntilDeadline = 700f * num3;
				ES3.Save<float>("previousDeadline", num3, currentSaveFileName);
			}
		}
	}
	[HarmonyPatch(typeof(GameNetworkManager), "ResetSavedGameValues")]
	public class ResetSavedValuesPatch
	{
		[HarmonyPrefix]
		public static void ResetSavedValues()
		{
			string currentSaveFileName = GameNetworkManager.Instance.currentSaveFileName;
			ES3.Save<float>("previousDeadline", 3f, currentSaveFileName);
			ES3.Save<float>("totalOfAverage", 0f, currentSaveFileName);
		}
	}
	[HarmonyPatch(typeof(TimeOfDay), "SetNewProfitQuota")]
	public class ProfitQuotaPatch
	{
		private static float quotaFulfilled;

		[HarmonyPrefix]
		public static void GetQuotaFulfilled()
		{
			quotaFulfilled = TimeOfDay.Instance.quotaFulfilled;
		}

		[HarmonyPostfix]
		private static void DynamicDeadline(TimeOfDay __instance)
		{
			string currentSaveFileName = GameNetworkManager.Instance.currentSaveFileName;
			bool isHost = ((NetworkBehaviour)RoundManager.Instance).NetworkManager.IsHost;
			float num = TimeOfDay.Instance.timesFulfilledQuota;
			float num2 = ((!DynamicDeadlineMod.useMinMax.Value) ? 3f : DynamicDeadlineMod.setMinimumDays.Value);
			float num3 = ((!DynamicDeadlineMod.useMinMax.Value) ? float.MaxValue : DynamicDeadlineMod.setMaximumDays.Value);
			float num4;
			if (ES3.KeyExists("previousDeadline"))
			{
				num4 = ES3.Load<float>("previousDeadline", currentSaveFileName, 3f);
				DynamicDeadlineMod.Instance.mls.LogInfo((object)$"Successfully loaded the previous totalOfAverage variable! totalofAverage is: {num4}");
			}
			else
			{
				ES3.Save<float>("previousDeadline", 3f, currentSaveFileName);
				num4 = ES3.Load<float>("previousDeadline", currentSaveFileName, 3f);
				DynamicDeadlineMod.Instance.mls.LogInfo((object)"Could not load previousDeadline variable as it does not exist! Creating now!");
			}
			float num5;
			if (ES3.KeyExists("totalOfAverage"))
			{
				num5 = ES3.Load<float>("totalOfAverage", currentSaveFileName, 0f);
				DynamicDeadlineMod.Instance.mls.LogInfo((object)$"Successfully loaded the previous totalOfAverage variable! totalofAverage is: {num5}");
			}
			else
			{
				ES3.Save<float>("totalOfAverage", 0f, currentSaveFileName);
				num5 = ES3.Load<float>("totalOfAverage", currentSaveFileName, 0f);
				DynamicDeadlineMod.Instance.mls.LogInfo((object)"Could not load totalOfAverage variable as it does not exist! Creating now!");
			}
			if (isHost && !DynamicDeadlineMod.legacyCal.Value)
			{
				float num6 = Mathf.Clamp(Mathf.Ceil(quotaFulfilled / num4), DynamicDeadlineMod.MinScrapValuePerDay.Value, 1000f);
				if (num5 == 0f && num != 0f)
				{
					num5 = DynamicDeadlineMod.MinScrapValuePerDay.Value * num - 1f;
				}
				float num7 = num5 / num;
				float num8 = Mathf.Clamp(Mathf.Ceil((float)__instance.profitQuota / num7), num2, num3);
				num5 += num6;
				__instance.timeUntilDeadline = __instance.totalTime * num8;
				DynamicDeadlineMod.Instance.mls.LogInfo((object)$"This person is the host, changing deadline. DailyValue registered as {num6}, new average is {num7}, and host is currently on their {num} run!");
				TimeOfDay.Instance.SyncTimeClientRpc(__instance.globalTime, (int)__instance.timeUntilDeadline);
				DynamicDeadlineMod.Instance.mls.LogInfo((object)$"The new deadline is {num8} days.");
				num4 = num8;
				DynamicDeadlineMod.Instance.mls.LogInfo((object)$"Did the value get assigned properly? Previous deadline is {num4}");
				ES3.Save<float>("previousDeadline", num4, currentSaveFileName);
				ES3.Save<float>("totalOfAverage", num5, currentSaveFileName);
			}
			else if (isHost && DynamicDeadlineMod.legacyCal.Value)
			{
				__instance.timeUntilDeadline = __instance.totalTime * Mathf.Clamp(Mathf.Ceil((float)__instance.profitQuota / DynamicDeadlineMod.legacyDailyValue.Value), num2, num3);
				DynamicDeadlineMod.Instance.mls.LogInfo((object)"This person is the host and using the legacy difficulty calculations. Changing deadline.");
				TimeOfDay.Instance.SyncTimeClientRpc(__instance.globalTime, (int)__instance.timeUntilDeadline);
			}
			else
			{
				DynamicDeadlineMod.Instance.mls.LogInfo((object)"This person is not the host. Will not change deadline or send rpc.");
			}
		}
	}
}

BepInEx/plugins/plugins/EladsHUD.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using CustomHUD;
using GameNetcodeStuff;
using HarmonyLib;
using Jotunn.Utils;
using Microsoft.CodeAnalysis;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("EladsHUD")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Custom HUD for lethal company :]")]
[assembly: AssemblyFileVersion("1.3.0.0")]
[assembly: AssemblyInformationalVersion("1.3.0")]
[assembly: AssemblyProduct("EladsHUD")]
[assembly: AssemblyTitle("EladsHUD")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.3.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
public enum PocketFlashlightOptions
{
	Disabled,
	Vanilla,
	Separate
}
public enum StaminaTextOptions
{
	Disabled,
	PercentageOnly,
	Full
}
internal class CustomHUD_Mono : MonoBehaviour
{
	public static CustomHUD_Mono instance;

	[Header("Health")]
	public CanvasGroup healthGroup;

	public Image healthBar;

	public TextMeshProUGUI healthText;

	public TextMeshProUGUI healthText2;

	[Header("Stamina")]
	public CanvasGroup staminaGroup;

	public Image staminaBar;

	public Image staminaBarChangeFG;

	public TextMeshProUGUI staminaText;

	public TextMeshProUGUI carryText;

	[Header("Battery")]
	public CanvasGroup batteryGroup;

	public Image batteryBar;

	public TextMeshProUGUI batteryText;

	[Header("Flashlight")]
	public CanvasGroup flashlightGroup;

	public Image flashlightBar;

	public TextMeshProUGUI flashlightText;

	private Color staminaColor;

	private Color staminaWarnColor = new Color(255f, 0f, 0f);

	private float colorLerp;

	private int lastHealth = 100;

	private float lastHealthChange = 0f;

	private void Awake()
	{
		if ((Object)(object)instance != (Object)null)
		{
			throw new Exception("2 instances of CustomHUD_Mono!");
		}
		instance = this;
	}

	private void Start()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		staminaColor = ((Graphic)staminaBar).color;
	}

	public void UpdateFromPlayer(PlayerControllerB player)
	{
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: 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_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		lastHealthChange += Time.deltaTime;
		if (player.health < lastHealth)
		{
			Debug.Log((object)"o shit");
			Debug.Log((object)player.health);
			Debug.Log((object)lastHealth);
			lastHealthChange = 0f;
		}
		lastHealth = player.health;
		int health = player.health;
		float sprintMeter = player.sprintMeter;
		float sprintTime = player.sprintTime;
		if ((double)sprintMeter < 0.3)
		{
			colorLerp = Mathf.Clamp01(colorLerp + Time.deltaTime * 8f);
		}
		else
		{
			colorLerp = Mathf.Clamp01(colorLerp - Time.deltaTime * 8f);
		}
		((Graphic)staminaBar).color = Color.Lerp(staminaColor, staminaWarnColor, colorLerp);
		int num = Mathf.FloorToInt(sprintMeter * 100f);
		float num2 = CalculateStaminaOverTime(player);
		float num3 = num2 * 100f;
		if (Plugin.detailedStamina.Value != 0)
		{
			((TMP_Text)staminaText).text = $"{num}<size=75%><voffset=1>%</voffset></size>";
		}
		else
		{
			((TMP_Text)staminaText).text = "";
		}
		float num4 = Mathf.Sign(num2);
		float num5 = num4;
		if (num5 != -1f)
		{
			if (num5 != 0f)
			{
				if (num5 != 1f)
				{
				}
				staminaBar.fillAmount = sprintMeter;
				staminaBarChangeFG.fillAmount = 0f;
				if (Plugin.detailedStamina.Value == StaminaTextOptions.Full)
				{
					TextMeshProUGUI obj = staminaText;
					((TMP_Text)obj).text = ((TMP_Text)obj).text + " | +" + num3.ToString("0.0") + "<size=75%>/sec</size>";
				}
			}
			else
			{
				staminaBar.fillAmount = sprintMeter;
				staminaBarChangeFG.fillAmount = 0f;
				if (Plugin.detailedStamina.Value == StaminaTextOptions.Full)
				{
					TextMeshProUGUI obj2 = staminaText;
					((TMP_Text)obj2).text = ((TMP_Text)obj2).text + " | +0.0<size=75%>/sec</size>";
				}
			}
		}
		else
		{
			staminaBar.fillAmount = sprintMeter - Mathf.Abs(num2);
			((Graphic)staminaBarChangeFG).color = Color.Lerp(Color.white, staminaWarnColor, colorLerp);
			staminaBarChangeFG.fillAmount = Mathf.Min(sprintMeter, Mathf.Abs(num2));
			((Transform)((Graphic)staminaBarChangeFG).rectTransform).localPosition = new Vector3(1f + 276f * Mathf.Max(0f, sprintMeter - Mathf.Abs(num2)) + 0.05f, 0f);
			if (Plugin.detailedStamina.Value == StaminaTextOptions.Full)
			{
				TextMeshProUGUI obj3 = staminaText;
				((TMP_Text)obj3).text = ((TMP_Text)obj3).text + " | " + num3.ToString("0.0") + "<size=75%>/sec</size>";
			}
		}
		float num6 = Mathf.RoundToInt(Mathf.Clamp(player.carryWeight - 1f, 0f, 100f) * 105f);
		if (Plugin.shouldDoKGConversion)
		{
			num6 *= 0.453592f;
			((TMP_Text)carryText).text = $"{num6}<size=60%>kg</size>";
		}
		else
		{
			((TMP_Text)carryText).text = $"{num6}<size=60%>lb</size>";
		}
		healthBar.fillAmount = (float)health / 100f;
		((TMP_Text)healthText).text = health.ToString();
		if ((Object)(object)healthText2 != (Object)null)
		{
			((TMP_Text)healthText2).text = health.ToString();
		}
		float value = Plugin.healthbarHideDelay.Value;
		healthGroup.alpha = (Plugin.autoHideHealthbar.Value ? Mathf.InverseLerp(value + 1f, value, lastHealthChange) : 1f);
		((Component)flashlightGroup).gameObject.SetActive(UpdateFlashlight(player));
		((Component)batteryGroup).gameObject.SetActive(UpdateBattery(player));
	}

	private bool UpdateFlashlight(PlayerControllerB player)
	{
		if (Plugin.pocketedFlashlightDisplayMode.Value != PocketFlashlightOptions.Separate)
		{
			return false;
		}
		if (!((Behaviour)player.helmetLight).enabled)
		{
			return false;
		}
		GrabbableObject pocketedFlashlight = player.pocketedFlashlight;
		if ((Object)(object)pocketedFlashlight == (Object)null)
		{
			return false;
		}
		if (!pocketedFlashlight.itemProperties.requiresBattery)
		{
			return false;
		}
		flashlightBar.fillAmount = pocketedFlashlight.insertedBattery.charge;
		int num = Mathf.CeilToInt(pocketedFlashlight.insertedBattery.charge * pocketedFlashlight.itemProperties.batteryUsage);
		((TMP_Text)flashlightText).text = $"{Mathf.CeilToInt(pocketedFlashlight.insertedBattery.charge * 100f)}%";
		if (!Plugin.displayTimeLeft.Value)
		{
			return true;
		}
		TextMeshProUGUI obj = flashlightText;
		((TMP_Text)obj).text = ((TMP_Text)obj).text + string.Format(" <size=60%>{0}:{1}", num / 60, (num % 60).ToString("D2"));
		return true;
	}

	private bool UpdateBattery(PlayerControllerB player)
	{
		GrabbableObject val = player.currentlyHeldObjectServer;
		if ((Object)(object)val == (Object)null && Plugin.pocketedFlashlightDisplayMode.Value == PocketFlashlightOptions.Vanilla)
		{
			val = player.pocketedFlashlight;
		}
		if ((Object)(object)val == (Object)null)
		{
			return false;
		}
		if (!val.itemProperties.requiresBattery)
		{
			return false;
		}
		batteryBar.fillAmount = val.insertedBattery.charge;
		int num = (int)(val.insertedBattery.charge / val.itemProperties.batteryUsage);
		int num2 = Mathf.CeilToInt(val.insertedBattery.charge * val.itemProperties.batteryUsage);
		((TMP_Text)batteryText).text = $"{Mathf.CeilToInt(val.insertedBattery.charge * 100f)}%";
		if (!Plugin.displayTimeLeft.Value)
		{
			return true;
		}
		if (val.itemProperties.itemIsTrigger)
		{
			TextMeshProUGUI obj = batteryText;
			((TMP_Text)obj).text = ((TMP_Text)obj).text + $" ({num} uses remaining)";
		}
		else
		{
			TextMeshProUGUI obj2 = batteryText;
			((TMP_Text)obj2).text = ((TMP_Text)obj2).text + string.Format(" ({0}:{1} remaining)", num2 / 60, (num2 % 60).ToString("D2"));
		}
		return true;
	}

	private float CalculateStaminaOverTime(PlayerControllerB player)
	{
		if (player.sprintMeter == 1f)
		{
			return 0f;
		}
		bool privateField = player.GetPrivateField<bool>("isWalking");
		float sprintTime = player.sprintTime;
		float num = 1f;
		if ((double)player.drunkness > 0.019999999552965164)
		{
			num *= Mathf.Abs(StartOfRound.Instance.drunknessSpeedEffect.Evaluate(player.drunkness) - 1.25f);
		}
		return player.isSprinting ? (-1f / sprintTime * player.carryWeight * num) : ((player.isMovementHindered > 0 && privateField) ? (-1f / sprintTime * num * 0.5f) : ((!privateField) ? (1f / (sprintTime + 4f) * num) : (1f / (sprintTime + 9f) * num)));
	}
}
namespace EladsHUD
{
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "EladsHUD";

		public const string PLUGIN_NAME = "EladsHUD";

		public const string PLUGIN_VERSION = "1.3.0";
	}
}
namespace CustomHUD
{
	[BepInPlugin("me.eladnlg.customhud", "Elads HUD", "1.2.3")]
	public class Plugin : BaseUnityPlugin
	{
		public static Plugin instance;

		public AssetBundle assets;

		public GameObject HUD;

		public static bool shouldDoKGConversion;

		internal static ConfigEntry<PocketFlashlightOptions> pocketedFlashlightDisplayMode;

		internal static ConfigEntry<StaminaTextOptions> detailedStamina;

		internal static ConfigEntry<bool> displayTimeLeft;

		internal static ConfigEntry<float> hudScale;

		internal static ConfigEntry<bool> autoHideHealthbar;

		internal static ConfigEntry<float> healthbarHideDelay;

		internal static ConfigEntry<bool> hidePlanetInfo;

		private void Awake()
		{
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Expected O, but got Unknown
			if ((Object)(object)instance != (Object)null)
			{
				throw new Exception("what the cuck??? more than 1 plugin instance.");
			}
			instance = this;
			hudScale = ((BaseUnityPlugin)this).Config.Bind<float>("General", "HUDScale", 1f, "The size of the HUD.");
			autoHideHealthbar = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "HideHealthbarAutomatically", true, "Should the healthbar be hidden after not taking damage for a while.");
			healthbarHideDelay = ((BaseUnityPlugin)this).Config.Bind<float>("General", "HealthbarHideDelay", 4f, "The amount of time before the healthbar starts fading away.");
			pocketedFlashlightDisplayMode = ((BaseUnityPlugin)this).Config.Bind<PocketFlashlightOptions>("General", "FlashlightBattery", PocketFlashlightOptions.Separate, "How the flashlight battery is displayed whilst unequipped.\r\nDisabled - Flashlight battery will not be displayed.\r\nVanilla - Flashlight battery will be displayed when you don't have a battery-using item equipped.\r\nSeparate - Flashlight battery will be displayed using a dedicated panel. (recommended)");
			detailedStamina = ((BaseUnityPlugin)this).Config.Bind<StaminaTextOptions>("General", "DetailedStamina", StaminaTextOptions.PercentageOnly, "What the stamina text should display.\r\nDisabled - The stamina text will be hidden.\r\nPercentageOnly - Only the percentage will be displayed. (recommended)\r\nFull - Both percentage and rate of gain/loss will be displayed.");
			displayTimeLeft = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "DisplayTimeLeft", true, "Should the uses/time left for a battery-using item be displayed.");
			hidePlanetInfo = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "HidePlanetInfo", false, "Should planet info be hidden. If modifying from an in-game menu, this requires you to rejoin the game.");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Elad's HUD is loaded!");
			assets = AssetUtils.LoadAssetBundleFromResources("customhud", typeof(PlayerPatches).Assembly);
			HUD = assets.LoadAsset<GameObject>("PlayerInfo");
			Harmony val = new Harmony("me.eladnlg.customhud");
			val.PatchAll(Assembly.GetExecutingAssembly());
		}

		private void Start()
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)(Chainloader.PluginInfos.Count + " plugins loaded"));
			foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Plugin GUID: " + pluginInfo.Value.Metadata.GUID));
			}
			shouldDoKGConversion = Chainloader.PluginInfos.Any((KeyValuePair<string, PluginInfo> pair) => pair.Value.Metadata.GUID == "com.zduniusz.lethalcompany.lbtokg");
		}
	}
	[HarmonyPatch(typeof(HUDManager))]
	public class HUDPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		private static void Awake_Postfix(HUDManager __instance)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			HUDElement[] privateField = __instance.GetPrivateField<HUDElement[]>("HUDElements");
			HUDElement val = privateField[2];
			GameObject val2 = Object.Instantiate<GameObject>(Plugin.instance.HUD, ((Component)val.canvasGroup).transform.parent);
			val2.transform.localScale = Vector3.one * 0.75f * Plugin.hudScale.Value;
			val.canvasGroup.alpha = 0f;
			Transform val3 = ((Component)val.canvasGroup).transform.Find("CinematicGraphics");
			if ((Object)(object)val3 != (Object)null && !Plugin.hidePlanetInfo.Value)
			{
				val3.SetParent(val2.transform.parent);
			}
			privateField[2].canvasGroup = val2.GetComponent<CanvasGroup>();
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	public static class PlayerPatches
	{
		[HarmonyPrefix]
		[HarmonyPatch("LateUpdate")]
		private static void LateUpdate_Prefix(PlayerControllerB __instance)
		{
			if (((NetworkBehaviour)__instance).IsOwner && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject) && !((Object)(object)CustomHUD_Mono.instance == (Object)null))
			{
				CustomHUD_Mono.instance.UpdateFromPlayer(__instance);
			}
		}
	}
	internal static class ReflectionUtils
	{
		public static T GetPrivateField<T>(this object obj, string field)
		{
			return (T)obj.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic).GetValue(obj);
		}
	}
}
namespace Jotunn.Utils
{
	public static class AssetUtils
	{
		public const char AssetBundlePathSeparator = '$';

		public static Texture2D LoadTexture(string texturePath, bool relativePath = true)
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			string text = texturePath;
			if (relativePath)
			{
				text = Path.Combine(Paths.PluginPath, texturePath);
			}
			if (!File.Exists(text))
			{
				return null;
			}
			if (!text.EndsWith(".png") && !text.EndsWith(".jpg"))
			{
				throw new Exception("LoadTexture can only load png or jpg textures");
			}
			byte[] array = File.ReadAllBytes(text);
			Texture2D val = new Texture2D(2, 2);
			val.LoadRawTextureData(array);
			return val;
		}

		public static Sprite LoadSpriteFromFile(string spritePath)
		{
			//IL_002e: 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)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = LoadTexture(spritePath);
			if ((Object)(object)val != (Object)null)
			{
				return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), default(Vector2), 100f);
			}
			return null;
		}

		public static AssetBundle LoadAssetBundle(string bundlePath)
		{
			string text = Path.Combine(Paths.PluginPath, bundlePath);
			if (!File.Exists(text))
			{
				return null;
			}
			return AssetBundle.LoadFromFile(text);
		}

		public static AssetBundle LoadAssetBundleFromResources(string bundleName, Assembly resourceAssembly)
		{
			if (resourceAssembly == null)
			{
				throw new ArgumentNullException("Parameter resourceAssembly can not be null.");
			}
			string text = null;
			try
			{
				text = resourceAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(bundleName));
			}
			catch (Exception)
			{
			}
			if (text == null)
			{
				Debug.LogError((object)("AssetBundle " + bundleName + " not found in assembly manifest"));
				return null;
			}
			AssetBundle result;
			using (Stream stream = resourceAssembly.GetManifestResourceStream(text))
			{
				result = AssetBundle.LoadFromStream(stream);
			}
			return result;
		}

		public static string LoadText(string path)
		{
			string text = Path.Combine(Paths.PluginPath, path);
			if (!File.Exists(text))
			{
				Debug.LogError((object)("Error, failed to load contents from non-existant path: $" + text));
				return null;
			}
			return File.ReadAllText(text);
		}

		public static Sprite LoadSprite(string assetPath)
		{
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			string text = Path.Combine(Paths.PluginPath, assetPath);
			if (!File.Exists(text))
			{
				return null;
			}
			if (text.Contains('$'.ToString()))
			{
				string[] array = text.Split('$');
				string text2 = array[0];
				string text3 = array[1];
				AssetBundle val = AssetBundle.LoadFromFile(text2);
				Sprite result = val.LoadAsset<Sprite>(text3);
				val.Unload(false);
				return result;
			}
			Texture2D val2 = LoadTexture(text, relativePath: false);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				return null;
			}
			return Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), Vector2.zero);
		}
	}
}

BepInEx/plugins/plugins/FairGiants.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BlindGiants;
using BlindGiants.Patches;
using FairGiants;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Unity.Collections;
using Unity.Netcode;
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: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: AssemblyCompany("FairGiants")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright (c) 2024 LegoMaster3650")]
[assembly: AssemblyDescription("Makes forest keepers/giants fairer in lethal company.")]
[assembly: AssemblyFileVersion("1.1.1")]
[assembly: AssemblyInformationalVersion("1.1.1")]
[assembly: AssemblyProduct("FairGiants")]
[assembly: AssemblyTitle("FairGiants")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.1.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace FairGiants
{
	[Serializable]
	public class ConfigSync
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static HandleNamedMessageDelegate <0>__OnRequestSync;

			public static HandleNamedMessageDelegate <1>__OnRecieveSync;
		}

		public static bool Synced;

		public bool reduceVisionFog;

		public bool reduceVisionSnow;

		public int giantFogDivisor;

		public string snowyPlanets;

		public bool enhancedAntiCamp;

		public bool randomWander;

		public PatchApplyLevel stealthDecaysWhen;

		public float passiveStealthDecay;

		public ConfigSync()
		{
			reduceVisionFog = Config.file_reduceVisionFog.Value;
			reduceVisionSnow = Config.file_reduceVisionSnow.Value;
			giantFogDivisor = Config.file_giantFogDivisor.Value;
			snowyPlanets = Config.file_snowyPlanets.Value;
			enhancedAntiCamp = Config.file_enhancedAntiCamp.Value;
			randomWander = Config.file_randomWander.Value;
			stealthDecaysWhen = Config.file_stealthDecaysWhen.Value;
			passiveStealthDecay = Config.file_passiveStealthDecay.Value;
		}

		[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
		[HarmonyPostfix]
		public static void Init()
		{
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Expected O, but got Unknown
			if (Synced)
			{
				return;
			}
			Plugin.Log("Syncing configs...");
			if (NetworkManager.Singleton.IsHost)
			{
				Plugin.Log("Client is host, no need to sync configs!");
				CustomMessagingManager customMessagingManager = NetworkManager.Singleton.CustomMessagingManager;
				object obj = <>O.<0>__OnRequestSync;
				if (obj == null)
				{
					HandleNamedMessageDelegate val = OnRequestSync;
					<>O.<0>__OnRequestSync = val;
					obj = (object)val;
				}
				customMessagingManager.RegisterNamedMessageHandler("FairGiants-OnRequestSync", (HandleNamedMessageDelegate)obj);
				Synced = true;
			}
			else
			{
				Plugin.Log("Requesting config sync");
				CustomMessagingManager customMessagingManager2 = NetworkManager.Singleton.CustomMessagingManager;
				object obj2 = <>O.<1>__OnRecieveSync;
				if (obj2 == null)
				{
					HandleNamedMessageDelegate val2 = OnRecieveSync;
					<>O.<1>__OnRecieveSync = val2;
					obj2 = (object)val2;
				}
				customMessagingManager2.RegisterNamedMessageHandler("FairGiants-OnRecieveSync", (HandleNamedMessageDelegate)obj2);
				RequestSync();
			}
		}

		[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
		[HarmonyPostfix]
		public static void Reset()
		{
			Synced = false;
			Config.Instance = Config.Default;
			Config.ConfigChanged();
		}

		public static void RequestSync()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			if (NetworkManager.Singleton.IsClient)
			{
				FastBufferWriter val = default(FastBufferWriter);
				((FastBufferWriter)(ref val))..ctor(0, (Allocator)2, -1);
				NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("FairGiants-OnRequestSync", 0uL, val, (NetworkDelivery)3);
			}
		}

		public static void OnRequestSync(ulong clientId, FastBufferReader reader)
		{
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkManager.Singleton.IsHost)
			{
				return;
			}
			Plugin.Log($"Client {clientId} requested config sync");
			BinaryFormatter binaryFormatter = new BinaryFormatter();
			using MemoryStream memoryStream = new MemoryStream();
			try
			{
				binaryFormatter.Serialize(memoryStream, Config.Default);
			}
			catch (Exception arg)
			{
				Plugin.LogError($"Error serializing config: {arg}");
				return;
			}
			byte[] array = memoryStream.ToArray();
			FastBufferWriter val = new FastBufferWriter(array.Length + 4, (Allocator)2, -1);
			try
			{
				int num = array.Length;
				((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives));
				((FastBufferWriter)(ref val)).WriteBytesSafe(array, -1, 0);
				NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("FairGiants-OnRecieveSync", clientId, val, (NetworkDelivery)3);
			}
			finally
			{
				((IDisposable)(FastBufferWriter)(ref val)).Dispose();
			}
		}

		public static void OnRecieveSync(ulong clientId, FastBufferReader reader)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkManager.Singleton.IsClient)
			{
				return;
			}
			Plugin.Log("Recieved config data from host.");
			if (!((FastBufferReader)(ref reader)).TryBeginRead(4))
			{
				Plugin.LogError("Config sync failed: Could not read size of buffer");
				return;
			}
			int num = default(int);
			((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives));
			if (!((FastBufferReader)(ref reader)).TryBeginRead(num))
			{
				Plugin.LogError("Config sync failed: Could not read buffer");
				return;
			}
			byte[] buffer = new byte[num];
			((FastBufferReader)(ref reader)).ReadBytesSafe(ref buffer, num, 0);
			BinaryFormatter binaryFormatter = new BinaryFormatter();
			using MemoryStream serializationStream = new MemoryStream(buffer);
			try
			{
				Config.Instance = (ConfigSync)binaryFormatter.Deserialize(serializationStream);
			}
			catch (Exception arg)
			{
				Plugin.LogError($"Error deserializing config: {arg}");
				return;
			}
			Plugin.Log("Config values synced with host!");
			Synced = true;
			Config.ConfigChanged();
		}
	}
	public enum PatchApplyLevel
	{
		Never,
		Solo,
		Always
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "FairGiants";

		public const string PLUGIN_NAME = "FairGiants";

		public const string PLUGIN_VERSION = "1.1.1";
	}
}
namespace BlindGiants
{
	public class Config
	{
		public static ConfigSync Default;

		public static ConfigSync Instance;

		public static ConfigEntry<bool> file_reduceVisionFog;

		public static ConfigEntry<bool> file_reduceVisionSnow;

		public static ConfigEntry<int> file_giantFogDivisor;

		public static ConfigEntry<string> file_snowyPlanets;

		public static string[] snowyPlanetsList = new string[3] { "Dine", "Rend", "Titan" };

		public static ConfigEntry<bool> file_enhancedAntiCamp;

		public static ConfigEntry<bool> file_randomWander;

		public static ConfigEntry<PatchApplyLevel> file_stealthDecaysWhen;

		public static ConfigEntry<float> file_passiveStealthDecay;

		public static void Bind(ConfigFile config)
		{
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			file_reduceVisionFog = config.Bind<bool>("Vision", "ReduceVisionFog", true, "If true, divides giant sight range by GiantFogDivisor when a moon is foggy");
			file_reduceVisionSnow = config.Bind<bool>("Vision", "ReduceVisionSnow", true, "If true, divides giant sight range by GiantFogDivisor when a moon is snowy");
			file_giantFogDivisor = config.Bind<int>("Vision", "GiantFogDivisor", 3, "The amount to divide giant sight range by");
			file_snowyPlanets = config.Bind<string>("Vision", "SnowyPlanets", "Dine,Rend,Titan", "Names of planets that should be considered snowy to giants. (Separate with commas, spaces around commas are allowed but will be ignored)");
			file_enhancedAntiCamp = config.Bind<bool>("Ship", "EnhancedAntiCamp", true, "If true, fixes some issues with the base game's anti-camp when losing a player near the ship.");
			file_randomWander = config.Bind<bool>("Ship", "RandomWander", true, "If true, uses custom logic to wander to a random point away from the ship. If false, uses the vanilla point of the furthest point from the ship.");
			file_stealthDecaysWhen = config.Bind<PatchApplyLevel>("Aggro", "StealthDecaysWhen", PatchApplyLevel.Solo, "When to allow all stealth meters to passively decay when a giant sees no players.");
			file_passiveStealthDecay = config.Bind<float>("Aggro", "PassiveStealthDecay", 0.2f, new ConfigDescription("How much stealth decays each second when a giant sees no players. Vanilla decay is 0.33", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			Default = new ConfigSync();
			Instance = new ConfigSync();
			ConfigChanged();
			config.SettingChanged += OnSettingChanged;
		}

		private static void OnSettingChanged(object sender, SettingChangedEventArgs e)
		{
			SetConfigChanged();
		}

		private static void SetConfigChanged()
		{
			if (NetworkManager.Singleton.IsHost)
			{
				Instance = new ConfigSync();
			}
			ConfigChanged();
		}

		public static void ConfigChanged()
		{
			string[] array = Instance.snowyPlanets.Split(',');
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = array[i].Trim();
			}
			snowyPlanetsList = array;
		}

		public static bool IsSnowyPlanet(string name)
		{
			string[] array = snowyPlanetsList;
			foreach (string value in array)
			{
				if (name.Contains(value))
				{
					return true;
				}
			}
			return false;
		}
	}
	[BepInPlugin("3650.FairGiants", "FairGiants", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public const string pluginGuid = "3650.FairGiants";

		public const string pluginName = "FairGiants";

		public const string pluginVersion = "1.0.0";

		private static Plugin Instance;

		private void Awake()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (Instance == null)
			{
				Instance = this;
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Patching giants...");
			Harmony val = new Harmony("3650.FairGiants");
			val.PatchAll(typeof(ForestGiantAIPatch));
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Giants patched!");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading config...");
			Config.Bind(((BaseUnityPlugin)this).Config);
			val.PatchAll(typeof(ConfigSync));
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Config loaded!");
		}

		public static void Log(string msg)
		{
			((BaseUnityPlugin)Instance).Logger.LogInfo((object)msg);
		}

		public static void LogError(string msg)
		{
			((BaseUnityPlugin)Instance).Logger.LogError((object)msg);
		}

		public static void LogDebug(string msg)
		{
			((BaseUnityPlugin)Instance).Logger.LogDebug((object)msg);
		}
	}
}
namespace BlindGiants.Patches
{
	[HarmonyPatch(typeof(ForestGiantAI))]
	public class ForestGiantAIPatch
	{
		[HarmonyPatch("LookForPlayers")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> SearchDistancePatch(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(true, (CodeMatch[])(object)new CodeMatch[1]
			{
				new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(EnemyAI), "GetAllPlayersInLineOfSight", (Type[])null, (Type[])null), (string)null)
			}).MatchBack(false, (CodeMatch[])(object)new CodeMatch[1]
			{
				new CodeMatch((OpCode?)OpCodes.Ldc_I4_S, (object)null, (string)null)
			}).Advance(1)
				.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
				{
					new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ForestGiantAIPatch), "ClampRange", (Type[])null, (Type[])null))
				})
				.InstructionEnumeration();
		}

		[HarmonyPatch("GiantSeePlayerEffect")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> FearDistancePatch(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(true, (CodeMatch[])(object)new CodeMatch[1]
			{
				new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(EnemyAI), "CheckLineOfSightForPosition", (Type[])null, (Type[])null), (string)null)
			}).MatchBack(false, (CodeMatch[])(object)new CodeMatch[1]
			{
				new CodeMatch((OpCode?)OpCodes.Ldc_I4_S, (object)null, (string)null)
			}).Advance(1)
				.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
				{
					new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ForestGiantAIPatch), "ClampRange", (Type[])null, (Type[])null))
				})
				.InstructionEnumeration();
		}

		public static int ClampRange(int range)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Invalid comparison between Unknown and I4
			if ((!Config.Instance.reduceVisionFog || (int)TimeOfDay.Instance.currentLevelWeather != 3) && (!Config.Instance.reduceVisionSnow || !Config.IsSnowyPlanet(TimeOfDay.Instance.currentLevel.PlanetName)))
			{
				return range;
			}
			return range / Config.Instance.giantFogDivisor;
		}

		[HarmonyPatch("DoAIInterval")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> GiantRoamPatch(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Expected O, but got Unknown
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
			{
				new CodeMatch((OpCode?)OpCodes.Call, (object)AccessTools.Method(typeof(EnemyAI), "ChooseFarthestNodeFromPosition", (Type[])null, (Type[])null), (string)null)
			}).Advance(3).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[6]
			{
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ForestGiantAIPatch), "LeaveShipPatch", (Type[])null, (Type[])null)),
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Ldloc_1, (object)null),
				new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ForestGiantAIPatch), "ChooseFarNodeFromShip", (Type[])null, (Type[])null)),
				new CodeInstruction(OpCodes.Stloc_1, (object)null)
			})
				.InstructionEnumeration();
		}

		public static Vector3 ChooseFarNodeFromShip(ForestGiantAI ai, Vector3 farPosition)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: 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_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0223: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_025a: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Unknown result type (might be due to invalid IL or missing references)
			//IL_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Unknown result type (might be due to invalid IL or missing references)
			if (!Config.Instance.randomWander)
			{
				return farPosition;
			}
			Vector3 ship = StartOfRound.Instance.elevatorTransform.position;
			Random random = new Random(((EnemyAI)ai).RoundUpToNearestFive(((Component)ai).transform.position.x) + ((EnemyAI)ai).RoundUpToNearestFive(((Component)ai).transform.position.z));
			IEnumerable<(GameObject, float)> source = from node in ((EnemyAI)ai).allAINodes
				select (node, Vector3.Distance(ship, node.transform.position)) into x
				where x.dist >= 102f
				orderby x.dist + (float)random.Next(-12, 12) descending
				select x;
			List<GameObject> list = new List<GameObject>();
			foreach (GameObject item in source.Select<(GameObject, float), GameObject>(((GameObject node, float dist) x) => x.node))
			{
				list.Add(item);
			}
			((EnemyAI)ai).nodesTempArray = list.ToArray();
			List<float> list2 = new List<float>();
			foreach (float item2 in source.Select<(GameObject, float), float>(((GameObject node, float dist) x) => x.dist))
			{
				list2.Add(item2);
			}
			float[] source2 = list2.ToArray();
			if (((EnemyAI)ai).nodesTempArray.Length == 0)
			{
				return farPosition;
			}
			float num = 0.7f * source2.Sum() / (float)((EnemyAI)ai).nodesTempArray.Length + 0.3f * (source2.First() + source2.Last());
			double num2 = (double)(Mathf.Clamp(((double)num < 152.5) ? (-0.8f * (num - 100f) + 50f) : (-0.125f * (num - 152.5f) + 8f), 1f, 50f) * (float)Mathf.Clamp(130 - ((EnemyAI)ai).nodesTempArray.Length, 50, 100)) * 0.0001;
			Vector3 result = farPosition;
			for (int i = 1; i < ((EnemyAI)ai).nodesTempArray.Length; i++)
			{
				if (random.NextDouble() < num2)
				{
					break;
				}
				if (!((EnemyAI)ai).PathIsIntersectedByLineOfSight(((EnemyAI)ai).nodesTempArray[i].transform.position, false, false, false))
				{
					((EnemyAI)ai).mostOptimalDistance = Vector3.Distance(ship, ((EnemyAI)ai).nodesTempArray[i].transform.position);
					result = ((EnemyAI)ai).nodesTempArray[i].transform.position;
					if (i >= ((EnemyAI)ai).nodesTempArray.Length - 1)
					{
						break;
					}
				}
			}
			return result;
		}

		public static void LeaveShipPatch(ForestGiantAI ai)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			if (Config.Instance.enhancedAntiCamp)
			{
				Plugin.Log("Roaming Away");
				if (ai.roamPlanet == null)
				{
					ai.roamPlanet = new AISearchRoutine();
				}
				((EnemyAI)ai).StopSearch(ai.roamPlanet, true);
				ai.roamPlanet.searchWidth = 35f;
			}
		}

		[HarmonyPatch("FinishedCurrentSearchRoutine")]
		[HarmonyPrefix]
		public static void GiantFinishSearch(ForestGiantAI __instance)
		{
			if (Config.Instance.enhancedAntiCamp)
			{
				Plugin.LogDebug("Giant Finished a Search");
				if (__instance.roamPlanet != null && __instance.roamPlanet.searchWidth < 200f)
				{
					__instance.roamPlanet.searchWidth = 200f;
				}
			}
		}

		[HarmonyPatch("LookForPlayers")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> AggroPatch(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			return new CodeMatcher(instructions, (ILGenerator)null).End().MatchBack(false, (CodeMatch[])(object)new CodeMatch[3]
			{
				new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldc_R4, (object)0f, (string)null),
				new CodeMatch((OpCode?)OpCodes.Stfld, (object)AccessTools.Field(typeof(ForestGiantAI), "timeSpentStaring"), (string)null)
			}).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[2]
			{
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ForestGiantAIPatch), "LowerAllAggro", (Type[])null, (Type[])null))
			})
				.InstructionEnumeration();
		}

		public static void LowerAllAggro(ForestGiantAI ai)
		{
			if (((EnemyAI)ai).currentBehaviourStateIndex != 0 || Config.Instance.stealthDecaysWhen == PatchApplyLevel.Always || (Config.Instance.stealthDecaysWhen == PatchApplyLevel.Solo && StartOfRound.Instance.connectedPlayersAmount <= 0))
			{
				for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++)
				{
					ai.playerStealthMeters[i] = Mathf.Clamp(ai.playerStealthMeters[i] - Time.deltaTime * Config.Instance.passiveStealthDecay, 0f, 1f);
				}
			}
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}

BepInEx/plugins/plugins/fixes/DoorFix.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using DunGen;
using HarmonyLib;
using Microsoft.CodeAnalysis;
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("DoorFix")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Fixes the hitbox of doors so items can be picked up through open doors more easily.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DoorFix")]
[assembly: AssemblyTitle("DoorFix")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace DoorFix
{
	[BepInPlugin("DoorFix", "DoorFix", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(DungeonUtil))]
		[HarmonyPatch("AddAndSetupDoorComponent")]
		public class DungeonUtilPatch
		{
			private static void Postfix(Dungeon dungeon, GameObject doorPrefab, Doorway doorway)
			{
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Expected O, but got Unknown
				//IL_0066: Unknown result type (might be due to invalid IL or missing references)
				//IL_006c: Expected O, but got Unknown
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Expected O, but got Unknown
				//IL_0118: Unknown result type (might be due to invalid IL or missing references)
				if (!((Object)doorPrefab).name.StartsWith("SteelDoorMapSpawn"))
				{
					return;
				}
				foreach (Transform item in doorPrefab.GetComponent<SpawnSyncedObject>().spawnPrefab.transform)
				{
					Transform val = item;
					if (!((Object)val).name.StartsWith("SteelDoor"))
					{
						continue;
					}
					foreach (Transform item2 in ((Component)val).transform)
					{
						Transform val2 = item2;
						if (!((Object)val2).name.StartsWith("DoorMesh"))
						{
							continue;
						}
						LOGGER.LogInfo((object)((object)val2).ToString());
						foreach (Transform item3 in ((Component)val2).transform)
						{
							Transform val3 = item3;
							if (((Component)val3).tag != "InteractTrigger")
							{
								continue;
							}
							LOGGER.LogInfo((object)((object)val3).ToString());
							BoxCollider[] components = ((Component)val3).gameObject.GetComponents<BoxCollider>();
							foreach (BoxCollider val4 in components)
							{
								if (((Collider)val4).isTrigger)
								{
									LOGGER.LogDebug((object)"Patching door size");
									val4.size = new Vector3(0.64f, 1f, 1f);
								}
							}
						}
					}
				}
			}
		}

		private static readonly ManualLogSource LOGGER = Logger.CreateLogSource("DoorFix");

		private void Awake()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			new Harmony("DoorFix").PatchAll();
			LOGGER.LogInfo((object)"Plugin DoorFix is loaded!");
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "DoorFix";

		public const string PLUGIN_NAME = "DoorFix";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}

BepInEx/plugins/plugins/fixes/LC_Optim.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
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 UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("LC_Optim")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Source moment")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("LC_Optim")]
[assembly: AssemblyTitle("LC_Optim")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace LC_Optim;

[BepInPlugin("mnc.fixcentipedelag", "FixCentipedeLag", "2023.12.7")]
public class Plugin : BaseUnityPlugin
{
	private Harmony thisHarmony;

	private static Dictionary<int, ulong> instanceMap = new Dictionary<int, ulong>();

	private static ulong deadtimer = 100uL;

	private static ManualLogSource Log;

	private static ConfigEntry<bool> configShowDebug;

	private static void Debug(object data, LogLevel logLevel = 16)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		if (configShowDebug.Value)
		{
			Log.Log(logLevel, data);
		}
	}

	private void Awake()
	{
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Expected O, but got Unknown
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Expected O, but got Unknown
		configShowDebug = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enable debug printing", true, "Enabling this will show debug info in console, e.g. when a new centipede gets tracked or removed.");
		thisHarmony = new Harmony("mnc.fixcentipedelag");
		thisHarmony.Patch((MethodBase)typeof(CentipedeAI).GetMethod("DoAIInterval"), new HarmonyMethod(typeof(Plugin), "RemoveLagCentipede", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		Debug("Registered the patch method", (LogLevel)4);
		Log = ((BaseUnityPlugin)this).Logger;
	}

	public static void RemoveLagCentipede(CentipedeAI __instance)
	{
		if (((EnemyAI)__instance).TargetClosestPlayer(1.5f, false, 70f))
		{
			return;
		}
		int instanceID = ((Object)__instance).GetInstanceID();
		ulong num = (ulong)Time.frameCount;
		if (!instanceMap.ContainsKey(instanceID))
		{
			instanceMap.Add(instanceID, num);
			Debug($"Tracked {instanceID}", (LogLevel)16);
			return;
		}
		ulong num2 = instanceMap[instanceID];
		if (num - num2 <= deadtimer)
		{
			((EnemyAI)__instance).KillEnemy(true);
			instanceMap.Remove(instanceID);
			Debug($"Removed centipede at {instanceID}", (LogLevel)16);
		}
		else
		{
			instanceMap[instanceID] = num;
		}
	}

	public void OnDestroy()
	{
		thisHarmony.UnpatchSelf();
	}
}
internal class PluginMetadata
{
	public const string PLUGIN_GUID = "mnc.fixcentipedelag";

	public const string PLUGIN_NAME = "FixCentipedeLag";

	public const string PLUGIN_VERSION = "2023.12.7";
}
public static class MyPluginInfo
{
	public const string PLUGIN_GUID = "LC_Optim";

	public const string PLUGIN_NAME = "LC_Optim";

	public const string PLUGIN_VERSION = "1.0.0";
}

BepInEx/plugins/plugins/fixes/Linkoid.Dissonance.LagFix.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using Dissonance;
using Microsoft.CodeAnalysis;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Linkoid.Dissonance.LagFix")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Linkoid.Dissonance.LagFix")]
[assembly: AssemblyCopyright("Copyright © linkoid 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("07f63a54-331c-49fa-870c-ee582bb74fd3")]
[assembly: AssemblyFileVersion("1.0")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.8746.28325")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[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;
		}
	}
}
namespace Linkoid.Dissonance.LagFix
{
	[BepInPlugin("Linkoid.Dissonance.LagFix", "Dissonance Lag Fix", "1.0")]
	public sealed class DissonanceLagFixPlugin : BaseUnityPlugin
	{
		private void Awake()
		{
			Logs.SetLogLevel((LogCategory)1, (LogLevel)4);
		}
	}
	public static class PluginInfo
	{
		internal const string GUID = "Linkoid.Dissonance.LagFix";

		internal const string NAME = "Dissonance Lag Fix";

		internal const string VERSION = "1.0";

		public static readonly string Guid = "Linkoid.Dissonance.LagFix";

		public static readonly string Name = "Dissonance Lag Fix";

		public static readonly string Version = "1.0";
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}

BepInEx/plugins/plugins/fixes/NameFix.dll

Decompiled a day ago
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using GameNetcodeStuff;
using HarmonyLib;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("NameFix")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NameFix")]
[assembly: AssemblyCopyright("Copyright © BlueAmulet 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("9a85f7c4-c974-4bff-b83a-5cbcde42b246")]
[assembly: AssemblyFileVersion("1.0.1")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.1.0")]
namespace NameFix
{
	[BepInPlugin("BlueAmulet.NameFix", "NameFix", "1.0.1")]
	public class NameFix : BaseUnityPlugin
	{
		internal const string Name = "NameFix";

		internal const string Author = "BlueAmulet";

		internal const string ID = "BlueAmulet.NameFix";

		internal const string Version = "1.0.1";

		public void Awake()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			Harmony val = new Harmony("BlueAmulet.NameFix");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Applying Harmony patches");
			val.PatchAll(Assembly.GetExecutingAssembly());
			int num = 0;
			foreach (MethodBase patchedMethod in val.GetPatchedMethods())
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)("Patched " + patchedMethod.DeclaringType.Name + "." + patchedMethod.Name));
				num++;
			}
			((BaseUnityPlugin)this).Logger.LogInfo((object)(num + " patches applied"));
		}

		public static string NoPunctuation(string input)
		{
			return new string(input.Where((char c) => char.IsLetterOrDigit(c) || c == '_').ToArray());
		}
	}
}
namespace NameFix.Patches
{
	[HarmonyPatch]
	internal static class NameSanitizePatch
	{
		[HarmonyPrefix]
		[HarmonyPatch(typeof(PlayerControllerB), "NoPunctuation")]
		public static bool Prefix1(ref string __result, string input)
		{
			__result = NameFix.NoPunctuation(input);
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(GameNetworkManager), "NoPunctuation")]
		public static bool Prefix2(ref string __result, string input)
		{
			__result = NameFix.NoPunctuation(input);
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(StartOfRound), "NoPunctuation")]
		public static bool Prefix3(ref string __result, string input)
		{
			__result = NameFix.NoPunctuation(input);
			return false;
		}
	}
}

BepInEx/plugins/plugins/fixes/RankFix.dll

Decompiled a day ago
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("RankFix")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RankFix")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ed4b0141-4dda-408b-935b-2970c6691c98")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace RankFix;

[BepInPlugin("LCMOD.RankFix", "RankFix", "1.0.1")]
public class RankFixBase : BaseUnityPlugin
{
	[HarmonyPatch(typeof(HUDManager))]
	private class HUDManagerPatches
	{
		[HarmonyPatch("SetSavedValues")]
		[HarmonyPostfix]
		private static void HUDSetSavedValues(HUDManager __instance)
		{
			if (NetworkManager.Singleton.IsHost)
			{
				GameNetworkManager.Instance.localPlayerController.playerLevelNumber = __instance.localPlayerLevel;
			}
		}
	}

	public const string MODGUID = "LCMOD.RankFix";

	public const string MODNAME = "RankFix";

	public const string MODVERSION = "1.0.1";

	private readonly Harmony harmony = new Harmony("LCMOD.RankFix");

	public static RankFixBase Instance;

	public static ManualLogSource logger;

	private void Awake()
	{
		if ((Object)(object)Instance == (Object)null)
		{
			Instance = this;
		}
		logger = ((BaseUnityPlugin)this).Logger;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Mod LCMOD.RankFix is loaded!");
		harmony.PatchAll(typeof(HUDManagerPatches));
	}
}

BepInEx/plugins/plugins/fixes/SlimeTamingFix.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("EliteMasterEric")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Fixes a bug that made Hygroderes unable to be tamed with Boomboxes.")]
[assembly: AssemblyFileVersion("1.0.2.0")]
[assembly: AssemblyInformationalVersion("1.0.2+38f01b21fff41249851eaa3d5a7686cfd554bb79")]
[assembly: AssemblyProduct("SlimeTamingFix")]
[assembly: AssemblyTitle("SlimeTamingFix")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.2.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace SlimeTamingFix
{
	public static class PluginInfo
	{
		public const string PLUGIN_ID = "SlimeTamingFix";

		public const string PLUGIN_NAME = "SlimeTamingFix";

		public const string PLUGIN_VERSION = "1.0.2";

		public const string PLUGIN_GUID = "com.elitemastereric.slimetamingfix";
	}
	[BepInPlugin("com.elitemastereric.slimetamingfix", "SlimeTamingFix", "1.0.2")]
	public class Plugin : BaseUnityPlugin
	{
		public ManualLogSource PluginLogger;

		public static Plugin Instance { get; private set; }

		private void Awake()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			Instance = this;
			PluginLogger = ((BaseUnityPlugin)this).Logger;
			Harmony val = new Harmony("com.elitemastereric.slimetamingfix");
			val.PatchAll();
			PluginLogger.LogInfo((object)"Plugin SlimeTamingFix (com.elitemastereric.slimetamingfix) is loaded!");
		}
	}
}
namespace SlimeTamingFix.Patch
{
	[HarmonyPatch(typeof(BlobAI))]
	[HarmonyPatch("OnCollideWithPlayer")]
	internal class BlobAIOnCollideWithPlayerPatch
	{
		public static bool Prefix(BlobAI __instance)
		{
			float value = Traverse.Create((object)__instance).Field("tamedTimer").GetValue<float>();
			float value2 = Traverse.Create((object)__instance).Field("angeredTimer").GetValue<float>();
			if (value > 0f && value2 <= 0f)
			{
				return false;
			}
			return true;
		}
	}
}

BepInEx/plugins/plugins/fixes/SprintLadderFix.dll

Decompiled a day ago
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using SprintLadderFix.Patches;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("SprintLadderFix")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SprintLadderFix")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("cd8cad2b-a700-4306-b8a2-1eb833c9d281")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SprintToggleFix
{
	[BepInPlugin("MoonJuice.SprintLadderFix", "SprintLadderFix", "1.0.0")]
	public class SprintLadderFix : BaseUnityPlugin
	{
		private const string modGUID = "MoonJuice.SprintLadderFix";

		private const string modName = "SprintLadderFix";

		private const string modVersion = "1.0.0";

		private readonly Harmony harmony = new Harmony("MoonJuice.SprintLadderFix");

		private static SprintLadderFix Instance;

		internal ManualLogSource mls;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("MoonJuice.SprintLadderFix");
			mls.LogInfo((object)"SprintLadderFix loaded");
			harmony.PatchAll(typeof(SprintLadderFix));
			harmony.PatchAll(typeof(PlayerControllerBPatch));
		}
	}
}
namespace SprintLadderFix.Patches
{
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerControllerBPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void sprintLadderFix(ref bool ___isClimbingLadder, ref bool ___isSprinting)
		{
			if (___isClimbingLadder)
			{
				___isSprinting = false;
			}
		}
	}
}

BepInEx/plugins/plugins/ForestGiantMotionsense.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("TanmanG")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyCopyright("CC BY-NC-SA")]
[assembly: AssemblyDescription("A Harmony patch to adjust Forest Giant AI to only detect motion.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+884e96a4438d7ff5cff13942e224a52cc46655dc")]
[assembly: AssemblyProduct("ForestGiantMotionsense")]
[assembly: AssemblyTitle("ForestGiantMotionsense")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/TanmanG/LethalCompany_ForestGiantMotionsense")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ForestGiantMotionsense
{
	[BepInPlugin("ForestGiantMotionsense", "ForestGiantMotionsense", "1.0.0")]
	public class FoGiMoSeMod : BaseUnityPlugin
	{
		private static ConfigEntry<float> _configMoveTime;

		private static FoGiMoSeMod _instance;

		private static bool _patchFailed;

		private void Awake()
		{
			_instance = this;
			_patchFailed = false;
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Loading...");
			_configMoveTime = ((BaseUnityPlugin)this).Config.Bind<float>("General", "TimeSinceMovingThreshold", 2.25f, "The amount of time the player must remain still before being invisible to a Forest Giant.");
			Harmony val = Harmony.CreateAndPatchAll(typeof(FoGiMoSeMod), (string)null);
			if (_patchFailed)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)"Failure to find patch location, reverting!");
				Harmony.UnpatchID(val.Id);
			}
			else
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded!");
			}
		}

		[HarmonyPatch(typeof(ForestGiantAI), "LookForPlayers")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> MotionPatch(IEnumerable<CodeInstruction> instructions, ILGenerator generator)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Expected O, but got Unknown
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Expected O, but got Unknown
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Expected O, but got Unknown
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Expected O, but got Unknown
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Expected O, but got Unknown
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Expected O, but got Unknown
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Expected O, but got Unknown
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c7: Expected O, but got Unknown
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_0213: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null);
			val.Start();
			val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[6]
			{
				new CodeMatch((OpCode?)OpCodes.Call, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldloc_S, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldelem_Ref, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldc_R4, (object)null, (string)null)
			});
			if (val.Remaining == 0)
			{
				((BaseUnityPlugin)_instance).Logger.LogFatal((object)"Could not find LookForPlayers time since moved code block to patch, flagging to abort!");
				_patchFailed = true;
			}
			List<CodeInstruction> list = new List<CodeInstruction>();
			for (int i = 0; i < 6; i++)
			{
				CodeInstruction item = new CodeInstruction(val.Instruction);
				list.Add(item);
				val.Advance(1);
			}
			list[list.Count - 1].operand = _configMoveTime.Value;
			list.Add(new CodeInstruction(OpCodes.Clt, (object)null));
			val.Start();
			val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[7]
			{
				new CodeMatch((OpCode?)OpCodes.Ldloc_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Call, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldloc_S, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldelem_Ref, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Call, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Brfalse, (object)null, (string)null)
			});
			if (val.Remaining == 0)
			{
				((BaseUnityPlugin)_instance).Logger.LogFatal((object)"Could not find LookForPlayers IF condition to patch, flagging to abort!");
				_patchFailed = true;
				return val.InstructionEnumeration();
			}
			list.Add(new CodeInstruction(val.Instruction));
			val.Advance(1);
			val.InsertAndAdvance((IEnumerable<CodeInstruction>)list);
			return val.InstructionEnumeration();
		}

		private static IEnumerable<CodeInstruction> TimeSinceMovePatch(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected O, but got Unknown
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Expected O, but got Unknown
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Expected O, but got Unknown
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Expected O, but got Unknown
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(true, (CodeMatch[])(object)new CodeMatch[8]
			{
				new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Dup, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldc_I4_1, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Add, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Stfld, (object)null, (string)null)
			});
			if (val.Remaining == 0)
			{
				((BaseUnityPlugin)_instance).Logger.LogFatal((object)"Could not find UpdatePlayerPositionClientRPC patch location, flagging abort!");
				_patchFailed = true;
			}
			val.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[3]
			{
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Ldc_R4, (object)0f),
				new CodeInstruction(OpCodes.Stfld, (object)AccessTools.Field(typeof(PlayerControllerB), "timeSincePlayerMoving"))
			});
			return val.InstructionEnumeration();
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "ForestGiantMotionsense";

		public const string PLUGIN_NAME = "ForestGiantMotionsense";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}

BepInEx/plugins/plugins/HideModList.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using HarmonyLib;
using Microsoft.CodeAnalysis;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HideModList")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Hides the LC api modlist info")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("HideModList")]
[assembly: AssemblyTitle("HideModList")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace HideModList
{
	[HarmonyPatch(typeof(HUDManager), "DisplayTip")]
	public static class DisplayTipPatch
	{
		public static bool Prefix(HUDManager __instance, string headerText, string bodyText, bool isWarning = false, bool useSave = false, string prefsKey = "LC_Tip1")
		{
			if (headerText.StartsWith("Mod List"))
			{
				return false;
			}
			return true;
		}
	}
	[BepInPlugin("HideModList", "HideModList", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		private void Awake()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			Harmony val = new Harmony("plugin.HideModList");
			val.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin HideModList is loaded!");
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "HideModList";

		public const string PLUGIN_NAME = "HideModList";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}

BepInEx/plugins/plugins/HoldScanButton.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using HoldScanButton.Patches;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.InputSystem;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HoldScanButton")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("A mod which allows you to hold the scan button instead of needing to spam it.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+e176b95ccf205ccfcd919c056ec842f624ca0c1a")]
[assembly: AssemblyProduct("HoldScanButton")]
[assembly: AssemblyTitle("HoldScanButton")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
[BepInPlugin("HoldScanButton", "HoldScanButton", "1.0.0")]
public class HoldScanButtonPlugin : BaseUnityPlugin
{
	private readonly Harmony harmony = new Harmony("HoldScanButton");

	public static HoldScanButtonPlugin Instance;

	internal ManualLogSource logger;

	private void Awake()
	{
		if ((Object)(object)Instance == (Object)null)
		{
			Instance = this;
		}
		logger = Logger.CreateLogSource("HoldScanButton");
		logger.LogInfo((object)"Plugin HoldScanButton has loaded!");
		harmony.PatchAll(typeof(HoldScanButtonPatch));
	}
}
internal static class LCMPluginInfo
{
	public const string PLUGIN_GUID = "HoldScanButton";

	public const string PLUGIN_NAME = "HoldScanButton";

	public const string PLUGIN_VERSION = "1.0.0";
}
namespace HoldScanButton.Patches
{
	internal class HoldScanButtonPatch
	{
		private static CallbackContext pingContext;

		[HarmonyPatch(typeof(HUDManager), "Update")]
		[HarmonyPostfix]
		private static void UpdatePatch(HUDManager __instance)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			if (IngamePlayerSettings.Instance.playerInput.actions.FindAction("PingScan", false).IsPressed())
			{
				__instance.PingScan_performed(pingContext);
			}
		}

		[HarmonyPatch(typeof(HUDManager), "PingScan_performed")]
		[HarmonyPrefix]
		private static void OnScan(HUDManager __instance, CallbackContext context)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			pingContext = context;
		}
	}
}

BepInEx/plugins/plugins/IntroTweaks.dll

Decompiled a day ago
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.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using IntroTweaks.Data;
using IntroTweaks.Utils;
using Microsoft.CodeAnalysis;
using TMPro;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.6", FrameworkDisplayName = ".NET Framework 4.6")]
[assembly: AssemblyCompany("IntroTweaks")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Seamless skipping of Lethal Company intro/menu screens.")]
[assembly: AssemblyFileVersion("1.5.0.0")]
[assembly: AssemblyInformationalVersion("1.5.0+1cc26656336b53e5f702b9a100c6aad010cb99cd")]
[assembly: AssemblyProduct("IntroTweaks")]
[assembly: AssemblyTitle("IntroTweaks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.5.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
	[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;
		}
	}
}
namespace IntroTweaks
{
	[BepInPlugin("IntroTweaks", "IntroTweaks", "1.5.0")]
	public class Plugin : BaseUnityPlugin
	{
		internal static string SelectedMode;

		private const string GUID = "IntroTweaks";

		private const string NAME = "IntroTweaks";

		private const string VERSION = "1.5.0";

		private Harmony patcher;

		private static bool menuLoaded;

		internal static ManualLogSource Logger { get; private set; }

		public static Config Config { get; private set; }

		public static bool ModInstalled(string name)
		{
			name = name.ToLower();
			return Chainloader.PluginInfos.Values.Any((PluginInfo p) => p.Metadata.GUID.ToLower().Contains(name) || p.Metadata.Name.ToLower() == name);
		}

		private void Awake()
		{
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Config = new Config(((BaseUnityPlugin)this).Config);
			if (!PluginEnabled(logDisabled: true))
			{
				return;
			}
			SceneManager.sceneLoaded += SceneLoaded;
			if (Config.SKIP_SPLASH_SCREENS.Value)
			{
				Task.Run((Action)SkipSplashScreen);
			}
			Config.InitBindings();
			SelectedMode = Config.AUTO_SELECT_MODE.Value.ToLower();
			try
			{
				patcher = new Harmony("IntroTweaks");
				patcher.PatchAll();
				Logger.LogInfo((object)"Plugin loaded.");
			}
			catch (Exception ex)
			{
				Logger.LogError((object)ex);
			}
		}

		public bool PluginEnabled(bool logDisabled = false)
		{
			bool value = Config.PLUGIN_ENABLED.Value;
			if (!value && logDisabled)
			{
				Logger.LogInfo((object)"IntroTweaks disabled globally.");
			}
			return value;
		}

		private void SkipSplashScreen()
		{
			Logger.LogDebug((object)"Skipping splash screens. Ew.");
			while (!menuLoaded)
			{
				SplashScreen.Stop((StopBehavior)0);
			}
		}

		private void SceneLoaded(Scene scene, LoadSceneMode _)
		{
			switch (((Scene)(ref scene)).name)
			{
			case "InitScene":
			case "InitSceneLaunchOptions":
			case "MainMenu":
				menuLoaded = true;
				break;
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "IntroTweaks";

		public const string PLUGIN_NAME = "IntroTweaks";

		public const string PLUGIN_VERSION = "1.5.0";
	}
}
namespace IntroTweaks.Utils
{
	internal class DisplayUtil
	{
		public static List<DisplayInfo> Displays { get; private set; } = new List<DisplayInfo>();


		internal static void Move(int displayIndex)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			Screen.GetDisplayLayout(Displays);
			int num = Displays.IndexOf(Screen.mainWindowDisplayInfo);
			if (displayIndex != num)
			{
				MoveWindowAsync(displayIndex);
			}
		}

		private static async void MoveWindowAsync(int index)
		{
			await MoveWindowTask(index);
		}

		private static async Task MoveWindowTask(int index)
		{
			if (index >= Displays.Count)
			{
				await Task.CompletedTask;
				Plugin.Logger.LogDebug((object)"Display index out of bounds for current layout!");
				return;
			}
			DisplayInfo val = Displays[index];
			Vector2Int zero = Vector2Int.zero;
			if ((int)Screen.fullScreenMode != 3)
			{
				((Vector2Int)(ref zero)).x = ((Vector2Int)(ref zero)).x + val.width / 2;
				((Vector2Int)(ref zero)).y = ((Vector2Int)(ref zero)).y + val.height / 2;
			}
			AsyncOperation operation = Screen.MoveMainWindowTo(ref val, zero);
			while (operation.progress < 1f)
			{
				await Task.Yield();
			}
			Plugin.Logger.LogDebug((object)("Game moved to display: " + Displays[index].name));
		}
	}
	internal static class Extensions
	{
		internal static GameObject FindInParent(this GameObject obj, string name)
		{
			Transform parent = obj.transform.parent;
			try
			{
				return ((Component)parent.Find(name)).gameObject;
			}
			catch (Exception arg)
			{
				Plugin.Logger.LogError((object)$"Error finding '{name}' in: {((Object)parent).name}\n{arg}");
				return null;
			}
		}

		internal static bool IsAbove(this Transform cur, Transform target)
		{
			//IL_0001: 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)
			return cur.localPosition.y > target.localPosition.y;
		}

		internal static void ResetAnchoredPos(this RectTransform rect)
		{
			//IL_0001: 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)
			rect.anchoredPosition = Vector2.zero;
			rect.anchoredPosition3D = Vector3.zero;
		}

		internal static void ResetPivot(this RectTransform rect)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			rect.pivot = Vector2.zero;
		}

		internal static void ResetSizeDelta(this RectTransform rect)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			rect.sizeDelta = Vector2.zero;
		}

		internal static void EditOffsets(this RectTransform rect, Vector2 max, Vector2 min)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			rect.offsetMax = max;
			rect.offsetMin = min;
		}

		internal static void EditAnchors(this RectTransform rect, Vector2 max, Vector2 min)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			rect.anchorMax = max;
			rect.anchorMin = min;
		}

		internal static void AnchorToBottomRight(this RectTransform rect)
		{
			//IL_0011: 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_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			rect.ResetAnchoredPos();
			rect.EditAnchors(new Vector2(1f, 0f), new Vector2(1f, 0f));
			((Transform)rect).localPosition = new Vector3(432f, -222f, 0f);
			((Transform)rect).localRotation = Quaternion.identity;
		}

		internal static void AnchorToBottom(this RectTransform rect)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			rect.ResetSizeDelta();
			rect.ResetAnchoredPos();
			rect.EditAnchors(new Vector2(0.5f, 0f), new Vector2(0.5f, 0f));
			rect.EditOffsets(new Vector2(0f, 0f), new Vector2(0f, 0f));
			rect.RefreshPosition();
		}

		internal static void RefreshPosition(this RectTransform rect)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			float value = Plugin.Config.VERSION_TEXT_OFFSET.Value;
			((Transform)rect).localPosition = new Vector3(0f, -205f + value, 0f);
			((Transform)rect).localRotation = Quaternion.identity;
		}

		internal static void SetLocalX(this RectTransform rect, float newX)
		{
			//IL_0003: 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_0018: Unknown result type (might be due to invalid IL or missing references)
			((Transform)rect).localPosition = new Vector3(newX, ((Transform)rect).localPosition.y, ((Transform)rect).localPosition.z);
		}

		internal static void FixScale(this Transform transform)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			transform.localScale = new Vector3(1.02f, 1.06f, 1.02f);
		}

		internal static float ClampedValue(this ConfigEntry<float> entry, float min, float max)
		{
			return Mathf.Clamp(entry.Value, min, max);
		}
	}
}
namespace IntroTweaks.Patches
{
	[HarmonyPatch(typeof(InitializeGame))]
	internal class InitializeGamePatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("Start")]
		private static void DisableBootAnimation(InitializeGame __instance)
		{
			int value = Plugin.Config.GAME_STARTUP_DISPLAY.Value;
			if (value >= 0)
			{
				DisplayUtil.Move(value);
			}
			if (Plugin.Config.SKIP_BOOT_ANIMATION.Value)
			{
				__instance.runBootUpScreen = false;
				__instance.bootUpAudio = null;
				__instance.bootUpAnimation = null;
			}
		}
	}
	[HarmonyPatch(typeof(MenuManager))]
	internal class MenuManagerPatch
	{
		internal static GameObject VersionNum = null;

		internal static Transform MenuContainer = null;

		internal static Transform MenuPanel = null;

		public static Color32 DARK_ORANGE = new Color32((byte)175, (byte)115, (byte)0, byte.MaxValue);

		private static MenuManager Instance;

		public static int realVer { get; internal set; }

		public static int gameVer { get; private set; }

		public static TextMeshProUGUI versionText { get; private set; }

		public static RectTransform versionTextRect { get; private set; }

		private static Config Cfg => Plugin.Config;

		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void Init(MenuManager __instance)
		{
			Instance = __instance;
			((MonoBehaviour)Instance).StartCoroutine(PatchMenuDelayed());
		}

		private static IEnumerator PatchMenuDelayed()
		{
			yield return (object)new WaitUntil((Func<bool>)(() => !GameNetworkManager.Instance.firstTimeInMenu));
			GameObject obj = GameObject.Find("MenuContainer");
			MenuContainer = ((obj != null) ? obj.transform : null);
			Transform menuContainer = MenuContainer;
			MenuPanel = ((menuContainer != null) ? menuContainer.Find("MainButtons") : null);
			Transform menuContainer2 = MenuContainer;
			object versionNum;
			if (menuContainer2 == null)
			{
				versionNum = null;
			}
			else
			{
				Transform obj2 = menuContainer2.Find("VersionNum");
				versionNum = ((obj2 != null) ? ((Component)obj2).gameObject : null);
			}
			VersionNum = (GameObject)versionNum;
			PatchMenu();
		}

		private static void PatchMenu()
		{
			Cfg.ALWAYS_SHORT_VERSION.SettingChanged += delegate
			{
				SetVersion();
			};
			Cfg.VERSION_TEXT_SIZE.SettingChanged += delegate
			{
				((TMP_Text)versionText).fontSize = Cfg.VERSION_TEXT_SIZE.ClampedValue(10f, 40f);
			};
			Cfg.VERSION_TEXT_OFFSET.SettingChanged += delegate
			{
				versionTextRect.RefreshPosition();
			};
			try
			{
				if (Cfg.FIX_MENU_PANELS.Value)
				{
					FixPanelAlignment(MenuPanel);
					FixPanelAlignment(MenuContainer.Find("LobbyHostSettings"));
					FixPanelAlignment(MenuContainer.Find("LobbyList"));
					FixPanelAlignment(MenuContainer.Find("LoadingScreen"));
					Plugin.Logger.LogDebug((object)"Fixed menu panel alignment.");
				}
				IEnumerable<GameObject> buttons = from b in ((Component)MenuPanel).GetComponentsInChildren<Button>(true)
					select ((Component)b).gameObject;
				if (Cfg.ALIGN_MENU_BUTTONS.Value)
				{
					AlignButtons(buttons);
				}
				if (Cfg.REMOVE_CREDITS_BUTTON.Value)
				{
					RemoveCreditsButton(buttons);
				}
				bool changeRenderMode = Cfg.FIX_MENU_CANVAS.Value;
				bool flag = Plugin.ModInstalled("AdvancedCompany");
				bool flag2 = Plugin.ModInstalled("MoreCompany");
				if (flag || flag2)
				{
					changeRenderMode = false;
				}
				if (Cfg.FIX_MORE_COMPANY.Value && flag2 && !flag)
				{
					string text = (FixMoreCompany() ? ". Edits have been made to its UI elements." : " but its UI elements do not exist!");
					Plugin.Logger.LogDebug((object)("MoreCompany found" + text));
				}
				TweakCanvasSettings(Instance.menuButtons, changeRenderMode);
			}
			catch (Exception arg)
			{
				Plugin.Logger.LogError((object)$"An error occurred patching the menu. SAJ.\n{arg}");
			}
			if (Cfg.REMOVE_NEWS_PANEL.Value)
			{
				GameObject newsPanel = Instance.NewsPanel;
				if (newsPanel != null)
				{
					newsPanel.SetActive(false);
				}
			}
			if (Cfg.REMOVE_LAN_WARNING.Value)
			{
				GameObject lanWarningContainer = Instance.lanWarningContainer;
				if (lanWarningContainer != null)
				{
					lanWarningContainer.SetActive(false);
				}
			}
			if (Cfg.REMOVE_LAUNCHED_IN_LAN.Value)
			{
				TextMeshProUGUI launchedInLanModeText = Instance.launchedInLanModeText;
				GameObject val = ((launchedInLanModeText != null) ? ((Component)launchedInLanModeText).gameObject : null);
				if (Object.op_Implicit((Object)(object)val))
				{
					val.SetActive(false);
				}
			}
			if (Cfg.AUTO_SELECT_HOST.Value)
			{
				Instance.ClickHostButton();
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("Update")]
		private static void UpdatePatch(MenuManager __instance)
		{
			bool activeSelf = __instance.menuButtons.activeSelf;
			if ((Object)(object)versionText == (Object)null)
			{
				TryReplaceVersionText();
				return;
			}
			((TMP_Text)versionText).text = Cfg.VERSION_TEXT.Value.Replace("$VERSION", $"{gameVer}");
			GameObject gameObject = ((Component)versionText).gameObject;
			if (!gameObject.activeSelf && activeSelf)
			{
				gameObject.SetActive(true);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("ClickHostButton")]
		private static void DisableMenuOnHost()
		{
			Transform menuPanel = MenuPanel;
			if (menuPanel != null)
			{
				((Component)menuPanel).gameObject.SetActive(false);
			}
		}

		private static bool FixMoreCompany()
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.Find("GlobalScale");
			if (!Object.op_Implicit((Object)(object)val))
			{
				return false;
			}
			GameObject gameObject = ((Component)val.transform.Find("CosmeticsScreen")).gameObject;
			val.GetComponentInParent<Canvas>().pixelPerfect = true;
			Transform transform = ((Component)gameObject.transform.Find("SpinAreaButton")).transform;
			transform.localScale = new Vector3(0.48f, 0.55f, 0.46f);
			transform.position = new Vector3(421.65f, 245.7f, 200f);
			RectTransform component = gameObject.FindInParent("ActivateButton").GetComponent<RectTransform>();
			RectTransform component2 = ((Component)gameObject.transform.Find("ExitButton")).GetComponent<RectTransform>();
			component.AnchorToBottomRight();
			component2.AnchorToBottomRight();
			((Transform)component2).SetAsLastSibling();
			((Component)gameObject.transform.Find("CosmeticsHolderBorder")).transform.localScale = new Vector3(2.4f, 2.1f, 1f);
			Transform transform2 = ((Component)Instance.menuButtons.transform.Find("HeaderImage")).transform;
			transform2.localScale = new Vector3(4.9f, 4.9f, 4.9f);
			transform2.localPosition = new Vector3(transform2.localPosition.x, transform2.localPosition.y + 35f, 0f);
			return (Object)(object)val != (Object)null;
		}

		private static void RemoveCreditsButton(IEnumerable<GameObject> buttons)
		{
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			buttons.First((GameObject b) => ((Object)b).name == "QuitButton");
			GameObject creditsButton = buttons.First((GameObject b) => ((Object)b).name == "Credits");
			creditsButton.SetActive(false);
			RectTransform creditsRect = creditsButton.GetComponent<RectTransform>();
			Rect rect = creditsRect.rect;
			float creditsHeight = ((Rect)(ref rect)).height * 1.3f;
			CollectionExtensions.Do<GameObject>(buttons, (Action<GameObject>)delegate(GameObject obj)
			{
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				//IL_0039: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0052: Unknown result type (might be due to invalid IL or missing references)
				if (Object.op_Implicit((Object)(object)obj) && !((Object)(object)obj == (Object)(object)creditsButton))
				{
					Transform transform = obj.transform;
					Vector3 localPosition = transform.localPosition;
					if (obj.transform.IsAbove((Transform)(object)creditsRect))
					{
						transform.localPosition = new Vector3(localPosition.x, localPosition.y - creditsHeight, localPosition.z);
					}
				}
			});
			Plugin.Logger.LogDebug((object)"Removed credits button.");
		}

		private static void AlignButtons(IEnumerable<GameObject> buttons)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_00a7: 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_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			RectTransform component = buttons.First((GameObject b) => ((Object)b).name == "HostButton").GetComponent<RectTransform>();
			component.SetLocalX(((Transform)component).localPosition.x + 15f);
			foreach (GameObject button in buttons)
			{
				if (!Object.op_Implicit((Object)(object)button))
				{
					Plugin.Logger.LogDebug((object)("Could not align button " + ((Object)button).name));
					continue;
				}
				RectTransform component2 = button.GetComponent<RectTransform>();
				component2.sizeDelta = component.sizeDelta;
				((Transform)component2).localPosition = new Vector3(((Transform)component).localPosition.x, ((Transform)component2).localPosition.y, ((Transform)component).localPosition.z);
				TextMeshProUGUI componentInChildren = button.GetComponentInChildren<TextMeshProUGUI>(true);
				((TMP_Text)componentInChildren).transform.FixScale();
				TweakTextSettings(componentInChildren);
				((TMP_Text)componentInChildren).fontSize = 15f;
				((TMP_Text)componentInChildren).wordSpacing = ((TMP_Text)componentInChildren).wordSpacing - 25f;
				RectTransform component3 = ((Component)componentInChildren).gameObject.GetComponent<RectTransform>();
				component3.ResetAnchoredPos();
				component3.EditOffsets(Vector2.zero, new Vector2(5f, 0f));
			}
			Plugin.Logger.LogDebug((object)"Aligned menu buttons.");
		}

		internal static void TryReplaceVersionText()
		{
			if (Cfg.CUSTOM_VERSION_TEXT.Value && !((Object)(object)VersionNum == (Object)null) && !((Object)(object)MenuPanel == (Object)null))
			{
				GameObject obj = Object.Instantiate<GameObject>(VersionNum, MenuPanel);
				((Object)obj).name = "VersionNumberText";
				versionText = InitTextMesh(obj.GetComponent<TextMeshProUGUI>());
				versionTextRect = ((Component)versionText).gameObject.GetComponent<RectTransform>();
				versionTextRect.AnchorToBottom();
				VersionNum.SetActive(false);
			}
		}

		private static void SetVersion()
		{
			bool value = Cfg.ALWAYS_SHORT_VERSION.Value;
			int num = Math.Abs(GameNetworkManager.Instance.gameVersionNum);
			gameVer = (value ? realVer : ((num != realVer) ? num : realVer));
		}

		private static TextMeshProUGUI InitTextMesh(TextMeshProUGUI tmp)
		{
			SetVersion();
			((TMP_Text)tmp).text = Cfg.VERSION_TEXT.Value;
			((TMP_Text)tmp).fontSize = Cfg.VERSION_TEXT_SIZE.ClampedValue(10f, 40f);
			((TMP_Text)tmp).alignment = (TextAlignmentOptions)514;
			TweakTextSettings(tmp);
			return tmp;
		}

		private static void TweakTextSettings(TextMeshProUGUI tmp, bool overflow = true, bool wordWrap = false)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			if (overflow)
			{
				((TMP_Text)tmp).overflowMode = (TextOverflowModes)0;
			}
			((TMP_Text)tmp).enableWordWrapping = wordWrap;
			((TMP_Text)tmp).faceColor = DARK_ORANGE;
		}

		private static void TweakCanvasSettings(GameObject panel, bool changeRenderMode)
		{
			Canvas componentInParent = panel.GetComponentInParent<Canvas>();
			componentInParent.pixelPerfect = true;
			if (changeRenderMode)
			{
				componentInParent.renderMode = (RenderMode)0;
			}
		}

		private static void FixPanelAlignment(Transform panel)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			RectTransform component = ((Component)panel).gameObject.GetComponent<RectTransform>();
			component.ResetSizeDelta();
			component.ResetAnchoredPos();
			component.EditOffsets(new Vector2(-20f, -25f), new Vector2(20f, 25f));
			panel.FixScale();
		}
	}
	[HarmonyPatch(typeof(GameNetworkManager))]
	internal class NetworkManagerPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("Awake")]
		private static void SetRealVersion(GameNetworkManager __instance)
		{
			MenuManagerPatch.realVer = __instance.gameVersionNum;
		}
	}
	[HarmonyPatch(typeof(PreInitSceneScript))]
	internal class PreInitScenePatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void FinishedFirstLaunch()
		{
			IngamePlayerSettings instance = IngamePlayerSettings.Instance;
			if (instance != null)
			{
				instance.SetPlayerFinishedLaunchOptions();
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("SkipToFinalSetting")]
		internal static void SkipToSelectedMode(PreInitSceneScript __instance, ref bool ___choseLaunchOption)
		{
			string selectedMode = Plugin.SelectedMode;
			if (!(selectedMode != "online") || !(selectedMode != "lan"))
			{
				CollectionExtensions.Do<GameObject>((IEnumerable<GameObject>)__instance.LaunchSettingsPanels, (Action<GameObject>)delegate(GameObject panel)
				{
					panel.SetActive(false);
				});
				__instance.currentLaunchSettingPanel = 0;
				((TMP_Text)__instance.headerText).text = "";
				((Component)__instance.blackTransition).gameObject.SetActive(false);
				__instance.continueButton.gameObject.SetActive(false);
				___choseLaunchOption = true;
				__instance.mainAudio.PlayOneShot(__instance.selectSFX);
				SceneManager.LoadSceneAsync((Plugin.SelectedMode == "online") ? "InitScene" : "InitSceneLANMode", (LoadSceneMode)1);
			}
		}
	}
	[HarmonyPatch(typeof(StartMatchLever))]
	internal class StartMatchLeverPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void StartMatch(StartMatchLever __instance)
		{
			if (Plugin.Config.AUTO_START_GAME.Value && !__instance.leverHasBeenPulled)
			{
				((MonoBehaviour)__instance).StartCoroutine(PullLeverAnim(__instance));
			}
		}

		private static IEnumerator PullLeverAnim(StartMatchLever instance)
		{
			yield return (object)new WaitForSeconds(Plugin.Config.AUTO_START_GAME_DELAY.Value);
			if (!instance.leverHasBeenPulled)
			{
				instance.leverAnimatorObject.SetBool("pullLever", true);
				instance.leverHasBeenPulled = true;
				instance.triggerScript.interactable = false;
				instance.PullLever();
			}
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("firstDayAnimation")]
		private static IEnumerator DisableFirstDaySFX(IEnumerator result, StartOfRound __instance)
		{
			while (result.MoveNext())
			{
				yield return result.Current;
			}
			if (Plugin.Config.DISABLE_FIRST_DAY_SFX.Value)
			{
				StopSpeaker(__instance.speakerAudioSource);
			}
		}

		private static void StopSpeaker(AudioSource source)
		{
			if (source.isPlaying)
			{
				source.Stop();
			}
		}
	}
}
namespace IntroTweaks.Data
{
	public class Config
	{
		private readonly ConfigFile configFile;

		public ConfigEntry<bool> PLUGIN_ENABLED { get; private set; }

		public ConfigEntry<bool> SKIP_SPLASH_SCREENS { get; private set; }

		public ConfigEntry<bool> SKIP_BOOT_ANIMATION { get; private set; }

		public ConfigEntry<string> AUTO_SELECT_MODE { get; private set; }

		public ConfigEntry<bool> AUTO_SELECT_HOST { get; private set; }

		public ConfigEntry<bool> ALIGN_MENU_BUTTONS { get; private set; }

		public ConfigEntry<bool> FIX_MENU_CANVAS { get; private set; }

		public ConfigEntry<bool> FIX_MENU_PANELS { get; private set; }

		public ConfigEntry<bool> FIX_MORE_COMPANY { get; internal set; }

		public ConfigEntry<bool> REMOVE_LAN_WARNING { get; private set; }

		public ConfigEntry<bool> REMOVE_LAUNCHED_IN_LAN { get; private set; }

		public ConfigEntry<bool> REMOVE_NEWS_PANEL { get; private set; }

		public ConfigEntry<bool> REMOVE_CREDITS_BUTTON { get; private set; }

		public ConfigEntry<bool> CUSTOM_VERSION_TEXT { get; private set; }

		public ConfigEntry<string> VERSION_TEXT { get; private set; }

		public ConfigEntry<float> VERSION_TEXT_SIZE { get; private set; }

		public ConfigEntry<float> VERSION_TEXT_OFFSET { get; private set; }

		public ConfigEntry<bool> ALWAYS_SHORT_VERSION { get; private set; }

		public ConfigEntry<bool> AUTO_START_GAME { get; private set; }

		public ConfigEntry<float> AUTO_START_GAME_DELAY { get; private set; }

		public ConfigEntry<bool> DISABLE_FIRST_DAY_SFX { get; private set; }

		public ConfigEntry<int> GAME_STARTUP_DISPLAY { get; private set; }

		public Config(ConfigFile cfg)
		{
			configFile = cfg;
			PLUGIN_ENABLED = NewEntry("bEnabled", defaultVal: true, "Enable or disable the plugin globally.");
			SKIP_SPLASH_SCREENS = NewEntry(Category.INTRO_TWEAKS, "bSkipSplashScreens", defaultVal: true, "Skips those pesky Unity and Zeekers startup logos!");
		}

		private ConfigEntry<T> NewEntry<T>(string key, T defaultVal, string desc)
		{
			return NewEntry(Category.GENERAL, key, defaultVal, desc);
		}

		private ConfigEntry<T> NewEntry<T>(Category category, string key, T defaultVal, string desc)
		{
			return configFile.Bind<T>(category.Value, key, defaultVal, desc);
		}

		public void InitBindings()
		{
			SKIP_BOOT_ANIMATION = NewEntry(Category.INTRO_TWEAKS, "bSkipBootAnimation", defaultVal: true, "If the loading animation (booting OS) should be skipped.");
			AUTO_SELECT_MODE = NewEntry(Category.INTRO_TWEAKS, "sAutoSelectMode", "OFF", "Which mode to automatically enter into after the splash screen.\nValid options: ONLINE, LAN, OFF");
			AUTO_SELECT_HOST = NewEntry(Category.INTRO_TWEAKS, "bAutoSelectHost", defaultVal: false, "Whether the 'Host' button is automatically selected when the Online/LAN menu loads.");
			ALIGN_MENU_BUTTONS = NewEntry(Category.MENU_TWEAKS, "bAlignMenuButtons", defaultVal: true, "If the main menu buttons should align with each other.");
			FIX_MENU_CANVAS = NewEntry(Category.MENU_TWEAKS, "bFixMenuCanvas", defaultVal: false, "Whether the main menu canvas should have its settings corrected.\nMay cause overlapping issues, only enable it if you don't use other mods that edit the menu.");
			FIX_MENU_PANELS = NewEntry(Category.MENU_TWEAKS, "bFixMenuPanels", defaultVal: false, "The main menu panels (host, servers, loading screen) all have anchoring, offset and sizing issues.\nThis option helps solve them and improve the look of the menu.\n\nMAY BREAK SOME MODS.");
			FIX_MORE_COMPANY = NewEntry(Category.MENU_TWEAKS, "bFixMoreCompany", defaultVal: true, "Whether to apply fixes to MoreCompany UI elements.\nFixes include: button placement, header positioning & scaling of cosmetics border.\n\nPRONE TO INCOMPATIBILITIES! TURN THIS OFF IF YOU ENCOUNTER BREAKING BUGS.");
			REMOVE_LAN_WARNING = NewEntry(Category.MENU_TWEAKS, "bRemoveLanWarning", defaultVal: true, "Hides the warning popup when hosting a LAN session.");
			REMOVE_LAUNCHED_IN_LAN = NewEntry(Category.MENU_TWEAKS, "bRemoveLaunchedInLanText", defaultVal: true, "Hides the 'Launched in LAN mode' text below the Quit button.");
			REMOVE_NEWS_PANEL = NewEntry(Category.MENU_TWEAKS, "bRemoveNewsPanel", defaultVal: false, "Hides the panel that displays news such as game updates.");
			REMOVE_CREDITS_BUTTON = NewEntry(Category.MENU_TWEAKS, "bRemoveCreditsButton", defaultVal: true, "Hides the 'Credits' button on the main menu. The other buttons are automatically adjusted.");
			CUSTOM_VERSION_TEXT = NewEntry(Category.VERSION_TEXT, "bCustomVersionText", defaultVal: true, "Whether to replace the game's version text with a custom alternative.");
			VERSION_TEXT = NewEntry(Category.VERSION_TEXT, "sVersionText", "v$VERSION\n[MODDED]", "Replace the game's version text with this custom text in the main menu.\nTo insert the version number, use the $VERSION syntax. E.g. Ver69 would be Ver$VERSION");
			VERSION_TEXT_SIZE = NewEntry(Category.VERSION_TEXT, "fVersionTextSize", 20f, "The font size of the version text. Min = 10, Max = 40.");
			VERSION_TEXT_OFFSET = NewEntry(Category.VERSION_TEXT, "fVersionTextOffset", 0f, "Use this option to adjust the Y position of the version text if it's out of place.\nFor example, when using 3 lines of text, a small positive value would move it back up.");
			ALWAYS_SHORT_VERSION = NewEntry(Category.VERSION_TEXT, "bAlwaysShortVersion", defaultVal: true, "If the custom version text should always show the short 'real' version.\nThis will ignore mods like LC_API and MoreCompany that change the game version.");
			AUTO_START_GAME = NewEntry(Category.MISC, "bAutoStartGame", defaultVal: false, "If enabled, the lever will be pulled automatically to begin the landing sequence.");
			AUTO_START_GAME_DELAY = NewEntry(Category.MISC, "fAutoStartGameDelay", 1.5f, "The delay before the lever is automatically pulled when bAutoStartGame is true.\nMinimum: 1 | Maximum: 30");
			DISABLE_FIRST_DAY_SFX = NewEntry(Category.MISC, "bDisableFirstDaySFX", defaultVal: false, "Toggles the first day ship speaker SFX.");
			GAME_STARTUP_DISPLAY = NewEntry(Category.MISC, "iGameStartupDisplay", 0, "The index of the monitor to display the game on when starting.\nYou can find these indexes in your Windows display settings.\nDefaults to 0 (main monitor).");
		}
	}
	public struct Category
	{
		public static Category GENERAL => new Category("0 >> General << 0");

		public static Category INTRO_TWEAKS => new Category("1 >> Intro << 1");

		public static Category MENU_TWEAKS => new Category("2 >> Main Menu << 2");

		public static Category VERSION_TEXT => new Category("3 >> Custom Version Text << 3");

		public static Category MISC => new Category("4 >> Miscellaneous << 4");

		public string Value { get; private set; }

		public Category(string value)
		{
			Value = value;
		}
	}
}

BepInEx/plugins/plugins/JetpackWarning.dll

Decompiled a day ago
using System;
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 GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[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("Hamunii")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A Lethal Company Mod that adds a visual and audio indicator for when your jetpack is about to explode.")]
[assembly: AssemblyFileVersion("2.2.0.0")]
[assembly: AssemblyInformationalVersion("2.2.0")]
[assembly: AssemblyProduct("JetpackWarning")]
[assembly: AssemblyTitle("JetpackWarning")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.2.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace JetpackWarning
{
	public static class Assets
	{
		public static string mainAssetBundleName = "jetpackAssets";

		public static AssetBundle MainAssetBundle = null;

		private static string GetAssemblyName()
		{
			return Assembly.GetExecutingAssembly().FullName.Split(',')[0];
		}

		public static void PopulateAssets()
		{
			if ((Object)(object)MainAssetBundle == (Object)null)
			{
				using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetAssemblyName() + "." + mainAssetBundleName))
				{
					MainAssetBundle = AssetBundle.LoadFromStream(stream);
				}
			}
		}
	}
	[BepInPlugin("JetpackWarning", "JetpackWarning", "2.2.0")]
	public class JetpackWarningPlugin : BaseUnityPlugin
	{
		public static Harmony _harmony;

		public static AudioClip jetpackCriticalBeep;

		public static GameObject meterContainer;

		public static GameObject meter;

		public static GameObject frame;

		public static GameObject warning;

		private void Awake()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin JetpackWarning is loaded!");
			Assets.PopulateAssets();
			_harmony = new Harmony("JetpackWarning");
			_harmony.PatchAll(typeof(Patches));
			SceneManager.sceneLoaded += OnSceneRelayLoaded;
			jetpackCriticalBeep = Assets.MainAssetBundle.LoadAsset<AudioClip>("JetpackCriticalBeep");
		}

		private void OnSceneRelayLoaded(Scene scene, LoadSceneMode loadMode)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Expected O, but got Unknown
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: 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_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			if (((Scene)(ref scene)).name == "SampleSceneRelay")
			{
				GameObject val = GameObject.Find("IngamePlayerHUD");
				meterContainer = new GameObject("jetpackMeterContainer");
				meterContainer.AddComponent<CanvasGroup>();
				RectTransform obj = meterContainer.AddComponent<RectTransform>();
				((Transform)obj).parent = val.transform;
				((Transform)obj).localScale = Vector3.one;
				obj.anchoredPosition = Vector2.zero;
				((Transform)obj).localPosition = Vector2.op_Implicit(new Vector2(50f, 0f));
				obj.sizeDelta = Vector2.one;
				meter = AddImageToHUD("jetpackMeter", scene);
				frame = AddImageToHUD("jetpackMeterFrame", scene);
				warning = AddImageToHUD("jetpackMeterWarning", scene);
				GameObject[] array = (GameObject[])(object)new GameObject[3] { meter, frame, warning };
				foreach (GameObject obj2 in array)
				{
					obj2.transform.parent = meterContainer.transform;
					obj2.transform.localPosition = Vector2.op_Implicit(Vector2.zero);
				}
				meter.GetComponent<Image>().type = (Type)3;
				meter.GetComponent<Image>().fillMethod = (FillMethod)1;
				Transform transform = warning.transform;
				transform.localPosition += new Vector3(30f, 0f);
			}
		}

		private GameObject AddImageToHUD(string imageName, Scene scene)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: 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_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: 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_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			Sprite val = Assets.MainAssetBundle.LoadAsset<Sprite>(imageName);
			GameObject val2 = new GameObject(imageName);
			SceneManager.MoveGameObjectToScene(val2, scene);
			GameObject val3 = GameObject.Find("IngamePlayerHUD");
			RectTransform obj = val2.AddComponent<RectTransform>();
			((Transform)obj).parent = val3.transform;
			((Transform)obj).localScale = Vector2.op_Implicit(Vector2.one);
			obj.anchoredPosition = Vector2.zero;
			((Transform)obj).localPosition = Vector2.op_Implicit(Vector2.zero);
			Rect rect = val.rect;
			float num = ((Rect)(ref rect)).width / 2f;
			rect = val.rect;
			obj.sizeDelta = new Vector2(num, ((Rect)(ref rect)).height / 2f);
			val2.AddComponent<Image>().sprite = val;
			val2.AddComponent<CanvasRenderer>();
			return val2;
		}
	}
	internal class Patches
	{
		private static bool playJetpackCritical = false;

		private static bool playingJetpackCritical = false;

		private static float criticalFill = 0.75f;

		[HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")]
		[HarmonyPostfix]
		private static void PlayerControllerB_LateUpdate_Postfix(ref PlayerControllerB __instance)
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Expected O, but got Unknown
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_021e: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0240: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)__instance).IsOwner || (((NetworkBehaviour)__instance).IsServer && !__instance.isHostPlayerObject) || !__instance.isPlayerControlled || __instance.isPlayerDead)
			{
				return;
			}
			if (__instance.isHoldingObject && __instance.currentlyHeldObjectServer is JetpackItem)
			{
				JetpackItem val = (JetpackItem)__instance.currentlyHeldObjectServer;
				JetpackWarningPlugin.meterContainer.SetActive(true);
				Vector3 val2 = (Vector3)typeof(JetpackItem).GetField("forces", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(val);
				float num = (float)typeof(JetpackItem).GetField("jetpackPower", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(val);
				float num2 = ((!(num < 80f)) ? (0.5f - Mathf.Clamp(num / 20f - 4f, 0f, 1f) / 2f) : (Mathf.Clamp(num / 25f - 2.2f, 0f, 1f) / 2f));
				if (((Vector3)(ref val2)).magnitude > 47f)
				{
					num2 = Mathf.Clamp(((Vector3)(ref val2)).magnitude / 3f - 15.6666f, 0f, 1f);
				}
				float num3 = ((((Vector3)(ref val2)).magnitude >= 0f) ? (((Vector3)(ref val2)).magnitude / 50f) : 0f);
				float num4 = Mathf.Lerp((((Vector3)(ref val2)).magnitude / 2f + num / 2.25f >= 0f) ? ((((Vector3)(ref val2)).magnitude / 2f + num / 2.25f) / 50f) : 0f, num3, num2);
				JetpackWarningPlugin.meter.GetComponent<Image>().fillAmount = num4;
				JetpackWarningPlugin.warning.SetActive(num4 > criticalFill);
				playJetpackCritical = num4 > criticalFill;
				Color color = Color.Lerp(new Color(1f, 0.82f, 0.405f, 1f), new Color(0.769f, 0.243f, 0.243f, 1f), num4);
				((Graphic)JetpackWarningPlugin.meter.GetComponent<Image>()).color = color;
				((Graphic)JetpackWarningPlugin.frame.GetComponent<Image>()).color = color;
				((Graphic)JetpackWarningPlugin.warning.GetComponent<Image>()).color = color;
				if (playJetpackCritical)
				{
					if (!playingJetpackCritical)
					{
						playingJetpackCritical = true;
						val.jetpackBeepsAudio.clip = JetpackWarningPlugin.jetpackCriticalBeep;
						val.jetpackBeepsAudio.Play();
					}
				}
				else
				{
					playingJetpackCritical = false;
				}
			}
			else
			{
				JetpackWarningPlugin.meterContainer.SetActive(false);
			}
		}

		[HarmonyPatch(typeof(JetpackItem), "SetJetpackAudios")]
		[HarmonyPrefix]
		private static bool JetpackItem_SetJetpackAudios_Prefix(ref bool ___jetpackActivated, ref AudioSource ___jetpackBeepsAudio)
		{
			return !playingJetpackCritical;
		}

		[HarmonyPatch(typeof(JetpackItem), "JetpackEffect")]
		[HarmonyPostfix]
		private static void JetpackItem_JetpackEffect_Postfix(ref bool __0, JetpackItem __instance)
		{
			if (__0 && playJetpackCritical)
			{
				playingJetpackCritical = true;
				__instance.jetpackBeepsAudio.clip = JetpackWarningPlugin.jetpackCriticalBeep;
				__instance.jetpackBeepsAudio.Play();
			}
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "JetpackWarning";

		public const string PLUGIN_NAME = "JetpackWarning";

		public const string PLUGIN_VERSION = "2.2.0";
	}
}

BepInEx/plugins/plugins/LCAmmoCheck.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
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("LCAmmoCheck")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Mod that allows you to check ammo in shotgun")]
[assembly: AssemblyFileVersion("1.1.1.0")]
[assembly: AssemblyInformationalVersion("1.1.1+09faa498f4a0e28be67bf9ce9655783d408c92ee")]
[assembly: AssemblyProduct("LCAmmoCheck")]
[assembly: AssemblyTitle("LCAmmoCheck")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.1.0")]
[module: UnverifiableCode]
[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;
		}
	}
}
namespace System.Runtime.Versioning
{
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiresPreviewFeaturesAttribute : Attribute
	{
		public string? Message { get; }

		public string? Url { get; set; }

		public RequiresPreviewFeaturesAttribute()
		{
		}

		public RequiresPreviewFeaturesAttribute(string? message)
		{
			Message = message;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CallerArgumentExpressionAttribute : Attribute
	{
		public string ParameterName { get; }

		public CallerArgumentExpressionAttribute(string parameterName)
		{
			ParameterName = parameterName;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CollectionBuilderAttribute : Attribute
	{
		public Type BuilderType { get; }

		public string MethodName { get; }

		public CollectionBuilderAttribute(Type builderType, string methodName)
		{
			BuilderType = builderType;
			MethodName = methodName;
		}
	}
	[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CompilerFeatureRequiredAttribute : Attribute
	{
		public const string RefStructs = "RefStructs";

		public const string RequiredMembers = "RequiredMembers";

		public string FeatureName { get; }

		public bool IsOptional { get; set; }

		public CompilerFeatureRequiredAttribute(string featureName)
		{
			FeatureName = featureName;
		}
	}
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class InterpolatedStringHandlerArgumentAttribute : Attribute
	{
		public string[] Arguments { get; }

		public InterpolatedStringHandlerArgumentAttribute(string argument)
		{
			Arguments = new string[1] { argument };
		}

		public InterpolatedStringHandlerArgumentAttribute(params string[] arguments)
		{
			Arguments = arguments;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class InterpolatedStringHandlerAttribute : Attribute
	{
	}
	[EditorBrowsable(EditorBrowsableState.Never)]
	[ExcludeFromCodeCoverage]
	internal static class IsExternalInit
	{
	}
	[AttributeUsage(AttributeTargets.Method, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ModuleInitializerAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiredMemberAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	[EditorBrowsable(EditorBrowsableState.Never)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiresLocationAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Interface, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class SkipLocalsInitAttribute : Attribute
	{
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ExperimentalAttribute : Attribute
	{
		public string DiagnosticId { get; }

		public string? UrlFormat { get; set; }

		public ExperimentalAttribute(string diagnosticId)
		{
			DiagnosticId = diagnosticId;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	internal sealed class MemberNotNullAttribute : Attribute
	{
		public string[] Members { get; }

		public MemberNotNullAttribute(string member)
		{
			Members = new string[1] { member };
		}

		public MemberNotNullAttribute(params string[] members)
		{
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	internal sealed class MemberNotNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public string[] Members { get; }

		public MemberNotNullWhenAttribute(bool returnValue, string member)
		{
			ReturnValue = returnValue;
			Members = new string[1] { member };
		}

		public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
		{
			ReturnValue = returnValue;
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class SetsRequiredMembersAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class StringSyntaxAttribute : Attribute
	{
		public const string CompositeFormat = "CompositeFormat";

		public const string DateOnlyFormat = "DateOnlyFormat";

		public const string DateTimeFormat = "DateTimeFormat";

		public const string EnumFormat = "EnumFormat";

		public const string GuidFormat = "GuidFormat";

		public const string Json = "Json";

		public const string NumericFormat = "NumericFormat";

		public const string Regex = "Regex";

		public const string TimeOnlyFormat = "TimeOnlyFormat";

		public const string TimeSpanFormat = "TimeSpanFormat";

		public const string Uri = "Uri";

		public const string Xml = "Xml";

		public string Syntax { get; }

		public object?[] Arguments { get; }

		public StringSyntaxAttribute(string syntax)
		{
			Syntax = syntax;
			Arguments = new object[0];
		}

		public StringSyntaxAttribute(string syntax, params object?[] arguments)
		{
			Syntax = syntax;
			Arguments = arguments;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class UnscopedRefAttribute : Attribute
	{
	}
}
namespace LCAmmoCheck
{
	[BepInPlugin("me.axd1x8a.lcammocheck", "LCAmmoCheck", "1.1.1")]
	public class LCAmmoCheckPlugin : BaseUnityPlugin
	{
		private static Harmony? harmony;

		public static LCAmmoCheckPlugin? Instance { get; private set; }

		public static AnimationClip? ShotgunInspectClip { get; private set; }

		public static AudioClip? ShotgunInspectSFX { get; private set; }

		private static void LoadAssetBundle()
		{
			AssetBundle obj = AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("LCAmmoCheck.lcammocheck"));
			ShotgunInspectClip = obj.LoadAsset<AnimationClip>("Assets/AnimationClip/ShotgunInspect.anim");
			ShotgunInspectSFX = obj.LoadAsset<AudioClip>("Assets/AudioClip/ShotgunInspect.ogg");
			AudioClip? shotgunInspectSFX = ShotgunInspectSFX;
			if (shotgunInspectSFX != null)
			{
				shotgunInspectSFX.LoadAudioData();
			}
			obj.Unload(false);
		}

		public void Awake()
		{
			Instance = this;
			LoadAssetBundle();
			harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "me.axd1x8a.lcammocheck");
			((BaseUnityPlugin)this).Logger.Log((LogLevel)8, (object)"LCAmmoCheck loaded!");
		}

		public static void OnDestroy()
		{
			Harmony? obj = harmony;
			if (obj != null)
			{
				obj.UnpatchSelf();
			}
			Instance = null;
			harmony = null;
			Debug.Log((object)"LCAmmoCheck unloaded!");
		}
	}
	internal static class GeneratedPluginInfo
	{
		public const string Identifier = "me.axd1x8a.lcammocheck";

		public const string Name = "LCAmmoCheck";

		public const string Version = "1.1.1";
	}
}
namespace LCAmmoCheck.Patches
{
	[HarmonyPatch(typeof(ShotgunItem))]
	internal sealed class ShotgunItemPatch
	{
		private static readonly Dictionary<int, AnimationClip> originalClips = new Dictionary<int, AnimationClip>();

		private static AnimatorOverrideController OverrideController(Animator animator)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			RuntimeAnimatorController runtimeAnimatorController = animator.runtimeAnimatorController;
			AnimatorOverrideController val = (AnimatorOverrideController)(object)((runtimeAnimatorController is AnimatorOverrideController) ? runtimeAnimatorController : null);
			if (val != null)
			{
				return val;
			}
			return (AnimatorOverrideController)(object)(animator.runtimeAnimatorController = (RuntimeAnimatorController)new AnimatorOverrideController(animator.runtimeAnimatorController));
		}

		private static IEnumerator CheckAmmoAnimation(ShotgunItem s)
		{
			AnimatorOverrideController overrideController = OverrideController(((GrabbableObject)s).playerHeldBy.playerBodyAnimator);
			int playerAnimatorId = ((Object)((GrabbableObject)s).playerHeldBy.playerBodyAnimator).GetInstanceID();
			originalClips[playerAnimatorId] = overrideController["ShotgunReloadOneShell"];
			overrideController["ShotgunReloadOneShell"] = LCAmmoCheckPlugin.ShotgunInspectClip;
			s.isReloading = true;
			((Renderer)s.shotgunShellLeft).enabled = s.shellsLoaded > 0;
			((Renderer)s.shotgunShellRight).enabled = s.shellsLoaded > 1;
			((GrabbableObject)s).playerHeldBy.playerBodyAnimator.SetBool("ReloadShotgun", true);
			yield return (object)new WaitForSeconds(0.3f);
			s.gunAudio.PlayOneShot(LCAmmoCheckPlugin.ShotgunInspectSFX);
			s.gunAnimator.SetBool("Reloading", true);
			yield return (object)new WaitForSeconds(0.95f);
			yield return (object)new WaitForSeconds(0.95f);
			yield return (object)new WaitForSeconds(0.15f);
			s.gunAnimator.SetBool("Reloading", false);
			yield return (object)new WaitForSeconds(0.25f);
			((GrabbableObject)s).playerHeldBy.playerBodyAnimator.SetBool("ReloadShotgun", false);
			yield return (object)new WaitForSeconds(0.25f);
			originalClips.Remove(playerAnimatorId, out AnimationClip value);
			overrideController["ShotgunReloadOneShell"] = value;
			s.isReloading = false;
		}

		private static void CleanUp(Animator animator)
		{
			RuntimeAnimatorController runtimeAnimatorController = animator.runtimeAnimatorController;
			AnimatorOverrideController val = (AnimatorOverrideController)(object)((runtimeAnimatorController is AnimatorOverrideController) ? runtimeAnimatorController : null);
			if (val != null && originalClips.Remove(((Object)animator).GetInstanceID(), out AnimationClip value))
			{
				val["ShotgunReloadOneShell"] = value;
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("StopUsingGun")]
		public static bool StopUsingGunPrefix(ShotgunItem __instance)
		{
			CleanUp((((GrabbableObject)__instance).playerHeldBy ?? __instance.previousPlayerHeldBy).playerBodyAnimator);
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("StartReloadGun")]
		public static bool StartReloadGunPrefix(ShotgunItem __instance)
		{
			if (!__instance.ReloadedGun() || __instance.shellsLoaded >= 2)
			{
				if (__instance.gunCoroutine != null)
				{
					((MonoBehaviour)__instance).StopCoroutine(__instance.gunCoroutine);
				}
				__instance.gunCoroutine = ((MonoBehaviour)__instance).StartCoroutine(CheckAmmoAnimation(__instance));
				return false;
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("ItemInteractLeftRight")]
		public static bool ItemInteractLeftRightPrefix(ShotgunItem __instance, bool right)
		{
			if (!right)
			{
				return true;
			}
			if ((Object)(object)((RaycastHit)(ref ((GrabbableObject)__instance).playerHeldBy.hit)).collider != (Object)null && ((Component)((RaycastHit)(ref ((GrabbableObject)__instance).playerHeldBy.hit)).collider).tag == "InteractTrigger")
			{
				return false;
			}
			return true;
		}

		[HarmonyPrefix]
		[HarmonyPatch("Start")]
		public static bool StartPrefix(ShotgunItem __instance)
		{
			((GrabbableObject)__instance).itemProperties.toolTips[1] = "Reload / Check ammo : [E]";
			return true;
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(ShotgunItem), "StartReloadGun")]
		public static IEnumerable<CodeInstruction> StartReloadGunTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			List<CodeInstruction> list = new List<CodeInstruction>(instructions);
			for (int i = 0; i < list.Count; i++)
			{
				if (list[i].opcode == OpCodes.Call && ((MethodInfo)list[i].operand).Name == "ReloadedGun")
				{
					list[i - 1].opcode = OpCodes.Nop;
					list[i].opcode = OpCodes.Ldc_I4_1;
					list[i].operand = null;
					break;
				}
			}
			return list.AsEnumerable();
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(ShotgunItem), "ItemInteractLeftRight")]
		public static IEnumerable<CodeInstruction> ItemInteractLeftRightTranspiler(IEnumerable<CodeInstruction> instructions)
		{
			List<CodeInstruction> list = new List<CodeInstruction>(instructions);
			for (int i = 0; i < list.Count; i++)
			{
				if (list[i].opcode == OpCodes.Ldfld && list[i].operand.ToString().Contains("shellsLoaded"))
				{
					list[i + 1].opcode = OpCodes.Ldc_I4_3;
					break;
				}
			}
			return list.AsEnumerable();
		}
	}
}

BepInEx/plugins/plugins/LethalLoudnessMeter.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLoudnessMeter.Patches;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("LoudnessMeter")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LoudnessMeter")]
[assembly: AssemblyCopyright("Copyright © extraes 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("368a271e-98d6-48f8-981e-60df5875ea73")]
[assembly: AssemblyFileVersion("1.0.2")]
[assembly: TargetFramework(".NETFramework,Version=v4.6", FrameworkDisplayName = ".NET Framework 4.6")]
[assembly: AssemblyVersion("1.0.2.0")]
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;
		}
	}
}
namespace LethalLoudnessMeter
{
	internal static class BuildInfo
	{
		public const string GUID = "xyz.extraes.lethalLoudness";

		public const string NAME = "LoudnessMeter";

		public const string SHORT_NAME = "LoudMeter";

		public const string VERSION = "1.0.2";

		public const string AUTHOR = "extraes";
	}
	internal static class LMUtils
	{
		public static MethodInfo AsInfo<T>(T dele) where T : Delegate
		{
			return dele.Method;
		}

		public static HarmonyMethod ToHarmony<T>(T dele) where T : Delegate
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			return new HarmonyMethod(AsInfo(dele));
		}
	}
	[BepInPlugin("xyz.extraes.lethalLoudness", "LoudMeter", "1.0.2")]
	public sealed class LoudnessMeterPlugin : BaseUnityPlugin
	{
		private Image volumeImg;

		private Collider playersCollider;

		private float accumulatedVolume;

		public static LoudnessMeterPlugin Instance { get; private set; }

		public static ManualLogSource Log
		{
			get
			{
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				LoudnessMeterPlugin instance = Instance;
				return (ManualLogSource)(((object)((instance != null) ? ((BaseUnityPlugin)instance).Logger : null)) ?? ((object)new ManualLogSource("LoudMeter")));
			}
		}

		public bool NeedsSnatchedImage => (Object)(object)volumeImg == (Object)null;

		internal static Harmony Harmony { get; private set; }

		static LoudnessMeterPlugin()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			Log.LogMessage((object)"Initializing Lethal Loudness Meter...");
			Stopwatch stopwatch = Stopwatch.StartNew();
			Harmony = new Harmony("xyz.extraes.lethalLoudness");
			Harmony.PatchAll();
			FootstepPatches.Init();
			ItemPatches.Init();
			Log.LogInfo((object)("Initialized LethalLoudness in " + stopwatch.ElapsedMilliseconds + "ms"));
		}

		private void Awake()
		{
			Instance = this;
			Object.DontDestroyOnLoad((Object)(object)this);
			PlayAudibleNoisePatch.noisePlayed = (Action<Vector3, float, float>)Delegate.Combine(PlayAudibleNoisePatch.noisePlayed, new Action<Vector3, float, float>(NoisePlayed));
		}

		private void NoisePlayed(Vector3 pos, float range, float vol)
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)
			{
				return;
			}
			if ((Object)(object)playersCollider == (Object)null)
			{
				playersCollider = ((Component)GameNetworkManager.Instance.localPlayerController).GetComponent<Collider>();
			}
			if (playersCollider.enabled)
			{
				Vector3 val = playersCollider.ClosestPoint(pos);
				if (!(Vector3.Distance(pos, val) > 0.8f))
				{
					accumulatedVolume += vol;
				}
			}
		}

		private void Update()
		{
			if ((Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)
			{
				return;
			}
			if ((Object)(object)volumeImg == (Object)null && accumulatedVolume != 0f)
			{
				Log.LogError((object)"Volume image wasn't found! Wha?");
				return;
			}
			if (volumeImg.fillAmount < accumulatedVolume)
			{
				volumeImg.fillAmount = Mathf.Clamp(accumulatedVolume, 0.05f, 1f);
			}
			else
			{
				float fillAmount = volumeImg.fillAmount;
				float num = Mathf.Clamp(accumulatedVolume, 0.01f, 1f);
				float num2 = Mathf.Clamp(Time.deltaTime * 3f, 0f, 1f);
				volumeImg.fillAmount = Mathf.Lerp(fillAmount, num, num2);
			}
			accumulatedVolume = 0f;
		}

		private void OnDestroy()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			Log.LogError((object)"Creating new GameObject to host LoudnessMeter...");
			new GameObject("LMP").AddComponent<LoudnessMeterPlugin>();
		}

		public void SetVolumeImage(Image img)
		{
			if ((Object)(object)volumeImg != (Object)null)
			{
				Log.LogWarning((object)"Volume img isn't null but you're replacing it? Whar?");
			}
			volumeImg = img;
		}
	}
}
namespace LethalLoudnessMeter.Patches
{
	internal static class FootstepPatches
	{
		public static void Init()
		{
			MethodInfo methodInfo = AccessTools.DeclaredMethod(typeof(PlayerControllerB), "PlayFootstepServer", (Type[])null, (Type[])null);
			MethodInfo methodInfo2 = AccessTools.DeclaredMethod(typeof(PlayerControllerB), "PlayFootstepLocal", (Type[])null, (Type[])null);
			HarmonyMethod val = LMUtils.ToHarmony<Action<PlayerControllerB>>(FootstepServer);
			HarmonyMethod val2 = LMUtils.ToHarmony<Action<PlayerControllerB>>(FootstepLocal);
			LoudnessMeterPlugin.Harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			LoudnessMeterPlugin.Harmony.Patch((MethodBase)methodInfo2, (HarmonyMethod)null, val2, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		private static void FootstepServer(PlayerControllerB __instance)
		{
		}

		private static void FootstepLocal(PlayerControllerB __instance)
		{
		}
	}
	internal static class ItemPatches
	{
		public static void Init()
		{
		}
	}
	[HarmonyPatch(typeof(DisplayPlayerMicVolume), "Awake")]
	internal static class MicVolumeSnatcher
	{
		public static void Postfix(DisplayPlayerMicVolume __instance)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = Object.Instantiate<GameObject>(((Component)__instance.volumeMeterImage).gameObject);
			Image component = obj.GetComponent<Image>();
			RectTransform val = (RectTransform)obj.transform;
			CanvasRenderer canvasRenderer = ((Graphic)component).canvasRenderer;
			GameObject val2 = GameObject.Find("Systems/UI/Canvas/IngamePlayerHUD/BottomLeftCorner");
			((Transform)val).SetParent(val2.transform, true);
			val.anchoredPosition3D = new Vector3(-10f, 40f, 0f);
			((Transform)val).localScale = new Vector3(15f, 15f, 15f);
			canvasRenderer.SetAlpha(4f);
			component.fillAmount = 1f;
			LoudnessMeterPlugin.Log.LogMessage((object)"Snatched mic volume!");
			LoudnessMeterPlugin.Instance.SetVolumeImage(component);
		}
	}
	[HarmonyPatch(typeof(RoundManager), "PlayAudibleNoise")]
	internal static class PlayAudibleNoisePatch
	{
		public static Action<Vector3, float, float> noisePlayed;

		public static void Postfix(Vector3 noisePosition, float noiseRange, float noiseLoudness)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			noisePlayed?.Invoke(noisePosition, noiseRange, noiseLoudness);
		}
	}
	[HarmonyPatch(typeof(HUDManager), "Awake")]
	internal static class SettingsPanelActivator
	{
		public static void Postfix()
		{
			Transform obj = GameObject.Find("Systems/UI/Canvas").transform.Find("QuickMenu");
			Transform val = obj.Find("SettingsPanel");
			((Component)obj).gameObject.SetActive(true);
			((Component)val).gameObject.SetActive(true);
			((Component)val).gameObject.SetActive(false);
			((Component)obj).gameObject.SetActive(false);
			LoudnessMeterPlugin.Log.LogMessage((object)"Toggled QuickMenu -> SettingsPanel successfully");
		}
	}
}

BepInEx/plugins/plugins/MoreEmotes1.3.3.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using MoreEmotes.Patch;
using MoreEmotes.Scripts;
using RuntimeNetcodeRPCValidator;
using TMPro;
using Tools;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Animations.Rigging;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.InputSystem.Utilities;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("FuckYouMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FuckYouMod")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("5ecc2bf2-af12-4e83-a6f1-cf2eacbf3060")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Tools
{
	public class Ref
	{
		public static object GetInstanceField(Type type, object instance, string fieldName)
		{
			BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
			FieldInfo field = type.GetField(fieldName, bindingAttr);
			return field.GetValue(instance);
		}

		public static object Method(object instance, string methodName, params object[] args)
		{
			MethodInfo method = instance.GetType().GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);
			if (method != null)
			{
				return method.Invoke(instance, args);
			}
			return null;
		}
	}
	public class D : MonoBehaviour
	{
		public static bool Debug;

		public static void L(string msg)
		{
			if (Debug)
			{
				Debug.Log((object)msg);
			}
		}

		public static void W(string msg)
		{
			if (Debug)
			{
				Debug.LogWarning((object)msg);
			}
		}
	}
}
namespace MoreEmotes
{
	[BepInPlugin("MoreEmotes", "MoreEmotes-Sligili", "1.3.3")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class MoreEmotesInitialization : BaseUnityPlugin
	{
		private Harmony _harmony;

		private NetcodeValidator netcodeValidator;

		private ConfigEntry<string> config_KeyWheel;

		private ConfigEntry<string> config_KeyWheel_c;

		private ConfigEntry<bool> config_InventoryCheck;

		private ConfigEntry<bool> config_UseConfigFile;

		private ConfigEntry<string> config_KeyEmote3;

		private ConfigEntry<string> config_KeyEmote4;

		private ConfigEntry<string> config_KeyEmote5;

		private ConfigEntry<string> config_KeyEmote6;

		private ConfigEntry<string> config_KeyEmote7;

		private ConfigEntry<string> config_KeyEmote8;

		private ConfigEntry<string> config_KeyEmote9;

		private ConfigEntry<string> config_KeyEmote10;

		private void Awake()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Expected O, but got Unknown
			((BaseUnityPlugin)this).Logger.LogInfo((object)"MoreEmotes loaded");
			LoadAssetBundles();
			LoadAssets();
			ConfigFile();
			SearchForIncompatibleMods();
			_harmony = new Harmony("MoreEmotes");
			_harmony.PatchAll(typeof(EmotePatch));
			netcodeValidator = new NetcodeValidator("MoreEmotes");
			netcodeValidator.PatchAll();
			netcodeValidator.BindToPreExistingObjectByBehaviour<SignEmoteText, PlayerControllerB>();
			netcodeValidator.BindToPreExistingObjectByBehaviour<SyncAnimatorToOthers, PlayerControllerB>();
		}

		private void LoadAssetBundles()
		{
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animationsbundle");
			string text2 = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MoreEmotes/animatorbundle");
			try
			{
				EmotePatch.AnimationsBundle = AssetBundle.LoadFromFile(text);
				EmotePatch.AnimatorBundle = AssetBundle.LoadFromFile(text2);
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load AssetBundles. Make sure \"animatorsbundle\" and \"animationsbundle\" are inside the MoreEmotes folder.\nError: " + ex.Message));
			}
		}

		private void LoadAssets()
		{
			string path = "Assets/MoreEmotes";
			EmotePatch.local = EmotePatch.AnimatorBundle.LoadAsset<RuntimeAnimatorController>(Path.Combine(path, "NEWmetarig.controller"));
			EmotePatch.others = EmotePatch.AnimatorBundle.LoadAsset<RuntimeAnimatorController>(Path.Combine(path, "NEWmetarigOtherPlayers.controller"));
			MoreEmotesEvents.ClapSounds[0] = EmotePatch.AnimationsBundle.LoadAsset<AudioClip>(Path.Combine(path, "SingleClapEmote1.wav"));
			MoreEmotesEvents.ClapSounds[1] = EmotePatch.AnimationsBundle.LoadAsset<AudioClip>(Path.Combine(path, "SingleClapEmote2.wav"));
			EmotePatch.SettingsPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/MoreEmotesPanel.prefab"));
			EmotePatch.ButtonPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/MoreEmotesButton.prefab"));
			EmotePatch.LegsPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/plegs.prefab"));
			EmotePatch.SignPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/Sign.prefab"));
			EmotePatch.SignUIPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>(Path.Combine(path, "Resources/SignTextUI.prefab"));
			EmotePatch.WheelPrefab = EmotePatch.AnimationsBundle.LoadAsset<GameObject>("Assets/MoreEmotes/Resources/MoreEmotesMenu.prefab");
		}

		private void ConfigFile()
		{
			EmotePatch.ConfigFile_Keybinds = new string[32];
			config_KeyWheel = ((BaseUnityPlugin)this).Config.Bind<string>("EMOTE WHEEL", "Key", "v", (ConfigDescription)null);
			EmotePatch.ConfigFile_WheelKeybind = config_KeyWheel.Value;
			config_KeyWheel_c = ((BaseUnityPlugin)this).Config.Bind<string>("EMOTE WHEEL (Controller)", "Key", "leftshoulder", (ConfigDescription)null);
			EmotePatch.ConfigFile_WheelKeybind_controller = config_KeyWheel_c.Value;
			config_InventoryCheck = ((BaseUnityPlugin)this).Config.Bind<bool>("OTHERS", "InventoryCheck", true, "Prevents some emotes from performing while holding any item/scrap");
			EmotePatch.ConfigFile_InventoryCheck = config_InventoryCheck.Value;
			config_UseConfigFile = ((BaseUnityPlugin)this).Config.Bind<bool>("OTHERS", "ConfigFile", false, "Ignores all in-game saved settings and instead uses the config file");
			EmotePatch.UseConfigFile = config_UseConfigFile.Value;
			config_KeyEmote3 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Middle Finger", "3", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[2] = config_KeyEmote3.Value.Replace(" ", "");
			config_KeyEmote4 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "The Griddy", "6", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[5] = config_KeyEmote4.Value.Replace(" ", "");
			config_KeyEmote5 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Shy", "5", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[4] = config_KeyEmote5.Value.Replace(" ", "");
			config_KeyEmote6 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Clap", "4", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[3] = config_KeyEmote6.Value.Replace(" ", "");
			config_KeyEmote7 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Twerk", "7", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[6] = config_KeyEmote7.Value.Replace(" ", "");
			config_KeyEmote8 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Salute", "8", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[7] = config_KeyEmote8.Value.Replace(" ", "");
			config_KeyEmote9 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Prisyadka", "9", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[8] = config_KeyEmote9.Value.Replace(" ", "");
			config_KeyEmote10 = ((BaseUnityPlugin)this).Config.Bind<string>("QUICK EMOTES", "Sign", "0", (ConfigDescription)null);
			EmotePatch.ConfigFile_Keybinds[9] = config_KeyEmote10.Value.Replace(" ", "");
		}

		private void SearchForIncompatibleMods()
		{
			foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos)
			{
				BepInPlugin metadata = pluginInfo.Value.Metadata;
				if (metadata.GUID.Equals("com.malco.lethalcompany.moreshipupgrades", StringComparison.OrdinalIgnoreCase) || metadata.GUID.Equals("Stoneman.LethalProgression", StringComparison.OrdinalIgnoreCase))
				{
					EmotePatch.IncompatibleStuff = true;
					break;
				}
			}
		}
	}
	public static class PluginInfo
	{
		public const string GUID = "MoreEmotes";

		public const string NAME = "MoreEmotes-Sligili";

		public const string VER = "1.3.3";
	}
}
namespace MoreEmotes.Patch
{
	public enum Emotes
	{
		D_Sign = 1010,
		D_Clap = 1004,
		D_Middle_Finger = 1003,
		Dance = 1,
		Point = 2,
		Middle_Finger = 3,
		Clap = 4,
		Shy = 5,
		The_Griddy = 6,
		Twerk = 7,
		Salute = 8,
		Prisyadka = 9,
		Sign = 10
	}
	public class EmotePatch
	{
		public static AssetBundle AnimationsBundle;

		public static AssetBundle AnimatorBundle;

		public static RuntimeAnimatorController local;

		public static RuntimeAnimatorController others;

		public static bool UseConfigFile;

		public static string[] ConfigFile_Keybinds;

		public static string ConfigFile_WheelKeybind;

		public static string ConfigFile_WheelKeybind_controller;

		public static bool ConfigFile_InventoryCheck;

		public static string EmoteWheelKeyboard;

		public static string EmoteWheelController;

		public static bool IncompatibleStuff;

		private static int s_currentEmoteID = 0;

		private static float s_defaultPlayerSpeed;

		private static bool[] s_wasPerformingEmote = new bool[32];

		public static bool IsEmoteWheelOpen;

		private static bool s_isPlayerFirstFrame;

		private static bool s_isFirstTimeOnMenu;

		private static bool s_isPlayerSpawning;

		public const int AlternateEmoteIDOffset = 1000;

		private static int[] s_doubleEmotesIDS = new int[2] { 3, 4 };

		public static bool LocalArmsSeparatedFromCamera;

		private static Transform s_freeArmsTarget;

		private static Transform s_lockedArmsTarget;

		private static CallbackContext emptyContext;

		public static GameObject ButtonPrefab;

		public static GameObject SettingsPrefab;

		public static GameObject LegsPrefab;

		public static GameObject SignPrefab;

		public static GameObject SignUIPrefab;

		public static GameObject WheelPrefab;

		private static GameObject s_localPlayerLevelBadge;

		private static GameObject s_localPlayerBetaBadge;

		private static Transform s_legsMesh;

		private static EmoteWheel s_selectionWheel;

		private static SignUI s_customSignInputField;

		private static SyncAnimatorToOthers s_syncAnimator;

		private static int _AlternateEmoteIDOffset => 1000;

		private static void InstantiateSettingsMenu(Transform container)
		{
			RebindButton.ConfigFile_Keybinds = ConfigFile_Keybinds;
			if (!PlayerPrefs.HasKey("InvCheck") || UseConfigFile)
			{
				PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0);
			}
			ToggleButton.s_InventoryCheck = (UseConfigFile ? ConfigFile_InventoryCheck : (PlayerPrefs.GetInt("InvCheck") == 1));
			SetupUI.UseConfigFile = UseConfigFile;
			SetupUI.InventoryCheck = ToggleButton.s_InventoryCheck;
			GameObject gameObject = ((Component)((Component)container).transform.Find("SettingsPanel")).gameObject;
			Object.Instantiate<GameObject>(ButtonPrefab, gameObject.transform).transform.SetSiblingIndex(7);
			Object.Instantiate<GameObject>(SettingsPrefab, gameObject.transform);
			gameObject.AddComponent<SetupUI>();
		}

		private static void CheckEmoteInput(string keyBind, bool needsEmptyHands, int emoteID, PlayerControllerB player)
		{
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			Emotes emotes = (Emotes)emoteID;
			string text = emotes.ToString();
			bool flag;
			if (UseConfigFile)
			{
				flag = ConfigFile_InventoryCheck;
				keyBind = ConfigFile_Keybinds[emoteID - 1];
			}
			else
			{
				flag = PlayerPrefs.GetInt("InvCheck") == 1;
				if (PlayerPrefs.HasKey(text))
				{
					keyBind = PlayerPrefs.GetString(text);
				}
				else
				{
					PlayerPrefs.SetString(text, keyBind);
				}
			}
			if (!keyBind.Equals(string.Empty) && InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[keyBind], 0f) && (!player.isHoldingObject || !needsEmptyHands || !flag))
			{
				player.PerformEmote(emptyContext, emoteID);
			}
		}

		private static void CheckWheelInput(string keybind, string controller, PlayerControllerB player)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			bool flag2 = false;
			if (Gamepad.all.Count != 0 && !controller.Equals(string.Empty))
			{
				flag = InputControlExtensions.IsPressed(((InputControl)Gamepad.current)[controller], 0f);
			}
			if (keybind != string.Empty)
			{
				flag2 = InputControlExtensions.IsPressed(((InputControl)Keyboard.current)[keybind], 0f) && !((ButtonControl)Keyboard.current[(Key)55]).wasPressedThisFrame;
			}
			bool flag3 = flag || flag2;
			if (flag3 && !IsEmoteWheelOpen && !player.isPlayerDead && !player.inTerminalMenu && !player.quickMenuManager.isMenuOpen && !player.isTypingChat && !s_customSignInputField.IsSignUIOpen)
			{
				IsEmoteWheelOpen = true;
				Cursor.visible = true;
				Cursor.lockState = (CursorLockMode)2;
				((Component)s_selectionWheel).gameObject.SetActive(IsEmoteWheelOpen);
				player.disableLookInput = true;
			}
			else
			{
				if (!IsEmoteWheelOpen || (flag3 && !player.quickMenuManager.isMenuOpen && !player.isTypingChat && !s_customSignInputField.IsSignUIOpen))
				{
					return;
				}
				int selectedEmoteID = s_selectionWheel.SelectedEmoteID;
				if (!player.quickMenuManager.isMenuOpen && !s_customSignInputField.IsSignUIOpen)
				{
					Cursor.visible = false;
					Cursor.lockState = (CursorLockMode)1;
				}
				if (!player.isPlayerDead && !player.quickMenuManager.isMenuOpen)
				{
					if (selectedEmoteID <= 3 || selectedEmoteID == 6 || !ConfigFile_InventoryCheck)
					{
						player.PerformEmote(emptyContext, selectedEmoteID);
					}
					else if (!player.isHoldingObject)
					{
						player.PerformEmote(emptyContext, selectedEmoteID);
					}
				}
				if (!s_customSignInputField.IsSignUIOpen)
				{
					player.disableLookInput = false;
				}
				IsEmoteWheelOpen = false;
				((Component)s_selectionWheel).gameObject.SetActive(IsEmoteWheelOpen);
			}
		}

		private static void OnFirstLocalPlayerFrameWithNewAnimator(PlayerControllerB player)
		{
			s_isPlayerFirstFrame = false;
			TurnControllerIntoAnOverrideController(player.playerBodyAnimator.runtimeAnimatorController);
			s_syncAnimator = ((Component)player).GetComponent<SyncAnimatorToOthers>();
			s_customSignInputField.Player = player;
			s_freeArmsTarget = Object.Instantiate<Transform>(player.localArmsRotationTarget, player.localArmsRotationTarget.parent.parent);
			s_lockedArmsTarget = player.localArmsRotationTarget;
			Transform val = ((Component)player).transform.Find("ScavengerModel").Find("metarig").Find("spine")
				.Find("spine.001")
				.Find("spine.002")
				.Find("spine.003");
			s_localPlayerLevelBadge = ((Component)val.Find("LevelSticker")).gameObject;
			s_localPlayerBetaBadge = ((Component)val.Find("BetaBadge")).gameObject;
			player.SpawnPlayerAnimation();
		}

		private static void SpawnSign(PlayerControllerB player)
		{
			//IL_005e: 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)
			GameObject val = Object.Instantiate<GameObject>(SignPrefab, ((Component)((Component)((Component)player).transform.Find("ScavengerModel")).transform.Find("metarig")).transform);
			val.transform.SetSiblingIndex(6);
			((Object)val).name = "Sign";
			val.transform.localPosition = new Vector3(0.029f, -0.45f, 1.3217f);
			val.transform.localRotation = Quaternion.Euler(65.556f, 180f, 180f);
		}

		private static void SpawnLegs(PlayerControllerB player)
		{
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = Object.Instantiate<GameObject>(LegsPrefab, ((Component)((Component)player.playerBodyAnimator).transform.parent).transform);
			s_legsMesh = val.transform.Find("Mesh");
			((Component)s_legsMesh).transform.parent = ((Component)player.playerBodyAnimator).transform.parent;
			((Object)s_legsMesh).name = "LEGS";
			GameObject gameObject = ((Component)val.transform.Find("Armature")).gameObject;
			gameObject.transform.parent = ((Component)player.playerBodyAnimator).transform;
			((Object)gameObject).name = "FistPersonLegs";
			gameObject.transform.position = new Vector3(0f, 0.197f, 0f);
			gameObject.transform.localScale = new Vector3(13.99568f, 13.99568f, 13.99568f);
			Object.Destroy((Object)(object)val);
		}

		private static void ResetIKWeights(PlayerControllerB player)
		{
			Transform val = ((Component)player.playerBodyAnimator).transform.Find("Rig 1");
			ChainIKConstraint component = ((Component)val.Find("RightArm")).GetComponent<ChainIKConstraint>();
			ChainIKConstraint component2 = ((Component)val.Find("LeftArm")).GetComponent<ChainIKConstraint>();
			TwoBoneIKConstraint component3 = ((Component)val.Find("RightLeg")).GetComponent<TwoBoneIKConstraint>();
			TwoBoneIKConstraint component4 = ((Component)val.Find("LeftLeg")).GetComponent<TwoBoneIKConstraint>();
			Transform val2 = ((Component)player.playerBodyAnimator).transform.Find("ScavengerModelArmsOnly").Find("metarig").Find("spine.003")
				.Find("RigArms");
			ChainIKConstraint component5 = ((Component)val2.Find("RightArm")).GetComponent<ChainIKConstraint>();
			ChainIKConstraint component6 = ((Component)val2.Find("LeftArm")).GetComponent<ChainIKConstraint>();
			((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component).weight = 1f;
			((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component2).weight = 1f;
			((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component).weight = 1f;
			((RigConstraint<TwoBoneIKConstraintJob, TwoBoneIKConstraintData, TwoBoneIKConstraintJobBinder<TwoBoneIKConstraintData>>)(object)component4).weight = 1f;
			((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component5).weight = 1f;
			((RigConstraint<ChainIKConstraintJob, ChainIKConstraintData, ChainIKConstraintJobBinder<ChainIKConstraintData>>)(object)component6).weight = 1f;
		}

		private static void UpdateLegsMaterial(PlayerControllerB player)
		{
			((Renderer)((Component)s_legsMesh).GetComponent<SkinnedMeshRenderer>()).material = ((Renderer)((Component)((Component)((Component)player.playerBodyAnimator).transform.parent).transform.Find("LOD1")).gameObject.GetComponent<SkinnedMeshRenderer>()).material;
		}

		private static void TogglePlayerBadges(bool enabled)
		{
			if ((Object)(object)s_localPlayerBetaBadge != (Object)null)
			{
				((Renderer)s_localPlayerBetaBadge.GetComponent<MeshRenderer>()).enabled = enabled;
			}
			if ((Object)(object)s_localPlayerLevelBadge != (Object)null)
			{
				((Renderer)s_localPlayerLevelBadge.GetComponent<MeshRenderer>()).enabled = enabled;
			}
			else
			{
				Debug.LogError((object)"[MoreEmotes-Sligili] Couldn't find the level badge");
			}
		}

		private static bool CheckIfTooManyEmotesIsPlaying(PlayerControllerB player)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			Animator playerBodyAnimator = player.playerBodyAnimator;
			AnimatorStateInfo currentAnimatorStateInfo = playerBodyAnimator.GetCurrentAnimatorStateInfo(1);
			return ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Dance1") && player.performingEmote && GetAnimatorEmoteClipName(playerBodyAnimator) != "Dance1";
		}

		private static string GetAnimatorEmoteClipName(Animator animator)
		{
			AnimatorClipInfo[] currentAnimatorClipInfo = animator.GetCurrentAnimatorClipInfo(1);
			return ((Object)((AnimatorClipInfo)(ref currentAnimatorClipInfo[0])).clip).name;
		}

		private static void TurnControllerIntoAnOverrideController(RuntimeAnimatorController controller)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (!(controller is AnimatorOverrideController))
			{
				controller = (RuntimeAnimatorController)new AnimatorOverrideController(controller);
			}
		}

		public static void UpdateWheelKeybinds()
		{
			if (UseConfigFile)
			{
				EmoteWheelKeyboard = ConfigFile_WheelKeybind;
				EmoteWheelController = ConfigFile_WheelKeybind_controller;
				return;
			}
			if (!PlayerPrefs.HasKey("Emote_Wheel_c"))
			{
				PlayerPrefs.SetString("Emote_Wheel_c", ConfigFile_WheelKeybind_controller);
			}
			EmoteWheelController = PlayerPrefs.GetString("Emote_Wheel_c");
			if (!PlayerPrefs.HasKey("Emote_Wheel"))
			{
				PlayerPrefs.SetString("Emote_Wheel", ConfigFile_WheelKeybind);
			}
			EmoteWheelKeyboard = PlayerPrefs.GetString("Emote_Wheel");
			if (!PlayerPrefs.HasKey("InvCheck"))
			{
				PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0);
			}
			ConfigFile_InventoryCheck = PlayerPrefs.GetInt("InvCheck") == 1;
		}

		[HarmonyPatch(typeof(MenuManager), "Start")]
		[HarmonyPostfix]
		private static void MenuStart(MenuManager __instance)
		{
			D.Debug = true;
			try
			{
				InstantiateSettingsMenu(((Component)((Component)__instance).transform.parent).transform.Find("MenuContainer"));
			}
			catch (Exception ex)
			{
				if (!s_isFirstTimeOnMenu)
				{
					s_isFirstTimeOnMenu = true;
				}
				else
				{
					Debug.LogError((object)(ex.Message + "\n[MoreEmotes-Sligili] Couldn't find MenuContainer"));
				}
			}
		}

		[HarmonyPatch(typeof(RoundManager), "Awake")]
		[HarmonyPostfix]
		private static void AwakePost(RoundManager __instance)
		{
			if (!PlayerPrefs.HasKey("InvCheck"))
			{
				PlayerPrefs.SetInt("InvCheck", ConfigFile_InventoryCheck ? 1 : 0);
			}
			UpdateWheelKeybinds();
			GameObject gameObject = ((Component)((Component)GameObject.Find("Systems").gameObject.transform.Find("UI")).gameObject.transform.Find("Canvas")).gameObject;
			InstantiateSettingsMenu(gameObject.transform.Find("QuickMenu"));
			s_selectionWheel = Object.Instantiate<GameObject>(WheelPrefab, gameObject.transform).AddComponent<EmoteWheel>();
			s_customSignInputField = Object.Instantiate<GameObject>(SignUIPrefab, gameObject.transform).AddComponent<SignUI>();
			EmoteWheel.Keybinds = new string[ConfigFile_Keybinds.Length + 1];
			EmoteWheel.Keybinds = ConfigFile_Keybinds;
			s_isPlayerFirstFrame = true;
		}

		[HarmonyPatch(typeof(HUDManager), "EnableChat_performed")]
		[HarmonyPrefix]
		private static bool OpenChatPrefix()
		{
			if (s_customSignInputField.IsSignUIOpen)
			{
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")]
		[HarmonyPrefix]
		private static bool SubmitChatPrefix()
		{
			if (s_customSignInputField.IsSignUIOpen)
			{
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Start")]
		[HarmonyPostfix]
		private static void StartPostfix(PlayerControllerB __instance)
		{
			((Component)((Component)((Component)__instance).gameObject.transform.Find("ScavengerModel")).transform.Find("metarig")).gameObject.AddComponent<MoreEmotesEvents>().Player = __instance;
			s_defaultPlayerSpeed = __instance.movementSpeed;
			((Component)__instance).gameObject.AddComponent<CustomAnimationObjects>();
			SpawnSign(__instance);
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Update")]
		[HarmonyPostfix]
		private static void UpdatePostfix(PlayerControllerB __instance)
		{
			if (!__instance.isPlayerControlled || !((NetworkBehaviour)__instance).IsOwner)
			{
				__instance.playerBodyAnimator.runtimeAnimatorController = others;
				TurnControllerIntoAnOverrideController(__instance.playerBodyAnimator.runtimeAnimatorController);
				return;
			}
			if ((Object)(object)__instance.playerBodyAnimator != (Object)(object)local)
			{
				if (s_isPlayerFirstFrame)
				{
					SpawnLegs(__instance);
				}
				__instance.playerBodyAnimator.runtimeAnimatorController = local;
				if (s_isPlayerFirstFrame)
				{
					OnFirstLocalPlayerFrameWithNewAnimator(__instance);
				}
				if (s_isPlayerSpawning)
				{
					__instance.SpawnPlayerAnimation();
					s_isPlayerSpawning = false;
				}
			}
			if (!IncompatibleStuff)
			{
				if ((bool)Ref.Method(__instance, "CheckConditionsForEmote") && __instance.performingEmote)
				{
					switch (s_currentEmoteID)
					{
					case 6:
						__instance.movementSpeed = s_defaultPlayerSpeed / 2f;
						break;
					case 9:
						__instance.movementSpeed = s_defaultPlayerSpeed / 3f;
						break;
					}
				}
				else
				{
					__instance.movementSpeed = s_defaultPlayerSpeed;
				}
			}
			__instance.localArmsRotationTarget = (LocalArmsSeparatedFromCamera ? (__instance.localArmsRotationTarget = s_freeArmsTarget) : (__instance.localArmsRotationTarget = s_lockedArmsTarget));
			CheckWheelInput(EmoteWheelKeyboard, EmoteWheelController, __instance);
			if (!__instance.quickMenuManager.isMenuOpen && !IsEmoteWheelOpen)
			{
				CheckEmoteInput(ConfigFile_Keybinds[2], needsEmptyHands: false, 3, __instance);
				CheckEmoteInput(ConfigFile_Keybinds[3], needsEmptyHands: true, 4, __instance);
				CheckEmoteInput(ConfigFile_Keybinds[4], needsEmptyHands: true, 5, __instance);
				CheckEmoteInput(ConfigFile_Keybinds[5], needsEmptyHands: false, 6, __instance);
				CheckEmoteInput(ConfigFile_Keybinds[6], needsEmptyHands: true, 7, __instance);
				CheckEmoteInput(ConfigFile_Keybinds[7], needsEmptyHands: true, 8, __instance);
				CheckEmoteInput(ConfigFile_Keybinds[8], needsEmptyHands: true, 9, __instance);
				CheckEmoteInput(ConfigFile_Keybinds[9], needsEmptyHands: true, 10, __instance);
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Update")]
		[HarmonyPrefix]
		private static void UpdatePrefix(PlayerControllerB __instance)
		{
			if (__instance.performingEmote)
			{
				s_wasPerformingEmote[__instance.playerClientId] = true;
			}
			if (!__instance.performingEmote && s_wasPerformingEmote[__instance.playerClientId])
			{
				s_wasPerformingEmote[__instance.playerClientId] = false;
				ResetIKWeights(__instance);
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "SpawnPlayerAnimation")]
		[HarmonyPrefix]
		private static void OnLocalPlayerSpawn(PlayerControllerB __instance)
		{
			if (((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled)
			{
				s_isPlayerSpawning = true;
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "CheckConditionsForEmote")]
		[HarmonyPrefix]
		private static bool CheckConditionsPrefix(ref bool __result, PlayerControllerB __instance)
		{
			bool flag = (bool)Ref.GetInstanceField(typeof(PlayerControllerB), __instance, "isJumping");
			bool flag2 = (bool)Ref.GetInstanceField(typeof(PlayerControllerB), __instance, "isWalking");
			if (s_currentEmoteID == 6 || s_currentEmoteID == 9)
			{
				__result = !__instance.inSpecialInteractAnimation && !__instance.isPlayerDead && !flag && __instance.moveInputVector.x == 0f && !__instance.isSprinting && !__instance.isCrouching && !__instance.isClimbingLadder && !__instance.isGrabbingObjectAnimation && !__instance.inTerminalMenu && !__instance.isTypingChat;
				return false;
			}
			if (s_currentEmoteID == 10 || s_currentEmoteID == 1010)
			{
				__result = !__instance.inSpecialInteractAnimation && !__instance.isPlayerDead && !flag && !flag2 && !__instance.isCrouching && !__instance.isClimbingLadder && !__instance.isGrabbingObjectAnimation && !__instance.inTerminalMenu;
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(PlayerControllerB), "PerformEmote")]
		[HarmonyPrefix]
		private static bool PerformEmotePrefix(CallbackContext context, int emoteID, PlayerControllerB __instance)
		{
			if ((emoteID < 0 || CheckIfTooManyEmotesIsPlaying(__instance)) && emoteID > 2)
			{
				return false;
			}
			if ((!((NetworkBehaviour)__instance).IsOwner || !__instance.isPlayerControlled || (((NetworkBehaviour)__instance).IsServer && !__instance.isHostPlayerObject)) && !__instance.isTestingPlayer)
			{
				return false;
			}
			if (s_customSignInputField.IsSignUIOpen && emoteID != 1010)
			{
				return false;
			}
			if (emoteID > 0 && emoteID < 3 && !IsEmoteWheelOpen && !((CallbackContext)(ref context)).performed)
			{
				return false;
			}
			int[] array = s_doubleEmotesIDS;
			foreach (int num in array)
			{
				int num2 = num + _AlternateEmoteIDOffset;
				bool flag = (UseConfigFile ? ConfigFile_InventoryCheck : (PlayerPrefs.GetInt("InvCheck") == 1));
				if (emoteID == num && s_currentEmoteID == emoteID && __instance.performingEmote && (!__instance.isHoldingObject || !flag))
				{
					if (emoteID == num)
					{
						emoteID += _AlternateEmoteIDOffset;
					}
					else
					{
						emoteID -= 1000;
					}
				}
			}
			if ((s_currentEmoteID != emoteID && emoteID < 3) || !__instance.performingEmote)
			{
				ResetIKWeights(__instance);
			}
			if (!(bool)Ref.Method(__instance, "CheckConditionsForEmote"))
			{
				return false;
			}
			if (__instance.timeSinceStartingEmote < 0.5f)
			{
				return false;
			}
			s_currentEmoteID = emoteID;
			Action action = delegate
			{
				__instance.timeSinceStartingEmote = 0f;
				__instance.playerBodyAnimator.SetInteger("emoteNumber", emoteID);
				__instance.performingEmote = true;
				__instance.StartPerformingEmoteServerRpc();
				s_syncAnimator.UpdateEmoteIDForOthers(emoteID);
				TogglePlayerBadges(enabled: false);
			};
			switch (emoteID)
			{
			case 9:
				action = (Action)Delegate.Combine(action, (Action)delegate
				{
					UpdateLegsMaterial(__instance);
				});
				break;
			case 10:
				action = (Action)Delegate.Combine(action, (Action)delegate
				{
					((Component)s_customSignInputField).gameObject.SetActive(true);
				});
				break;
			}
			action();
			return false;
		}

		[HarmonyPatch(typeof(PlayerControllerB), "StopPerformingEmoteServerRpc")]
		[HarmonyPostfix]
		private static void StopPerformingEmoteServerPrefix(PlayerControllerB __instance)
		{
			if (((NetworkBehaviour)__instance).IsOwner && __instance.isPlayerControlled)
			{
				__instance.playerBodyAnimator.SetInteger("emoteNumber", 0);
			}
			TogglePlayerBadges(enabled: true);
			s_syncAnimator.UpdateEmoteIDForOthers(0);
			s_currentEmoteID = 0;
		}
	}
}
namespace MoreEmotes.Scripts
{
	public class MoreEmotesEvents : MonoBehaviour
	{
		private Animator _playerAnimator;

		private AudioSource _playerAudioSource;

		public static AudioClip[] ClapSounds = (AudioClip[])(object)new AudioClip[2];

		public PlayerControllerB Player;

		private void Start()
		{
			_playerAnimator = ((Component)this).GetComponent<Animator>();
			_playerAudioSource = Player.movementAudio;
		}

		public void PlayClapSound()
		{
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			if (Player.performingEmote)
			{
				int currentEmoteID = GetCurrentEmoteID();
				if (!((NetworkBehaviour)Player).IsOwner || !Player.isPlayerControlled || currentEmoteID == 4)
				{
					bool flag = Player.isInHangarShipRoom && Player.playersManager.hangarDoorsClosed;
					RoundManager.Instance.PlayAudibleNoise(((Component)Player).transform.position, 22f, 0.6f, 0, flag, 6);
					_playerAudioSource.pitch = Random.Range(0.59f, 0.79f);
					_playerAudioSource.PlayOneShot(ClapSounds[Random.Range(0, ClapSounds.Length)]);
				}
			}
		}

		public void PlayFootstepSound()
		{
			if (Player.performingEmote)
			{
				int currentEmoteID = GetCurrentEmoteID();
				if ((!((NetworkBehaviour)Player).IsOwner || !Player.isPlayerControlled || currentEmoteID == 6 || currentEmoteID == 8 || currentEmoteID == 9) && ((Vector2)(ref Player.moveInputVector)).sqrMagnitude == 0f)
				{
					Player.PlayFootstepLocal();
					Player.PlayFootstepServer();
				}
			}
		}

		private int GetCurrentEmoteID()
		{
			int num = _playerAnimator.GetInteger("emoteNumber");
			if (num >= 1000)
			{
				num -= 1000;
			}
			return num;
		}
	}
	public class SignEmoteText : NetworkBehaviour
	{
		private PlayerControllerB _playerInstance;

		private TextMeshPro _signModelText;

		public string Text => ((TMP_Text)_signModelText).text;

		private void Start()
		{
			_playerInstance = ((Component)this).GetComponent<PlayerControllerB>();
			_signModelText = ((Component)((Component)_playerInstance).transform.Find("ScavengerModel").Find("metarig").Find("Sign")
				.Find("Text")).GetComponent<TextMeshPro>();
		}

		public void UpdateSignText(string newText)
		{
			if (((NetworkBehaviour)_playerInstance).IsOwner && _playerInstance.isPlayerControlled)
			{
				UpdateSignTextServerRpc(newText);
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void UpdateSignTextServerRpc(string newText)
		{
			UpdateSignTextClientRpc(newText);
		}

		[ClientRpc]
		private void UpdateSignTextClientRpc(string newText)
		{
			((TMP_Text)_signModelText).text = newText;
		}
	}
	public class EmoteWheel : MonoBehaviour
	{
		private RectTransform _graphics_selectedBlock;

		private RectTransform _graphics_selectionArrow;

		private Text _graphics_emoteInformation;

		private Text _graphics_pageInformation;

		private int _blocksNumber = 8;

		private int _selectedBlock = 1;

		private float _changePageCooldown = 0.1f;

		private float _selectionArrowLerpSpeed = 30f;

		private float _angle;

		private GameObject[] _pages;

		public float WheelMovementDeadzone = 3.3f;

		public float WheelMovementDeadzoneController = 0.7f;

		public static string[] Keybinds;

		private Vector2 _wheelCenter;

		private Vector2 _lastMouseCoords;

		public int SelectedPageNumber { get; private set; }

		public int SelectedEmoteID { get; private set; }

		public bool IsUsingController { get; private set; }

		private void Awake()
		{
			GetVanillaKeybinds();
			FindGraphics();
			FindPages(((Component)this).gameObject.transform.Find("FunctionalContent"));
			UpdatePageInfo();
		}

		private void OnEnable()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			_wheelCenter = new Vector2((float)(Screen.width / 2), (float)(Screen.height / 2));
			Mouse.current.WarpCursorPosition(_wheelCenter);
		}

		private void GetVanillaKeybinds()
		{
			PlayerInput component = GameObject.Find("PlayerSettingsObject").GetComponent<PlayerInput>();
			if ((Object)(object)component == (Object)null)
			{
				Debug.LogError((object)" MoreEmotes: PlayerSettingsObject is null");
				return;
			}
			Keybinds[0] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote1", false), 0, (DisplayStringOptions)0);
			Keybinds[1] = InputActionRebindingExtensions.GetBindingDisplayString(component.currentActionMap.FindAction("Emote2", false), 0, (DisplayStringOptions)0);
		}

		private void FindGraphics()
		{
			_graphics_selectionArrow = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("SelectionArrow")).gameObject.GetComponent<RectTransform>();
			_graphics_selectedBlock = ((Component)((Component)this).gameObject.transform.Find("SelectedEmote")).gameObject.GetComponent<RectTransform>();
			_graphics_emoteInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("EmoteInfo")).GetComponent<Text>();
			_graphics_pageInformation = ((Component)((Component)((Component)this).gameObject.transform.Find("Graphics")).gameObject.transform.Find("PageNumber")).GetComponent<Text>();
		}

		private void FindPages(Transform contentParent)
		{
			_pages = (GameObject[])(object)new GameObject[((Component)contentParent).transform.childCount];
			_graphics_pageInformation.text = "< Page " + (SelectedPageNumber + 1) + "/" + _pages.Length + " >";
			for (int i = 0; i < ((Component)contentParent).transform.childCount; i++)
			{
				_pages[i] = ((Component)((Component)contentParent).transform.GetChild(i)).gameObject;
			}
		}

		private void Update()
		{
			ControllerInput();
			if (!IsUsingController)
			{
				MouseInput();
			}
			Cursor.visible = !IsUsingController;
			UpdateSelectionArrow();
			PageSelection();
			SelectedEmoteID = _selectedBlock + Mathf.RoundToInt((float)(_blocksNumber / 4)) + _blocksNumber * SelectedPageNumber;
			UpdateEmoteInfo();
		}

		private unsafe void ControllerInput()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			if (Gamepad.all.Count == 0)
			{
				IsUsingController = false;
				return;
			}
			float num = ((InputControl<float>)(object)((Vector2Control)Gamepad.current.rightStick).x).ReadUnprocessedValue();
			float num2 = ((InputControl<float>)(object)((Vector2Control)Gamepad.current.rightStick).y).ReadUnprocessedValue();
			if (Mathf.Abs(num) < WheelMovementDeadzoneController && Mathf.Abs(num2) < WheelMovementDeadzoneController)
			{
				if (System.Runtime.CompilerServices.Unsafe.Read<Vector2>((void*)((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).value) != _lastMouseCoords)
				{
					IsUsingController = false;
				}
			}
			else
			{
				IsUsingController = true;
				_lastMouseCoords = System.Runtime.CompilerServices.Unsafe.Read<Vector2>((void*)((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).value);
				WheelSelection(Vector2.zero, num, num2);
			}
		}

		private void MouseInput()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			if (!(Vector2.Distance(_wheelCenter, ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue()) < WheelMovementDeadzone))
			{
				WheelSelection(_wheelCenter, ((InputControl<float>)(object)((Pointer)Mouse.current).position.x).ReadValue(), ((InputControl<float>)(object)((Pointer)Mouse.current).position.y).ReadValue());
			}
		}

		private void WheelSelection(Vector2 origin, float xAxisValue, float yAxisValue)
		{
			//IL_0002: 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_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
			bool flag = xAxisValue > origin.x;
			bool flag2 = yAxisValue > origin.y;
			int num = ((!flag) ? (flag2 ? 2 : 3) : (flag2 ? 1 : 4));
			float num2 = (yAxisValue - origin.y) / (xAxisValue - origin.x);
			float num3 = 180 * (num - ((num <= 2) ? 1 : 2));
			_angle = Mathf.Atan(num2) * (180f / (float)Math.PI) + num3;
			if (_angle == 90f)
			{
				_angle = 270f;
			}
			else if (_angle == 270f)
			{
				_angle = 90f;
			}
			float num4 = 360 / _blocksNumber;
			_selectedBlock = Mathf.RoundToInt((_angle - num4 * 1.5f) / num4);
			((Transform)_graphics_selectedBlock).localRotation = Quaternion.Euler(((Component)this).transform.rotation.z, ((Component)this).transform.rotation.y, num4 * (float)_selectedBlock);
		}

		private void PageSelection()
		{
			UpdatePageInfo();
			if (_changePageCooldown > 0f)
			{
				_changePageCooldown -= Time.deltaTime;
				return;
			}
			int num;
			if (IsUsingController)
			{
				if (!Gamepad.current.dpad.left.isPressed && !Gamepad.current.dpad.right.isPressed)
				{
					return;
				}
				num = (Gamepad.current.dpad.left.isPressed ? 1 : (-1));
			}
			else
			{
				if (((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() == 0f)
				{
					return;
				}
				num = ((((InputControl<float>)(object)((Vector2Control)Mouse.current.scroll).y).ReadValue() > 0f) ? 1 : (-1));
			}
			GameObject[] pages = _pages;
			foreach (GameObject val in pages)
			{
				val.SetActive(false);
			}
			SelectedPageNumber = (SelectedPageNumber + num + _pages.Length) % _pages.Length;
			_pages[SelectedPageNumber].SetActive(true);
			_changePageCooldown = ((!IsUsingController) ? 0.1f : 0.3f);
		}

		private void UpdatePageInfo()
		{
			_graphics_pageInformation.text = $"<color=#fe6b02><</color> Page {SelectedPageNumber + 1}/{_pages.Length} <color=#fe6b02>></color>";
		}

		private void UpdateEmoteInfo()
		{
			string text = ((SelectedEmoteID > Keybinds.Length) ? "" : Keybinds[SelectedEmoteID - 1]);
			int num = 0;
			foreach (Emotes value in Enum.GetValues(typeof(Emotes)))
			{
				if (value >= Emotes.Dance && value < (Emotes)64)
				{
					num++;
				}
			}
			string text2 = ((SelectedEmoteID > num) ? "EMPTY" : ((Emotes)SelectedEmoteID).ToString().Replace("_", " "));
			if (SelectedEmoteID > 2 && SelectedEmoteID <= Keybinds.Length)
			{
				if (!PlayerPrefs.HasKey(text2.Replace(" ", "_")))
				{
					PlayerPrefs.SetString(text2.Replace(" ", "_"), (SelectedEmoteID > Keybinds.Length) ? "" : Keybinds[SelectedEmoteID - 1]);
				}
				else
				{
					text = PlayerPrefs.GetString(text2.Replace(" ", "_"));
				}
			}
			text = "<size=120>[" + text + "]</size>";
			_graphics_emoteInformation.text = text2 + "\n" + text.ToUpper();
		}

		private void UpdateSelectionArrow()
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			float num = 360 / _blocksNumber;
			Quaternion val = Quaternion.Euler(0f, 0f, _angle - num * 2f);
			((Transform)_graphics_selectionArrow).localRotation = Quaternion.Lerp(((Transform)_graphics_selectionArrow).localRotation, val, Time.deltaTime * _selectionArrowLerpSpeed);
		}
	}
	public class RebindButton : MonoBehaviour
	{
		public static string[] ConfigFile_Keybinds;

		private string _defaultKey;

		private string _playerPrefsString;

		private Transform _waitingForInput;

		private Text _keyInfo;

		public bool IsControllerButton { get; private set; } = false;


		private void Start()
		{
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Expected O, but got Unknown
			string text = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text;
			IsControllerButton = GetControllerFlag();
			_playerPrefsString = ((Component)((Component)this).gameObject.transform.Find("Description")).GetComponent<Text>().text.Replace(" ", "_") + (IsControllerButton ? "_c" : "");
			_defaultKey = GetDefaultKey(text);
			FindComponents();
			((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener(new UnityAction(GetKey));
			if (!PlayerPrefs.HasKey(_playerPrefsString))
			{
				PlayerPrefs.SetString(_playerPrefsString, _defaultKey);
			}
			SetKeybind(PlayerPrefs.GetString(_playerPrefsString));
		}

		private string GetDefaultKey(string emoteName)
		{
			if (Enum.TryParse<Emotes>(emoteName.Replace(" ", "_"), out var result))
			{
				return ConfigFile_Keybinds[(int)(result - 1)];
			}
			return IsControllerButton ? "leftshoulder" : "V";
		}

		private bool GetControllerFlag()
		{
			Transform val = ((Component)this).gameObject.transform.Find("Description").Find("Subtext");
			if ((Object)(object)val == (Object)null)
			{
				return false;
			}
			Text val2 = default(Text);
			if (((Component)val).TryGetComponent<Text>(ref val2))
			{
				return val2.text.Equals("(Controller)", StringComparison.OrdinalIgnoreCase);
			}
			return false;
		}

		private void FindComponents()
		{
			((Component)((Component)((Component)this).transform.parent).transform.Find("Delete")).gameObject.AddComponent<DeleteButton>();
			_keyInfo = ((Component)((Component)this).transform.Find("InputText")).GetComponent<Text>();
			_waitingForInput = ((Component)this).transform.Find("wait");
		}

		public void SetKeybind(string key)
		{
			List<string> list = new List<string> { "up", "down", "left", "right" };
			if (list.Contains(key.ToLower()) && key.Length < 5)
			{
				key = "dpad/" + key;
			}
			PlayerPrefs.SetString(_playerPrefsString, key);
			_keyInfo.text = key.ToUpper();
			((MonoBehaviour)this).StopAllCoroutines();
			((Component)_waitingForInput).gameObject.SetActive(false);
		}

		private void GetKey()
		{
			((Component)_waitingForInput).gameObject.SetActive(true);
			((MonoBehaviour)this).StartCoroutine(WaitForKey(delegate(string key)
			{
				SetKeybind(key);
			}));
		}

		private IEnumerator WaitForKey(Action<string> callback)
		{
			while (!((ButtonControl)Keyboard.current.anyKey).wasPressedThisFrame || (!((InputDevice)Gamepad.current).wasUpdatedThisFrame && !InputControlExtensions.IsActuated((InputControl)(object)Gamepad.current.leftStick, 0f) && !InputControlExtensions.IsActuated((InputControl)(object)Gamepad.current.rightStick, 0f)))
			{
				yield return (object)new WaitForEndOfFrame();
				Observable.CallOnce<InputControl>(InputSystem.onAnyButtonPress, (Action<InputControl>)delegate(InputControl ctrl)
				{
					callback(((ctrl.device == Gamepad.current && IsControllerButton) || (ctrl.device == Keyboard.current && !IsControllerButton)) ? ctrl.name : _defaultKey);
				});
			}
		}
	}
	public class DeleteButton : MonoBehaviour
	{
		private void Start()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			RebindButton _rebindButton = ((Component)((Component)((Component)this).transform.parent).transform.Find("Button")).GetComponent<RebindButton>();
			((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener((UnityAction)delegate
			{
				_rebindButton.SetKeybind(string.Empty);
			});
		}
	}
	public class ToggleButton : MonoBehaviour
	{
		private Toggle _toggle;

		public static bool s_InventoryCheck;

		public string PlayerPrefsString;

		private void Start()
		{
			_toggle = ((Component)this).GetComponent<Toggle>();
			_toggle.isOn = s_InventoryCheck;
			((UnityEvent<bool>)(object)_toggle.onValueChanged).AddListener((UnityAction<bool>)SetNewValue);
			if (!PlayerPrefs.HasKey(PlayerPrefsString))
			{
				SetNewValue(s_InventoryCheck);
			}
		}

		public void SetNewValue(bool arg)
		{
			PlayerPrefs.SetInt(PlayerPrefsString, arg ? 1 : 0);
		}
	}
	public class EnableDisableButton : MonoBehaviour
	{
		public GameObject[] ToAlternateUI = (GameObject[])(object)new GameObject[1];

		private void Start()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			((UnityEvent)((Component)this).GetComponent<Button>().onClick).AddListener((UnityAction)delegate
			{
				GameObject[] toAlternateUI = ToAlternateUI;
				foreach (GameObject val in toAlternateUI)
				{
					val.SetActive((!val.activeInHierarchy) ? true : false);
				}
			});
			if (((Object)((Component)this).gameObject).name.Equals("BackButton", StringComparison.OrdinalIgnoreCase))
			{
				ToAlternateUI[0] = ((Component)((Component)this).transform.parent).gameObject;
			}
			if (((Object)((Component)this).gameObject).name.Equals("MoreEmotesButton(Clone)", StringComparison.OrdinalIgnoreCase))
			{
				ToAlternateUI[0] = ((Component)((Component)((Component)this).transform.parent).gameObject.transform.Find("MoreEmotesPanel(Clone)")).gameObject;
			}
		}
	}
	public class SetupUI : MonoBehaviour
	{
		public static bool UseConfigFile;

		public static bool InventoryCheck;

		private void Awake()
		{
			Transform settingsUIPanel = ((Component)this).transform.Find("MoreEmotesPanel(Clone)");
			((Component)settingsUIPanel.Find("Version")).GetComponent<Text>().text = "1.3.3 - Sligili";
			SetupOpenSettingsButton();
			SetupBackButton();
			SetupRebindButtons(((Component)settingsUIPanel).transform.Find("KeybindButtons"));
			SetupRebindButtons(((Component)((Component)((Component)settingsUIPanel).transform.Find("Scroll View")).transform.Find("Viewport")).transform.Find("Content"));
			SetupInventoryCheckToggle();
			SetupUseConfigFileToggle();
			void SetupBackButton()
			{
				((Component)((Component)settingsUIPanel).transform.Find("BackButton")).gameObject.AddComponent<EnableDisableButton>();
			}
			void SetupInventoryCheckToggle()
			{
				((Component)((Component)settingsUIPanel).transform.Find("Inv")).gameObject.AddComponent<ToggleButton>().PlayerPrefsString = "InvCheck";
			}
			void SetupOpenSettingsButton()
			{
				((Component)((Component)this).transform.Find("MoreEmotesButton(Clone)")).gameObject.AddComponent<EnableDisableButton>();
			}
			static void SetupRebindButtons(Transform ButtonsParent)
			{
				Transform[] array = (Transform[])(object)new Transform[ButtonsParent.childCount];
				for (int i = 0; i < array.Length; i++)
				{
					array[i] = ButtonsParent.GetChild(i);
				}
				Transform[] array2 = array;
				foreach (Transform val in array2)
				{
					((Component)val.Find("Button")).gameObject.AddComponent<RebindButton>();
				}
			}
			void SetupUseConfigFileToggle()
			{
				((Component)((Component)settingsUIPanel).transform.Find("cfg")).gameObject.GetComponent<Toggle>().isOn = UseConfigFile;
			}
		}

		private void Update()
		{
			EmotePatch.UpdateWheelKeybinds();
		}
	}
	public class SignUI : MonoBehaviour
	{
		public PlayerControllerB Player;

		private TMP_InputField _inputField;

		private Text _charactersLeftText;

		private TMP_Text _previewText;

		private Button _submitButton;

		private Button _cancelButton;

		public bool IsSignUIOpen;

		private void Awake()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			FindComponents();
			((UnityEvent)_submitButton.onClick).AddListener(new UnityAction(SubmitText));
			((UnityEvent)_cancelButton.onClick).AddListener((UnityAction)delegate
			{
				Close(cancelAction: true);
			});
			((UnityEvent<string>)(object)_inputField.onValueChanged).AddListener((UnityAction<string>)delegate(string fieldText)
			{
				UpdatePreviewText(fieldText);
				UpdateCharactersLeftText();
			});
		}

		private void OnEnable()
		{
			Player.isTypingChat = true;
			IsSignUIOpen = true;
			((Selectable)_inputField).Select();
			_inputField.text = string.Empty;
			_previewText.text = "PREVIEW";
			Player.disableLookInput = true;
		}

		private void Update()
		{
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			Cursor.visible = true;
			Cursor.lockState = (CursorLockMode)2;
			if (!Player.performingEmote)
			{
				Close(cancelAction: true);
			}
			if (((ButtonControl)Keyboard.current[(Key)2]).wasPressedThisFrame && !((ButtonControl)Keyboard.current[(Key)51]).isPressed)
			{
				SubmitText();
			}
			if (Player.quickMenuManager.isMenuOpen || EmotePatch.IsEmoteWheelOpen || InputControlExtensions.IsPressed(((InputControl)Mouse.current)["rightButton"], 0f))
			{
				Close(cancelAction: true);
			}
			if (Gamepad.all.Count != 0)
			{
				if (Gamepad.current.buttonWest.isPressed || Gamepad.current.startButton.isPressed)
				{
					SubmitText();
				}
				if (Gamepad.current.buttonEast.isPressed || Gamepad.current.selectButton.isPressed)
				{
					Close(cancelAction: true);
				}
			}
		}

		private void FindComponents()
		{
			_inputField = ((Component)((Component)this).transform.Find("InputField")).GetComponent<TMP_InputField>();
			_charactersLeftText = ((Component)((Component)this).transform.Find("CharsLeft")).GetComponent<Text>();
			_submitButton = ((Component)((Component)this).transform.Find("Submit")).GetComponent<Button>();
			_cancelButton = ((Component)((Component)this).transform.Find("Cancel")).GetComponent<Button>();
			_previewText = ((Component)((Component)((Component)this).transform.Find("Sign")).transform.Find("Text")).GetComponent<TMP_Text>();
		}

		private void UpdateCharactersLeftText()
		{
			_charactersLeftText.text = $"CHARACTERS LEFT: <color=yellow>{_inputField.characterLimit - _inputField.text.Length}</color>";
		}

		private void UpdatePreviewText(string text)
		{
			_previewText.text = text;
		}

		private void SubmitText()
		{
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			if (_inputField.text.Equals(string.Empty))
			{
				Close(cancelAction: true);
				return;
			}
			D.L("Submitted " + _inputField.text + " to server");
			((Component)Player).GetComponent<SignEmoteText>().UpdateSignText(_inputField.text);
			float num = 0.5f;
			if (Player.timeSinceStartingEmote > num)
			{
				Player.PerformEmote(default(CallbackContext), 1010);
			}
			Close(cancelAction: false);
		}

		private void Close(bool cancelAction)
		{
			Player.isTypingChat = false;
			IsSignUIOpen = false;
			if (cancelAction)
			{
				Player.performingEmote = false;
				Player.StopPerformingEmoteServerRpc();
			}
			if (!Player.quickMenuManager.isMenuOpen)
			{
				Cursor.visible = false;
				Cursor.lockState = (CursorLockMode)1;
			}
			Player.disableLookInput = false;
			((Component)this).gameObject.SetActive(false);
		}
	}
	public class SyncAnimatorToOthers : NetworkBehaviour
	{
		private PlayerControllerB _player;

		private void Start()
		{
			_player = ((Component)this).GetComponent<PlayerControllerB>();
		}

		public void UpdateEmoteIDForOthers(int newID)
		{
			if (((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled)
			{
				UpdateCurrentEmoteIDServerRpc(newID);
			}
		}

		[ServerRpc(RequireOwnership = false)]
		private void UpdateCurrentEmoteIDServerRpc(int newID)
		{
			UpdateCurrentEmoteIDClientRpc(newID);
		}

		[ClientRpc]
		private void UpdateCurrentEmoteIDClientRpc(int newID)
		{
			if (!((NetworkBehaviour)_player).IsOwner)
			{
				_player.playerBodyAnimator.SetInteger("emoteNumber", newID);
			}
		}
	}
	public class CustomAnimationObjects : MonoBehaviour
	{
		private PlayerControllerB _player;

		private MeshRenderer _sign;

		private GameObject _signText;

		private SkinnedMeshRenderer _legs;

		private void Start()
		{
			_player = ((Component)this).GetComponent<PlayerControllerB>();
		}

		private void Update()
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_sign == (Object)null || (Object)(object)_signText == (Object)null)
			{
				FindSign();
				return;
			}
			((Component)_sign).transform.localPosition = ((Component)_sign).transform.parent.Find("spine").localPosition;
			if ((Object)(object)_legs == (Object)null && ((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled)
			{
				FindLegs();
				return;
			}
			DisableEverything();
			if (!_player.performingEmote)
			{
				return;
			}
			switch (_player.playerBodyAnimator.GetInteger("emoteNumber"))
			{
			case 10:
			case 1010:
				((Renderer)_sign).enabled = true;
				if (!_signText.activeSelf)
				{
					_signText.SetActive(true);
				}
				if (((NetworkBehaviour)_player).IsOwner)
				{
					EmotePatch.LocalArmsSeparatedFromCamera = true;
				}
				break;
			case 9:
				if ((Object)(object)_legs != (Object)null)
				{
					((Renderer)_legs).enabled = true;
				}
				if (((NetworkBehaviour)_player).IsOwner)
				{
					EmotePatch.LocalArmsSeparatedFromCamera = true;
				}
				break;
			}
		}

		private void DisableEverything()
		{
			if ((Object)(object)_legs != (Object)null)
			{
				((Renderer)_legs).enabled = false;
			}
			((Renderer)_sign).enabled = false;
			if (_signText.activeSelf)
			{
				_signText.SetActive(false);
			}
			if (((NetworkBehaviour)_player).IsOwner && _player.isPlayerControlled)
			{
				EmotePatch.LocalArmsSeparatedFromCamera = false;
			}
		}

		private void FindSign()
		{
			_sign = ((Component)((Component)_player).transform.Find("ScavengerModel").Find("metarig").Find("Sign")).GetComponent<MeshRenderer>();
			_signText = ((Component)((Component)_sign).transform.Find("Text")).gameObject;
		}

		private void FindLegs()
		{
			_legs = ((Component)((Component)_player).transform.Find("ScavengerModel").Find("LEGS")).GetComponent<SkinnedMeshRenderer>();
		}
	}
}

BepInEx/plugins/plugins/MoreSuits.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("MoreSuits")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A mod that adds more suit options to Lethal Company")]
[assembly: AssemblyFileVersion("1.4.3.0")]
[assembly: AssemblyInformationalVersion("1.4.3")]
[assembly: AssemblyProduct("MoreSuits")]
[assembly: AssemblyTitle("MoreSuits")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.3.0")]
[module: UnverifiableCode]
namespace MoreSuits;

[BepInPlugin("x753.More_Suits", "More Suits", "1.4.3")]
public class MoreSuitsMod : BaseUnityPlugin
{
	[HarmonyPatch(typeof(StartOfRound))]
	internal class StartOfRoundPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPrefix]
		private static void StartPatch(ref StartOfRound __instance)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0695: Unknown result type (might be due to invalid IL or missing references)
			//IL_069a: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0402: Unknown result type (might be due to invalid IL or missing references)
			//IL_0409: Expected O, but got Unknown
			//IL_0310: Unknown result type (might be due to invalid IL or missing references)
			//IL_0317: Expected O, but got Unknown
			//IL_05b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Expected O, but got Unknown
			try
			{
				if (SuitsAdded)
				{
					return;
				}
				int count = __instance.unlockablesList.unlockables.Count;
				UnlockableItem val = new UnlockableItem();
				int num = 0;
				for (int i = 0; i < __instance.unlockablesList.unlockables.Count; i++)
				{
					UnlockableItem val2 = __instance.unlockablesList.unlockables[i];
					if (!((Object)(object)val2.suitMaterial != (Object)null) || !val2.alreadyUnlocked)
					{
						continue;
					}
					val = val2;
					List<string> list = Directory.GetDirectories(Paths.PluginPath, "moresuits", SearchOption.AllDirectories).ToList();
					List<string> list2 = new List<string>();
					List<string> list3 = new List<string>();
					List<string> list4 = DisabledSuits.ToLower().Replace(".png", "").Split(',')
						.ToList();
					List<string> list5 = new List<string>();
					if (!LoadAllSuits)
					{
						foreach (string item2 in list)
						{
							if (File.Exists(Path.Combine(item2, "!less-suits.txt")))
							{
								string[] collection = new string[9] { "glow", "kirby", "knuckles", "luigi", "mario", "minion", "skeleton", "slayer", "smile" };
								list5.AddRange(collection);
								break;
							}
						}
					}
					foreach (string item3 in list)
					{
						if (item3 != "")
						{
							string[] files = Directory.GetFiles(item3, "*.png");
							string[] files2 = Directory.GetFiles(item3, "*.matbundle");
							list2.AddRange(files);
							list3.AddRange(files2);
						}
					}
					list3.Sort();
					list2.Sort();
					try
					{
						foreach (string item4 in list3)
						{
							Object[] array = AssetBundle.LoadFromFile(item4).LoadAllAssets();
							foreach (Object val3 in array)
							{
								if (val3 is Material)
								{
									Material item = (Material)val3;
									customMaterials.Add(item);
								}
							}
						}
					}
					catch (Exception ex)
					{
						Debug.Log((object)("Something went wrong with More Suits! Could not load materials from asset bundle(s). Error: " + ex));
					}
					foreach (string item5 in list2)
					{
						if (list4.Contains(Path.GetFileNameWithoutExtension(item5).ToLower()))
						{
							continue;
						}
						string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
						if (list5.Contains(Path.GetFileNameWithoutExtension(item5).ToLower()) && item5.Contains(directoryName))
						{
							continue;
						}
						UnlockableItem val4;
						Material val5;
						if (Path.GetFileNameWithoutExtension(item5).ToLower() == "default")
						{
							val4 = val;
							val5 = val4.suitMaterial;
						}
						else
						{
							val4 = JsonUtility.FromJson<UnlockableItem>(JsonUtility.ToJson((object)val));
							val5 = Object.Instantiate<Material>(val4.suitMaterial);
						}
						byte[] array2 = File.ReadAllBytes(item5);
						Texture2D val6 = new Texture2D(2, 2);
						ImageConversion.LoadImage(val6, array2);
						val6.Apply(true, true);
						val5.mainTexture = (Texture)(object)val6;
						val4.unlockableName = Path.GetFileNameWithoutExtension(item5);
						try
						{
							string path = Path.Combine(Path.GetDirectoryName(item5), "advanced", val4.unlockableName + ".json");
							if (File.Exists(path))
							{
								string[] array3 = File.ReadAllLines(path);
								for (int j = 0; j < array3.Length; j++)
								{
									string[] array4 = array3[j].Trim().Split(':');
									if (array4.Length != 2)
									{
										continue;
									}
									string text = array4[0].Trim('"', ' ', ',');
									string text2 = array4[1].Trim('"', ' ', ',');
									if (text2.Contains(".png"))
									{
										byte[] array5 = File.ReadAllBytes(Path.Combine(Path.GetDirectoryName(item5), "advanced", text2));
										Texture2D val7 = new Texture2D(2, 2);
										ImageConversion.LoadImage(val7, array5);
										val7.Apply(true, true);
										val5.SetTexture(text, (Texture)(object)val7);
										continue;
									}
									if (text == "PRICE" && int.TryParse(text2, out var result))
									{
										try
										{
											if (!UnlockAll)
											{
												val4 = AddToRotatingShop(val4, result, __instance.unlockablesList.unlockables.Count);
											}
										}
										catch (Exception ex2)
										{
											Debug.Log((object)("Something went wrong with More Suits! Could not add a suit to the rotating shop. Error: " + ex2));
										}
										continue;
									}
									switch (text2)
									{
									case "KEYWORD":
										val5.EnableKeyword(text);
										continue;
									case "DISABLEKEYWORD":
										val5.DisableKeyword(text);
										continue;
									case "SHADERPASS":
										val5.SetShaderPassEnabled(text, true);
										continue;
									case "DISABLESHADERPASS":
										val5.SetShaderPassEnabled(text, false);
										continue;
									}
									float result2;
									Vector4 vector;
									if (text == "SHADER")
									{
										Shader shader = Shader.Find(text2);
										val5.shader = shader;
									}
									else if (text == "MATERIAL")
									{
										foreach (Material customMaterial in customMaterials)
										{
											if (((Object)customMaterial).name == text2)
											{
												val5 = Object.Instantiate<Material>(customMaterial);
												val5.mainTexture = (Texture)(object)val6;
												break;
											}
										}
									}
									else if (float.TryParse(text2, out result2))
									{
										val5.SetFloat(text, result2);
									}
									else if (TryParseVector4(text2, out vector))
									{
										val5.SetVector(text, vector);
									}
								}
							}
						}
						catch (Exception ex3)
						{
							Debug.Log((object)("Something went wrong with More Suits! Error: " + ex3));
						}
						val4.suitMaterial = val5;
						if (val4.unlockableName.ToLower() != "default")
						{
							if (num == MaxSuits)
							{
								Debug.Log((object)"Attempted to add a suit, but you've already reached the max number of suits! Modify the config if you want more.");
								continue;
							}
							__instance.unlockablesList.unlockables.Add(val4);
							num++;
						}
					}
					SuitsAdded = true;
					break;
				}
				UnlockableItem val8 = JsonUtility.FromJson<UnlockableItem>(JsonUtility.ToJson((object)val));
				val8.alreadyUnlocked = false;
				val8.hasBeenMoved = false;
				val8.placedPosition = Vector3.zero;
				val8.placedRotation = Vector3.zero;
				val8.unlockableType = 753;
				while (__instance.unlockablesList.unlockables.Count < count + MaxSuits)
				{
					__instance.unlockablesList.unlockables.Add(val8);
				}
			}
			catch (Exception ex4)
			{
				Debug.Log((object)("Something went wrong with More Suits! Error: " + ex4));
			}
		}

		[HarmonyPatch("PositionSuitsOnRack")]
		[HarmonyPrefix]
		private static bool PositionSuitsOnRackPatch(ref StartOfRound __instance)
		{
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: 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_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			List<UnlockableSuit> source = Object.FindObjectsOfType<UnlockableSuit>().ToList();
			source = source.OrderBy((UnlockableSuit suit) => suit.syncedSuitID.Value).ToList();
			int num = 0;
			foreach (UnlockableSuit item in source)
			{
				AutoParentToShip component = ((Component)item).gameObject.GetComponent<AutoParentToShip>();
				component.overrideOffset = true;
				float num2 = 0.18f;
				if (MakeSuitsFitOnRack && source.Count > 13)
				{
					num2 /= (float)Math.Min(source.Count, 20) / 12f;
				}
				component.positionOffset = new Vector3(-2.45f, 2.75f, -8.41f) + __instance.rightmostSuitPosition.forward * num2 * (float)num;
				component.rotationOffset = new Vector3(0f, 90f, 0f);
				num++;
			}
			return false;
		}
	}

	private const string modGUID = "x753.More_Suits";

	private const string modName = "More Suits";

	private const string modVersion = "1.4.3";

	private readonly Harmony harmony = new Harmony("x753.More_Suits");

	private static MoreSuitsMod Instance;

	public static bool SuitsAdded = false;

	public static string DisabledSuits;

	public static bool LoadAllSuits;

	public static bool MakeSuitsFitOnRack;

	public static bool UnlockAll;

	public static int MaxSuits;

	public static List<Material> customMaterials = new List<Material>();

	private static TerminalNode cancelPurchase;

	private static TerminalKeyword buyKeyword;

	private void Awake()
	{
		if ((Object)(object)Instance == (Object)null)
		{
			Instance = this;
		}
		DisabledSuits = ((BaseUnityPlugin)this).Config.Bind<string>("General", "Disabled Suit List", "UglySuit751.png,UglySuit752.png,UglySuit753.png", "Comma-separated list of suits that shouldn't be loaded").Value;
		LoadAllSuits = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Ignore !less-suits.txt", false, "If true, ignores the !less-suits.txt file and will attempt to load every suit, except those in the disabled list. This should be true if you're not worried about having too many suits.").Value;
		MakeSuitsFitOnRack = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Make Suits Fit on Rack", true, "If true, squishes the suits together so more can fit on the rack.").Value;
		UnlockAll = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Unlock All Suits", false, "If true, unlocks all custom suits that would normally be sold in the shop.").Value;
		MaxSuits = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Max Suits", 100, "The maximum number of suits to load. If you have more, some will be ignored.").Value;
		harmony.PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin More Suits is loaded!");
	}

	private static UnlockableItem AddToRotatingShop(UnlockableItem newSuit, int price, int unlockableID)
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Expected O, but got Unknown
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Expected O, but got Unknown
		//IL_0298: Unknown result type (might be due to invalid IL or missing references)
		//IL_029f: Expected O, but got Unknown
		Terminal val = Object.FindObjectOfType<Terminal>();
		for (int i = 0; i < val.terminalNodes.allKeywords.Length; i++)
		{
			if (((Object)val.terminalNodes.allKeywords[i]).name == "Buy")
			{
				buyKeyword = val.terminalNodes.allKeywords[i];
				break;
			}
		}
		newSuit.alreadyUnlocked = false;
		newSuit.hasBeenMoved = false;
		newSuit.placedPosition = Vector3.zero;
		newSuit.placedRotation = Vector3.zero;
		newSuit.shopSelectionNode = ScriptableObject.CreateInstance<TerminalNode>();
		((Object)newSuit.shopSelectionNode).name = newSuit.unlockableName + "SuitBuy1";
		newSuit.shopSelectionNode.creatureName = newSuit.unlockableName + " suit";
		newSuit.shopSelectionNode.displayText = "You have requested to order " + newSuit.unlockableName + " suits.\nTotal cost of item: [totalCost].\n\nPlease CONFIRM or DENY.\n\n";
		newSuit.shopSelectionNode.clearPreviousText = true;
		newSuit.shopSelectionNode.shipUnlockableID = unlockableID;
		newSuit.shopSelectionNode.itemCost = price;
		newSuit.shopSelectionNode.overrideOptions = true;
		CompatibleNoun val2 = new CompatibleNoun();
		val2.noun = ScriptableObject.CreateInstance<TerminalKeyword>();
		val2.noun.word = "confirm";
		val2.noun.isVerb = true;
		val2.result = ScriptableObject.CreateInstance<TerminalNode>();
		((Object)val2.result).name = newSuit.unlockableName + "SuitBuyConfirm";
		val2.result.creatureName = "";
		val2.result.displayText = "Ordered " + newSuit.unlockableName + " suits! Your new balance is [playerCredits].\n\n";
		val2.result.clearPreviousText = true;
		val2.result.shipUnlockableID = unlockableID;
		val2.result.buyUnlockable = true;
		val2.result.itemCost = price;
		val2.result.terminalEvent = "";
		CompatibleNoun val3 = new CompatibleNoun();
		val3.noun = ScriptableObject.CreateInstance<TerminalKeyword>();
		val3.noun.word = "deny";
		val3.noun.isVerb = true;
		if ((Object)(object)cancelPurchase == (Object)null)
		{
			cancelPurchase = ScriptableObject.CreateInstance<TerminalNode>();
		}
		val3.result = cancelPurchase;
		((Object)val3.result).name = "MoreSuitsCancelPurchase";
		val3.result.displayText = "Cancelled order.\n";
		newSuit.shopSelectionNode.terminalOptions = (CompatibleNoun[])(object)new CompatibleNoun[2] { val2, val3 };
		TerminalKeyword val4 = ScriptableObject.CreateInstance<TerminalKeyword>();
		((Object)val4).name = newSuit.unlockableName + "Suit";
		val4.word = newSuit.unlockableName.ToLower() + " suit";
		val4.defaultVerb = buyKeyword;
		CompatibleNoun val5 = new CompatibleNoun();
		val5.noun = val4;
		val5.result = newSuit.shopSelectionNode;
		List<CompatibleNoun> list = buyKeyword.compatibleNouns.ToList();
		list.Add(val5);
		buyKeyword.compatibleNouns = list.ToArray();
		List<TerminalKeyword> list2 = val.terminalNodes.allKeywords.ToList();
		list2.Add(val4);
		list2.Add(val2.noun);
		list2.Add(val3.noun);
		val.terminalNodes.allKeywords = list2.ToArray();
		return newSuit;
	}

	public static bool TryParseVector4(string input, out Vector4 vector)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		vector = Vector4.zero;
		string[] array = input.Split(',');
		if (array.Length == 4 && float.TryParse(array[0], out var result) && float.TryParse(array[1], out var result2) && float.TryParse(array[2], out var result3) && float.TryParse(array[3], out var result4))
		{
			vector = new Vector4(result, result2, result3, result4);
			return true;
		}
		return false;
	}
}

BepInEx/plugins/plugins/PersistentPurchases.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
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 Unity.Netcode;
using UnityEngine;
using UnityEngine.UIElements.Collections;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("PersistentPurchases")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Keeps bought ship objects after failing to meet quota")]
[assembly: AssemblyFileVersion("1.1.1.0")]
[assembly: AssemblyInformationalVersion("1.1.1")]
[assembly: AssemblyProduct("PersistentPurchases")]
[assembly: AssemblyTitle("PersistentPurchases")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.1.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace PersistentPurchases
{
	[HarmonyPatch]
	public class Patches
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(Terminal), "Start")]
		[HarmonyPriority(-23)]
		public static void generateConfig()
		{
			Plugin.setupConfig(StartOfRound.Instance.unlockablesList.unlockables);
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(StartOfRound), "ResetShip")]
		public static void storeUnlocked(StartOfRound __instance, out List<Tuple<int, Vector3, Vector3>> __state)
		{
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			Plugin.log.LogInfo((object)"Taking note of bought unlockables");
			__state = new List<Tuple<int, Vector3, Vector3>>();
			List<UnlockableItem> unlockables = __instance.unlockablesList.unlockables;
			for (int i = 0; i < unlockables.Count; i++)
			{
				Plugin.log.LogDebug((object)$"{unlockables[i].unlockableName} - unlocked({unlockables[i].hasBeenUnlockedByPlayer}) - should persist({Plugin.unlockableConfig[i].Value})");
				if (unlockables[i].hasBeenUnlockedByPlayer && Plugin.unlockableConfig[i].Value)
				{
					__state.Add(Tuple.Create<int, Vector3, Vector3>(i, unlockables[i].placedPosition, unlockables[i].placedRotation));
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(StartOfRound), "ResetShip")]
		public static void loadUnlocked(StartOfRound __instance, List<Tuple<int, Vector3, Vector3>> __state)
		{
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			Plugin.log.LogInfo((object)"Rebuying unlockables");
			foreach (Tuple<int, Vector3, Vector3> item in __state)
			{
				Plugin.log.LogDebug((object)__instance.unlockablesList.unlockables[item.Item1].unlockableName);
				UnlockableItem val = __instance.unlockablesList.unlockables[item.Item1];
				__instance.BuyShipUnlockableServerRpc(item.Item1, TimeOfDay.Instance.quotaVariables.startingCredits);
				if (__instance.SpawnedShipUnlockables.ContainsKey(item.Item1))
				{
					NetworkObject component = DictionaryExtensions.Get<int, GameObject>((IDictionary<int, GameObject>)__instance.SpawnedShipUnlockables, item.Item1, (GameObject)null).GetComponent<NetworkObject>();
					if ((Object)(object)component != (Object)null)
					{
						ShipBuildModeManager.Instance.StoreObjectServerRpc(NetworkObjectReference.op_Implicit(component), 0);
					}
					else
					{
						Plugin.log.LogWarning((object)("Failed to find NetworkObject for " + val.unlockableName));
					}
				}
				else
				{
					Plugin.log.LogWarning((object)("SpawnedShipUnlockables did not contain " + val.unlockableName));
				}
			}
		}
	}
	[HarmonyPatch(typeof(GameNetworkManager), "ResetSavedGameValues")]
	public class RemoveUneccesaryAndAnnoyingReset
	{
		private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
		{
			Plugin.log.LogInfo((object)"Beginning patching of GameNetworkManager.ResetSavedGameValues");
			List<CodeInstruction> list = new List<CodeInstruction>(instructions);
			bool flag = false;
			for (int i = 0; i < list.Count; i++)
			{
				if (CodeInstructionExtensions.Calls(list[i], typeof(GameNetworkManager).GetMethod("ResetUnlockablesListValues")))
				{
					flag = true;
					list[i - 1].opcode = OpCodes.Nop;
					list[i].opcode = OpCodes.Nop;
					list[i].operand = null;
					break;
				}
			}
			if (flag)
			{
				Plugin.log.LogInfo((object)"Patched GameNetworkManager.ResetSavedGameValues");
			}
			else
			{
				Plugin.log.LogError((object)"Failed to patch GameNetworkManager.ResetSavedGameValues!");
			}
			return list.AsEnumerable();
		}
	}
	[BepInPlugin("PersistentPurchases", "PersistentPurchases", "1.1.1")]
	public class Plugin : BaseUnityPlugin
	{
		public static ConfigEntry<bool> placeUnlockables;

		public static ManualLogSource log = new ManualLogSource("PersistentPurchases");

		public static Harmony harmony = new Harmony("PersistentPurchases");

		public static string[] knownFurniture = new string[19]
		{
			"Cozy lights", "Television", "Cupboard", "File Cabinet", "Toilet", "Shower", "Light switch", "Record player", "Table", "Bunkbeds",
			"Terminal", "Romantic table", "JackOLantern", "Welcome mat", "Goldfish", "Plushie pajama man", "SmallRug", "LargeRug", "FatalitiesSign"
		};

		public static List<ConfigFile> despair = new List<ConfigFile>();

		public static List<ConfigEntry<bool>> unlockableConfig = new List<ConfigEntry<bool>>();

		private void Awake()
		{
			Logger.Sources.Add((ILogSource)(object)log);
			despair.Add(((BaseUnityPlugin)this).Config);
			harmony.PatchAll(typeof(Patches));
			harmony.PatchAll(typeof(RemoveUneccesaryAndAnnoyingReset));
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin PersistentPurchases is loaded!");
		}

		public static void setupConfig(List<UnlockableItem> unlockables)
		{
			log.LogInfo((object)$"Registering {unlockables.Count} unlockables");
			for (int i = 0; i < unlockables.Count; i++)
			{
				log.LogDebug((object)(unlockables[i].unlockableName ?? ""));
				unlockableConfig.Add(despair[0].Bind<bool>("Unlockables", unlockables[i].unlockableName, unlockables[i].unlockableType == 0 || knownFurniture.Contains(unlockables[i].unlockableName), (ConfigDescription)null));
			}
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "PersistentPurchases";

		public const string PLUGIN_NAME = "PersistentPurchases";

		public const string PLUGIN_VERSION = "1.1.1";
	}
}

BepInEx/plugins/plugins/PushToMute.dll

Decompiled a day ago
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using PushToMute.Patches;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("PushToMute")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PushToMute")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("faaa231e-a5f3-481d-a1d9-f1f5799855fc")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace PushToMute
{
	[BepInPlugin("Baba.PushToMute", "PushToMute", "1.0.0")]
	public class PTMModBase : BaseUnityPlugin
	{
		private const string modGUID = "Baba.PushToMute";

		private const string modName = "PushToMute";

		private const string modVersion = "1.0.0";

		private readonly Harmony harmony = new Harmony("Baba.PushToMute");

		private static PTMModBase Instance;

		internal ManualLogSource mls;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("Baba.PushToMute");
			harmony.PatchAll(typeof(PTMModBase));
			harmony.PatchAll(typeof(UpdatePatch));
			harmony.PatchAll(typeof(InGamePlayerSettingsPatch));
			mls.LogInfo((object)"Push To Mute successfully loaded!");
		}
	}
}
namespace PushToMute.Patches
{
	[HarmonyPatch(typeof(StartOfRound), "Update")]
	internal class UpdatePatch
	{
		private static void Postfix(StartOfRound __instance)
		{
			if ((Object)(object)__instance.voiceChatModule != (Object)null && !IngamePlayerSettings.Instance.settings.pushToTalk)
			{
				__instance.voiceChatModule.IsMuted = IngamePlayerSettings.Instance.playerInput.actions.FindAction("VoiceButton", false).IsPressed();
			}
		}
	}
	[HarmonyPatch(typeof(IngamePlayerSettings))]
	internal class InGamePlayerSettingsPatch
	{
		[HarmonyPatch("SetMicPushToTalk")]
		[HarmonyPostfix]
		private static void SetMicPushToTalkPatch(IngamePlayerSettings __instance)
		{
			if (!__instance.unsavedSettings.pushToTalk)
			{
				__instance.SetSettingsOptionsText((SettingsOptionType)3, "MODE: Push to mute");
			}
		}

		[HarmonyPatch("UpdateMicPushToTalkButton")]
		[HarmonyPostfix]
		private static void UpdateMicPushToTalkButtonPatch(IngamePlayerSettings __instance)
		{
			if (!__instance.settings.pushToTalk)
			{
				__instance.SetSettingsOptionsText((SettingsOptionType)3, "MODE: Push to mute");
			}
		}
	}
}

BepInEx/plugins/plugins/RushOfAdrenaline.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RushOfAdrenaline")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("A template for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+43206f0475d7dae18e393eaa115cfd192399712f")]
[assembly: AssemblyProduct("RushOfAdrenaline")]
[assembly: AssemblyTitle("RushOfAdrenaline")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace RushOfAdrenaline
{
	[BepInPlugin("Uprank.RushOfAdrenaline", "Rush of Adrenaline", "1.0.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("Uprank.RushOfAdrenaline");

		private void Awake()
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Uprank.RushOfAdrenaline is loaded!");
			harmony.PatchAll(typeof(Plugin));
			harmony.PatchAll(typeof(PlayerControllerBPatch));
		}
	}
	public class PluginInfo
	{
		public const string PLUGIN_GUID = "Uprank.RushOfAdrenaline";

		public const string PLUGIN_NAME = "Rush of Adrenaline";

		public const string PLUGIN_VERSION = "1.0.0.0";
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	internal class PlayerControllerBPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void AdjustSpeedBasedOnPanic(ref StartOfRound ___playersManager, ref float ___targetFOV, ref float ___sprintMultiplier)
		{
			if (___playersManager.fearLevel >= 0.4f)
			{
				___sprintMultiplier = Mathf.Lerp(___sprintMultiplier, 1f + ___playersManager.fearLevel / 2f, Time.deltaTime * 0.25f);
			}
		}
	}
}

BepInEx/plugins/plugins/SellTracker.dll

Decompiled a day ago
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.SceneManagement;

[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: AssemblyCompany("SellTracker")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SellTracker")]
[assembly: AssemblyTitle("SellTracker")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SellTracker;

[BepInPlugin("NutNutty.SellTracker", "Sell Tracker", "1.2.1")]
public class SellTracker : BaseUnityPlugin
{
	public ConfigEntry<string> SellTrackerColorConfig;

	public ConfigEntry<string> SellPercentageColorConfig;

	public static Color SellTrackerColor;

	public static Color SellPercentageColor;

	public void Awake()
	{
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		SellTrackerColorConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "SellTrackerColor", "#FF0000", "The hex color of the sell tracker text (use a site like https://htmlcolorcodes.com to generate a hex code)");
		SellPercentageColorConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "SellPercentageColor", "#FF0000", "The hex color of the sell percentage text (use a site like https://htmlcolorcodes.com to generate a hex code)");
		ColorUtility.TryParseHtmlString(SellTrackerColorConfig.Value, ref SellTrackerColor);
		ColorUtility.TryParseHtmlString(SellPercentageColorConfig.Value, ref SellPercentageColor);
		new Harmony("SellTracker").PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Sell Tracker plugin loaded!");
	}
}
public class Patches
{
	[HarmonyPatch(typeof(DisplayCompanyBuyingRate))]
	public class DisplayCompanyBuyingRatePatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("Update")]
		public static bool OverwriteText(ref DisplayCompanyBuyingRate __instance)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			int num = TimeOfDay.Instance.quotaFulfilled + calculatedValue;
			((TMP_Text)__instance.displayText).text = $"PROFIT QUOTA: {num}/{TimeOfDay.Instance.profitQuota}";
			((TMP_Text)__instance.displayText).color = SellTracker.SellTrackerColor;
			((TMP_Text)__instance.displayText).fontSize = 28f;
			return false;
		}
	}

	[HarmonyPatch(typeof(DepositItemsDesk))]
	public class DepositItemsDeskPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("AddObjectToDeskClientRpc")]
		public static void FetchValue(ref DepositItemsDesk __instance)
		{
			if (!NetworkManager.Singleton.IsServer && NetworkManager.Singleton.IsClient)
			{
				object value = Traverse.Create((object)__instance).Field("lastObjectAddedToDesk").GetValue();
				NetworkObject val = (NetworkObject)((value is NetworkObject) ? value : null);
				__instance.itemsOnCounter.Add(((Component)val).GetComponentInChildren<GrabbableObject>());
			}
			int num = 0;
			for (int i = 0; i < __instance.itemsOnCounter.Count; i++)
			{
				if (__instance.itemsOnCounter[i].itemProperties.isScrap)
				{
					num += __instance.itemsOnCounter[i].scrapValue;
				}
			}
			calculatedValue = (int)((float)num * StartOfRound.Instance.companyBuyingRate);
		}

		[HarmonyPostfix]
		[HarmonyPatch("SellItemsClientRpc")]
		public static void ClearValue(ref DepositItemsDesk __instance)
		{
			if (!NetworkManager.Singleton.IsServer && NetworkManager.Singleton.IsClient)
			{
				__instance.itemsOnCounter.Clear();
			}
			calculatedValue = 0;
		}

		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		public static void CreateScreen()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			Scene sceneByName = SceneManager.GetSceneByName("CompanyBuilding");
			if (((Scene)(ref sceneByName)).IsValid())
			{
				GameObject val = Object.Instantiate<GameObject>(GameObject.Find("/Cube"));
				GameObject val2 = Object.Instantiate<GameObject>(GameObject.Find("/Canvas"));
				SceneManager.MoveGameObjectToScene(val, sceneByName);
				SceneManager.MoveGameObjectToScene(val2, sceneByName);
				Transform transform = val.transform;
				transform.position += new Vector3(0f, 0f, -3f);
				Transform transform2 = val2.transform;
				transform2.position += new Vector3(0f, 0f, -3f);
				Object.Destroy((Object)(object)val2.GetComponentInChildren<DisplayCompanyBuyingRate>());
				TextMeshProUGUI componentInChildren = val2.GetComponentInChildren<TextMeshProUGUI>();
				((TMP_Text)componentInChildren).text = $"{Mathf.RoundToInt(StartOfRound.Instance.companyBuyingRate * 100f)}%";
				((TMP_Text)componentInChildren).color = SellTracker.SellPercentageColor;
				((TMP_Text)componentInChildren).fontSize = 64.37f;
			}
		}
	}

	public static int calculatedValue;
}

BepInEx/plugins/plugins/SellYourStuff.dll

Decompiled a day ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using SellYourStuff.Patches;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SellYourStuff")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SellYourStuff")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("be25d89d-f866-45bd-808b-723b2d0aa1f8")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SellYourStuff
{
	[BepInPlugin("Axeron.SellYourStuff", "SellYourStuff", "1.0.1.0")]
	public class SellYourStuffModBase : BaseUnityPlugin
	{
		private const string modGUID = "Axeron.SellYourStuff";

		private const string modName = "SellYourStuff";

		private const string modVersion = "1.0.1.0";

		private readonly Harmony harmony = new Harmony("Axeron.SellYourStuff");

		internal ManualLogSource mls;

		private static SellYourStuffModBase Instance;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("Axeron.SellYourStuff");
			mls.LogInfo((object)"SellYourStuff plugin loaded. Version 1.0.1.0");
			harmony.PatchAll(typeof(SellYourStuffModBase));
			harmony.PatchAll(typeof(ItemPatch));
			harmony.PatchAll(typeof(SellPatch));
		}
	}
}
namespace SellYourStuff.Patches
{
	internal class PatchableItemsList
	{
		protected static readonly List<string> PatchableItems = new List<string>
		{
			"Flashlight", "Extension ladder", "Lockpicker", "Jetpack", "Pro-flashlight", "TZP-Inhalant", "Stun grenade", "Boombox", "Spray paint", "Shovel",
			"Walkie-talkie", "Zap gun", "Radar-booster"
		};
	}
	[HarmonyPatch(typeof(DepositItemsDesk))]
	internal class SellPatch : PatchableItemsList
	{
		[HarmonyPatch("PlaceItemOnCounter")]
		private static void Prefix(DepositItemsDesk __instance, [HarmonyArgument(0)] PlayerControllerB playerWhoTriggered)
		{
			if ((Object)(object)playerWhoTriggered != (Object)null)
			{
				GrabbableObject currentlyHeldObjectServer = playerWhoTriggered.currentlyHeldObjectServer;
				if ((Object)(object)currentlyHeldObjectServer != (Object)null && (Object)(object)currentlyHeldObjectServer.itemProperties != (Object)null && PatchableItemsList.PatchableItems.Contains(currentlyHeldObjectServer.itemProperties.itemName))
				{
					currentlyHeldObjectServer.itemProperties.isScrap = true;
				}
			}
		}
	}
	[HarmonyPatch(typeof(GrabbableObject))]
	internal class ItemPatch : PatchableItemsList
	{
		private const int NodeType = 2;

		private const int MinRange = 3;

		private const int MaxRange = 12;

		private const int creatureScanId = -1;

		private const bool requiresLineOfSight = false;

		[HarmonyPatch("Start")]
		private static void Postfix(GrabbableObject __instance)
		{
			if ((Object)(object)__instance != (Object)null && (Object)(object)__instance.itemProperties != (Object)null && PatchableItemsList.PatchableItems.Contains(__instance.itemProperties.itemName))
			{
				TryAddScanNode(__instance);
				__instance.itemProperties.isScrap = true;
				TrySetScrapValue(__instance);
				__instance.itemProperties.isScrap = false;
			}
		}

		private static void TrySetScrapValue(GrabbableObject __instance)
		{
			try
			{
				Terminal val = Object.FindObjectOfType<Terminal>();
				for (int i = 0; i < Object.FindObjectOfType<Terminal>().buyableItemsList.Length; i++)
				{
					if (val.buyableItemsList[i].itemName == __instance.itemProperties.itemName)
					{
						int num = val.itemSalesPercentages[i];
						__instance.SetScrapValue(__instance.itemProperties.creditsWorth * num / 200);
					}
				}
			}
			catch
			{
				Debug.LogError((object)"Item not found in the current terminal store or other error occured");
			}
		}

		private static void TryAddScanNode(GrabbableObject __instance)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				object headerText = ((Component)__instance).gameObject.GetComponentInChildren<ScanNodeProperties>().headerText;
			}
			catch
			{
				GameObject gameObject = ((Component)Object.FindObjectOfType<ScanNodeProperties>()).gameObject;
				if ((Object)(object)gameObject != (Object)null)
				{
					GameObject val = Object.Instantiate<GameObject>(gameObject, ((Component)__instance).transform.position, Quaternion.Euler(Vector3.zero), ((Component)__instance).transform);
					ScanNodeProperties component = val.GetComponent<ScanNodeProperties>();
					if ((Object)(object)component != (Object)null)
					{
						component.headerText = __instance.itemProperties.itemName;
						component.nodeType = 2;
						component.minRange = 3;
						component.maxRange = 12;
						component.requiresLineOfSight = false;
						component.creatureScanID = -1;
					}
				}
				else
				{
					Debug.LogError((object)"Couldn't create scanNode for object");
				}
			}
		}
	}
}

BepInEx/plugins/plugins/ShipDecorations.dll

Decompiled a day ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using ShipDecorations.Patches;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ShipDecorations")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ShipDecorations")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("752b4a5e-d779-490a-a540-e85dd73f2bd2")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ShipDecorations
{
	public static class ConfigSettings
	{
		public static ConfigEntry<bool> makeShipDecorationsFree;

		public static void BindConfigSettings()
		{
		}

		public static string GetDisplayName(string key)
		{
			key = key.Replace("<Keyboard>/", "");
			key = key.Replace("<Mouse>/", "");
			string text = key;
			text = text.Replace("leftAlt", "Alt");
			text = text.Replace("rightAlt", "Alt");
			text = text.Replace("leftCtrl", "Ctrl");
			text = text.Replace("rightCtrl", "Ctrl");
			text = text.Replace("leftShift", "Shift");
			text = text.Replace("rightShift", "Shift");
			text = text.Replace("leftButton", "LMB");
			text = text.Replace("rightButton", "RMB");
			return text.Replace("middleButton", "MMB");
		}
	}
	[BepInPlugin("Sant.ShipDecorationsUnlock", "Unlock Ship Decorations", "1.0.0.0")]
	public class ShipDecorationsUnlockedModBase : BaseUnityPlugin
	{
		private const string modGUID = "Sant.ShipDecorationsUnlock";

		private const string modName = "Unlock Ship Decorations";

		private const string modVersion = "1.0.0.0";

		private readonly Harmony harmony = new Harmony("Sant.ShipDecorationsUnlock");

		public static ShipDecorationsUnlockedModBase instance;

		internal ManualLogSource mls;

		private void Awake()
		{
			if ((Object)(object)instance == (Object)null)
			{
				instance = this;
			}
			mls = Logger.CreateLogSource("Sant.ShipDecorationsUnlock");
			mls.LogInfo((object)"The Ship Decorations Unlock mod has awaken");
			harmony.PatchAll(typeof(ShipDecorationsUnlockedModBase));
			harmony.PatchAll(typeof(ShipDecorationsUnlockedPatch));
		}

		public static void Log(string message)
		{
			Log(message);
		}
	}
}
namespace ShipDecorations.Patches
{
	[HarmonyPatch(typeof(Terminal))]
	internal class ShipDecorationsUnlockedPatch
	{
		[HarmonyPatch("RotateShipDecorSelection")]
		[HarmonyPostfix]
		private static void unlockAllShipDecorations(ref List<TerminalNode> ___ShipDecorSelection)
		{
			___ShipDecorSelection.Clear();
			List<TerminalNode> list = new List<TerminalNode>();
			for (int i = 0; i < StartOfRound.Instance.unlockablesList.unlockables.Count; i++)
			{
				if ((Object)(object)StartOfRound.Instance.unlockablesList.unlockables[i].shopSelectionNode != (Object)null && !StartOfRound.Instance.unlockablesList.unlockables[i].alwaysInStock)
				{
					list.Add(StartOfRound.Instance.unlockablesList.unlockables[i].shopSelectionNode);
				}
			}
			for (int j = 0; j < list.Count; j++)
			{
				TerminalNode item = list[j];
				___ShipDecorSelection.Add(item);
			}
		}
	}
}

BepInEx/plugins/plugins/ShootableMouthDogs.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.AI;

[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("AgentRev")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+0eac58e2c712170b22b29352fe20cbcc1cec04b3")]
[assembly: AssemblyProduct("ShootableMouthDogs")]
[assembly: AssemblyTitle("ShootableMouthDogs")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ShootableMouthDogs
{
	[BepInPlugin("ShootableMouthDogs", "ShootableMouthDogs", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public void Awake()
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin ShootableMouthDogs v1.0.0 loaded!");
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
		}
	}
	[HarmonyPatch(typeof(Physics))]
	public static class PhysicsPatch
	{
		[HarmonyPatch("SphereCastNonAlloc")]
		[HarmonyPatch(new Type[]
		{
			typeof(Ray),
			typeof(float),
			typeof(RaycastHit[]),
			typeof(float),
			typeof(int),
			typeof(QueryTriggerInteraction)
		})]
		private static void Postfix(RaycastHit[] results, int layerMask, ref int __result)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			if ((layerMask & 0x80000) == 0)
			{
				return;
			}
			int num = 0;
			for (int i = 0; i < __result; i++)
			{
				Transform transform = ((RaycastHit)(ref results[i])).transform;
				if ((Object)(object)((transform != null) ? ((Component)transform).GetComponent<NavMeshAgent>() : null) == (Object)null)
				{
					if (i > num)
					{
						results[num] = results[i];
					}
					num++;
				}
			}
			__result = num;
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "ShootableMouthDogs";

		public const string PLUGIN_NAME = "ShootableMouthDogs";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}

BepInEx/plugins/plugins/Suit Saver.dll

Decompiled a day ago
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using GameNetcodeStuff;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("Suit Saver")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Suit Saver")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("cb7cfb30-b06e-4e41-9de7-03640e1662ea")]
[assembly: AssemblyFileVersion("1.2.1.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8.1", FrameworkDisplayName = ".NET Framework 4.8.1")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SuitSaver
{
	[BepInPlugin("Hexnet.lethalcompany.suitsaver", "Suit Saver", "1.2.1")]
	public class SuitSaver : BaseUnityPlugin
	{
		private const string modGUID = "Hexnet.lethalcompany.suitsaver";

		private const string modName = "Suit Saver";

		private const string modVersion = "1.2.1";

		private readonly Harmony harmony = new Harmony("Hexnet.lethalcompany.suitsaver");

		private void Awake()
		{
			harmony.PatchAll();
			Debug.Log((object)"[SS]: Suit Saver loaded successfully!");
		}
	}
}
namespace SuitSaver.Patches
{
	[HarmonyPatch]
	internal class Patches
	{
		[HarmonyPatch(typeof(StartOfRound))]
		internal class StartPatch
		{
			private static bool ReloadSuit;

			[HarmonyPatch("playersFiredGameOver")]
			[HarmonyPrefix]
			private static void PurchasedSuitCheck()
			{
				string text = LoadFromFile();
				if (text != "-1")
				{
					ReloadSuit = !IsPurchasedSuit(text);
				}
			}

			[HarmonyPatch("ResetShip")]
			[HarmonyPostfix]
			private static void ResetShipPatch()
			{
				if (!ReloadSuit)
				{
					string text = LoadFromFile();
					if (text != "-1")
					{
						Debug.Log((object)("[SS]: Could not reload suit upon ship reset. Perhaps it's locked? (" + text + ")"));
					}
				}
				else
				{
					Debug.Log((object)"[SS]: Ship has been reset!");
					Debug.Log((object)"[SS]: Reloading suit...");
					LoadSuitFromFile();
					ReloadSuit = false;
				}
			}
		}

		[HarmonyPatch(typeof(UnlockableSuit))]
		internal class SuitPatch
		{
			[HarmonyPatch("SwitchSuitClientRpc")]
			[HarmonyPostfix]
			private static void SyncSuit(ref UnlockableSuit __instance, int playerID)
			{
				PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
				int num = (int)localPlayerController.playerClientId;
				if (playerID != num)
				{
					UnlockableSuit.SwitchSuitForPlayer(StartOfRound.Instance.allPlayerScripts[playerID], __instance.syncedSuitID.Value, true);
				}
			}

			[HarmonyPatch("SwitchSuitToThis")]
			[HarmonyPostfix]
			private static void EquipSuitPatch()
			{
				PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
				string unlockableName = StartOfRound.Instance.unlockablesList.unlockables[localPlayerController.currentSuitID].unlockableName;
				SaveToFile(unlockableName);
				Debug.Log((object)("[SS]: Successfully saved current suit. (" + unlockableName + ")"));
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB))]
		internal class JoinGamePatch
		{
			[HarmonyPatch("ConnectClientToPlayerObject")]
			[HarmonyPostfix]
			private static void LoadSuitPatch(ref PlayerControllerB __instance)
			{
				((Component)GameNetworkManager.Instance.localPlayerController).gameObject.AddComponent<EquipAfterSyncPatch>();
			}
		}

		internal class EquipAfterSyncPatch : MonoBehaviour
		{
			private void Start()
			{
				((MonoBehaviour)this).StartCoroutine(LoadSuit());
			}

			private IEnumerator LoadSuit()
			{
				Debug.Log((object)"[SS]: Waiting for suits to sync...");
				string SavedSuit = LoadFromFile();
				int success = -1;
				for (int i = 0; i < 3; i++)
				{
					success = LoadSuitStartup(SavedSuit);
					if (success <= 0)
					{
						if (success == 0)
						{
							Debug.Log((object)("[SS]: Failed to load saved suit. Perhaps it's locked? (" + SavedSuit + ")"));
						}
						break;
					}
					yield return (object)new WaitForSeconds(1f);
				}
				if (success == 1)
				{
					Debug.Log((object)("[SS]: Successfully loaded saved suit. (" + SavedSuit + ")"));
				}
			}
		}

		public static string SavePath = Application.persistentDataPath + "\\suitsaver.txt";

		private static void SaveToFile(string suitName)
		{
			File.WriteAllText(SavePath, suitName);
		}

		private static string LoadFromFile()
		{
			if (File.Exists(SavePath))
			{
				return File.ReadAllText(SavePath);
			}
			return "-1";
		}

		private static UnlockableSuit GetSuitByName(string Name)
		{
			List<UnlockableItem> unlockables = StartOfRound.Instance.unlockablesList.unlockables;
			UnlockableSuit[] array = Resources.FindObjectsOfTypeAll<UnlockableSuit>();
			foreach (UnlockableSuit val in array)
			{
				if (val.syncedSuitID.Value >= 0)
				{
					string unlockableName = unlockables[val.syncedSuitID.Value].unlockableName;
					if (unlockableName == Name)
					{
						return val;
					}
				}
			}
			return null;
		}

		private static bool IsPurchasedSuit(string Name)
		{
			List<UnlockableItem> unlockables = StartOfRound.Instance.unlockablesList.unlockables;
			UnlockableSuit[] array = Resources.FindObjectsOfTypeAll<UnlockableSuit>();
			foreach (UnlockableSuit val in array)
			{
				if (val.syncedSuitID.Value >= 0)
				{
					UnlockableItem val2 = unlockables[val.syncedSuitID.Value];
					string unlockableName = val2.unlockableName;
					if (unlockableName == Name)
					{
						return !val2.alreadyUnlocked && val2.hasBeenUnlockedByPlayer;
					}
				}
			}
			return false;
		}

		private static void LoadSuitFromFile()
		{
			string text = LoadFromFile();
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if (!(text == "-1"))
			{
				UnlockableSuit suitByName = GetSuitByName(text);
				if ((Object)(object)suitByName != (Object)null)
				{
					UnlockableSuit.SwitchSuitForPlayer(localPlayerController, suitByName.syncedSuitID.Value, false);
					suitByName.SwitchSuitServerRpc((int)localPlayerController.playerClientId);
					Debug.Log((object)("[SS]: Successfully loaded saved suit. (" + text + ")"));
				}
				else
				{
					Debug.Log((object)("[SS]: Failed to load saved suit. Perhaps it's locked? (" + text + ")"));
				}
			}
		}

		private static int LoadSuitStartup(string SavedSuit)
		{
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			if (SavedSuit == "-1")
			{
				return -1;
			}
			UnlockableSuit suitByName = GetSuitByName(SavedSuit);
			if ((Object)(object)suitByName != (Object)null)
			{
				UnlockableSuit.SwitchSuitForPlayer(localPlayerController, suitByName.syncedSuitID.Value, false);
				suitByName.SwitchSuitServerRpc((int)localPlayerController.playerClientId);
				return 1;
			}
			return 0;
		}
	}
}

BepInEx/plugins/plugins/TwoHandedStorage.dll

Decompiled a day ago
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: AssemblyCompany("TwoHandedStorage")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("TwoHandedStorage")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TwoHandedStorage")]
[assembly: AssemblyTitle("TwoHandedStorage")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace TwoHandedStorage
{
	[BepInPlugin("viviko.TwoHandedStorage", "TwoHandedStorage", "1.0.0")]
	public class TwoHandedStorage : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(PlayerControllerB))]
		internal class PlayerControllerBPatch
		{
			[HarmonyPostfix]
			[HarmonyPatch("SetHoverTipAndCurrentInteractTrigger")]
			private static void SetHoverTipAndCurrentInteractTriggerPatch(ref InteractTrigger ___hoveringOverTrigger)
			{
				if (Object.op_Implicit((Object)(object)___hoveringOverTrigger))
				{
					___hoveringOverTrigger.twoHandedItemAllowed = true;
				}
			}
		}

		private const string modGUID = "viviko.TwoHandedStorage";

		private const string modName = "TwoHandedStorage";

		private const string modVersion = "1.0.0";

		private readonly Harmony harmony = new Harmony("viviko.TwoHandedStorage");

		private static TwoHandedStorage Instance;

		internal ManualLogSource mls;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("viviko.TwoHandedStorage");
			harmony.PatchAll();
			mls.LogInfo((object)"Plugin TwoHandedStorage is loaded!");
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "TwoHandedStorage";

		public const string PLUGIN_NAME = "TwoHandedStorage";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}

BepInEx/plugins/plugins/VanillaContentExpansion/VanillaContentExpansion.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Unity.Netcode;
using UnityEngine;
using VanillaContentExpansion;
using VanillaContentPlus;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("VanillaContentExpansion")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("VanillaContentExpansion")]
[assembly: AssemblyTitle("VanillaContentExpansion")]
[assembly: AssemblyVersion("1.0.0.0")]
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;
		}
	}
}
namespace VanillaContentPlus
{
	[BepInPlugin("bigmcnugget.vanillaContentExpansion", "Vanilla Content Expansion", "0.1.7")]
	public class Plugin : BaseUnityPlugin
	{
		private const string GUID = "bigmcnugget.vanillaContentExpansion";

		private const string NAME = "Vanilla Content Expansion";

		private const string VERSION = "0.1.7";

		public static Plugin instance;

		public ConfigEntry<bool> AllowDebugLogs;

		public static AssetBundle scrapAssetBundle;

		public static string scrapListJson;

		public static AssetBundle monsterAssetBundle;

		public static ConfigFile mainConfig { get; internal set; }

		public static ConfigFile scrapConfig { get; internal set; }

		public static ConfigFile monsterConfig { get; internal set; }

		private void Awake()
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Expected O, but got Unknown
			instance = this;
			mainConfig = new ConfigFile(Utility.CombinePaths(new string[2]
			{
				Paths.ConfigPath,
				"bigmcnugget.vanillaContentExpansion-main.cfg"
			}), true);
			AllowDebugLogs = mainConfig.Bind<bool>("Main", "Allow Debug Logs", true, "Allow printing logs to the console, really only needed for debug");
			PrepareForPatching();
			scrapAssetBundle = LoadAssetBundle("Scrap", Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "customscrap"));
			scrapListJson = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "ScrapList.json");
			scrapConfig = new ConfigFile(Utility.CombinePaths(new string[2]
			{
				Paths.ConfigPath,
				"bigmcnugget.vanillaContentExpansion-scrap.cfg"
			}), false);
			CustomScrap.Init();
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "bigmcnugget.vanillaContentExpansion");
		}

		private static void PrepareForPatching()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}

		private static AssetBundle LoadAssetBundle(string debugName, string path)
		{
			AssetBundle result = AssetBundle.LoadFromFile(path);
			instance.LogInfo("Loaded " + debugName + " Asset bundle from " + path);
			return result;
		}

		public void LogInfo(string message)
		{
			if (AllowDebugLogs.Value)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)message);
			}
		}

		public void LogWarning(string message)
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)message);
		}
	}
}
namespace VanillaContentPlus.CustomBehaviour
{
	public class FlipPhone : GrabbableObject
	{
		public AudioSource src;

		public AudioClip[] ringtones;

		public bool isPlaying;

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (((NetworkBehaviour)this).IsOwner && isPlaying)
			{
			}
		}

		[ServerRpc(RequireOwnership = false)]
		public void PlayServerRpc()
		{
			int i = Random.Range(0, ringtones.Length);
			PlayClientRpc(i);
		}

		[ClientRpc]
		public void PlayClientRpc(int i)
		{
			((MonoBehaviour)this).StartCoroutine(PlayOneShotIEnum(i));
		}

		public IEnumerator PlayOneShotIEnum(int i)
		{
			isPlaying = true;
			AudioClip clip = ringtones[i];
			Debug.Log((object)("Phone item: Playing clip " + ((Object)clip).name));
			src.PlayOneShot(clip);
			yield return (object)new WaitForSeconds(clip.length + 0.2f);
			isPlaying = false;
		}
	}
}
namespace VanillaContentExpansion
{
	public class ChatterboxAI : EnemyAI
	{
	}
	public class CustomEnemy
	{
		public class CustomEnemyData
		{
			public string name;

			public string enemyPath;

			public int rarity;

			public LevelTypes levelFlags;

			public SpawnType spawnType;

			public string infoKeyword;

			public string infoNode;

			public bool enabled = true;

			private CustomEnemyConfig config;

			public CustomEnemyData(string name, string enemyPath, int rarity, LevelTypes levelFlags, SpawnType spawnType, string infoKeyword, string infoNode)
			{
				//IL_0025: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				this.name = name;
				this.enemyPath = enemyPath;
				this.rarity = rarity;
				this.levelFlags = levelFlags;
				this.spawnType = spawnType;
				this.infoKeyword = infoKeyword;
				this.infoNode = infoNode;
				config = new CustomEnemyConfig(name, rarity);
				enabled = config.ENABLED.Value;
				this.rarity = config.RARITY.Value;
				allMonsters.Add(this);
			}
		}

		public static List<CustomEnemyData> allMonsters = new List<CustomEnemyData>();

		public static CustomEnemyData chatterbox = new CustomEnemyData("chatterbox", "Assets/content/enemies/chatterbox/data/chatterbox_enemy_type.asset", 1000, (LevelTypes)(-1), (SpawnType)0, null, "");

		public static void Init()
		{
			foreach (CustomEnemyData allMonster in allMonsters)
			{
				RegisterCustomMonster(allMonster);
			}
		}

		private static void RegisterCustomMonster(CustomEnemyData monster)
		{
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			Plugin.instance.LogInfo("Attempting To register Custom Monster: " + monster.name + " at " + monster.enemyPath);
			if (!monster.enabled)
			{
				Plugin.instance.LogInfo("Register Skipped" + monster.name + " Disabled in config");
				return;
			}
			EnemyType val = Plugin.monsterAssetBundle.LoadAsset<EnemyType>(monster.enemyPath);
			if ((Object)(object)val == (Object)null)
			{
				Plugin.instance.LogWarning("!!!!!!!!!!!!!CANNOT FIND!!!!!!!!!!!!!!" + monster.name);
				return;
			}
			NetworkPrefabs.RegisterNetworkPrefab(val.enemyPrefab);
			Enemies.RegisterEnemy(val, monster.rarity, monster.levelFlags, monster.spawnType, (TerminalNode)null, (TerminalKeyword)null);
			Plugin.instance.LogInfo("Registered Custom Monster: " + monster.name);
			Plugin.instance.LogInfo("\n");
		}
	}
	public class CustomEnemyConfig
	{
		public string name;

		public int rarity;

		public ConfigEntry<bool> ENABLED;

		public ConfigEntry<int> RARITY;

		public CustomEnemyConfig(string _name, int _defaultRarity)
		{
			name = _name;
			rarity = _defaultRarity;
			ENABLED = Plugin.monsterConfig.Bind<bool>(name, name + " Enabled", true, (ConfigDescription)null);
			RARITY = Plugin.monsterConfig.Bind<int>(name, name + " Rarity", rarity, "");
			Plugin.instance.LogInfo(name + " Config Loaded: [ENABLED] " + ENABLED.Value + " | [RARITY] " + RARITY.Value);
		}
	}
	public class CustomScrap
	{
		public class CustomScrapItem
		{
			public string scrapName;

			public string path;

			public Dictionary<LevelTypes, int> moonWeights;

			public bool enabled;

			public int minValue;

			public int maxValue;

			public float itemWeight;

			private CustomScrapConfig config;

			public CustomScrapItem(string name, string path, int[] weights, int minValue, int maxValue, float weight)
			{
				scrapName = name;
				this.path = path;
				moonWeights = new Dictionary<LevelTypes, int>
				{
					{
						(LevelTypes)4,
						weights[0]
					},
					{
						(LevelTypes)8,
						weights[1]
					},
					{
						(LevelTypes)16,
						weights[2]
					},
					{
						(LevelTypes)32,
						weights[3]
					},
					{
						(LevelTypes)64,
						weights[4]
					},
					{
						(LevelTypes)128,
						weights[5]
					},
					{
						(LevelTypes)256,
						weights[6]
					},
					{
						(LevelTypes)512,
						weights[7]
					},
					{
						(LevelTypes)1024,
						weights[0]
					}
				};
				this.minValue = minValue;
				this.maxValue = maxValue;
				itemWeight = weight;
				config = new CustomScrapConfig(scrapName, this);
				enabled = config.ENABLED.Value;
				this.minValue = config.valueMin.Value;
				this.maxValue = config.valueMax.Value;
				itemWeight = config.itemWeight.Value;
			}
		}

		public class CustomScrapConfig
		{
			public string name;

			public ConfigEntry<bool> ENABLED;

			public ConfigEntry<int> valueMin;

			public ConfigEntry<int> valueMax;

			public ConfigEntry<float> itemWeight;

			public CustomScrapConfig(string _name, CustomScrapItem item)
			{
				name = _name;
				ENABLED = Plugin.scrapConfig.Bind<bool>("SCRAP " + name, name + " Enabled", true, (ConfigDescription)null);
				valueMin = Plugin.scrapConfig.Bind<int>("SCRAP " + name, name + " Minimum Value", item.minValue, (ConfigDescription)null);
				valueMax = Plugin.scrapConfig.Bind<int>("SCRAP " + name, name + " Maximum Value", item.maxValue, (ConfigDescription)null);
				itemWeight = Plugin.scrapConfig.Bind<float>("SCRAP " + name, name + " Item Weight", item.itemWeight, (ConfigDescription)null);
				Plugin.instance.LogInfo(name + " Config Loaded: [ENABLED] " + ENABLED.Value);
			}
		}

		public class JsonRoot
		{
			[JsonProperty("SCRAP")]
			public JsonData[] scraplist { get; set; }
		}

		public class JsonData
		{
			[JsonProperty("name")]
			public string name;

			[JsonProperty("path")]
			public string path;

			[JsonProperty("weights")]
			public int[] weights;

			[JsonProperty("minValue")]
			public int minValue;

			[JsonProperty("maxValue")]
			public int maxValue;

			[JsonProperty("itemWeight")]
			public float itemWeight;
		}

		public static List<CustomScrapItem> allScrapItems = new List<CustomScrapItem>();

		public static void Init()
		{
			ParseJsonList();
		}

		private static void RegisterCustomScrapItem(CustomScrapItem scrap)
		{
			if (!scrap.enabled)
			{
				Plugin.instance.LogInfo("Register Skipped" + scrap.scrapName + " Disabled in config");
				return;
			}
			Item val = Plugin.scrapAssetBundle.LoadAsset<Item>(scrap.path);
			if ((Object)(object)val == (Object)null)
			{
				Plugin.instance.LogWarning("!!!!!!!!!!!!!CANNOT FIND!!!!!!!!!!!!!!" + scrap.scrapName);
				return;
			}
			val.minValue = (int)((double)scrap.minValue * 2.5);
			val.maxValue = (int)((double)scrap.maxValue * 2.5);
			val.weight = scrap.itemWeight;
			NetworkPrefabs.RegisterNetworkPrefab(val.spawnPrefab);
			Items.RegisterScrap(val, scrap.moonWeights, (Dictionary<string, int>)null);
			Plugin.instance.LogInfo("Succesfully Registered Scrap: " + scrap.scrapName);
		}

		private static void ParseJsonList()
		{
			StreamReader streamReader = new StreamReader(Plugin.scrapListJson);
			string text = streamReader.ReadToEnd();
			JsonRoot jsonRoot = JsonConvert.DeserializeObject<JsonRoot>(text);
			int num = jsonRoot.scraplist.Length;
			for (int i = 0; i < num; i++)
			{
				JsonData jsonData = jsonRoot.scraplist[i];
				CustomScrapItem scrap = new CustomScrapItem(jsonData.name, jsonData.path, jsonData.weights, jsonData.minValue, jsonData.maxValue, jsonData.itemWeight);
				RegisterCustomScrapItem(scrap);
			}
		}
	}
}
namespace VanillaContentExpansion.CustomBehaviour
{
	public class AlarmClock
	{
		public Transform hHand;

		public Transform mHand;

		public Transform sHand;

		public AudioSource src;

		public AudioClip tick;

		public AudioClip alarm;
	}
	public class Lighter : GrabbableObject
	{
		private bool enabled;

		public AudioSource src;

		public AudioClip enabledSfx;

		public AudioClip disabledSfx;

		public Light pointLight;

		private float defaultlightRange = 5f;

		private Vector2 lightRangeRandom = new Vector2(4f, 8f);

		private float currentLightRange;

		private float defaultlightIntensity = 500f;

		private Vector2 lightIntensityRandom = new Vector2(125f, 150f);

		private float currentLightIntensity;

		private Vector2 flickerTimerRandom = new Vector2(0.01f, 0.15f);

		private float flickerTimer = 0.1f;

		public float fuel = 100f;

		private float fuelLeft;

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (((NetworkBehaviour)this).IsOwner)
			{
				((Behaviour)pointLight).enabled = false;
			}
		}

		public void Toggle()
		{
			enabled = !enabled;
			if (enabled)
			{
				Debug.Log((object)"Lighter enabled");
				src.PlayOneShot(enabledSfx);
				((Behaviour)pointLight).enabled = true;
			}
			else
			{
				Debug.Log((object)"Lighter disabled");
				src.PlayOneShot(disabledSfx);
				((Behaviour)pointLight).enabled = false;
				pointLight.intensity = defaultlightIntensity;
				pointLight.range = defaultlightRange;
			}
		}

		public void Tick()
		{
			flickerTimer -= Time.deltaTime;
			if (flickerTimer <= 0f)
			{
				currentLightIntensity = Random.Range(lightIntensityRandom.x, lightIntensityRandom.y);
				currentLightRange = Random.Range(lightRangeRandom.x, lightRangeRandom.y);
				pointLight.intensity = currentLightIntensity;
				pointLight.range = currentLightRange;
				flickerTimer = Random.Range(flickerTimerRandom.x, flickerTimerRandom.y);
			}
		}

		public override void Update()
		{
			((GrabbableObject)this).Update();
			Tick();
		}

		public override void PocketItem()
		{
			((GrabbableObject)this).PocketItem();
			if (enabled)
			{
				Toggle();
			}
		}
	}
	public class Missile : GrabbableObject
	{
	}
	public class PolaroidCamera : GrabbableObject
	{
		private bool canUse;

		public Light light;

		private float flashTimer;

		public AudioSource src;

		public AudioClip flashSFX;

		public AudioClip primedSFX;

		public override void Start()
		{
			((GrabbableObject)this).Start();
			((Behaviour)light).enabled = false;
			canUse = true;
		}

		public override void ItemActivate(bool used, bool buttonDown = true)
		{
			((GrabbableObject)this).ItemActivate(used, buttonDown);
			if (!((NetworkBehaviour)this).IsOwner)
			{
			}
		}

		public IEnumerator Flash()
		{
			canUse = false;
			src.PlayOneShot(flashSFX);
			((Behaviour)light).enabled = true;
			light.intensity = 10f;
			Light obj = light;
			obj.intensity += Time.deltaTime * 50000f;
			yield return (object)new WaitForSeconds(0.3f);
			((Behaviour)light).enabled = false;
			light.intensity = 0f;
			yield return (object)new WaitForSeconds(3f);
			src.PlayOneShot(primedSFX);
			canUse = true;
		}
	}
	public class TrafficLight : GrabbableObject
	{
		private bool enabled = false;

		private bool switching;

		public Light[] lights;

		public AudioSource src;

		public AudioClip changeClickClip;

		private Vector2 timerRandom = new Vector2(5f, 20f);

		private float currentTimer = 0f;

		public override void Start()
		{
			((GrabbableObject)this).Start();
			Light[] array = lights;
			foreach (Light val in array)
			{
				((Behaviour)val).enabled = false;
			}
		}

		public override void Update()
		{
			((GrabbableObject)this).Update();
			if (!enabled)
			{
				return;
			}
			currentTimer -= Time.deltaTime;
			if (currentTimer <= 0f && !switching)
			{
				Light[] array = lights;
				foreach (Light val in array)
				{
					((Behaviour)val).enabled = false;
				}
				((MonoBehaviour)this).StartCoroutine(ToggleLights());
			}
		}

		public override void PocketItem()
		{
			((GrabbableObject)this).PocketItem();
			enabled = false;
			Light[] array = lights;
			foreach (Light val in array)
			{
				((Behaviour)val).enabled = false;
			}
		}

		public override void EquipItem()
		{
			enabled = true;
		}

		private IEnumerator ToggleLights()
		{
			switching = true;
			yield return (object)new WaitForSeconds(0.75f);
			src.PlayOneShot(changeClickClip);
			int i = Random.Range(0, lights.Length);
			((Behaviour)lights[i]).enabled = true;
			currentTimer = Random.Range(timerRandom.x, timerRandom.y);
			switching = false;
		}
	}
}

BepInEx/plugins/plugins/VoiceHUD.dll

Decompiled a day ago
using System;
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 Dissonance;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.UI;
using VoiceHUD.Configuration;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("VoiceHUD")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Displays push-to-talk icon on voice activation")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1+f1e0a0cfa0a629002418c9e0aa3a753676e33192")]
[assembly: AssemblyProduct("VoiceHUD")]
[assembly: AssemblyTitle("VoiceHUD")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace VoiceHUD
{
	[BepInPlugin("5Bit.VoiceHUD", "VoiceHUD", "1.0.4")]
	public class VoiceHUD : BaseUnityPlugin
	{
		private const string modGUID = "5Bit.VoiceHUD";

		private const string modName = "VoiceHUD";

		private const string modVersion = "1.0.4";

		private readonly Harmony harmony = new Harmony("5Bit.VoiceHUD");

		private static VoiceHUD Instance;

		internal static ManualLogSource mls;

		private void Awake()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("5Bit.VoiceHUD");
			Config.Init();
			harmony.PatchAll();
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "VoiceHUD";

		public const string PLUGIN_NAME = "VoiceHUD";

		public const string PLUGIN_VERSION = "1.0.1";
	}
}
namespace VoiceHUD.Patches
{
	[HarmonyPatch(typeof(HUDManager))]
	internal class VoiceHUDPatch
	{
		private static Color Start = new Color(0f, 255f, 0f, 255f);

		private static Color Center = new Color(165f, 255f, 0f, 255f);

		private static Color End = new Color(255f, 0f, 0f, 255f);

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void Update()
		{
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			if (!IngamePlayerSettings.Instance.settings.micEnabled || IngamePlayerSettings.Instance.settings.pushToTalk || (Object)(object)StartOfRound.Instance.voiceChatModule == (Object)null)
			{
				return;
			}
			VoicePlayerState val = StartOfRound.Instance.voiceChatModule.FindPlayer(StartOfRound.Instance.voiceChatModule.LocalPlayerName);
			if (val.IsSpeaking)
			{
				float num = Mathf.Clamp(val.Amplitude * 35f, 0f, 1f);
				if (Config.ColorsEnabled)
				{
					((Graphic)HUDManager.Instance.PTTIcon).color = GetColorByVolume(num * 100f);
				}
				((Behaviour)HUDManager.Instance.PTTIcon).enabled = num > 0.01f;
			}
		}

		public static Color GetColorByVolume(float volume)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			if (volume < 20f)
			{
				return Start;
			}
			if (volume > 70f)
			{
				return End;
			}
			return Center;
		}
	}
}
namespace VoiceHUD.Configuration
{
	internal static class Config
	{
		private const string CONFIG_FILE_NAME = "VoiceHUD.cfg";

		private static ConfigFile config;

		private static ConfigEntry<bool> colorsEnabled;

		public static bool ColorsEnabled => colorsEnabled.Value;

		public static void Init()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			string text = Path.Combine(Paths.ConfigPath, "VoiceHUD.cfg");
			config = new ConfigFile(text, true);
			colorsEnabled = config.Bind<bool>("Config", "Colors enabled", false, "Change icon color based on volume.");
		}
	}
}