Decompiled source of ContentDisabler v1.3.3

plugins/ContentDisabler/ContentDisabler.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using IL.RoR2;
using Mono.Cecil;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using On.RoR2.Skills;
using On.RoR2.UI.LogBook;
using RoR2;
using RoR2.ContentManagement;
using RoR2.ExpansionManagement;
using RoR2.Skills;
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: AssemblyCompany("ContentDisabler")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ContentDisabler")]
[assembly: AssemblyTitle("ContentDisabler")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace TPDespair.ContentDisabler;

[BepInPlugin("com.TPDespair.ContentDisabler", "ContentDisabler", "1.3.3")]
public class ContentDisablerPlugin : BaseUnityPlugin
{
	[CompilerGenerated]
	private sealed class <BodyCatalogInit>d__55 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public orig_Init orig;

		private GameObject[] <>s__1;

		private int <>s__2;

		private GameObject <gameObject>5__3;

		private CharacterBody <charBody>5__4;

		private string <name>5__5;

		private ConfigEntry<bool> <configEntry>5__6;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <BodyCatalogInit>d__55(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>s__1 = null;
			<gameObject>5__3 = null;
			<charBody>5__4 = null;
			<name>5__5 = null;
			<configEntry>5__6 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<>s__1 = ContentManager.bodyPrefabs;
				for (<>s__2 = 0; <>s__2 < <>s__1.Length; <>s__2++)
				{
					<gameObject>5__3 = <>s__1[<>s__2];
					<charBody>5__4 = <gameObject>5__3.GetComponent<CharacterBody>();
					if (Object.op_Implicit((Object)(object)<charBody>5__4))
					{
						<name>5__5 = ((Object)<charBody>5__4).name;
						if (<name>5__5 == "")
						{
							<name>5__5 = <charBody>5__4.baseNameToken;
						}
						if (<name>5__5 == "")
						{
							<name>5__5 = "UnknownBody";
						}
						<configEntry>5__6 = ConfigEntry("Body", <name>5__5, defaultValue: false, "Disable Body : " + <name>5__5);
						if (<configEntry>5__6.Value)
						{
							if (!DisabledBodies.Contains(<name>5__5))
							{
								DisabledBodies.Add(<name>5__5);
							}
							LogWarn("Disabled Body : " + <name>5__5);
						}
						<name>5__5 = null;
						<configEntry>5__6 = null;
					}
					<charBody>5__4 = null;
					<gameObject>5__3 = null;
				}
				<>s__1 = null;
				<>2__current = orig.Invoke();
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				return false;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	public const string ModVer = "1.3.3";

	public const string ModName = "ContentDisabler";

	public const string ModGuid = "com.TPDespair.ContentDisabler";

	public static ConfigFile configFile;

	public static ManualLogSource logSource;

	public static ConfigEntry<bool> ConfigItem;

	public static ConfigEntry<bool> ConfigEquipment;

	public static ConfigEntry<bool> ConfigArtifact;

	public static ConfigEntry<bool> ConfigDifficulty;

	public static ConfigEntry<bool> ConfigSurvivor;

	public static ConfigEntry<bool> ConfigSkill;

	public static ConfigEntry<bool> ConfigSkin;

	public static ConfigEntry<bool> ConfigBody;

	public static ConfigEntry<bool> ConfigSpawnCard;

	public static Dictionary<string, int> ConfigKeys = new Dictionary<string, int>();

	public static List<ArtifactDef> DisabledArtifacts = new List<ArtifactDef>();

	public static List<SurvivorDef> DisabledSurvivors = new List<SurvivorDef>();

	public static Dictionary<string, ConfigEntry<bool>> SkillConfigs = new Dictionary<string, ConfigEntry<bool>>();

	public static List<string> InvalidSkillStateNames = new List<string>();

	public static List<string> DisabledBodies = new List<string>();

	public static Dictionary<SpawnCard, string> SpawnCardBodyNames = new Dictionary<SpawnCard, string>();

	public static Dictionary<SpawnCard, ConfigEntry<bool>> SpawnCardConfigs = new Dictionary<SpawnCard, ConfigEntry<bool>>();

	private static readonly char[] InvalidConfigChars = new char[8] { '=', '\n', '\t', '\\', '"', '\'', '[', ']' };

	public static ConfigEntry<bool> SkillFamilySafeguard { get; set; }

	public static ConfigEntry<bool> ScanConfigSectionsStartup { get; set; }

	public static ConfigEntry<bool> ScanConfigSectionsFinalize { get; set; }

	public void Awake()
	{
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Expected O, but got Unknown
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Expected O, but got Unknown
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Expected O, but got Unknown
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fc: Expected O, but got Unknown
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Expected O, but got Unknown
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Expected O, but got Unknown
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0144: Expected O, but got Unknown
		//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ba: Expected O, but got Unknown
		//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cc: Expected O, but got Unknown
		//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f0: Expected O, but got Unknown
		//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0202: Expected O, but got Unknown
		//IL_021c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0226: Expected O, but got Unknown
		//IL_022e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0238: Expected O, but got Unknown
		configFile = ((BaseUnityPlugin)this).Config;
		logSource = ((BaseUnityPlugin)this).Logger;
		GlobalConfig();
		if (ScanConfigSectionsStartup.Value)
		{
			ConfigStartup();
		}
		if (ConfigArtifact.Value || ConfigDifficulty.Value)
		{
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(ExcludeRuleChoices));
		}
		if (ConfigItem.Value)
		{
			ItemCatalog.Init += new hook_Init(ItemCatalogInit);
		}
		if (ConfigEquipment.Value)
		{
			EquipmentCatalog.Init += new hook_Init(EquipmentCatalogInit);
		}
		if (ConfigArtifact.Value)
		{
			ArtifactCatalog.Init += new hook_Init(ArtifactCatalogInit);
		}
		if (ConfigSurvivor.Value)
		{
			SurvivorCatalog.Init += new hook_Init(SurvivorCatalogInit);
			LogBookController.CanSelectSurvivorBodyEntry += new hook_CanSelectSurvivorBodyEntry(LogBookControllerCanSelectSurvivorBodyEntry);
			CharacterMaster.PickRandomSurvivorBodyPrefab += new Manipulator(CharacterMasterPickRandomSurvivorBodyPrefabHook);
		}
		if (ConfigSkill.Value)
		{
			SkillCatalog.Init += new hook_Init(SkillCatalogInit);
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(SkillStrip2));
		}
		if (ConfigSkin.Value)
		{
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(RemoveSkins));
		}
		if (ConfigBody.Value)
		{
			BodyCatalog.Init += new hook_Init(BodyCatalogInit);
			LogBookController.CanSelectMonsterEntry += new hook_CanSelectMonsterEntry(LogBookControllerCanSelectMonsterEntry);
		}
		if (ConfigSpawnCard.Value)
		{
			ClassicStageInfo.RebuildCards += new hook_RebuildCards(ClassicStageInfoRebuildCards);
			ClassicStageInfo.RebuildCards += new Manipulator(ClassicStageInfoRebuildCardsHook);
			SceneDirector.onGenerateInteractableCardSelection += GatherInteractableCards;
			SceneDirector.GenerateInteractableCardSelection += new hook_GenerateInteractableCardSelection(SceneDirectorGenerateInteractableCardSelection);
			DirectorCard.IsAvailable += new hook_IsAvailable(DirectorCardIsAvailable);
		}
		if (ScanConfigSectionsFinalize.Value)
		{
			RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(ConfigFinalize));
		}
	}

	private static void GlobalConfig()
	{
		SkillFamilySafeguard = configFile.Bind<bool>("00-General", "SkillFamilySafeguard", true, "Ensures that each skillFamily has at least one skill. Set to false to remove any SkillFamily that becomes empty.");
		ScanConfigSectionsStartup = configFile.Bind<bool>("00-General", "ScanConfigSectionsStartup", true, "Check config entries on startup and enable Generate Config if any entry in that section is set to true.");
		ScanConfigSectionsFinalize = configFile.Bind<bool>("00-General", "ScanConfigSectionsFinalize", true, "Check config entries on finalize and disable Generate Config if no entry in that section is set to true. Does not apply to SpawnCard.");
		ConfigItem = configFile.Bind<bool>("01-Generate", "ConfigItem", false, "Generate Item configs and apply patches.");
		ConfigEquipment = configFile.Bind<bool>("01-Generate", "ConfigEquipment", false, "Generate Equipment configs and apply patches.");
		ConfigArtifact = configFile.Bind<bool>("01-Generate", "ConfigArtifact", false, "Generate Artifact configs and apply patches.");
		ConfigDifficulty = configFile.Bind<bool>("01-Generate", "ConfigDifficulty", false, "Generate Difficulty configs and apply patches.");
		ConfigSurvivor = configFile.Bind<bool>("01-Generate", "ConfigSurvivor", false, "Generate Survivor configs and apply patches.");
		ConfigSkill = configFile.Bind<bool>("01-Generate", "ConfigSkill", false, "Generate Skill configs and apply patches.");
		ConfigSkin = configFile.Bind<bool>("01-Generate", "ConfigSkin", false, "Generate Skin configs and apply patches.");
		ConfigBody = configFile.Bind<bool>("01-Generate", "ConfigBody", false, "Generate Body configs and apply patches.");
		ConfigSpawnCard = configFile.Bind<bool>("01-Generate", "ConfigSpawnCard", false, "Generate SpawnCard configs and apply patches.");
	}

	private static void ConfigStartup()
	{
		LogWarn("Scanning Config Entries [Startup]");
		Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)typeof(ConfigFile).GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(configFile);
		if (dictionary == null || dictionary.Count == 0)
		{
			LogWarn("There Are No Config Entries");
			return;
		}
		List<string> list = new List<string>();
		foreach (KeyValuePair<ConfigDefinition, string> item in dictionary)
		{
			string value = item.Value;
			if (string.IsNullOrEmpty(value) || !(value == "true"))
			{
				continue;
			}
			ConfigDefinition key = item.Key;
			if (key != (ConfigDefinition)null)
			{
				string section = key.Section;
				if (!list.Contains(section))
				{
					LogWarn("Config Section: " + section + " Contains Disabled Entry");
					list.Add(section);
				}
			}
		}
		if (list.Count == 0)
		{
			LogWarn("Found No Sections To Enable");
			return;
		}
		if (list.Contains("Item") && !ConfigItem.Value)
		{
			LogWarn("Enabling Item Configs And Patches");
			ConfigItem.Value = true;
		}
		if (list.Contains("Equipment") && !ConfigEquipment.Value)
		{
			LogWarn("Enabling Equipment Configs And Patches");
			ConfigEquipment.Value = true;
		}
		if (list.Contains("Artifact") && !ConfigArtifact.Value)
		{
			LogWarn("Enabling Artifact Configs And Patches");
			ConfigArtifact.Value = true;
		}
		if (list.Contains("Difficulty") && !ConfigDifficulty.Value)
		{
			LogWarn("Enabling Difficulty Configs And Patches");
			ConfigDifficulty.Value = true;
		}
		if (list.Contains("Survivor") && !ConfigSurvivor.Value)
		{
			LogWarn("Enabling Survivor Configs And Patches");
			ConfigSurvivor.Value = true;
		}
		if (list.Contains("Skill") && !ConfigSkill.Value)
		{
			LogWarn("Enabling Skill Configs And Patches");
			ConfigSkill.Value = true;
		}
		if (list.Contains("Skin") && !ConfigSkin.Value)
		{
			LogWarn("Enabling Skin Configs And Patches");
			ConfigSkin.Value = true;
		}
		if (list.Contains("Body") && !ConfigBody.Value)
		{
			LogWarn("Enabling Body Configs And Patches");
			ConfigBody.Value = true;
		}
		if (list.Contains("SpawnCard") && !ConfigSpawnCard.Value)
		{
			LogWarn("Enabling SpawnCard Configs And Patches");
			ConfigSpawnCard.Value = true;
		}
	}

	private static void ConfigFinalize()
	{
		LogWarn("Scanning Config Entries [Finalize]");
		Dictionary<ConfigDefinition, ConfigEntryBase> dictionary = (Dictionary<ConfigDefinition, ConfigEntryBase>)typeof(ConfigFile).GetProperty("Entries", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(configFile);
		if (dictionary == null || dictionary.Count == 0)
		{
			LogWarn("There Are No Config Entries");
			return;
		}
		List<string> list = new List<string> { "Item", "Equipment", "Artifact", "Difficulty", "Survivor", "Skill", "Skin", "Body" };
		foreach (KeyValuePair<ConfigDefinition, ConfigEntryBase> item in dictionary)
		{
			ConfigEntryBase value = item.Value;
			if (value == null)
			{
				continue;
			}
			string serializedValue = value.GetSerializedValue();
			if (string.IsNullOrEmpty(serializedValue) || !(serializedValue == "true"))
			{
				continue;
			}
			ConfigDefinition key = item.Key;
			if (key != (ConfigDefinition)null)
			{
				string section = key.Section;
				if (list.Contains(section))
				{
					list.Remove(section);
				}
			}
		}
		if (list.Count == 0)
		{
			LogWarn("Found No Sections To Disable");
			return;
		}
		foreach (string item2 in list)
		{
			LogWarn("Config Section: " + item2 + " Is Unused");
		}
		if (list.Contains("Item") && ConfigItem.Value)
		{
			LogWarn("Disabling Item Configs And Patches, Wont Apply Until Next Startup.");
			ConfigItem.Value = false;
		}
		if (list.Contains("Equipment") && ConfigEquipment.Value)
		{
			LogWarn("Disabling Equipment Configs And Patches, Wont Apply Until Next Startup.");
			ConfigEquipment.Value = false;
		}
		if (list.Contains("Artifact") && ConfigArtifact.Value)
		{
			LogWarn("Disabling Artifact Configs And Patches, Wont Apply Until Next Startup.");
			ConfigArtifact.Value = false;
		}
		if (list.Contains("Difficulty") && ConfigDifficulty.Value)
		{
			LogWarn("Disabling Difficulty Configs And Patches, Wont Apply Until Next Startup.");
			ConfigDifficulty.Value = false;
		}
		if (list.Contains("Survivor") && ConfigSurvivor.Value)
		{
			LogWarn("Disabling Survivor Configs And Patches, Wont Apply Until Next Startup.");
			ConfigSurvivor.Value = false;
		}
		if (list.Contains("Skill") && ConfigSkill.Value)
		{
			LogWarn("Disabling Skill Configs And Patches, Wont Apply Until Next Startup.");
			ConfigSkill.Value = false;
		}
		if (list.Contains("Skin") && ConfigSkin.Value)
		{
			LogWarn("Disabling Skin Configs And Patches, Wont Apply Until Next Startup.");
			ConfigSkin.Value = false;
		}
		if (list.Contains("Body") && ConfigBody.Value)
		{
			LogWarn("Disabling Body Configs And Patches, Wont Apply Until Next Startup.");
			ConfigBody.Value = false;
		}
	}

	private static void ExcludeRuleChoices()
	{
		List<string> list = new List<string>();
		foreach (ArtifactDef disabledArtifact in DisabledArtifacts)
		{
			string cachedName = disabledArtifact.cachedName;
			if (cachedName != null && cachedName != "")
			{
				list.Add("Artifacts." + cachedName);
			}
			cachedName = disabledArtifact.nameToken;
			if (cachedName != null && cachedName != "")
			{
				list.Add(cachedName);
			}
		}
		if (ConfigDifficulty.Value)
		{
			RuleDef val = RuleCatalog.FindRuleDef("Difficulty");
			if (val != null)
			{
				foreach (RuleChoiceDef choice in val.choices)
				{
					string text = choice.tooltipNameToken;
					if (text == null || text == "")
					{
						text = "UnknownDifficulty";
					}
					if (text == "UnknownDifficulty")
					{
						LogWarn("Tried to create ConfigEntry for [" + text + "] but it does not have a valid name!");
						continue;
					}
					ConfigEntry<bool> val2 = ConfigEntry("Difficulty", text, defaultValue: false, "Disable Difficulty : " + text);
					if (val2.Value)
					{
						list.Add(text);
						LogWarn("Disabled Difficulty : " + text);
					}
				}
			}
		}
		LogWarn("----- Hiding RuleCatalog Choices -----");
		foreach (RuleDef allRuleDef in RuleCatalog.allRuleDefs)
		{
			if (allRuleDef.choices == null || allRuleDef.choices.Count <= 0)
			{
				continue;
			}
			if (list.Contains(allRuleDef.globalName) || list.Contains(allRuleDef.displayToken))
			{
				foreach (RuleChoiceDef choice2 in allRuleDef.choices)
				{
					choice2.excludeByDefault = true;
				}
				LogWarn("Hiding RuleCatalog Entries For [" + allRuleDef.globalName + " - " + allRuleDef.displayToken + "]");
			}
			if (!(allRuleDef.globalName == "Difficulty"))
			{
				continue;
			}
			foreach (RuleChoiceDef choice3 in allRuleDef.choices)
			{
				if (list.Contains(choice3.tooltipNameToken))
				{
					choice3.excludeByDefault = true;
					LogWarn("Hiding RuleCatalog Entry For [" + allRuleDef.globalName + " - " + choice3.tooltipNameToken + "]");
				}
			}
		}
		LogWarn("----- RuleCatalog Choices Hidden -----");
	}

	private static void ItemCatalogInit(orig_Init orig)
	{
		ItemDef[] itemDefs = ContentManager.itemDefs;
		foreach (ItemDef val in itemDefs)
		{
			string text = ((Object)val).name;
			if (text == "")
			{
				text = val.nameToken;
			}
			if (text == "")
			{
				text = "UnknownItem";
			}
			ConfigEntry<bool> val2 = ConfigEntry("Item", text, defaultValue: false, "Disable Item : " + text);
			if (val2.Value)
			{
				val._itemTierDef = null;
				AssignDepricatedTier(val, (ItemTier)5);
				LogWarn("Disabled Item : " + text);
			}
		}
		orig.Invoke();
	}

	private static void AssignDepricatedTier(ItemDef itemDef, ItemTier itemTier)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		itemDef.deprecatedTier = itemTier;
	}

	private static void EquipmentCatalogInit(orig_Init orig)
	{
		EquipmentDef[] equipmentDefs = ContentManager.equipmentDefs;
		foreach (EquipmentDef val in equipmentDefs)
		{
			string text = ((Object)val).name;
			if (text == "")
			{
				text = val.nameToken;
			}
			if (text == "")
			{
				text = "UnknownEquipment";
			}
			ConfigEntry<bool> val2 = ConfigEntry("Equipment", text, defaultValue: false, "Disable Equipment : " + text);
			if (val2.Value)
			{
				val.canDrop = false;
				val.appearsInSinglePlayer = false;
				val.appearsInMultiPlayer = false;
				val.canBeRandomlyTriggered = false;
				val.enigmaCompatible = false;
				val.dropOnDeathChance = 0f;
				LogWarn("Disabled Equipment : " + text);
			}
		}
		orig.Invoke();
	}

	private void ArtifactCatalogInit(orig_Init orig)
	{
		ArtifactDef[] artifactDefs = ContentManager.artifactDefs;
		foreach (ArtifactDef val in artifactDefs)
		{
			string text = val.cachedName;
			if (text == "")
			{
				text = val.nameToken;
			}
			if (text == "")
			{
				text = "UnknownArtifact";
			}
			if (text == "UnknownArtifact")
			{
				LogWarn("Tried to create ConfigEntry for [" + text + "] but it does not have a valid name!");
				continue;
			}
			ConfigEntry<bool> val2 = ConfigEntry("Artifact", text, defaultValue: false, "Disable Artifact : " + text);
			if (val2.Value)
			{
				if (!DisabledArtifacts.Contains(val))
				{
					DisabledArtifacts.Add(val);
				}
				LogWarn("Disabled Artifact : " + text);
			}
		}
		orig.Invoke();
	}

	private static void SurvivorCatalogInit(orig_Init orig)
	{
		SurvivorDef[] survivorDefs = ContentManager.survivorDefs;
		foreach (SurvivorDef val in survivorDefs)
		{
			string text = val.cachedName;
			if (text == "")
			{
				text = val.displayNameToken;
			}
			if (text == "")
			{
				text = "UnknownSurvivor";
			}
			ConfigEntry<bool> val2 = ConfigEntry("Survivor", text, defaultValue: false, "Disable Survivor : " + text);
			if (val2.Value)
			{
				val.hidden = true;
				if (!DisabledSurvivors.Contains(val))
				{
					DisabledSurvivors.Add(val);
				}
				LogWarn("Disabled Survivor : " + text);
			}
		}
		orig.Invoke();
	}

	private static bool LogBookControllerCanSelectSurvivorBodyEntry(orig_CanSelectSurvivorBodyEntry orig, CharacterBody body, Dictionary<ExpansionDef, bool> expansionAvailability)
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)body))
		{
			SurvivorDef survivorDef = SurvivorCatalog.GetSurvivorDef(SurvivorCatalog.GetSurvivorIndexFromBodyIndex(body.bodyIndex));
			if (Object.op_Implicit((Object)(object)survivorDef) && DisabledSurvivors.Contains(survivorDef))
			{
				return false;
			}
		}
		return orig.Invoke(body, expansionAvailability);
	}

	private static void CharacterMasterPickRandomSurvivorBodyPrefabHook(ILContext il)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		ILCursor val = new ILCursor(il);
		if (val.TryGotoNext(new Func<Instruction, bool>[1]
		{
			(Instruction x) => ILPatternMatchingExt.MatchStloc(x, 1)
		}))
		{
			val.Index += 1;
			val.Emit(OpCodes.Ldloc, 1);
			val.EmitDelegate<Func<SurvivorDef[], SurvivorDef[]>>((Func<SurvivorDef[], SurvivorDef[]>)delegate(SurvivorDef[] survivorDefs)
			{
				List<SurvivorDef> list = survivorDefs.ToList();
				foreach (SurvivorDef disabledSurvivor in DisabledSurvivors)
				{
					if (list.Contains(disabledSurvivor))
					{
						list.Remove(disabledSurvivor);
						string text = disabledSurvivor.cachedName;
						if (text == "")
						{
							text = disabledSurvivor.displayNameToken;
						}
						LogWarn("Removed Survivor [" + text + "] From Metamorph Choices.");
					}
				}
				return list.ToArray();
			});
			val.Emit(OpCodes.Stloc, 1);
		}
		else
		{
			LogWarn("PickRandomSurvivorHook Failed");
		}
	}

	private static void SkillCatalogInit(orig_Init orig)
	{
		//IL_00b0: 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_00b7: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
		SkillDef[] skillDefs = ContentManager.skillDefs;
		foreach (SkillDef skillDef in skillDefs)
		{
			string skillName = GetSkillName(skillDef);
			if (skillName == "" || skillName == "UnknownSkill")
			{
				string stateName = GetStateName(skillDef);
				LogInvalidSkillStateName(stateName);
			}
			else
			{
				CreateSkillConfig(skillName);
			}
		}
		LogWarn("----- Rebuilding SkillFamilies -----");
		List<Variant> list = new List<Variant>();
		SkillFamily[] skillFamilies = ContentManager.skillFamilies;
		foreach (SkillFamily val in skillFamilies)
		{
			list.Clear();
			uint defaultVariantIndex = val.defaultVariantIndex;
			uint defaultVariantIndex2 = 0u;
			for (int k = 0; k < val.variants.Length; k++)
			{
				Variant val2 = val.variants[k];
				string skillName2 = GetSkillName(val2.skillDef);
				if (!IsSkillDisabled(skillName2))
				{
					if (k == defaultVariantIndex)
					{
						defaultVariantIndex2 = (uint)list.Count;
					}
					list.Add(val2);
				}
			}
			if (list.Count == 0)
			{
				list.Add(val.variants[defaultVariantIndex]);
			}
			val.defaultVariantIndex = defaultVariantIndex2;
			val.variants = list.ToArray();
		}
		LogWarn("----- SkillFamilies Rebuilt -----");
		orig.Invoke();
	}

	private static void SkillStrip2()
	{
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		LogWarn("----- SkillStrip2 Start -----");
		List<Variant> list = new List<Variant>();
		foreach (GameObject allBodyPrefab in BodyCatalog.allBodyPrefabs)
		{
			if (!Object.op_Implicit((Object)(object)allBodyPrefab))
			{
				continue;
			}
			GenericSkill[] components = allBodyPrefab.GetComponents<GenericSkill>();
			GenericSkill[] array = components;
			foreach (GenericSkill val in array)
			{
				SkillFamily skillFamily = val.skillFamily;
				if (!Object.op_Implicit((Object)(object)skillFamily))
				{
					continue;
				}
				list.Clear();
				uint defaultVariantIndex = skillFamily.defaultVariantIndex;
				uint defaultVariantIndex2 = 0u;
				for (int j = 0; j < skillFamily.variants.Length; j++)
				{
					Variant val2 = skillFamily.variants[j];
					string skillName = GetSkillName(val2.skillDef);
					if (skillName == "" || skillName == "UnknownSkill")
					{
						string stateName = GetStateName(val2.skillDef);
						LogInvalidSkillStateName(stateName);
					}
					else if (!SkillConfigs.ContainsKey(skillName))
					{
						CreateSkillConfig(skillName);
					}
					if (!IsSkillDisabled(skillName))
					{
						if (j == defaultVariantIndex)
						{
							defaultVariantIndex2 = (uint)list.Count;
						}
						list.Add(val2);
					}
				}
				bool flag = false;
				if (list.Count == 0)
				{
					SkillDef skillDef = skillFamily.variants[defaultVariantIndex].skillDef;
					string skillName2 = GetSkillName(skillDef);
					LogWarn("[" + skillName2 + "] was enabled because its skill family has no options and it is the default skill variant.");
					list.Add(skillFamily.variants[defaultVariantIndex]);
					if (!SkillFamilySafeguard.Value)
					{
						flag = true;
					}
				}
				skillFamily.defaultVariantIndex = defaultVariantIndex2;
				skillFamily.variants = list.ToArray();
				if (!flag)
				{
					continue;
				}
				SkillLocator component = allBodyPrefab.GetComponent<SkillLocator>();
				if (Object.op_Implicit((Object)(object)component))
				{
					string bodyName = GetBodyName(allBodyPrefab);
					LogWarn("Removing GenericSkill from SkillLocator of [" + bodyName + "].");
					if ((Object)(object)component.primary == (Object)(object)val)
					{
						component.primary = null;
					}
					if ((Object)(object)component.secondary == (Object)(object)val)
					{
						component.secondary = null;
					}
					if ((Object)(object)component.utility == (Object)(object)val)
					{
						component.utility = null;
					}
					if ((Object)(object)component.special == (Object)(object)val)
					{
						component.special = null;
					}
					val.hideInCharacterSelect = true;
					Object.DestroyImmediate((Object)(object)val);
				}
				else
				{
					LogWarn("Tried to remove GenericSkill but SkillLocator could not be found!");
				}
			}
		}
		LogWarn("----- SkillStrip2 End -----");
	}

	private static string GetSkillName(SkillDef skillDef)
	{
		string skillName = skillDef.skillName;
		string skillNameToken = skillDef.skillNameToken;
		skillNameToken = skillNameToken.Trim();
		skillName = skillName.Trim();
		string text = "UnknownSkill";
		if (skillNameToken != "" && skillName != "")
		{
			text = skillNameToken + " " + skillName;
		}
		else if (skillNameToken != "")
		{
			text = skillNameToken;
		}
		else if (skillName != "")
		{
			text = skillName;
		}
		return text.Trim();
	}

	private static string GetStateName(SkillDef skillDef)
	{
		string text = skillDef.activationStateMachineName;
		string text2 = "";
		if (text == null)
		{
			text = "";
		}
		if (((SerializableEntityStateType)(ref skillDef.activationState)).stateType != null)
		{
			text2 = ((SerializableEntityStateType)(ref skillDef.activationState)).typeName;
		}
		if (text2 == null)
		{
			text2 = "";
		}
		if (text2.Contains(","))
		{
			text2 = text2.Substring(0, text2.IndexOf(","));
		}
		text = text.Trim();
		text2 = text2.Trim();
		string text3 = "UnknownState";
		if (text != "" && text2 != "")
		{
			text3 = text + " " + text2;
		}
		else if (text2 != "")
		{
			text3 = text2;
		}
		else if (text != "")
		{
			text3 = text;
		}
		return text3.Trim();
	}

	private static void LogInvalidSkillStateName(string stateName)
	{
		stateName = stateName.Trim();
		if (!InvalidSkillStateNames.Contains(stateName))
		{
			InvalidSkillStateNames.Add(stateName);
			LogWarn("Tried to create ConfigEntry for [" + stateName + "] but its SkillDef does not have a valid name!");
		}
	}

	private static void CreateSkillConfig(string skillName)
	{
		if (skillName == "" || skillName == "UnknownSkill" || skillName == "UnknownState")
		{
			return;
		}
		if (!SkillConfigs.ContainsKey(skillName))
		{
			ConfigEntry<bool> val = ConfigEntry("Skill", skillName, defaultValue: false, "Disable Skill : " + skillName);
			SkillConfigs.Add(skillName, val);
			if (val.Value)
			{
				LogWarn("Disabled Skill : " + skillName);
			}
		}
		else
		{
			LogWarn("Tried to create another ConfigEntry for [" + skillName + "]. Using the one already available.");
		}
	}

	private static bool IsSkillDisabled(string skillName)
	{
		if (skillName == "" || skillName == "UnknownSkill")
		{
			return false;
		}
		if (!SkillConfigs.ContainsKey(skillName))
		{
			return false;
		}
		if (SkillConfigs[skillName].Value)
		{
			return true;
		}
		return false;
	}

	private static void RemoveSkins()
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_014e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0158: Unknown result type (might be due to invalid IL or missing references)
		LogWarn("----- Rebuilding SkinDefs -----");
		List<SkinDef> list = new List<SkinDef>();
		foreach (GameObject allBodyPrefab in BodyCatalog.allBodyPrefabs)
		{
			if (!Object.op_Implicit((Object)(object)allBodyPrefab))
			{
				continue;
			}
			bool flag = false;
			BodyIndex val = BodyCatalog.FindBodyIndex(allBodyPrefab);
			SkinDef[] bodySkinDefs = SkinCatalog.GetBodySkinDefs(val);
			if (bodySkinDefs == null)
			{
				LogWarn("No Skins found for : " + GetBodyName(allBodyPrefab));
			}
			else
			{
				if (bodySkinDefs.Length == 0)
				{
					continue;
				}
				list.Clear();
				string bodyName = GetBodyName(allBodyPrefab);
				SkinDef[] array = bodySkinDefs;
				foreach (SkinDef val2 in array)
				{
					string text = val2.nameToken;
					if (text == "")
					{
						text = "UnknownSkin";
					}
					text = bodyName + " " + text;
					ConfigEntry<bool> val3 = ConfigEntry("Skin", text, defaultValue: false, "Disable Skin : " + text);
					if (val3.Value)
					{
						flag = true;
						LogWarn("Disabled Skin : " + text);
					}
					else
					{
						list.Add(val2);
					}
				}
				if (!flag)
				{
					continue;
				}
				bodySkinDefs = list.ToArray();
				BodyCatalog.skins[val] = bodySkinDefs;
				SkinCatalog.skinsByBody[val] = bodySkinDefs;
				ModelLocator component = allBodyPrefab.GetComponent<ModelLocator>();
				if (Object.op_Implicit((Object)(object)component))
				{
					ModelSkinController component2 = ((Component)component.modelTransform).gameObject.GetComponent<ModelSkinController>();
					if (Object.op_Implicit((Object)(object)component2))
					{
						component2.skins = bodySkinDefs;
					}
				}
			}
		}
		LogWarn("----- SkinDefs Rebuilt -----");
	}

	private static string GetBodyName(GameObject bodyPrefab)
	{
		CharacterBody component = bodyPrefab.GetComponent<CharacterBody>();
		if (Object.op_Implicit((Object)(object)component))
		{
			string text = ((Object)component).name;
			if (text == "")
			{
				text = component.baseNameToken;
			}
			if (text != "")
			{
				return text;
			}
		}
		return "UnknownBody";
	}

	[IteratorStateMachine(typeof(<BodyCatalogInit>d__55))]
	private static IEnumerator BodyCatalogInit(orig_Init orig)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <BodyCatalogInit>d__55(0)
		{
			orig = orig
		};
	}

	private static bool LogBookControllerCanSelectMonsterEntry(orig_CanSelectMonsterEntry orig, CharacterBody body, Dictionary<ExpansionDef, bool> expansionAvailability)
	{
		if (Object.op_Implicit((Object)(object)body))
		{
			string text = ((Object)body).name;
			if (text == "")
			{
				text = body.baseNameToken;
			}
			if (DisabledBodies.Contains(text))
			{
				return false;
			}
		}
		return orig.Invoke(body, expansionAvailability);
	}

	private static void ClassicStageInfoRebuildCards(orig_RebuildCards orig, ClassicStageInfo self, DirectorCardCategorySelection fmc, DirectorCardCategorySelection fic)
	{
		orig.Invoke(self, fmc, fic);
		ProccessWeightedSelectionEntries(self.monsterSelection);
	}

	private static void ClassicStageInfoRebuildCardsHook(ILContext il)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Expected O, but got Unknown
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		ILCursor val = new ILCursor(il);
		MethodReference wat = null;
		if (val.TryGotoNext(new Func<Instruction, bool>[2]
		{
			(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, 10),
			(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt(x, ref wat)
		}) && ((MemberReference)wat).Name.Contains("Count"))
		{
			val.Index += 1;
			val.EmitDelegate<Func<WeightedSelection<MonsterFamily>, WeightedSelection<MonsterFamily>>>((Func<WeightedSelection<MonsterFamily>, WeightedSelection<MonsterFamily>>)delegate(WeightedSelection<MonsterFamily> selection)
			{
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: 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_001c: Unknown result type (might be due to invalid IL or missing references)
				for (int num = selection.Count - 1; num >= 0; num--)
				{
					MonsterFamily value = selection.GetChoice(num).value;
					if (!IsMonsterFamilyValid(value))
					{
						selection.RemoveChoice(num);
						LogWarn("Removing Invalid MonsterFamily From Selection.");
					}
				}
				return selection;
			});
			val.Emit(OpCodes.Stloc, 10);
			val.Emit(OpCodes.Ldloc, 10);
		}
		else
		{
			LogWarn("RebuildCardsHook Failed");
		}
	}

	private static bool IsMonsterFamilyValid(MonsterFamily family)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: 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_002e: Unknown result type (might be due to invalid IL or missing references)
		DirectorCardCategorySelection monsterFamilyCategories = family.monsterFamilyCategories;
		for (int i = 0; i < monsterFamilyCategories.categories.Length; i++)
		{
			Category val = monsterFamilyCategories.categories[i];
			for (int num = val.cards.Length - 1; num >= 0; num--)
			{
				DirectorCard val2 = val.cards[num];
				if (val2 != null)
				{
					SpawnCard spawnCard = val2.spawnCard;
					if (Object.op_Implicit((Object)(object)spawnCard) && Object.op_Implicit((Object)(object)spawnCard.prefab))
					{
						CreateSpawnCardConfig(spawnCard);
						if (IsCharacterSpawnCard(spawnCard) && !IsSpawnCardDisabled(spawnCard) && !DisabledBodies.Contains(SpawnCardBodyNames[spawnCard]))
						{
							return true;
						}
					}
				}
			}
		}
		return false;
	}

	private static void GatherInteractableCards(SceneDirector sceneDirector, DirectorCardCategorySelection dccs)
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		for (int i = 0; i < dccs.categories.Length; i++)
		{
			Category val = dccs.categories[i];
			for (int num = val.cards.Length - 1; num >= 0; num--)
			{
				DirectorCard val2 = val.cards[num];
				if (val2 != null)
				{
					SpawnCard spawnCard = val2.spawnCard;
					if (Object.op_Implicit((Object)(object)spawnCard))
					{
						CreateSpawnCardConfig(spawnCard);
					}
				}
			}
		}
	}

	private static WeightedSelection<DirectorCard> SceneDirectorGenerateInteractableCardSelection(orig_GenerateInteractableCardSelection orig, SceneDirector self)
	{
		WeightedSelection<DirectorCard> val = orig.Invoke(self);
		ProccessWeightedSelectionEntries(val);
		return val;
	}

	private static void ProccessWeightedSelectionEntries(WeightedSelection<DirectorCard> selection)
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		if (selection == null)
		{
			return;
		}
		for (int i = 0; i < selection.Count; i++)
		{
			DirectorCard value = selection.GetChoice(i).value;
			if (value != null)
			{
				SpawnCard spawnCard = value.spawnCard;
				if (Object.op_Implicit((Object)(object)spawnCard))
				{
					CreateSpawnCardConfig(spawnCard);
				}
			}
		}
	}

	private static bool DirectorCardIsAvailable(orig_IsAvailable orig, DirectorCard self)
	{
		if (Object.op_Implicit((Object)(object)self.spawnCard) && Object.op_Implicit((Object)(object)self.spawnCard.prefab))
		{
			SpawnCard spawnCard = self.spawnCard;
			CreateSpawnCardConfig(spawnCard);
			if (IsCharacterSpawnCard(spawnCard) && DisabledBodies.Contains(SpawnCardBodyNames[spawnCard]))
			{
				return false;
			}
			if (IsSpawnCardDisabled(spawnCard))
			{
				return false;
			}
		}
		return orig.Invoke(self);
	}

	private static bool IsCharacterSpawnCard(SpawnCard spawnCard)
	{
		if ((Object)(object)spawnCard == (Object)null)
		{
			return false;
		}
		if (!SpawnCardBodyNames.ContainsKey(spawnCard))
		{
			CharacterMaster component = spawnCard.prefab.GetComponent<CharacterMaster>();
			if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.bodyPrefab))
			{
				CharacterBody component2 = component.bodyPrefab.GetComponent<CharacterBody>();
				if (Object.op_Implicit((Object)(object)component2))
				{
					string text = ((Object)component2).name;
					if (text == "")
					{
						text = component2.baseNameToken;
					}
					SpawnCardBodyNames.Add(spawnCard, text);
				}
			}
		}
		return SpawnCardBodyNames.ContainsKey(spawnCard);
	}

	private static void CreateSpawnCardConfig(SpawnCard spawnCard)
	{
		if ((Object)(object)spawnCard == (Object)null)
		{
			LogWarn("Tried to create ConfigEntry for null SpawnCard!");
		}
		else
		{
			if (SpawnCardConfigs.ContainsKey(spawnCard))
			{
				return;
			}
			string text = ((Object)spawnCard).name;
			if (text == "")
			{
				text = "UnknownSpawnCard";
			}
			if (text == "UnknownSpawnCard")
			{
				LogWarn("Tried to create ConfigEntry for [" + text + "] but it does not have a valid name!");
				GameObject prefab = spawnCard.prefab;
				if (Object.op_Implicit((Object)(object)prefab))
				{
					text = ((Object)prefab).name;
					if (text != null && text != "")
					{
						LogWarn("--- PrefabName: " + ((Object)prefab).name);
					}
				}
			}
			else
			{
				ConfigEntry<bool> val = ConfigEntry("SpawnCard", text, defaultValue: false, "Disable SpawnCard : " + text);
				SpawnCardConfigs.Add(spawnCard, val);
				if (val.Value)
				{
					LogWarn("Disabled SpawnCard : " + text);
				}
			}
		}
	}

	private static bool IsSpawnCardDisabled(SpawnCard spawnCard)
	{
		if ((Object)(object)spawnCard == (Object)null)
		{
			return true;
		}
		if (!SpawnCardConfigs.ContainsKey(spawnCard))
		{
			return false;
		}
		if (SpawnCardConfigs[spawnCard].Value)
		{
			return true;
		}
		return false;
	}

	private static ConfigEntry<bool> ConfigEntry(string section, string key, bool defaultValue, string description)
	{
		string configKey = section + "_" + key;
		key += ValidateConfigKey(configKey);
		key = SanitizeConfigKey(key);
		return configFile.Bind<bool>(section, key, defaultValue, description);
	}

	private static string ValidateConfigKey(string configKey)
	{
		if (!ConfigKeys.ContainsKey(configKey))
		{
			ConfigKeys.Add(configKey, 1);
			return "";
		}
		LogWarn("ConfigEntry for " + configKey + " already exists!");
		int num = ConfigKeys[configKey];
		ConfigKeys[configKey]++;
		return "_" + num;
	}

	private static string SanitizeConfigKey(string configKey)
	{
		bool flag = false;
		if (configKey.Any((char c) => InvalidConfigChars.Contains(c)))
		{
			LogWarn("ConfigEntry [" + configKey + "] contains invalid characters!");
			configKey = RemoveInvalidChars(configKey);
			flag = true;
		}
		string text = configKey.Trim();
		if (configKey != text)
		{
			LogWarn("ConfigEntry [" + configKey + "] contains trimable whitespace characters!");
			configKey = text;
			flag = true;
		}
		if (flag)
		{
			LogWarn("ConfigEntry key has been changed to [" + configKey + "].");
		}
		return configKey;
	}

	private static string RemoveInvalidChars(string str)
	{
		StringBuilder stringBuilder = new StringBuilder();
		foreach (char value in str)
		{
			if (!InvalidConfigChars.Contains(value))
			{
				stringBuilder.Append(value);
			}
		}
		return stringBuilder.ToString();
	}

	private static void LogWarn(object data)
	{
		logSource.LogWarning(data);
	}
}