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(),
};
}
}
}