Decompiled source of CustomBloodColor v1.1.0

CustomBloodColor.dll

Decompiled 2 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using PluginConfig.API;
using PluginConfig.API.Fields;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("CustomBloodColor")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CustomBloodColor")]
[assembly: AssemblyTitle("CustomBloodColor")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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]
	[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 CustomBloodColor
{
	[BepInPlugin("scout.ultrakill.custombloodcolor", "Custom Blood Color", "1.2.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static UnityAction<Scene, LoadSceneMode> <>9__22_0;

			public static PostBoolValueChangeEvent <>9__23_0;

			public static PostColorValueChangeEvent <>9__23_1;

			public static PostFloatSliderValueChangeEvent <>9__23_2;

			public static PostBoolValueChangeEvent <>9__23_3;

			internal void <Awake>b__22_0(Scene s, LoadSceneMode m)
			{
				StainDecals.ClearForNewLevel();
			}

			internal void <SetupConfig>b__23_0(bool _)
			{
				BloodRecolor.ReapplyParticles();
				StainDecals.Recolor();
			}

			internal void <SetupConfig>b__23_1(Color _)
			{
				BloodRecolor.ReapplyParticles();
				StainDecals.Recolor();
			}

			internal void <SetupConfig>b__23_2(float v, Tuple<float, float> b)
			{
				StainDecals.Recolor();
			}

			internal void <SetupConfig>b__23_3(bool _)
			{
				StainDecals.Recolor();
			}
		}

		public const string PluginGuid = "scout.ultrakill.custombloodcolor";

		public const string PluginName = "Custom Blood Color";

		public const string PluginVersion = "1.2.0";

		internal static ManualLogSource Log;

		public static Plugin me;

		public static PluginConfigurator config;

		public static BoolField masterEnabled;

		public static ColorField bloodColor;

		public static FloatSliderField bloodAlpha;

		public static BoolField litDecals;

		public static bool Enabled => masterEnabled != null && masterEnabled.value;

		public static bool RecolorStains => Enabled;

		public static bool RecolorVignette => Enabled;

		public static Color Current => (Color)((bloodColor != null) ? bloodColor.value : new Color(1f, 0f, 0f));

		public static float Alpha => (bloodAlpha != null) ? bloodAlpha.value : 1f;

		public static bool LitDecals => litDecals != null && litDecals.value;

		private void Awake()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			me = this;
			Log = ((BaseUnityPlugin)this).Logger;
			new Harmony("scout.ultrakill.custombloodcolor").PatchAll();
			SetupConfig();
			SceneManager.sceneLoaded += delegate
			{
				StainDecals.ClearForNewLevel();
			};
			Log.LogMessage((object)"Custom Blood Color v1.2.0 loaded.");
		}

		private void SetupConfig()
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: 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_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Expected O, but got Unknown
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Expected O, but got Unknown
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Expected O, but got Unknown
			//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_0153: Expected O, but got Unknown
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Expected O, but got Unknown
			config = PluginConfigurator.Create("Custom Blood Color", "scout.custombloodcolor");
			Sprite val = LoadIcon("icon.png");
			if ((Object)(object)val != (Object)null)
			{
				config.image = val;
			}
			masterEnabled = new BoolField(config.rootPanel, "Mod Enabled", "masterEnabled", true);
			bloodColor = new ColorField(config.rootPanel, "Blood Color", "bloodColor", new Color(0f, 0.75f, 0f));
			bloodAlpha = new FloatSliderField(config.rootPanel, "Alpha Stains", "bloodAlpha", new Tuple<float, float>(0f, 1f), 1f, 2);
			litDecals = new BoolField(config.rootPanel, "Lit Stains", "litDecals", false);
			BoolField obj = masterEnabled;
			object obj2 = <>c.<>9__23_0;
			if (obj2 == null)
			{
				PostBoolValueChangeEvent val2 = delegate
				{
					BloodRecolor.ReapplyParticles();
					StainDecals.Recolor();
				};
				<>c.<>9__23_0 = val2;
				obj2 = (object)val2;
			}
			obj.postValueChangeEvent += (PostBoolValueChangeEvent)obj2;
			ColorField obj3 = bloodColor;
			object obj4 = <>c.<>9__23_1;
			if (obj4 == null)
			{
				PostColorValueChangeEvent val3 = delegate
				{
					BloodRecolor.ReapplyParticles();
					StainDecals.Recolor();
				};
				<>c.<>9__23_1 = val3;
				obj4 = (object)val3;
			}
			obj3.postValueChangeEvent += (PostColorValueChangeEvent)obj4;
			FloatSliderField obj5 = bloodAlpha;
			object obj6 = <>c.<>9__23_2;
			if (obj6 == null)
			{
				PostFloatSliderValueChangeEvent val4 = delegate
				{
					StainDecals.Recolor();
				};
				<>c.<>9__23_2 = val4;
				obj6 = (object)val4;
			}
			obj5.postValueChangeEvent += (PostFloatSliderValueChangeEvent)obj6;
			BoolField obj7 = litDecals;
			object obj8 = <>c.<>9__23_3;
			if (obj8 == null)
			{
				PostBoolValueChangeEvent val5 = delegate
				{
					StainDecals.Recolor();
				};
				<>c.<>9__23_3 = val5;
				obj8 = (object)val5;
			}
			obj7.postValueChangeEvent += (PostBoolValueChangeEvent)obj8;
		}

		private Sprite LoadIcon(string fileName)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), fileName);
			if (!File.Exists(path))
			{
				return null;
			}
			byte[] array = File.ReadAllBytes(path);
			Texture2D val = new Texture2D(2, 2);
			ImageConversion.LoadImage(val, array);
			return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
		}
	}
	internal static class BloodRecolor
	{
		private class Cache
		{
			public Color startColor;

			public bool hadColorOverLife;

			public MinMaxGradient origFade;

			public MinMaxGradient whiteFade;
		}

		private static readonly Dictionary<ParticleSystem, Cache> cache = new Dictionary<ParticleSystem, Cache>();

		private static readonly Dictionary<Sprite, Sprite> graySprites = new Dictionary<Sprite, Sprite>();

		public static void ApplyToSplatter(Bloodsplatter bs)
		{
			if (!((Object)(object)bs == (Object)null))
			{
				ParticleSystem[] componentsInChildren = ((Component)bs).GetComponentsInChildren<ParticleSystem>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					ApplyToSystem(componentsInChildren[i]);
				}
			}
		}

		private static void ApplyToSystem(ParticleSystem ps)
		{
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: 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_0064: 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_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)ps == (Object)null)
			{
				return;
			}
			if (!cache.TryGetValue(ps, out Cache value))
			{
				value = new Cache();
				MainModule main = ps.main;
				Cache obj = value;
				MinMaxGradient startColor = ((MainModule)(ref main)).startColor;
				obj.startColor = ((MinMaxGradient)(ref startColor)).color;
				ColorOverLifetimeModule colorOverLifetime = ps.colorOverLifetime;
				value.hadColorOverLife = ((ColorOverLifetimeModule)(ref colorOverLifetime)).enabled;
				value.origFade = ((ColorOverLifetimeModule)(ref colorOverLifetime)).color;
				value.whiteFade = BuildWhitened(colorOverLifetime);
				cache[ps] = value;
			}
			MainModule main2 = ps.main;
			ColorOverLifetimeModule colorOverLifetime2 = ps.colorOverLifetime;
			if (Plugin.Enabled)
			{
				Color current = Plugin.Current;
				current.a = 1f;
				((MainModule)(ref main2)).startColor = MinMaxGradient.op_Implicit(current);
				if (value.hadColorOverLife)
				{
					((ColorOverLifetimeModule)(ref colorOverLifetime2)).color = value.whiteFade;
				}
			}
			else
			{
				((MainModule)(ref main2)).startColor = MinMaxGradient.op_Implicit(value.startColor);
				if (value.hadColorOverLife)
				{
					((ColorOverLifetimeModule)(ref colorOverLifetime2)).color = value.origFade;
				}
			}
		}

		private static MinMaxGradient BuildWhitened(ColorOverLifetimeModule col)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Expected O, but got Unknown
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			Gradient val = null;
			try
			{
				MinMaxGradient color = ((ColorOverLifetimeModule)(ref col)).color;
				val = ((MinMaxGradient)(ref color)).gradient;
			}
			catch
			{
				val = null;
			}
			if (val == null || val.colorKeys == null || val.colorKeys.Length == 0)
			{
				Gradient val2 = new Gradient();
				val2.SetKeys((GradientColorKey[])(object)new GradientColorKey[2]
				{
					new GradientColorKey(Color.white, 0f),
					new GradientColorKey(Color.white, 1f)
				}, (GradientAlphaKey[])(object)new GradientAlphaKey[2]
				{
					new GradientAlphaKey(1f, 0f),
					new GradientAlphaKey(0f, 1f)
				});
				return new MinMaxGradient(val2);
			}
			GradientColorKey[] colorKeys = val.colorKeys;
			for (int i = 0; i < colorKeys.Length; i++)
			{
				colorKeys[i].color = Color.white;
			}
			Gradient val3 = new Gradient();
			val3.SetKeys(colorKeys, val.alphaKeys);
			return new MinMaxGradient(val3);
		}

		public static void ReapplyParticles()
		{
			Bloodsplatter[] array = Resources.FindObjectsOfTypeAll<Bloodsplatter>();
			for (int i = 0; i < array.Length; i++)
			{
				ApplyToSplatter(array[i]);
			}
		}

		public static Sprite ToGrayscale(Sprite original)
		{
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: 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_019b: 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)
			if ((Object)(object)original == (Object)null)
			{
				return null;
			}
			if (graySprites.TryGetValue(original, out Sprite value))
			{
				return value;
			}
			Sprite val = original;
			try
			{
				Texture texture = (Texture)(object)original.texture;
				Rect textureRect = original.textureRect;
				int num = Mathf.RoundToInt(((Rect)(ref textureRect)).width);
				int num2 = Mathf.RoundToInt(((Rect)(ref textureRect)).height);
				RenderTexture temporary = RenderTexture.GetTemporary(texture.width, texture.height, 0, (RenderTextureFormat)0);
				Graphics.Blit(texture, temporary);
				RenderTexture active = RenderTexture.active;
				RenderTexture.active = temporary;
				Texture2D val2 = new Texture2D(num, num2, (TextureFormat)4, false);
				val2.ReadPixels(new Rect(((Rect)(ref textureRect)).x, ((Rect)(ref textureRect)).y, (float)num, (float)num2), 0, 0);
				RenderTexture.active = active;
				RenderTexture.ReleaseTemporary(temporary);
				Color[] pixels = val2.GetPixels();
				for (int i = 0; i < pixels.Length; i++)
				{
					float num3 = pixels[i].r * 0.299f + pixels[i].g * 0.587f + pixels[i].b * 0.114f;
					pixels[i] = new Color(num3, num3, num3, pixels[i].a);
				}
				val2.SetPixels(pixels);
				val2.Apply();
				Vector2 val3 = default(Vector2);
				((Vector2)(ref val3))..ctor(original.pivot.x / (float)num, original.pivot.y / (float)num2);
				val = Sprite.Create(val2, new Rect(0f, 0f, (float)num, (float)num2), val3, original.pixelsPerUnit);
			}
			catch (Exception ex)
			{
				Plugin.Log.LogWarning((object)("Grayscale of hurt sprite failed, leaving it red: " + ex.Message));
			}
			graySprites[original] = val;
			return val;
		}
	}
	internal static class StainDecals
	{
		private const int MaxDecalCap = 5000;

		private const float BaseSize = 2.8f;

		private const float ShapeBoost = 1.8f;

		private const string AtlasProp = "_SplatterAtlas";

		private static Color[] lightMul;

		private static Light[] lights;

		private static bool lightsCached;

		private static Sprite[] shapes;

		private static bool ready;

		private const float MaxPlaceDistance = 300f;

		private static int maxDecals;

		private static GameObject[] pool;

		private static SpriteRenderer[] renderers;

		private static int nextSlot;

		private static Transform root;

		private static readonly Vector3[] shDir = (Vector3[])(object)new Vector3[1];

		private static readonly Color[] shCol = (Color[])(object)new Color[1];

		public static void OnStain(Vector3 pos, Vector3 norm, Transform parent)
		{
			//IL_0046: 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_004d: 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_006e: 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)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			BloodsplatterManager instance = MonoSingleton<BloodsplatterManager>.Instance;
			if ((Object)(object)instance == (Object)null)
			{
				return;
			}
			if (!ready)
			{
				BuildShapes(instance);
			}
			if (!ready)
			{
				return;
			}
			Transform player = GetPlayer();
			if ((Object)(object)player != (Object)null)
			{
				Vector3 val = pos - player.position;
				if (((Vector3)(ref val)).sqrMagnitude > 90000f)
				{
					return;
				}
			}
			Place(pos, (((Vector3)(ref norm)).sqrMagnitude > 0.0001f) ? ((Vector3)(ref norm)).normalized : Vector3.up, parent);
		}

		private static Color SampleLighting(Vector3 pos, Vector3 normal)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: 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_01f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_021d: 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_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Invalid comparison between Unknown and I4
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: 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_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			Color val = RenderSettings.ambientLight;
			try
			{
				SphericalHarmonicsL2 val2 = default(SphericalHarmonicsL2);
				LightProbes.GetInterpolatedProbe(pos, (Renderer)null, ref val2);
				shDir[0] = normal;
				((SphericalHarmonicsL2)(ref val2)).Evaluate(shDir, shCol);
				val += shCol[0];
			}
			catch
			{
			}
			if (!lightsCached)
			{
				lightsCached = true;
				lights = Object.FindObjectsOfType<Light>();
			}
			if (lights != null)
			{
				for (int i = 0; i < lights.Length; i++)
				{
					Light val3 = lights[i];
					if ((Object)(object)val3 == (Object)null || !((Behaviour)val3).isActiveAndEnabled || val3.intensity <= 0f)
					{
						continue;
					}
					if ((int)val3.type == 1)
					{
						float num = Mathf.Max(0f, Vector3.Dot(normal, -((Component)val3).transform.forward));
						val += val3.color * (val3.intensity * num);
						continue;
					}
					Vector3 val4 = ((Component)val3).transform.position - pos;
					float magnitude = ((Vector3)(ref val4)).magnitude;
					if (!(magnitude > val3.range) && !(magnitude < 0.0001f))
					{
						float num2 = 1f - magnitude / val3.range;
						float num3 = Mathf.Max(0f, Vector3.Dot(normal, val4 / magnitude));
						val += val3.color * (val3.intensity * num3 * num2 * num2);
					}
				}
			}
			return new Color(Mathf.Clamp(Mathf.Max(val.r, 0.22f), 0f, 1.6f), Mathf.Clamp(Mathf.Max(val.g, 0.22f), 0f, 1.6f), Mathf.Clamp(Mathf.Max(val.b, 0.22f), 0f, 1.6f), 1f);
		}

		private static Color Tinted(Color baseCol, float alpha, Color mul)
		{
			//IL_0028: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: 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_0050: 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_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			if (!Plugin.LitDecals)
			{
				return new Color(baseCol.r, baseCol.g, baseCol.b, alpha);
			}
			return new Color(baseCol.r * mul.r, baseCol.g * mul.g, baseCol.b * mul.b, alpha);
		}

		private static Transform GetPlayer()
		{
			try
			{
				NewMovement instance = MonoSingleton<NewMovement>.Instance;
				return ((Object)(object)instance != (Object)null) ? ((Component)instance).transform : null;
			}
			catch
			{
				return null;
			}
		}

		private static void Place(Vector3 point, Vector3 normal, Transform parent)
		{
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			if (pool == null)
			{
				return;
			}
			int num = nextSlot;
			nextSlot = (nextSlot + 1) % maxDecals;
			GameObject val = pool[num];
			SpriteRenderer val2 = renderers[num];
			if ((Object)(object)val == (Object)null)
			{
				val = new GameObject("CBC_StainDecal");
				if ((Object)(object)root != (Object)null)
				{
					val.transform.SetParent(root, false);
				}
				val2 = val.AddComponent<SpriteRenderer>();
				pool[num] = val;
				renderers[num] = val2;
			}
			val2.sprite = shapes[Random.Range(0, shapes.Length)];
			Color val3 = SampleLighting(point, normal);
			if (lightMul != null && num < lightMul.Length)
			{
				lightMul[num] = val3;
			}
			val2.color = Tinted(Plugin.Current, Plugin.Alpha, val3);
			Vector3 val4 = ((Mathf.Abs(Vector3.Dot(normal, Vector3.up)) > 0.99f) ? Vector3.forward : Vector3.up);
			Transform transform = val.transform;
			transform.SetParent(((Object)(object)parent != (Object)null) ? parent : root, true);
			transform.position = point + normal * 0.02f;
			transform.rotation = Quaternion.LookRotation(normal, val4) * Quaternion.Euler(0f, 0f, Random.Range(0f, 360f));
			float num2 = 2.8f * Random.Range(0.6f, 1.2f);
			Vector3 val5 = (((Object)(object)transform.parent != (Object)null) ? transform.parent.lossyScale : Vector3.one);
			transform.localScale = new Vector3(num2 / Mathf.Max(0.0001f, Mathf.Abs(val5.x)), num2 / Mathf.Max(0.0001f, Mathf.Abs(val5.y)), num2 / Mathf.Max(0.0001f, Mathf.Abs(val5.z)));
			val.SetActive(true);
		}

		public static void Recolor()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: 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)
			if (pool == null)
			{
				return;
			}
			bool flag = Plugin.Enabled && Plugin.RecolorStains;
			Color current = Plugin.Current;
			float alpha = Plugin.Alpha;
			for (int i = 0; i < maxDecals; i++)
			{
				if (!((Object)(object)renderers[i] == (Object)null))
				{
					if (!flag)
					{
						pool[i].SetActive(false);
						continue;
					}
					Color mul = ((lightMul != null && i < lightMul.Length) ? lightMul[i] : Color.white);
					renderers[i].color = Tinted(current, alpha, mul);
				}
			}
		}

		public static void ClearForNewLevel()
		{
			lightsCached = false;
			lights = null;
			if (pool == null)
			{
				return;
			}
			for (int i = 0; i < maxDecals; i++)
			{
				if ((Object)(object)pool[i] != (Object)null)
				{
					pool[i].SetActive(false);
				}
			}
			nextSlot = 0;
		}

		private static void BuildShapes(BloodsplatterManager bsm)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Expected O, but got Unknown
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Expected O, but got Unknown
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: 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_0213: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_0258: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((Object)(object)root == (Object)null)
				{
					GameObject val = new GameObject("CBC_StainRoot");
					Object.DontDestroyOnLoad((Object)(object)val);
					root = val.transform;
				}
				maxDecals = 5000;
				try
				{
					float floatLocal = MonoSingleton<PrefsManager>.Instance.GetFloatLocal("bloodStainMax", 100000f);
					maxDecals = Mathf.Clamp((int)floatLocal, 100, 5000);
				}
				catch
				{
				}
				pool = (GameObject[])(object)new GameObject[maxDecals];
				renderers = (SpriteRenderer[])(object)new SpriteRenderer[maxDecals];
				lightMul = (Color[])(object)new Color[maxDecals];
				for (int i = 0; i < maxDecals; i++)
				{
					lightMul[i] = Color.white;
				}
				Material stainMat = bsm.stainMat;
				Texture val2 = (((Object)(object)stainMat != (Object)null && stainMat.HasProperty("_SplatterAtlas")) ? stainMat.GetTexture("_SplatterAtlas") : null);
				if ((Object)(object)val2 == (Object)null)
				{
					Plugin.Log.LogWarning((object)"No splatter atlas, stain decals disabled.");
					return;
				}
				int width = val2.width;
				int height = val2.height;
				RenderTexture temporary = RenderTexture.GetTemporary(width, height, 0, (RenderTextureFormat)0);
				Graphics.Blit(val2, temporary);
				RenderTexture active = RenderTexture.active;
				RenderTexture.active = temporary;
				Texture2D val3 = new Texture2D(width, height, (TextureFormat)4, false);
				val3.ReadPixels(new Rect(0f, 0f, (float)width, (float)height), 0, 0);
				val3.Apply();
				RenderTexture.active = active;
				RenderTexture.ReleaseTemporary(temporary);
				int num = ((height <= 0 || width % height != 0) ? 1 : (width / height));
				int num2 = width / num;
				Color[] pixels = val3.GetPixels();
				shapes = (Sprite[])(object)new Sprite[num];
				for (int j = 0; j < num; j++)
				{
					Texture2D val4 = new Texture2D(num2, height, (TextureFormat)4, false);
					((Texture)val4).filterMode = (FilterMode)0;
					((Texture)val4).wrapMode = (TextureWrapMode)1;
					Color[] array = (Color[])(object)new Color[num2 * height];
					for (int k = 0; k < height; k++)
					{
						for (int l = 0; l < num2; l++)
						{
							Color val5 = pixels[k * width + (j * num2 + l)];
							float num3 = Mathf.Clamp01(Mathf.Max(val5.r, Mathf.Max(val5.g, val5.b)) * 1.8f);
							array[k * num2 + l] = new Color(1f, 1f, 1f, num3);
						}
					}
					val4.SetPixels(array);
					val4.Apply();
					shapes[j] = Sprite.Create(val4, new Rect(0f, 0f, (float)num2, (float)height), new Vector2(0.5f, 0.5f), (float)height);
				}
				Object.Destroy((Object)(object)val3);
				ready = true;
			}
			catch (Exception ex)
			{
				Plugin.Log.LogWarning((object)("Building stain decals failed: " + ex.Message));
			}
		}
	}
	[HarmonyPatch(typeof(Bloodsplatter), "OnEnable")]
	internal static class Patch_Bloodsplatter_OnEnable
	{
		private static void Postfix(Bloodsplatter __instance)
		{
			BloodRecolor.ApplyToSplatter(__instance);
		}
	}
	[HarmonyPatch]
	internal static class Patch_BloodsplatterManager_CreateBloodstain
	{
		private class Sig
		{
			public bool ok;

			public int pos = -1;

			public int norm = -1;

			public int parent = -1;

			public int parentObj = -1;
		}

		private static readonly Dictionary<MethodBase, Sig> sigs = new Dictionary<MethodBase, Sig>();

		private static IEnumerable<MethodBase> TargetMethods()
		{
			List<MethodBase> list = new List<MethodBase>();
			foreach (MethodInfo declaredMethod in AccessTools.GetDeclaredMethods(typeof(BloodsplatterManager)))
			{
				if (declaredMethod.Name == "CreateBloodstain")
				{
					list.Add(declaredMethod);
				}
			}
			return list;
		}

		private static string Describe(MethodBase m)
		{
			ParameterInfo[] parameters = m.GetParameters();
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(m.Name).Append("(");
			for (int i = 0; i < parameters.Length; i++)
			{
				if (i > 0)
				{
					stringBuilder.Append(", ");
				}
				stringBuilder.Append(parameters[i].ParameterType.Name).Append(" ").Append(parameters[i].Name);
				if (parameters[i].IsOptional)
				{
					stringBuilder.Append("=opt");
				}
			}
			return stringBuilder.Append(")").ToString();
		}

		private static bool IsVec(Type t)
		{
			return t == typeof(float3) || t == typeof(Vector3);
		}

		private static Sig GetSig(MethodBase m)
		{
			if (sigs.TryGetValue(m, out Sig value))
			{
				return value;
			}
			value = new Sig();
			ParameterInfo[] parameters = m.GetParameters();
			for (int i = 0; i < parameters.Length; i++)
			{
				if (IsVec(parameters[i].ParameterType))
				{
					if (value.pos < 0)
					{
						value.pos = i;
					}
					else if (value.norm < 0)
					{
						value.norm = i;
					}
				}
				else if (parameters[i].ParameterType == typeof(int) && value.norm >= 0 && value.parent < 0)
				{
					value.parent = i;
				}
				else if (typeof(BloodstainParent).IsAssignableFrom(parameters[i].ParameterType) && value.parentObj < 0)
				{
					value.parentObj = i;
				}
			}
			value.ok = value.pos >= 0 && value.norm >= 0;
			sigs[m] = value;
			if (!value.ok)
			{
				Plugin.Log.LogWarning((object)("Unreadable overload left to vanilla: " + Describe(m)));
			}
			return value;
		}

		private static bool Prefix(object[] __args, MethodBase __originalMethod)
		{
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			if (!Plugin.Enabled || !Plugin.RecolorStains)
			{
				return true;
			}
			if (__args == null)
			{
				return true;
			}
			Sig sig = GetSig(__originalMethod);
			if (!sig.ok)
			{
				return true;
			}
			if (sig.pos >= __args.Length || sig.norm >= __args.Length)
			{
				return true;
			}
			Vector3 val = AsVector3(__args[sig.pos]);
			Vector3 val2 = AsVector3(__args[sig.norm]);
			BloodstainParent val3 = (BloodstainParent)((sig.parentObj >= 0 && sig.parentObj < __args.Length) ? /*isinst with value type is only supported in some contexts*/: null);
			if ((Object)(object)val3 != (Object)null)
			{
				Transform transform = ((Component)val3).transform;
				StainDecals.OnStain(transform.position + transform.rotation * val, transform.rotation * val2, transform);
				return false;
			}
			int num = ((sig.parent >= 0 && sig.parent < __args.Length && __args[sig.parent] is int) ? ((int)__args[sig.parent]) : 0);
			if (num > 0)
			{
				return true;
			}
			StainDecals.OnStain(val, val2, null);
			return false;
		}

		private static Vector3 AsVector3(object o)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			if (o is float3)
			{
				return float3.op_Implicit((float3)o);
			}
			if (!(o is Vector3 result))
			{
				return Vector3.zero;
			}
			return result;
		}
	}
	[HarmonyPatch(typeof(ScreenBlood), "Start")]
	internal static class Patch_ScreenBlood_Start
	{
		private static void Postfix(ScreenBlood __instance)
		{
			//IL_0050: 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_0059: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			if (!Plugin.Enabled || !Plugin.RecolorVignette)
			{
				return;
			}
			Image component = ((Component)__instance).GetComponent<Image>();
			if (!((Object)(object)component == (Object)null))
			{
				Sprite val = BloodRecolor.ToGrayscale(component.sprite);
				if ((Object)(object)val != (Object)null)
				{
					component.sprite = val;
				}
				Color current = Plugin.Current;
				current.a = ((Graphic)component).color.a;
				((Graphic)component).color = current;
				Traverse.Create((object)__instance).Field("clr").SetValue((object)current);
			}
		}
	}
}