Decompiled source of Ring Swapper v1.2.2

Mods/RingSwapper.dll

Decompiled 3 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using MelonLoader;
using NostalgicRing;
using RUMBLE.Combat.ShiftStones;
using UnhollowerBaseLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(main), "Ring Swapper", "1.2.2", "UlvakSkillz", null)]
[assembly: MelonGame("Buckethead Entertainment", "RUMBLE")]
[assembly: AssemblyTitle("RingSwapper")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RingSwapper")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("2fa22153-4207-4920-b248-5fd3db5f3f12")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace NostalgicRing;

public class main : MelonMod
{
	private string settingsFile = "UserData\\RingSwapper\\Settings.txt";

	private string currentScene = "";

	private bool sceneChanged = false;

	private int[] ringTypes = new int[3];

	private int ringType = 0;

	private bool gymInitRan = false;

	private GameObject materialsGameObject;

	private Material[] materials;

	private Random random = new Random();

	public override void OnSceneWasLoaded(int buildIndex, string sceneName)
	{
		currentScene = sceneName;
		sceneChanged = true;
		if (File.Exists(settingsFile))
		{
			try
			{
				string[] array = File.ReadAllLines(settingsFile);
				ringTypes[0] = int.Parse(array[0]);
				ringTypes[1] = int.Parse(array[1]);
				ringTypes[2] = int.Parse(array[2]);
				if (array[3].ToString().ToLower() == "true")
				{
					ringTypes[0] = random.Next(0, 15);
					ringTypes[1] = random.Next(0, 15);
					ringTypes[2] = random.Next(0, 15);
				}
				if (ringType < 0 || 15 < ringType)
				{
					ringType = 0;
				}
				return;
			}
			catch (Exception arg)
			{
				MelonLogger.Error($"Error Reading {settingsFile}: {arg}");
				return;
			}
		}
		MelonLogger.Error("File not Found: " + settingsFile);
	}

	public override void OnFixedUpdate()
	{
		//IL_016f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0175: Expected O, but got Unknown
		//IL_01df: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e5: Expected O, but got Unknown
		//IL_024f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0255: Expected O, but got Unknown
		//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c7: Expected O, but got Unknown
		//IL_0333: Unknown result type (might be due to invalid IL or missing references)
		//IL_0339: Expected O, but got Unknown
		//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c7: Expected O, but got Unknown
		//IL_0358: Unknown result type (might be due to invalid IL or missing references)
		//IL_035e: Expected O, but got Unknown
		//IL_03cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d5: Expected O, but got Unknown
		//IL_019a: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a0: Expected O, but got Unknown
		//IL_020a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Expected O, but got Unknown
		//IL_027b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0281: Expected O, but got Unknown
		//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f3: Expected O, but got Unknown
		//IL_037b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0381: Expected O, but got Unknown
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Expected O, but got Unknown
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Expected O, but got Unknown
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Expected O, but got Unknown
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Expected O, but got Unknown
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: Expected O, but got Unknown
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: Expected O, but got Unknown
		//IL_012d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0133: Expected O, but got Unknown
		if (!sceneChanged)
		{
			return;
		}
		try
		{
			if (currentScene == "Gym")
			{
				if (!gymInitRan)
				{
					materials = (Material[])(object)new Material[13];
					materials[0] = new Material(((Renderer)GameObject.Find("Player Controller(Clone)/Visuals/Suit").GetComponent<SkinnedMeshRenderer>()).material);
					materials[1] = new Material(((Renderer)GameObject.Find("--------------SCENE--------------/Gym_Production/Sub static group(buildings)/Rumble_station/Root").GetComponent<MeshRenderer>()).material);
					materials[2] = new Material(((Renderer)GameObject.Find("--------------SCENE--------------/Gym_Production/Main static group/Spawn_area/SpawnRingFloor").GetComponent<MeshRenderer>()).material);
					materials[3] = new Material(((Renderer)GameObject.Find("--------------SCENE--------------/Gym_Production/Main static group/Foliage/Root_leaves").GetComponent<MeshRenderer>()).material);
					materials[4] = new Material(((Renderer)GameObject.Find("--------------SCENE--------------/Gym_Production/Main static group/FloorMeshParent/Floormesh").GetComponent<MeshRenderer>()).material);
					materials[5] = new Material(((Renderer)GameObject.Find("--------------SCENE--------------/Gym_Production/Sub static group(buildings)/Rumble_station/Wood/Bench/Woodset_large__1__1").GetComponent<MeshRenderer>()).material);
					try
					{
						materials[6] = new Material(((ShiftStone)GameObject.Find("Game Instance/Pre-Initializable/PoolManager/Pool: ChargeStone (RUMBLE.Combat.ShiftStones.ChargeStone)/ChargeStone").GetComponent<ChargeStone>()).gemRenderer.material);
					}
					catch
					{
						PlayerShiftStoneSystem component = GameObject.Find("Player Controller(Clone)/Shiftstones").GetComponent<PlayerShiftStoneSystem>();
						materials[6] = new Material(((Il2CppArrayBase<ShiftStone>)(object)component.GetEquippedShiftstones())[component.GetSocketIndex("Charge Stone")].gemRenderer.material);
					}
					try
					{
						materials[7] = new Material(((ShiftStone)GameObject.Find("Game Instance/Pre-Initializable/PoolManager/Pool: AdamantStone (RUMBLE.Combat.ShiftStones.UnyieldingStone)/AdamantStone").GetComponent<UnyieldingStone>()).gemRenderer.material);
					}
					catch
					{
						PlayerShiftStoneSystem component2 = GameObject.Find("Player Controller(Clone)/Shiftstones").GetComponent<PlayerShiftStoneSystem>();
						materials[7] = new Material(((Il2CppArrayBase<ShiftStone>)(object)component2.GetEquippedShiftstones())[component2.GetSocketIndex("Adamant Stone")].gemRenderer.material);
					}
					try
					{
						materials[8] = new Material(((ShiftStone)GameObject.Find("Game Instance/Pre-Initializable/PoolManager/Pool: GuardStone (RUMBLE.Combat.ShiftStones.GuardStone)/GuardStone").GetComponent<GuardStone>()).gemRenderer.material);
					}
					catch
					{
						PlayerShiftStoneSystem component3 = GameObject.Find("Player Controller(Clone)/Shiftstones").GetComponent<PlayerShiftStoneSystem>();
						materials[8] = new Material(((Il2CppArrayBase<ShiftStone>)(object)component3.GetEquippedShiftstones())[component3.GetSocketIndex("Guard Stone")].gemRenderer.material);
					}
					try
					{
						materials[9] = new Material(((ShiftStone)GameObject.Find("Game Instance/Pre-Initializable/PoolManager/Pool: VolatileStone (RUMBLE.Combat.ShiftStones.VolatileStone)/VolatileStone").GetComponent<VolatileStone>()).gemRenderer.material);
					}
					catch
					{
						PlayerShiftStoneSystem component4 = GameObject.Find("Player Controller(Clone)/Shiftstones").GetComponent<PlayerShiftStoneSystem>();
						materials[9] = new Material(((Il2CppArrayBase<ShiftStone>)(object)component4.GetEquippedShiftstones())[component4.GetSocketIndex("Volatile Stone")].gemRenderer.material);
					}
					try
					{
						materials[10] = new Material(((ShiftStone)GameObject.Find("Game Instance/Pre-Initializable/PoolManager/Pool: SurgeStone (RUMBLE.Combat.ShiftStones.CounterStone)/SurgeStone").GetComponent<CounterStone>()).gemRenderer.material);
					}
					catch
					{
						PlayerShiftStoneSystem component5 = GameObject.Find("Player Controller(Clone)/Shiftstones").GetComponent<PlayerShiftStoneSystem>();
						materials[10] = new Material(((Il2CppArrayBase<ShiftStone>)(object)component5.GetEquippedShiftstones())[component5.GetSocketIndex("Surge Stone")].gemRenderer.material);
					}
					materials[11] = new Material(((Renderer)GameObject.Find("Game Instance/Pre-Initializable/PoolManager/Pool: LargeRock (RUMBLE.MoveSystem.Structure)/LargeRock").GetComponent<MeshRenderer>()).material);
					try
					{
						materials[12] = new Material(((Renderer)GameObject.Find("--------------LOGIC--------------/Heinhouser products/ShiftstoneCabinet/Cabinet/ShiftstoneBox/FlowStone/Gem10 (1)").GetComponent<MeshRenderer>()).material);
					}
					catch
					{
						PlayerShiftStoneSystem component6 = GameObject.Find("Player Controller(Clone)/Shiftstones").GetComponent<PlayerShiftStoneSystem>();
						materials[11] = new Material(((Il2CppArrayBase<ShiftStone>)(object)component6.GetEquippedShiftstones())[component6.GetSocketIndex("Flow Stone")].gemRenderer.material);
					}
					materialsGameObject = new GameObject();
					materialsGameObject.AddComponent<MeshRenderer>();
					((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials = Il2CppReferenceArray<Material>.op_Implicit(materials);
					Object.DontDestroyOnLoad((Object)(object)materialsGameObject);
					gymInitRan = true;
					MelonLogger.Msg("Initialized");
				}
			}
			else if (currentScene == "Map0")
			{
				SwitchRingType(GameObject.Find("Map0_production/Main static group/Ring_boarder"));
			}
			else if (currentScene == "Map1")
			{
				SwitchRingType(GameObject.Find("Map1_production/Main static group/RingClamp"));
			}
			else if (currentScene == "Park")
			{
				SwitchRingType(GameObject.Find("________________SCENE_________________/Park/Main static group/Arenas/Gymarena/Arena"));
			}
			sceneChanged = false;
		}
		catch
		{
		}
	}

	private void SwitchRingType(GameObject objectToModify)
	{
		try
		{
			switch (currentScene)
			{
			case "Park":
				ringType = ringTypes[0];
				break;
			case "Map0":
				ringType = ringTypes[1];
				break;
			case "Map1":
				ringType = ringTypes[2];
				break;
			}
			switch (ringType)
			{
			case 1:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[1].shader, ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[1].shader);
				break;
			case 2:
				CopyReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[1], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[1]);
				break;
			case 3:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[0].shader, ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[0].shader);
				break;
			case 4:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[2].shader, ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[0].shader);
				break;
			case 5:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[1], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[1]);
				break;
			case 6:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[4], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[3]);
				break;
			case 7:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[5], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[5]);
				break;
			case 8:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[2].shader, ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[6]);
				break;
			case 9:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[6], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[2].shader);
				break;
			case 10:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[7], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[0].shader);
				break;
			case 11:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[8], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[6]);
				break;
			case 12:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[9], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[10]);
				break;
			case 13:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[11], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[11]);
				break;
			case 14:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[12], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[8]);
				break;
			case 15:
				ReskinRing(objectToModify.GetComponent<MeshRenderer>(), ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[9], ((Il2CppArrayBase<Material>)(object)((Renderer)materialsGameObject.GetComponent<MeshRenderer>()).materials)[12]);
				break;
			}
		}
		catch (Exception ex)
		{
			MelonLogger.Error((object)ex);
		}
	}

	private void CopyReskinRing(MeshRenderer meshRendererToBeReskinned, Material mat1, Material mat2)
	{
		if (currentScene == "Map0")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0].CopyPropertiesFromMaterial(mat1);
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1].CopyPropertiesFromMaterial(mat2);
		}
		else if (currentScene == "Map1")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0].CopyPropertiesFromMaterial(mat2);
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1].CopyPropertiesFromMaterial(mat1);
		}
		else if (currentScene == "Park")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1].CopyPropertiesFromMaterial(mat1);
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[2].CopyPropertiesFromMaterial(mat2);
		}
	}

	private void ReskinRing(MeshRenderer meshRendererToBeReskinned, Shader shader, Material material)
	{
		if (currentScene == "Map0")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0].shader = shader;
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit((Material[])(object)new Material[2]
			{
				((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0],
				material
			});
		}
		else if (currentScene == "Map1")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0].shader = shader;
			Material[] array = (Material[])(object)new Material[2];
			array[1] = ((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0];
			array[0] = material;
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit(array);
		}
		else if (currentScene == "Park")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1].shader = shader;
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit((Material[])(object)new Material[3]
			{
				((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0],
				((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1],
				material
			});
		}
	}

	private void ReskinRing(MeshRenderer meshRendererToBeReskinned, Material material, Shader shader)
	{
		if (currentScene == "Map0")
		{
			Material[] array = (Material[])(object)new Material[2]
			{
				material,
				((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1]
			};
			array[1].shader = shader;
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit(array);
		}
		else if (currentScene == "Map1")
		{
			Material[] array2 = (Material[])(object)new Material[2];
			array2[1] = material;
			array2[0] = ((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1];
			array2[0].shader = shader;
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit(array2);
		}
		else if (currentScene == "Park")
		{
			Material[] array3 = (Material[])(object)new Material[3]
			{
				((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0],
				material,
				((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[2]
			};
			array3[2].shader = shader;
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit(array3);
		}
	}

	private void ReskinRing(MeshRenderer meshRendererToBeReskinned, Shader shader1, Shader shader2)
	{
		if (currentScene == "Map0")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0].shader = shader1;
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1].shader = shader2;
		}
		else if (currentScene == "Map1")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1].shader = shader1;
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0].shader = shader2;
		}
		else if (currentScene == "Park")
		{
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[1].shader = shader1;
			((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[2].shader = shader2;
		}
	}

	private void ReskinRing(MeshRenderer meshRendererToBeReskinned, Material mat1, Material mat2)
	{
		if (currentScene == "Map0")
		{
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit((Material[])(object)new Material[2] { mat1, mat2 });
		}
		else if (currentScene == "Map1")
		{
			Material[] array = (Material[])(object)new Material[2];
			array[1] = mat1;
			array[0] = mat2;
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit(array);
		}
		else if (currentScene == "Park")
		{
			((Renderer)meshRendererToBeReskinned).materials = Il2CppReferenceArray<Material>.op_Implicit((Material[])(object)new Material[3]
			{
				((Il2CppArrayBase<Material>)(object)((Renderer)meshRendererToBeReskinned).materials)[0],
				mat1,
				mat2
			});
		}
	}
}