Decompiled source of ExtraSkillSlots v1.6.2

plugins/ExtraSkillSlots/ExtraSkillSlots.dll

Decompiled 3 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.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using EntityStates;
using IL.EntityStates;
using IL.RoR2;
using IL.RoR2.UI;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using MonoMod.RuntimeDetour.HookGen;
using On.EntityStates;
using On.RoR2;
using On.RoR2.UI;
using Rewired;
using Rewired.Data;
using Rewired.Data.Mapping;
using RoR2;
using RoR2.UI;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.6.2.0")]
[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 ExtraSkillSlots
{
	internal class ExtraBaseSkillState
	{
		private static readonly ConditionalWeakTable<BaseSkillState, ExtraBaseSkillState> instances = new ConditionalWeakTable<BaseSkillState, ExtraBaseSkillState>();

		public ExtraSkillLocator ExtraSkillLocator { get; private set; }

		public ExtraInputBankTest ExtraInputBankTest { get; private set; }

		public static void IsKeyDownAuthorityILHook(ILContext il)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.GotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchNewobj<ArgumentOutOfRangeException>(x),
				(Instruction x) => ILPatternMatchingExt.MatchThrow(x)
			});
			int index = val.Index;
			val.Index = index + 1;
			val.Previous.OpCode = OpCodes.Nop;
			val.Previous.Operand = null;
			val.Remove();
			val.Emit(OpCodes.Ldarg_0);
			val.Emit(OpCodes.Call, (MethodBase)typeof(ExtraBaseSkillState).GetMethod("IsKeyDown", BindingFlags.Static | BindingFlags.NonPublic));
			val.Emit(OpCodes.Ret);
		}

		private static bool IsKeyDown(BaseSkillState skillState)
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Expected I4, but got Unknown
			if (!instances.TryGetValue(skillState, out var value))
			{
				ConditionalWeakTable<BaseSkillState, ExtraBaseSkillState> conditionalWeakTable = instances;
				ExtraBaseSkillState obj = new ExtraBaseSkillState
				{
					ExtraSkillLocator = ((Component)((EntityState)skillState).outer).GetComponent<ExtraSkillLocator>(),
					ExtraInputBankTest = ((Component)((EntityState)skillState).outer).GetComponent<ExtraInputBankTest>()
				};
				value = obj;
				conditionalWeakTable.Add(skillState, obj);
			}
			ExtraSkillLocator extraSkillLocator = value.ExtraSkillLocator;
			ExtraInputBankTest extraInputBankTest = value.ExtraInputBankTest;
			if (!Object.op_Implicit((Object)(object)extraSkillLocator) || !Object.op_Implicit((Object)(object)extraInputBankTest))
			{
				return false;
			}
			return (ExtraSkillSlot)(int)((EntityState)skillState).skillLocator.FindSkillSlot(skillState.activatorSkillSlot) switch
			{
				ExtraSkillSlot.ExtraFirst => extraInputBankTest.extraSkill1.down, 
				ExtraSkillSlot.ExtraSecond => extraInputBankTest.extraSkill2.down, 
				ExtraSkillSlot.ExtraThird => extraInputBankTest.extraSkill3.down, 
				ExtraSkillSlot.ExtraFourth => extraInputBankTest.extraSkill4.down, 
				_ => throw new ArgumentOutOfRangeException(), 
			};
		}
	}
	internal static class ExtraCharacterBody
	{
		internal static void RecalculateStatsILHook(ILContext il)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			int cooldownScaleIndex = -1;
			int flatCooldownReductionIndex = -1;
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdfld<SkillLocator>(x, "primary")
			});
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<GenericSkill>(x, "set_cooldownScale")
			});
			val.GotoPrev(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref cooldownScaleIndex)
			});
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<GenericSkill>(x, "set_flatCooldownReduction")
			});
			val.GotoPrev(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref flatCooldownReductionIndex)
			});
			val.GotoNext((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchRet(x)
			});
			val.Emit(OpCodes.Ldarg_0);
			val.Emit(OpCodes.Ldloc, cooldownScaleIndex);
			val.Emit(OpCodes.Ldloc, flatCooldownReductionIndex);
			val.Emit(OpCodes.Call, (MethodBase)typeof(ExtraCharacterBody).GetMethod("RecalculateCooldowns", BindingFlags.Static | BindingFlags.NonPublic));
		}

		private static void RecalculateCooldowns(CharacterBody characterBody, float scale, float flatCooldownReduction)
		{
			ExtraSkillLocator component = ((Component)characterBody).GetComponent<ExtraSkillLocator>();
			if (Object.op_Implicit((Object)(object)component))
			{
				if (Object.op_Implicit((Object)(object)component.extraFirst))
				{
					component.extraFirst.cooldownScale = scale;
					component.extraFirst.flatCooldownReduction = flatCooldownReduction;
				}
				if (Object.op_Implicit((Object)(object)component.extraSecond))
				{
					component.extraSecond.cooldownScale = scale;
					component.extraSecond.flatCooldownReduction = flatCooldownReduction;
				}
				if (Object.op_Implicit((Object)(object)component.extraThird))
				{
					component.extraThird.cooldownScale = scale;
					component.extraThird.flatCooldownReduction = flatCooldownReduction;
				}
				if (Object.op_Implicit((Object)(object)component.extraFourth))
				{
					component.extraFourth.cooldownScale = scale;
					component.extraFourth.flatCooldownReduction = flatCooldownReduction;
				}
			}
		}
	}
	internal class ExtraGenericCharacterMain
	{
		private static readonly ConditionalWeakTable<GenericCharacterMain, ExtraGenericCharacterMain> instances = new ConditionalWeakTable<GenericCharacterMain, ExtraGenericCharacterMain>();

		public bool extraSkill1InputReceived;

		public bool extraSkill2InputReceived;

		public bool extraSkill3InputReceived;

		public bool extraSkill4InputReceived;

		public ExtraSkillLocator ExtraSkillLocator { get; private set; }

		public ExtraInputBankTest ExtraInputBankTest { get; private set; }

		private ExtraGenericCharacterMain()
		{
		}

		internal static void PerformInputsOverrideHook(orig_PerformInputs orig, GenericCharacterMain self)
		{
			orig.Invoke(self);
			if (((EntityState)self).isAuthority)
			{
				if (!instances.TryGetValue(self, out var value))
				{
					ConditionalWeakTable<GenericCharacterMain, ExtraGenericCharacterMain> conditionalWeakTable = instances;
					GenericCharacterMain key = self;
					ExtraGenericCharacterMain obj = new ExtraGenericCharacterMain
					{
						ExtraSkillLocator = ((Component)((EntityState)self).outer).GetComponent<ExtraSkillLocator>(),
						ExtraInputBankTest = ((Component)((EntityState)self).outer).GetComponent<ExtraInputBankTest>()
					};
					value = obj;
					conditionalWeakTable.Add(key, obj);
				}
				ExtraSkillLocator extraSkillLocator = value.ExtraSkillLocator;
				ExtraInputBankTest extraInputBankTest = value.ExtraInputBankTest;
				if (Object.op_Implicit((Object)(object)extraSkillLocator) && Object.op_Implicit((Object)(object)extraInputBankTest) && value != null)
				{
					HandleSkill(extraSkillLocator.extraFirst, ref value.extraSkill1InputReceived, ((ButtonState)(ref extraInputBankTest.extraSkill1)).justPressed);
					HandleSkill(extraSkillLocator.extraSecond, ref value.extraSkill2InputReceived, ((ButtonState)(ref extraInputBankTest.extraSkill2)).justPressed);
					HandleSkill(extraSkillLocator.extraThird, ref value.extraSkill3InputReceived, ((ButtonState)(ref extraInputBankTest.extraSkill3)).justPressed);
					HandleSkill(extraSkillLocator.extraFourth, ref value.extraSkill4InputReceived, ((ButtonState)(ref extraInputBankTest.extraSkill4)).justPressed);
				}
			}
			void HandleSkill(GenericSkill skillSlot, ref bool inputReceived, bool justPressed)
			{
				bool flag = inputReceived;
				inputReceived = false;
				if (Object.op_Implicit((Object)(object)skillSlot) && (justPressed || (flag && !skillSlot.mustKeyPress)) && self.CanExecuteSkill(skillSlot))
				{
					skillSlot.ExecuteIfReady();
				}
			}
		}

		internal static void GatherInputsOverrideHook(orig_GatherInputs orig, GenericCharacterMain self)
		{
			orig.Invoke(self);
			if (!instances.TryGetValue(self, out var value))
			{
				ConditionalWeakTable<GenericCharacterMain, ExtraGenericCharacterMain> conditionalWeakTable = instances;
				ExtraGenericCharacterMain obj = new ExtraGenericCharacterMain
				{
					ExtraSkillLocator = ((Component)((EntityState)self).outer).GetComponent<ExtraSkillLocator>(),
					ExtraInputBankTest = ((Component)((EntityState)self).outer).GetComponent<ExtraInputBankTest>()
				};
				value = obj;
				conditionalWeakTable.Add(self, obj);
			}
			ExtraInputBankTest extraInputBankTest = value.ExtraInputBankTest;
			if (Object.op_Implicit((Object)(object)extraInputBankTest))
			{
				value.extraSkill1InputReceived |= extraInputBankTest.extraSkill1.down;
				value.extraSkill2InputReceived |= extraInputBankTest.extraSkill2.down;
				value.extraSkill3InputReceived |= extraInputBankTest.extraSkill3.down;
				value.extraSkill4InputReceived |= extraInputBankTest.extraSkill4.down;
			}
		}
	}
	[RequireComponent(typeof(HUD))]
	internal class ExtraHud : MonoBehaviour
	{
		private HUD hud;

		public SkillIcon extraSkillIconFirst;

		public SkillIcon extraSkillIconSecond;

		public SkillIcon extraSkillIconThird;

		public SkillIcon extraSkillIconFourth;

		private void Awake()
		{
			hud = ((Component)this).GetComponent<HUD>();
			SkillIcon[] skillIcons = hud.skillIcons;
			extraSkillIconFirst = CopyUISkillSlot(RewiredAction.FirstExtraSkill.Name, skillIcons[0]);
			extraSkillIconSecond = CopyUISkillSlot(RewiredAction.SecondExtraSkill.Name, skillIcons[1]);
			extraSkillIconThird = CopyUISkillSlot(RewiredAction.ThirdExtraSkill.Name, skillIcons[2]);
			extraSkillIconFourth = CopyUISkillSlot(RewiredAction.FourthExtraSkill.Name, skillIcons[3]);
		}

		internal static SkillIcon CopyUISkillSlot(string actionName, SkillIcon skillsContainer)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = ((Component)skillsContainer).gameObject.transform;
			Transform obj = Object.Instantiate<Transform>(transform, transform.parent);
			RectTransform component = ((Component)obj).GetComponent<RectTransform>();
			component.anchorMin = new Vector2(1f, 2.5f);
			component.anchorMax = new Vector2(1f, 2.5f);
			((Component)obj).GetComponentInChildren<InputBindingDisplayController>().actionName = actionName;
			return ((Component)obj).GetComponent<SkillIcon>();
		}

		private void Update()
		{
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)hud.targetBodyObject))
			{
				return;
			}
			ExtraSkillLocator component = hud.targetBodyObject.GetComponent<ExtraSkillLocator>();
			if (Object.op_Implicit((Object)(object)component))
			{
				PlayerCharacterMasterController playerCharacterMasterController = (Object.op_Implicit((Object)(object)hud.targetMaster) ? hud.targetMaster.playerCharacterMasterController : null);
				if (Object.op_Implicit((Object)(object)extraSkillIconFirst))
				{
					((Component)extraSkillIconFirst).gameObject.SetActive(ShouldShow(component.extraFirst));
					extraSkillIconFirst.targetSkillSlot = (SkillSlot)11;
					extraSkillIconFirst.targetSkill = component.extraFirst;
					extraSkillIconFirst.playerCharacterMasterController = playerCharacterMasterController;
				}
				if (Object.op_Implicit((Object)(object)extraSkillIconSecond))
				{
					((Component)extraSkillIconSecond).gameObject.SetActive(ShouldShow(component.extraSecond));
					extraSkillIconSecond.targetSkillSlot = (SkillSlot)12;
					extraSkillIconSecond.targetSkill = component.extraSecond;
					extraSkillIconSecond.playerCharacterMasterController = playerCharacterMasterController;
				}
				if (Object.op_Implicit((Object)(object)extraSkillIconThird))
				{
					((Component)extraSkillIconThird).gameObject.SetActive(ShouldShow(component.extraThird));
					extraSkillIconThird.targetSkillSlot = (SkillSlot)13;
					extraSkillIconThird.targetSkill = component.extraThird;
					extraSkillIconThird.playerCharacterMasterController = playerCharacterMasterController;
				}
				if (Object.op_Implicit((Object)(object)extraSkillIconFourth))
				{
					((Component)extraSkillIconFourth).gameObject.SetActive(ShouldShow(component.extraFourth));
					extraSkillIconFourth.targetSkillSlot = (SkillSlot)14;
					extraSkillIconFourth.targetSkill = component.extraFourth;
					extraSkillIconFourth.playerCharacterMasterController = playerCharacterMasterController;
				}
			}
			else
			{
				if (Object.op_Implicit((Object)(object)extraSkillIconFirst))
				{
					((Component)extraSkillIconFirst).gameObject.SetActive(false);
				}
				if (Object.op_Implicit((Object)(object)extraSkillIconSecond))
				{
					((Component)extraSkillIconSecond).gameObject.SetActive(false);
				}
				if (Object.op_Implicit((Object)(object)extraSkillIconThird))
				{
					((Component)extraSkillIconThird).gameObject.SetActive(false);
				}
				if (Object.op_Implicit((Object)(object)extraSkillIconFourth))
				{
					((Component)extraSkillIconFourth).gameObject.SetActive(false);
				}
			}
		}

		private bool ShouldShow(GenericSkill skill)
		{
			if (Object.op_Implicit((Object)(object)skill) && Object.op_Implicit((Object)(object)skill.skillDef))
			{
				return !skill.skillDef.skillName.Equals("Disabled", StringComparison.InvariantCultureIgnoreCase);
			}
			return false;
		}
	}
	[RequireComponent(typeof(InputBankTest))]
	[DisallowMultipleComponent]
	public class ExtraInputBankTest : MonoBehaviour
	{
		public ButtonState extraSkill1;

		public ButtonState extraSkill2;

		public ButtonState extraSkill3;

		public ButtonState extraSkill4;

		internal static bool CheckAnyButtonDownOverrideHook(orig_CheckAnyButtonDown orig, InputBankTest self)
		{
			if (orig.Invoke(self))
			{
				return true;
			}
			ExtraInputBankTest component = ((Component)self).GetComponent<ExtraInputBankTest>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return false;
			}
			if (!component.extraSkill1.down && !component.extraSkill2.down && !component.extraSkill3.down)
			{
				return component.extraSkill4.down;
			}
			return true;
		}
	}
	internal static class ExtraInputs
	{
		internal static void AddActionsToInputCatalog()
		{
			//IL_000a: 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_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			InputCatalog.actionToToken[RewiredAction.FirstExtraSkill] = RewiredAction.FirstExtraSkill.DisplayToken;
			InputCatalog.actionToToken[RewiredAction.SecondExtraSkill] = RewiredAction.SecondExtraSkill.DisplayToken;
			InputCatalog.actionToToken[RewiredAction.ThirdExtraSkill] = RewiredAction.ThirdExtraSkill.DisplayToken;
			InputCatalog.actionToToken[RewiredAction.FourthExtraSkill] = RewiredAction.FourthExtraSkill.DisplayToken;
		}

		internal static void AddCustomActions(Action<UserData> orig, UserData self)
		{
			self.actions?.Add(RewiredAction.FirstExtraSkill);
			self.actions?.Add(RewiredAction.SecondExtraSkill);
			self.actions?.Add(RewiredAction.ThirdExtraSkill);
			self.actions?.Add(RewiredAction.FourthExtraSkill);
			ControllerMap_Editor joystickMap = self.joystickMaps?.FirstOrDefault();
			ControllerMap_Editor keyboardMap = self.keyboardMaps?.FirstOrDefault();
			FillActionMaps(RewiredAction.FirstExtraSkill, keyboardMap, joystickMap);
			FillActionMaps(RewiredAction.SecondExtraSkill, keyboardMap, joystickMap);
			FillActionMaps(RewiredAction.ThirdExtraSkill, keyboardMap, joystickMap);
			FillActionMaps(RewiredAction.FourthExtraSkill, keyboardMap, joystickMap);
			orig(self);
		}

		internal static void OnLoadUserProfiles(orig_LoadUserProfiles orig, SaveSystem self)
		{
			orig.Invoke(self);
			foreach (var (text2, val2) in self.loadedUserProfiles)
			{
				try
				{
					AddMissingBingings(val2);
					val2.RequestEventualSave();
				}
				catch (Exception ex)
				{
					ExtraSkillSlotsPlugin.InstanceLogger.LogWarning((object)("Failed to add default bindings to '" + text2 + "' profile"));
					ExtraSkillSlotsPlugin.InstanceLogger.LogError((object)ex);
				}
			}
		}

		internal static void OnLoadDefaultProfile(orig_LoadDefaultProfile orig)
		{
			orig.Invoke();
			try
			{
				AddMissingBingings(UserProfile.defaultProfile);
			}
			catch (Exception ex)
			{
				ExtraSkillSlotsPlugin.InstanceLogger.LogWarning((object)"Failed to add default bindings to default profile");
				ExtraSkillSlotsPlugin.InstanceLogger.LogError((object)ex);
			}
		}

		private static void AddMissingBingings(UserProfile userProfile)
		{
			AddActionMaps(RewiredAction.FirstExtraSkill, userProfile);
			AddActionMaps(RewiredAction.SecondExtraSkill, userProfile);
			AddActionMaps(RewiredAction.ThirdExtraSkill, userProfile);
			AddActionMaps(RewiredAction.FourthExtraSkill, userProfile);
		}

		private static void FillActionMaps(RewiredAction action, ControllerMap_Editor keyboardMap, ControllerMap_Editor joystickMap)
		{
			if (joystickMap != null && joystickMap.actionElementMaps.All((ActionElementMap map) => map.actionId != action.ActionId))
			{
				joystickMap.actionElementMaps.Add(action.DefaultJoystickMap);
			}
			if (keyboardMap != null && keyboardMap.actionElementMaps.All((ActionElementMap map) => map.actionId != action.ActionId))
			{
				keyboardMap.actionElementMaps.Add(action.DefaultKeyboardMap);
			}
		}

		private static void AddActionMaps(RewiredAction action, UserProfile userProfile)
		{
			//IL_004f: 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_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			if (((ControllerMap)userProfile.joystickMap).AllMaps.All((ActionElementMap map) => map.actionId != action.ActionId))
			{
				((ControllerMap)userProfile.joystickMap).CreateElementMap(action.DefaultJoystickMap.actionId, action.DefaultJoystickMap.axisContribution, action.DefaultJoystickMap.elementIdentifierId, action.DefaultJoystickMap.elementType, action.DefaultJoystickMap.axisRange, action.DefaultJoystickMap.invert);
				action.DefaultJoystickMap.cVYzDXVDMNXvRMrklCVdVyeXGAlK((ControllerMap)(object)userProfile.joystickMap);
			}
			if (((ControllerMap)userProfile.keyboardMap).AllMaps.All((ActionElementMap map) => map.actionId != action.ActionId))
			{
				ActionElementMap val = default(ActionElementMap);
				((ControllerMap)userProfile.keyboardMap).CreateElementMap(action.DefaultKeyboardMap.actionId, action.DefaultKeyboardMap.axisContribution, action.DefaultKeyboardMap.elementIdentifierId, action.DefaultJoystickMap.elementType, action.DefaultJoystickMap.axisRange, action.DefaultJoystickMap.invert, ref val);
				val._keyboardKeyCode = action.DefaultKeyboardKey;
				action.DefaultKeyboardMap.cVYzDXVDMNXvRMrklCVdVyeXGAlK((ControllerMap)(object)userProfile.keyboardMap);
			}
		}

		private static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> pair, out TKey key, out TValue value)
		{
			key = pair.Key;
			value = pair.Value;
		}
	}
	internal class ExtraPlayerCharacterMasterController : NetworkBehaviour
	{
		private PlayerCharacterMasterController playerCharacterMasterController;

		private ExtraInputBankTest extraInputBankTest;

		public void Awake()
		{
			playerCharacterMasterController = ((Component)this).GetComponent<PlayerCharacterMasterController>();
		}

		public void FixedUpdate()
		{
			if (Object.op_Implicit((Object)(object)extraInputBankTest) && playerCharacterMasterController.hasEffectiveAuthority && Object.op_Implicit((Object)(object)extraInputBankTest))
			{
				bool flag = false;
				bool flag2 = false;
				bool flag3 = false;
				bool flag4 = false;
				LocalUser val = default(LocalUser);
				Player val2 = default(Player);
				CameraRigController val3 = default(CameraRigController);
				bool flag5 = default(bool);
				if (PlayerCharacterMasterController.CanSendBodyInput(playerCharacterMasterController.networkUser, ref val, ref val2, ref val3, ref flag5) && !flag5)
				{
					flag = val2.GetButton(RewiredAction.FirstExtraSkill.ActionId);
					flag2 = val2.GetButton(RewiredAction.SecondExtraSkill.ActionId);
					flag3 = val2.GetButton(RewiredAction.ThirdExtraSkill.ActionId);
					flag4 = val2.GetButton(RewiredAction.FourthExtraSkill.ActionId);
				}
				((ButtonState)(ref extraInputBankTest.extraSkill1)).PushState(flag);
				((ButtonState)(ref extraInputBankTest.extraSkill2)).PushState(flag2);
				((ButtonState)(ref extraInputBankTest.extraSkill3)).PushState(flag3);
				((ButtonState)(ref extraInputBankTest.extraSkill4)).PushState(flag4);
			}
		}

		internal static void SetBodyOverrideHook(orig_SetBody orig, PlayerCharacterMasterController self, GameObject newBody)
		{
			orig.Invoke(self, newBody);
			ExtraPlayerCharacterMasterController component = ((Component)self).GetComponent<ExtraPlayerCharacterMasterController>();
			if (Object.op_Implicit((Object)(object)component))
			{
				component.extraInputBankTest = (Object.op_Implicit((Object)(object)self.body) ? ((Component)self.body).GetComponent<ExtraInputBankTest>() : null);
			}
		}

		internal static void AwakeHook(orig_Awake orig, PlayerCharacterMasterController self)
		{
			orig.Invoke(self);
			((Component)self).gameObject.AddComponent<ExtraPlayerCharacterMasterController>();
		}
	}
	[RequireComponent(typeof(SkillLocator))]
	[DisallowMultipleComponent]
	public class ExtraSkillLocator : MonoBehaviour
	{
		public GenericSkill extraFirst;

		public GenericSkill extraSecond;

		public GenericSkill extraThird;

		public GenericSkill extraFourth;

		private void Awake()
		{
			if (!Object.op_Implicit((Object)(object)((Component)this).GetComponent<ExtraInputBankTest>()))
			{
				((Component)this).gameObject.AddComponent<ExtraInputBankTest>();
			}
		}

		internal static GenericSkill GetSkillOverrideHook(orig_GetSkill orig, SkillLocator self, SkillSlot skillSlot)
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Expected I4, but got Unknown
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			ExtraSkillLocator component = ((Component)self).GetComponent<ExtraSkillLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return orig.Invoke(self, skillSlot);
			}
			return (GenericSkill)((ExtraSkillSlot)(int)skillSlot switch
			{
				ExtraSkillSlot.ExtraFirst => component.extraFirst, 
				ExtraSkillSlot.ExtraSecond => component.extraSecond, 
				ExtraSkillSlot.ExtraThird => component.extraThird, 
				ExtraSkillSlot.ExtraFourth => component.extraFourth, 
				_ => orig.Invoke(self, skillSlot), 
			});
		}

		internal static SkillSlot FindSkillSlotOverrideHook(orig_FindSkillSlot orig, SkillLocator self, GenericSkill skillComponent)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			ExtraSkillLocator component = ((Component)self).GetComponent<ExtraSkillLocator>();
			if (!Object.op_Implicit((Object)(object)component))
			{
				return orig.Invoke(self, skillComponent);
			}
			if (!Object.op_Implicit((Object)(object)skillComponent))
			{
				return (SkillSlot)(-1);
			}
			if ((Object)(object)skillComponent == (Object)(object)component.extraFirst)
			{
				return (SkillSlot)11;
			}
			if ((Object)(object)skillComponent == (Object)(object)component.extraSecond)
			{
				return (SkillSlot)12;
			}
			if ((Object)(object)skillComponent == (Object)(object)component.extraThird)
			{
				return (SkillSlot)13;
			}
			if ((Object)(object)skillComponent == (Object)(object)component.extraFourth)
			{
				return (SkillSlot)14;
			}
			return orig.Invoke(self, skillComponent);
		}
	}
	internal enum ExtraSkillSlot
	{
		None = -1,
		Primary = 0,
		Secondary = 1,
		Utility = 2,
		Special = 3,
		ExtraFirst = 11,
		ExtraSecond = 12,
		ExtraThird = 13,
		ExtraFourth = 14
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.KingEnderBrine.ExtraSkillSlots", "Extra Skill Slots", "1.6.2")]
	public class ExtraSkillSlotsPlugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Action<Action<UserData>, UserData> <0>__AddCustomActions;

			public static hook_LoadDefaultProfile <1>__OnLoadDefaultProfile;

			public static hook_LoadUserProfiles <2>__OnLoadUserProfiles;

			public static hook_Start <3>__SettingsPanelControllerStart;

			public static hook_Awake <4>__HUDAwake;

			public static hook_GetSkill <5>__GetSkillOverrideHook;

			public static hook_FindSkillSlot <6>__FindSkillSlotOverrideHook;

			public static hook_CheckAnyButtonDown <7>__CheckAnyButtonDownOverrideHook;

			public static hook_PerformInputs <8>__PerformInputsOverrideHook;

			public static hook_GatherInputs <9>__GatherInputsOverrideHook;

			public static Manipulator <10>__IsKeyDownAuthorityILHook;

			public static hook_Awake <11>__AwakeHook;

			public static hook_SetBody <12>__SetBodyOverrideHook;

			public static Manipulator <13>__RecalculateStatsILHook;

			public static Manipulator <14>__LoadoutPanelControllerFromSkillSlot;
		}

		public const string GUID = "com.KingEnderBrine.ExtraSkillSlots";

		public const string Name = "Extra Skill Slots";

		public const string Version = "1.6.2";

		internal static ExtraSkillSlotsPlugin Instance { get; private set; }

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

		private void Start()
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Expected O, but got Unknown
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Expected O, but got Unknown
			//IL_00d1: 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_00dc: Expected O, but got Unknown
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Expected O, but got Unknown
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Expected O, but got Unknown
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Expected O, but got Unknown
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Expected O, but got Unknown
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Expected O, but got Unknown
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Expected O, but got Unknown
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Expected O, but got Unknown
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: Expected O, but got Unknown
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Expected O, but got Unknown
			Instance = this;
			ExtraInputs.AddActionsToInputCatalog();
			HookEndpointManager.Add((MethodBase)typeof(UserData).GetMethod("gLOOAxUFAvrvUufkVjaYyZoeLbLE", BindingFlags.Instance | BindingFlags.NonPublic), (Delegate)new Action<Action<UserData>, UserData>(ExtraInputs.AddCustomActions));
			object obj = <>O.<1>__OnLoadDefaultProfile;
			if (obj == null)
			{
				hook_LoadDefaultProfile val = ExtraInputs.OnLoadDefaultProfile;
				<>O.<1>__OnLoadDefaultProfile = val;
				obj = (object)val;
			}
			UserProfile.LoadDefaultProfile += (hook_LoadDefaultProfile)obj;
			object obj2 = <>O.<2>__OnLoadUserProfiles;
			if (obj2 == null)
			{
				hook_LoadUserProfiles val2 = ExtraInputs.OnLoadUserProfiles;
				<>O.<2>__OnLoadUserProfiles = val2;
				obj2 = (object)val2;
			}
			SaveSystem.LoadUserProfiles += (hook_LoadUserProfiles)obj2;
			object obj3 = <>O.<3>__SettingsPanelControllerStart;
			if (obj3 == null)
			{
				hook_Start val3 = UIHooks.SettingsPanelControllerStart;
				<>O.<3>__SettingsPanelControllerStart = val3;
				obj3 = (object)val3;
			}
			SettingsPanelController.Start += (hook_Start)obj3;
			object obj4 = <>O.<4>__HUDAwake;
			if (obj4 == null)
			{
				hook_Awake val4 = UIHooks.HUDAwake;
				<>O.<4>__HUDAwake = val4;
				obj4 = (object)val4;
			}
			HUD.Awake += (hook_Awake)obj4;
			object obj5 = <>O.<5>__GetSkillOverrideHook;
			if (obj5 == null)
			{
				hook_GetSkill val5 = ExtraSkillLocator.GetSkillOverrideHook;
				<>O.<5>__GetSkillOverrideHook = val5;
				obj5 = (object)val5;
			}
			SkillLocator.GetSkill += (hook_GetSkill)obj5;
			object obj6 = <>O.<6>__FindSkillSlotOverrideHook;
			if (obj6 == null)
			{
				hook_FindSkillSlot val6 = ExtraSkillLocator.FindSkillSlotOverrideHook;
				<>O.<6>__FindSkillSlotOverrideHook = val6;
				obj6 = (object)val6;
			}
			SkillLocator.FindSkillSlot += (hook_FindSkillSlot)obj6;
			object obj7 = <>O.<7>__CheckAnyButtonDownOverrideHook;
			if (obj7 == null)
			{
				hook_CheckAnyButtonDown val7 = ExtraInputBankTest.CheckAnyButtonDownOverrideHook;
				<>O.<7>__CheckAnyButtonDownOverrideHook = val7;
				obj7 = (object)val7;
			}
			InputBankTest.CheckAnyButtonDown += (hook_CheckAnyButtonDown)obj7;
			object obj8 = <>O.<8>__PerformInputsOverrideHook;
			if (obj8 == null)
			{
				hook_PerformInputs val8 = ExtraGenericCharacterMain.PerformInputsOverrideHook;
				<>O.<8>__PerformInputsOverrideHook = val8;
				obj8 = (object)val8;
			}
			GenericCharacterMain.PerformInputs += (hook_PerformInputs)obj8;
			object obj9 = <>O.<9>__GatherInputsOverrideHook;
			if (obj9 == null)
			{
				hook_GatherInputs val9 = ExtraGenericCharacterMain.GatherInputsOverrideHook;
				<>O.<9>__GatherInputsOverrideHook = val9;
				obj9 = (object)val9;
			}
			GenericCharacterMain.GatherInputs += (hook_GatherInputs)obj9;
			object obj10 = <>O.<10>__IsKeyDownAuthorityILHook;
			if (obj10 == null)
			{
				Manipulator val10 = ExtraBaseSkillState.IsKeyDownAuthorityILHook;
				<>O.<10>__IsKeyDownAuthorityILHook = val10;
				obj10 = (object)val10;
			}
			SkillStateMethods.IsKeyDownAuthority += (Manipulator)obj10;
			object obj11 = <>O.<11>__AwakeHook;
			if (obj11 == null)
			{
				hook_Awake val11 = ExtraPlayerCharacterMasterController.AwakeHook;
				<>O.<11>__AwakeHook = val11;
				obj11 = (object)val11;
			}
			PlayerCharacterMasterController.Awake += (hook_Awake)obj11;
			object obj12 = <>O.<12>__SetBodyOverrideHook;
			if (obj12 == null)
			{
				hook_SetBody val12 = ExtraPlayerCharacterMasterController.SetBodyOverrideHook;
				<>O.<12>__SetBodyOverrideHook = val12;
				obj12 = (object)val12;
			}
			PlayerCharacterMasterController.SetBody += (hook_SetBody)obj12;
			object obj13 = <>O.<13>__RecalculateStatsILHook;
			if (obj13 == null)
			{
				Manipulator val13 = ExtraCharacterBody.RecalculateStatsILHook;
				<>O.<13>__RecalculateStatsILHook = val13;
				obj13 = (object)val13;
			}
			CharacterBody.RecalculateStats += (Manipulator)obj13;
			object obj14 = <>O.<14>__LoadoutPanelControllerFromSkillSlot;
			if (obj14 == null)
			{
				Manipulator val14 = UIHooks.LoadoutPanelControllerFromSkillSlot;
				<>O.<14>__LoadoutPanelControllerFromSkillSlot = val14;
				obj14 = (object)val14;
			}
			Row.FromSkillSlot += (Manipulator)obj14;
			Language.collectLanguageRootFolders += CollectLanguageRootFolders;
			NetworkModCompatibilityHelper.networkModList = NetworkModCompatibilityHelper.networkModList.Append("com.KingEnderBrine.ExtraSkillSlots;1.6.2");
		}

		private void CollectLanguageRootFolders(List<string> folders)
		{
			folders.Add(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "Language"));
		}
	}
	public static class LanguageConsts
	{
		public static readonly string EXTRA_SKILL_SLOTS_FIRST_EXTRA_SKILL = "EXTRA_SKILL_SLOTS_FIRST_EXTRA_SKILL";

		public static readonly string EXTRA_SKILL_SLOTS_SECOND_EXTRA_SKILL = "EXTRA_SKILL_SLOTS_SECOND_EXTRA_SKILL";

		public static readonly string EXTRA_SKILL_SLOTS_THIRD_EXTRA_SKILL = "EXTRA_SKILL_SLOTS_THIRD_EXTRA_SKILL";

		public static readonly string EXTRA_SKILL_SLOTS_FOURTH_EXTRA_SKILL = "EXTRA_SKILL_SLOTS_FOURTH_EXTRA_SKILL";
	}
	public class RewiredAction
	{
		private InputAction inputAction;

		private ActionElementMap _defaultJoystickMap;

		private ActionElementMap _defaultKeyboardMap;

		public static RewiredAction FirstExtraSkill { get; }

		public static RewiredAction SecondExtraSkill { get; }

		public static RewiredAction ThirdExtraSkill { get; }

		public static RewiredAction FourthExtraSkill { get; }

		public int ActionId { get; private set; }

		public string Name { get; private set; }

		public string DisplayToken { get; private set; }

		public KeyboardKeyCode DefaultKeyboardKey { get; private set; }

		public int DefaultJoystickKey { get; private set; }

		public ActionElementMap DefaultJoystickMap
		{
			get
			{
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0021: Expected O, but got Unknown
				//IL_0026: Expected O, but got Unknown
				ActionElementMap obj = _defaultJoystickMap;
				if (obj == null)
				{
					ActionElementMap val = new ActionElementMap(ActionId, (ControllerElementType)1, DefaultJoystickKey, (Pole)0, (AxisRange)0);
					ActionElementMap val2 = val;
					_defaultJoystickMap = val;
					obj = val2;
				}
				return obj;
			}
		}

		public ActionElementMap DefaultKeyboardMap
		{
			get
			{
				//IL_0013: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0020: Expected I4, but got Unknown
				//IL_001b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				//IL_0022: Unknown result type (might be due to invalid IL or missing references)
				//IL_0027: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_002e: Expected O, but got Unknown
				//IL_0033: Expected O, but got Unknown
				ActionElementMap obj = _defaultKeyboardMap;
				if (obj == null)
				{
					ActionElementMap val = new ActionElementMap(ActionId, (ControllerElementType)1, DefaultKeyboardKey - 21)
					{
						_keyboardKeyCode = DefaultKeyboardKey
					};
					ActionElementMap val2 = val;
					_defaultKeyboardMap = val;
					obj = val2;
				}
				return obj;
			}
		}

		static RewiredAction()
		{
			FirstExtraSkill = new RewiredAction
			{
				ActionId = 100,
				Name = "FirstExtraSkill",
				DisplayToken = LanguageConsts.EXTRA_SKILL_SLOTS_FIRST_EXTRA_SKILL,
				DefaultKeyboardKey = (KeyboardKeyCode)49,
				DefaultJoystickKey = 16
			};
			SecondExtraSkill = new RewiredAction
			{
				ActionId = 101,
				Name = "SecondExtraSkill",
				DisplayToken = LanguageConsts.EXTRA_SKILL_SLOTS_SECOND_EXTRA_SKILL,
				DefaultKeyboardKey = (KeyboardKeyCode)50,
				DefaultJoystickKey = 17
			};
			ThirdExtraSkill = new RewiredAction
			{
				ActionId = 102,
				Name = "ThirdExtraSkill",
				DisplayToken = LanguageConsts.EXTRA_SKILL_SLOTS_THIRD_EXTRA_SKILL,
				DefaultKeyboardKey = (KeyboardKeyCode)51,
				DefaultJoystickKey = 18
			};
			FourthExtraSkill = new RewiredAction
			{
				ActionId = 103,
				Name = "FourthExtraSkill",
				DisplayToken = LanguageConsts.EXTRA_SKILL_SLOTS_FOURTH_EXTRA_SKILL,
				DefaultKeyboardKey = (KeyboardKeyCode)52,
				DefaultJoystickKey = 19
			};
		}

		public static implicit operator ActionAxisPair(RewiredAction action)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return new ActionAxisPair(action.Name, (AxisRange)0);
		}

		public static implicit operator InputAction(RewiredAction action)
		{
			//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_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: 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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_0059: Expected O, but got Unknown
			InputAction obj = action.inputAction;
			if (obj == null)
			{
				InputAction val = new InputAction();
				val.QurFqcdYtHIEpCpYBddZfQQtnImHA(action.ActionId);
				val.LEWtVuPGPZtPpCUSAMYCEbPqyAuf(action.Name);
				val.nLGCfekdjaMIxCLlcjdYgcEjEDxz((InputActionType)1);
				val.nfWwbfSEwQCdVSicPaIBIPkMqJfu(action.Name);
				val.MFwTFVDRoziRWNJMARlSUXIebtLw(0);
				val.BSFQAxJApIZsVFnOmINQEGShHPvFb(true);
				val.REsRGcKFtjbUwlqUSreCTUubayPb(0);
				InputAction val2 = val;
				action.inputAction = val;
				obj = val2;
			}
			return obj;
		}
	}
	internal static class UIHooks
	{
		internal static void HUDAwake(orig_Awake orig, HUD self)
		{
			orig.Invoke(self);
			((Component)self).gameObject.AddComponent<ExtraHud>();
		}

		internal static void SettingsPanelControllerStart(orig_Start orig, SettingsPanelController self)
		{
			orig.Invoke(self);
			if (((Object)self).name == "SettingsSubPanel, Controls (M&KB)" || ((Object)self).name == "SettingsSubPanel, Controls (Gamepad)")
			{
				Transform buttonToCopy = ((Component)self).transform.Find("Scroll View/Viewport/VerticalLayout/SettingsEntryButton, Binding (Jump)");
				AddActionBindingToSettings(RewiredAction.FirstExtraSkill.Name, buttonToCopy);
				AddActionBindingToSettings(RewiredAction.SecondExtraSkill.Name, buttonToCopy);
				AddActionBindingToSettings(RewiredAction.ThirdExtraSkill.Name, buttonToCopy);
				AddActionBindingToSettings(RewiredAction.FourthExtraSkill.Name, buttonToCopy);
			}
		}

		internal static void AddActionBindingToSettings(string actionName, Transform buttonToCopy)
		{
			InputBindingControl component = ((Component)Object.Instantiate<Transform>(buttonToCopy, buttonToCopy.parent)).GetComponent<InputBindingControl>();
			component.actionName = actionName;
			component.Awake();
		}

		internal static void LoadoutPanelControllerFromSkillSlot(ILContext il)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			int skillSlotIndex = -1;
			int titleTokenIndex = -1;
			int addWIPIconsIndex = -1;
			val.GotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<SkillLocator>(x, "FindSkillSlot"),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref skillSlotIndex)
			});
			string text = default(string);
			val.GotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdstr(x, ref text),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref titleTokenIndex)
			});
			int num = default(int);
			val.GotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, ref num),
				(Instruction x) => ILPatternMatchingExt.MatchStloc(x, ref addWIPIconsIndex)
			});
			val.GotoNext(new Func<Instruction, bool>[2]
			{
				(Instruction x) => ILPatternMatchingExt.MatchNewobj<ArgumentOutOfRangeException>(x),
				(Instruction x) => ILPatternMatchingExt.MatchThrow(x)
			});
			val.Index += 1;
			val.Remove();
			val.Previous.OpCode = OpCodes.Nop;
			val.Previous.Operand = null;
			val.Emit(OpCodes.Ldloc, skillSlotIndex);
			val.Emit(OpCodes.Call, (MethodBase)typeof(UIHooks).GetMethod("GetSkillSlotName", BindingFlags.Static | BindingFlags.NonPublic));
			val.Emit(OpCodes.Stloc, titleTokenIndex);
			val.Emit(OpCodes.Ldc_I4_0);
			val.Emit(OpCodes.Stloc, addWIPIconsIndex);
		}

		private static string GetSkillSlotName(SkillSlot skillSlot)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Expected I4, but got Unknown
			return (ExtraSkillSlot)(int)skillSlot switch
			{
				ExtraSkillSlot.ExtraFirst => LanguageConsts.EXTRA_SKILL_SLOTS_FIRST_EXTRA_SKILL, 
				ExtraSkillSlot.ExtraSecond => LanguageConsts.EXTRA_SKILL_SLOTS_SECOND_EXTRA_SKILL, 
				ExtraSkillSlot.ExtraThird => LanguageConsts.EXTRA_SKILL_SLOTS_THIRD_EXTRA_SKILL, 
				ExtraSkillSlot.ExtraFourth => LanguageConsts.EXTRA_SKILL_SLOTS_FOURTH_EXTRA_SKILL, 
				_ => throw new ArgumentOutOfRangeException(), 
			};
		}
	}
}