Decompiled source of ScanRecolor v1.1.2

ScanRecolor.dll

Decompiled 4 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ScanRecolor")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A scan recoloring mod for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+5e9e58aa107f72a7ccfe23969bdac41ef24dc295")]
[assembly: AssemblyProduct("ScanRecolor")]
[assembly: AssemblyTitle("ScanRecolor")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ScanRecolor
{
	public sealed class Config
	{
		private static Config instance;

		public ConfigEntry<bool> FadeOut { get; set; }

		public ConfigEntry<bool> RecolorScanLines { get; set; }

		public ConfigEntry<int> Red { get; set; }

		public ConfigEntry<int> Green { get; set; }

		public ConfigEntry<int> Blue { get; set; }

		public ConfigEntry<float> Alpha { get; set; }

		public ConfigEntry<float> VignetteIntensity { get; set; }

		public static Config Instance
		{
			get
			{
				if (instance == null)
				{
					instance = new Config();
				}
				return instance;
			}
		}

		public void Setup()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Expected O, but got Unknown
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Expected O, but got Unknown
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Expected O, but got Unknown
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Expected O, but got Unknown
			FadeOut = Plugin.BepInExConfig().Bind<bool>("General", "FadeOut", false, new ConfigDescription("Fade out effect for scan color.", (AcceptableValueBase)null, Array.Empty<object>()));
			RecolorScanLines = Plugin.BepInExConfig().Bind<bool>("General", "RecolorScanLines", true, new ConfigDescription("Recolor the blue horizontal scan lines texture aswell.", (AcceptableValueBase)null, Array.Empty<object>()));
			Red = Plugin.BepInExConfig().Bind<int>("Color", "Red", 0, new ConfigDescription("Red scan color.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			Green = Plugin.BepInExConfig().Bind<int>("Color", "Green", 12, new ConfigDescription("Green scan color.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			Blue = Plugin.BepInExConfig().Bind<int>("Color", "Blue", 255, new ConfigDescription("Blue scan color.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			Alpha = Plugin.BepInExConfig().Bind<float>("Color", "Alpha", 0.26f, new ConfigDescription("Alpha / opaticty.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			VignetteIntensity = Plugin.BepInExConfig().Bind<float>("Color", "VignetteIntensity", 0.46f, new ConfigDescription("Intensity of the vignette / borders effect during scan.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			Red.SettingChanged += delegate
			{
				HUDManagerPatch.SetScanColor();
			};
			Green.SettingChanged += delegate
			{
				HUDManagerPatch.SetScanColor();
			};
			Blue.SettingChanged += delegate
			{
				HUDManagerPatch.SetScanColor();
			};
			Alpha.SettingChanged += delegate
			{
				HUDManagerPatch.SetScanColor();
			};
			FadeOut.SettingChanged += delegate
			{
				HUDManagerPatch.SetScanColor();
			};
			VignetteIntensity.SettingChanged += delegate
			{
				HUDManagerPatch.UpdateVignetteIntensity();
			};
			RecolorScanLines.SettingChanged += delegate
			{
				HUDManagerPatch.UpdateScanTexture();
			};
		}
	}
	[HarmonyPatch]
	internal class HUDManagerPatch
	{
		private static readonly float ScanDuration = 1.3f;

		private static Texture2D _baseTexture = null;

		private static MeshRenderer ScanRenderer = ((Component)HUDManager.Instance.scanEffectAnimator).GetComponent<MeshRenderer>();

		private static readonly Volume ScanVolume = (from v in Object.FindObjectsByType<Volume>((FindObjectsSortMode)0)
			where ((Object)v.profile).name.StartsWith("ScanVolume")
			select v).FirstOrDefault();

		private static readonly Vignette ScanVignette;

		private static readonly Bloom ScanBloom;

		private static bool HasScanMaterial
		{
			get
			{
				if ((Object)(object)ScanRenderer != (Object)null)
				{
					return (Object)(object)((Renderer)ScanRenderer).material != (Object)null;
				}
				return false;
			}
		}

		private static float ScanProgress => 1f / ScanDuration * (HUDManager.Instance.playerPingingScan + 1f);

		private static float ColorToFloat(int color)
		{
			return 0.003921569f * (float)color;
		}

		private static Color ScanColor(float? overrideAlpha = null)
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			return new Color(ColorToFloat(Config.Instance.Red.Value), ColorToFloat(Config.Instance.Green.Value), ColorToFloat(Config.Instance.Blue.Value), overrideAlpha.GetValueOrDefault(Config.Instance.Alpha.Value));
		}

		public static void SetScanColorAlpha(float alpha)
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			if (!HasScanMaterial && (Object)(object)HUDManager.Instance.scanEffectAnimator != (Object)null)
			{
				ScanRenderer = ((Component)HUDManager.Instance.scanEffectAnimator).GetComponent<MeshRenderer>();
			}
			if (HasScanMaterial)
			{
				Color color = ((Renderer)ScanRenderer).material.color;
				color.a = alpha;
				((Renderer)ScanRenderer).material.color = color;
			}
		}

		public static void SetScanColor()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			if (!HasScanMaterial && (Object)(object)HUDManager.Instance.scanEffectAnimator != (Object)null)
			{
				ScanRenderer = ((Component)HUDManager.Instance.scanEffectAnimator).GetComponent<MeshRenderer>();
			}
			if (HasScanMaterial)
			{
				((Renderer)ScanRenderer).material.color = ScanColor();
			}
			if ((Object)(object)ScanVignette != (Object)null)
			{
				((VolumeParameter<Color>)(object)ScanVignette.color).value = ScanColor(1f);
				UpdateVignetteIntensity();
			}
			if ((Object)(object)ScanBloom != (Object)null)
			{
				((VolumeParameter<Color>)(object)ScanBloom.tint).Override(ScanColor());
				UpdateScanTexture();
			}
		}

		public static void UpdateVignetteIntensity()
		{
			if ((Object)(object)ScanVignette != (Object)null)
			{
				((VolumeParameter<float>)(object)ScanVignette.intensity).value = Config.Instance.VignetteIntensity.Value;
			}
		}

		public static void UpdateScanTexture()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			if (Config.Instance.RecolorScanLines.Value)
			{
				RecolorScanTexture(ScanColor());
			}
			else
			{
				RevertScanTexture();
			}
		}

		public static void RecolorScanTexture(Color color)
		{
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Expected O, but got Unknown
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)ScanBloom == (Object)null || (VolumeParameter<Texture>)(object)ScanBloom.dirtTexture == (Texture)null)
			{
				return;
			}
			if ((Object)(object)_baseTexture == (Object)null)
			{
				Texture obj = Utils.MakeTextureReadable(((VolumeParameter<Texture>)(object)ScanBloom.dirtTexture).value);
				_baseTexture = (Texture2D)(object)((obj is Texture2D) ? obj : null);
				if (!((Texture)_baseTexture).isReadable)
				{
					Plugin.mls.LogWarning((object)"Unable to read ScanTexture.");
					return;
				}
			}
			Texture2D texture = new Texture2D(((Texture)_baseTexture).width, ((Texture)_baseTexture).height);
			texture.SetPixels(_baseTexture.GetPixels());
			texture.Apply();
			Utils.RecolorTexture(ref texture, color);
			((VolumeParameter<Texture>)(object)ScanBloom.dirtTexture).Override((Texture)(object)Object.Instantiate<Texture2D>(texture));
		}

		public static void RevertScanTexture()
		{
			if (!((Object)(object)_baseTexture == (Object)null) && !((Object)(object)ScanBloom == (Object)null) && !((VolumeParameter<Texture>)(object)ScanBloom.dirtTexture == (Texture)null))
			{
				((VolumeParameter<Texture>)(object)ScanBloom.dirtTexture).Override((Texture)(object)_baseTexture);
			}
		}

		[HarmonyPatch(typeof(HUDManager), "Start")]
		[HarmonyPostfix]
		public static void HUDManagerStartPostfix()
		{
			SetScanColor();
			UpdateScanTexture();
		}

		[HarmonyPatch(typeof(HUDManager), "Update")]
		[HarmonyPostfix]
		public static void HUDManagerUpdatePostfix()
		{
			if (Config.Instance.FadeOut.Value && HUDManager.Instance.playerPingingScan > -1f)
			{
				SetScanColorAlpha(ScanProgress * Config.Instance.Alpha.Value);
			}
		}

		static HUDManagerPatch()
		{
			VolumeComponent? obj = ScanVolume.profile.components.Where((VolumeComponent c) => ((Object)c).name.StartsWith("Vignette")).FirstOrDefault();
			ScanVignette = (Vignette)(object)((obj is Vignette) ? obj : null);
			VolumeComponent? obj2 = ScanVolume.profile.components.Where((VolumeComponent c) => ((Object)c).name.StartsWith("Bloom")).FirstOrDefault();
			ScanBloom = (Bloom)(object)((obj2 is Bloom) ? obj2 : null);
		}
	}
	[BepInPlugin("Niro.ScanRecolor", "ScanRecolor", "1.1.2")]
	public class Plugin : BaseUnityPlugin
	{
		public const string modGUID = "Niro.ScanRecolor";

		public const string modName = "ScanRecolor";

		public const string modVersion = "1.1.2";

		private readonly Harmony harmony = new Harmony("Niro.ScanRecolor");

		private static Plugin instance;

		internal static ManualLogSource mls;

		public static ConfigFile BepInExConfig()
		{
			return ((BaseUnityPlugin)instance).Config;
		}

		public void Awake()
		{
			if (instance == null)
			{
				instance = this;
			}
			mls = Logger.CreateLogSource("Niro.ScanRecolor");
			Config.Instance.Setup();
			mls.LogMessage((object)"Plugin ScanRecolor loaded!");
			harmony.PatchAll(typeof(HUDManagerPatch));
		}
	}
	internal class Utils
	{
		public static Texture MakeTextureReadable(Texture original)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			RenderTexture temporary = RenderTexture.GetTemporary(original.width, original.height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)1);
			Graphics.Blit(original, temporary);
			RenderTexture active = RenderTexture.active;
			RenderTexture.active = temporary;
			Texture2D val = new Texture2D(original.width, original.height);
			val.ReadPixels(new Rect(0f, 0f, (float)((Texture)temporary).width, (float)((Texture)temporary).height), 0, 0);
			val.Apply();
			RenderTexture.active = active;
			RenderTexture.ReleaseTemporary(temporary);
			return (Texture)val;
		}

		public static void RecolorTexture(ref Texture2D texture, Color color)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			float num = color.r + color.g + color.b;
			List<Color> list = texture.GetPixels().ToList();
			Plugin.mls.LogDebug((object)("ScanTexture pixel count: " + list.Count));
			for (int num2 = list.Count - 1; num2 >= 0; num2--)
			{
				float num3 = list[num2].r + list[num2].g + list[num2].b;
				if (!(num3 < 0.05f) && !(list[num2].a < 0.05f))
				{
					float num4 = ((num == 0f) ? 0f : (num3 / num));
					list[num2] = new Color(color.r * num4, color.g * num4, color.b * num4);
				}
			}
			texture.SetPixels(list.ToArray());
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}