Decompiled source of ShiftedStones v1.0.0

Mods/ShiftedStones.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using HarmonyLib;
using Il2CppRUMBLE.Combat.ShiftStones;
using MelonLoader;
using Microsoft.CodeAnalysis;
using RumbleModUI;
using ShiftedStones;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(Core), "ShiftedStones", "1.0.0", "Orangenal", null)]
[assembly: MelonGame("Buckethead Entertainment", "RUMBLE")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("ShiftedStones")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3973c15787cc1bbcb98da230d8c148d9b0f3e130")]
[assembly: AssemblyProduct("ShiftedStones")]
[assembly: AssemblyTitle("ShiftedStones")]
[assembly: NeutralResourcesLanguage("en-US")]
[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 ShiftedStones
{
	public class Validation : ValidationParameters
	{
		public override bool DoValidation(string Input)
		{
			string pattern = "^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)\\s(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)\\s(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)$";
			string pattern2 = "^#?[0-9A-Fa-f]{6}$";
			if (Regex.IsMatch(Input, pattern) || Regex.IsMatch(Input, pattern2))
			{
				return true;
			}
			return false;
		}
	}
	public class Core : MelonMod
	{
		internal static Mod mod = new Mod();

		public static Material[] originalMaterials = (Material[])(object)new Material[8];

		public static Material[] clonedMaterials = (Material[])(object)new Material[8];

		internal static string[] shiftstoneOrder = new string[8] { "Flow Stone", "Vigor Stone", "Guard Stone", "Stubborn Stone", "Charge Stone", "Volatile Stone", "Surge Stone", "Adamant Stone" };

		internal static List<ShiftStone> loadedStones = new List<ShiftStone>();

		internal static List<MeshRenderer> customStones = new List<MeshRenderer>();

		internal static GameObject materialStorage;

		internal static Instance Logger;

		public override void OnInitializeMelon()
		{
			//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_005e: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Expected O, but got Unknown
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Expected O, but got Unknown
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Expected O, but got Unknown
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Expected O, but got Unknown
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Expected O, but got Unknown
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Expected O, but got Unknown
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Expected O, but got Unknown
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Expected O, but got Unknown
			mod.ModName = ((MelonBase)this).Info.Name;
			mod.ModVersion = ((MelonBase)this).Info.Version;
			mod.SetFolder("ShiftedStones");
			mod.AddDescription("Description", "", "A mod that lets you recolour shiftstones!", new Tags
			{
				IsSummary = true
			});
			mod.AddToList("Flow", "Vanilla", "Colour of the flow stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			mod.AddToList("Vigor", "Vanilla", "Colour of the vigor stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			mod.AddToList("Guard", "Vanilla", "Colour of the guard stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			mod.AddToList("Stubborn", "Vanilla", "Colour of the stubborn stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			mod.AddToList("Charge", "Vanilla", "Colour of the charge stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			mod.AddToList("Volatile", "Vanilla", "Colour of the volatile stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			mod.AddToList("Surge", "Vanilla", "Colour of the surge stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			mod.AddToList("Adamant", "Vanilla", "Colour of the adamant stone\n\nAccepts colours formatted as hex codes (e.g. #FF00CC) or 3 RGB values (e.g. 255 165 0)", new Tags());
			foreach (ModSetting setting in mod.Settings)
			{
				if (!setting.Tags.IsSummary)
				{
					setting.SavedValueChanged += OnSave;
					mod.AddValidation(setting.Name, (ValidationParameters)(object)new Validation());
				}
			}
			mod.GetFromFile();
			UI.instance.UI_Initialized += OnUIInit;
			materialStorage = new GameObject();
			((Object)materialStorage).name = "Shiftstone material storage";
			Object.DontDestroyOnLoad((Object)(object)materialStorage);
			Logger = ((MelonBase)this).LoggerInstance;
			((MelonBase)this).LoggerInstance.Msg("Initialised.");
		}

		private void OnUIInit()
		{
			UI.instance.AddMod(mod);
		}

		private void OnSave(object sender = null, EventArgs e = null)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			if (loadedStones.Count == 0 || !mod.GetUIStatus())
			{
				return;
			}
			string name = ((ModSetting)sender).Name;
			ShiftStone[] array = loadedStones.Where((ShiftStone s) => s.StoneName == name + " Stone").ToArray();
			string value = ((ValueChange<string>)(object)e).Value;
			foreach (MeshRenderer item in customStones.Where((MeshRenderer r) => ((Object)((Component)r).transform.parent.parent).name == name + "Stone"))
			{
				if (value.ToLower() == "vanilla" && customStones.Count > 0)
				{
					((Renderer)item).material = originalMaterials[((ReadOnlySpan<string>)shiftstoneOrder).IndexOf(name + " Stone")];
					continue;
				}
				((Renderer)item).material = clonedMaterials[((ReadOnlySpan<string>)shiftstoneOrder).IndexOf(name + " Stone")];
				Material material = ((Renderer)item).material;
				ShiftstonePatch.setColours(value, ref material);
			}
			for (int i = 0; i < array.Count(); i++)
			{
				if (!((Object)(object)array[i] == (Object)null) && array.Contains(array[i]))
				{
					MeshRenderer component = ((Component)((Component)array[i]).transform.GetChild(0)).GetComponent<MeshRenderer>();
					Material material2 = ((Renderer)component).material;
					if (value.ToLower() == "vanilla")
					{
						((Renderer)component).material = originalMaterials[((ReadOnlySpan<string>)shiftstoneOrder).IndexOf(name + " Stone")];
					}
					else
					{
						ShiftstonePatch.setColours(value, ref material2);
					}
				}
			}
		}

		public override void OnSceneWasUnloaded(int buildIndex, string sceneName)
		{
			loadedStones = new List<ShiftStone>();
			customStones = new List<MeshRenderer>();
		}
	}
	[HarmonyPatch(typeof(ShiftStone), "OnFetchFromPool")]
	internal static class ShiftstonePatch
	{
		internal static void setColours(string colourStr, ref Material material)
		{
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			if (colourStr.Contains(" "))
			{
				string[] array = colourStr.Split(' ');
				if (array.Length != 3 || !byte.TryParse(array[0], out var result) || !byte.TryParse(array[1], out var result2) || !byte.TryParse(array[2], out var result3))
				{
					Core.Logger.Error("Somehow not a valid colour");
					throw new Exception("Provided string is not in a valid format.");
				}
				((Color)(ref val))..ctor((float)(int)result / 255f, (float)(int)result2 / 255f, (float)(int)result3 / 255f);
			}
			else
			{
				if (colourStr.Length != 6 || !int.TryParse(colourStr, NumberStyles.HexNumber, null, out var result4))
				{
					Core.Logger.Error("Somehow not a valid colour");
					throw new Exception("Provided string is not in a valid format.");
				}
				float num = (float)((result4 >> 16) & 0xFF) / 255f;
				float num2 = (float)((result4 >> 8) & 0xFF) / 255f;
				float num3 = (float)(result4 & 0xFF) / 255f;
				((Color)(ref val))..ctor(num, num2, num3);
			}
			material.SetColor("_Core_Color", val);
			material.SetColor("_Edge_Color", val);
			float num4 = default(float);
			float num5 = default(float);
			float num6 = default(float);
			Color.RGBToHSV(val, ref num4, ref num5, ref num6);
			material.SetColor("_Base_Color", Color.HSVToRGB(num4, num5 * 3f / 4f, num6 * 3f / 4f));
			material.SetColor("_Shadow_Color", Color.HSVToRGB(num4, num5 * 1f / 2f, num6 * 1f / 2f));
		}

		[HarmonyBefore(new string[] { "ShifstoneModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null:Custom Shiftstone Models" })]
		private static void Postfix(ref ShiftStone __instance)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Expected O, but got Unknown
			//IL_0097: 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: Expected O, but got Unknown
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			int num = ((ReadOnlySpan<string>)Core.shiftstoneOrder).IndexOf(__instance.StoneName);
			MeshRenderer component = ((Component)((Component)__instance).transform.GetChild(0)).GetComponent<MeshRenderer>();
			if ((Object)(object)Core.originalMaterials[num] == (Object)null)
			{
				Core.originalMaterials[num] = new Material(((Renderer)component).material);
				GameObject obj = GameObject.CreatePrimitive((PrimitiveType)0);
				((Renderer)obj.GetComponent<MeshRenderer>()).material = Core.originalMaterials[num];
				((Object)obj).name = "Material Copy";
				obj.transform.parent = Core.materialStorage.transform;
				obj.transform.position = new Vector3(10000f, 10000f, 10000f);
			}
			if ((Object)(object)Core.clonedMaterials[num] == (Object)null)
			{
				Core.clonedMaterials[num] = new Material(((Renderer)component).material);
				GameObject obj2 = GameObject.CreatePrimitive((PrimitiveType)0);
				((Renderer)obj2.GetComponent<MeshRenderer>()).material = Core.clonedMaterials[num];
				((Object)obj2).name = "Material Copy";
				obj2.transform.parent = Core.materialStorage.transform;
				obj2.transform.position = new Vector3(10000f, 10000f, 10000f);
				if (((string)Core.mod.Settings[num + 1].SavedValue).ToLower() != "vanilla")
				{
					setColours((string)Core.mod.Settings[num + 1].SavedValue, ref Core.clonedMaterials[num]);
				}
			}
			((Renderer)component).material = ((((string)Core.mod.Settings[num + 1].SavedValue).ToLower() != "vanilla") ? Core.clonedMaterials : Core.originalMaterials)[num];
			if (!Core.loadedStones.Contains(__instance))
			{
				Core.loadedStones.Add(__instance);
			}
		}

		[HarmonyAfter(new string[] { "ShifstoneModels, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null:Custom Shiftstone Models" })]
		[HarmonyPostfix]
		private static void AddCustomModelRenderers(ref ShiftStone __instance)
		{
			if (((Component)__instance).transform.childCount <= 2)
			{
				return;
			}
			foreach (MeshRenderer componentsInChild in ((Component)__instance).GetComponentsInChildren<MeshRenderer>())
			{
				if (((Object)((Component)componentsInChild).gameObject).name.Contains("%"))
				{
					Core.customStones.Add(componentsInChild);
				}
			}
		}
	}
}