Decompiled source of ThermalOverlay v1.3.2

plugins/ThermalOverlay.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using GameData;
using Gear;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.Injection;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Reflection;
using Microsoft.CodeAnalysis;
using Player;
using ReTFO.ThermalOverlay.Config;
using ReTFO.ThermalOverlay.Configurers;
using ReTFO.ThermalOverlay.Factories;
using ReTFO.ThermalOverlay.Interfaces;
using SNetwork;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("ThermalOverlay")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+c9e8a15a79a69ffca0739a38ec89a5278201cf10")]
[assembly: AssemblyProduct("ThermalOverlay")]
[assembly: AssemblyTitle("ThermalOverlay")]
[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 ReTFO.ThermalOverlay
{
	public class AssetBundle
	{
		public const string AssetBundleName = "thermaloverlay";

		private Shader? _thermalOverlayShader;

		public static string AssetDirectory => Path.Combine(Path.GetDirectoryName(Paths.PluginPath) ?? string.Empty, "Assets");

		public static string AssetBundlePath => Path.Combine(AssetDirectory, "ThermalOverlay", "thermaloverlay");

		public Shader? ThermalOverlayShader
		{
			get
			{
				return _thermalOverlayShader ?? (_thermalOverlayShader = this.TryLoadAsset<Shader>("Unlit_HolographicSight_ThermalOverlay.shader"));
			}
			set
			{
				_thermalOverlayShader = value ?? _thermalOverlayShader;
			}
		}

		public T? TryLoadAsset<T>(string assetName) where T : Object
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Expected O, but got Unknown
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Expected O, but got Unknown
			AssetBundle val = AssetBundle.LoadFromFile(AssetBundlePath);
			bool flag = default(bool);
			if ((Object)(object)val == (Object)null)
			{
				Plugin plugin = Plugin.TryGet();
				Plugin plugin2 = plugin;
				if (plugin2 != null)
				{
					ManualLogSource log = ((BasePlugin)plugin2).Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(53, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to load asset bundle ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>("thermaloverlay");
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("\n - Expected location: \"");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(AssetBundlePath);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("\"");
					}
					log.LogError(val2);
				}
				return default(T);
			}
			Object val3 = (Object)(object)((val != null) ? val.LoadAsset(assetName) : null);
			if (val3 == null)
			{
				Plugin plugin3 = Plugin.TryGet();
				if (plugin3 != null)
				{
					ManualLogSource log2 = ((BasePlugin)plugin3).Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(34, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to load ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(assetName);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" from asset bundle ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>("thermaloverlay");
					}
					log2.LogError(val2);
				}
			}
			T val4 = ((val3 != null) ? ((Il2CppObjectBase)val3).TryCast<T>() : default(T));
			if (val4 == null && val3 != null)
			{
				Plugin plugin4 = Plugin.TryGet();
				if (plugin4 != null)
				{
					ManualLogSource log3 = ((BasePlugin)plugin4).Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(50, 3, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to convert ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(assetName);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" to type ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(typeof(T).Name);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" because it is of type ");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(((MemberInfo)val3.GetIl2CppType()).Name);
					}
					log3.LogError(val2);
				}
			}
			return val4;
		}

		public bool TryLoadAsset<T>(string assetName, [NotNullWhen(true)] out T? result) where T : Object
		{
			result = TryLoadAsset<T>(assetName);
			return result != null;
		}

		public T LoadAsset<T>(string assetName) where T : Object
		{
			return TryLoadAsset<T>(assetName) ?? throw new NullReferenceException("Failed to load asset " + assetName);
		}
	}
	public class Il2CppAction : Object
	{
		private Action? _action;

		public Il2CppAction(Action action)
			: base(ClassInjector.DerivedConstructorPointer<Il2CppAction>())
		{
			ClassInjector.DerivedConstructorBody((Il2CppObjectBase)(object)this);
			_action = action;
		}

		public Il2CppAction(IntPtr pointer)
			: base(pointer)
		{
		}

		public void Action()
		{
			if (_action != null)
			{
				_action();
			}
		}

		public static implicit operator Action(Il2CppAction self)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			IntPtr il2CppMethod = IL2CPP.GetIl2CppMethod(((Il2CppObjectBase)self).ObjectClass, false, "Action", "System.Void", Array.Empty<string>());
			return new Action((Object)(object)self, il2CppMethod);
		}
	}
	[HarmonyPatch(typeof(PlayerBackpack))]
	internal static class ItemSpawnPatcher
	{
		[HarmonyPatch("CheckAndCreateBackpackItem")]
		[HarmonyPostfix]
		internal static void OnCreate(PlayerBackpack __instance, ref BackpackItem bpItem, ItemEquippable gearItem, GearIDRange gearIDRange)
		{
			Plugin.Get().OnItemCreated(gearItem, __instance.Owner);
		}
	}
	[BepInPlugin("RoboRyGuy.ThermalOverlay", "ThermalOverlay", "1.3.2")]
	[BepInProcess("GTFO.exe")]
	public class Plugin : BasePlugin
	{
		public const string Name = "ThermalOverlay";

		public const string Author = "RoboRyGuy";

		public const string GUID = "RoboRyGuy.ThermalOverlay";

		public const string Version = "1.3.2";

		private static Plugin? _plugin;

		protected Harmony harmony = new Harmony("RoboRyGuy.ThermalOverlay");

		public const string OverlayGameObjectName = "Thermal Overlay";

		public AssetBundle AssetBundle { get; private set; } = new AssetBundle();


		public ConfigManager ConfigManager { get; private set; } = new ConfigManager();


		public FactoryManager FactoryManager { get; private set; } = new FactoryManager();


		public static Plugin Get()
		{
			return TryGet() ?? throw new NullReferenceException("Tried to retrieve ThermalOverlay, but it was not loaded!");
		}

		public static Plugin? TryGet()
		{
			return _plugin ?? (_plugin = ((BaseChainloader<BasePlugin>)(object)IL2CPPChainloader.Instance).Plugins.FirstOrDefault((KeyValuePair<string, PluginInfo> p) => p.Key == "RoboRyGuy.ThermalOverlay").Value.Instance as Plugin);
		}

		public static bool TryGet([NotNullWhen(true)] out Plugin? plugin)
		{
			plugin = TryGet();
			return plugin != null;
		}

		public override void Load()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			_plugin = this;
			harmony.PatchAll(typeof(ItemSpawnPatcher));
			harmony.PatchAll(((object)this).GetType());
			ClassInjector.RegisterTypeInIl2Cpp(typeof(Il2CppAction));
			ManualLogSource log = ((BasePlugin)this).Log;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(11, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("RoboRyGuy.ThermalOverlay");
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded!");
			}
			log.LogInfo(val);
		}

		public override bool Unload()
		{
			harmony.UnpatchSelf();
			return true;
		}

		public void SetItemNames(ICollection<string> itemNames)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			if (ConfigManager.TryGetUserConfigs(out UserConfigs _))
			{
				ManualLogSource log = ((BasePlugin)this).Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(94, 0, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Changing item names after config file is generated; the config description will be inaccurate!");
				}
				log.LogWarning(val);
			}
			ConfigManager.ItemNames = itemNames;
		}

		public void OnItemCreated(ItemEquippable item, SNet_Player owner)
		{
			ItemEquippable item2 = item;
			SNet_Player owner2 = owner;
			if (!item2.m_gearSpawnComplete)
			{
				item2.GearPartHolder.m_gearPartSpawner.OnAllPartsSpawned += new Il2CppAction(delegate
				{
					ApplyConfig(item2, owner2.IsLocal);
				});
			}
		}

		public void ApplyConfig(ItemEquippable item, bool isLocal)
		{
			string publicGearName = item.GearIDRange.PublicGearName;
			if (!ConfigManager.IsIDEnabled(publicGearName))
			{
				return;
			}
			ThermalConfig config = ConfigManager.GetConfig(publicGearName);
			ConversionContext context = new ConversionContext(this, item, config);
			FactoryManager.RunThermalConverter(config?.Handler, context);
			if (!(ConfigManager.UserConfigs.MakeGunsCold && isLocal))
			{
				return;
			}
			foreach (Renderer componentsInChild in ((Component)item).GetComponentsInChildren<Renderer>())
			{
				if (componentsInChild.sharedMaterial.HasProperty("_ShadingType"))
				{
					componentsInChild.sharedMaterial.SetFloat("_ShadingType", 0f);
				}
			}
		}
	}
	public class Quaternion_JsonConverter : JsonConverter<Quaternion>
	{
		public override void Write(Utf8JsonWriter writer, Quaternion value, JsonSerializerOptions options)
		{
			//IL_000c: 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_002e: 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)
			writer.WriteStartObject();
			writer.WriteNumber("x", value.x);
			writer.WriteNumber("y", value.y);
			writer.WriteNumber("z", value.z);
			writer.WriteNumber("w", value.w);
			writer.WriteEndObject();
		}

		public override Quaternion Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
		{
			//IL_0016: 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)
			if (reader.TokenType != JsonTokenType.StartObject)
			{
				throw new JsonException("Expected StartObject token");
			}
			Quaternion result = default(Quaternion);
			while (reader.Read())
			{
				if (reader.TokenType == JsonTokenType.EndObject)
				{
					return result;
				}
				if (reader.TokenType != JsonTokenType.PropertyName)
				{
					throw new JsonException("Expected PropertyName token");
				}
				string @string = reader.GetString();
				reader.Read();
				switch (@string)
				{
				case "x":
					result.x = reader.GetSingle();
					break;
				case "y":
					result.y = reader.GetSingle();
					break;
				case "z":
					result.z = reader.GetSingle();
					break;
				case "w":
					result.w = reader.GetSingle();
					break;
				default:
					reader.Skip();
					break;
				}
			}
			throw new JsonException("Incomplete Vector4 object");
		}
	}
	public class Vector2_JsonConverter : JsonConverter<Vector2>
	{
		public override void Write(Utf8JsonWriter writer, Vector2 value, JsonSerializerOptions options)
		{
			//IL_000c: 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)
			writer.WriteStartObject();
			writer.WriteNumber("x", value.x);
			writer.WriteNumber("y", value.y);
			writer.WriteEndObject();
		}

		public override Vector2 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
		{
			//IL_0016: 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 (reader.TokenType != JsonTokenType.StartObject)
			{
				throw new JsonException("Expected StartObject token");
			}
			Vector2 result = default(Vector2);
			while (reader.Read())
			{
				if (reader.TokenType == JsonTokenType.EndObject)
				{
					return result;
				}
				if (reader.TokenType != JsonTokenType.PropertyName)
				{
					throw new JsonException("Expected PropertyName token");
				}
				string @string = reader.GetString();
				reader.Read();
				if (!(@string == "x"))
				{
					if (@string == "y")
					{
						result.y = reader.GetSingle();
					}
					else
					{
						reader.Skip();
					}
				}
				else
				{
					result.x = reader.GetSingle();
				}
			}
			throw new JsonException("Incomplete Vector2 object");
		}
	}
	public class Vector3_JsonConverter : JsonConverter<Vector3>
	{
		public override void Write(Utf8JsonWriter writer, Vector3 value, JsonSerializerOptions options)
		{
			//IL_000c: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			writer.WriteStartObject();
			writer.WriteNumber("x", value.x);
			writer.WriteNumber("y", value.y);
			writer.WriteNumber("z", value.z);
			writer.WriteEndObject();
		}

		public override Vector3 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
		{
			//IL_0016: 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)
			if (reader.TokenType != JsonTokenType.StartObject)
			{
				throw new JsonException("Expected StartObject token");
			}
			Vector3 result = default(Vector3);
			while (reader.Read())
			{
				if (reader.TokenType == JsonTokenType.EndObject)
				{
					return result;
				}
				if (reader.TokenType != JsonTokenType.PropertyName)
				{
					throw new JsonException("Expected PropertyName token");
				}
				string @string = reader.GetString();
				reader.Read();
				switch (@string)
				{
				case "x":
					result.x = reader.GetSingle();
					break;
				case "y":
					result.y = reader.GetSingle();
					break;
				case "z":
					result.z = reader.GetSingle();
					break;
				default:
					reader.Skip();
					break;
				}
			}
			throw new JsonException("Incomplete Vector3 object");
		}
	}
	public class Vector4_JsonConverter : JsonConverter<Vector4>
	{
		public override void Write(Utf8JsonWriter writer, Vector4 value, JsonSerializerOptions options)
		{
			//IL_000c: 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_002e: 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)
			writer.WriteStartObject();
			writer.WriteNumber("x", value.x);
			writer.WriteNumber("y", value.y);
			writer.WriteNumber("z", value.z);
			writer.WriteNumber("w", value.w);
			writer.WriteEndObject();
		}

		public override Vector4 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
		{
			//IL_0016: 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)
			if (reader.TokenType != JsonTokenType.StartObject)
			{
				throw new JsonException("Expected StartObject token");
			}
			Vector4 result = default(Vector4);
			while (reader.Read())
			{
				if (reader.TokenType == JsonTokenType.EndObject)
				{
					return result;
				}
				if (reader.TokenType != JsonTokenType.PropertyName)
				{
					throw new JsonException("Expected PropertyName token");
				}
				string @string = reader.GetString();
				reader.Read();
				switch (@string)
				{
				case "x":
					result.x = reader.GetSingle();
					break;
				case "y":
					result.y = reader.GetSingle();
					break;
				case "z":
					result.z = reader.GetSingle();
					break;
				case "w":
					result.w = reader.GetSingle();
					break;
				default:
					reader.Skip();
					break;
				}
			}
			throw new JsonException("Incomplete Vector4 object");
		}
	}
}
namespace ReTFO.ThermalOverlay.Interfaces
{
	public interface IMaterialGenerator
	{
		Material GenerateMaterial(string? thisName, ConversionContext context);
	}
	public interface IMeshGenerator
	{
		Mesh GenerateMesh(string? thisName, ConversionContext context);
	}
	public interface IOverlayGenerator
	{
		bool GenerateOverlay(string? thisName, ConversionContext context);
	}
	public interface ISightConverter
	{
		bool ConvertSight(string? thisName, ConversionContext context);
	}
	public interface ITextureGenerator
	{
		Texture GenerateTexture(string? thisName, ConversionContext context);
	}
	public interface IThermalConverter
	{
		void ConvertItem(string? thisName, ConversionContext context);
	}
}
namespace ReTFO.ThermalOverlay.Configurers
{
	public class ThermalConverter_Auto : IThermalConverter
	{
		public const string Name = "Auto";

		public virtual void ConvertItem(string? thisName, ConversionContext context)
		{
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Expected O, but got Unknown
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Expected O, but got Unknown
			//IL_03f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fd: Expected O, but got Unknown
			//IL_039a: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a1: Expected O, but got Unknown
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Expected O, but got Unknown
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Expected O, but got Unknown
			//IL_031c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0323: Expected O, but got Unknown
			Renderer val = null;
			if (context.Item.GearPartHolder.SightData != null)
			{
				GameObject sightPart = context.Item.GearPartHolder.SightPart;
				val = ((sightPart != null) ? ((IEnumerable<Renderer>)sightPart.GetComponentsInChildren<Renderer>()).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => r.sharedMaterial.HasProperty("_ReticuleA"))) : null);
			}
			else if ((Object)(object)context.Item.GearPartHolder.ToolScreenPart != (Object)null)
			{
				GameObject sightPart2 = context.Item.GearPartHolder.SightPart;
				val = ((sightPart2 != null) ? ((IEnumerable<Renderer>)sightPart2.GetComponentsInChildren<Renderer>()).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r.sharedMaterial.shader).name == "Cell/Player/Display_GearShader")) : null);
			}
			bool flag = true;
			bool flag2 = true;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag3 = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					switch (text)
					{
					case "SightOnly":
						flag2 = false;
						break;
					case "OverlayOnly":
						flag = false;
						break;
					case "AllowNone":
						flag = false;
						flag2 = false;
						break;
					default:
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(137, 1, ref flag3);
						if (flag3)
						{
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("ThermalConverter_Auto expected one of { \"AllowAll\", \"OverlayOnly\", \"SightOnly\", \"AllowNone\" } for its first parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("\"");
						}
						log.LogError(val2);
						break;
					}
					case "AllowAll":
						break;
					}
				}
			}
			if (parameters.Length > 1)
			{
				ManualLogSource log2 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(49, 1, ref flag3);
				if (flag3)
				{
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("ThermalConverter_Auto ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(FactoryManager.FormatParams(parameters[1..]));
				}
				log2.LogWarning(val3);
			}
			bool flag4 = false;
			if ((Object)(object)val != (Object)null && flag)
			{
				context.Renderer = val;
				Shader thermalOverlayShader = context.Plugin.AssetBundle.ThermalOverlayShader;
				if ((Object)(object)thermalOverlayShader == (Object)null)
				{
					ManualLogSource log3 = context.Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(67, 0, ref flag3);
					if (flag3)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("ThermalConverter_Auto failed; could not load thermal overlay shader");
					}
					log3.LogError(val2);
					return;
				}
				if (((IEnumerable<Material>)context.Renderer.sharedMaterials).Select((Material m) => m.shader).Contains(thermalOverlayShader))
				{
					ManualLogSource log4 = context.Log;
					BepInExDebugLogInterpolatedStringHandler val4 = new BepInExDebugLogInterpolatedStringHandler(73, 1, ref flag3);
					if (flag3)
					{
						((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("Skipping sight conversion on item \"");
						((BepInExLogInterpolatedStringHandler)val4).AppendFormatted<string>(((Object)context.Item).name);
						((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("\" due to sight already being converted");
					}
					log4.LogDebug(val4);
					return;
				}
				bool flag5 = ((Object)val.sharedMaterial.shader).name.Contains("thermal", StringComparison.OrdinalIgnoreCase);
				flag4 = context.Plugin.FactoryManager.RunSightConverter(context.Config?.SightConverter, context);
			}
			if (!flag4 && flag2)
			{
				Transform obj = ((Component)context.Item).transform.Find("Thermal Overlay");
				GameObject val5 = ((obj != null) ? ((Component)obj).gameObject : null);
				if ((Object)(object)val5 != (Object)null)
				{
					ManualLogSource log5 = context.Log;
					BepInExDebugLogInterpolatedStringHandler val4 = new BepInExDebugLogInterpolatedStringHandler(73, 1, ref flag3);
					if (flag3)
					{
						((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("Skipping overlay creation on item \"");
						((BepInExLogInterpolatedStringHandler)val4).AppendFormatted<string>(((Object)context.Item).name);
						((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("\" due to overlay already being created");
					}
					log5.LogDebug(val4);
					return;
				}
				flag4 = context.Factory.RunOverlayGenerator(context.Config?.OverlayGenerator, context);
			}
			if (flag4)
			{
				if ((Object)(object)context.Material == (Object)null)
				{
					ManualLogSource log6 = context.Log;
					BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(93, 0, ref flag3);
					if (flag3)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Error: A converter or generator has failed to set the material property for ConversionContext");
					}
					log6.LogError(val2);
				}
				else
				{
					FactoryManager.CalcScopeCenter(context);
					ApplyCleanScope(context);
					context.Config?.MaterialConfig.ApplyAll(context.Material, context);
				}
			}
			else
			{
				ManualLogSource log7 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(62, 1, ref flag3);
				if (flag3)
				{
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("ThermalConverter_Auto: conversion ended in failure for item \"");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(((Object)context.Item).name);
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\"");
				}
				log7.LogWarning(val3);
			}
		}

		public static void ApplyCleanScope(ConversionContext context)
		{
			if ((Object)(object)context.Material == (Object)null)
			{
				context.Log.LogError((object)"Cannot ApplyCleanScope when the scope has no material");
			}
			else if (((BaseChainloader<BasePlugin>)(object)IL2CPPChainloader.Instance).Plugins.Any((KeyValuePair<string, PluginInfo> p) => p.Key.Contains("CleanScopes")))
			{
				context.Material.SetFloat("_SightDirt", 0f);
			}
		}
	}
}
namespace ReTFO.ThermalOverlay.Factories
{
	public class ConversionContext
	{
		public Plugin Plugin;

		public ItemEquippable Item;

		public Renderer? Renderer;

		public Material? Material;

		public ThermalConfig? Config;

		public ManualLogSource Log => ((BasePlugin)Plugin).Log;

		public FactoryManager Factory => Plugin.FactoryManager;

		public ConversionContext(Plugin plugin, ItemEquippable item)
		{
			Plugin = plugin;
			Item = item;
		}

		public ConversionContext(Plugin plugin, ItemEquippable item, ThermalConfig? config)
		{
			Plugin = plugin;
			Item = item;
			Config = config;
		}
	}
	public class FactoryManager
	{
		private SortedList<string, IThermalConverter> thermalConverters = new SortedList<string, IThermalConverter>();

		private int defaultThermalConverter = -1;

		private SortedList<string, ISightConverter> sightConverters = new SortedList<string, ISightConverter>();

		private int defaultSightConverter = -1;

		private SortedList<string, IOverlayGenerator> overlayGenerators = new SortedList<string, IOverlayGenerator>();

		private int defaultoverlayGenerator = -1;

		private SortedList<string, IMeshGenerator> meshGenerators = new SortedList<string, IMeshGenerator>();

		private int defaultMeshGenerator = -1;

		private SortedList<string, IMaterialGenerator> materialGenerators = new SortedList<string, IMaterialGenerator>();

		private int defaultMaterialGenerator = -1;

		private SortedList<string, ITextureGenerator> textureGenerators = new SortedList<string, ITextureGenerator>();

		private int defaultTextureGenerator = -1;

		public FactoryManager()
		{
			AddThermalConverter("Auto", new ThermalConverter_Auto(), makeDefault: true);
			AddSightConverter("Standard", new SightConverter_Standard(), makeDefault: true);
			AddOverlayGenerator("Standard", new OverlayGenerator_Standard(), makeDefault: true);
			AddOverlayGenerator("Load", new OverlayGenerator_Load());
			AddMaterialGenerator("PDW", new MaterialGenerator_PDW());
			AddMaterialGenerator("PR", new MaterialGenerator_PR());
			AddMaterialGenerator("Load", new MaterialGenerator_Load());
			AddMaterialGenerator("Auto", new MaterialGenerator_Auto(), makeDefault: true);
			AddMeshGenerator("Plane", new MeshGenerator_Plane());
			AddMeshGenerator("Diamond", new MeshGenerator_Diamond(), makeDefault: true);
			AddTextureGenerator("black", new TextureGenerator_Simple(() => (Texture)(object)Texture2D.blackTexture));
			AddTextureGenerator("gray", new TextureGenerator_Simple(() => (Texture)(object)Texture2D.grayTexture));
			AddTextureGenerator("linearGray", new TextureGenerator_Simple(() => (Texture)(object)Texture2D.linearGrayTexture));
			AddTextureGenerator("normal", new TextureGenerator_Simple(() => (Texture)(object)Texture2D.normalTexture));
			AddTextureGenerator("red", new TextureGenerator_Simple(() => (Texture)(object)Texture2D.redTexture));
			AddTextureGenerator("white", new TextureGenerator_Simple(() => (Texture)(object)Texture2D.whiteTexture));
			AddTextureGenerator("Load", new TextureGenerator_Load());
			AddTextureGenerator("Bloom", new TextureGenerator_Bloom(), makeDefault: true);
		}

		public static string? BaseName(string? name)
		{
			int num = name?.IndexOf('(') ?? (-1);
			return num switch
			{
				-1 => name, 
				0 => null, 
				_ => name.Substring(0, num), 
			};
		}

		public static string[] GetParameters(string? name)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			if (name == null)
			{
				return Array.Empty<string>();
			}
			int num = name.IndexOf('(');
			if (num < 0)
			{
				return Array.Empty<string>();
			}
			if (name.Last() != ')')
			{
				ManualLogSource log = ((BasePlugin)Plugin.Get()).Log;
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(39, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Expected ')' at end of texture name: '");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("'");
				}
				log.LogError(val);
				return (from s in name.Substring(num + 1).Split(',')
					select s.Trim()).ToArray();
			}
			return (from s in name.Substring(num + 1, name.Length - num - 2).Split(',')
				select s.Trim()).ToArray();
		}

		public static string FormatParams(string[]? paras)
		{
			if (paras == null)
			{
				return "\"<null>\"";
			}
			return "\"" + string.Join(", ", paras) + "\"";
		}

		public static bool TryCalcScopeCenter(ConversionContext context)
		{
			//IL_0033: 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_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_0086: Unknown result type (might be due to invalid IL or missing references)
			Renderer renderer = context.Renderer;
			if ((Object)(object)renderer == (Object)null)
			{
				return false;
			}
			if ((Object)(object)context.Material == (Object)null)
			{
				return false;
			}
			Vector3 val = ((Component)renderer).transform.InverseTransformPoint(context.Item.SightLookAlign.position);
			Vector4 val2 = default(Vector4);
			val2.x = val.x;
			val2.y = val.y;
			val2.z = val.z;
			val2.w = 1f;
			Vector4 val3 = val2;
			context.Material.SetVector("_ScopeCenter", val3);
			return true;
		}

		public static void CalcScopeCenter(ConversionContext context)
		{
			if (!TryCalcScopeCenter(context))
			{
				if ((Object)(object)context.Renderer == (Object)null && (Object)(object)context.Material == (Object)null)
				{
					throw new NullReferenceException("CalcScopeCenter was passed null parameters: Renderer and Material");
				}
				if ((Object)(object)context.Renderer == (Object)null)
				{
					throw new NullReferenceException("CalcScopeCenter was passed a null parameter: Renderer");
				}
				if ((Object)(object)context.Material == (Object)null)
				{
					throw new NullReferenceException("CalcScopeCenter was passed a null parameter: Material");
				}
				throw new NullReferenceException("CalcScopeCenter encountered an unknown issue");
			}
		}

		public void AddThermalConverter(string name, IThermalConverter converter, bool makeDefault = false)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			name = BaseName(name);
			if (thermalConverters.ContainsKey(name))
			{
				Plugin plugin = Plugin.TryGet();
				if (plugin != null)
				{
					ManualLogSource log = ((BasePlugin)plugin).Log;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(37, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Overwriting ThermalConvert \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\" with \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(converter.GetType().Name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
					}
					log.LogWarning(val);
				}
			}
			thermalConverters[name] = converter;
			int num = thermalConverters.IndexOfKey(name);
			if (makeDefault)
			{
				defaultThermalConverter = num;
			}
			else if (num <= defaultThermalConverter)
			{
				defaultThermalConverter++;
			}
		}

		public IThermalConverter GetDefaultThermalConverter()
		{
			return thermalConverters.ElementAt(defaultThermalConverter).Value;
		}

		public bool TryGetThermalConverter(string? name, out IThermalConverter converter)
		{
			int num = ((name != null) ? thermalConverters.IndexOfKey(BaseName(name)) : (-1));
			if (num >= 0)
			{
				converter = thermalConverters.ElementAt(num).Value;
			}
			else
			{
				converter = GetDefaultThermalConverter();
			}
			return num >= 0;
		}

		public IThermalConverter GetThermalConverter(string? name)
		{
			TryGetThermalConverter(name, out IThermalConverter converter);
			return converter;
		}

		public void RunThermalConverter(string? name, ConversionContext context)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (!TryGetThermalConverter(name, out IThermalConverter converter) && name != null)
			{
				ManualLogSource log = context.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(55, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to find thermal converter \"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\", using default (\"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(converter.GetType().Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\")");
				}
				log.LogWarning(val);
			}
			converter.ConvertItem(name, context);
		}

		public void AddSightConverter(string name, ISightConverter converter, bool makeDefault = false)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			name = BaseName(name);
			if (sightConverters.ContainsKey(name))
			{
				Plugin plugin = Plugin.TryGet();
				if (plugin != null)
				{
					ManualLogSource log = ((BasePlugin)plugin).Log;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(37, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Overwriting SightConverter \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\" with \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(converter.GetType().Name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
					}
					log.LogWarning(val);
				}
			}
			sightConverters[name] = converter;
			int num = sightConverters.IndexOfKey(name);
			if (makeDefault)
			{
				defaultSightConverter = num;
			}
			else if (num <= defaultSightConverter)
			{
				defaultSightConverter++;
			}
		}

		public ISightConverter GetDefaultSightConverter()
		{
			return sightConverters.ElementAt(defaultSightConverter).Value;
		}

		public bool TryGetSightConverter(string? name, out ISightConverter converter)
		{
			int num = ((name != null) ? sightConverters.IndexOfKey(BaseName(name)) : (-1));
			if (num >= 0)
			{
				converter = sightConverters.ElementAt(num).Value;
			}
			else
			{
				converter = GetDefaultSightConverter();
			}
			return num >= 0;
		}

		public ISightConverter GetSightConverter(string? name)
		{
			TryGetSightConverter(name, out ISightConverter converter);
			return converter;
		}

		public bool RunSightConverter(string? name, ConversionContext context)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (!TryGetSightConverter(name, out ISightConverter converter) && name != null)
			{
				ManualLogSource log = context.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(53, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to find sight converter \"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\", using default (\"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(converter.GetType().Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\")");
				}
				log.LogWarning(val);
			}
			return converter.ConvertSight(name, context);
		}

		public void AddOverlayGenerator(string name, IOverlayGenerator generator, bool makeDefault = false)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			name = BaseName(name);
			if (overlayGenerators.ContainsKey(name))
			{
				Plugin plugin = Plugin.TryGet();
				if (plugin != null)
				{
					ManualLogSource log = ((BasePlugin)plugin).Log;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(39, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Overwriting OverlayGenerator \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\" with \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(generator.GetType().Name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
					}
					log.LogWarning(val);
				}
			}
			overlayGenerators[name] = generator;
			int num = overlayGenerators.IndexOfKey(name);
			if (makeDefault)
			{
				defaultoverlayGenerator = num;
			}
			else if (num <= defaultoverlayGenerator)
			{
				defaultoverlayGenerator++;
			}
		}

		public IOverlayGenerator GetDefaultOverlayGenerator()
		{
			return overlayGenerators.ElementAt(defaultoverlayGenerator).Value;
		}

		public bool TryGetOverlayGenerator(string? name, out IOverlayGenerator converter)
		{
			int num = ((name != null) ? overlayGenerators.IndexOfKey(BaseName(name)) : (-1));
			if (num >= 0)
			{
				converter = overlayGenerators.ElementAt(num).Value;
			}
			else
			{
				converter = GetDefaultOverlayGenerator();
			}
			return num >= 0;
		}

		public IOverlayGenerator GetOverlayGenerator(string? name)
		{
			TryGetOverlayGenerator(name, out IOverlayGenerator converter);
			return converter;
		}

		public bool RunOverlayGenerator(string? name, ConversionContext context)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (!TryGetOverlayGenerator(name, out IOverlayGenerator converter) && name != null)
			{
				ManualLogSource log = context.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(55, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to find overlay generator \"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\", using default (\"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(converter.GetType().Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\")");
				}
				log.LogWarning(val);
			}
			return converter.GenerateOverlay(name, context);
		}

		public void AddMeshGenerator(string name, IMeshGenerator generator, bool makeDefault = false)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			name = BaseName(name);
			if (meshGenerators.ContainsKey(name))
			{
				Plugin plugin = Plugin.TryGet();
				if (plugin != null)
				{
					ManualLogSource log = ((BasePlugin)plugin).Log;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(36, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Overwriting MeshGenerator \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\" with \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(generator.GetType().Name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
					}
					log.LogWarning(val);
				}
			}
			meshGenerators[name] = generator;
			int num = meshGenerators.IndexOfKey(name);
			if (makeDefault)
			{
				defaultMeshGenerator = num;
			}
			else if (num <= defaultMeshGenerator)
			{
				defaultMeshGenerator++;
			}
		}

		public IMeshGenerator GetDefaultMeshGenerator()
		{
			return meshGenerators.ElementAt(defaultMeshGenerator).Value;
		}

		public bool TryGetMeshGenerator(string? name, out IMeshGenerator generator)
		{
			int num = ((name != null) ? meshGenerators.IndexOfKey(BaseName(name)) : (-1));
			if (num >= 0)
			{
				generator = meshGenerators.ElementAt(num).Value;
			}
			else
			{
				generator = GetDefaultMeshGenerator();
			}
			return num >= 0;
		}

		public IMeshGenerator GetMeshGenerator(string? name)
		{
			TryGetMeshGenerator(name, out IMeshGenerator generator);
			return generator;
		}

		public Mesh RunMeshGenerator(string? name, ConversionContext context)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (!TryGetMeshGenerator(name, out IMeshGenerator generator) && name != null)
			{
				ManualLogSource log = context.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(52, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to find mesh generator \"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\", using default (\"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(generator.GetType().Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\")");
				}
				log.LogWarning(val);
			}
			return generator.GenerateMesh(name, context);
		}

		public void AddMaterialGenerator(string name, IMaterialGenerator generator, bool makeDefault = false)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			name = BaseName(name);
			if (materialGenerators.ContainsKey(name))
			{
				Plugin plugin = Plugin.TryGet();
				if (plugin != null)
				{
					ManualLogSource log = ((BasePlugin)plugin).Log;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(40, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Overwriting MaterialGenerator \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\" with \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(generator.GetType().Name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
					}
					log.LogWarning(val);
				}
			}
			materialGenerators[name] = generator;
			int num = materialGenerators.IndexOfKey(name);
			if (makeDefault)
			{
				defaultMaterialGenerator = num;
			}
			else if (num <= defaultMaterialGenerator)
			{
				defaultMaterialGenerator++;
			}
		}

		public IMaterialGenerator GetDefaultMaterialGenerator()
		{
			return materialGenerators.ElementAt(defaultMaterialGenerator).Value;
		}

		public bool TryGetMaterialGenerator(string? name, out IMaterialGenerator generator)
		{
			int num = ((name != null) ? materialGenerators.IndexOfKey(BaseName(name)) : (-1));
			if (num >= 0)
			{
				generator = materialGenerators.ElementAt(num).Value;
			}
			else
			{
				generator = GetDefaultMaterialGenerator();
			}
			return num >= 0;
		}

		public IMaterialGenerator GetMaterialGenerator(string? name)
		{
			TryGetMaterialGenerator(name, out IMaterialGenerator generator);
			return generator;
		}

		public Material RunMaterialGenerator(string? name, ConversionContext context)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (!TryGetMaterialGenerator(name, out IMaterialGenerator generator) && name != null)
			{
				ManualLogSource log = context.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(56, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to find material generator \"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\", using default (\"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(generator.GetType().Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\")");
				}
				log.LogWarning(val);
			}
			return generator.GenerateMaterial(name, context);
		}

		public void AddTextureGenerator(string name, ITextureGenerator generator, bool makeDefault = false)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			name = BaseName(name);
			if (textureGenerators.ContainsKey(name))
			{
				Plugin plugin = Plugin.TryGet();
				if (plugin != null)
				{
					ManualLogSource log = ((BasePlugin)plugin).Log;
					bool flag = default(bool);
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(39, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Overwriting TextureGenerator \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\" with \"");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(generator.GetType().Name);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
					}
					log.LogWarning(val);
				}
			}
			textureGenerators[name] = generator;
			int num = textureGenerators.IndexOfKey(name);
			if (makeDefault)
			{
				defaultTextureGenerator = num;
			}
			else if (num <= defaultTextureGenerator)
			{
				defaultTextureGenerator++;
			}
		}

		public ITextureGenerator GetDefaultTextureGenerator()
		{
			return textureGenerators.ElementAt(defaultTextureGenerator).Value;
		}

		public bool TryGetTextureGenerator(string? name, out ITextureGenerator generator)
		{
			int num = ((name != null) ? textureGenerators.IndexOfKey(BaseName(name)) : (-1));
			if (num >= 0)
			{
				generator = textureGenerators.ElementAt(num).Value;
			}
			else
			{
				generator = GetDefaultTextureGenerator();
			}
			return num >= 0;
		}

		public ITextureGenerator GetTextureGenerator(string? name)
		{
			TryGetTextureGenerator(name, out ITextureGenerator generator);
			return generator;
		}

		public Texture RunTextureGenerator(string? name, ConversionContext context)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			if (!TryGetTextureGenerator(name, out ITextureGenerator generator) && name != null)
			{
				ManualLogSource log = context.Log;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(55, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to find texture generator \"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\", using default (\"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(generator.GetType().Name);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\")");
				}
				log.LogWarning(val);
			}
			return generator.GenerateTexture(name, context);
		}
	}
	public class MaterialGenerator_Auto : IMaterialGenerator
	{
		public const string Name = "Auto";

		public static readonly List<string> ThermalTextures = new List<string> { "rainbow.png", "Thremal_Gradient_FLIR.png", "blackhot.png", "lava.png", "whitehot.png", "Thremal_Gradient_EVIL.png" };

		public virtual Material GenerateMaterial(string? thisName, ConversionContext context)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Expected O, but got Unknown
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Expected O, but got Unknown
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Expected O, but got Unknown
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0249: Expected O, but got Unknown
			Shader thermalOverlayShader = context.Plugin.AssetBundle.ThermalOverlayShader;
			if ((Object)(object)thermalOverlayShader == (Object)null)
			{
				context.Log.LogError((object)"SightConverter_Standard failed; failed to load thermal shader");
				return new Material(Shader.Find("Hidden/InternalErrorShader"));
			}
			ArchetypeDataBlock archetypeData = context.Item.ArchetypeData;
			float num = Vector2.Dot((Vector2)((archetypeData != null) ? archetypeData.DamageFalloff : new Vector2(0f, 0f)), new Vector2(0.5f, 0.5f));
			bool flag = true;
			bool flag2 = num <= 45f;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag3 = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (text == "Transparent")
					{
						flag = true;
					}
					else if (text == "Opaque")
					{
						flag = false;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(108, 1, ref flag3);
						if (flag3)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MaterialGenerator_Auto expected either \"Transparent\" or \"Opaque\" for its first parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log.LogError(val);
					}
				}
			}
			if (parameters.Length > 1)
			{
				string text2 = parameters[1];
				if (text2.Length != 0)
				{
					if (text2 == "PDW")
					{
						flag2 = true;
					}
					else if (text2 == "PR")
					{
						flag2 = false;
					}
					else
					{
						ManualLogSource log2 = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(97, 1, ref flag3);
						if (flag3)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MaterialGenerator_Auto expected either \"PDW\" or \"PR\" for its second parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text2);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log2.LogError(val);
					}
				}
			}
			if (parameters.Length > 2)
			{
				ManualLogSource log3 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(50, 1, ref flag3);
				if (flag3)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("MaterialGenerator_Auto ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(FactoryManager.FormatParams(parameters[2..]));
				}
				log3.LogWarning(val2);
			}
			Material val3 = new Material(thermalOverlayShader)
			{
				name = $"ThermalOverlay - Auto ({(flag ? "Transparent" : "Opaque")}, {(flag2 ? "PDW" : "PR")})",
				hideFlags = (HideFlags)61
			};
			MaterialConfig materialConfig = ((!flag2) ? MaterialGenerator_PR.PRMaterialConfig.Clone() : MaterialGenerator_PDW.PDWMaterialConfig.Clone());
			int num2 = ((GameDataBlockBase<GearSightPartDataBlock>)(object)context.Item.GearPartHolder.SightData)?.persistentID.GetHashCode() ?? context.Item.GearIDRange.GetChecksum().GetHashCode();
			num2 = Mathf.Abs(num2 % ThermalTextures.Count);
			materialConfig.HeatTex = "Load(ThermalOverlay, " + ThermalTextures[num2] + ")";
			if (flag)
			{
				materialConfig.HeatTex = materialConfig.HeatTex.Value.Replace(".png", "_Transparent.png");
				materialConfig.AmbientTemp = 0.01f;
				materialConfig.BackgroundTemp = 0.01f;
			}
			materialConfig.Zoom = 0f;
			materialConfig.OffAngleFade = 0f;
			materialConfig.ApplyAllWithDefaults(val3, context);
			return val3;
		}
	}
	public class MaterialGenerator_Load : IMaterialGenerator
	{
		public const string Name = "Load";

		public static string GameDataPath => Path.Combine(Path.GetDirectoryName(Paths.PluginPath) ?? "", "GameData");

		public Material GenerateMaterial(string? thisName, ConversionContext context)
		{
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Expected O, but got Unknown
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Expected O, but got Unknown
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Expected O, but got Unknown
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Expected O, but got Unknown
			//IL_00f9: 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_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Expected O, but got Unknown
			Shader thermalOverlayShader = context.Plugin.AssetBundle.ThermalOverlayShader;
			if ((Object)(object)thermalOverlayShader == (Object)null)
			{
				context.Log.LogError((object)"Failed to generate material; overlay shader failed to load");
				return new Material(Shader.Find("Hidden/InternalErrorShader"));
			}
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag = default(bool);
			if (parameters.Length == 0)
			{
				ManualLogSource log = context.Log;
				BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(86, 0, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MaterialGenerator_Load expected a file path in its parameters, but instead got nothing");
				}
				log.LogDebug(val);
				return new Material(Shader.Find("Hidden/InternalErrorShader"));
			}
			string text = Path.Combine(parameters);
			string text2 = Path.Combine(GameDataPath, text);
			BepInExErrorLogInterpolatedStringHandler val2;
			if (File.Exists(text2))
			{
				string json = File.ReadAllText(text2);
				MaterialConfig materialConfig;
				try
				{
					materialConfig = JsonSerializer.Deserialize<MaterialConfig>(json);
				}
				catch (JsonException)
				{
					ManualLogSource log2 = context.Log;
					val2 = new BepInExErrorLogInterpolatedStringHandler(73, 1, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("MaterialGenerator_Load failed to deserialize material config from file \"");
						((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(text);
						((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("\"");
					}
					log2.LogError(val2);
					throw;
				}
				Material val3 = new Material(thermalOverlayShader)
				{
					name = "Thermal Overlay - " + text,
					hideFlags = (HideFlags)61
				};
				materialConfig.ApplyAllWithDefaults(val3, context);
				return val3;
			}
			ManualLogSource log3 = context.Log;
			val2 = new BepInExErrorLogInterpolatedStringHandler(88, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("MaterialGenerator_Load failed to load file; file not found\n - File name: ");
				((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(text);
				((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("\n - Full path: ");
				((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(text2);
			}
			log3.LogError(val2);
			return new Material(Shader.Find("Hidden/InternalErrorShader"));
		}
	}
	public class MaterialGenerator_PDW : IMaterialGenerator
	{
		public const string Name = "PDW";

		public static readonly MaterialConfig PDWMaterialConfig = new MaterialConfig
		{
			Zoom = 0.25f,
			ScreenIntensity = 0.1f,
			HeatTex = "Load(ThermalOverlay, Thremal_Gradient_FLIR.png)",
			HeatFalloff = 0.03f,
			FogFalloff = 0.7f,
			AlbedoColorFactor = 0.1f,
			OcclusionHeat = 0.25f,
			BodyOcclusionHeat = 1f,
			DistortionTex = "Load(ThermalOverlay, Scanline.png)",
			DistortionSpeed = 3f,
			DistortionSignal = "Load(ThermalOverlay, ThermalDistortionSignal.png)",
			DistortionSignalSpeed = 0.025f,
			DistortionMin = 0.1f,
			DistortionMinShadowEnemies = 0.3f,
			DistortionMaxShadowEnemies = 0.9f,
			DistortionSignalSpeedShadowEnemies = 0.05f,
			ShadowEnemyFresnel = 50f,
			ShadowEnemyHeat = 0.6f,
			MainTex = "red",
			FPSRenderingEnabled = true
		};

		public virtual Material GenerateMaterial(string? thisName, ConversionContext context)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_010c: 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)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Expected O, but got Unknown
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Expected O, but got Unknown
			Shader thermalOverlayShader = context.Plugin.AssetBundle.ThermalOverlayShader;
			if ((Object)(object)thermalOverlayShader == (Object)null)
			{
				context.Log.LogError((object)"Failed to generate material; overlay shader failed to load");
				return new Material(Shader.Find("Hidden/InternalErrorShader"));
			}
			bool flag = true;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag2 = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (text == "Transparent")
					{
						flag = true;
					}
					else if (text == "Opaque")
					{
						flag = false;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(86, 1, ref flag2);
						if (flag2)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MaterialGenerator_PDW passed bad first parameter: ");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", expected \"Transparent\" or \"Opaque\"");
						}
						log.LogError(val);
					}
				}
			}
			if (parameters.Length > 1)
			{
				ManualLogSource log2 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(49, 1, ref flag2);
				if (flag2)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("MaterialGenerator_PDW ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(FactoryManager.FormatParams(parameters[1..]));
				}
				log2.LogWarning(val2);
			}
			Material val3 = new Material(thermalOverlayShader)
			{
				name = "ThermalOverlay - PDW (" + (flag ? "Transparent" : "Opaque") + ")",
				hideFlags = (HideFlags)61
			};
			MaterialConfig materialConfig = PDWMaterialConfig.Clone();
			if (flag)
			{
				materialConfig.HeatTex = materialConfig.HeatTex.Value.Replace(".png", "_Transparent.png");
				materialConfig.AmbientTemp = 0.01f;
				materialConfig.BackgroundTemp = 0.01f;
			}
			materialConfig.Zoom = 0f;
			materialConfig.OffAngleFade = 0f;
			materialConfig.ApplyAllWithDefaults(val3, context);
			return val3;
		}
	}
	public class MaterialGenerator_PR : IMaterialGenerator
	{
		public const string Name = "PR";

		public static readonly MaterialConfig PRMaterialConfig = new MaterialConfig
		{
			Zoom = 0.25f,
			RatioAdjust = 0.89f,
			ScreenIntensity = 0.152f,
			HeatTex = "Load(ThermalOverlay, Thremal_Gradient_EVIL.png)",
			HeatFalloff = 0.01f,
			FogFalloff = 0.5f,
			BackgroundTemp = 0f,
			AmbientColorFactor = 5f,
			AlbedoColorFactor = 0.5f,
			AmbientTemp = 0.15f,
			OcclusionHeat = 0.25f,
			BodyOcclusionHeat = 1f,
			DistortionTex = "Load(ThermalOverlay, Scanline.png)",
			DistortionScale = 1f,
			DistortionSpeed = 1f,
			DistortionSignal = "Load(ThermalOverlay, ThermalDistortionSignal.png)",
			DistortionSignalSpeed = 0.025f,
			DistortionMin = 0.1f,
			DistortionMax = 0.4f,
			DistortionMinShadowEnemies = 0.3f,
			DistortionMaxShadowEnemies = 0.9f,
			DistortionSignalSpeedShadowEnemies = 0.05f,
			ShadowEnemyFresnel = 50f,
			ShadowEnemyHeat = 0.6f,
			MainTex = "red",
			FPSRenderingEnabled = true
		};

		public virtual Material GenerateMaterial(string? thisName, ConversionContext context)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_010c: 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)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Expected O, but got Unknown
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Expected O, but got Unknown
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Expected O, but got Unknown
			Shader thermalOverlayShader = context.Plugin.AssetBundle.ThermalOverlayShader;
			if ((Object)(object)thermalOverlayShader == (Object)null)
			{
				context.Log.LogError((object)"Failed to generate material; overlay shader failed to load");
				return new Material(Shader.Find("Hidden/InternalErrorShader"));
			}
			bool flag = true;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag2 = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (text == "Transparent")
					{
						flag = true;
					}
					else if (text == "Opaque")
					{
						flag = false;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(85, 1, ref flag2);
						if (flag2)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MaterialGenerator_PR passed bad first parameter: ");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", expected \"Transparent\" or \"Opaque\"");
						}
						log.LogError(val);
					}
				}
			}
			if (parameters.Length > 1)
			{
				ManualLogSource log2 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(48, 1, ref flag2);
				if (flag2)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("MaterialGenerator_PR ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(FactoryManager.FormatParams(parameters[1..]));
				}
				log2.LogWarning(val2);
			}
			Material val3 = new Material(thermalOverlayShader)
			{
				name = "ThermalOverlay - PR (" + (flag ? "Transparent" : "Opaque") + ")",
				hideFlags = (HideFlags)61
			};
			MaterialConfig materialConfig = PRMaterialConfig.Clone();
			if (flag)
			{
				materialConfig.HeatTex = materialConfig.HeatTex.Value.Replace(".png", "_Transparent.png");
				materialConfig.AmbientTemp = 0.01f;
				materialConfig.BackgroundTemp = 0.01f;
			}
			materialConfig.Zoom = 0f;
			materialConfig.OffAngleFade = 0f;
			materialConfig.ApplyAllWithDefaults(val3, context);
			return val3;
		}
	}
	public class MeshGenerator_Diamond : IMeshGenerator
	{
		public const string Name = "Diamond";

		public virtual Mesh GenerateMesh(string? thisName, ConversionContext context)
		{
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Expected O, but got Unknown
			//IL_015a: 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_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: 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_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_020c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: 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)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_029b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d6: 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)
			//IL_00f9: Expected O, but got Unknown
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: 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
			float num = 0.05f;
			float num2 = 0.5f;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (float.TryParse(text, out var result))
					{
						num *= result;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(82, 1, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MeshGenerator_Diamond expected a float for its first parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log.LogError(val);
					}
				}
			}
			if (parameters.Length > 1)
			{
				string text2 = parameters[1];
				if (text2.Length != 0)
				{
					if (float.TryParse(text2, out var result2))
					{
						num2 = result2;
					}
					else
					{
						ManualLogSource log2 = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(83, 1, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MeshGenerator_Diamond expected a float for its second parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text2);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log2.LogError(val);
					}
				}
			}
			if (parameters.Length > 2)
			{
				ManualLogSource log3 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(49, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("MeshGenerator_Diamond ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(FactoryManager.FormatParams(parameters[2..]));
				}
				log3.LogWarning(val2);
			}
			Mesh val3 = new Mesh();
			((Object)val3).name = "Diamond (Generated)";
			val3.vertices = Il2CppStructArray<Vector3>.op_Implicit((Vector3[])(object)new Vector3[5]
			{
				new Vector3(0f, 0f, (0f - num) * num2),
				new Vector3(0f, num, 0f),
				new Vector3(num, 0f, 0f),
				new Vector3(0f, 0f - num, 0f),
				new Vector3(0f - num, 0f, 0f)
			});
			val3.uv = Il2CppStructArray<Vector2>.op_Implicit((Vector2[])(object)new Vector2[5]
			{
				new Vector2(0.5f, 0.5f),
				new Vector2(0f, 1f),
				new Vector2(0f, 0f),
				new Vector2(1f, 0f),
				new Vector2(1f, 1f)
			});
			val3.normals = Il2CppStructArray<Vector3>.op_Implicit((Vector3[])(object)new Vector3[5]
			{
				new Vector3(0f, 0f, -1f),
				new Vector3(0f, 0f, -1f),
				new Vector3(0f, 0f, -1f),
				new Vector3(0f, 0f, -1f),
				new Vector3(0f, 0f, -1f)
			});
			val3.triangles = Il2CppStructArray<int>.op_Implicit(new int[12]
			{
				0, 1, 2, 0, 2, 3, 0, 3, 4, 0,
				4, 1
			});
			Mesh val4 = val3;
			val4.RecalculateTangents();
			return val4;
		}
	}
	public class MeshGenerator_Plane : IMeshGenerator
	{
		public const string Name = "Plane";

		public virtual Mesh GenerateMesh(string? thisName, ConversionContext context)
		{
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: 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)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: 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)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: 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_0089: Expected O, but got Unknown
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			float num = 0.035f;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (float.TryParse(text, out var result))
					{
						num *= result;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(80, 1, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MeshGenerator_Plane expected a float for its first parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log.LogError(val);
					}
				}
			}
			if (parameters.Length > 1)
			{
				ManualLogSource log2 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(47, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("MeshGenerator_Plane ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(FactoryManager.FormatParams(parameters[1..]));
				}
				log2.LogWarning(val2);
			}
			Mesh val3 = new Mesh();
			((Object)val3).name = "XY Plane (Generated)";
			val3.vertices = Il2CppStructArray<Vector3>.op_Implicit((Vector3[])(object)new Vector3[4]
			{
				new Vector3(0f - num, num, 0f),
				new Vector3(num, num, 0f),
				new Vector3(0f - num, 0f - num, 0f),
				new Vector3(num, 0f - num, 0f)
			});
			val3.uv = Il2CppStructArray<Vector2>.op_Implicit((Vector2[])(object)new Vector2[4]
			{
				new Vector2(0f, 1f),
				new Vector2(1f, 1f),
				new Vector2(0f, 0f),
				new Vector2(1f, 0f)
			});
			val3.triangles = Il2CppStructArray<int>.op_Implicit(new int[12]
			{
				0, 1, 2, 1, 3, 2, 0, 2, 1, 1,
				2, 3
			});
			val3.normals = Il2CppStructArray<Vector3>.op_Implicit((Vector3[])(object)new Vector3[4]
			{
				new Vector3(0f, 0f, -1f),
				new Vector3(0f, 0f, -1f),
				new Vector3(0f, 0f, -1f),
				new Vector3(0f, 0f, -1f)
			});
			Mesh val4 = val3;
			val4.RecalculateTangents();
			return val4;
		}
	}
	public class OverlayGenerator_Load : IOverlayGenerator
	{
		public const string Name = "Load";

		public virtual bool GenerateOverlay(string? thisName, ConversionContext context)
		{
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			string[] parameters = FactoryManager.GetParameters(thisName);
			if (parameters.Length == 0)
			{
				context.Log.LogError((object)"OverlayGenerator_Load expected a sight's persistent ID in its parameters, but instead got nothing");
				return false;
			}
			string text = parameters[0];
			bool flag = default(bool);
			if (!uint.TryParse(text, out var result))
			{
				ManualLogSource log = context.Log;
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(57, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("OverlayGenerator_Load failed to parse uint from string \"");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
				}
				log.LogError(val);
				return false;
			}
			GearIDRange val2 = new GearIDRange();
			val2.SetCompID((eGearComponent)21, result, false);
			context.Item.GearPartHolder.SpawnGearPartsAsynch(val2, false, (Action)null);
			ManualLogSource log2 = context.Log;
			BepInExDebugLogInterpolatedStringHandler val3 = new BepInExDebugLogInterpolatedStringHandler(67, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("OverlayGenerator_Load successfully triggered async load of sight \"");
				((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<uint>(result);
				((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\"");
			}
			log2.LogDebug(val3);
			return false;
		}
	}
	public class OverlayGenerator_Standard : IOverlayGenerator
	{
		public const string Name = "Standard";

		public virtual bool GenerateOverlay(string? thisName, ConversionContext context)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Expected O, but got Unknown
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0203: 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_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0251: Unknown result type (might be due to invalid IL or missing references)
			//IL_0271: 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)
			//IL_029a: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0353: Unknown result type (might be due to invalid IL or missing references)
			//IL_035a: Expected O, but got Unknown
			GameObject val = new GameObject
			{
				name = "Thermal Overlay",
				hideFlags = (HideFlags)52
			};
			bool flag = true;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag2 = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (text == "AttachRear")
					{
						flag = true;
					}
					else if (text == "AttachFront")
					{
						flag = false;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(115, 1, ref flag2);
						if (flag2)
						{
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("OverlayGenerator_Standard expected either \"AttachRear\" or \"AttachFront\" for its first parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("\"");
						}
						log.LogError(val2);
					}
				}
			}
			if (parameters.Length > 1)
			{
				ManualLogSource log2 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(53, 1, ref flag2);
				if (flag2)
				{
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("OverlayGenerator_Standard ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(FactoryManager.FormatParams(parameters[1..]));
				}
				log2.LogWarning(val3);
			}
			MeshFilter val4 = val.AddComponent<MeshFilter>();
			val4.mesh = context.Factory.RunMeshGenerator(context.Config?.OverlayConfig.MeshGenerator, context);
			float num = 0f;
			Transform val5;
			if ((Object)(object)context.Item.GearPartHolder.MeleeHeadPart != (Object)null)
			{
				val5 = context.Item.GearPartHolder.MeleeHeadPart.transform;
			}
			else
			{
				val5 = context.Item.SightLookAlign;
				int childCount = val5.GetChildCount();
				for (int i = 0; i < childCount; i++)
				{
					Transform child = val5.GetChild(i);
					num = ((!flag) ? Mathf.Max(num, val5.TransformDirection(child.localPosition).z) : Mathf.Min(num, val5.TransformDirection(child.localPosition).z));
				}
			}
			val.transform.SetParent(val5);
			val.transform.localPosition = (context.Config?.OverlayConfig.MeshOffset ?? Vector3.zero) + num * Vector3.forward;
			ThermalConfig? config = context.Config;
			if (config != null)
			{
				_ = config.OverlayConfig.MeshScale;
				if (true)
				{
					val.transform.localScale = Vector3.Scale(val.transform.localScale, context.Config.OverlayConfig.MeshScale);
				}
			}
			ThermalConfig? config2 = context.Config;
			if (config2 != null)
			{
				_ = config2.OverlayConfig.MeshRotation;
				if (true)
				{
					val.transform.rotation = context.Config.OverlayConfig.MeshRotation * val.transform.rotation;
				}
			}
			context.Renderer = (Renderer?)(object)val.AddComponent<MeshRenderer>();
			context.Material = context.Factory.RunMaterialGenerator(context.Config?.MaterialGenerator, context);
			context.Material.mainTexture = context.Factory.RunTextureGenerator(context.Config?.OverlayConfig.TextureGenerator, context);
			context.Material.SetFloat("_CenterWhenUnscoped", 0f);
			context.Material.SetFloat("_OffAngleFade", 0f);
			context.Renderer.sharedMaterial = context.Material;
			ManualLogSource log3 = context.Log;
			BepInExDebugLogInterpolatedStringHandler val6 = new BepInExDebugLogInterpolatedStringHandler(63, 1, ref flag2);
			if (flag2)
			{
				((BepInExLogInterpolatedStringHandler)val6).AppendLiteral("OverlayGenerator_Standard successfully added overlay to item \"");
				((BepInExLogInterpolatedStringHandler)val6).AppendFormatted<string>(((Object)context.Item).name);
				((BepInExLogInterpolatedStringHandler)val6).AppendLiteral("\"");
			}
			log3.LogDebug(val6);
			return true;
		}
	}
	public class SightConverter_Standard : ISightConverter
	{
		public const string Name = "Standard";

		public static readonly MaterialConfig ThermalDefaults = new MaterialConfig
		{
			MainTex = "red",
			AlphaMult = 1f,
			CenterWhenUnscoped = 1f,
			UncenterWhenScoped = 1f
		};

		public virtual bool ConvertSight(string? thisName, ConversionContext context)
		{
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Expected O, but got Unknown
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Expected O, but got Unknown
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Expected O, but got Unknown
			Shader thermalOverlayShader = context.Plugin.AssetBundle.ThermalOverlayShader;
			if ((Object)(object)thermalOverlayShader == (Object)null)
			{
				context.Log.LogError((object)"SightConverter_Standard failed; failed to load thermal shader");
				return false;
			}
			if ((Object)(object)context.Renderer == (Object)null)
			{
				context.Log.LogError((object)"SightConverter_Standard failed; context.Renderer was null");
				return false;
			}
			bool flag = ((Object)context.Renderer.sharedMaterial.shader).name.Contains("Thermal", StringComparison.OrdinalIgnoreCase);
			bool flag2 = false;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag3 = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (text == "Thermal")
					{
						flag = true;
					}
					else if (text == "NonThermal")
					{
						flag = false;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(109, 1, ref flag3);
						if (flag3)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("SightConverter_Standard expected either \"Thermal\" or \"NonThermal\" for its first parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log.LogError(val);
					}
				}
			}
			if (parameters.Length > 1)
			{
				ManualLogSource log2 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(51, 1, ref flag3);
				if (flag3)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("SightConverter_Standard ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(FactoryManager.FormatParams(parameters[1..]));
				}
				log2.LogWarning(val2);
			}
			bool flag4 = ((!flag) ? ConvertNonThermalSight(context) : ConvertThermalSight(context));
			if (flag4)
			{
				if ((Object)(object)context.Material == (Object)null)
				{
					throw new NullReferenceException("context.Material should not be null here!");
				}
				context.Material.SetFloat("_CenterWhenUnscoped", 1f);
				if (flag2)
				{
					context.Material.SetFloat("_UncenterWhenScoped", 0f);
					context.Material.mainTexture = context.Factory.RunTextureGenerator("red", context);
				}
				ManualLogSource log3 = context.Log;
				BepInExDebugLogInterpolatedStringHandler val3 = new BepInExDebugLogInterpolatedStringHandler(40, 2, ref flag3);
				if (flag3)
				{
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(thisName ?? "SightConverter_Standard");
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral(" successfully converted sight on item \"");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(((Object)context.Item).name);
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\"");
				}
				log3.LogDebug(val3);
			}
			return flag4;
		}

		protected virtual bool ConvertThermalSight(ConversionContext context)
		{
			if ((Object)(object)context.Renderer == (Object)null)
			{
				throw new NullReferenceException("context.Renderer should not be null here!");
			}
			context.Material = context.Renderer.material;
			bool flag = context.Material.GetFloat("_BodyOcclusionHeat") == 0f && context.Material.GetFloat("_ShadowEnemyHeat") == 0f && context.Material.GetFloat("_ShadowEnemyFresnel") == 0f;
			MaterialConfig materialConfig = MaterialConfig.FromMaterial(context.Material, removeDefault: false);
			context.Material.shader = context.Plugin.AssetBundle.ThermalOverlayShader;
			materialConfig.Zoom = Mathf.Clamp(materialConfig.Zoom.Value - 0.5f, 0f, 1f);
			materialConfig.ApplyAllWithDefaults(context.Material, context, skipTextures: true);
			ThermalDefaults.ApplyAll(context.Material, context);
			if (flag)
			{
				context.Material.SetFloat("_ShadowEnemyFresnel", 50f);
				context.Material.SetFloat("_ShadowEnemyHeat", 0.6f);
				context.Material.SetFloat("_BodyOcclusionHeat", 1f);
			}
			return true;
		}

		protected virtual bool ConvertNonThermalSight(ConversionContext context)
		{
			if ((Object)(object)context.Renderer == (Object)null)
			{
				throw new NullReferenceException("context.Renderer should not be null here!");
			}
			context.Material = context.Plugin.FactoryManager.RunMaterialGenerator(context.Config?.MaterialGenerator, context);
			context.Material.mainTexture = context.Renderer.sharedMaterial.mainTexture;
			foreach (string item in (Il2CppArrayBase<string>)(object)context.Renderer.sharedMaterial.GetShaderKeywords())
			{
				MaterialExtensions.SetKeywordEnabled(context.Material, item, true);
			}
			context.Renderer.sharedMaterials = Il2CppReferenceArray<Material>.op_Implicit(((IEnumerable<Material>)context.Renderer.sharedMaterials).Append(context.Material).ToArray());
			return true;
		}
	}
	public class TextureGenerator_Bloom : ITextureGenerator
	{
		public const string Name = "Bloom";

		public virtual Texture GenerateTexture(string? thisName, ConversionContext context)
		{
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Expected O, but got Unknown
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Expected O, but got Unknown
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Expected O, but got Unknown
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Expected O, but got Unknown
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Expected O, but got Unknown
			//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
			bool flag = true;
			float num = 0f;
			float num2 = 1f;
			int num3 = 256;
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag2 = default(bool);
			if (parameters.Length != 0)
			{
				string text = parameters[0];
				if (text.Length != 0)
				{
					if (text == "Circle")
					{
						flag = true;
					}
					else if (text == "Square")
					{
						flag = false;
					}
					else
					{
						ManualLogSource log = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(103, 1, ref flag2);
						if (flag2)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("TextureGenerator_Bloom expected either \"Circle\" or \"Square\" for its first parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log.LogError(val);
					}
				}
			}
			if (parameters.Length > 1)
			{
				string text2 = parameters[1];
				if (text2.Length != 0)
				{
					if (float.TryParse(text2, out var result))
					{
						num = result;
					}
					else
					{
						ManualLogSource log2 = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(84, 1, ref flag2);
						if (flag2)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("TextureGenerator_Bloom expected a float for its second parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text2);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log2.LogError(val);
					}
				}
			}
			if (parameters.Length > 2)
			{
				string text3 = parameters[2];
				if (text3.Length != 0)
				{
					if (float.TryParse(text3, out var result2))
					{
						num2 = result2;
					}
					else
					{
						ManualLogSource log3 = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(83, 1, ref flag2);
						if (flag2)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("TextureGenerator_Bloom expected a float for its third parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text3);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log3.LogError(val);
					}
				}
			}
			if (parameters.Length > 3)
			{
				string text4 = parameters[3];
				if (text4.Length != 0)
				{
					if (uint.TryParse(text4, out var result3))
					{
						num3 = (int)result3;
					}
					else
					{
						ManualLogSource log4 = context.Log;
						BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(83, 1, ref flag2);
						if (flag2)
						{
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("TextureGenerator_Bloom expected a uint for its fourth parameter, but instead got \"");
							((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text4);
							((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\"");
						}
						log4.LogError(val);
					}
				}
			}
			if (parameters.Length > 4)
			{
				ManualLogSource log5 = context.Log;
				BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(50, 1, ref flag2);
				if (flag2)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("TextureGenerator_Bloom ignoring extra parameters: ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(FactoryManager.FormatParams(parameters[4..]));
				}
				log5.LogWarning(val2);
			}
			float num4 = 0.5f * ((float)num3 - 1f);
			float num5 = 1f / num4;
			Texture2D val3 = new Texture2D(num3, num3, (TextureFormat)15, false);
			if (flag)
			{
				((Object)val3).name = "Bloom - Circle";
			}
			else
			{
				((Object)val3).name = "Bloom - Square";
			}
			for (int i = 0; i < num3; i++)
			{
				float num6 = (float)i - num4;
				for (int j = 0; j < num3; j++)
				{
					float num7 = (float)j - num4;
					float num8 = ((!flag) ? (Mathf.Max(Mathf.Abs(num6), Mathf.Abs(num7)) * num5) : (Mathf.Sqrt(num6 * num6 + num7 * num7) * num5));
					num8 = Mathf.Lerp(num, num2, Mathf.Clamp(1f - num8, 0f, 1f));
					val3.SetPixel(i, j, new Color(num8, 0f, 0f));
				}
			}
			val3.Apply();
			return (Texture)(object)val3;
		}
	}
	public class TextureGenerator_Load : ITextureGenerator
	{
		public const string Name = "Load";

		public static string TexturesPath => AssetBundle.AssetDirectory;

		public virtual Texture GenerateTexture(string? thisName, ConversionContext context)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Expected O, but got Unknown
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Expected O, but got Unknown
			string[] parameters = FactoryManager.GetParameters(thisName);
			bool flag = default(bool);
			if (parameters.Length == 0)
			{
				ManualLogSource log = context.Log;
				BepInExDebugLogInterpolatedStringHandler val = new BepInExDebugLogInterpolatedStringHandler(85, 0, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("TextureGenerator_File expected a file path in its parameters, but instead got nothing");
				}
				log.LogDebug(val);
				return context.Factory.RunTextureGenerator(null, context);
			}
			string text = Path.Combine(parameters);
			string text2 = Path.Combine(TexturesPath, text);
			if (File.Exists(text2))
			{
				Texture2D val2 = new Texture2D(2, 2);
				((Object)val2).name = text;
				ImageConversion.LoadImage(val2, Il2CppStructArray<byte>.op_Implicit(File.ReadAllBytes(text2)));
				val2.Apply();
				return (Texture)(object)val2;
			}
			ManualLogSource log2 = context.Log;
			BepInExErrorLogInterpolatedStringHandler val3 = new BepInExErrorLogInterpolatedStringHandler(87, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("TextureGenerator_File failed to load file; file not found\n - File name: ");
				((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(text);
				((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\n - Full path: ");
				((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(text2);
			}
			log2.LogError(val3);
			return context.Factory.RunTextureGenerator(null, context);
		}
	}
	public class TextureGenerator_Simple : ITextureGenerator
	{
		private Func<Texture> Func;

		public TextureGenerator_Simple(Func<Texture> func)
		{
			Func = func;
		}

		public virtual Texture GenerateTexture(string? t