Decompiled source of MadVeteran Skinpack v1.5.3

Skins/MadVeteran_Acolyte.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MadVeteran_Core;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Acolyte;

public class BeetleGuard_AcolyteWingController : MonoBehaviour
{
	private float FullOpenWingValue = 30f;

	private float MaxWingSpeedValue = 60f;

	private Animator animator;

	private CharacterBody characterBody;

	private void Start()
	{
		if (!CorePlugin.Acolyte_MarkedCarapase_Enabled.Value)
		{
			((Behaviour)this).enabled = false;
		}
		animator = ((Component)this).GetComponent<Animator>();
		CharacterModel componentInParent = ((Component)this).GetComponentInParent<CharacterModel>();
		if (Object.op_Implicit((Object)(object)componentInParent) && Object.op_Implicit((Object)(object)componentInParent.body))
		{
			characterBody = componentInParent.body;
			FullOpenWingValue = CorePlugin.Acolyte_MarkedCarapase_OpenWing.Value;
			MaxWingSpeedValue = CorePlugin.Acolyte_MarkedCarapase_FlapWing.Value;
		}
	}

	private void FixedUpdate()
	{
		if (Object.op_Implicit((Object)(object)characterBody) && Object.op_Implicit((Object)(object)animator))
		{
			float magnitude = ((Vector3)(ref characterBody.characterMotor.velocity)).magnitude;
			float num = Mathf.InverseLerp(0f, FullOpenWingValue, magnitude);
			float num2 = Mathf.InverseLerp(FullOpenWingValue, MaxWingSpeedValue, magnitude);
			animator.SetFloat("Velocity", num);
			animator.SetLayerWeight(1, num2);
		}
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.KrononConpsirator.MadVeteran_Acolyte", "MadVeteran_Acolyte", "1.0.0")]
public class MadVeteran_AcolytePlugin : BaseUnityPlugin
{
	public static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_AcolytePlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_AcolytePlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Acolyte.krononconpsiratormadveteran_acolyte"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcolyte/BugboiLimbMat.mat", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcolyte/BugboiTorsoMat.mat", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcolyte/BugboiWingMat.mat");
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGCloudRemap.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcolyte/BugboiElytraMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_BUGBOIACOLYTESKINDEF_NAME", "Marked Carapace ");
	}

	private static void BodyCatalogInit()
	{
		AddAcolyteBodyBugBoiAcolyteSkinDefSkin();
	}

	private static SkinDef CreateAcolyteBodyBugBoiAcolyteSkinDefSkin(GameObject mdl, ModelSkinController skinController)
	{
		Renderer[] renderers = mdl.GetComponentsInChildren<Renderer>(true);
		mdl.GetComponentsInChildren<Light>(true);
		SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
		SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
		skin.skinDefParams = skinParams;
		((Object)skin).name = "BugBoiAcolyteSkinDef";
		skin.nameToken = "KRONONCONPSIRATOR_SKIN_BUGBOIACOLYTESKINDEF_NAME";
		skin.rootObject = mdl;
		Helpers.TryCatchThrow("Icon", delegate
		{
			skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Acolyte\\Icons\\BugBoiAcolyteSkinDefIcon.png");
		});
		Helpers.TryCatchThrow("Unlockable Name", delegate
		{
			skin.unlockableDef = null;
		});
		Helpers.TryCatchThrow("Base Skins", delegate
		{
			skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { Helpers.ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
		});
		Helpers.TryCatchThrow("Game Object Activations", delegate
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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_00b9: 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)
			skinParams.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[1]
			{
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(0, "There is no renderer at path \"chest\"", Helpers.GetChildGameObject(mdl, "chest")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(270f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcolyte/WingPrefab.prefab"))
				}
			};
		});
		Helpers.TryCatchThrow("Renderer Infos", delegate
		{
			//IL_0010: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: 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_00b1: 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_010b: Unknown result type (might be due to invalid IL or missing references)
			skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[2]
			{
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcolyte/BugboiLimbMat.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"acolyte_eyes\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "acolyte_eyes"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				},
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcolyte/BugboiTorsoMat.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(1, "There is no renderer with the name \"acolyte_geo\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "acolyte_geo"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				}
			};
		});
		Helpers.TryCatchThrow("MeshReplacements", delegate
		{
			//IL_0010: 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)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[2]
			{
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Acolyte\\Meshes\\BugBoi_Limbs.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"acolyte_eyes\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "acolyte_eyes")))
				},
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Acolyte\\Meshes\\BugBoi_Torso.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(1, "There is no renderer with the name \"acolyte_geo\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "acolyte_geo")))
				}
			};
		});
		Helpers.TryCatchThrow("Light Infos", delegate
		{
			skinParams.lightReplacements = Array.Empty<LightInfo>();
		});
		Helpers.TryCatchThrow("Minion Skin Replacements", delegate
		{
			skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
		});
		Helpers.TryCatchThrow("Projectile Ghost Replacements", delegate
		{
			skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
		});
		return skin;
	}

	private static void AddAcolyteBodyBugBoiAcolyteSkinDefSkin()
	{
		string text = "AcolyteBody";
		string text2 = "BugBoiAcolyteSkinDef";
		GameObject val = BodyCatalog.FindBodyPrefab(text);
		if (!Object.op_Implicit((Object)(object)val))
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
			return;
		}
		try
		{
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
			}
			else
			{
				SkinDef val3 = CreateAcolyteBodyBugBoiAcolyteSkinDefSkin(gameObject, val2);
				Array.Resize(ref val2.skins, val2.skins.Length + 1);
				val2.skins[val2.skins.Length - 1] = val3;
			}
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}
}
public class MeshActivator : MonoBehaviour
{
	[Serializable]
	public struct CustomRendererInfo
	{
		public Material material;

		public string addressableMaterialPath;

		public bool ignoreOverlays;

		public ShadowCastingMode shadowCastingMode;
	}

	[Header("Reference Settings")]
	[Tooltip("Name of the in-game original mesh object.")]
	public string referenceObjectName;

	[Tooltip("Copy Bone Data From Reference Object.")]
	public bool CopyBoneData = true;

	[Tooltip("Active state applied once registered.")]
	public bool initialActiveState = true;

	[Tooltip("Custom configuration for the renderer info applied to the CharacterModel.")]
	public CustomRendererInfo customRendererInfo = new CustomRendererInfo
	{
		shadowCastingMode = (ShadowCastingMode)1,
		ignoreOverlays = false
	};

	private CharacterModel characterModel;

	private SkinnedMeshRenderer ownRenderer;

	private bool registered;

	private IEnumerator Start()
	{
		for (int i = 0; i < 5; i++)
		{
			yield return null;
		}
		Register();
	}

	private void Register()
	{
		//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0204: Unknown result type (might be due to invalid IL or missing references)
		//IL_0209: Unknown result type (might be due to invalid IL or missing references)
		//IL_0220: 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_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_02a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_026c: Unknown result type (might be due to invalid IL or missing references)
		//IL_026d: Unknown result type (might be due to invalid IL or missing references)
		if (registered)
		{
			return;
		}
		ownRenderer = ((Component)this).GetComponent<SkinnedMeshRenderer>();
		if (!Object.op_Implicit((Object)(object)ownRenderer))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "' has no SkinnedMeshRenderer."), (Object)(object)this);
			return;
		}
		Transform val = FindReference();
		if (!Object.op_Implicit((Object)(object)val))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': '" + referenceObjectName + "'not found in its hierarchy."), (Object)(object)this);
			return;
		}
		characterModel = ((Component)val).GetComponentInParent<CharacterModel>();
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		}
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': no CharacterModel found above '" + ((Object)val).name + "'"), (Object)(object)this);
			return;
		}
		if (CopyBoneData)
		{
			SkinnedMeshRenderer val2 = ((Component)val).GetComponent<SkinnedMeshRenderer>();
			if (!Object.op_Implicit((Object)(object)val2))
			{
				val2 = ((Component)val).GetComponentInChildren<SkinnedMeshRenderer>(true);
			}
			if (Object.op_Implicit((Object)(object)val2))
			{
				ownRenderer.rootBone = val2.rootBone;
				ownRenderer.bones = val2.bones;
			}
			else
			{
				Debug.LogWarning((object)("[MeshActivator] '" + ((Object)val).name + "' has no SkinnedMeshRenderer to copy bones from."), (Object)(object)this);
			}
		}
		Material val3 = customRendererInfo.material;
		if (!Object.op_Implicit((Object)(object)val3) && !string.IsNullOrEmpty(customRendererInfo.addressableMaterialPath))
		{
			val3 = Addressables.LoadAssetAsync<Material>((object)customRendererInfo.addressableMaterialPath).WaitForCompletion();
			if (!Object.op_Implicit((Object)(object)val3))
			{
				Debug.LogWarning((object)("[MeshActivator] Failed to load material via Addressables path: '" + customRendererInfo.addressableMaterialPath + "'. Falling back to sharedMaterial."), (Object)(object)this);
			}
		}
		if (!Object.op_Implicit((Object)(object)val3))
		{
			val3 = ((Renderer)ownRenderer).sharedMaterial;
		}
		RendererInfo val4 = new RendererInfo
		{
			renderer = (Renderer)(object)ownRenderer,
			defaultMaterial = val3,
			defaultShadowCastingMode = customRendererInfo.shadowCastingMode,
			ignoreOverlays = customRendererInfo.ignoreOverlays
		};
		RendererInfo[] baseRendererInfos = characterModel.baseRendererInfos;
		int num = -1;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			if ((Object)(object)baseRendererInfos[i].renderer == (Object)(object)ownRenderer)
			{
				num = i;
				break;
			}
		}
		if (num >= 0)
		{
			baseRendererInfos[num] = val4;
		}
		else
		{
			Array.Resize(ref characterModel.baseRendererInfos, baseRendererInfos.Length + 1);
			characterModel.baseRendererInfos[characterModel.baseRendererInfos.Length - 1] = val4;
		}
		registered = true;
		characterModel.UpdateMaterials();
		((Component)this).gameObject.SetActive(initialActiveState);
	}

	private Transform FindReference()
	{
		if (string.IsNullOrEmpty(referenceObjectName))
		{
			return null;
		}
		Transform parent = ((Component)this).transform.parent;
		while (Object.op_Implicit((Object)(object)parent))
		{
			if (((Object)parent).name == referenceObjectName)
			{
				return parent;
			}
			Transform[] componentsInChildren = ((Component)parent).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!((Object)(object)val == (Object)(object)((Component)this).transform) && !val.IsChildOf(((Component)this).transform) && ((Object)val).name == referenceObjectName)
				{
					return val;
				}
			}
			parent = parent.parent;
		}
		return null;
	}
}
public static class Helpers
{
	private static GameObject prefabHolder;

	public static GameObject ClonePrefab(GameObject gameObject)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		if (!Object.op_Implicit((Object)(object)prefabHolder))
		{
			prefabHolder = new GameObject("PrefabHolder");
			Object.DontDestroyOnLoad((Object)(object)prefabHolder);
			prefabHolder.SetActive(false);
		}
		GameObject obj = Object.Instantiate<GameObject>(gameObject, prefabHolder.transform);
		obj.AddComponent<RemoveClone>();
		((Object)obj).name = ((Object)gameObject).name;
		return obj;
	}

	public static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}

	public static Transform GetChild(this Transform transform, int index, out Transform child)
	{
		return child = transform.GetChild(index);
	}

	public static GameObject WithComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		T obj = gameObject.AddComponent<T>();
		modifier?.Invoke(obj);
		return gameObject;
	}

	public static GameObject WithTryComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		if (Object.op_Implicit((Object)(object)gameObject) && !Object.op_Implicit((Object)(object)gameObject.GetComponent<T>()))
		{
			T obj = gameObject.AddComponent<T>();
			modifier?.Invoke(obj);
		}
		return gameObject;
	}

	public static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	public static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}
}
public class RemoveClone : MonoBehaviour
{
	public void Awake()
	{
		((Object)this).name = ((Object)this).name[..^7];
	}
}
public class FieldException : Exception
{
	public FieldException(string message, Exception innerException)
		: base(message, innerException)
	{
	}
}
public class ElementException : Exception
{
	public int Index { get; }

	public ElementException(int index, string message)
		: base(message)
	{
		Index = index;
	}
}
public class InsertBones : MonoBehaviour
{
	private readonly List<SkinnedMeshRenderer> modifiedRenderers = new List<SkinnedMeshRenderer>();

	public List<string> rendererPaths = new List<string>();

	public List<Transform> newBones = new List<Transform>();

	public string afterPath;

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		Transform value = ((Component)transform).transform.Find(afterPath);
		foreach (string rendererPath in rendererPaths)
		{
			Transform obj = transform.Find(rendererPath);
			SkinnedMeshRenderer val = ((obj != null) ? ((Component)obj).GetComponent<SkinnedMeshRenderer>() : null);
			if (Object.op_Implicit((Object)(object)val))
			{
				Transform[] array = val.bones;
				int num = Array.IndexOf(array, value) + 1;
				if (num != 0)
				{
					Array.Resize(ref array, array.Length + newBones.Count);
					Array.Copy(array, num, array, num + newBones.Count, array.Length - newBones.Count - num);
					newBones.CopyTo(array, num);
					val.bones = array;
					modifiedRenderers.Add(val);
				}
			}
		}
	}

	public void OnDestroy()
	{
		foreach (SkinnedMeshRenderer modifiedRenderer in modifiedRenderers)
		{
			if (Object.op_Implicit((Object)(object)modifiedRenderer))
			{
				Transform[] array = modifiedRenderer.bones;
				int num = Array.IndexOf(array, ((Component)this).transform);
				Array.Copy(array, num + newBones.Count, array, num, array.Length - num - newBones.Count);
				Array.Resize(ref array, array.Length - newBones.Count);
				modifiedRenderer.bones = array;
			}
		}
		modifiedRenderers.Clear();
	}
}
public class AddDynamicColliders : MonoBehaviour
{
	public List<string> paths = new List<string>();

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		List<DynamicBoneCollider> list = new List<DynamicBoneCollider>();
		foreach (string path in paths)
		{
			Transform val = transform.Find(path);
			if (Object.op_Implicit((Object)(object)val))
			{
				list.AddRange(((Component)val).GetComponents<DynamicBoneCollider>());
			}
		}
		DynamicBone[] components = ((Component)this).GetComponents<DynamicBone>();
		for (int i = 0; i < components.Length; i++)
		{
			components[i].m_Colliders.AddRange(list);
		}
	}
}

Skins/MadVeteran_Acrid.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MadVeteran_Core;
using MonoMod.RuntimeDetour.HookGen;
using On.RoR2;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Acrid;

public class MadVetAcrid_BileController : MonoBehaviour
{
	private string GlowMatPath = "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcrid/AcridNeo2GlowMat.mat";

	public TemporaryOverlayInstance BileGlowOverlay;

	private CharacterModel characterModel;

	private bool ConsoleDebug;

	private CharacterBody charBody;

	private Material CloneGlowMat;

	public Material InstancedCloneMat;

	[Header("Bile Offset Values")]
	[SerializeField]
	private float greenMin = -1f;

	[SerializeField]
	private float greenMax = 0.25f;

	[SerializeField]
	private float whiteMin = 0.16f;

	[SerializeField]
	private float whiteMax = 0.56f;

	[Header("Transition Settings")]
	public float holdDuration = 1.5f;

	private float transitionProgress = 1f;

	private float transitionDuration = 0.25f;

	private float holdTimer = 20f;

	private bool isHolding;

	private float currentGreen;

	private float baseGreen;

	private float targetGreen;

	private float currentWhite;

	private float baseWhite;

	private float targetWhite;

	private const string PropGreen = "_Heat2offset";

	private const string PropWhite = "_Heat3offset";

	private IEnumerator Start()
	{
		for (int i = 0; i < 15; i++)
		{
			yield return null;
		}
		characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		SetVariableFromConfig();
		Register();
		if (!CorePlugin.Acrid_AshenOne_Enabled.Value)
		{
			((Behaviour)this).enabled = false;
		}
		ConsoleDebug = CorePlugin.ConsoleDebug_Enabled.Value;
		if (Object.op_Implicit((Object)(object)characterModel) && (Object)(object)characterModel.body != (Object)null)
		{
			charBody = characterModel.body;
			for (int i = 0; i < 15; i++)
			{
				yield return null;
			}
			InstancedCloneMat = GetInstancedMat();
			if (Object.op_Implicit((Object)(object)InstancedCloneMat))
			{
				InstancedCloneMat.SetColor("_Heat2Color", CorePlugin.Acrid_AshenOne_PoisonColor.Value);
				CharacterBody.OnSkillActivated += new hook_OnSkillActivated(OnSkillActivated);
			}
			else
			{
				MadVeteran_AcridPlugin.InstanceLogger.LogError((object)"MadVeteranAcrid_BileController: Failed to find instanced material");
			}
		}
	}

	private void SetVariableFromConfig()
	{
		holdDuration = CorePlugin.Acrid_AshenOne_PoisonHold_Duration.Value;
		whiteMin = CorePlugin.Acrid_AshenOne_WhiteGradient_Min.Value;
		whiteMax = CorePlugin.Acrid_AshenOne_WhiteGradient_Max.Value;
		greenMin = CorePlugin.Acrid_AshenOne_PoisonGradient_Min.Value;
		greenMax = CorePlugin.Acrid_AshenOne_PoisonGradient_Max.Value;
	}

	private void Register()
	{
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Expected O, but got Unknown
		Material val = MadVeteran_AcridPlugin.assetBundle.LoadAsset<Material>(GlowMatPath);
		if ((Object)(object)val == (Object)null)
		{
			MadVeteran_AcridPlugin.InstanceLogger.LogError((object)("MadVeteranAcrid_BileController: Failed to load material at " + GlowMatPath));
			return;
		}
		if (ConsoleDebug)
		{
			MadVeteran_AcridPlugin.InstanceLogger.LogWarning((object)"Mat Glow Obtained");
		}
		currentGreen = greenMin;
		baseGreen = greenMin;
		targetGreen = greenMin;
		currentWhite = whiteMin;
		baseWhite = whiteMin;
		targetWhite = whiteMin;
		CloneGlowMat = new Material(val);
		((Object)CloneGlowMat).name = ((Object)CloneGlowMat).name + " (Instance)";
		if (CloneGlowMat.HasProperty("_Heat2offset"))
		{
			CloneGlowMat.SetFloat("_Heat2offset", currentGreen);
		}
		if (CloneGlowMat.HasProperty("_Heat3offset"))
		{
			CloneGlowMat.SetFloat("_Heat3offset", currentWhite);
		}
		if (BileGlowOverlay == null)
		{
			TemporaryOverlayInstance val2 = TemporaryOverlayManager.AddOverlay(((Component)characterModel).gameObject);
			val2.originalMaterial = CloneGlowMat;
			val2.inspectorCharacterModel = characterModel;
			val2.assignedCharacterModel = characterModel;
			val2.AddToCharacterModel(characterModel);
			BileGlowOverlay = val2;
			if (ConsoleDebug)
			{
				MadVeteran_AcridPlugin.InstanceLogger.LogWarning((object)"Mat Overlay On");
			}
		}
	}

	private Material GetInstancedMat()
	{
		return BileGlowOverlay.materialInstance;
	}

	private void OnSkillActivated(orig_OnSkillActivated orig, CharacterBody self, GenericSkill skill)
	{
		orig.Invoke(self, skill);
		if ((Object)(object)characterModel != (Object)null && (Object)(object)characterModel.body == (Object)(object)self)
		{
			TriggerBileGlow();
		}
	}

	public void TriggerBileGlow()
	{
		baseGreen = currentGreen;
		baseWhite = currentWhite;
		targetGreen = greenMax;
		targetWhite = whiteMax;
		transitionDuration = 0.15f;
		transitionProgress = 0f;
		isHolding = true;
		holdTimer = holdDuration;
	}

	private void FixedUpdate()
	{
		if (transitionProgress < 1f)
		{
			transitionProgress += Time.deltaTime / transitionDuration;
			float num = Mathf.Clamp01(transitionProgress);
			currentGreen = Mathf.Lerp(baseGreen, targetGreen, num);
			currentWhite = Mathf.Lerp(baseWhite, targetWhite, num);
			if (InstancedCloneMat.HasProperty("_Heat2offset"))
			{
				InstancedCloneMat.SetFloat("_Heat2offset", currentGreen);
			}
			if (InstancedCloneMat.HasProperty("_Heat3offset"))
			{
				InstancedCloneMat.SetFloat("_Heat3offset", currentWhite);
			}
		}
		if (isHolding && charBody.characterMotor.isGrounded)
		{
			holdTimer -= Time.deltaTime;
			if (holdTimer <= 0f)
			{
				baseGreen = currentGreen;
				baseWhite = currentWhite;
				targetGreen = greenMin;
				targetWhite = whiteMin;
				transitionDuration = 0.5f;
				transitionProgress = 0f;
				isHolding = false;
			}
		}
	}

	private void OnDestroy()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		CharacterBody.OnSkillActivated -= new hook_OnSkillActivated(OnSkillActivated);
		if ((Object)(object)CloneGlowMat != (Object)null)
		{
			Object.Destroy((Object)(object)CloneGlowMat);
		}
		if ((Object)(object)InstancedCloneMat != (Object)null)
		{
			Object.Destroy((Object)(object)InstancedCloneMat);
		}
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.KrononConpsirator.MadVeteran_Acrid", "MadVeteran_Acrid", "1.0.0")]
public class MadVeteran_AcridPlugin : BaseUnityPlugin
{
	public static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_AcridPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_AcridPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Acrid.krononconpsiratormadveteran_acrid"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcrid/AcridNeoPureBlackMat.mat", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcrid/AcridNeoBoneMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETACRIDSKINDEF_NAME", "Ashen Rat");
	}

	private static void BodyCatalogInit()
	{
		AddCrocoBodyMadVetAcridSkinDefSkin();
	}

	private static SkinDef CreateCrocoBodyMadVetAcridSkinDefSkin(GameObject mdl, ModelSkinController skinController)
	{
		Renderer[] renderers = mdl.GetComponentsInChildren<Renderer>(true);
		mdl.GetComponentsInChildren<Light>(true);
		List<string> skinnedRendererPaths = new List<string>();
		Renderer[] array = renderers;
		foreach (Renderer val in array)
		{
			if (val is SkinnedMeshRenderer)
			{
				skinnedRendererPaths.Add(Util.BuildPrefabTransformPath(mdl.transform, ((Component)val).transform, false, false));
			}
		}
		SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
		SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
		skin.skinDefParams = skinParams;
		((Object)skin).name = "MadVetAcridSkinDef";
		skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETACRIDSKINDEF_NAME";
		skin.rootObject = mdl;
		Helpers.TryCatchThrow("Icon", delegate
		{
			skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Acrid\\Icons\\MadVetAcridSkinDefIcon.png");
		});
		Helpers.TryCatchThrow("Unlockable Name", delegate
		{
			skin.unlockableDef = null;
		});
		Helpers.TryCatchThrow("Base Skins", delegate
		{
			skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { Helpers.ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
		});
		Helpers.TryCatchThrow("Game Object Activations", delegate
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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)
			//IL_0071: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: 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_0124: 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_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			skinParams.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[3]
			{
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"CrocoSpineMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "CrocoSpineMesh")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(1, "There is no renderer at path \"base\"", Helpers.GetChildGameObject(mdl, "base")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcrid/CrocoNeoAddon.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(2, "There is no renderer at path \"CrocoArmature/ROOT/base/hip\"", mdl.transform.Find("CrocoArmature/ROOT/base/hip"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(-1.554312E-15f, 2.701385f, 2.384186E-07f),
					localRotation = new Vector3(11.941f, 180f, 180f),
					localScale = new Vector3(1f, 1f, 0.9999933f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcrid/TailAddon.prefab")).WithComponent<InsertBones>((Action<InsertBones>)delegate(InsertBones c)
					{
						c.rendererPaths.AddRange(skinnedRendererPaths);
						c.afterPath = "CrocoArmature/ROOT/base/hip/thigh.r/calf.r/foot.r/heelToBall.r/ballToToe.r/toe3.r";
						Transform transform = ((Component)c).transform;
						c.newBones.Add(transform);
						c.newBones.Add(transform.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
					})
				}
			};
		});
		Helpers.TryCatchThrow("Renderer Infos", delegate
		{
			//IL_0010: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
			{
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoAcrid/AcridNeoPureBlackMat.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = true,
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"CrocoMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "CrocoMesh"))),
					hideOnDeath = true,
					ignoresMaterialOverrides = false
				}
			};
		});
		Helpers.TryCatchThrow("MeshReplacements", delegate
		{
			//IL_0010: 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)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
			{
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Acrid\\Meshes\\CrocoBodyMesh.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"CrocoMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "CrocoMesh")))
				}
			};
		});
		Helpers.TryCatchThrow("Light Infos", delegate
		{
			skinParams.lightReplacements = Array.Empty<LightInfo>();
		});
		Helpers.TryCatchThrow("Minion Skin Replacements", delegate
		{
			skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
		});
		Helpers.TryCatchThrow("Projectile Ghost Replacements", delegate
		{
			skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
		});
		return skin;
	}

	private static void AddCrocoBodyMadVetAcridSkinDefSkin()
	{
		string text = "CrocoBody";
		string text2 = "MadVetAcridSkinDef";
		GameObject val = BodyCatalog.FindBodyPrefab(text);
		if (!Object.op_Implicit((Object)(object)val))
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
			return;
		}
		try
		{
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
			}
			else
			{
				SkinDef val3 = CreateCrocoBodyMadVetAcridSkinDefSkin(gameObject, val2);
				Array.Resize(ref val2.skins, val2.skins.Length + 1);
				val2.skins[val2.skins.Length - 1] = val3;
			}
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}
}
public class MeshActivator : MonoBehaviour
{
	[Serializable]
	public struct CustomRendererInfo
	{
		public Material material;

		public string addressableMaterialPath;

		public bool ignoreOverlays;

		public ShadowCastingMode shadowCastingMode;
	}

	[Header("Reference Settings")]
	[Tooltip("Name of the in-game original mesh object.")]
	public string referenceObjectName;

	[Tooltip("Copy Bone Data From Reference Object.")]
	public bool CopyBoneData = true;

	[Tooltip("Active state applied once registered.")]
	public bool initialActiveState = true;

	[Tooltip("Custom configuration for the renderer info applied to the CharacterModel.")]
	public CustomRendererInfo customRendererInfo = new CustomRendererInfo
	{
		shadowCastingMode = (ShadowCastingMode)1,
		ignoreOverlays = false
	};

	private CharacterModel characterModel;

	private bool registered;

	private IEnumerator Start()
	{
		for (int i = 0; i < 2; i++)
		{
			yield return null;
		}
		Register();
	}

	private void Register()
	{
		//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: 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_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0212: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_0293: Unknown result type (might be due to invalid IL or missing references)
		//IL_0294: Unknown result type (might be due to invalid IL or missing references)
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_025c: Unknown result type (might be due to invalid IL or missing references)
		if (registered)
		{
			return;
		}
		Renderer component = ((Component)this).GetComponent<Renderer>();
		if (!Object.op_Implicit((Object)(object)component))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "' has no Renderer."), (Object)(object)this);
			return;
		}
		Transform val = FindReference();
		if (!Object.op_Implicit((Object)(object)val))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': '" + referenceObjectName + "' not found in its hierarchy."), (Object)(object)this);
			return;
		}
		characterModel = ((Component)val).GetComponentInParent<CharacterModel>();
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		}
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': no CharacterModel found above '" + ((Object)val).name + "'"), (Object)(object)this);
			return;
		}
		if (CopyBoneData)
		{
			SkinnedMeshRenderer val2 = ((Component)val).GetComponent<SkinnedMeshRenderer>();
			if (!Object.op_Implicit((Object)(object)val2))
			{
				val2 = ((Component)val).GetComponentInChildren<SkinnedMeshRenderer>(true);
			}
			if (Object.op_Implicit((Object)(object)val2))
			{
				SkinnedMeshRenderer val3 = (SkinnedMeshRenderer)(object)((component is SkinnedMeshRenderer) ? component : null);
				if (val3 != null)
				{
					val3.rootBone = val2.rootBone;
					val3.bones = val2.bones;
					goto IL_015d;
				}
			}
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)val).name + "' has no SkinnedMeshRenderer to copy bones from."), (Object)(object)this);
		}
		goto IL_015d;
		IL_015d:
		Material val4 = customRendererInfo.material;
		if (!Object.op_Implicit((Object)(object)val4) && !string.IsNullOrEmpty(customRendererInfo.addressableMaterialPath))
		{
			val4 = Addressables.LoadAssetAsync<Material>((object)customRendererInfo.addressableMaterialPath).WaitForCompletion();
			if (!Object.op_Implicit((Object)(object)val4))
			{
				Debug.LogWarning((object)("[MeshActivator] Failed to load material via Addressables path: '" + customRendererInfo.addressableMaterialPath + "'. Falling back to sharedMaterial."), (Object)(object)this);
			}
		}
		if (!Object.op_Implicit((Object)(object)val4))
		{
			val4 = component.sharedMaterial;
		}
		RendererInfo val5 = new RendererInfo
		{
			renderer = component,
			defaultMaterial = val4,
			defaultShadowCastingMode = customRendererInfo.shadowCastingMode,
			ignoreOverlays = customRendererInfo.ignoreOverlays
		};
		RendererInfo[] baseRendererInfos = characterModel.baseRendererInfos;
		int num = -1;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			if ((Object)(object)baseRendererInfos[i].renderer == (Object)(object)component)
			{
				num = i;
				break;
			}
		}
		if (num >= 0)
		{
			baseRendererInfos[num] = val5;
		}
		else
		{
			Array.Resize(ref characterModel.baseRendererInfos, baseRendererInfos.Length + 1);
			characterModel.baseRendererInfos[characterModel.baseRendererInfos.Length - 1] = val5;
		}
		registered = true;
		characterModel.UpdateMaterials();
		((Component)this).gameObject.SetActive(initialActiveState);
	}

	private Transform FindReference()
	{
		if (string.IsNullOrEmpty(referenceObjectName))
		{
			return null;
		}
		Transform parent = ((Component)this).transform.parent;
		while (Object.op_Implicit((Object)(object)parent))
		{
			if (((Object)parent).name == referenceObjectName)
			{
				return parent;
			}
			Transform[] componentsInChildren = ((Component)parent).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!((Object)(object)val == (Object)(object)((Component)this).transform) && !val.IsChildOf(((Component)this).transform) && ((Object)val).name == referenceObjectName)
				{
					return val;
				}
			}
			parent = parent.parent;
		}
		return null;
	}
}
public static class Helpers
{
	private static GameObject prefabHolder;

	public static GameObject ClonePrefab(GameObject gameObject)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		if (!Object.op_Implicit((Object)(object)prefabHolder))
		{
			prefabHolder = new GameObject("PrefabHolder");
			Object.DontDestroyOnLoad((Object)(object)prefabHolder);
			prefabHolder.SetActive(false);
		}
		GameObject obj = Object.Instantiate<GameObject>(gameObject, prefabHolder.transform);
		obj.AddComponent<RemoveClone>();
		((Object)obj).name = ((Object)gameObject).name;
		return obj;
	}

	public static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}

	public static Transform GetChild(this Transform transform, int index, out Transform child)
	{
		return child = transform.GetChild(index);
	}

	public static GameObject WithComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		T obj = gameObject.AddComponent<T>();
		modifier?.Invoke(obj);
		return gameObject;
	}

	public static GameObject WithTryComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		if (Object.op_Implicit((Object)(object)gameObject) && !Object.op_Implicit((Object)(object)gameObject.GetComponent<T>()))
		{
			T obj = gameObject.AddComponent<T>();
			modifier?.Invoke(obj);
		}
		return gameObject;
	}

	public static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	public static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}
}
public class RemoveClone : MonoBehaviour
{
	public void Awake()
	{
		((Object)this).name = ((Object)this).name[..^7];
	}
}
public class FieldException : Exception
{
	public FieldException(string message, Exception innerException)
		: base(message, innerException)
	{
	}
}
public class ElementException : Exception
{
	public int Index { get; }

	public ElementException(int index, string message)
		: base(message)
	{
		Index = index;
	}
}
public class InsertBones : MonoBehaviour
{
	private readonly List<SkinnedMeshRenderer> modifiedRenderers = new List<SkinnedMeshRenderer>();

	public List<string> rendererPaths = new List<string>();

	public List<Transform> newBones = new List<Transform>();

	public string afterPath;

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		Transform value = ((Component)transform).transform.Find(afterPath);
		foreach (string rendererPath in rendererPaths)
		{
			Transform obj = transform.Find(rendererPath);
			SkinnedMeshRenderer val = ((obj != null) ? ((Component)obj).GetComponent<SkinnedMeshRenderer>() : null);
			if (Object.op_Implicit((Object)(object)val))
			{
				Transform[] array = val.bones;
				int num = Array.IndexOf(array, value) + 1;
				if (num != 0)
				{
					Array.Resize(ref array, array.Length + newBones.Count);
					Array.Copy(array, num, array, num + newBones.Count, array.Length - newBones.Count - num);
					newBones.CopyTo(array, num);
					val.bones = array;
					modifiedRenderers.Add(val);
				}
			}
		}
	}

	public void OnDestroy()
	{
		foreach (SkinnedMeshRenderer modifiedRenderer in modifiedRenderers)
		{
			if (Object.op_Implicit((Object)(object)modifiedRenderer))
			{
				Transform[] array = modifiedRenderer.bones;
				int num = Array.IndexOf(array, ((Component)this).transform);
				Array.Copy(array, num + newBones.Count, array, num, array.Length - num - newBones.Count);
				Array.Resize(ref array, array.Length - newBones.Count);
				modifiedRenderer.bones = array;
			}
		}
		modifiedRenderers.Clear();
	}
}
public class AddDynamicColliders : MonoBehaviour
{
	public List<string> paths = new List<string>();

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		List<DynamicBoneCollider> list = new List<DynamicBoneCollider>();
		foreach (string path in paths)
		{
			Transform val = transform.Find(path);
			if (Object.op_Implicit((Object)(object)val))
			{
				list.AddRange(((Component)val).GetComponents<DynamicBoneCollider>());
			}
		}
		DynamicBone[] components = ((Component)this).GetComponents<DynamicBone>();
		for (int i = 0; i < components.Length; i++)
		{
			components[i].m_Colliders.AddRange(list);
		}
	}
}

Skins/MadVeteran_Artificer.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Artificer;

[BepInPlugin("com.KrononConpsirator.MadVeteran_Artificer", "MadVeteran_Artificer", "1.0.0")]
public class MadVeteran_ArtificerPlugin : BaseUnityPlugin
{
	private class FieldException : Exception
	{
		public FieldException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}

	private class ElementException : Exception
	{
		public int Index { get; }

		public ElementException(int index, string message)
			: base(message)
		{
			Index = index;
		}
	}

	private static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_ArtificerPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_ArtificerPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Artificer.krononconpsiratormadveteran_artificer"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti/NeoArtiMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETARTIFICERSKINDEF_NAME", "Star Witch");
	}

	private static void BodyCatalogInit()
	{
		AddMageBodyMadVetArtificerSkinDefSkin();
	}

	private static void AddMageBodyMadVetArtificerSkinDefSkin()
	{
		if (!((BaseUnityPlugin)Instance).Config.Bind<bool>("MadVetArtificerSkinDef", "Enabled", false, (ConfigDescription)null).Value)
		{
			return;
		}
		string text = "MageBody";
		string text2 = "MadVetArtificerSkinDef";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject mdl = ((Component)component.modelTransform).gameObject;
			ModelSkinController skinController = (Object.op_Implicit((Object)(object)mdl) ? mdl.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)skinController))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = mdl.GetComponentsInChildren<Renderer>(true);
			mdl.GetComponentsInChildren<Light>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
			skin.skinDefParams = skinParams;
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Artificer\\Icons\\MadVetArtificerSkinDefIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETARTIFICERSKINDEF_NAME";
			skin.rootObject = mdl;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				//IL_0010: Unknown result type (might be due to invalid IL or missing references)
				//IL_0063: 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)
				//IL_007e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0083: 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_009e: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b9: 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)
				skinParams.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[1]
				{
					new GameObjectActivation
					{
						gameObject = ((Component)ThrowIfNull<Transform>(0, "There is no renderer at path \"MageArmature\"", mdl.transform.Find("MageArmature"))).gameObject,
						shouldActivate = false,
						spawnPrefabOnModelObject = true,
						localPosition = new Vector3(0f, 0f, 0f),
						localRotation = new Vector3(0f, 0f, 0f),
						localScale = new Vector3(1f, 1f, 1f),
						prefab = assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti/MageNeoAddon.prefab")
					}
				};
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0010: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				//IL_0082: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: 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)
				skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[2]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti/NeoArtiMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MageCapeMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageCapeMesh")))
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti/NeoArtiMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(1, "There is no renderer with the name \"MageMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageMesh")))
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
				skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[2]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Artificer\\Meshes\\MageNeoBody.mesh"),
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MageCapeMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageCapeMesh")))
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Artificer\\Meshes\\MageNeoHat.mesh"),
						renderer = ThrowIfNull<Renderer>(1, "There is no renderer with the name \"MageMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageMesh")))
					}
				};
			});
			TryCatchThrow("Light Infos", delegate
			{
				skinParams.lightReplacements = (LightInfo[])(object)new LightInfo[0];
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}

	private static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	private static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}

	private static void TryAddComponent<T>(GameObject obj) where T : Component
	{
		if (Object.op_Implicit((Object)(object)obj) && !Object.op_Implicit((Object)(object)obj.GetComponent<T>()))
		{
			obj.AddComponent<T>();
		}
	}

	private static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}
}
public class MeshActivator : MonoBehaviour
{
	[Serializable]
	public struct CustomRendererInfo
	{
		public Material material;

		public string addressableMaterialPath;

		public bool ignoreOverlays;

		public ShadowCastingMode shadowCastingMode;
	}

	[Header("Reference Settings")]
	[Tooltip("Name of the in-game original mesh object.")]
	public string referenceObjectName;

	[Tooltip("Copy Bone Data From Reference Object.")]
	public bool CopyBoneData = true;

	[Tooltip("Active state applied once registered.")]
	public bool initialActiveState = true;

	[Tooltip("Custom configuration for the renderer info applied to the CharacterModel.")]
	public CustomRendererInfo customRendererInfo = new CustomRendererInfo
	{
		shadowCastingMode = (ShadowCastingMode)1,
		ignoreOverlays = false
	};

	private CharacterModel characterModel;

	private SkinnedMeshRenderer ownRenderer;

	private bool registered;

	private IEnumerator Start()
	{
		for (int i = 0; i < 5; i++)
		{
			yield return null;
		}
		Register();
	}

	private void Register()
	{
		//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0204: Unknown result type (might be due to invalid IL or missing references)
		//IL_0209: Unknown result type (might be due to invalid IL or missing references)
		//IL_0220: 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_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_02a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_026c: Unknown result type (might be due to invalid IL or missing references)
		//IL_026d: Unknown result type (might be due to invalid IL or missing references)
		if (registered)
		{
			return;
		}
		ownRenderer = ((Component)this).GetComponent<SkinnedMeshRenderer>();
		if (!Object.op_Implicit((Object)(object)ownRenderer))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "' has no SkinnedMeshRenderer."), (Object)(object)this);
			return;
		}
		Transform val = FindReference();
		if (!Object.op_Implicit((Object)(object)val))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': '" + referenceObjectName + "'not found in its hierarchy."), (Object)(object)this);
			return;
		}
		characterModel = ((Component)val).GetComponentInParent<CharacterModel>();
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		}
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': no CharacterModel found above '" + ((Object)val).name + "'"), (Object)(object)this);
			return;
		}
		if (CopyBoneData)
		{
			SkinnedMeshRenderer val2 = ((Component)val).GetComponent<SkinnedMeshRenderer>();
			if (!Object.op_Implicit((Object)(object)val2))
			{
				val2 = ((Component)val).GetComponentInChildren<SkinnedMeshRenderer>(true);
			}
			if (Object.op_Implicit((Object)(object)val2))
			{
				ownRenderer.rootBone = val2.rootBone;
				ownRenderer.bones = val2.bones;
			}
			else
			{
				Debug.LogWarning((object)("[MeshActivator] '" + ((Object)val).name + "' has no SkinnedMeshRenderer to copy bones from."), (Object)(object)this);
			}
		}
		Material val3 = customRendererInfo.material;
		if (!Object.op_Implicit((Object)(object)val3) && !string.IsNullOrEmpty(customRendererInfo.addressableMaterialPath))
		{
			val3 = Addressables.LoadAssetAsync<Material>((object)customRendererInfo.addressableMaterialPath).WaitForCompletion();
			if (!Object.op_Implicit((Object)(object)val3))
			{
				Debug.LogWarning((object)("[MeshActivator] Failed to load material via Addressables path: '" + customRendererInfo.addressableMaterialPath + "'. Falling back to sharedMaterial."), (Object)(object)this);
			}
		}
		if (!Object.op_Implicit((Object)(object)val3))
		{
			val3 = ((Renderer)ownRenderer).sharedMaterial;
		}
		RendererInfo val4 = new RendererInfo
		{
			renderer = (Renderer)(object)ownRenderer,
			defaultMaterial = val3,
			defaultShadowCastingMode = customRendererInfo.shadowCastingMode,
			ignoreOverlays = customRendererInfo.ignoreOverlays
		};
		RendererInfo[] baseRendererInfos = characterModel.baseRendererInfos;
		int num = -1;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			if ((Object)(object)baseRendererInfos[i].renderer == (Object)(object)ownRenderer)
			{
				num = i;
				break;
			}
		}
		if (num >= 0)
		{
			baseRendererInfos[num] = val4;
		}
		else
		{
			Array.Resize(ref characterModel.baseRendererInfos, baseRendererInfos.Length + 1);
			characterModel.baseRendererInfos[characterModel.baseRendererInfos.Length - 1] = val4;
		}
		registered = true;
		characterModel.UpdateMaterials();
		((Component)this).gameObject.SetActive(initialActiveState);
	}

	private Transform FindReference()
	{
		if (string.IsNullOrEmpty(referenceObjectName))
		{
			return null;
		}
		Transform parent = ((Component)this).transform.parent;
		while (Object.op_Implicit((Object)(object)parent))
		{
			if (((Object)parent).name == referenceObjectName)
			{
				return parent;
			}
			Transform[] componentsInChildren = ((Component)parent).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!((Object)(object)val == (Object)(object)((Component)this).transform) && !val.IsChildOf(((Component)this).transform) && ((Object)val).name == referenceObjectName)
				{
					return val;
				}
			}
			parent = parent.parent;
		}
		return null;
	}
}

Skins/MadVeteran_Artificer2.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MadVeteran_Core;
using MonoMod.RuntimeDetour.HookGen;
using On.RoR2;
using RoR2;
using RoR2.ContentManagement;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Artificer2;

public class Arti2_ColorController : MonoBehaviour
{
	private class ManagedMaterial
	{
		public Material material;

		public string propertyName;

		public Color baseColor = Color.white;

		public Color defaultColor = Color.white;

		public Color currentColor = Color.white;

		public Color targetColor = Color.white;
	}

	private CharacterModel characterModel;

	private bool ConsoleDebug;

	private List<ManagedMaterial> managedMaterials = new List<ManagedMaterial>();

	private List<Material> instantiatedMaterials = new List<Material>();

	[Header("Transition Settings")]
	public float holdDuration = 1.5f;

	private float transitionProgress = 1f;

	private float transitionDuration = 0.25f;

	private float holdTimer = 20f;

	private bool isHolding;

	private (string Keyword, Color Cloth, Color Crystal)[] ElementRules;

	private IEnumerator Start()
	{
		for (int i = 0; i < 15; i++)
		{
			yield return null;
		}
		if (!CorePlugin.Artificer_AstroDeus_Enabled.Value)
		{
			((Behaviour)this).enabled = false;
		}
		ConsoleDebug = CorePlugin.ConsoleDebug_Enabled.Value;
		characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		if (Object.op_Implicit((Object)(object)characterModel) && (Object)(object)characterModel.body != (Object)null)
		{
			SetupAndDuplicateMaterials();
			ElementRules = CorePlugin.GetArtificerElementRules();
			CharacterBody.OnSkillActivated += new hook_OnSkillActivated(OnSkillActivated);
		}
	}

	private void OnSkillActivated(orig_OnSkillActivated orig, CharacterBody self, GenericSkill skill)
	{
		//IL_0077: 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)
		orig.Invoke(self, skill);
		if (!((Object)(object)characterModel.body == (Object)(object)self) || !((Object)(object)skill.skillDef != (Object)null))
		{
			return;
		}
		string skillNameToken = skill.skillDef.skillNameToken;
		if (ConsoleDebug)
		{
			MadVeteran_Artificer2Plugin.InstanceLogger.LogWarning((object)("Skill Token Is: " + skillNameToken));
		}
		(string, Color, Color)[] elementRules = ElementRules;
		for (int i = 0; i < elementRules.Length; i++)
		{
			(string, Color, Color) tuple = elementRules[i];
			if (skillNameToken.IndexOf(tuple.Item1, StringComparison.OrdinalIgnoreCase) >= 0)
			{
				TriggerSkillColors(tuple.Item2, tuple.Item3, 0.15f);
				break;
			}
		}
	}

	private void SetupAndDuplicateMaterials()
	{
		//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_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Expected O, but got Unknown
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: 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_00cf: 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_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: 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_0107: Unknown result type (might be due to invalid IL or missing references)
		RendererInfo[] baseRendererInfos = characterModel.baseRendererInfos;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			RendererInfo val = baseRendererInfos[i];
			if (!((Object)(object)val.defaultMaterial != (Object)null))
			{
				continue;
			}
			string text = ((Object)val.defaultMaterial).name.Replace(" (Instance)", "");
			string text2 = null;
			if (text.Contains("MadVetArti2Cloth") || text.Contains("MadVetArti2Crystal"))
			{
				text2 = "_Color";
			}
			if (text2 != null)
			{
				Material val2 = new Material(val.defaultMaterial);
				instantiatedMaterials.Add(val2);
				baseRendererInfos[i].defaultMaterial = val2;
				if (Object.op_Implicit((Object)(object)val.renderer))
				{
					val.renderer.material = val2;
				}
				Color val3 = (val2.HasProperty(text2) ? val2.GetColor(text2) : Color.white);
				managedMaterials.Add(new ManagedMaterial
				{
					material = val2,
					propertyName = text2,
					defaultColor = val3,
					baseColor = val3,
					currentColor = val3,
					targetColor = val3
				});
			}
		}
	}

	public void TriggerSkillColors(Color clothColor, Color crystalColor, float duration)
	{
		//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_003a: 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_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		foreach (ManagedMaterial managedMaterial in managedMaterials)
		{
			managedMaterial.baseColor = managedMaterial.currentColor;
			if (((Object)managedMaterial.material).name.Contains("MadVetArti2Cloth"))
			{
				managedMaterial.targetColor = clothColor;
			}
			else if (((Object)managedMaterial.material).name.Contains("MadVetArti2Crystal"))
			{
				managedMaterial.targetColor = crystalColor;
			}
		}
		transitionDuration = duration;
		transitionProgress = 0f;
		isHolding = true;
		holdTimer = holdDuration;
	}

	private void FixedUpdate()
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: 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_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: 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: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		if (transitionProgress < 1f)
		{
			transitionProgress += Time.deltaTime / transitionDuration;
			float num = Mathf.Clamp01(transitionProgress);
			foreach (ManagedMaterial managedMaterial in managedMaterials)
			{
				managedMaterial.currentColor = Color.Lerp(managedMaterial.baseColor, managedMaterial.targetColor, num);
				if (managedMaterial.material.HasProperty(managedMaterial.propertyName))
				{
					managedMaterial.material.SetColor(managedMaterial.propertyName, managedMaterial.currentColor);
				}
			}
		}
		if (!isHolding)
		{
			return;
		}
		holdTimer -= Time.deltaTime;
		if (!(holdTimer <= 0f))
		{
			return;
		}
		foreach (ManagedMaterial managedMaterial2 in managedMaterials)
		{
			managedMaterial2.baseColor = managedMaterial2.currentColor;
			managedMaterial2.targetColor = managedMaterial2.defaultColor;
		}
		transitionDuration = 0.5f;
		transitionProgress = 0f;
		isHolding = false;
	}

	private void OnDestroy()
	{
		foreach (Material instantiatedMaterial in instantiatedMaterials)
		{
			if ((Object)(object)instantiatedMaterial != (Object)null)
			{
				Object.Destroy((Object)(object)instantiatedMaterial);
			}
		}
		instantiatedMaterials.Clear();
		managedMaterials.Clear();
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.KrononConpsirator.MadVeteran_Artificer2", "MadVeteran_Artificer2", "1.0.0")]
public class MadVeteran_Artificer2Plugin : BaseUnityPlugin
{
	public class SkinAddedArgs : EventArgs
	{
		public SkinDef skinDef { get; }

		public GameObject bodyPrefab { get; }

		public SkinAddedArgs(SkinDef newSkinDef, GameObject newGameObject)
		{
			skinDef = newSkinDef;
			bodyPrefab = newGameObject;
		}
	}

	public class MaterialDuplicatorExtension
	{
		internal void BeforeStart()
		{
		}

		internal void AfterStart()
		{
			try
			{
				MadVetArti2Crystal();
			}
			catch (Exception ex)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)("MaterialDuplicator entry 0 failed: " + ex));
				}
			}
			try
			{
				MadVetArti2JetFlame();
			}
			catch (Exception ex2)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)("MaterialDuplicator entry 1 failed: " + ex2));
				}
			}
		}

		internal void BeforeBodyCatalogInit()
		{
		}

		internal void AfterBodyCatalogInit()
		{
		}

		private void MadVetArti2Crystal()
		{
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			Material val = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2Crystal.mat");
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)"MaterialDuplicator: material not found in bundle: Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2Crystal.mat");
				}
				return;
			}
			Material val2 = MaterialDuplicator_LoadAddressable<Material>("RoR2/Base/Mage/matMageIce.mat");
			if ((Object)(object)val2 == (Object)null)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)"MaterialDuplicator: reference material missing, skipping MadVetArti2Crystal");
				}
			}
			else
			{
				val.shader = val2.shader;
				val.CopyPropertiesFromMaterial(val2);
				val.shaderKeywords = val2.shaderKeywords;
				val.renderQueue = val2.renderQueue;
				val.SetColor("_Color", new Color(1f, 1f, 1f, 1f));
			}
		}

		private void MadVetArti2JetFlame()
		{
			Material val = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2JetFlame.mat");
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)"MaterialDuplicator: material not found in bundle: Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2JetFlame.mat");
				}
				return;
			}
			Material val2 = MaterialDuplicator_LoadAddressable<Material>("RoR2/Base/Common/VFX/mageMageFireStarburst.mat");
			if ((Object)(object)val2 == (Object)null)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)"MaterialDuplicator: reference material missing, skipping MadVetArti2JetFlame");
				}
				return;
			}
			val.shader = val2.shader;
			val.CopyPropertiesFromMaterial(val2);
			val.shaderKeywords = val2.shaderKeywords;
			val.renderQueue = val2.renderQueue;
			Texture val3 = assetBundle.LoadAsset<Texture>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/texRampCamuflage.png");
			if ((Object)(object)val3 == (Object)null)
			{
				ManualLogSource instanceLogger3 = InstanceLogger;
				if (instanceLogger3 != null)
				{
					instanceLogger3.LogWarning((object)"MaterialDuplicator: texture for _RemapTex could not be loaded.");
				}
			}
			else
			{
				val.SetTexture("_RemapTex", val3);
			}
			val.SetFloat("_AlphaBoost", 0.8232449f);
		}

		private static T MaterialDuplicator_LoadAddressable<T>(string key) where T : Object
		{
			//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)
			try
			{
				return Addressables.LoadAssetAsync<T>((object)key).WaitForCompletion();
			}
			catch (Exception ex)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)("MaterialDuplicator: could not load addressable '" + key + "': " + ex.Message));
				}
				return default(T);
			}
		}
	}

	private static MaterialDuplicatorExtension _MaterialDuplicatorExtension = new MaterialDuplicatorExtension();

	public static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_Artificer2Plugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_Artificer2Plugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private static event EventHandler<SkinAddedArgs> MageBodyMadVetArtificer2SkinDefSkinAddedEvent;

	private void Start()
	{
		Instance = this;
		BeforeStart();
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Artificer2.krononconpsiratormadveteran_artificer2"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
		AfterStart();
	}

	private void BeforeStart()
	{
		try
		{
			_MaterialDuplicatorExtension.BeforeStart();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator BeforeStart failed: " + ex));
			}
		}
	}

	private void AfterStart()
	{
		try
		{
			_MaterialDuplicatorExtension.AfterStart();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator AfterStart failed: " + ex));
			}
		}
	}

	private static void BeforeBodyCatalogInit()
	{
		try
		{
			_MaterialDuplicatorExtension.BeforeBodyCatalogInit();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator BeforeBodyCatalogInit failed: " + ex));
			}
		}
	}

	private static void AfterBodyCatalogInit()
	{
		try
		{
			_MaterialDuplicatorExtension.AfterBodyCatalogInit();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator AfterBodyCatalogInit failed: " + ex));
			}
		}
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2Crystal.mat", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2Cloth.mat", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2BodyMat.mat");
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGOpaqueCloudRemap.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2StarCloth.mat");
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGCloudRemap.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2JetFlame.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETARTIFICER2SKINDEF_NAME", "Astro Deus");
	}

	private static void BodyCatalogInit()
	{
		BeforeBodyCatalogInit();
		AddMageBodyMadVetArtificer2SkinDefSkin();
		AfterBodyCatalogInit();
	}

	private static void MageBodyMadVetArtificer2SkinDefSkinAdded(SkinDef skinDef, GameObject bodyPrefab)
	{
		MadVeteran_Artificer2Plugin.MageBodyMadVetArtificer2SkinDefSkinAddedEvent?.Invoke(Instance, new SkinAddedArgs(skinDef, bodyPrefab));
	}

	private static SkinDef CreateMageBodyMadVetArtificer2SkinDefSkin(GameObject mdl, ModelSkinController skinController)
	{
		Renderer[] renderers = mdl.GetComponentsInChildren<Renderer>(true);
		mdl.GetComponentsInChildren<Light>(true);
		List<string> skinnedRendererPaths = new List<string>();
		Renderer[] array = renderers;
		foreach (Renderer val in array)
		{
			if (val is SkinnedMeshRenderer)
			{
				skinnedRendererPaths.Add(Util.BuildPrefabTransformPath(mdl.transform, ((Component)val).transform, false, false));
			}
		}
		SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
		SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
		skin.skinDefParams = skinParams;
		((Object)skin).name = "MadVetArtificer2SkinDef";
		skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETARTIFICER2SKINDEF_NAME";
		skin.rootObject = mdl;
		Helpers.TryCatchThrow("Icon", delegate
		{
			skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Artificer2\\Icons\\MadVetArtificer2SkinDefIcon.png");
		});
		Helpers.TryCatchThrow("Unlockable Name", delegate
		{
			skin.unlockableDef = null;
		});
		Helpers.TryCatchThrow("Base Skins", delegate
		{
			skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { Helpers.ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
		});
		Helpers.TryCatchThrow("Game Object Activations", delegate
		{
			//IL_0011: 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)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: 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_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0250: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_029a: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0308: Unknown result type (might be due to invalid IL or missing references)
			//IL_030d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0323: Unknown result type (might be due to invalid IL or missing references)
			//IL_0328: Unknown result type (might be due to invalid IL or missing references)
			//IL_0390: Unknown result type (might be due to invalid IL or missing references)
			//IL_0391: Unknown result type (might be due to invalid IL or missing references)
			//IL_039a: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0408: Unknown result type (might be due to invalid IL or missing references)
			//IL_040d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0423: Unknown result type (might be due to invalid IL or missing references)
			//IL_0428: Unknown result type (might be due to invalid IL or missing references)
			//IL_046c: Unknown result type (might be due to invalid IL or missing references)
			//IL_046d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0476: Unknown result type (might be due to invalid IL or missing references)
			//IL_04cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_052e: Unknown result type (might be due to invalid IL or missing references)
			//IL_052f: Unknown result type (might be due to invalid IL or missing references)
			skinParams.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[9]
			{
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"JetsL\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "JetsL")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(1, "There is no renderer with the name \"JetsR\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "JetsR")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(2, "There is no renderer with the name \"MageCapeMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageCapeMesh")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(3, "There is no renderer at path \"MageArmature\"", Helpers.GetChildGameObject(mdl, "MageArmature")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MageClothAdd.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(4, "There is no renderer at path \"pelvis\"", Helpers.GetChildGameObject(mdl, "pelvis")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/Prefab/PelvisAddon.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(5, "There is no renderer at path \"MageArmature/ROOT/base/stomach/chest\"", mdl.transform.Find("MageArmature/ROOT/base/stomach/chest"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(-2.182787E-10f, 1.424923E-07f, 7.435119E-11f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/Prefab/ChestCloakAddon.prefab")).WithComponent<InsertBones>((Action<InsertBones>)delegate(InsertBones c)
					{
						c.rendererPaths.AddRange(skinnedRendererPaths);
						c.afterPath = "MageArmature/ROOT/base/stomach/chest/clavicle.r/upper_arm.r/lower_arm.r/hand.r/GripControl.r/thumbIKTarget.r";
						Transform transform = ((Component)c).transform;
						c.newBones.Add(transform);
						c.newBones.Add(transform.GetChild(4));
						c.newBones.Add(transform.GetChild(4).GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3));
						c.newBones.Add(transform.GetChild(3).GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2));
						c.newBones.Add(transform.GetChild(2).GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1));
						c.newBones.Add(transform.GetChild(1).GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
					}).WithComponent<AddDynamicColliders>((Action<AddDynamicColliders>)delegate(AddDynamicColliders c)
					{
						c.paths.Add("MageArmature/ROOT/base/pelvis/PelvisAddon");
					})
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(6, "There is no renderer at path \"MageArmature/ROOT/base/stomach/chest/neck/head\"", mdl.transform.Find("MageArmature/ROOT/base/stomach/chest/neck/head"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(-0.0009054426f, 0.1722583f, -0.000690011f),
					localRotation = new Vector3(323.763f, -0.003991133f, 359.9f),
					localScale = new Vector3(0.9999999f, 0.9999999f, 0.9999999f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/Prefab/HatBone.prefab")).WithComponent<InsertBones>((Action<InsertBones>)delegate(InsertBones c)
					{
						c.rendererPaths.AddRange(skinnedRendererPaths);
						c.afterPath = "MageArmature/ROOT/base/stomach/chest/neck/head";
						Transform transform = ((Component)c).transform;
						c.newBones.Add(transform);
						c.newBones.Add(transform.GetChild(1));
						c.newBones.Add(transform.GetChild(1).GetChild(0));
					})
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(7, "There is no renderer with the name \"Fire\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "Fire")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(8, "There is no renderer with the name \"FireRing\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "FireRing")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				}
			};
		});
		Helpers.TryCatchThrow("Renderer Infos", delegate
		{
			//IL_0010: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
			{
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2Crystal.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MageMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageMesh"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				}
			};
		});
		Helpers.TryCatchThrow("MeshReplacements", delegate
		{
			//IL_0010: 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)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
			{
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Artificer2\\Meshes\\MageNeoCrystal.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MageMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageMesh")))
				}
			};
		});
		Helpers.TryCatchThrow("Light Infos", delegate
		{
			skinParams.lightReplacements = Array.Empty<LightInfo>();
		});
		Helpers.TryCatchThrow("Minion Skin Replacements", delegate
		{
			skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
		});
		Helpers.TryCatchThrow("Projectile Ghost Replacements", delegate
		{
			skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
		});
		return skin;
	}

	private static SkinDef CreateMageBodyMadVetArtificer2SkinDefLobbySkin(GameObject mdl, ModelSkinController skinController)
	{
		Renderer[] renderers = mdl.GetComponentsInChildren<Renderer>(true);
		mdl.GetComponentsInChildren<Light>(true);
		List<string> skinnedRendererPaths = new List<string>();
		Renderer[] array = renderers;
		foreach (Renderer val in array)
		{
			if (val is SkinnedMeshRenderer)
			{
				skinnedRendererPaths.Add(Util.BuildPrefabTransformPath(mdl.transform, ((Component)val).transform, false, false));
			}
		}
		SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
		SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
		skin.skinDefParams = skinParams;
		((Object)skin).name = "MadVetArtificer2SkinDef";
		skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETARTIFICER2SKINDEF_NAME";
		skin.rootObject = mdl;
		Helpers.TryCatchThrow("Icon", delegate
		{
			skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Artificer2\\Icons\\MadVetArtificer2SkinDefIcon.png");
		});
		Helpers.TryCatchThrow("Unlockable Name", delegate
		{
			skin.unlockableDef = null;
		});
		Helpers.TryCatchThrow("Base Skins", delegate
		{
			skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { Helpers.ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
		});
		Helpers.TryCatchThrow("Game Object Activations", delegate
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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)
			//IL_0071: 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_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: 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_0124: 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_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: 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_01ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: Unknown result type (might be due to invalid IL or missing references)
			//IL_0265: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_032a: Unknown result type (might be due to invalid IL or missing references)
			//IL_032f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0345: Unknown result type (might be due to invalid IL or missing references)
			//IL_034a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0360: Unknown result type (might be due to invalid IL or missing references)
			//IL_0365: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
			skinParams.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[5]
			{
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MageCapeMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageCapeMesh")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(1, "There is no renderer at path \"MageArmature\"", Helpers.GetChildGameObject(mdl, "MageArmature")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MageClothAdd.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(2, "There is no renderer at path \"pelvis\"", Helpers.GetChildGameObject(mdl, "pelvis")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/Prefab/PelvisAddon.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(3, "There is no renderer at path \"MageArmature/ROOT/base/stomach/chest\"", mdl.transform.Find("MageArmature/ROOT/base/stomach/chest"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(-2.182787E-10f, 1.424923E-07f, 7.435119E-11f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/Prefab/ChestCloakAddon.prefab")).WithComponent<InsertBones>((Action<InsertBones>)delegate(InsertBones c)
					{
						c.rendererPaths.AddRange(skinnedRendererPaths);
						c.afterPath = "MageArmature/ROOT/base/stomach/chest/clavicle.r/upper_arm.r/lower_arm.r/hand.r/GripControl.r/thumbIKTarget.r";
						Transform transform = ((Component)c).transform;
						c.newBones.Add(transform);
						c.newBones.Add(transform.GetChild(4));
						c.newBones.Add(transform.GetChild(4).GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(4).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3));
						c.newBones.Add(transform.GetChild(3).GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(3).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2));
						c.newBones.Add(transform.GetChild(2).GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(2).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1));
						c.newBones.Add(transform.GetChild(1).GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(1).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
						c.newBones.Add(transform.GetChild(0).GetChild(0).GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0)
							.GetChild(0));
					}).WithComponent<AddDynamicColliders>((Action<AddDynamicColliders>)delegate(AddDynamicColliders c)
					{
						c.paths.Add("MageArmature/ROOT/base/pelvis/PelvisAddon");
					})
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(4, "There is no renderer at path \"MageArmature/ROOT/base/stomach/chest/neck/head\"", mdl.transform.Find("MageArmature/ROOT/base/stomach/chest/neck/head"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(-0.0009054426f, 0.1722583f, -0.000690011f),
					localRotation = new Vector3(323.763f, -0.003991133f, 359.9f),
					localScale = new Vector3(0.9999999f, 0.9999999f, 0.9999999f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/Prefab/HatBone.prefab")).WithComponent<InsertBones>((Action<InsertBones>)delegate(InsertBones c)
					{
						c.rendererPaths.AddRange(skinnedRendererPaths);
						c.afterPath = "MageArmature/ROOT/base/stomach/chest/neck/head";
						Transform transform = ((Component)c).transform;
						c.newBones.Add(transform);
						c.newBones.Add(transform.GetChild(1));
						c.newBones.Add(transform.GetChild(1).GetChild(0));
					})
				}
			};
		});
		Helpers.TryCatchThrow("Renderer Infos", delegate
		{
			//IL_0010: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
			{
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoArti2/MadVetArti2Crystal.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MageMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageMesh"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				}
			};
		});
		Helpers.TryCatchThrow("MeshReplacements", delegate
		{
			//IL_0010: 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)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
			{
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Artificer2\\Meshes\\MageNeoCrystal.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MageMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MageMesh")))
				}
			};
		});
		Helpers.TryCatchThrow("Light Infos", delegate
		{
			skinParams.lightReplacements = Array.Empty<LightInfo>();
		});
		Helpers.TryCatchThrow("Minion Skin Replacements", delegate
		{
			skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
		});
		Helpers.TryCatchThrow("Projectile Ghost Replacements", delegate
		{
			skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
		});
		return skin;
	}

	private static void AddMageBodyMadVetArtificer2SkinDefSkin()
	{
		string text = "MageBody";
		string text2 = "MadVetArtificer2SkinDef";
		GameObject bodyPrefab = BodyCatalog.FindBodyPrefab(text);
		if (!Object.op_Implicit((Object)(object)bodyPrefab))
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
			return;
		}
		try
		{
			ModelLocator component = bodyPrefab.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			SkinDef val2 = CreateMageBodyMadVetArtificer2SkinDefSkin(gameObject, val);
			Array.Resize(ref val.skins, val.skins.Length + 1);
			val.skins[val.skins.Length - 1] = val2;
			MageBodyMadVetArtificer2SkinDefSkinAdded(val2, bodyPrefab);
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
		try
		{
			SurvivorDef val3 = ((IEnumerable<SurvivorDef>)ContentManager.survivorDefs).FirstOrDefault((Func<SurvivorDef, bool>)((SurvivorDef d) => (Object)(object)d.bodyPrefab == (Object)(object)bodyPrefab));
			if (!Object.op_Implicit((Object)(object)val3))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" lobby skin to \"" + text + "\" because SurvivorDef doesn't exist"));
				return;
			}
			ModelSkinController componentInChildren = val3.displayPrefab.GetComponentInChildren<ModelSkinController>();
			if (!Object.op_Implicit((Object)(object)componentInChildren))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" lobby skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
			}
			else
			{
				SkinDef val4 = CreateMageBodyMadVetArtificer2SkinDefLobbySkin(((Component)componentInChildren).gameObject, componentInChildren);
				Array.Resize(ref componentInChildren.skins, componentInChildren.skins.Length + 1);
				componentInChildren.skins[^1] = val4;
			}
		}
		catch (FieldException ex4)
		{
			if (ex4.InnerException is ElementException ex5)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" lobby skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex4.Message}, element: {ex5.Index}");
				InstanceLogger.LogWarning((object)ex5.Message);
				InstanceLogger.LogError((object)ex4.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" lobby skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex4.Message));
				InstanceLogger.LogError((object)ex4.InnerException);
			}
		}
		catch (Exception ex6)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" lobby skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex6);
		}
	}
}
public class MeshActivator : MonoBehaviour
{
	[Serializable]
	public struct CustomRendererInfo
	{
		public Material material;

		public string addressableMaterialPath;

		public bool ignoreOverlays;

		public ShadowCastingMode shadowCastingMode;
	}

	[Header("Reference Settings")]
	[Tooltip("Name of the in-game original mesh object.")]
	public string referenceObjectName;

	[Tooltip("Copy Bone Data From Reference Object.")]
	public bool CopyBoneData = true;

	[Tooltip("Active state applied once registered.")]
	public bool initialActiveState = true;

	[Tooltip("Custom configuration for the renderer info applied to the CharacterModel.")]
	public CustomRendererInfo customRendererInfo = new CustomRendererInfo
	{
		shadowCastingMode = (ShadowCastingMode)1,
		ignoreOverlays = false
	};

	private CharacterModel characterModel;

	private bool registered;

	private IEnumerator Start()
	{
		for (int i = 0; i < 5; i++)
		{
			yield return null;
		}
		Register();
	}

	private void Register()
	{
		//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: 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_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0212: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_0293: Unknown result type (might be due to invalid IL or missing references)
		//IL_0294: Unknown result type (might be due to invalid IL or missing references)
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_025c: Unknown result type (might be due to invalid IL or missing references)
		if (registered)
		{
			return;
		}
		Renderer component = ((Component)this).GetComponent<Renderer>();
		if (!Object.op_Implicit((Object)(object)component))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "' has no Renderer."), (Object)(object)this);
			return;
		}
		Transform val = FindReference();
		if (!Object.op_Implicit((Object)(object)val))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': '" + referenceObjectName + "' not found in its hierarchy."), (Object)(object)this);
			return;
		}
		characterModel = ((Component)val).GetComponentInParent<CharacterModel>();
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		}
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': no CharacterModel found above '" + ((Object)val).name + "'"), (Object)(object)this);
			return;
		}
		if (CopyBoneData)
		{
			SkinnedMeshRenderer val2 = ((Component)val).GetComponent<SkinnedMeshRenderer>();
			if (!Object.op_Implicit((Object)(object)val2))
			{
				val2 = ((Component)val).GetComponentInChildren<SkinnedMeshRenderer>(true);
			}
			if (Object.op_Implicit((Object)(object)val2))
			{
				SkinnedMeshRenderer val3 = (SkinnedMeshRenderer)(object)((component is SkinnedMeshRenderer) ? component : null);
				if (val3 != null)
				{
					val3.rootBone = val2.rootBone;
					val3.bones = val2.bones;
					goto IL_015d;
				}
			}
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)val).name + "' has no SkinnedMeshRenderer to copy bones from."), (Object)(object)this);
		}
		goto IL_015d;
		IL_015d:
		Material val4 = customRendererInfo.material;
		if (!Object.op_Implicit((Object)(object)val4) && !string.IsNullOrEmpty(customRendererInfo.addressableMaterialPath))
		{
			val4 = Addressables.LoadAssetAsync<Material>((object)customRendererInfo.addressableMaterialPath).WaitForCompletion();
			if (!Object.op_Implicit((Object)(object)val4))
			{
				Debug.LogWarning((object)("[MeshActivator] Failed to load material via Addressables path: '" + customRendererInfo.addressableMaterialPath + "'. Falling back to sharedMaterial."), (Object)(object)this);
			}
		}
		if (!Object.op_Implicit((Object)(object)val4))
		{
			val4 = component.sharedMaterial;
		}
		RendererInfo val5 = new RendererInfo
		{
			renderer = component,
			defaultMaterial = val4,
			defaultShadowCastingMode = customRendererInfo.shadowCastingMode,
			ignoreOverlays = customRendererInfo.ignoreOverlays
		};
		RendererInfo[] baseRendererInfos = characterModel.baseRendererInfos;
		int num = -1;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			if ((Object)(object)baseRendererInfos[i].renderer == (Object)(object)component)
			{
				num = i;
				break;
			}
		}
		if (num >= 0)
		{
			baseRendererInfos[num] = val5;
		}
		else
		{
			Array.Resize(ref characterModel.baseRendererInfos, baseRendererInfos.Length + 1);
			characterModel.baseRendererInfos[characterModel.baseRendererInfos.Length - 1] = val5;
		}
		registered = true;
		characterModel.UpdateMaterials();
		((Component)this).gameObject.SetActive(initialActiveState);
	}

	private Transform FindReference()
	{
		if (string.IsNullOrEmpty(referenceObjectName))
		{
			return null;
		}
		Transform parent = ((Component)this).transform.parent;
		while (Object.op_Implicit((Object)(object)parent))
		{
			if (((Object)parent).name == referenceObjectName)
			{
				return parent;
			}
			Transform[] componentsInChildren = ((Component)parent).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!((Object)(object)val == (Object)(object)((Component)this).transform) && !val.IsChildOf(((Component)this).transform) && ((Object)val).name == referenceObjectName)
				{
					return val;
				}
			}
			parent = parent.parent;
		}
		return null;
	}
}
public static class Helpers
{
	private static GameObject prefabHolder;

	public static GameObject ClonePrefab(GameObject gameObject)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		if (!Object.op_Implicit((Object)(object)prefabHolder))
		{
			prefabHolder = new GameObject("PrefabHolder");
			Object.DontDestroyOnLoad((Object)(object)prefabHolder);
			prefabHolder.SetActive(false);
		}
		GameObject obj = Object.Instantiate<GameObject>(gameObject, prefabHolder.transform);
		obj.AddComponent<RemoveClone>();
		((Object)obj).name = ((Object)gameObject).name;
		return obj;
	}

	public static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}

	public static Transform GetChild(this Transform transform, int index, out Transform child)
	{
		return child = transform.GetChild(index);
	}

	public static GameObject WithComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		T obj = gameObject.AddComponent<T>();
		modifier?.Invoke(obj);
		return gameObject;
	}

	public static GameObject WithTryComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		if (Object.op_Implicit((Object)(object)gameObject) && !Object.op_Implicit((Object)(object)gameObject.GetComponent<T>()))
		{
			T obj = gameObject.AddComponent<T>();
			modifier?.Invoke(obj);
		}
		return gameObject;
	}

	public static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	public static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}
}
public class RemoveClone : MonoBehaviour
{
	public void Awake()
	{
		((Object)this).name = ((Object)this).name[..^7];
	}
}
public class FieldException : Exception
{
	public FieldException(string message, Exception innerException)
		: base(message, innerException)
	{
	}
}
public class ElementException : Exception
{
	public int Index { get; }

	public ElementException(int index, string message)
		: base(message)
	{
		Index = index;
	}
}
public class InsertBones : MonoBehaviour
{
	private readonly List<SkinnedMeshRenderer> modifiedRenderers = new List<SkinnedMeshRenderer>();

	public List<string> rendererPaths = new List<string>();

	public List<Transform> newBones = new List<Transform>();

	public string afterPath;

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		Transform value = ((Component)transform).transform.Find(afterPath);
		foreach (string rendererPath in rendererPaths)
		{
			Transform obj = transform.Find(rendererPath);
			SkinnedMeshRenderer val = ((obj != null) ? ((Component)obj).GetComponent<SkinnedMeshRenderer>() : null);
			if (Object.op_Implicit((Object)(object)val))
			{
				Transform[] array = val.bones;
				int num = Array.IndexOf(array, value) + 1;
				if (num != 0)
				{
					Array.Resize(ref array, array.Length + newBones.Count);
					Array.Copy(array, num, array, num + newBones.Count, array.Length - newBones.Count - num);
					newBones.CopyTo(array, num);
					val.bones = array;
					modifiedRenderers.Add(val);
				}
			}
		}
	}

	public void OnDestroy()
	{
		foreach (SkinnedMeshRenderer modifiedRenderer in modifiedRenderers)
		{
			if (Object.op_Implicit((Object)(object)modifiedRenderer))
			{
				Transform[] array = modifiedRenderer.bones;
				int num = Array.IndexOf(array, ((Component)this).transform);
				Array.Copy(array, num + newBones.Count, array, num, array.Length - num - newBones.Count);
				Array.Resize(ref array, array.Length - newBones.Count);
				modifiedRenderer.bones = array;
			}
		}
		modifiedRenderers.Clear();
	}
}
public class AddDynamicColliders : MonoBehaviour
{
	public List<string> paths = new List<string>();

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		List<DynamicBoneCollider> list = new List<DynamicBoneCollider>();
		foreach (string path in paths)
		{
			Transform val = transform.Find(path);
			if (Object.op_Implicit((Object)(object)val))
			{
				list.AddRange(((Component)val).GetComponents<DynamicBoneCollider>());
			}
		}
		DynamicBone[] components = ((Component)this).GetComponents<DynamicBone>();
		for (int i = 0; i < components.Length; i++)
		{
			components[i].m_Colliders.AddRange(list);
		}
	}
}

Skins/MadVeteran_Commando.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Commando;

[BepInPlugin("com.KrononConpsirator.MadVeteran_Commando", "MadVeteran_Commando", "1.0.0")]
public class MadVeteran_CommandoPlugin : BaseUnityPlugin
{
	private class FieldException : Exception
	{
		public FieldException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}

	private class ElementException : Exception
	{
		public int Index { get; }

		public ElementException(int index, string message)
			: base(message)
		{
			Index = index;
		}
	}

	private static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_CommandoPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_CommandoPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Commando.krononconpsiratormadveteran_commando"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMando/NeoMandoMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETMANDOSKINDEF_NAME", "Refined Junkie");
	}

	private static void BodyCatalogInit()
	{
		AddCommandoBodyMadVetmandoSkinDefSkin();
	}

	private static void AddCommandoBodyMadVetmandoSkinDefSkin()
	{
		string text = "CommandoBody";
		string text2 = "MadVetmandoSkinDef";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			gameObject.GetComponentsInChildren<Light>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
			skin.skinDefParams = skinParams;
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Commando\\Icons\\MadVetmandoSkinDefIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETMANDOSKINDEF_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = Array.Empty<SkinDef>();
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skinParams.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0010: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				//IL_0082: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
				//IL_0113: Unknown result type (might be due to invalid IL or missing references)
				//IL_015c: Unknown result type (might be due to invalid IL or missing references)
				//IL_015d: Unknown result type (might be due to invalid IL or missing references)
				skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[3]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMando/NeoMandoMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"CommandoMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "CommandoMesh")))
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMando/NeoMandoMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = true,
						renderer = ThrowIfNull<Renderer>(1, "There is no renderer with the name \"GunMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "GunMesh")))
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMando/NeoMandoMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = true,
						renderer = ThrowIfNull<Renderer>(2, "There is no renderer with the name \"GunMesh.001\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "GunMesh.001")))
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: 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_012c: Unknown result type (might be due to invalid IL or missing references)
				//IL_012d: Unknown result type (might be due to invalid IL or missing references)
				skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[3]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Commando\\Meshes\\CommandoMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"CommandoMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "CommandoMesh")))
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Commando\\Meshes\\GunMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(1, "There is no renderer with the name \"GunMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "GunMesh")))
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Commando\\Meshes\\GunMesh.001.mesh"),
						renderer = ThrowIfNull<Renderer>(2, "There is no renderer with the name \"GunMesh.001\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "GunMesh.001")))
					}
				};
			});
			TryCatchThrow("Light Infos", delegate
			{
				skinParams.lightReplacements = (LightInfo[])(object)new LightInfo[0];
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref val2.skins, val2.skins.Length + 1);
			val2.skins[val2.skins.Length - 1] = skin;
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}

	private static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	private static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}

	private static void TryAddComponent<T>(GameObject obj) where T : Component
	{
		if (Object.op_Implicit((Object)(object)obj) && !Object.op_Implicit((Object)(object)obj.GetComponent<T>()))
		{
			obj.AddComponent<T>();
		}
	}

	private static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}
}

Skins/MadVeteran_Core.dll

Decompiled a day 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 BepInEx;
using BepInEx.Configuration;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using UnityEngine;

[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: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Core;

[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.KrononConpsirator.MadVeteran_Core", "MadVeteran_Core", "1.0.0")]
public class CorePlugin : BaseUnityPlugin
{
	public static CorePlugin Instance { get; private set; }

	public static ConfigEntry<bool> ConsoleDebug_Enabled { get; private set; }

	public static ConfigEntry<bool> Artificer_AstroDeus_Enabled { get; private set; }

	public static ConfigEntry<string> Artificer_AstroDeus_FireToken { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_FireColorCloth { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_FireColorCrystal { get; private set; }

	public static ConfigEntry<string> Artificer_AstroDeus_IceToken { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_IceColorCloth { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_IceColorCrystal { get; private set; }

	public static ConfigEntry<string> Artificer_AstroDeus_ThunderToken { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_ThunderColorCloth { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_ThunderColorCrystal { get; private set; }

	public static ConfigEntry<string> Artificer_AstroDeus_RockToken { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_RockColorCloth { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_RockColorCrystal { get; private set; }

	public static ConfigEntry<string> Artificer_AstroDeus_BloodToken { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_BloodColorCloth { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_BloodColorCrystal { get; private set; }

	public static ConfigEntry<string> Artificer_AstroDeus_WaterToken { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_WaterColorCloth { get; private set; }

	public static ConfigEntry<Color> Artificer_AstroDeus_WaterColorCrystal { get; private set; }

	public static ConfigEntry<bool> Acolyte_MarkedCarapase_Enabled { get; private set; }

	public static ConfigEntry<float> Acolyte_MarkedCarapase_OpenWing { get; private set; }

	public static ConfigEntry<float> Acolyte_MarkedCarapase_FlapWing { get; private set; }

	public static ConfigEntry<bool> Engi_AgentBungus_WungusEnabled { get; private set; }

	public static ConfigEntry<bool> Engi_AgentBungus_ParticleEnabled { get; private set; }

	public static ConfigEntry<bool> Acrid_AshenOne_Enabled { get; private set; }

	public static ConfigEntry<Color> Acrid_AshenOne_PoisonColor { get; private set; }

	public static ConfigEntry<float> Acrid_AshenOne_PoisonHold_Duration { get; private set; }

	public static ConfigEntry<float> Acrid_AshenOne_WhiteGradient_Min { get; private set; }

	public static ConfigEntry<float> Acrid_AshenOne_WhiteGradient_Max { get; private set; }

	public static ConfigEntry<float> Acrid_AshenOne_PoisonGradient_Min { get; private set; }

	public static ConfigEntry<float> Acrid_AshenOne_PoisonGradient_Max { get; private set; }

	public static ConfigEntry<bool> Merc_NullPointer_MeshSwapperEnabled { get; private set; }

	public static ConfigEntry<bool> Merc_NullPointer_ParticleEnabled { get; private set; }

	private void Awake()
	{
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Expected O, but got Unknown
		Instance = this;
		Artificer_AstroDeus();
		Acolyte_MarkedCarapase();
		Acrid_AshenOne();
		Merc_NullPointer();
		ConsoleDebug_Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc.", "Console Debug", false, "Toggles Debug Console Output during of Skin Usage");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(ConsoleDebug_Enabled));
		ModSettingsManager.SetModDescription("Skin Config options for MadVeteran Skinpack");
		ModSettingsManager.SetModIcon(LoadEmbeddedSprite("Assets.SkinMods.MadVeteran_Config.sprite.MadVeteran_icon.png"));
	}

	private void Artificer_AstroDeus()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Expected O, but got Unknown
		//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: Expected O, but got Unknown
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ee: Expected O, but got Unknown
		//IL_0133: 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_0181: Unknown result type (might be due to invalid IL or missing references)
		//IL_018b: Expected O, but got Unknown
		//IL_0191: Unknown result type (might be due to invalid IL or missing references)
		//IL_019b: Expected O, but got Unknown
		//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Expected O, but got Unknown
		//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0224: Unknown result type (might be due to invalid IL or missing references)
		//IL_023e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0248: Expected O, but got Unknown
		//IL_024e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0258: Expected O, but got Unknown
		//IL_025e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0268: Expected O, but got Unknown
		//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0305: Expected O, but got Unknown
		//IL_030b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0315: Expected O, but got Unknown
		//IL_031b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0325: Expected O, but got Unknown
		//IL_036a: Unknown result type (might be due to invalid IL or missing references)
		//IL_039e: Unknown result type (might be due to invalid IL or missing references)
		//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c2: Expected O, but got Unknown
		//IL_03c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d2: Expected O, but got Unknown
		//IL_03d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_03e2: Expected O, but got Unknown
		//IL_0427: Unknown result type (might be due to invalid IL or missing references)
		//IL_045b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0475: Unknown result type (might be due to invalid IL or missing references)
		//IL_047f: Expected O, but got Unknown
		//IL_0485: Unknown result type (might be due to invalid IL or missing references)
		//IL_048f: Expected O, but got Unknown
		//IL_0495: Unknown result type (might be due to invalid IL or missing references)
		//IL_049f: Expected O, but got Unknown
		Artificer_AstroDeus_Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Artificer_AstroDeus", "Skill Color Swapper", true, "Toggles AstroDeus uses the Skill Element color swapper");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(Artificer_AstroDeus_Enabled));
		Artificer_AstroDeus_FireToken = ((BaseUnityPlugin)this).Config.Bind<string>("Artificer_AstroDeus", "Fire Token", "_FIRE,_MAGEFLAME", "Element Indicator in SkillNameToken. its the widest Net for compat with modded stuff.");
		Artificer_AstroDeus_FireColorCloth = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Fire : Cloth", new Color(0.678f, 0.227f, 0.067f), "A color option.");
		Artificer_AstroDeus_FireColorCrystal = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Fire : Crystal", new Color(0.839f, 0.192f, 0.082f), "A color option.");
		ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(Artificer_AstroDeus_FireToken));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_FireColorCloth));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_FireColorCrystal));
		Artificer_AstroDeus_IceToken = ((BaseUnityPlugin)this).Config.Bind<string>("Artificer_AstroDeus", "Ice Token", "_ICE,_MAGEICE", "Element Indicator in SkillNameToken. its the widest Net for compat with modded stuff.");
		Artificer_AstroDeus_IceColorCloth = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Ice : Cloth", new Color(0.239f, 0.341f, 0.337f), "A color option.");
		Artificer_AstroDeus_IceColorCrystal = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Ice : Crystal", new Color(0.51f, 0.8f, 0.839f), "A color option.");
		ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(Artificer_AstroDeus_IceToken));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_IceColorCloth));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_IceColorCrystal));
		Artificer_AstroDeus_ThunderToken = ((BaseUnityPlugin)this).Config.Bind<string>("Artificer_AstroDeus", "Lightning Token", "_LIGHTNING", "Element Indicator in SkillNameToken. its the widest Net for compat with modded stuff.");
		Artificer_AstroDeus_ThunderColorCloth = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Lightning : Cloth", new Color(0.173f, 0.2f, 0.298f), "A color option.");
		Artificer_AstroDeus_ThunderColorCrystal = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Lightning : Crystal", new Color(0.204f, 0.208f, 0.376f), "A color option.");
		ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(Artificer_AstroDeus_ThunderToken));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_ThunderColorCloth));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_ThunderColorCrystal));
		Artificer_AstroDeus_RockToken = ((BaseUnityPlugin)this).Config.Bind<string>("Artificer_AstroDeus", "Earth Token", "_ALT,_ROCK", "Element Indicator in SkillNameToken. its the widest Net for compat with modded stuff.");
		Artificer_AstroDeus_RockColorCloth = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Earth : Cloth", new Color(0.424f, 0.278f, 0.2f), "A color option.");
		Artificer_AstroDeus_RockColorCrystal = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Earth : Crystal", new Color(0.62f, 0.329f, 0.169f), "A color option.");
		ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(Artificer_AstroDeus_RockToken));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_RockColorCloth));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_RockColorCrystal));
		Artificer_AstroDeus_WaterToken = ((BaseUnityPlugin)this).Config.Bind<string>("Artificer_AstroDeus", "Water Token", "_WATER", "Element Indicator in SkillNameToken. its the widest Net for compat with modded stuff.[Modded Element]");
		Artificer_AstroDeus_WaterColorCloth = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Water : Cloth", new Color(0.694f, 0.82f, 0.808f), "A color option.");
		Artificer_AstroDeus_WaterColorCrystal = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Water : Crystal", new Color(0.482f, 0.576f, 0.584f), "A color option.");
		ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(Artificer_AstroDeus_WaterToken));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_WaterColorCloth));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_WaterColorCrystal));
		Artificer_AstroDeus_BloodToken = ((BaseUnityPlugin)this).Config.Bind<string>("Artificer_AstroDeus", "Blood Token", "_MAGEBLOOD", "Element Indicator in SkillNameToken. its the widest Net for compat with modded stuff. [Modded Element]");
		Artificer_AstroDeus_BloodColorCloth = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Blood : Cloth", new Color(0.275f, 0f, 0.004f), "A color option.");
		Artificer_AstroDeus_BloodColorCrystal = ((BaseUnityPlugin)this).Config.Bind<Color>("Artificer_AstroDeus", "Blood : Crystal", new Color(0.792f, 0.2f, 0.216f), "A color option.");
		ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(Artificer_AstroDeus_BloodToken));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_BloodColorCloth));
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Artificer_AstroDeus_BloodColorCrystal));
	}

	private void Acolyte_MarkedCarapase()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: Expected O, but got Unknown
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Expected O, but got Unknown
		Acolyte_MarkedCarapase_Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Acolyte_MarkedCarapase", "Wing Animation", true, "Toggle if Marked Carapase Skin Wings Animate during Movement");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(Acolyte_MarkedCarapase_Enabled));
		Acolyte_MarkedCarapase_OpenWing = ((BaseUnityPlugin)this).Config.Bind<float>("Acolyte_MarkedCarapase", "Open Wing Speed", 30f, "Max Velocity to Open Shell & Elytra");
		Acolyte_MarkedCarapase_FlapWing = ((BaseUnityPlugin)this).Config.Bind<float>("Acolyte_MarkedCarapase", "Start Wing Flap Speed", 60f, "Max Velocity to Start Flapping Elytra");
		ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(Acolyte_MarkedCarapase_OpenWing));
		ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(Acolyte_MarkedCarapase_FlapWing));
	}

	private void Engi_AgentBungus()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Expected O, but got Unknown
		Engi_AgentBungus_WungusEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Engineer_AgentBungus", "Wungus Mode", true, "Toggles ability change form on Wungus Pickup");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(Engi_AgentBungus_WungusEnabled));
		Engi_AgentBungus_ParticleEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Engineer_AgentBungus", "Mushroom Particles", true, "Toggles Passive Mushroom Particle Emission when using AgentBungus");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(Engi_AgentBungus_ParticleEnabled));
	}

	private void Acrid_AshenOne()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Expected O, but got Unknown
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Expected O, but got Unknown
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: 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_0100: Expected O, but got Unknown
		//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Expected O, but got Unknown
		//IL_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_0135: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: 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_015b: Expected O, but got Unknown
		//IL_0156: Unknown result type (might be due to invalid IL or missing references)
		//IL_0160: Expected O, but got Unknown
		//IL_018b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0190: 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_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b6: Expected O, but got Unknown
		//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bb: Expected O, but got Unknown
		//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0201: Unknown result type (might be due to invalid IL or missing references)
		//IL_0211: Expected O, but got Unknown
		//IL_020c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0216: Expected O, but got Unknown
		Acrid_AshenOne_Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Acrid_AshenOne", "Bile Radiation", true, "Toggle if AshenOne Changes Color On Skill Use");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(Acrid_AshenOne_Enabled));
		Acrid_AshenOne_PoisonColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Acrid_AshenOne", "Poison Color", new Color(0.259f, 1f, 0f), "A color option during Poison State");
		ModSettingsManager.AddOption((BaseOption)new ColorOption(Acrid_AshenOne_PoisonColor));
		Acrid_AshenOne_PoisonHold_Duration = ((BaseUnityPlugin)this).Config.Bind<float>("Acrid_AshenOne", "Poison Hold Duration", 1.5f, " Duration of Time That the Poison State Last until going back to default");
		ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(Acrid_AshenOne_PoisonHold_Duration));
		Acrid_AshenOne_WhiteGradient_Min = ((BaseUnityPlugin)this).Config.Bind<float>("Acrid_AshenOne", "White Offset at Default", 0.16f, "");
		ModSettingsManager.AddOption((BaseOption)new StepSliderOption(Acrid_AshenOne_WhiteGradient_Min, new StepSliderConfig
		{
			min = -3f,
			max = 3f,
			increment = 0.01f
		}));
		Acrid_AshenOne_PoisonGradient_Min = ((BaseUnityPlugin)this).Config.Bind<float>("Acrid_AshenOne", "Poison Offset at Default", -1f, "");
		ModSettingsManager.AddOption((BaseOption)new StepSliderOption(Acrid_AshenOne_PoisonGradient_Min, new StepSliderConfig
		{
			min = -3f,
			max = 3f,
			increment = 0.01f
		}));
		Acrid_AshenOne_WhiteGradient_Max = ((BaseUnityPlugin)this).Config.Bind<float>("Acrid_AshenOne", "White Offset in Poison State", 0.56f, "");
		ModSettingsManager.AddOption((BaseOption)new StepSliderOption(Acrid_AshenOne_WhiteGradient_Max, new StepSliderConfig
		{
			min = -3f,
			max = 3f,
			increment = 0.01f
		}));
		Acrid_AshenOne_PoisonGradient_Max = ((BaseUnityPlugin)this).Config.Bind<float>("Acrid_AshenOne", "Poison Offset in Poison State", 0.25f, "");
		ModSettingsManager.AddOption((BaseOption)new StepSliderOption(Acrid_AshenOne_PoisonGradient_Max, new StepSliderConfig
		{
			min = -3f,
			max = 3f,
			increment = 0.01f
		}));
	}

	private void Merc_NullPointer()
	{
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Expected O, but got Unknown
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Expected O, but got Unknown
		Merc_NullPointer_MeshSwapperEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Merc_NullPointer", "MeshSwapper", true, "Toggles NullPointer Ability to Swaps Meshes");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(Merc_NullPointer_MeshSwapperEnabled));
		Merc_NullPointer_ParticleEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Merc_NullPointer", "Glitch Particles", true, "Toggles NullPointer to have Extra Glitch Particles");
		ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(Merc_NullPointer_ParticleEnabled));
	}

	public static (string Keyword, Color Cloth, Color Crystal)[] GetArtificerElementRules()
	{
		List<(string Keyword, Color Cloth, Color Crystal)> rules = new List<(string, Color, Color)>();
		ParseAndAdd(Artificer_AstroDeus_FireToken, Artificer_AstroDeus_FireColorCloth, Artificer_AstroDeus_FireColorCrystal);
		ParseAndAdd(Artificer_AstroDeus_IceToken, Artificer_AstroDeus_IceColorCloth, Artificer_AstroDeus_IceColorCrystal);
		ParseAndAdd(Artificer_AstroDeus_ThunderToken, Artificer_AstroDeus_ThunderColorCloth, Artificer_AstroDeus_ThunderColorCrystal);
		ParseAndAdd(Artificer_AstroDeus_RockToken, Artificer_AstroDeus_RockColorCloth, Artificer_AstroDeus_RockColorCrystal);
		ParseAndAdd(Artificer_AstroDeus_WaterToken, Artificer_AstroDeus_WaterColorCloth, Artificer_AstroDeus_WaterColorCrystal);
		ParseAndAdd(Artificer_AstroDeus_BloodToken, Artificer_AstroDeus_BloodColorCloth, Artificer_AstroDeus_BloodColorCrystal);
		return rules.ToArray();
		void ParseAndAdd(ConfigEntry<string> tokenConfig, ConfigEntry<Color> clothConfig, ConfigEntry<Color> crystalConfig)
		{
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			if (tokenConfig != null && !string.IsNullOrWhiteSpace(tokenConfig.Value))
			{
				string[] array = tokenConfig.Value.Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries);
				string[] array2 = array;
				foreach (string text in array2)
				{
					string text2 = text.Trim();
					if (!string.IsNullOrEmpty(text2))
					{
						rules.Add((text2, clothConfig.Value, crystalConfig.Value));
					}
				}
			}
		}
	}

	private Sprite LoadEmbeddedSprite(string resourceName)
	{
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Expected O, but got Unknown
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		Assembly executingAssembly = Assembly.GetExecutingAssembly();
		using Stream stream = executingAssembly.GetManifestResourceStream(resourceName);
		if (stream == null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)("Embedded resource '" + resourceName + "' not found!"));
			return null;
		}
		byte[] array = new byte[stream.Length];
		stream.Read(array, 0, array.Length);
		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));
	}
}

Skins/MadVeteran_Engineer.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Engineer;

[BepInPlugin("com.KrononConpsirator.MadVeteran_Engineer", "MadVeteran_Engineer", "1.0.0")]
public class MadVeteran_EngineerPlugin : BaseUnityPlugin
{
	private class FieldException : Exception
	{
		public FieldException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}

	private class ElementException : Exception
	{
		public int Index { get; }

		public ElementException(int index, string message)
			: base(message)
		{
			Index = index;
		}
	}

	private static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_EngineerPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_EngineerPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Engineer.krononconpsiratormadveteran_engineer"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoEngi/EngiNeoMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETENGITURRETSKINDEF_NAME", "Bungus Machine");
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETENGITURRETWALKERSKINDEF_NAME", "Bungus Cultivator");
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETENGISKINDEF_NAME", "Agent Bungus");
	}

	private static void BodyCatalogInit()
	{
		AddEngiTurretBodyMadVetEngiTurretSkinDefSkin();
		AddEngiWalkerTurretBodyMadVetEngiTurretWalkerSkinDefSkin();
		AddEngiBodyMadVetEngiSkinDefSkin();
	}

	private static void AddEngiTurretBodyMadVetEngiTurretSkinDefSkin()
	{
		string text = "EngiTurretBody";
		string text2 = "MadVetEngiTurretSkinDef";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController skinController = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)skinController))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			gameObject.GetComponentsInChildren<Light>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
			skin.skinDefParams = skinParams;
			TryCatchThrow("Icon", delegate
			{
				skin.icon = null;
			});
			((Object)skin).name = text2;
			skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETENGITURRETSKINDEF_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skinParams.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0010: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoEngi/EngiNeoMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"EngiTurretMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "EngiTurretMesh")))
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Engineer\\Meshes\\EngiTurretMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"EngiTurretMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "EngiTurretMesh")))
					}
				};
			});
			TryCatchThrow("Light Infos", delegate
			{
				skinParams.lightReplacements = (LightInfo[])(object)new LightInfo[0];
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}

	private static void AddEngiWalkerTurretBodyMadVetEngiTurretWalkerSkinDefSkin()
	{
		string text = "EngiWalkerTurretBody";
		string text2 = "MadVetEngiTurretWalkerSkinDef";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController skinController = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)skinController))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			gameObject.GetComponentsInChildren<Light>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
			skin.skinDefParams = skinParams;
			TryCatchThrow("Icon", delegate
			{
				skin.icon = null;
			});
			((Object)skin).name = text2;
			skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETENGITURRETWALKERSKINDEF_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skinParams.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0010: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoEngi/EngiNeoMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"EngiWalkerTurretMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "EngiWalkerTurretMesh")))
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Engineer\\Meshes\\EngiWalkerTurretMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"EngiWalkerTurretMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "EngiWalkerTurretMesh")))
					}
				};
			});
			TryCatchThrow("Light Infos", delegate
			{
				skinParams.lightReplacements = (LightInfo[])(object)new LightInfo[0];
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}

	private static void AddEngiBodyMadVetEngiSkinDefSkin()
	{
		string text = "EngiBody";
		string text2 = "MadVetEngiSkinDef";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController skinController = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)skinController))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			gameObject.GetComponentsInChildren<Light>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
			skin.skinDefParams = skinParams;
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Engineer\\Icons\\MadVetEngiSkinDefIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETENGISKINDEF_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skinParams.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0010: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoEngi/EngiNeoMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"EngiMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "EngiMesh")))
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Engineer\\Meshes\\EngiMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"EngiMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "EngiMesh")))
					}
				};
			});
			TryCatchThrow("Light Infos", delegate
			{
				skinParams.lightReplacements = (LightInfo[])(object)new LightInfo[0];
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0040: 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_0079: Unknown result type (might be due to invalid IL or missing references)
				//IL_0082: 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_00b2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: 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)
				skinParams.minionSkinReplacements = (MinionSkinReplacement[])(object)new MinionSkinReplacement[2]
				{
					new MinionSkinReplacement
					{
						minionBodyPrefab = BodyCatalog.FindBodyPrefab("EngiTurretBody"),
						minionSkin = ThrowIfNull<SkinDef>(0, "There is no skin with the name \"MadVetEngiTurretSkinDef\" for body \"EngiTurretBody\"", ((IEnumerable<SkinDef>)SkinCatalog.FindSkinsForBody(ThrowIfEquals<BodyIndex>(0, "Body \"EngiTurretBody\" doesn't exist", BodyCatalog.FindBodyIndex("EngiTurretBody"), (BodyIndex)(-1)))).FirstOrDefault((Func<SkinDef, bool>)((SkinDef s) => ((Object)s).name == "MadVetEngiTurretSkinDef")))
					},
					new MinionSkinReplacement
					{
						minionBodyPrefab = BodyCatalog.FindBodyPrefab("EngiWalkerTurretBody"),
						minionSkin = ThrowIfNull<SkinDef>(1, "There is no skin with the name \"MadVetEngiTurretWalkerSkinDef\" for body \"EngiWalkerTurretBody\"", ((IEnumerable<SkinDef>)SkinCatalog.FindSkinsForBody(ThrowIfEquals<BodyIndex>(1, "Body \"EngiWalkerTurretBody\" doesn't exist", BodyCatalog.FindBodyIndex("EngiWalkerTurretBody"), (BodyIndex)(-1)))).FirstOrDefault((Func<SkinDef, bool>)((SkinDef s) => ((Object)s).name == "MadVetEngiTurretWalkerSkinDef")))
					}
				};
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}

	private static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	private static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}

	private static void TryAddComponent<T>(GameObject obj) where T : Component
	{
		if (Object.op_Implicit((Object)(object)obj) && !Object.op_Implicit((Object)(object)obj.GetComponent<T>()))
		{
			obj.AddComponent<T>();
		}
	}

	private static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}
}

Skins/MadVeteran_Huntress.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Huntress;

[BepInPlugin("com.KrononConspirator.MadVeteran_Huntress", "MadVeteran_Huntress", "2.0.0")]
public class MadVeteran_HuntressPlugin : BaseUnityPlugin
{
	public class MaterialDuplicatorExtension
	{
		internal void BeforeStart()
		{
		}

		internal void AfterStart()
		{
			try
			{
				HuntNeoCrowbar();
			}
			catch (Exception ex)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)("MaterialDuplicator entry 0 failed: " + ex));
				}
			}
		}

		internal void BeforeBodyCatalogInit()
		{
		}

		internal void AfterBodyCatalogInit()
		{
		}

		private void HuntNeoCrowbar()
		{
			//IL_00e9: 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)
			Material val = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeoCrowbar.mat");
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)"MaterialDuplicator: material not found in bundle: Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeoCrowbar.mat");
				}
				return;
			}
			Material val2 = MaterialDuplicator_LoadAddressable<Material>("RoR2/Base/Huntress/matHuntressArrow.mat");
			if ((Object)(object)val2 == (Object)null)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)"MaterialDuplicator: reference material missing, skipping HuntNeoCrowbar");
				}
				return;
			}
			val.shader = val2.shader;
			val.CopyPropertiesFromMaterial(val2);
			val.shaderKeywords = val2.shaderKeywords;
			val.renderQueue = val2.renderQueue;
			val.SetFloat("_Boost", 4f);
			val.SetFloat("_AlphaBoost", 5f);
			Texture val3 = MaterialDuplicator_LoadAddressable<Texture>("RoR2/Base/Huntress/texHuntressArrowBigMask.png");
			if ((Object)(object)val3 == (Object)null)
			{
				ManualLogSource instanceLogger3 = InstanceLogger;
				if (instanceLogger3 != null)
				{
					instanceLogger3.LogWarning((object)"MaterialDuplicator: texture for _MainTex could not be loaded.");
				}
			}
			else
			{
				val.SetTexture("_MainTex", val3);
			}
			val.SetTextureScale("_MainTex", new Vector2(1f, 2f));
			val.SetTextureOffset("_MainTex", new Vector2(0.5f, -1f));
		}

		private static T MaterialDuplicator_LoadAddressable<T>(string key) where T : Object
		{
			//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)
			try
			{
				return Addressables.LoadAssetAsync<T>((object)key).WaitForCompletion();
			}
			catch (Exception ex)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)("MaterialDuplicator: could not load addressable '" + key + "': " + ex.Message));
				}
				return default(T);
			}
		}
	}

	private static MaterialDuplicatorExtension _MaterialDuplicatorExtension = new MaterialDuplicatorExtension();

	public static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_HuntressPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_HuntressPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		BeforeStart();
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Huntress.krononconspiratormadveteran_huntress"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
		AfterStart();
	}

	private void BeforeStart()
	{
		try
		{
			_MaterialDuplicatorExtension.BeforeStart();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator BeforeStart failed: " + ex));
			}
		}
	}

	private void AfterStart()
	{
		try
		{
			_MaterialDuplicatorExtension.AfterStart();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator AfterStart failed: " + ex));
			}
		}
	}

	private static void BeforeBodyCatalogInit()
	{
		try
		{
			_MaterialDuplicatorExtension.BeforeBodyCatalogInit();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator BeforeBodyCatalogInit failed: " + ex));
			}
		}
	}

	private static void AfterBodyCatalogInit()
	{
		try
		{
			_MaterialDuplicatorExtension.AfterBodyCatalogInit();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator AfterBodyCatalogInit failed: " + ex));
			}
		}
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeo2Mat.mat");
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGCloudRemap.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeoCrowbar.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONSPIRATOR_SKIN_MADVETHUNTRESSSKINDEF_NAME", "Casual");
	}

	private static void BodyCatalogInit()
	{
		BeforeBodyCatalogInit();
		AddHuntressBodyMadVetHuntressSkinDefSkin();
		AfterBodyCatalogInit();
	}

	private static SkinDef CreateHuntressBodyMadVetHuntressSkinDefSkin(GameObject mdl, ModelSkinController skinController)
	{
		Renderer[] renderers = mdl.GetComponentsInChildren<Renderer>(true);
		mdl.GetComponentsInChildren<Light>(true);
		SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
		SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
		skin.skinDefParams = skinParams;
		((Object)skin).name = "MadVetHuntressSkinDef";
		skin.nameToken = "KRONONCONSPIRATOR_SKIN_MADVETHUNTRESSSKINDEF_NAME";
		skin.rootObject = mdl;
		Helpers.TryCatchThrow("Icon", delegate
		{
			skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Huntress\\Icons\\MadVetHuntressSkinDefIcon.png");
		});
		Helpers.TryCatchThrow("Unlockable Name", delegate
		{
			skin.unlockableDef = null;
		});
		Helpers.TryCatchThrow("Base Skins", delegate
		{
			skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { Helpers.ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
		});
		Helpers.TryCatchThrow("Game Object Activations", delegate
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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_00b9: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: 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)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: 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_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			skinParams.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[4]
			{
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(0, "There is no renderer at path \"HuntressArmature\"", Helpers.GetChildGameObject(mdl, "HuntressArmature")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeo_Accesories.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = Helpers.ThrowIfNull<GameObject>(1, "There is no renderer at path \"ROOT\"", Helpers.GetChildGameObject(mdl, "ROOT")).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeo_Outfit.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(2, "There is no renderer with the name \"Quad 2\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "Quad 2")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(3, "There is no renderer with the name \"HuntressScarfMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "HuntressScarfMesh")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				}
			};
		});
		Helpers.TryCatchThrow("Renderer Infos", delegate
		{
			//IL_0010: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: 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_00b1: 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_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: 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_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[3]
			{
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeo2Mat.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"HuntressMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "HuntressMesh"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				},
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeo2Mat.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(1, "There is no renderer with the name \"BowMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "BowMesh"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				},
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoHuntress/HuntNeoCrowbar.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)0,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(2, "There is no renderer with the name \"Quad 1\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "Quad 1"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				}
			};
		});
		Helpers.TryCatchThrow("MeshReplacements", delegate
		{
			//IL_0010: 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)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: 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_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[3]
			{
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Huntress\\Meshes\\HuntNeo_Body.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"HuntressMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "HuntressMesh")))
				},
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Huntress\\Meshes\\HuntNeo_Bow.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(1, "There is no renderer with the name \"BowMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "BowMesh")))
				},
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Huntress\\Meshes\\HuntNeo_Crowbar.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(2, "There is no renderer with the name \"Quad 1\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "Quad 1")))
				}
			};
		});
		Helpers.TryCatchThrow("Light Infos", delegate
		{
			skinParams.lightReplacements = Array.Empty<LightInfo>();
		});
		Helpers.TryCatchThrow("Minion Skin Replacements", delegate
		{
			skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
		});
		Helpers.TryCatchThrow("Projectile Ghost Replacements", delegate
		{
			skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
		});
		return skin;
	}

	private static void AddHuntressBodyMadVetHuntressSkinDefSkin()
	{
		string text = "HuntressBody";
		string text2 = "MadVetHuntressSkinDef";
		GameObject val = BodyCatalog.FindBodyPrefab(text);
		if (!Object.op_Implicit((Object)(object)val))
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
			return;
		}
		try
		{
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
			}
			else
			{
				SkinDef val3 = CreateHuntressBodyMadVetHuntressSkinDefSkin(gameObject, val2);
				Array.Resize(ref val2.skins, val2.skins.Length + 1);
				val2.skins[val2.skins.Length - 1] = val3;
			}
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}
}
public class MeshActivator : MonoBehaviour
{
	[Serializable]
	public struct CustomRendererInfo
	{
		[Tooltip("Direct material asset reference from your asset bundle or project.")]
		public Material material;

		[Tooltip("Addressable path to load an in-game vanilla material (e.g., 'RoR2/Base/Mage/matMage.mat'). Takes precedence if specified.")]
		public string addressableMaterialPath;

		[Tooltip("Whether this renderer ignores visual status overlays (e.g., stealth, low health red tint).")]
		public bool ignoreOverlays;

		[Tooltip("Shadow casting mode for this renderer.")]
		public ShadowCastingMode shadowCastingMode;
	}

	[Header("Reference Settings")]
	[Tooltip("Name of the in-game original mesh object to look for, e.g. 'MageMesh' or 'MageCapeMesh'.")]
	public string referenceObjectName = "MageMesh";

	[Tooltip("Active state applied once the mesh has been registered.")]
	public bool initialActiveState = true;

	[Header("Renderer & Material Configuration")]
	[Tooltip("Custom configuration for the renderer info applied to the CharacterModel.")]
	public CustomRendererInfo customRendererInfo = new CustomRendererInfo
	{
		shadowCastingMode = (ShadowCastingMode)1,
		ignoreOverlays = false
	};

	private CharacterModel characterModel;

	private SkinnedMeshRenderer ownRenderer;

	private bool registered;

	private IEnumerator Start()
	{
		for (int i = 0; i < 5; i++)
		{
			yield return null;
		}
		Register();
	}

	private void Register()
	{
		//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0212: Unknown result type (might be due to invalid IL or missing references)
		//IL_0214: Unknown result type (might be due to invalid IL or missing references)
		//IL_0186: Unknown result type (might be due to invalid IL or missing references)
		//IL_018b: Unknown result type (might be due to invalid IL or missing references)
		//IL_029a: Unknown result type (might be due to invalid IL or missing references)
		//IL_029b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0262: Unknown result type (might be due to invalid IL or missing references)
		//IL_0263: Unknown result type (might be due to invalid IL or missing references)
		if (registered)
		{
			return;
		}
		ownRenderer = ((Component)this).GetComponent<SkinnedMeshRenderer>();
		if (!Object.op_Implicit((Object)(object)ownRenderer))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "' has no SkinnedMeshRenderer."), (Object)(object)this);
			return;
		}
		Transform val = FindReference();
		if (!Object.op_Implicit((Object)(object)val))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': no object named '" + referenceObjectName + "' found in its hierarchy."), (Object)(object)this);
			return;
		}
		characterModel = ((Component)val).GetComponentInParent<CharacterModel>();
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		}
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': no CharacterModel found above '" + ((Object)val).name + "'."), (Object)(object)this);
			return;
		}
		SkinnedMeshRenderer val2 = ((Component)val).GetComponent<SkinnedMeshRenderer>();
		if (!Object.op_Implicit((Object)(object)val2))
		{
			val2 = ((Component)val).GetComponentInChildren<SkinnedMeshRenderer>(true);
		}
		if (Object.op_Implicit((Object)(object)val2))
		{
			ownRenderer.rootBone = val2.rootBone;
			ownRenderer.bones = val2.bones;
		}
		else
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)val).name + "' has no SkinnedMeshRenderer to copy bones from."), (Object)(object)this);
		}
		Material val3 = customRendererInfo.material;
		if (!Object.op_Implicit((Object)(object)val3) && !string.IsNullOrEmpty(customRendererInfo.addressableMaterialPath))
		{
			val3 = Addressables.LoadAssetAsync<Material>((object)customRendererInfo.addressableMaterialPath).WaitForCompletion();
			if (!Object.op_Implicit((Object)(object)val3))
			{
				Debug.LogWarning((object)("[MeshActivator] Failed to load material via Addressables path: '" + customRendererInfo.addressableMaterialPath + "'. Falling back to sharedMaterial."), (Object)(object)this);
			}
		}
		if (!Object.op_Implicit((Object)(object)val3))
		{
			val3 = ((Renderer)ownRenderer).sharedMaterial;
		}
		RendererInfo val4 = new RendererInfo
		{
			renderer = (Renderer)(object)ownRenderer,
			defaultMaterial = val3,
			defaultShadowCastingMode = customRendererInfo.shadowCastingMode,
			ignoreOverlays = customRendererInfo.ignoreOverlays
		};
		RendererInfo[] baseRendererInfos = characterModel.baseRendererInfos;
		int num = -1;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			if ((Object)(object)baseRendererInfos[i].renderer == (Object)(object)ownRenderer)
			{
				num = i;
				break;
			}
		}
		if (num >= 0)
		{
			baseRendererInfos[num] = val4;
		}
		else
		{
			Array.Resize(ref characterModel.baseRendererInfos, baseRendererInfos.Length + 1);
			characterModel.baseRendererInfos[characterModel.baseRendererInfos.Length - 1] = val4;
		}
		registered = true;
		characterModel.UpdateMaterials();
		((Component)this).gameObject.SetActive(initialActiveState);
	}

	private Transform FindReference()
	{
		if (string.IsNullOrEmpty(referenceObjectName))
		{
			return null;
		}
		Transform parent = ((Component)this).transform.parent;
		while (Object.op_Implicit((Object)(object)parent))
		{
			if (((Object)parent).name == referenceObjectName)
			{
				return parent;
			}
			Transform[] componentsInChildren = ((Component)parent).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!((Object)(object)val == (Object)(object)((Component)this).transform) && !val.IsChildOf(((Component)this).transform) && ((Object)val).name == referenceObjectName)
				{
					return val;
				}
			}
			parent = parent.parent;
		}
		return null;
	}
}
public static class Helpers
{
	private static GameObject prefabHolder;

	public static GameObject ClonePrefab(GameObject gameObject)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		if (!Object.op_Implicit((Object)(object)prefabHolder))
		{
			prefabHolder = new GameObject("PrefabHolder");
			Object.DontDestroyOnLoad((Object)(object)prefabHolder);
			prefabHolder.SetActive(false);
		}
		GameObject obj = Object.Instantiate<GameObject>(gameObject, prefabHolder.transform);
		obj.AddComponent<RemoveClone>();
		((Object)obj).name = ((Object)gameObject).name;
		return obj;
	}

	public static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}

	public static Transform GetChild(this Transform transform, int index, out Transform child)
	{
		return child = transform.GetChild(index);
	}

	public static GameObject WithComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		T obj = gameObject.AddComponent<T>();
		modifier?.Invoke(obj);
		return gameObject;
	}

	public static GameObject WithTryComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		if (Object.op_Implicit((Object)(object)gameObject) && !Object.op_Implicit((Object)(object)gameObject.GetComponent<T>()))
		{
			T obj = gameObject.AddComponent<T>();
			modifier?.Invoke(obj);
		}
		return gameObject;
	}

	public static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	public static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}
}
public class RemoveClone : MonoBehaviour
{
	public void Awake()
	{
		((Object)this).name = ((Object)this).name[..^7];
	}
}
public class FieldException : Exception
{
	public FieldException(string message, Exception innerException)
		: base(message, innerException)
	{
	}
}
public class ElementException : Exception
{
	public int Index { get; }

	public ElementException(int index, string message)
		: base(message)
	{
		Index = index;
	}
}
public class InsertBones : MonoBehaviour
{
	private readonly List<SkinnedMeshRenderer> modifiedRenderers = new List<SkinnedMeshRenderer>();

	public List<string> rendererPaths = new List<string>();

	public List<Transform> newBones = new List<Transform>();

	public string afterPath;

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		Transform value = ((Component)transform).transform.Find(afterPath);
		foreach (string rendererPath in rendererPaths)
		{
			Transform obj = transform.Find(rendererPath);
			SkinnedMeshRenderer val = ((obj != null) ? ((Component)obj).GetComponent<SkinnedMeshRenderer>() : null);
			if (Object.op_Implicit((Object)(object)val))
			{
				Transform[] array = val.bones;
				int num = Array.IndexOf(array, value) + 1;
				if (num != 0)
				{
					Array.Resize(ref array, array.Length + newBones.Count);
					Array.Copy(array, num, array, num + newBones.Count, array.Length - newBones.Count - num);
					newBones.CopyTo(array, num);
					val.bones = array;
					modifiedRenderers.Add(val);
				}
			}
		}
	}

	public void OnDestroy()
	{
		foreach (SkinnedMeshRenderer modifiedRenderer in modifiedRenderers)
		{
			if (Object.op_Implicit((Object)(object)modifiedRenderer))
			{
				Transform[] array = modifiedRenderer.bones;
				int num = Array.IndexOf(array, ((Component)this).transform);
				Array.Copy(array, num + newBones.Count, array, num, array.Length - num - newBones.Count);
				Array.Resize(ref array, array.Length - newBones.Count);
				modifiedRenderer.bones = array;
			}
		}
		modifiedRenderers.Clear();
	}
}
public class AddDynamicColliders : MonoBehaviour
{
	public List<string> paths = new List<string>();

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		List<DynamicBoneCollider> list = new List<DynamicBoneCollider>();
		foreach (string path in paths)
		{
			Transform val = transform.Find(path);
			if (Object.op_Implicit((Object)(object)val))
			{
				list.AddRange(((Component)val).GetComponents<DynamicBoneCollider>());
			}
		}
		DynamicBone[] components = ((Component)this).GetComponents<DynamicBone>();
		for (int i = 0; i < components.Length; i++)
		{
			components[i].m_Colliders.AddRange(list);
		}
	}
}

Skins/MadVeteran_Merc.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MadVeteran_Core;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Merc;

public class CoreConfigToggle : MonoBehaviour
{
	private void Start()
	{
		if (!CorePlugin.Merc_NullPointer_ParticleEnabled.Value)
		{
			((Component)this).gameObject.SetActive(false);
		}
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.KrononConpsirator.MadVeteran_Merc", "MadVeteran_Merc", "1.0.0")]
public class MadVeteran_MercPlugin : BaseUnityPlugin
{
	public class MaterialDuplicatorExtension
	{
		internal void BeforeStart()
		{
		}

		internal void AfterStart()
		{
			try
			{
				MercNeoWireframeMat();
			}
			catch (Exception ex)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)("MaterialDuplicator entry 0 failed: " + ex));
				}
			}
			try
			{
				MercNeoGllitchPixelMat();
			}
			catch (Exception ex2)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)("MaterialDuplicator entry 1 failed: " + ex2));
				}
			}
			try
			{
				MercNeoWireframeHeadMat();
			}
			catch (Exception ex3)
			{
				ManualLogSource instanceLogger3 = InstanceLogger;
				if (instanceLogger3 != null)
				{
					instanceLogger3.LogWarning((object)("MaterialDuplicator entry 2 failed: " + ex3));
				}
			}
		}

		internal void BeforeBodyCatalogInit()
		{
		}

		internal void AfterBodyCatalogInit()
		{
		}

		private void MercNeoWireframeMat()
		{
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			Material val = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoWireframeMat.mat");
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)"MaterialDuplicator: material not found in bundle: Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoWireframeMat.mat");
				}
				return;
			}
			Material val2 = MaterialDuplicator_LoadAddressable<Material>("RoR2/Base/Loader/matLoaderAltSolus.mat");
			if ((Object)(object)val2 == (Object)null)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)"MaterialDuplicator: reference material missing, skipping MercNeoWireframeMat");
				}
				return;
			}
			val.shader = val2.shader;
			val.CopyPropertiesFromMaterial(val2);
			val.shaderKeywords = val2.shaderKeywords;
			val.renderQueue = val2.renderQueue;
			val.SetTexture("_MainTex", (Texture)null);
			val.SetColor("_Color", new Color(1f / 51f, 1f / 51f, 1f / 51f, 1f));
			val.SetColor("_VertColor", new Color(46f / 85f, 0.9254902f, 1f, 1f));
			val.SetFloat("_EmPower", 0.4f);
			val.SetFloat("_EmBoost", 30f);
			val.SetFloat("_GradientWidth", 1.26f);
			val.SetFloat("_GradientSmoothness", 3f);
			val.SetColor("_EmColor", new Color(1f / 85f, 2f / 85f, 0.07450981f, 1f));
		}

		private void MercNeoGllitchPixelMat()
		{
			Material val = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoGllitchPixelMat.mat");
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)"MaterialDuplicator: material not found in bundle: Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoGllitchPixelMat.mat");
				}
				return;
			}
			Material val2 = MaterialDuplicator_LoadAddressable<Material>("RoR2/DLC3/Items/SharedSuffering/matSharedSufferingGlitch.mat");
			if ((Object)(object)val2 == (Object)null)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)"MaterialDuplicator: reference material missing, skipping MercNeoGllitchPixelMat");
				}
				return;
			}
			val.shader = val2.shader;
			val.CopyPropertiesFromMaterial(val2);
			val.shaderKeywords = val2.shaderKeywords;
			val.renderQueue = val2.renderQueue;
			Texture val3 = assetBundle.LoadAsset<Texture>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/Tex/PixelParticleDistort.png");
			if ((Object)(object)val3 == (Object)null)
			{
				ManualLogSource instanceLogger3 = InstanceLogger;
				if (instanceLogger3 != null)
				{
					instanceLogger3.LogWarning((object)"MaterialDuplicator: texture for _MainTex could not be loaded.");
				}
			}
			else
			{
				val.SetTexture("_MainTex", val3);
			}
		}

		private void MercNeoWireframeHeadMat()
		{
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			Material val = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoWireframeHeadMat.mat");
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)"MaterialDuplicator: material not found in bundle: Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoWireframeHeadMat.mat");
				}
				return;
			}
			Material val2 = MaterialDuplicator_LoadAddressable<Material>("RoR2/Base/Loader/matLoaderAltSolus.mat");
			if ((Object)(object)val2 == (Object)null)
			{
				ManualLogSource instanceLogger2 = InstanceLogger;
				if (instanceLogger2 != null)
				{
					instanceLogger2.LogWarning((object)"MaterialDuplicator: reference material missing, skipping MercNeoWireframeHeadMat");
				}
				return;
			}
			val.shader = val2.shader;
			val.CopyPropertiesFromMaterial(val2);
			val.shaderKeywords = val2.shaderKeywords;
			val.renderQueue = val2.renderQueue;
			val.SetColor("_Color", new Color(1f / 51f, 1f / 51f, 1f / 51f, 1f));
			val.SetColor("_VertColor", new Color(46f / 85f, 0.9254902f, 1f, 1f));
			val.SetFloat("_EmPower", 0.4f);
			val.SetFloat("_EmBoost", 30f);
			val.SetFloat("_GradientWidth", 3.45f);
			val.SetFloat("_GradientSmoothness", 0.5f);
			val.SetColor("_EmColor", new Color(1f / 85f, 2f / 85f, 0.07450981f, 1f));
		}

		private static T MaterialDuplicator_LoadAddressable<T>(string key) where T : Object
		{
			//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)
			try
			{
				return Addressables.LoadAssetAsync<T>((object)key).WaitForCompletion();
			}
			catch (Exception ex)
			{
				ManualLogSource instanceLogger = InstanceLogger;
				if (instanceLogger != null)
				{
					instanceLogger.LogWarning((object)("MaterialDuplicator: could not load addressable '" + key + "': " + ex.Message));
				}
				return default(T);
			}
		}
	}

	private static MaterialDuplicatorExtension _MaterialDuplicatorExtension = new MaterialDuplicatorExtension();

	public static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_MercPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_MercPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		BeforeStart();
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Merc.krononconpsiratormadveteran_merc"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
		AfterStart();
	}

	private void BeforeStart()
	{
		try
		{
			_MaterialDuplicatorExtension.BeforeStart();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator BeforeStart failed: " + ex));
			}
		}
	}

	private void AfterStart()
	{
		try
		{
			_MaterialDuplicatorExtension.AfterStart();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator AfterStart failed: " + ex));
			}
		}
	}

	private static void BeforeBodyCatalogInit()
	{
		try
		{
			_MaterialDuplicatorExtension.BeforeBodyCatalogInit();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator BeforeBodyCatalogInit failed: " + ex));
			}
		}
	}

	private static void AfterBodyCatalogInit()
	{
		try
		{
			_MaterialDuplicatorExtension.AfterBodyCatalogInit();
		}
		catch (Exception ex)
		{
			ManualLogSource instanceLogger = InstanceLogger;
			if (instanceLogger != null)
			{
				instanceLogger.LogError((object)("MaterialDuplicator AfterBodyCatalogInit failed: " + ex));
			}
		}
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoMat.mat");
		LoadMaterialsWithReplacedShader("RoR2/DLC3/TransparentTextureScrolling.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoWireframeMat.mat", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoWireframeHeadMat.mat");
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGDistortion.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoGlitchDistortionMat.mat");
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGCloudRemap.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoGllitchPixelMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETMERCSKINDEF_NAME", "Null Pointer");
	}

	private static void BodyCatalogInit()
	{
		BeforeBodyCatalogInit();
		AddMercBodyMadVetMercSkinDefSkin();
		AfterBodyCatalogInit();
	}

	private static SkinDef CreateMercBodyMadVetMercSkinDefSkin(GameObject mdl, ModelSkinController skinController)
	{
		Renderer[] renderers = mdl.GetComponentsInChildren<Renderer>(true);
		mdl.GetComponentsInChildren<Light>(true);
		SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
		SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
		skin.skinDefParams = skinParams;
		((Object)skin).name = "MadVetMercSkinDef";
		skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETMERCSKINDEF_NAME";
		skin.rootObject = mdl;
		Helpers.TryCatchThrow("Icon", delegate
		{
			skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Merc\\Icons\\MadVetMercSkinDefIcon.png");
		});
		Helpers.TryCatchThrow("Unlockable Name", delegate
		{
			skin.unlockableDef = null;
		});
		Helpers.TryCatchThrow("Base Skins", delegate
		{
			skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { Helpers.ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
		});
		Helpers.TryCatchThrow("Game Object Activations", delegate
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: 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)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: 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_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: 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_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: 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_0156: 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_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_020e: Unknown result type (might be due to invalid IL or missing references)
			//IL_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_022f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0290: Unknown result type (might be due to invalid IL or missing references)
			//IL_0299: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0307: Unknown result type (might be due to invalid IL or missing references)
			//IL_030c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0322: Unknown result type (might be due to invalid IL or missing references)
			//IL_0327: Unknown result type (might be due to invalid IL or missing references)
			//IL_0347: Unknown result type (might be due to invalid IL or missing references)
			//IL_0348: Unknown result type (might be due to invalid IL or missing references)
			//IL_0351: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03da: Unknown result type (might be due to invalid IL or missing references)
			//IL_03df: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0400: Unknown result type (might be due to invalid IL or missing references)
			skinParams.gameObjectActivations = (GameObjectActivation[])(object)new GameObjectActivation[6]
			{
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(0, "There is no renderer at path \"MercArmature\"", mdl.transform.Find("MercArmature"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/Prefab/MercBaseAddon.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(1, "There is no renderer at path \"MercArmature/ROOT\"", mdl.transform.Find("MercArmature/ROOT"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/Prefab/MercHeadPrefab.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(2, "There is no renderer at path \"MercArmature/ROOT/base\"", mdl.transform.Find("MercArmature/ROOT/base"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(1f, 1f, 1f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/Prefab/MercSwordsPrefab.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Renderer>(3, "There is no renderer with the name \"MercSwordMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MercSwordMesh")))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = false
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(4, "There is no renderer at path \"MercArmature/ROOT/base/stomach/chest/neck/head\"", mdl.transform.Find("MercArmature/ROOT/base/stomach/chest/neck/head"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0.102f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(0.01f, 0.01f, 0.01f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/Prefab/MercHeadParticles.prefab"))
				},
				new GameObjectActivation
				{
					gameObject = ((Component)Helpers.ThrowIfNull<Transform>(5, "There is no renderer at path \"MercArmature/ROOT/base/stomach/chest/SwingCenter/SwordBase/SwordLength.1\"", mdl.transform.Find("MercArmature/ROOT/base/stomach/chest/SwingCenter/SwordBase/SwordLength.1"))).gameObject,
					shouldActivate = false,
					spawnPrefabOnModelObject = true,
					localPosition = new Vector3(0f, 0f, 0f),
					localRotation = new Vector3(0f, 0f, 0f),
					localScale = new Vector3(0.01f, 0.01f, 0.01f),
					prefab = Helpers.ClonePrefab(assetBundle.LoadAsset<GameObject>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/Prefab/MercSwordParticles.prefab"))
				}
			};
		});
		Helpers.TryCatchThrow("Renderer Infos", delegate
		{
			//IL_0010: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
			{
				new RendererInfo
				{
					defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMerc/MercNeoMat.mat"),
					defaultShadowCastingMode = (ShadowCastingMode)1,
					ignoreOverlays = false,
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MercMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MercMesh"))),
					hideOnDeath = false,
					ignoresMaterialOverrides = false
				}
			};
		});
		Helpers.TryCatchThrow("MeshReplacements", delegate
		{
			//IL_0010: 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)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
			{
				new MeshReplacement
				{
					mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Merc\\Meshes\\NeoMercBody.mesh"),
					renderer = Helpers.ThrowIfNull<Renderer>(0, "There is no renderer with the name \"MercMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "MercMesh")))
				}
			};
		});
		Helpers.TryCatchThrow("Light Infos", delegate
		{
			skinParams.lightReplacements = Array.Empty<LightInfo>();
		});
		Helpers.TryCatchThrow("Minion Skin Replacements", delegate
		{
			skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
		});
		Helpers.TryCatchThrow("Projectile Ghost Replacements", delegate
		{
			skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
		});
		return skin;
	}

	private static void AddMercBodyMadVetMercSkinDefSkin()
	{
		string text = "MercBody";
		string text2 = "MadVetMercSkinDef";
		GameObject val = BodyCatalog.FindBodyPrefab(text);
		if (!Object.op_Implicit((Object)(object)val))
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
			return;
		}
		try
		{
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)val2))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
			}
			else
			{
				SkinDef val3 = CreateMercBodyMadVetMercSkinDefSkin(gameObject, val2);
				Array.Resize(ref val2.skins, val2.skins.Length + 1);
				val2.skins[val2.skins.Length - 1] = val3;
			}
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}
}
public class MadVetMercRandomToggler : MonoBehaviour
{
	[Header("Settings")]
	[SerializeField]
	private float toggleInterval = 3f;

	[Header("References")]
	[SerializeField]
	private Mesh[] AltMeshes;

	private SkinnedMeshRenderer ContainedRenderer;

	private int oldindex = -1;

	private int currentIndex = -1;

	private IEnumerator Start()
	{
		for (int i = 0; i < 8; i++)
		{
			yield return null;
		}
		if (!CorePlugin.Merc_NullPointer_MeshSwapperEnabled.Value)
		{
			((Behaviour)this).enabled = false;
			yield break;
		}
		GameObject gameObject = ((Component)((Component)this).transform.GetChild(0)).gameObject;
		ContainedRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();
		((MonoBehaviour)this).StartCoroutine(RandomToggleRoutine());
	}

	private IEnumerator RandomToggleRoutine()
	{
		while (true)
		{
			if (AltMeshes.Length > 1)
			{
				int num;
				do
				{
					num = Random.Range(0, AltMeshes.Length);
				}
				while (num == currentIndex || num == oldindex);
				oldindex = currentIndex;
				currentIndex = num;
				ContainedRenderer.sharedMesh = AltMeshes[currentIndex];
			}
			yield return (object)new WaitForSeconds(toggleInterval);
		}
	}
}
public class MeshActivator : MonoBehaviour
{
	[Serializable]
	public struct CustomRendererInfo
	{
		public Material material;

		public string addressableMaterialPath;

		public bool ignoreOverlays;

		public ShadowCastingMode shadowCastingMode;
	}

	[Header("Reference Settings")]
	[Tooltip("Name of the in-game original mesh object.")]
	public string referenceObjectName;

	[Tooltip("Copy Bone Data From Reference Object.")]
	public bool CopyBoneData = true;

	[Tooltip("Active state applied once registered.")]
	public bool initialActiveState = true;

	[Tooltip("Custom configuration for the renderer info applied to the CharacterModel.")]
	public CustomRendererInfo customRendererInfo = new CustomRendererInfo
	{
		shadowCastingMode = (ShadowCastingMode)1,
		ignoreOverlays = false
	};

	private CharacterModel characterModel;

	private bool registered;

	private IEnumerator Start()
	{
		for (int i = 0; i < 5; i++)
		{
			yield return null;
		}
		Register();
	}

	private void Register()
	{
		//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: 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_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0212: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_0293: Unknown result type (might be due to invalid IL or missing references)
		//IL_0294: Unknown result type (might be due to invalid IL or missing references)
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_025c: Unknown result type (might be due to invalid IL or missing references)
		if (registered)
		{
			return;
		}
		Renderer component = ((Component)this).GetComponent<Renderer>();
		if (!Object.op_Implicit((Object)(object)component))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "' has no Renderer."), (Object)(object)this);
			return;
		}
		Transform val = FindReference();
		if (!Object.op_Implicit((Object)(object)val))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': '" + referenceObjectName + "' not found in its hierarchy."), (Object)(object)this);
			return;
		}
		characterModel = ((Component)val).GetComponentInParent<CharacterModel>();
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			characterModel = ((Component)this).GetComponentInParent<CharacterModel>();
		}
		if (!Object.op_Implicit((Object)(object)characterModel))
		{
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)this).name + "': no CharacterModel found above '" + ((Object)val).name + "'"), (Object)(object)this);
			return;
		}
		if (CopyBoneData)
		{
			SkinnedMeshRenderer val2 = ((Component)val).GetComponent<SkinnedMeshRenderer>();
			if (!Object.op_Implicit((Object)(object)val2))
			{
				val2 = ((Component)val).GetComponentInChildren<SkinnedMeshRenderer>(true);
			}
			if (Object.op_Implicit((Object)(object)val2))
			{
				SkinnedMeshRenderer val3 = (SkinnedMeshRenderer)(object)((component is SkinnedMeshRenderer) ? component : null);
				if (val3 != null)
				{
					val3.rootBone = val2.rootBone;
					val3.bones = val2.bones;
					goto IL_015d;
				}
			}
			Debug.LogWarning((object)("[MeshActivator] '" + ((Object)val).name + "' has no SkinnedMeshRenderer to copy bones from."), (Object)(object)this);
		}
		goto IL_015d;
		IL_015d:
		Material val4 = customRendererInfo.material;
		if (!Object.op_Implicit((Object)(object)val4) && !string.IsNullOrEmpty(customRendererInfo.addressableMaterialPath))
		{
			val4 = Addressables.LoadAssetAsync<Material>((object)customRendererInfo.addressableMaterialPath).WaitForCompletion();
			if (!Object.op_Implicit((Object)(object)val4))
			{
				Debug.LogWarning((object)("[MeshActivator] Failed to load material via Addressables path: '" + customRendererInfo.addressableMaterialPath + "'. Falling back to sharedMaterial."), (Object)(object)this);
			}
		}
		if (!Object.op_Implicit((Object)(object)val4))
		{
			val4 = component.sharedMaterial;
		}
		RendererInfo val5 = new RendererInfo
		{
			renderer = component,
			defaultMaterial = val4,
			defaultShadowCastingMode = customRendererInfo.shadowCastingMode,
			ignoreOverlays = customRendererInfo.ignoreOverlays
		};
		RendererInfo[] baseRendererInfos = characterModel.baseRendererInfos;
		int num = -1;
		for (int i = 0; i < baseRendererInfos.Length; i++)
		{
			if ((Object)(object)baseRendererInfos[i].renderer == (Object)(object)component)
			{
				num = i;
				break;
			}
		}
		if (num >= 0)
		{
			baseRendererInfos[num] = val5;
		}
		else
		{
			Array.Resize(ref characterModel.baseRendererInfos, baseRendererInfos.Length + 1);
			characterModel.baseRendererInfos[characterModel.baseRendererInfos.Length - 1] = val5;
		}
		registered = true;
		characterModel.UpdateMaterials();
		((Component)this).gameObject.SetActive(initialActiveState);
	}

	private Transform FindReference()
	{
		if (string.IsNullOrEmpty(referenceObjectName))
		{
			return null;
		}
		Transform parent = ((Component)this).transform.parent;
		while (Object.op_Implicit((Object)(object)parent))
		{
			if (((Object)parent).name == referenceObjectName)
			{
				return parent;
			}
			Transform[] componentsInChildren = ((Component)parent).GetComponentsInChildren<Transform>(true);
			foreach (Transform val in componentsInChildren)
			{
				if (!((Object)(object)val == (Object)(object)((Component)this).transform) && !val.IsChildOf(((Component)this).transform) && ((Object)val).name == referenceObjectName)
				{
					return val;
				}
			}
			parent = parent.parent;
		}
		return null;
	}
}
public static class Helpers
{
	private static GameObject prefabHolder;

	public static GameObject ClonePrefab(GameObject gameObject)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Expected O, but got Unknown
		if (!Object.op_Implicit((Object)(object)prefabHolder))
		{
			prefabHolder = new GameObject("PrefabHolder");
			Object.DontDestroyOnLoad((Object)(object)prefabHolder);
			prefabHolder.SetActive(false);
		}
		GameObject obj = Object.Instantiate<GameObject>(gameObject, prefabHolder.transform);
		obj.AddComponent<RemoveClone>();
		((Object)obj).name = ((Object)gameObject).name;
		return obj;
	}

	public static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}

	public static Transform GetChild(this Transform transform, int index, out Transform child)
	{
		return child = transform.GetChild(index);
	}

	public static GameObject WithComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		T obj = gameObject.AddComponent<T>();
		modifier?.Invoke(obj);
		return gameObject;
	}

	public static GameObject WithTryComponent<T>(this GameObject gameObject, Action<T> modifier = null) where T : Component
	{
		if (Object.op_Implicit((Object)(object)gameObject) && !Object.op_Implicit((Object)(object)gameObject.GetComponent<T>()))
		{
			T obj = gameObject.AddComponent<T>();
			modifier?.Invoke(obj);
		}
		return gameObject;
	}

	public static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	public static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	public static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}
}
public class RemoveClone : MonoBehaviour
{
	public void Awake()
	{
		((Object)this).name = ((Object)this).name[..^7];
	}
}
public class FieldException : Exception
{
	public FieldException(string message, Exception innerException)
		: base(message, innerException)
	{
	}
}
public class ElementException : Exception
{
	public int Index { get; }

	public ElementException(int index, string message)
		: base(message)
	{
		Index = index;
	}
}
public class InsertBones : MonoBehaviour
{
	private readonly List<SkinnedMeshRenderer> modifiedRenderers = new List<SkinnedMeshRenderer>();

	public List<string> rendererPaths = new List<string>();

	public List<Transform> newBones = new List<Transform>();

	public string afterPath;

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		Transform value = ((Component)transform).transform.Find(afterPath);
		foreach (string rendererPath in rendererPaths)
		{
			Transform obj = transform.Find(rendererPath);
			SkinnedMeshRenderer val = ((obj != null) ? ((Component)obj).GetComponent<SkinnedMeshRenderer>() : null);
			if (Object.op_Implicit((Object)(object)val))
			{
				Transform[] array = val.bones;
				int num = Array.IndexOf(array, value) + 1;
				if (num != 0)
				{
					Array.Resize(ref array, array.Length + newBones.Count);
					Array.Copy(array, num, array, num + newBones.Count, array.Length - newBones.Count - num);
					newBones.CopyTo(array, num);
					val.bones = array;
					modifiedRenderers.Add(val);
				}
			}
		}
	}

	public void OnDestroy()
	{
		foreach (SkinnedMeshRenderer modifiedRenderer in modifiedRenderers)
		{
			if (Object.op_Implicit((Object)(object)modifiedRenderer))
			{
				Transform[] array = modifiedRenderer.bones;
				int num = Array.IndexOf(array, ((Component)this).transform);
				Array.Copy(array, num + newBones.Count, array, num, array.Length - num - newBones.Count);
				Array.Resize(ref array, array.Length - newBones.Count);
				modifiedRenderer.bones = array;
			}
		}
		modifiedRenderers.Clear();
	}
}
public class AddDynamicColliders : MonoBehaviour
{
	public List<string> paths = new List<string>();

	public void Awake()
	{
		Transform transform = ((Component)((Component)this).GetComponentInParent<ModelSkinController>()).transform;
		List<DynamicBoneCollider> list = new List<DynamicBoneCollider>();
		foreach (string path in paths)
		{
			Transform val = transform.Find(path);
			if (Object.op_Implicit((Object)(object)val))
			{
				list.AddRange(((Component)val).GetComponents<DynamicBoneCollider>());
			}
		}
		DynamicBone[] components = ((Component)this).GetComponents<DynamicBone>();
		for (int i = 0; i < components.Length; i++)
		{
			components[i].m_Colliders.AddRange(list);
		}
	}
}

Skins/MadVeteran_MulT.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_MulT;

[BepInPlugin("com.KrononConpsirator.MadVeteran_MulT", "MadVeteran_MulT", "1.0.0")]
public class MadVeteran_MulTPlugin : BaseUnityPlugin
{
	private class FieldException : Exception
	{
		public FieldException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}

	private class ElementException : Exception
	{
		public int Index { get; }

		public ElementException(int index, string message)
			: base(message)
		{
			Index = index;
		}
	}

	private static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_MulTPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_MulTPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_MulT.krononconpsiratormadveteran_mult"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMulT/MulTNeoMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETMULTSKINDEF_NAME", "Tank-E");
	}

	private static void BodyCatalogInit()
	{
		AddToolbotBodyMadVetMulTSkinDefSkin();
	}

	private static void AddToolbotBodyMadVetMulTSkinDefSkin()
	{
		string text = "ToolbotBody";
		string text2 = "MadVetMulTSkinDef";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController skinController = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)skinController))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			gameObject.GetComponentsInChildren<Light>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
			skin.skinDefParams = skinParams;
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_MulT\\Icons\\MadVetMulTSkinDefIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETMULTSKINDEF_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skinParams.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0010: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[1]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoMulT/MulTNeoMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)0,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"ToolbotMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "ToolbotMesh")))
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_MulT\\Meshes\\ToolbotMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"ToolbotMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "ToolbotMesh")))
					}
				};
			});
			TryCatchThrow("Light Infos", delegate
			{
				skinParams.lightReplacements = (LightInfo[])(object)new LightInfo[0];
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}

	private static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	private static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}

	private static void TryAddComponent<T>(GameObject obj) where T : Component
	{
		if (Object.op_Implicit((Object)(object)obj) && !Object.op_Implicit((Object)(object)obj.GetComponent<T>()))
		{
			obj.AddComponent<T>();
		}
	}

	private static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}
}

Skins/MadVeteran_Rex.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using MonoMod.RuntimeDetour.HookGen;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace MadVeteran_Rex;

[BepInPlugin("com.KrononConpsirator.MadVeteran_Rex", "MadVeteran_Rex", "1.0.0")]
public class MadVeteran_RexPlugin : BaseUnityPlugin
{
	private class FieldException : Exception
	{
		public FieldException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}

	private class ElementException : Exception
	{
		public int Index { get; }

		public ElementException(int index, string message)
			: base(message)
		{
			Index = index;
		}
	}

	private static AssetBundle assetBundle;

	private static readonly List<Material> materialsWithRoRShader = new List<Material>();

	internal static MadVeteran_RexPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			MadVeteran_RexPlugin instance = Instance;
			if (instance == null)
			{
				return null;
			}
			return ((BaseUnityPlugin)instance).Logger;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MadVeteran_Rex.krononconpsiratormadveteran_rex"))
		{
			assetBundle = AssetBundle.LoadFromStream(stream);
		}
		((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit);
		HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings));
		ReplaceShaders();
	}

	private static void ReplaceShaders()
	{
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoRex/BioRexPlantMat.mat", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoRex/BioRexSteelMat.mat");
		LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGCloudRemap.shader", "Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoRex/BioRexGlassMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//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)
		Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion();
		foreach (string text in materialPaths)
		{
			Material val = assetBundle.LoadAsset<Material>(text);
			val.shader = shader;
			materialsWithRoRShader.Add(val);
		}
	}

	private static void LanguageLoadStrings(Action<Language> orig, Language self)
	{
		orig(self);
		self.SetStringByToken("KRONONCONPSIRATOR_SKIN_MADVETREXSKINDEF_NAME", "Synergized");
	}

	private static void BodyCatalogInit()
	{
		AddTreebotBodyMadVetRexSkinDefSkin();
	}

	private static void AddTreebotBodyMadVetRexSkinDefSkin()
	{
		string text = "TreebotBody";
		string text2 = "MadVetRexSkinDef";
		try
		{
			GameObject val = BodyCatalog.FindBodyPrefab(text);
			if (!Object.op_Implicit((Object)(object)val))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist"));
				return;
			}
			ModelLocator component = val.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component"));
				return;
			}
			GameObject gameObject = ((Component)component.modelTransform).gameObject;
			ModelSkinController skinController = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null);
			if (!Object.op_Implicit((Object)(object)skinController))
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component"));
				return;
			}
			Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);
			gameObject.GetComponentsInChildren<Light>(true);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			SkinDefParams skinParams = ScriptableObject.CreateInstance<SkinDefParams>();
			skin.skinDefParams = skinParams;
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\MadVeteran_Rex\\Icons\\MadVetRexSkinDefIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "KRONONCONPSIRATOR_SKIN_MADVETREXSKINDEF_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { ThrowIfOutOfBounds(0, "Index 0 is out of bounds of skins array", skinController.skins, 0) };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skinParams.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0010: 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_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0079: Unknown result type (might be due to invalid IL or missing references)
				//IL_0082: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ea: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
				//IL_0113: Unknown result type (might be due to invalid IL or missing references)
				//IL_015c: Unknown result type (might be due to invalid IL or missing references)
				//IL_015d: 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_0185: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
				skinParams.rendererInfos = (RendererInfo[])(object)new RendererInfo[4]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoRex/BioRexPlantMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = true,
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"TreebotBotMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotBotMesh")))
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoRex/BioRexSteelMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(1, "There is no renderer with the name \"TreebotFlowerMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotFlowerMesh")))
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoRex/BioRexGlassMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = ThrowIfNull<Renderer>(2, "There is no renderer with the name \"TreebotLeafletMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotLeafletMesh")))
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Skins/SkinAsset/Vanilla/MadVeteran/NeoRex/BioRexPlantMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = true,
						renderer = ThrowIfNull<Renderer>(3, "There is no renderer with the name \"TreebotRootMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotRootMesh")))
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0010: 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)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cb: 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_012c: Unknown result type (might be due to invalid IL or missing references)
				//IL_012d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0136: Unknown result type (might be due to invalid IL or missing references)
				//IL_018e: Unknown result type (might be due to invalid IL or missing references)
				//IL_018f: Unknown result type (might be due to invalid IL or missing references)
				skinParams.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[4]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Rex\\Meshes\\BioBarklegsMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(0, "There is no renderer with the name \"TreebotBotMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotBotMesh")))
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Rex\\Meshes\\BioBotMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(1, "There is no renderer with the name \"TreebotFlowerMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotFlowerMesh")))
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Rex\\Meshes\\BioGlassBotMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(2, "There is no renderer with the name \"TreebotLeafletMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotLeafletMesh")))
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\MadVeteran_Rex\\Meshes\\BioplantMesh.mesh"),
						renderer = ThrowIfNull<Renderer>(3, "There is no renderer with the name \"TreebotRootMesh\"", ((IEnumerable<Renderer>)renderers).FirstOrDefault((Func<Renderer, bool>)((Renderer r) => ((Object)r).name == "TreebotRootMesh")))
					}
				};
			});
			TryCatchThrow("Light Infos", delegate
			{
				skinParams.lightReplacements = (LightInfo[])(object)new LightInfo[0];
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skinParams.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skinParams.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
		}
		catch (FieldException ex)
		{
			if (ex.InnerException is ElementException ex2)
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)$"Field causing issue: {ex.Message}, element: {ex2.Index}");
				InstanceLogger.LogWarning((object)ex2.Message);
				InstanceLogger.LogError((object)ex.InnerException);
			}
			else
			{
				InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
				InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message));
				InstanceLogger.LogError((object)ex.InnerException);
			}
		}
		catch (Exception ex3)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex3);
		}
	}

	private static T ThrowIfEquals<T>(int index, string message, T value, T expected) where T : Enum
	{
		if (value.Equals(expected))
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static T ThrowIfOutOfBounds<T>(int index, string message, T[] array, int elementIndex) where T : class
	{
		if (array == null || array.Length <= elementIndex)
		{
			throw new ElementException(index, message);
		}
		return array[elementIndex];
	}

	private static T ThrowIfNull<T>(int index, string message, T value) where T : class
	{
		if (value == null)
		{
			throw new ElementException(index, message);
		}
		return value;
	}

	private static void TryCatchThrow(string message, Action action)
	{
		try
		{
			action?.Invoke();
		}
		catch (Exception innerException)
		{
			throw new FieldException(message, innerException);
		}
	}

	private static void TryAddComponent<T>(GameObject obj) where T : Component
	{
		if (Object.op_Implicit((Object)(object)obj) && !Object.op_Implicit((Object)(object)obj.GetComponent<T>()))
		{
			obj.AddComponent<T>();
		}
	}

	private static GameObject GetChildGameObject(GameObject fromGameObject, string withName)
	{
		Transform[] componentsInChildren = fromGameObject.GetComponentsInChildren<Transform>();
		foreach (Transform val in componentsInChildren)
		{
			if (((Object)val).name.StartsWith(withName))
			{
				return ((Component)val).gameObject;
			}
		}
		return null;
	}
}