Decompiled source of REFURBISHED ROBOMANDO v1.2.3

ROBOMANDO_Skins.dll

Decompiled 2 months 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.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace ROBOMANDO_Skins;

[BepInPlugin("com.noodlegemo.ROBOMANDO_Skins", "ROBOMANDO_Skins", "1.0.0")]
public class ROBOMANDO_SkinsPlugin : BaseUnityPlugin
{
	private class FieldException : Exception
	{
		public FieldException(string message, Exception innerException)
			: base(message, innerException)
		{
		}
	}

	private static AssetBundle assetBundle;

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

	internal static ROBOMANDO_SkinsPlugin Instance { get; private set; }

	internal static ManualLogSource InstanceLogger
	{
		get
		{
			ROBOMANDO_SkinsPlugin instance = Instance;
			return (instance != null) ? ((BaseUnityPlugin)instance).Logger : null;
		}
	}

	private void Start()
	{
		Instance = this;
		using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ROBOMANDO_Skins.noodlegemorobomando_skins"))
		{
			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/Resources/BodyMat.mat", "Assets/Resources/GunMat.mat", "Assets/Resources/Monsoon/SecuredMat.mat", "Assets/Resources/Monsoon/StitchGun.mat", "Assets/Resources/MonsoonHidden/InfestedMat.mat");
	}

	private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		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("NOODLEGEMO_SKIN_ROBOMANDO_NAME", "Refurbished");
		self.SetStringByToken("NOODLEGEMO_SKIN_MONSOONROBO_NAME", "Secured");
		self.SetStringByToken("NOODLEGEMO_SKIN_INFESTEDROBO_NAME", "Infested");
	}

	private static void Nothing(Action<SkinDef> orig, SkinDef self)
	{
	}

	private static void BodyCatalogInit()
	{
		MethodInfo method = typeof(SkinDef).GetMethod("Awake", BindingFlags.Instance | BindingFlags.NonPublic);
		HookEndpointManager.Add((MethodBase)method, (Delegate)new Action<Action<SkinDef>, SkinDef>(Nothing));
		AddRobomandoBodyRobomandoSkin();
		AddRobomandoBodyMonsoonRoboSkin();
		AddRobomandoBodyInfestedRoboSkin();
		HookEndpointManager.Remove((MethodBase)method, (Delegate)new Action<Action<SkinDef>, SkinDef>(Nothing));
	}

	private static void AddRobomandoBodyRobomandoSkin()
	{
		//IL_0273: Unknown result type (might be due to invalid IL or missing references)
		string text = "RobomandoBody";
		string text2 = "Robomando";
		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);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\ROBOMANDO_Skins\\Icons\\RobomandoIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "NOODLEGEMO_SKIN_ROBOMANDO_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { skinController.skins[0] };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skin.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0097: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d6: 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_00fe: Unknown result type (might be due to invalid IL or missing references)
				//IL_013c: Unknown result type (might be due to invalid IL or missing references)
				//IL_013d: Unknown result type (might be due to invalid IL or missing references)
				skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[3]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/BodyMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "Guy")
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/GunMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlGun")
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/BodyMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlAntenna")
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0011: 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_005f: 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_00b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b6: 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_010c: Unknown result type (might be due to invalid IL or missing references)
				//IL_010d: Unknown result type (might be due to invalid IL or missing references)
				skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[3]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\ROBOMANDO_Skins\\Meshes\\Fella.mesh"),
						renderer = renderers.First((Renderer r) => ((Object)r).name == "Guy")
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\ROBOMANDO_Skins\\Meshes\\Gun.mesh"),
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlGun")
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\ROBOMANDO_Skins\\Meshes\\Antenna.mesh"),
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlAntenna")
					}
				};
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
			BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = skinController.skins;
		}
		catch (FieldException ex)
		{
			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 ex2)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex2);
		}
	}

	private static void AddRobomandoBodyMonsoonRoboSkin()
	{
		//IL_0273: Unknown result type (might be due to invalid IL or missing references)
		string text = "RobomandoBody";
		string text2 = "MonsoonRobo";
		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);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\ROBOMANDO_Skins\\Icons\\MonsoonRoboIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "NOODLEGEMO_SKIN_MONSOONROBO_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { skinController.skins[0] };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skin.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0097: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
				skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[2]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Monsoon/SecuredMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "Guy")
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Monsoon/StitchGun.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlGun")
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0011: 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_005f: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fe: 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)
				skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[3]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\ROBOMANDO_Skins\\Meshes\\Plushie.mesh"),
						renderer = renderers.First((Renderer r) => ((Object)r).name == "Guy")
					},
					new MeshReplacement
					{
						mesh = null,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlAntenna")
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\ROBOMANDO_Skins\\Meshes\\StitchGun.mesh"),
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlGun")
					}
				};
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
			BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = skinController.skins;
		}
		catch (FieldException ex)
		{
			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 ex2)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex2);
		}
	}

	private static void AddRobomandoBodyInfestedRoboSkin()
	{
		//IL_0273: Unknown result type (might be due to invalid IL or missing references)
		string text = "RobomandoBody";
		string text2 = "InfestedRobo";
		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);
			SkinDef skin = ScriptableObject.CreateInstance<SkinDef>();
			TryCatchThrow("Icon", delegate
			{
				skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\ROBOMANDO_Skins\\Icons\\InfestedRoboIcon.png");
			});
			((Object)skin).name = text2;
			skin.nameToken = "NOODLEGEMO_SKIN_INFESTEDROBO_NAME";
			skin.rootObject = gameObject;
			TryCatchThrow("Base Skins", delegate
			{
				skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { skinController.skins[0] };
			});
			TryCatchThrow("Unlockable Name", delegate
			{
				skin.unlockableDef = null;
			});
			TryCatchThrow("Game Object Activations", delegate
			{
				skin.gameObjectActivations = Array.Empty<GameObjectActivation>();
			});
			TryCatchThrow("Renderer Infos", delegate
			{
				//IL_0011: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0097: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
				skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[2]
				{
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/MonsoonHidden/InfestedMat.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "Guy")
					},
					new RendererInfo
					{
						defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Monsoon/StitchGun.mat"),
						defaultShadowCastingMode = (ShadowCastingMode)1,
						ignoreOverlays = false,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlGun")
					}
				};
			});
			TryCatchThrow("Mesh Replacements", delegate
			{
				//IL_0011: 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_005f: 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_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fe: 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)
				skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[3]
				{
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\ROBOMANDO_Skins\\Meshes\\Infested.mesh"),
						renderer = renderers.First((Renderer r) => ((Object)r).name == "Guy")
					},
					new MeshReplacement
					{
						mesh = null,
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlAntenna")
					},
					new MeshReplacement
					{
						mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\ROBOMANDO_Skins\\Meshes\\StitchGun.mesh"),
						renderer = renderers.First((Renderer r) => ((Object)r).name == "mdlGun")
					}
				};
			});
			TryCatchThrow("Minion Skin Replacements", delegate
			{
				skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>();
			});
			TryCatchThrow("Projectile Ghost Replacements", delegate
			{
				skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>();
			});
			Array.Resize(ref skinController.skins, skinController.skins.Length + 1);
			skinController.skins[skinController.skins.Length - 1] = skin;
			BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = skinController.skins;
		}
		catch (FieldException ex)
		{
			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 ex2)
		{
			InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\""));
			InstanceLogger.LogError((object)ex2);
		}
	}

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

RefurbishedRoboMando.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HG.Reflection;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MonoMod.RuntimeDetour;
using R2API;
using RoR2;
using RobomandoMod.Survivors.Robomando;
using RobomandoMod.Survivors.Robomando.SkillStates;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RefurbishedRoboMando")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+5045d29026917eb41afc25ab811ec6bfb09c646c")]
[assembly: AssemblyProduct("RefurbishedRoboMando")]
[assembly: AssemblyTitle("RefurbishedRoboMando")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace RefurbishedRoboMando
{
	public static class ColorCode
	{
		public enum FontColor
		{
			cStack,
			cIsDamage,
			cIsHealth,
			cIsUtility,
			cIsHealing,
			cDeath,
			cSub,
			cKeywordName,
			cIsVoid
		}

		public static string Style(this string self, FontColor style)
		{
			return "<style=" + style.ToString() + ">" + self + "</style>";
		}
	}
	public static class RefurbishConfigEntry
	{
		public static ConfigEntry<bool> Replace_Icon;

		public static ConfigEntry<Configs.IconDirection> Icon_Direction;

		public static ConfigEntry<Configs.SkinOrder> Skin_Order;

		public static ConfigEntry<bool> Disable_Skins;

		public static ConfigEntry<bool> Replace_Tokens;

		public static ConfigEntry<bool> Replace_Logbook_Model;

		public static ConfigEntry<bool> Replace_Logbook_Lore;

		public static ConfigEntry<bool> Replace_Skill_Stats;

		public static ConfigEntry<bool> Replace_Body_Stats;

		public static ConfigEntry<int> Health_Convert;

		public static ConfigEntry<bool> Jury_Rework;
	}
	public static class PresetSkillStats
	{
		public static float Shoot_Damage = 75f;

		public static float Shoot_Coefficient = 1f;

		public static float Zap_Damage = 220f;

		public static float Zap_Coefficient = 2f;

		public static float Zap_Cooldown = 3f;

		public static float Dive_Splat_Duration = 0.5f;

		public static float Dive_Cooldown = 4f;

		public static float Hack_Duration = 3f;

		public static float Hack_Cooldown = 5f;

		public static float Hack_NoTarget_Cooldown = 0.5f;
	}
	public class Configs
	{
		public enum IconDirection
		{
			LEFT,
			RIGHT
		}

		public enum SkinOrder
		{
			FIRST,
			LAST
		}

		public Configs()
		{
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			string text = "Icon";
			RefurbishConfigEntry.Replace_Icon = AssetStatics.plugin.Config.Bind<bool>(text, "Enable Replacement", true, "[ True = Replace | False = Original ]\nChanges ROBOMANDO's icon");
			RefurbishConfigEntry.Icon_Direction = AssetStatics.plugin.Config.Bind<IconDirection>(text, "Icon Direction", IconDirection.LEFT, "[ Left = Risk of Rain Returns | Right = Normal ]\nChanges ROBOMANDO's icon direction");
			string text2 = "Skins";
			RefurbishConfigEntry.Skin_Order = AssetStatics.plugin.Config.Bind<SkinOrder>(text2, "Enable Replacement", SkinOrder.FIRST, "[ First = Modded Skins First | Last = Modded Skins Last ]\nChanges REFURBISHED skin order");
			RefurbishConfigEntry.Disable_Skins = AssetStatics.plugin.Config.Bind<bool>(text2, "Disable Other Skins", false, "[ True = Disables | False = Keeps ]\nToggles non Refurbished ROBOMANDO skins");
			string text3 = "Logbook";
			RefurbishConfigEntry.Replace_Logbook_Model = AssetStatics.plugin.Config.Bind<bool>(text3, "Enable Model Replacement", true, "[ True = Replace | False = Original ]\nChanges ROBOMANDO's Logbook model");
			RefurbishConfigEntry.Replace_Logbook_Lore = AssetStatics.plugin.Config.Bind<bool>(text3, "Enable Lore Replacement", true, "[ True = Replace | False = Original ]\nChanges ROBOMANDO's Logbook lore");
			string text4 = "Rewrites";
			RefurbishConfigEntry.Replace_Tokens = AssetStatics.plugin.Config.Bind<bool>(text4, "Enable Rewrite", true, "[ True = Rewrite | False = Original ]\nChanges ROBOMANDO's rewrite text");
			string text5 = "Stats";
			RefurbishConfigEntry.Replace_Skill_Stats = AssetStatics.plugin.Config.Bind<bool>(text5, "Enable Skill Stat Replacement", true, "[ True = Replace | False = Original ]\nChanges ROBOMANDO's skill stats to be closer to Risk of Rain Returns");
			RefurbishConfigEntry.Replace_Body_Stats = AssetStatics.plugin.Config.Bind<bool>(text5, "Enable Body Stat Replacement", true, "[ True = Replace | False = Original ]\nChanges ROBOMANDO's body stats to be closer to Risk of Rain Returns");
			RefurbishConfigEntry.Health_Convert = AssetStatics.plugin.Config.Bind<int>(text5, "Health to Shield Conversion", 0, new ConfigDescription("[ 0.0 = 0% Conversion ]\nBase health to shield percent", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			string text6 = "Reworks";
			RefurbishConfigEntry.Jury_Rework = AssetStatics.plugin.Config.Bind<bool>(text6, "Re-Wire - Jury Rework", true, "[ True = Rework | False = Original ]\nChanges Jury into Sabotage, taking the actual item from a Printer");
		}
	}
	public class HiddenSkin
	{
		public HiddenSkin()
		{
			LanguageAPI.Add("SECURED_TRANSFORM_2P", "... You've fallen to the influence of the Void.".Style(ColorCode.FontColor.cIsVoid));
			LanguageAPI.Add("SECURED_TRANSFORM", "... {0} has fallen to the influence of the Void.".Style(ColorCode.FontColor.cIsVoid));
			CharacterBody.onBodyInventoryChangedGlobal += ChangeSkin;
		}

		private static void ChangeSkin(CharacterBody self)
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: 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_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Expected O, but got Unknown
			if (!NetworkServer.active || !Object.op_Implicit((Object)(object)self.inventory))
			{
				return;
			}
			ModelLocator component = ((Component)self).GetComponent<ModelLocator>();
			ReplaceCurrentSkin replaceCurrentSkin = (Object.op_Implicit((Object)(object)component) ? ((Component)component.modelTransform).gameObject.GetComponent<ReplaceCurrentSkin>() : null);
			if (!Object.op_Implicit((Object)(object)replaceCurrentSkin))
			{
				return;
			}
			int itemCount = self.inventory.GetItemCount(Items.BearVoid);
			SkinDef val = BodyCatalog.GetBodySkins(self.bodyIndex)[self.skinIndex];
			if (val.nameToken.Equals(AssetStatics.skinTokens[1]) && itemCount > 0)
			{
				replaceCurrentSkin.ChangeSkin(AssetStatics.skinTokens[2]);
				if (!replaceCurrentSkin.infested)
				{
					replaceCurrentSkin.infested = true;
					Chat.SendBroadcastChat((ChatMessageBase)new SubjectFormatChatMessage
					{
						subjectAsCharacterBody = self,
						baseToken = "SECURED_TRANSFORM"
					});
				}
			}
			else if (val.nameToken.Equals(AssetStatics.skinTokens[1]) && itemCount <= 0)
			{
				replaceCurrentSkin.infested = false;
				replaceCurrentSkin.ChangeSkin(AssetStatics.skinTokens[1]);
			}
		}
	}
	public class JuryRework
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Manipulator <0>__StealItem;
		}

		public JuryRework()
		{
			//IL_0196: 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_0190: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Expected O, but got Unknown
			LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "KEYWORD_JURY_RIG", "Sabotage".Style(ColorCode.FontColor.cKeywordName) + "Used on a Printer will ".Style(ColorCode.FontColor.cSub) + "activate it for free".Style(ColorCode.FontColor.cIsUtility) + ", but ".Style(ColorCode.FontColor.cSub) + "break it".Style(ColorCode.FontColor.cIsHealth) + ". Costs ".Style(ColorCode.FontColor.cSub) + "X% ".Style(ColorCode.FontColor.cIsHealth) + "(".Style(ColorCode.FontColor.cSub) + "50%" + "/".Style(ColorCode.FontColor.cSub) + "75%".Style(ColorCode.FontColor.cIsHealing) + "/" + "90%".Style(ColorCode.FontColor.cIsHealth) + "/" + "95%".Style(ColorCode.FontColor.cIsDamage) + ") ".Style(ColorCode.FontColor.cSub) + "of your current health".Style(ColorCode.FontColor.cIsHealth) + ".".Style(ColorCode.FontColor.cSub));
			if (!RefurbishConfigEntry.Replace_Tokens.Value)
			{
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "SPECIAL_HACK_DESCRIPTION", "Jury-Rig".Style(ColorCode.FontColor.cIsUtility) + ". Re-wire a nearby mechanical object, " + "activating it for free".Style(ColorCode.FontColor.cIsUtility) + ".");
			}
			MethodInfo? method = typeof(Hack).GetMethod("HackDevice");
			object obj = <>O.<0>__StealItem;
			if (obj == null)
			{
				Manipulator val = StealItem;
				<>O.<0>__StealItem = val;
				obj = (object)val;
			}
			new ILHook((MethodBase)method, (Manipulator)obj);
		}

		private static void StealItem(ILContext il)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			int pickupIndex = -1;
			int num9 = default(int);
			int num8 = default(int);
			int num7 = default(int);
			int num6 = default(int);
			ILLabel[] array2 = default(ILLabel[]);
			if (!val.TryGotoNext(new Func<Instruction, bool>[7]
			{
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref pickupIndex),
				(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 2),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref num9),
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num8),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref num7),
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num6),
				(Instruction x) => ILPatternMatchingExt.MatchSwitch(x, ref array2)
			}))
			{
				Log.Warning("Failed to hook item index");
			}
			int num5 = default(int);
			int num4 = default(int);
			int num3 = default(int);
			int num2 = default(int);
			ILLabel[] array = default(ILLabel[]);
			if (val.TryGotoNext(new Func<Instruction, bool>[6]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 2),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref num5),
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num4),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref num3),
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref num2),
				(Instruction x) => ILPatternMatchingExt.MatchSwitch(x, ref array)
			}))
			{
				val.Emit(OpCodes.Ldloc, pickupIndex);
				val.Emit(OpCodes.Ldarg, 0);
				val.Emit(OpCodes.Ldarg, 1);
				val.Emit(OpCodes.Ldarg, 2);
				val.EmitDelegate<Func<PickupIndex, GameObject, GameObject, PrinterItemType, PickupIndex>>((Func<PickupIndex, GameObject, GameObject, PrinterItemType, PickupIndex>)delegate(PickupIndex self, GameObject robo, GameObject interact, PrinterItemType type)
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					//IL_0006: Unknown result type (might be due to invalid IL or missing references)
					//IL_0007: Unknown result type (might be due to invalid IL or missing references)
					//IL_000a: Invalid comparison between Unknown and I4
					//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_0023: Unknown result type (might be due to invalid IL or missing references)
					//IL_0028: Unknown result type (might be due to invalid IL or missing references)
					//IL_0029: Unknown result type (might be due to invalid IL or missing references)
					//IL_002e: Unknown result type (might be due to invalid IL or missing references)
					//IL_0030: Unknown result type (might be due to invalid IL or missing references)
					//IL_0035: Unknown result type (might be due to invalid IL or missing references)
					//IL_003a: Unknown result type (might be due to invalid IL or missing references)
					//IL_0047: Expected O, but got Unknown
					//IL_0047: Unknown result type (might be due to invalid IL or missing references)
					//IL_004a: Invalid comparison between Unknown and I4
					//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
					//IL_0065: Unknown result type (might be due to invalid IL or missing references)
					//IL_0068: Invalid comparison between Unknown and I4
					//IL_0083: Unknown result type (might be due to invalid IL or missing references)
					//IL_0086: Invalid comparison between Unknown and I4
					//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
					//IL_00a4: Invalid comparison between Unknown and I4
					PickupIndex result = PickupIndex.none;
					if ((int)type > 0)
					{
						HealthComponent component = robo.GetComponent<HealthComponent>();
						ShopTerminalBehavior component2 = interact.GetComponent<ShopTerminalBehavior>();
						result = component2.pickupIndex;
						DamageInfo val3 = new DamageInfo
						{
							damageType = DamageTypeCombo.op_Implicit((DamageType)3),
							procCoefficient = 0f
						};
						if ((int)type == 1)
						{
							val3.damage = component.fullCombinedHealth * 0.5f;
						}
						if ((int)type == 2)
						{
							val3.damage = component.fullCombinedHealth * 0.75f;
						}
						if ((int)type == 3)
						{
							val3.damage = component.fullCombinedHealth * 0.9f;
						}
						if ((int)type == 4)
						{
							val3.damage = component.fullCombinedHealth * 0.95f;
						}
						component.TakeDamage(val3);
					}
					return result;
				});
				val.Emit(OpCodes.Stloc, pickupIndex);
				int index = val.Index;
				int num = default(int);
				if (val.TryGotoNext(new Func<Instruction, bool>[2]
				{
					(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Vector3>(x, "get_zero"),
					(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref num)
				}))
				{
					ILLabel val2 = val.MarkLabel();
					val.Goto(index, (MoveType)0, false);
					val.Emit(OpCodes.Br, val2.Target);
				}
			}
			else
			{
				Log.Warning("Failed to hook scrap replacement");
			}
		}
	}
	internal static class Log
	{
		private static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void Debug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void Error(object data)
		{
			_logSource.LogError(data);
		}

		internal static void Fatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void Info(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void Message(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void Warning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("noodlegemo.ROBOMANDO_Refurbished", "ROBOMANDO_Refurbished", "1.2.3")]
	public class RefurbishedRoboMando : BaseUnityPlugin
	{
		public const string PluginGUID = "noodlegemo.ROBOMANDO_Refurbished";

		public const string PluginAuthor = "noodlegemo";

		public const string PluginName = "ROBOMANDO_Refurbished";

		public const string PluginVersion = "1.2.3";

		public void Awake()
		{
			Log.Init(((BaseUnityPlugin)this).Logger);
			new AssetStatics((BaseUnityPlugin)(object)this);
			new Configs();
			((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)SetUpOnBodyLoad);
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(SetUpLast));
		}

		private static void SetUpOnBodyLoad()
		{
			if (Object.op_Implicit((Object)(object)AssetStatics.bodyComponent))
			{
				if (RefurbishConfigEntry.Icon_Direction.Value == Configs.IconDirection.LEFT)
				{
					AssetStatics.bodyComponent.portraitIcon = (Texture)(object)AssetStatics.bundle.LoadAsset<Sprite>("RobomandoIcon").texture;
				}
				else
				{
					AssetStatics.bodyComponent.portraitIcon = (Texture)(object)AssetStatics.bundle.LoadAsset<Sprite>("RobomandoIconAlt").texture;
				}
			}
		}

		private static void SetUpLast()
		{
			SkinOrder();
			new HiddenSkin();
			if (AssetStatics.modSkins != null)
			{
				SkinDef val = AssetStatics.modSkins.Find((SkinDef self) => self.nameToken.Equals(AssetStatics.skinTokens[1]));
				val.unlockableDef = RobomandoUnlockables.masterySkinUnlockableDef;
			}
			if (RefurbishConfigEntry.Replace_Logbook_Model.Value)
			{
				GameObject gameObject = ((Component)AssetStatics.bodyPrefab.GetComponent<ModelLocator>().modelTransform).gameObject;
				gameObject.AddComponent<ReplaceCurrentSkin>();
			}
			if (RefurbishConfigEntry.Replace_Logbook_Lore.Value)
			{
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "LORE", "Order: ROBOMANDO Model-7\r\nTracking Number: 45133554F44495351454" + "\r\n\r\nT  H  A  N  K    Y  O  U    F  O  R    P  U  R  C  H  A  S  I  N  G    T  H  I  S    R  O  B  O  M  A  N  D  O    M  O  D  E  L   -  7  .".Style(ColorCode.FontColor.cStack) + "\r\nI  N  S  T  R  U  C  T  I  O  N  S    A  R  E    I  N  C  L  U  D  E  D     I  N    A    S  E  P  E  R  A  T  E    P  A  C  K  A  G  E  .".Style(ColorCode.FontColor.cStack) + "\r\n\r\n... Damn.");
			}
			if (RefurbishConfigEntry.Replace_Tokens.Value)
			{
				if (!RefurbishConfigEntry.Replace_Skill_Stats.Value)
				{
					PresetSkillStats.Shoot_Damage = 100f * RobomandoStaticValues.shootDamageCoefficient;
					PresetSkillStats.Zap_Damage = 100f * RobomandoStaticValues.zapDamageCoefficient;
				}
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "NAME", "ROBOMANDO");
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "DESCRIPTION", "Your ROBOMANDO Model-7 comes equipped with everything it needs to extract resources from hostile environments.<color=#CCD3E0>\n\n< ! > As weak as Single Fire is, it has no fall-off damage.\n\n< ! > Despite the short range on De-Escalate, you can utilize it to pierce through multiple enemies at once, stunning them all in series.\n\n< ! > Re-Wire allows instant access to any company sanctioned containers or drone utilities - make up your lack of strength and durability through stealing everything!\n\n< ! > Remember that ROBOMANDO's skills aren't the most effective against enemies - use your increased movement speed to maintain distance accordingly.");
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "PRIMARY_SHOT_DESCRIPTION", string.Format("Agile".Style(ColorCode.FontColor.cIsUtility) + ". Shoot once for " + "{0}% damage".Style(ColorCode.FontColor.cIsDamage) + ".", PresetSkillStats.Shoot_Damage));
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "SECONDARY_ZAP_DESCRIPTION", string.Format("Agile".Style(ColorCode.FontColor.cIsUtility) + ". " + "Stunning".Style(ColorCode.FontColor.cIsDamage) + ". Fire a small electrical charge that " + "pierces enemies ".Style(ColorCode.FontColor.cIsDamage) + "for " + "{0}% damage".Style(ColorCode.FontColor.cIsDamage) + ".", PresetSkillStats.Zap_Damage));
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "UTILITY_ROLL_DESCRIPTION", "Attempt to " + "dive forward ".Style(ColorCode.FontColor.cIsUtility) + "a small distance. You " + "cannot be hit ".Style(ColorCode.FontColor.cIsUtility) + "early in the maneuver.");
				string arg = (RefurbishConfigEntry.Jury_Rework.Value ? "Sabotage" : "Jury-Rig");
				LanguageAPI.AddOverlay(AssetStatics.tokenPrefix + "SPECIAL_HACK_DESCRIPTION", string.Format("{0}".Style(ColorCode.FontColor.cIsUtility) + ". Re-wire a mechanical object, " + "activating it for free".Style(ColorCode.FontColor.cIsUtility) + ".", arg));
				SkillLocator val2 = (Object.op_Implicit((Object)(object)AssetStatics.bodyPrefab) ? AssetStatics.bodyPrefab.GetComponent<SkillLocator>() : null);
				if (!Object.op_Implicit((Object)(object)val2))
				{
					return;
				}
				val2.primary.skillFamily.defaultSkillDef.keywordTokens = new string[1] { "KEYWORD_AGILE" };
				val2.secondary.skillFamily.defaultSkillDef.keywordTokens = new string[2] { "KEYWORD_AGILE", "KEYWORD_STUNNING" };
			}
			if (RefurbishConfigEntry.Replace_Skill_Stats.Value)
			{
				StatChanges();
			}
			if (RefurbishConfigEntry.Replace_Body_Stats.Value)
			{
				BodyChanges();
			}
			if (RefurbishConfigEntry.Jury_Rework.Value)
			{
				new JuryRework();
			}
		}

		private static void SkinOrder()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Expected I4, but got Unknown
			//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Expected I4, but got Unknown
			if (!Object.op_Implicit((Object)(object)AssetStatics.bodyComponent))
			{
				return;
			}
			List<SkinDef> list = new List<SkinDef>();
			List<SkinDef> list2 = new List<SkinDef>();
			List<SkinDef> list3 = new List<SkinDef>();
			List<SkinDef> list4 = new List<SkinDef>();
			SkinDef[] bodySkins = BodyCatalog.GetBodySkins(AssetStatics.bodyComponent.bodyIndex);
			foreach (SkinDef val in bodySkins)
			{
				if (!Object.op_Implicit((Object)(object)val))
				{
					continue;
				}
				if (RefurbishConfigEntry.Disable_Skins.Value)
				{
					bool flag = false;
					foreach (string item in AssetStatics.skinPrefixBlacklist)
					{
						if (val.nameToken.StartsWith(item, StringComparison.OrdinalIgnoreCase))
						{
							flag = true;
							break;
						}
					}
					if (flag)
					{
						continue;
					}
				}
				if (AssetStatics.hiddenTokens.Contains(val.nameToken))
				{
					list2.Add(val);
				}
				else if (AssetStatics.skinTokens.Contains(val.nameToken))
				{
					list.Add(val);
				}
				else
				{
					list3.Add(val);
				}
			}
			if (RefurbishConfigEntry.Skin_Order.Value == Configs.SkinOrder.FIRST)
			{
				list4.AddRange(list);
				list4.AddRange(list3);
			}
			else
			{
				list4.AddRange(list3);
				list4.AddRange(list);
			}
			SkinDef[][] skins = BodyCatalog.skins;
			int num = (int)AssetStatics.bodyComponent.bodyIndex;
			List<SkinDef> list5 = list4;
			int num2 = 0;
			SkinDef[] array = (SkinDef[])(object)new SkinDef[list5.Count];
			foreach (SkinDef item2 in list5)
			{
				array[num2] = item2;
				num2++;
			}
			skins[num] = array;
			SkinDef[][] skinsByBody = SkinCatalog.skinsByBody;
			int num3 = (int)AssetStatics.bodyComponent.bodyIndex;
			List<SkinDef> list6 = list4;
			int num4 = 0;
			SkinDef[] array2 = (SkinDef[])(object)new SkinDef[list6.Count];
			foreach (SkinDef item3 in list6)
			{
				array2[num4] = item3;
				num4++;
			}
			skinsByBody[num3] = array2;
			list4.AddRange(list2);
			ModelLocator component = AssetStatics.bodyPrefab.GetComponent<ModelLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			Log.Debug("Has model locator");
			ModelSkinController component2 = ((Component)component.modelTransform).gameObject.GetComponent<ModelSkinController>();
			if (!Object.op_Implicit((Object)(object)component2))
			{
				return;
			}
			ModelSkinController val2 = component2;
			List<SkinDef> list7 = list4;
			int num5 = 0;
			SkinDef[] array3 = (SkinDef[])(object)new SkinDef[list7.Count];
			foreach (SkinDef item4 in list7)
			{
				array3[num5] = item4;
				num5++;
			}
			val2.skins = array3;
		}

		private static void StatChanges()
		{
			SkillLocator val = (Object.op_Implicit((Object)(object)AssetStatics.bodyPrefab) ? AssetStatics.bodyPrefab.GetComponent<SkillLocator>() : null);
			if (Object.op_Implicit((Object)(object)val))
			{
				RobomandoStaticValues.shootDamageCoefficient = PresetSkillStats.Shoot_Damage / 100f;
				RobomandoStaticValues.shootProcCoefficient = PresetSkillStats.Shoot_Coefficient;
				RobomandoStaticValues.zapDamageCoefficient = PresetSkillStats.Zap_Damage / 100f;
				RobomandoStaticValues.zapProcCoefficient = PresetSkillStats.Zap_Coefficient;
				RobomandoStaticValues.zapCooldown = PresetSkillStats.Zap_Cooldown;
				RobomandoStaticValues.diveCrashTime = PresetSkillStats.Dive_Splat_Duration;
				RobomandoStaticValues.diveCooldown = PresetSkillStats.Dive_Cooldown;
				RobomandoStaticValues.hackTime = PresetSkillStats.Hack_Duration;
				RobomandoStaticValues.successfullHackCooldown = PresetSkillStats.Hack_Cooldown;
				RobomandoStaticValues.unsuccessfullHackCooldown = PresetSkillStats.Hack_NoTarget_Cooldown;
				val.special.skillFamily.defaultSkillDef.baseRechargeInterval = PresetSkillStats.Hack_Cooldown;
			}
		}

		private static void BodyChanges()
		{
			if (Object.op_Implicit((Object)(object)AssetStatics.bodyComponent))
			{
				float num = (float)RefurbishConfigEntry.Health_Convert.Value / 100f;
				AssetStatics.bodyComponent.baseMaxHealth = Math.Max(80f * (1f - num), 1f);
				AssetStatics.bodyComponent.levelMaxHealth = 28f * (1f - num);
				AssetStatics.bodyComponent.baseMaxShield = Math.Min(80f * num, 79f);
				AssetStatics.bodyComponent.levelMaxShield = 28f * num;
				AssetStatics.bodyComponent.baseRegen = 3f;
				AssetStatics.bodyComponent.levelRegen = 0.3f;
				AssetStatics.bodyComponent.baseDamage = 15f;
				AssetStatics.bodyComponent.levelDamage = 3.2f;
				AssetStatics.bodyComponent.baseArmor = 0f;
				AssetStatics.bodyComponent.baseMoveSpeed = 9f;
			}
		}
	}
	public class ReplaceCurrentSkin : MonoBehaviour
	{
		private readonly Random random = new Random();

		private ModelSkinController component;

		private CharacterBody body;

		public bool infested;

		private void Awake()
		{
			component = ((Component)this).GetComponent<ModelSkinController>();
			body = component.characterModel.body;
		}

		private void Start()
		{
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)component))
			{
				return;
			}
			if (SceneCatalog.currentSceneDef.cachedName == "logbook")
			{
				int index = (Util.CheckRoll(7.5f, 0f, (CharacterMaster)null) ? random.Next(1, AssetStatics.skinTokens.Count - 1) : 0);
				ChangeSkin(AssetStatics.skinTokens[index]);
			}
			if (!Object.op_Implicit((Object)(object)body))
			{
				return;
			}
			SkinDef val = BodyCatalog.GetBodySkins(body.bodyIndex)[body.skinIndex];
			if (val.nameToken.Equals(AssetStatics.skinTokens[1]))
			{
				SetInfestedBool();
				if (infested)
				{
					ChangeSkin(AssetStatics.skinTokens[2]);
				}
			}
		}

		public void ChangeSkin(string skinToken)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			SkinDef[] bodySkins = BodyCatalog.GetBodySkins(AssetStatics.bodyComponent.bodyIndex);
			foreach (SkinDef val in bodySkins)
			{
				if (Object.op_Implicit((Object)(object)val))
				{
					if (val.nameToken.Equals(skinToken))
					{
						break;
					}
					num++;
				}
			}
			component.ApplySkin(num);
		}

		private void SetInfestedBool()
		{
			CharacterBody val = component.characterModel.body;
			int num = (Object.op_Implicit((Object)(object)val.inventory) ? val.inventory.GetItemCount(Items.BearVoid) : 0);
			if (num > 0)
			{
				infested = true;
			}
		}
	}
	public class AssetStatics
	{
		public static readonly string bodyInternal = "RobomandoBody";

		public static readonly string tokenPrefix = "RAT_ROBOMANDO_";

		public static BaseUnityPlugin plugin;

		public static CharacterBody bodyComponent;

		public static GameObject bodyPrefab;

		public static AssetBundle bundle;

		public static List<SkinDef> modSkins;

		public static readonly List<string> skinPrefixBlacklist = new List<string>(2) { "RAT_", "DEFAULT_SKIN" };

		public static readonly List<string> skinTokens = new List<string>(3) { "NOODLEGEMO_SKIN_ROBOMANDO_NAME", "NOODLEGEMO_SKIN_MONSOONROBO_NAME", "NOODLEGEMO_SKIN_INFESTEDROBO_NAME" };

		public static readonly List<string> hiddenTokens = new List<string>(1) { "NOODLEGEMO_SKIN_INFESTEDROBO_NAME" };

		public AssetStatics(BaseUnityPlugin plugin)
		{
			AssetStatics.plugin = plugin;
			((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)SetUpOnBodyLoad);
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(SetUpLast));
			bundle = AssetBundle.LoadFromFile(Path.Combine(Directory.GetParent(plugin.Info.Location).ToString(), "robomandoasset"));
		}

		private static void SetUpOnBodyLoad()
		{
			bodyPrefab = BodyCatalog.FindBodyPrefab(bodyInternal);
			bodyComponent = (Object.op_Implicit((Object)(object)bodyPrefab) ? bodyPrefab.GetComponent<CharacterBody>() : null);
		}

		private static void SetUpLast()
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)bodyComponent))
			{
				return;
			}
			modSkins = new List<SkinDef>();
			SkinDef[] bodySkins = BodyCatalog.GetBodySkins(bodyComponent.bodyIndex);
			foreach (SkinDef val in bodySkins)
			{
				if (Object.op_Implicit((Object)(object)val) && skinTokens.Contains(val.nameToken))
				{
					modSkins.Add(val);
				}
			}
		}
	}
}