Decompiled source of R2API Colors v1.0.3

plugins/R2API.Colors/R2API.Colors.dll

Decompiled a month ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HG;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using R2API.AutoVersionGen;
using R2API.ScriptableObjects;
using RoR2;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("R2API.Colors")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.3.0")]
[assembly: AssemblyInformationalVersion("1.0.3+e9ea73f05d82ba8fdebacfa23cfaf143584d236e")]
[assembly: AssemblyProduct("R2API.Colors")]
[assembly: AssemblyTitle("R2API.Colors")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.3.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	[DebuggerNonUserCode]
	internal sealed class MemberNotNullAttribute : Attribute
	{
		public string[] Members { get; }

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

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

		public string[] Members { get; }

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

		public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
		{
			ReturnValue = returnValue;
			Members = members;
		}
	}
}
namespace R2API
{
	[AutoVersion]
	public static class ColorsAPI
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Manipulator <0>__ColorCatalogGetColorIL;

			public static Manipulator <1>__ColorCatalogGetColorHexStringIL;

			public static Manipulator <2>__GetColorIL;

			public static Func<ColorIndex, Color32> <3>__ColorCatalogGetColor;

			public static Func<ColorIndex, string> <4>__ColorCatalogGetColorHexString;
		}

		public const string PluginGUID = "com.bepis.r2api.colors";

		public const string PluginName = "R2API.Colors";

		private static List<SerializableDamageColor> addedSerializableDamageColors = new List<SerializableDamageColor>();

		private static List<SerializableColorCatalogEntry> addedSerializableColors = new List<SerializableColorCatalogEntry>();

		private static bool _hookEnabled = false;

		public const string PluginVersion = "1.0.3";

		[Obsolete("All submodules are automatically loaded and this property is now unused")]
		public static bool Loaded => true;

		internal static void SetHooks()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_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_0043: Expected O, but got Unknown
			//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_0063: Expected O, but got Unknown
			if (!_hookEnabled)
			{
				object obj = <>O.<0>__ColorCatalogGetColorIL;
				if (obj == null)
				{
					Manipulator val = ColorCatalogGetColorIL;
					<>O.<0>__ColorCatalogGetColorIL = val;
					obj = (object)val;
				}
				ColorCatalog.GetColor += (Manipulator)obj;
				object obj2 = <>O.<1>__ColorCatalogGetColorHexStringIL;
				if (obj2 == null)
				{
					Manipulator val2 = ColorCatalogGetColorHexStringIL;
					<>O.<1>__ColorCatalogGetColorHexStringIL = val2;
					obj2 = (object)val2;
				}
				ColorCatalog.GetColorHexString += (Manipulator)obj2;
				object obj3 = <>O.<2>__GetColorIL;
				if (obj3 == null)
				{
					Manipulator val3 = GetColorIL;
					<>O.<2>__GetColorIL = val3;
					obj3 = (object)val3;
				}
				DamageColor.FindColor += (Manipulator)obj3;
				_hookEnabled = true;
			}
		}

		internal static void UnsetHooks()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_0030: 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: Expected O, but got Unknown
			//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_005b: Expected O, but got Unknown
			object obj = <>O.<0>__ColorCatalogGetColorIL;
			if (obj == null)
			{
				Manipulator val = ColorCatalogGetColorIL;
				<>O.<0>__ColorCatalogGetColorIL = val;
				obj = (object)val;
			}
			ColorCatalog.GetColor -= (Manipulator)obj;
			object obj2 = <>O.<1>__ColorCatalogGetColorHexStringIL;
			if (obj2 == null)
			{
				Manipulator val2 = ColorCatalogGetColorHexStringIL;
				<>O.<1>__ColorCatalogGetColorHexStringIL = val2;
				obj2 = (object)val2;
			}
			ColorCatalog.GetColorHexString -= (Manipulator)obj2;
			object obj3 = <>O.<2>__GetColorIL;
			if (obj3 == null)
			{
				Manipulator val3 = GetColorIL;
				<>O.<2>__GetColorIL = val3;
				obj3 = (object)val3;
			}
			DamageColor.FindColor -= (Manipulator)obj3;
			_hookEnabled = false;
		}

		private static void GetColorIL(ILContext il)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			//IL_0061: 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_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			FieldReference arrayToGetLength = null;
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction inst) => ILPatternMatchingExt.MatchLdsfld(inst, ref arrayToGetLength)
			});
			val.GotoPrev((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction inst) => ILPatternMatchingExt.MatchLdarg(inst, 0)
			});
			val.Emit(OpCodes.Ldsfld, arrayToGetLength);
			val.Emit(OpCodes.Ldlen);
			val.Emit(OpCodes.Conv_I4);
			int index = val.Index;
			val.Index = index + 1;
			val.Emit(OpCodes.Pop);
		}

		private static void ColorCatalogGetColorIL(ILContext il)
		{
			//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_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<ColorIndex, Color32>>((Func<ColorIndex, Color32>)ColorCatalogGetColor);
			val.Emit(OpCodes.Ret);
		}

		private static Color32 ColorCatalogGetColor(ColorIndex colorIndex)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Expected I4, but got Unknown
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			int num = (int)colorIndex;
			if (num < 0 || num > GetLength(ref ColorCatalog.indexToColor32))
			{
				num = 14;
			}
			return GetItem(ref ColorCatalog.indexToColor32, num);
		}

		private static void ColorCatalogGetColorHexStringIL(ILContext il)
		{
			//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_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<ColorIndex, string>>((Func<ColorIndex, string>)ColorCatalogGetColorHexString);
			val.Emit(OpCodes.Ret);
		}

		private static string ColorCatalogGetColorHexString(ColorIndex colorIndex)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Expected I4, but got Unknown
			int num = (int)colorIndex;
			if (num < 0 || num > GetLength(ref ColorCatalog.indexToHexString))
			{
				num = 14;
			}
			return GetItem(ref ColorCatalog.indexToHexString, num);
		}

		public static DamageColorIndex RegisterDamageColor(Color color)
		{
			SetHooks();
			byte num = (byte)DamageColor.colors.Length;
			ArrayUtils.ArrayAppend<Color>(ref DamageColor.colors, ref color);
			return (DamageColorIndex)num;
		}

		public static void AddSerializableDamageColor(SerializableDamageColor serializableDamageColor)
		{
			//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)
			SetHooks();
			if (addedSerializableDamageColors.Contains(serializableDamageColor))
			{
				ColorsPlugin.Logger.LogError((object)$"Attempted to add SerializableDamageColor {serializableDamageColor} twice! aborting.");
			}
			else
			{
				serializableDamageColor.DamageColorIndex = RegisterDamageColor(serializableDamageColor.color);
			}
		}

		public static ColorIndex RegisterColor(Color color)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			SetHooks();
			int length = GetLength(ref ColorCatalog.indexToColor32);
			Color32 val = Color32.op_Implicit(color);
			ArrayUtils.ArrayAppend<Color32>(ref ColorCatalog.indexToColor32, ref val);
			string text = Util.RGBToHex(Color32.op_Implicit(color));
			ArrayUtils.ArrayAppend<string>(ref ColorCatalog.indexToHexString, ref text);
			return (ColorIndex)length;
		}

		public static void AddSerializableColor(SerializableColorCatalogEntry serializableColor)
		{
			//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_0034: Unknown result type (might be due to invalid IL or missing references)
			SetHooks();
			if (addedSerializableColors.Contains(serializableColor))
			{
				ColorsPlugin.Logger.LogError((object)$"Attempted to add SerializableColor {serializableColor} twice! aborting.");
			}
			else
			{
				serializableColor.ColorIndex = RegisterColor(Color32.op_Implicit(serializableColor.color32));
			}
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private static int GetLength<T>(ref T[] array)
		{
			return array.Length;
		}

		[MethodImpl(MethodImplOptions.AggressiveInlining)]
		private static T GetItem<T>(ref T[] array, int i)
		{
			return array[i];
		}
	}
	[BepInPlugin("com.bepis.r2api.colors", "R2API.Colors", "1.0.3")]
	public sealed class ColorsPlugin : BaseUnityPlugin
	{
		internal static ManualLogSource Logger { get; set; }

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
		}

		private void OnDestroy()
		{
			ColorsAPI.UnsetHooks();
		}
	}
}
namespace R2API.AutoVersionGen
{
	[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
	internal class AutoVersionAttribute : Attribute
	{
	}
}
namespace R2API.ScriptableObjects
{
	[CreateAssetMenu(fileName = "New ColorCatalogEntry", menuName = "R2API/Colors/ColorCatalogEntry")]
	public class SerializableColorCatalogEntry : ScriptableObject
	{
		public Color32 color32;

		public ColorIndex ColorIndex { get; internal set; } = (ColorIndex)(-1);

	}
	[CreateAssetMenu(fileName = "New DamageColor", menuName = "R2API/Colors/DamageColor")]
	public class SerializableDamageColor : ScriptableObject
	{
		public Color color;

		public DamageColorIndex DamageColorIndex { get; internal set; }
	}
}