Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SilklessSkills v0.1.0
SilklessSkills.dll
Decompiled 5 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using Microsoft.CodeAnalysis; using SilklessSkills.Settings; using TeamCherry.Localization; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("SilklessSkills")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.1.0.0")] [assembly: AssemblyInformationalVersion("0.1.0+f291d1d083d446fb29547194229eeae45a244e69")] [assembly: AssemblyProduct("SilklessSkills")] [assembly: AssemblyTitle("SilklessSkills")] [assembly: NeutralResourcesLanguage("EN")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Microsoft.CodeAnalysis.Embedded] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Microsoft.CodeAnalysis.Embedded] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace Microsoft.CodeAnalysis { [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace SilklessSkills { public static class SharedData { } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("io.github.danielstegink.silklessskills", "SilklessSkills", "0.1.0")] public class SilklessSkills : BaseUnityPlugin { internal static SilklessSkills instance; public const string Id = "io.github.danielstegink.silklessskills"; public static string Name => "SilklessSkills"; public static string Version => "0.1.0"; private void Awake() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) instance = this; new Harmony("io.github.danielstegink.silklessskills").PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)("Plugin " + Name + " (io.github.danielstegink.silklessskills) has loaded!")); } private void Start() { ConfigSettings.Initialize(((BaseUnityPlugin)this).Config); } internal void Log(string message) { ((BaseUnityPlugin)this).Logger.LogInfo((object)message); } } } namespace SilklessSkills.Settings { public static class ConfigSettings { public static ConfigEntry<bool> tauntFlag; public static ConfigEntry<bool> harpoonFlag; public static ConfigEntry<bool> superJumpFlag; public static ConfigEntry<bool> needolinFlag; public static ConfigEntry<bool> speedFlag; public static ConfigEntry<bool> gunFlag; public static ConfigEntry<bool> trapFlag; public static ConfigEntry<bool> lanternFlag; public static void Initialize(ConfigFile config) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02d7: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Unknown result type (might be due to invalid IL or missing references) bool flag = true; LocalisedString val = default(LocalisedString); ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "TAUNT_NAME"); LocalisedString val2 = default(LocalisedString); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "TAUNT_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { tauntFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { tauntFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "HARPOON_NAME"); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "HARPOON_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { harpoonFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { harpoonFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "SUPER_JUMP_NAME"); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "SUPER_JUMP_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { superJumpFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { superJumpFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "NEEDOLIN_NAME"); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "NEEDOLIN_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { needolinFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { needolinFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "SPEED_NAME"); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "SPEED_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { speedFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { speedFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "GUN_NAME"); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "GUN_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { gunFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { gunFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "TRAP_NAME"); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "TRAP_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { trapFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { trapFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } ((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.silklessskills", "LANTERN_NAME"); ((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.silklessskills", "LANTERN_DESC"); if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists) { lanternFlag = config.Bind<bool>("Modifier", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2)); } else { lanternFlag = config.Bind<bool>("Modifier", "1", flag, "2"); } } } public enum SilkSkills { Taunt, Clawline, SilkSoar, Needolin, SilkspeedAnklets, Silkshot, SnareSetter, WispfireLantern, None } } namespace SilklessSkills.Helpers { [HarmonyPatch(typeof(AddUsingSilk), "OnEnter")] public static class AddUsingSilk_OnEnter { private static Dictionary<SilkSkills, int?> silkCosts = new Dictionary<SilkSkills, int?>(); [HarmonyPrefix] public static void Prefix(AddUsingSilk __instance) { if (NegateCost(__instance, out var skill)) { if (!silkCosts.ContainsKey(skill)) { silkCosts.Add(skill, null); } silkCosts[skill] = __instance.Amount.value; __instance.Amount.Value = 0; } } [HarmonyPostfix] public static void Postfix(AddUsingSilk __instance) { SilkSkills currentSkill = GetCurrentSkill(__instance); if (silkCosts.ContainsKey(currentSkill) && silkCosts[currentSkill].HasValue) { __instance.Amount.Value = silkCosts[currentSkill].Value; silkCosts[currentSkill] = null; } } private static bool NegateCost(AddUsingSilk __instance, out SilkSkills skill) { skill = GetCurrentSkill(__instance); return skill switch { SilkSkills.SilkSoar => ConfigSettings.superJumpFlag.Value, SilkSkills.Needolin => ConfigSettings.needolinFlag.Value, SilkSkills.SilkspeedAnklets => ConfigSettings.speedFlag.Value, _ => false, }; } private static SilkSkills GetCurrentSkill(AddUsingSilk __instance) { if (((FsmStateAction)__instance).fsm.name.Equals("Superjump") && ((FsmStateAction)__instance).State.name.Equals("Ground Charge")) { return SilkSkills.SilkSoar; } if (((FsmStateAction)__instance).State.Name.Equals("Start Needolin Proper") || ((FsmStateAction)__instance).State.Name.Equals("Resume Fast Travel Fail React")) { return SilkSkills.Needolin; } if (((FsmStateAction)__instance).Fsm.Name.Equals("Sprint Silk Usage") && ((FsmStateAction)__instance).State.Name.Equals("Usage")) { return SilkSkills.SilkspeedAnklets; } return SilkSkills.None; } } [HarmonyPatch(typeof(CallMethodProper), "OnEnter")] public static class CallMethodProper_OnEnter { private static Dictionary<SilkSkills, int?> silkCosts = new Dictionary<SilkSkills, int?>(); [HarmonyPrefix] public static void Prefix(CallMethodProper __instance) { if (NegateCost(__instance, out var skill)) { if (!silkCosts.ContainsKey(skill)) { silkCosts.Add(skill, null); } silkCosts[skill] = __instance.parameters[0].intValue; __instance.parameters[0].intValue = 0; } } [HarmonyPostfix] public static void Postfix(CallMethodProper __instance) { SilkSkills currentSkill = GetCurrentSkill(__instance); if (silkCosts.ContainsKey(currentSkill) && silkCosts[currentSkill].HasValue) { __instance.parameters[0].intValue = silkCosts[currentSkill].Value; silkCosts[currentSkill] = null; } } private static bool NegateCost(CallMethodProper __instance, out SilkSkills skill) { skill = GetCurrentSkill(__instance); return skill switch { SilkSkills.Silkshot => ConfigSettings.gunFlag.Value, SilkSkills.SnareSetter => ConfigSettings.trapFlag.Value, _ => false, }; } private static SilkSkills GetCurrentSkill(CallMethodProper __instance) { if (((FsmStateAction)__instance).State.Name.Equals("Silk? F") || ((FsmStateAction)__instance).State.Name.Equals("Silk? A")) { return SilkSkills.Silkshot; } if (((FsmStateAction)__instance).State.Name.Equals("Snare Grnd Check")) { return SilkSkills.SnareSetter; } return SilkSkills.None; } } [HarmonyPatch(typeof(HeroController), "TakeSilk", new Type[] { typeof(int), typeof(SilkTakeSource) })] public static class HeroController_TakeSilk { [HarmonyPrefix] public static void Prefix(HeroController __instance, ref int amount, SilkTakeSource source) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 if (ConfigSettings.lanternFlag.Value && (int)source == 1) { amount = 0; } } } [HarmonyPatch(typeof(IntCompare), "OnEnter")] public static class IntCompare_OnEnter { private static Dictionary<SilkSkills, int?> silkCosts = new Dictionary<SilkSkills, int?>(); [HarmonyPrefix] public static void Prefix(IntCompare __instance) { if (NegateCost(__instance, out var skill)) { if (!silkCosts.ContainsKey(skill)) { silkCosts.Add(skill, null); } silkCosts[skill] = __instance.integer1.Value; __instance.integer1.Value = Math.Max(__instance.integer1.Value, __instance.integer2.Value + 1); } } [HarmonyPostfix] public static void Postfix(IntCompare __instance) { SilkSkills currentSkill = GetCurrentSkill(__instance); if (silkCosts.ContainsKey(currentSkill) && silkCosts[currentSkill].HasValue) { __instance.integer1.Value = silkCosts[currentSkill].Value; silkCosts[currentSkill] = null; } } private static bool NegateCost(IntCompare __instance, out SilkSkills skill) { skill = GetCurrentSkill(__instance); return skill switch { SilkSkills.Clawline => ConfigSettings.harpoonFlag.Value, SilkSkills.SilkSoar => ConfigSettings.superJumpFlag.Value, SilkSkills.SilkspeedAnklets => ConfigSettings.speedFlag.Value, SilkSkills.Silkshot => ConfigSettings.gunFlag.Value, SilkSkills.SnareSetter => ConfigSettings.trapFlag.Value, _ => false, }; } private static SilkSkills GetCurrentSkill(IntCompare __instance) { if (((FsmStateAction)__instance).fsm.name.Equals("Harpoon Dash") && ((FsmStateAction)__instance).State.name.Equals("Can Do?")) { return SilkSkills.Clawline; } if (((FsmStateAction)__instance).fsm.name.Equals("Superjump") && ((FsmStateAction)__instance).State.name.Equals("Enough Silk?") && ConfigSettings.superJumpFlag.Value) { return SilkSkills.SilkSoar; } if (((FsmStateAction)__instance).Fsm.Name.Equals("Sprint Silk Usage") && (((FsmStateAction)__instance).State.name.Equals("Start Usage") || ((FsmStateAction)__instance).State.name.Equals("Usage") || ((FsmStateAction)__instance).State.name.Equals("Pause Usage"))) { return SilkSkills.SilkspeedAnklets; } if (((FsmStateAction)__instance).State.name.Equals("Silk? F") || ((FsmStateAction)__instance).State.name.Equals("Silk? A")) { return SilkSkills.Silkshot; } if (((FsmStateAction)__instance).State.name.Equals("Silk? Snare")) { return SilkSkills.SnareSetter; } return SilkSkills.None; } } [HarmonyPatch(typeof(PlayerdataIntCompare), "OnEnter")] public static class PlayerdataIntCompare_OnEnter { private static Dictionary<SilkSkills, int?> silkCosts = new Dictionary<SilkSkills, int?>(); [HarmonyPrefix] public static void Prefix(PlayerdataIntCompare __instance) { if (NegateCost(__instance, out var skill)) { if (!silkCosts.ContainsKey(skill)) { silkCosts.Add(skill, null); } silkCosts[skill] = __instance.compareTo.Value; __instance.compareTo.Value = 0; } } [HarmonyPostfix] public static void Postfix(PlayerdataIntCompare __instance) { SilkSkills currentSkill = GetCurrentSkill(__instance); if (silkCosts.ContainsKey(currentSkill) && silkCosts[currentSkill].HasValue) { __instance.compareTo.Value = silkCosts[currentSkill].Value; silkCosts[currentSkill] = null; } } private static bool NegateCost(PlayerdataIntCompare __instance, out SilkSkills skill) { skill = GetCurrentSkill(__instance); if (skill == SilkSkills.Taunt) { return ConfigSettings.tauntFlag.Value; } return false; } private static SilkSkills GetCurrentSkill(PlayerdataIntCompare __instance) { if (((FsmStateAction)__instance).fsm.name.Equals("Silk Specials") && ((FsmStateAction)__instance).State.name.Equals("Silk Check")) { return SilkSkills.Taunt; } return SilkSkills.None; } } [HarmonyPatch(typeof(RemoveUsingSilk), "OnEnter")] public static class RemoveUsingSilk_OnEnter { private static Dictionary<SilkSkills, int?> silkCosts = new Dictionary<SilkSkills, int?>(); [HarmonyPrefix] public static void Prefix(RemoveUsingSilk __instance) { if (NegateCost(__instance, out var skill)) { if (!silkCosts.ContainsKey(skill)) { silkCosts.Add(skill, null); } silkCosts[skill] = __instance.Amount.value; __instance.Amount.Value = 0; } } [HarmonyPostfix] public static void Postfix(RemoveUsingSilk __instance) { SilkSkills currentSkill = GetCurrentSkill(__instance); if (silkCosts.ContainsKey(currentSkill) && silkCosts[currentSkill].HasValue) { __instance.Amount.Value = silkCosts[currentSkill].Value; silkCosts[currentSkill] = null; } } private static bool NegateCost(RemoveUsingSilk __instance, out SilkSkills skill) { skill = GetCurrentSkill(__instance); return skill switch { SilkSkills.Needolin => ConfigSettings.needolinFlag.Value, SilkSkills.SilkSoar => ConfigSettings.superJumpFlag.Value, SilkSkills.SilkspeedAnklets => ConfigSettings.speedFlag.Value, _ => false, }; } private static SilkSkills GetCurrentSkill(RemoveUsingSilk __instance) { if (((FsmStateAction)__instance).State.Name.Equals("Next Chunk?") || ((FsmStateAction)__instance).State.Name.Equals("Next Chunk? 2") || ((FsmStateAction)__instance).State.Name.Equals("End Needolin")) { return SilkSkills.Needolin; } if (((FsmStateAction)__instance).fsm.name.Equals("Superjump") && (((FsmStateAction)__instance).State.name.Equals("Cancel Ground Charge") || ((FsmStateAction)__instance).State.name.Equals("Ground Charged"))) { return SilkSkills.SilkSoar; } if (((FsmStateAction)__instance).Fsm.Name.Equals("Sprint Silk Usage") && (((FsmStateAction)__instance).State.Name.Equals("Use Silk") || ((FsmStateAction)__instance).State.Name.Equals("Pause Usage") || ((FsmStateAction)__instance).State.Name.Equals("StopUsage"))) { return SilkSkills.SilkspeedAnklets; } return SilkSkills.None; } } [HarmonyPatch(typeof(TakeSilkV2), "OnEnter")] public static class TakeSilkV2_OnEnter { private static Dictionary<SilkSkills, int?> silkCosts = new Dictionary<SilkSkills, int?>(); [HarmonyPrefix] public static void Prefix(TakeSilkV2 __instance) { if (NegateCost(__instance, out var skill)) { if (!silkCosts.ContainsKey(skill)) { silkCosts.Add(skill, null); } silkCosts[skill] = __instance.Amount.value; __instance.Amount.Value = 0; } } [HarmonyPostfix] public static void Postfix(TakeSilkV2 __instance) { SilkSkills currentSkill = GetCurrentSkill(__instance); if (silkCosts.ContainsKey(currentSkill) && silkCosts[currentSkill].HasValue) { __instance.Amount.Value = silkCosts[currentSkill].Value; silkCosts[currentSkill] = null; } } private static bool NegateCost(TakeSilkV2 __instance, out SilkSkills skill) { skill = GetCurrentSkill(__instance); return skill switch { SilkSkills.SilkSoar => ConfigSettings.superJumpFlag.Value, SilkSkills.Needolin => ConfigSettings.needolinFlag.Value, SilkSkills.SilkspeedAnklets => ConfigSettings.speedFlag.Value, SilkSkills.Silkshot => ConfigSettings.gunFlag.Value, _ => false, }; } private static SilkSkills GetCurrentSkill(TakeSilkV2 __instance) { if (((FsmStateAction)__instance).fsm.name.Equals("Superjump") && ((FsmStateAction)__instance).State.name.Equals("Ground Charged")) { return SilkSkills.SilkSoar; } if (((FsmStateAction)__instance).State.Name.Equals("Next Chunk?") || ((FsmStateAction)__instance).State.Name.Equals("Next Chunk? 2")) { return SilkSkills.Needolin; } if (((FsmStateAction)__instance).Fsm.Name.Equals("Sprint Silk Usage") && ((FsmStateAction)__instance).State.Name.Equals("Use Silk")) { return SilkSkills.SilkspeedAnklets; } if (((FsmStateAction)__instance).State.Name.Equals("WebShot Antic W")) { return SilkSkills.Silkshot; } return SilkSkills.None; } } [HarmonyPatch(typeof(TakeSilk), "OnEnter")] public static class TakeSilk_OnEnter { private static Dictionary<SilkSkills, int?> silkCosts = new Dictionary<SilkSkills, int?>(); [HarmonyPrefix] public static void Prefix(TakeSilk __instance) { if (NegateCost(__instance, out var skill)) { if (!silkCosts.ContainsKey(skill)) { silkCosts.Add(skill, null); } silkCosts[skill] = __instance.amount.Value; __instance.amount.Value = 0; } } [HarmonyPostfix] public static void Postfix(TakeSilk __instance) { SilkSkills currentSkill = GetCurrentSkill(__instance); if (silkCosts.ContainsKey(currentSkill) && silkCosts[currentSkill].HasValue) { __instance.amount.Value = silkCosts[currentSkill].Value; silkCosts[currentSkill] = null; } } private static bool NegateCost(TakeSilk __instance, out SilkSkills skill) { skill = GetCurrentSkill(__instance); return skill switch { SilkSkills.Taunt => ConfigSettings.tauntFlag.Value, SilkSkills.Clawline => ConfigSettings.harpoonFlag.Value, SilkSkills.Needolin => ConfigSettings.needolinFlag.Value, _ => false, }; } private static SilkSkills GetCurrentSkill(TakeSilk __instance) { if (((FsmStateAction)__instance).Fsm.Name.Equals("Silk Specials") && ((FsmStateAction)__instance).State.Name.Equals("Silk Taunt")) { return SilkSkills.Taunt; } if (((FsmStateAction)__instance).Fsm.Name.Equals("Harpoon Dash") && ((FsmStateAction)__instance).State.Name.Equals("Take Control")) { return SilkSkills.Clawline; } if (((FsmStateAction)__instance).State.Name.Equals("Take Silk End")) { return SilkSkills.Needolin; } return SilkSkills.None; } } }