Decompiled source of CrestOptimizer v0.1.1

CrestOptimizer.dll

Decompiled 2 weeks ago
using 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 CrestOptimizer.Settings;
using GlobalSettings;
using HarmonyLib;
using HutongGames.PlayMaker;
using HutongGames.PlayMaker.Actions;
using Microsoft.CodeAnalysis;
using TeamCherry.Localization;
using UnityEngine;

[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("CrestOptimizer")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.1.0")]
[assembly: AssemblyInformationalVersion("0.1.1+c5db21315f09fa0346a9600fdc8ec7d3fe7c139e")]
[assembly: AssemblyProduct("CrestOptimizer")]
[assembly: AssemblyTitle("CrestOptimizer")]
[assembly: NeutralResourcesLanguage("EN")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.1.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 CrestOptimizer
{
	[BepInPlugin("io.github.danielstegink.crestoptimizer", "CrestOptimizer", "0.1.1")]
	public class CrestOptimizer : BaseUnityPlugin
	{
		public const string Id = "io.github.danielstegink.crestoptimizer";

		internal static CrestOptimizer Instance { get; private set; }

		public static string Name => "CrestOptimizer";

		public static string Version => "0.1.1";

		private void Awake()
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			new Harmony("io.github.danielstegink.crestoptimizer").PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Plugin " + Name + " (io.github.danielstegink.crestoptimizer) has loaded!"));
		}

		private void Start()
		{
			ConfigSettings.Initialize(((BaseUnityPlugin)this).Config);
		}

		internal void Log(string message)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)message);
		}
	}
}
namespace CrestOptimizer.Settings
{
	public static class ConfigSettings
	{
		public static ConfigEntry<int> focusHits;

		public static ConfigEntry<float> focusDamage;

		public static ConfigEntry<int> focusHits2;

		public static ConfigEntry<float> focusDamage2;

		public static ConfigEntry<int> focusHits2S;

		public static ConfigEntry<float> focusDamage2S;

		public static ConfigEntry<int> silkCountMultiplier;

		public static ConfigEntry<int> silkValueMultiplier;

		public static ConfigEntry<float> critChance;

		public static ConfigEntry<float> critDamage;

		public static ConfigEntry<bool> replaceTool;

		public static ConfigEntry<bool> downSlashIFrames;

		public static ConfigEntry<int> furyCap;

		public static ConfigEntry<float> bindSizeMultiplier;

		public static ConfigEntry<float> longclawBindSizeMultiplier;

		public static ConfigEntry<int> witchCap;

		public static ConfigEntry<bool> refundSilk;

		public static ConfigEntry<int> scavengerChance;

		public static ConfigEntry<int> craftMaskCount;

		public static ConfigEntry<bool> noDropBind;

		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_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0358: Unknown result type (might be due to invalid IL or missing references)
			//IL_035f: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0440: Unknown result type (might be due to invalid IL or missing references)
			//IL_0447: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0524: Unknown result type (might be due to invalid IL or missing references)
			//IL_052c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0596: Unknown result type (might be due to invalid IL or missing references)
			//IL_059d: Unknown result type (might be due to invalid IL or missing references)
			//IL_060a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0611: Unknown result type (might be due to invalid IL or missing references)
			//IL_067e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0685: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_06f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_075f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0767: Unknown result type (might be due to invalid IL or missing references)
			//IL_07d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_07d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0841: Unknown result type (might be due to invalid IL or missing references)
			//IL_0848: Unknown result type (might be due to invalid IL or missing references)
			//IL_08b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_08ba: Unknown result type (might be due to invalid IL or missing references)
			LocalisedString val = default(LocalisedString);
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_1_NAME");
			LocalisedString val2 = default(LocalisedString);
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_1_DESC");
			int num = 6;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				focusHits = config.Bind<int>("Hunter", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				focusHits = config.Bind<int>("Hunter", "1", num, "1");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_D1_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_D1_DESC");
			float num2 = 1.3f;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				focusDamage = config.Bind<float>("Hunter", LocalisedString.op_Implicit(val), num2, LocalisedString.op_Implicit(val2));
			}
			else
			{
				focusDamage = config.Bind<float>("Hunter", "1", num2, "2s");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_2_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_2_DESC");
			num = 6;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				focusHits2 = config.Bind<int>("Hunter", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				focusHits2 = config.Bind<int>("Hunter", "1", num, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_D2_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_D2_DESC");
			num2 = 1.3f;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				focusDamage2 = config.Bind<float>("Hunter", LocalisedString.op_Implicit(val), num2, LocalisedString.op_Implicit(val2));
			}
			else
			{
				focusDamage2 = config.Bind<float>("Hunter", "1", num2, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_2S_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_2S_DESC");
			num = 6;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				focusHits2S = config.Bind<int>("Hunter", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				focusHits2S = config.Bind<int>("Hunter", "1", num, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_D2S_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FOCUS_D2S_DESC");
			num2 = 1.5f;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				focusDamage2S = config.Bind<float>("Hunter", LocalisedString.op_Implicit(val), num2, LocalisedString.op_Implicit(val2));
			}
			else
			{
				focusDamage2S = config.Bind<float>("Hunter", "1", num2, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "SILK_COUNT_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "SILK_COUNT_DESC");
			num = 1;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				silkCountMultiplier = config.Bind<int>("Reaper", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				silkCountMultiplier = config.Bind<int>("Reaper", "1", num, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "SILK_VALUE_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "SILK_VALUE_DESC");
			num = 1;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				silkValueMultiplier = config.Bind<int>("Reaper", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				silkValueMultiplier = config.Bind<int>("Reaper", "1", num, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "CRIT_CHANCE_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "CRIT_CHANCE_DESC");
			num2 = 2f;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				critChance = config.Bind<float>("Wanderer", LocalisedString.op_Implicit(val), num2, LocalisedString.op_Implicit(val2));
			}
			else
			{
				critChance = config.Bind<float>("Wanderer", "1", num2, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "CRIT_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "CRIT_DESC");
			num2 = 3f;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				critDamage = config.Bind<float>("Wanderer", LocalisedString.op_Implicit(val), num2, LocalisedString.op_Implicit(val2));
			}
			else
			{
				critDamage = config.Bind<float>("Wanderer", "1", num2, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "WANDERER_SLOT_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "WANDERER_SLOT_DESC");
			bool flag = false;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				replaceTool = config.Bind<bool>("Wanderer", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2));
			}
			else
			{
				replaceTool = config.Bind<bool>("Wanderer", "1", flag, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "POGO_INV_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "POGO_INV_DESC");
			flag = false;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				downSlashIFrames = config.Bind<bool>("Beast", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2));
			}
			else
			{
				downSlashIFrames = config.Bind<bool>("Beast", "Down Slash I-Frames", flag, "Applies invulnerability at the start of down-slashing with the Beast Crest");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FURY_CAP_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "FURY_CAP_DESC");
			num = 3;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				furyCap = config.Bind<int>("Beast", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				furyCap = config.Bind<int>("Beast", "Fury Heal Cap", num, "Maximum Masks that can be healed using Beast Crest's Fury mode");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "BIND_SIZE_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "BIND_SIZE_DESC");
			num2 = 1f;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				bindSizeMultiplier = config.Bind<float>("Witch", LocalisedString.op_Implicit(val), num2, LocalisedString.op_Implicit(val2));
			}
			else
			{
				bindSizeMultiplier = config.Bind<float>("Witch", "1", num2, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "LN_BIND_SIZE_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "LN_BIND_SIZE_DESC");
			num2 = 1f;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				longclawBindSizeMultiplier = config.Bind<float>("Witch", LocalisedString.op_Implicit(val), num2, LocalisedString.op_Implicit(val2));
			}
			else
			{
				longclawBindSizeMultiplier = config.Bind<float>("Witch", "Witch Bind Multiplier (Longclaw)", num2, "How much to enlarge Witch Crest's tentacle bind with longclaw equipped");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "WITCH_CAP_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "WITCH_CAP_DESC");
			num = 3;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				witchCap = config.Bind<int>("Witch", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				witchCap = config.Bind<int>("Witch", "Witch Heal Cap", num, "Maximum Masks that can be healed using Witch Crest");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "WITCH_REFUND_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "WITCH_REFUND_DESC");
			flag = false;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				refundSilk = config.Bind<bool>("Witch", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2));
			}
			else
			{
				refundSilk = config.Bind<bool>("Witch", "With Silk Refund", flag, "Refund some Silk on a failed bind");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "SHARD_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "SHARD_DESC");
			num = 0;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				scavengerChance = config.Bind<int>("Architect", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				scavengerChance = config.Bind<int>("Architect", "1", num, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "CRAFT_MASK_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "CRAFT_MASK_DESC");
			num = 0;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				craftMaskCount = config.Bind<int>("Architect", LocalisedString.op_Implicit(val), num, LocalisedString.op_Implicit(val2));
			}
			else
			{
				craftMaskCount = config.Bind<int>("Architect", "1", num, "2");
			}
			((LocalisedString)(ref val))..ctor("Mods.io.github.danielstegink.crestoptimizer", "NO_DROP_NAME");
			((LocalisedString)(ref val2))..ctor("Mods.io.github.danielstegink.crestoptimizer", "NO_DROP_DESC");
			flag = false;
			if (((LocalisedString)(ref val)).Exists && ((LocalisedString)(ref val2)).Exists)
			{
				noDropBind = config.Bind<bool>("Shaman", LocalisedString.op_Implicit(val), flag, LocalisedString.op_Implicit(val2));
			}
			else
			{
				noDropBind = config.Bind<bool>("Shaman", "1", flag, "2");
			}
		}
	}
	public static class SharedData
	{
		public static float witchBindMultiplier = 1f;
	}
}
namespace CrestOptimizer.Helpers
{
	[HarmonyPatch(typeof(BoolTest), "OnEnter")]
	public static class BoolTest_OnEnter
	{
		[HarmonyPrefix]
		public static void Prefix(BoolTest __instance)
		{
			if (IsShamanDropCheck(__instance) && ConfigSettings.noDropBind.Value)
			{
				__instance.boolVariable.Value = false;
			}
		}

		[HarmonyPostfix]
		public static void Postfix(BoolTest __instance)
		{
			if (IsShamanDropCheck(__instance))
			{
				__instance.boolVariable.Value = HeroController.instance.IsShamanCrestEquipped();
			}
		}

		private static bool IsShamanDropCheck(BoolTest __instance)
		{
			if (((FsmStateAction)__instance).State.Name.Equals("Bind Air") && ((FsmStateAction)__instance).Fsm.Name.Equals("Bind"))
			{
				return ((NamedVariable)__instance.boolVariable).Name.Equals("Is Shaman Equipped");
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(FsmState), "OnExit")]
	public static class FsmState_OnExit
	{
		private static int prevHealth;

		[HarmonyPostfix]
		public static void Postfix(FsmState __instance)
		{
			if (__instance.Name.Equals("SpinBall Antic") && __instance.Fsm.Name.Equals("Crest Attacks") && ConfigSettings.downSlashIFrames.Value)
			{
				HeroController.instance.StartDownspikeInvulnerabilityLong();
			}
			if (__instance.Name.Equals("Bind Start") && __instance.Fsm.Name.Equals("Bind"))
			{
				prevHealth = PlayerData.instance.GetInt("health");
			}
			if (__instance.Name.Equals("End Bind") && __instance.Fsm.Name.Equals("Bind") && PlayerData.instance.GetInt("health") <= prevHealth && ConfigSettings.refundSilk.Value && ((ToolBase)Gameplay.WitchCrest).IsEquipped)
			{
				HeroController.instance.AddSilk(5, true);
			}
			if (__instance.Name.Equals("Quick Craft Burst") && __instance.Fsm.Name.Equals("Bind") && ConfigSettings.craftMaskCount.Value > 0)
			{
				HeroController.instance.AddHealth(ConfigSettings.craftMaskCount.Value);
			}
		}
	}
	[HarmonyPatch(typeof(HealthManager), "TakeDamage")]
	public static class HealthManager_TakeDamage
	{
		[HarmonyPostfix]
		public static void Postfix(HealthManager __instance, ref HitInstance hitInstance)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			if (HeroController.instance.IsArchitectCrestEquipped() && hitInstance.DamageDealt > 0)
			{
				int num = 0;
				int num2;
				for (num2 = ConfigSettings.scavengerChance.Value; num2 >= 100; num2 -= 100)
				{
					num++;
				}
				if (Random.Range(1, 101) <= num2)
				{
					num++;
				}
				Config val = default(Config);
				val.Prefab = Gameplay.ShellShardPrefab;
				val.AmountMin = num;
				val.AmountMax = num;
				val.SpeedMin = 15f;
				val.SpeedMax = 30f;
				val.AngleMin = 80f;
				val.AngleMax = 100f;
				FlingUtils.SpawnAndFlingShellShards(val, ((Component)__instance).transform, Vector3.zero, (List<GameObject>)null);
			}
		}
	}
	[HarmonyPatch(typeof(HeroController), "AddSilkParts", new Type[] { typeof(int) })]
	public static class HeroController_AddSilkParts
	{
		[HarmonyPrefix]
		public static void Prefix(HeroController __instance, ref int amount)
		{
			amount *= ConfigSettings.silkValueMultiplier.Value;
		}
	}
	[HarmonyPatch(typeof(HeroController), "Start")]
	public static class HeroController_Start
	{
		[HarmonyPostfix]
		public static void Postfix(HeroController __instance)
		{
			SharedData.witchBindMultiplier = 1f;
		}
	}
	[HarmonyPatch(typeof(HeroController), "Update")]
	public static class HeroController_Update
	{
		[HarmonyPostfix]
		public static void Postfix(HeroController __instance)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: 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)
			ToolCrest crestByName = ToolItemManager.GetCrestByName("Wanderer");
			if ((Object)(object)crestByName != (Object)null)
			{
				ToolItemType val = (ToolItemType)((!ConfigSettings.replaceTool.Value) ? 2 : 0);
				if (val != crestByName.Slots[4].Type)
				{
					crestByName.Slots[4].Type = val;
					__instance.UpdateConfig();
				}
			}
			BuffTentacles();
		}

		private static void BuffTentacles()
		{
			//IL_00c8: 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_00e0: 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_00f8: Unknown result type (might be due to invalid IL or missing references)
			float value = ConfigSettings.bindSizeMultiplier.Value;
			if (((ToolBase)Gameplay.LongNeedleTool).IsEquipped)
			{
				value = ConfigSettings.longclawBindSizeMultiplier.Value;
			}
			if (SharedData.witchBindMultiplier == value || (Object)(object)GameObject.Find("Bind Effects") == (Object)null)
			{
				return;
			}
			GameObject val = GameObject.Find("Witch Bind");
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			Transform[] componentsInChildren = val.GetComponentsInChildren<Transform>();
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				GameObject gameObject = ((Component)componentsInChildren[i]).gameObject;
				if (((Object)gameObject).name.Contains("Damager") || ((Object)gameObject).name.Contains("Tendril"))
				{
					GameObject gameObject2 = ((Component)gameObject.transform.parent).gameObject;
					if ((Object)(object)gameObject2 != (Object)null && ((Object)gameObject2).name.Equals("Witch Bind"))
					{
						_ = gameObject.transform.localScale;
						Transform transform = gameObject.transform;
						transform.localScale /= SharedData.witchBindMultiplier;
						Transform transform2 = gameObject.transform;
						transform2.localScale *= value;
					}
				}
			}
			SharedData.witchBindMultiplier = value;
		}
	}
}
namespace CrestOptimizer.Helpers.Getters_HeroController
{
	[HarmonyPatch(typeof(HeroController), "GetRageModeHealCap")]
	public static class HeroController_GetRageModeHealCap
	{
		[HarmonyPostfix]
		public static void Postfix(HeroController __instance, ref int __result)
		{
			int num = ConfigSettings.furyCap.Value;
			if (((ToolBase)Gameplay.MultibindTool).IsEquipped)
			{
				num++;
			}
			__result = num;
		}
	}
	[HarmonyPatch(typeof(HeroController), "GetReaperPayout")]
	public static class HeroController_GetReaperPayout
	{
		[HarmonyPostfix]
		public static void Postfix(HeroController __instance, ref int __result)
		{
			__result *= ConfigSettings.silkCountMultiplier.Value;
		}
	}
	[HarmonyPatch(typeof(HeroController), "GetWitchHealCap")]
	public static class HeroController_GetWitchHealCap
	{
		[HarmonyPostfix]
		public static void Postfix(HeroController __instance, ref int __result)
		{
			int num = ConfigSettings.witchCap.Value;
			if (((ToolBase)Gameplay.MultibindTool).IsEquipped)
			{
				num++;
			}
			__result = num;
		}
	}
}
namespace CrestOptimizer.Helpers.Getters_Gameplay
{
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_HunterCombo2DamageMult
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref float __result)
		{
			__result = ConfigSettings.focusDamage2.Value;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_HunterCombo2ExtraDamageMult
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref float __result)
		{
			__result = ConfigSettings.focusDamage2S.Value;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_HunterCombo2ExtraHits
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref int __result)
		{
			__result = ConfigSettings.focusHits2S.Value;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_HunterCombo2Hits
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref int __result)
		{
			__result = ConfigSettings.focusHits2.Value;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_HunterComboDamageMult
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref float __result)
		{
			__result = ConfigSettings.focusDamage.Value;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_HunterComboHits
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref int __result)
		{
			__result = ConfigSettings.focusHits.Value;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_WandererCritChance
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref float __result)
		{
			__result = ConfigSettings.critChance.Value / 100f;
		}
	}
	[HarmonyPatch(/*Could not decode attribute arguments.*/)]
	public static class Gameplay_WandererCritMultiplier
	{
		[HarmonyPostfix]
		public static void Postfix(Gameplay __instance, ref float __result)
		{
			__result = ConfigSettings.critDamage.Value;
		}
	}
}