Decompiled source of Needleforge v0.9.0
Needleforge.dll
Decompiled 4 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using GlobalSettings; using HarmonyLib; using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using InControl; using Microsoft.CodeAnalysis; using Needleforge.Attacks; using Needleforge.Components; using Needleforge.Data; using Needleforge.Makers; using Needleforge.Patches.HUD; using Needleforge.Utils; using PrepatcherPlugin; using Silksong.FsmUtil; using Silksong.FsmUtil.Actions; using TeamCherry.Localization; using TeamCherry.NestedFadeGroup; using TeamCherry.SharedUtils; using UnityEngine; using UnityEngine.Events; [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("Needleforge")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.9.0.0")] [assembly: AssemblyInformationalVersion("0.9.0+3c5214ad51d3069bf5a4c54f8eda259689187696")] [assembly: AssemblyProduct("Needleforge")] [assembly: AssemblyTitle("Needleforge")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/GamingInfinite/Needleforge")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.9.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [CompilerGenerated] internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T> { object IEnumerator.Current => _item; T IEnumerator<T>.Current => _item; public Enumerator(T item) { _item = item; } bool IEnumerator.MoveNext() { if (!_moveNextCalled) { return _moveNextCalled = true; } return false; } void IEnumerator.Reset() { _moveNextCalled = false; } void IDisposable.Dispose() { } } int ICollection.Count => 1; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => 1; T IReadOnlyList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } } int ICollection<T>.Count => 1; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } public <>z__ReadOnlySingleElementList(T item) { _item = item; } IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(_item); } void ICollection.CopyTo(Array array, int index) { array.SetValue(_item, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return EqualityComparer<T>.Default.Equals(_item, (T)value); } int IList.IndexOf(object value) { if (!EqualityComparer<T>.Default.Equals(_item, (T)value)) { return -1; } return 0; } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return new Enumerator(_item); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return EqualityComparer<T>.Default.Equals(_item, item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { array[arrayIndex] = _item; } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { if (!EqualityComparer<T>.Default.Equals(_item, item)) { return -1; } return 0; } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } } 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 Needleforge { internal static class ModHelper { public static void Log(string msg) { NeedleforgePlugin.logger.LogInfo((object)msg); } public static void LogError(string msg) { LogError(msg, stackTrace: false); } public static void LogError(string msg, bool stackTrace) { if (stackTrace) { msg = $"{msg}\n{new StackTrace(1, fNeedFileInfo: true)}"; } NeedleforgePlugin.logger.LogError((object)msg); } public static void LogWarning(string msg) { LogWarning(msg, stackTrace: false); } public static void LogWarning(string msg, bool stackTrace) { if (stackTrace) { msg = $"{msg}\n{new StackTrace(1, fNeedFileInfo: true)}"; } NeedleforgePlugin.logger.LogWarning((object)msg); } } [BepInPlugin("io.github.needleforge", "Needleforge", "0.9.0")] public class NeedleforgePlugin : BaseUnityPlugin { internal static ManualLogSource logger; internal static Harmony harmony; internal static List<ToolData> newToolData = new List<ToolData>(); internal static List<CrestData> newCrestData = new List<CrestData>(); internal static List<ToolCrest> newCrests = new List<ToolCrest>(); internal static List<ToolItem> newTools = new List<ToolItem>(); internal static ObservableCollection<ColorData> newColors = new ObservableCollection<ColorData>(); internal static Dictionary<string, GameObject> hudRoots = new Dictionary<string, GameObject>(); internal static Dictionary<string, CrestData.BindEventHandler> bindEvents = new Dictionary<string, CrestData.BindEventHandler>(); internal static Dictionary<string, Action> bindCompleteEvents = new Dictionary<string, Action>(); internal static Dictionary<string, UniqueBindEvent> uniqueBind = new Dictionary<string, UniqueBindEvent>(); internal static Dictionary<string, Action> toolEventHooks = new Dictionary<string, Action>(); public static readonly ColorData GreenTools = AddToolColor("Green", new Color(0.57f, 0.86f, 0.59f, 1f)); public static readonly ColorData PinkTools = AddToolColor("Pink", new Color(1f, 0.59f, 0.78f, 1f), isAttackType: true); public static readonly ColorData BlackTools = AddToolColor("Black", new Color(0.4f, 0.4f, 0.4f, 1f), isAttackType: true); public const string Id = "io.github.needleforge"; public static string Name => "Needleforge"; public static string Version => "0.9.0"; private void Awake() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown logger = ((BaseUnityPlugin)this).Logger; ((BaseUnityPlugin)this).Logger.LogInfo((object)("Plugin " + Name + " (io.github.needleforge) has loaded!")); harmony = new Harmony("io.github.needleforge"); harmony.PatchAll(); newColors.CollectionChanged += NewColors_CollectionChanged; GreenTools.AddValidTypes((ToolItemType)2, (ToolItemType)1); PinkTools.AddValidTypes(default(ToolItemType), (ToolItemType)3); BlackTools.allColorsValid = true; } private void NewColors_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { InventoryToolCrest.TOOL_TYPES = (ToolItemType[])Enum.GetValues(typeof(ToolItemType)); } public static ToolData? GetToolDataByName(string name) { string name2 = name; return newToolData.FirstOrDefault((ToolData t) => t.name == name2); } public static ColorData AddToolColor(string name, Color color, bool isAttackType = false) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) ColorData colorData = new ColorData { name = name, color = color, isAttackType = isAttackType }; newColors.Add(colorData); return colorData; } public static LiquidToolData AddLiquidTool(string name, int maxRefills, int storageAmount, string InfiniteRefillsPD, Color liquidColor, ReplenishResources resource, ReplenishUsages replenishUsage, float replenishMult, StateSprites? fullSprites, StateSprites? emptySprites, string clip = "Charge Up") { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) LiquidToolData data = new LiquidToolData { type = (ToolItemType)0, name = name, color = liquidColor, maxRefills = maxRefills, storageAmount = storageAmount, infiniteRefills = InfiniteRefillsPD, clip = clip, resource = resource, replenishUsage = replenishUsage, replenishMult = replenishMult, FullSprites = fullSprites, EmptySprites = emptySprites }; newToolData.Add(data); toolEventHooks[data.name + " BEFORE ANIM"] = delegate { ModHelper.Log("BEFORE ANIM for " + data.name); }; toolEventHooks[data.name + " AFTER ANIM"] = delegate { ModHelper.Log("AFTER ANIM for " + data.name); }; return data; } public static LiquidToolData AddLiquidTool(string name, int maxRefills, int storageAmount, string InfiniteRefillsPD, Color liquidColor, ReplenishResources resource, ReplenishUsages replenishUsage, float replenishMult) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return AddLiquidTool(name, maxRefills, storageAmount, InfiniteRefillsPD, liquidColor, resource, replenishUsage, replenishMult, null, null); } public static LiquidToolData AddLiquidTool(string name, int maxRefills, int storageAmount, string InfiniteRefillsPD, Color liquidColor) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) return AddLiquidTool(name, maxRefills, storageAmount, InfiniteRefillsPD, liquidColor, (ReplenishResources)1, (ReplenishUsages)0, 1f); } public static LiquidToolData AddLiquidTool(string name, int maxRefills, int storageAmount, Color liquidColor) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) return AddLiquidTool(name, maxRefills, storageAmount, "", liquidColor); } public static ToolData AddTool(string name, ToolItemType type, LocalisedString displayName, LocalisedString description, Sprite? InventorySprite) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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_002b: Unknown result type (might be due to invalid IL or missing references) ToolData data = new ToolData { inventorySprite = InventorySprite, type = type, name = name, displayName = displayName, description = description }; PlayerDataVariableEvents.OnGetBool += (PlayerData pd, string fieldname, bool current) => (fieldname == data.unlockedPDString) ? data.UnlockedAtStart : current; newToolData.Add(data); return data; } public static ToolData AddTool(string name, ToolItemType type, Sprite? InventorySprite) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0004: 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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) return AddTool(name, type, new LocalisedString { Key = name + "LocalKey", Sheet = "Mods.your.mod.id" }, new LocalisedString { Key = name + "LocalKeyDesc", Sheet = "Mods.your.mod.id" }, InventorySprite); } public static ToolData AddTool(string name, ToolItemType type) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return AddTool(name, type, null); } public static ToolData AddTool(string name, ToolItemType type, LocalisedString displayName, LocalisedString description) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) return AddTool(name, type, displayName, description, null); } public static ToolData AddTool(string name, LocalisedString displayName, LocalisedString description) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) return AddTool(name, (ToolItemType)2, displayName, description, null); } public static ToolData AddTool(string name) { return AddTool(name, (ToolItemType)2, null); } public static CrestData AddCrest(string name, LocalisedString displayName, LocalisedString description, Sprite? RealSprite, Sprite? Silhouette, Sprite? CrestGlow) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) string name2 = name; CrestData crestData = new CrestData(name2, displayName, description, RealSprite, Silhouette, CrestGlow); newCrestData.Add(crestData); bindEvents[name2] = delegate { ModHelper.Log("Running Bind for " + name2 + " Crest"); }; bindCompleteEvents[name2] = delegate { ModHelper.Log("Bind for " + name2 + " Crest Complete"); }; return crestData; } public static CrestData AddCrest(string name, Sprite? RealSprite, Sprite? Silhouette, Sprite? CrestGlow) { //IL_0003: 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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) return AddCrest(name, new LocalisedString { Key = name + "LocalKey", Sheet = "Mods.your.mod.id" }, new LocalisedString { Key = name + "LocalKeyDesc", Sheet = "Mods.your.mod.id" }, RealSprite, Silhouette, CrestGlow); } public static CrestData AddCrest(string name, LocalisedString displayName, LocalisedString description, Sprite? RealSprite, Sprite? Silhouette) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) return AddCrest(name, displayName, description, RealSprite, Silhouette, null); } public static CrestData AddCrest(string name, Sprite? RealSprite, Sprite? Silhouette) { return AddCrest(name, RealSprite, Silhouette, null); } public static CrestData AddCrest(string name, LocalisedString displayName, LocalisedString description, Sprite? RealSprite) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) return AddCrest(name, displayName, description, RealSprite, null); } public static CrestData AddCrest(string name, Sprite? RealSprite) { return AddCrest(name, RealSprite, null); } public static CrestData AddCrest(string name, LocalisedString displayName, LocalisedString description) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) return AddCrest(name, displayName, description, null); } public static CrestData AddCrest(string name) { return AddCrest(name, null); } } } namespace Needleforge.Utils { internal static class ILUtils { internal static bool Ldloc(CodeInstruction x) { int index; return Ldloc(x, out index); } internal static bool Ldloc(CodeInstruction x, int index) { if (Ldloc(x, out var index2)) { return index == index2; } return false; } internal static bool Ldloc(CodeInstruction x, out int index) { index = -1; if (x.opcode == OpCodes.Ldloc_0) { index = 0; } else if (x.opcode == OpCodes.Ldloc_1) { index = 1; } else if (x.opcode == OpCodes.Ldloc_2) { index = 2; } else if (x.opcode == OpCodes.Ldloc_3) { index = 3; } else if ((x.opcode == OpCodes.Ldloc || x.opcode == OpCodes.Ldloc_S) && x.operand is LocalBuilder localBuilder) { index = localBuilder.LocalIndex; } return index >= 0; } internal static bool Stloc(CodeInstruction x) { int index; return Stloc(x, out index); } internal static bool Stloc(CodeInstruction x, int index) { if (Stloc(x, out var index2)) { return index == index2; } return false; } internal static bool Stloc(CodeInstruction x, out int index) { index = -1; if (x.opcode == OpCodes.Stloc_0) { index = 0; } else if (x.opcode == OpCodes.Stloc_1) { index = 1; } else if (x.opcode == OpCodes.Stloc_2) { index = 2; } else if (x.opcode == OpCodes.Stloc_3) { index = 3; } else if ((x.opcode == OpCodes.Stloc || x.opcode == OpCodes.Stloc_S) && x.operand is LocalBuilder localBuilder) { index = localBuilder.LocalIndex; } return index >= 0; } internal static bool Ldfld(CodeInstruction x) { string name; return Ldfld(x, out name); } internal static bool Ldfld(CodeInstruction x, string name) { if (Ldfld(x, out string name2)) { return name == name2; } return false; } internal static bool Ldfld(CodeInstruction x, out string name) { name = ""; if (x.opcode == OpCodes.Ldfld && x.operand is FieldInfo fieldInfo) { name = fieldInfo.Name; } return !string.IsNullOrWhiteSpace(name); } internal static bool Stfld(CodeInstruction x) { string name; return Stfld(x, out name); } internal static bool Stfld(CodeInstruction x, string name, out FieldInfo field) { field = ((x.operand is FieldInfo fieldInfo) ? fieldInfo : null); return Stfld(x, name); } internal static bool Stfld(CodeInstruction x, string name) { if (Stfld(x, out string name2)) { return name == name2; } return false; } internal static bool Stfld(CodeInstruction x, out string name) { name = ""; if (x.opcode == OpCodes.Stfld && x.operand is FieldInfo fieldInfo) { name = fieldInfo.Name; } return !string.IsNullOrWhiteSpace(name); } internal static bool Br(CodeInstruction x) { if (!(x.opcode == OpCodes.Br)) { return x.opcode == OpCodes.Br_S; } return true; } internal static bool Br(CodeInstruction x, out Label label) { label = ((x.operand is Label label2) ? label2 : default(Label)); return Br(x); } internal static bool Brfalse(CodeInstruction x) { if (!(x.opcode == OpCodes.Brfalse)) { return x.opcode == OpCodes.Brfalse_S; } return true; } internal static bool Brfalse(CodeInstruction x, out Label label) { label = ((x.operand is Label label2) ? label2 : default(Label)); return Brfalse(x); } internal static bool Brtrue(CodeInstruction x) { if (!(x.opcode == OpCodes.Brtrue)) { return x.opcode == OpCodes.Brtrue_S; } return true; } internal static bool Call(CodeInstruction x, string name) { if (x.opcode == OpCodes.Call && x.operand is MethodInfo methodInfo) { return methodInfo.Name == name; } return false; } internal static bool Call(CodeInstruction x, MethodInfo method) { if (x.opcode == OpCodes.Call && x.operand is MethodInfo methodInfo) { return methodInfo == method; } return false; } internal static bool Callvirt(CodeInstruction x, string name) { if (x.opcode == OpCodes.Callvirt && x.operand is MethodInfo methodInfo) { return methodInfo.Name == name; } return false; } internal static bool Callvirt(CodeInstruction x, MethodInfo method) { if (x.opcode == OpCodes.Callvirt && x.operand is MethodInfo methodInfo) { return methodInfo == method; } return false; } internal static CodeMatcher StealLabel(this CodeMatcher cm, Label newLabel, out Label oldLabel) { return cm.StealLabel(0, newLabel, out oldLabel); } internal static CodeMatcher StealLabel(this CodeMatcher cm, int i, Label newLabel, out Label oldLabel) { oldLabel = cm.Instruction.labels[i]; cm.Instruction.labels[i] = newLabel; return cm; } } internal static class MiscUtils { internal static Vector2[] ScalePolygon(Vector2[] poly, float mult) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (poly.Length == 0) { return Array.Empty<Vector2>(); } Vector2[] array = poly.ToArray(); Vector2 val = Vector2.zero; Vector2[] array2 = array; foreach (Vector2 val2 in array2) { val += val2; } val /= (float)array.Length; for (int j = 0; j < array.Length; j++) { array[j] = val + (array[j] - val) * mult; } return array; } internal static void CallMethod<T>(this T component, string fnName, Action<T>? fallbackFn = null) where T : Component { MethodInfo method = ((object)component).GetType().GetMethod(fnName, Array.Empty<Type>()); if (method != null) { method.Invoke(component, Array.Empty<object>()); } else { fallbackFn?.Invoke(component); } } internal static void StartAttack(this NailAttackBase nab) { nab.CallMethod<NailAttackBase>("StartSlash", (Action<NailAttackBase>?)delegate(NailAttackBase x) { x.OnSlashStarting(); x.OnPlaySlash(); }); } internal static void EndAttack(this NailAttackBase nab) { nab.CallMethod<NailAttackBase>("CancelAttack", (Action<NailAttackBase>?)delegate(NailAttackBase x) { x.OnCancelAttack(); }); } } } namespace Needleforge.Patches { [HarmonyPatch] internal class AddNewColors { [HarmonyPatch(typeof(Enum), "GetValues", new Type[] { typeof(Type) })] [HarmonyPostfix] private static void AddNewColorsUnordered(Type enumType, ref Array __result) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) if (!(enumType == typeof(ToolItemType))) { return; } List<ToolItemType> list = new List<ToolItemType>(); foreach (object item in __result) { list.Add((ToolItemType)item); } foreach (ColorData newColor in NeedleforgePlugin.newColors) { list.Add(newColor.Type); } __result = list.ToArray(); } [HarmonyPatch(typeof(EnumExtenstions), "GetValuesWithOrder", new Type[] { typeof(Type) })] [HarmonyPostfix] private static void AddNewColorsOrdered(Type type, ref IEnumerable<int> __result) { if (type == typeof(ToolItemType)) { for (int i = 0; i < NeedleforgePlugin.newColors.Count; i++) { int num = i + 4; __result = CollectionExtensions.AddItem<int>(__result, num); } } } } [HarmonyPatch(typeof(ToolItemManager), "Awake")] internal class AddToolsAndCrests { [HarmonyPostfix] private static void AddCrests() { ModHelper.Log("Adding Crests..."); foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { ModHelper.Log("Adding " + newCrestDatum.name); CrestMaker.CreateCrest(newCrestDatum); } } [HarmonyPostfix] private static void AddTools() { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) ModHelper.Log("Adding Tools..."); foreach (ToolData newToolDatum in NeedleforgePlugin.newToolData) { ModHelper.Log("Adding " + newToolDatum.name); if (newToolDatum is LiquidToolData liquidToolData) { ToolMaker.CreateLiquidTool(liquidToolData.name, liquidToolData.storageAmount, liquidToolData.maxRefills, liquidToolData.color, liquidToolData.infiniteRefills, liquidToolData.resource, liquidToolData.replenishUsage, liquidToolData.replenishMult, liquidToolData.FullSprites, liquidToolData.EmptySprites, newToolDatum.displayName, newToolDatum.description); } else { ToolMaker.CreateBasicTool(newToolDatum.inventorySprite, newToolDatum.type, newToolDatum.name, newToolDatum.displayName, newToolDatum.description); } } } } [HarmonyPatch(typeof(CountCrestUnlockPoints), "OnEnter")] internal static class EvaProgressionOptOut { private static void Prefix(CountCrestUnlockPoints __instance) { //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown ToolCrestList val = ScriptableObject.CreateInstance<ToolCrestList>(); HashSet<ToolCrest> hashSet = new HashSet<ToolCrest>(); foreach (ToolCrest item in from x in NeedleforgePlugin.newCrestData where !x.slotsCountForEvaQuest select x.ToolCrest) { hashSet.Add(item); } HashSet<ToolCrest> hashSet2 = hashSet; foreach (ToolCrest item2 in (NamedScriptableObjectList<ToolCrest>)(ToolCrestList)__instance.CrestList.Value) { if (!hashSet2.Contains(item2)) { ((NamedScriptableObjectList<ToolCrest>)(object)val).Add(item2); } } __instance.CrestList.Value = (Object)(object)val; } } [HarmonyPatch(typeof(HeroDownAttack))] internal static class PogoLogicTweaks { [HarmonyPatch("OnEndedDamage")] [HarmonyPrefix] private static void PreventDoubleBounces(HeroDownAttack __instance, bool didHit) { if (didHit && __instance.bounceQueued && Object.op_Implicit((Object)(object)__instance.attack)) { __instance.hc.AffectedByGravity(true); } __instance.bounceQueued = false; } [HarmonyPatch("ContinueBounceTrigger")] [HarmonyPrefix] private static void AllowTravellingBounces(HeroDownAttack __instance, GameObject otherObj) { NailAttackTravel nailAttackTravel = default(NailAttackTravel); if (!HeroDownAttack.IsNonBounce(otherObj) && ((Component)__instance).TryGetComponent<NailAttackTravel>(ref nailAttackTravel) && ((Behaviour)nailAttackTravel).enabled) { __instance.hc.AllowRecoil(); } } } [HarmonyPatch] internal class SaveDataSetup { [HarmonyPatch(typeof(PlayerData), "SetupNewPlayerData")] [HarmonyPostfix] private static void AddToNewSaveData(PlayerData __instance) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { if ((Object)(object)newCrestDatum.ToolCrest != (Object)null && newCrestDatum.UnlockedAtStart) { ((SerializableNamedList<Data, NamedData>)(object)__instance.ToolEquips).SetData(newCrestDatum.name, CrestMaker.CreateDefaultSaveData()); } } } [HarmonyPatch(typeof(PlayerData), "SetupExistingPlayerData")] [HarmonyPostfix] private static void AddToExistingSaveData(PlayerData __instance) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) List<string> validNames = ((SerializableNamedList<Data, NamedData>)(object)__instance.ToolEquips).GetValidNames((Func<Data, bool>)null); foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { if ((Object)(object)newCrestDatum.ToolCrest != (Object)null && newCrestDatum.UnlockedAtStart && !validNames.Contains(newCrestDatum.name)) { ((SerializableNamedList<Data, NamedData>)(object)__instance.ToolEquips).SetData(newCrestDatum.name, CrestMaker.CreateDefaultSaveData()); } } } } [HarmonyPatch(typeof(UI), "GetToolTypeColor")] internal class UIToolColorArray { [HarmonyPrefix] private static bool Prefix(ToolItemType type, ref Color __result) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected I4, but got Unknown //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) if ((int)type > 3) { __result = NeedleforgePlugin.newColors[type - 4].color; return false; } return true; } } } namespace Needleforge.Patches.Inventory { [HarmonyPatch] internal class HighlightTools { [HarmonyPatch(typeof(InventoryItemToolManager), "RefreshTools", new Type[] { typeof(bool), typeof(bool) })] [HarmonyPostfix] private static void RefreshTools(InventoryItemToolManager __instance) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Invalid comparison between Unknown and I4 //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected I4, but got Unknown //IL_00a1: 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) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < __instance.listSectionHeaders.Length; i++) { Color color = __instance.listSectionHeaders[i].Color; ColorData colorData = ((i <= 3) ? null : NeedleforgePlugin.newColors[i - 4]); if (Object.op_Implicit((Object)(object)__instance.SelectedSlot) && (int)__instance.SelectedSlot.Type > 3) { bool flag = colorData?.allColorsValid ?? false; InventoryToolCrestSlot selectedSlot = __instance.SelectedSlot; if ((int)selectedSlot.Type > 3) { ColorData colorData2 = NeedleforgePlugin.newColors[selectedSlot.Type - 4]; bool flag2 = colorData2.ValidTypes.Contains((ToolItemType)i) || flag || colorData2.allColorsValid; NestedFadeGroupSpriteRenderer obj = __instance.listSectionHeaders[i]; Color color2 = color; color2.a = (flag2 ? 1f : 0.5f); obj.Color = color2; } } } } [HarmonyPatch(typeof(InventoryItemTool), "UpdateEquippedDisplay")] [HarmonyPostfix] private static void UpdateEquippedDisplay(InventoryItemTool __instance) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected I4, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Invalid comparison between Unknown and I4 //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected I4, but got Unknown //IL_0089: 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_00af: 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) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance.manager.SelectedSlot != (Object)null && (int)__instance.manager.SelectedSlot.Type > 3) { ColorData colorData = NeedleforgePlugin.newColors[__instance.manager.SelectedSlot.Type - 4]; ColorData colorData2 = null; if ((int)__instance.itemData.Type > 3) { colorData2 = NeedleforgePlugin.newColors[__instance.itemData.Type - 4]; } bool flag = false; if (colorData2 != null) { flag = colorData2.allColorsValid; } Color color = ((colorData.ValidTypes.Contains(__instance.itemData.Type) || colorData.allColorsValid || flag) ? Color.white : InventoryToolCrestSlot.InvalidItemColor); if ((Object)(object)__instance.itemIcon != (Object)null) { __instance.itemIcon.color = color; } } } } [HarmonyPatch] internal class InventoryCloning { [HarmonyPatch(typeof(InventoryToolCrest), "OnValidate")] [HarmonyPostfix] private static void AddTemplateSlots(InventoryToolCrest __instance) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) foreach (ColorData newColor in NeedleforgePlugin.newColors) { if (newColor.isAttackType) { __instance.templateSlots[newColor.Type] = __instance.templateSlots[0]; } else { __instance.templateSlots[newColor.Type] = __instance.templateSlots[1]; } } } [HarmonyPatch(typeof(InventoryItemTool), "OnValidate")] [HarmonyPostfix] private static void AddAnimators(InventoryItemTool __instance) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) foreach (ColorData newColor in NeedleforgePlugin.newColors) { RuntimeAnimatorController val = __instance.slotAnimatorControllers[(!newColor.isAttackType) ? 1u : 0u]; __instance.slotAnimatorControllers[newColor.Type] = val; } } [HarmonyPatch(typeof(InventoryItemToolManager), "OnValidate")] [HarmonyPostfix] private static void AddHeaders(InventoryItemToolManager __instance) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) foreach (ColorData newColor in NeedleforgePlugin.newColors) { if (!Object.op_Implicit((Object)(object)__instance.listSectionHeaders[newColor.Type])) { NestedFadeGroupSpriteRenderer obj = __instance.listSectionHeaders[1]; NestedFadeGroupSpriteRenderer val = Object.Instantiate<NestedFadeGroupSpriteRenderer>(obj, ((Component)obj).transform.parent); ((Object)val).name = newColor.name + " Section Header"; if ((Object)(object)newColor.header != (Object)null) { val.Sprite = newColor.header; } __instance.listSectionHeaders[newColor.Type] = val; } } } } [HarmonyPatch] internal class MultiSlot { [HarmonyPatch(typeof(ToolItemTypeExtensions), "IsAttackType")] [HarmonyPostfix] private static void CustomColorAttackType(ToolItemType type, ref bool __result) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected I4, but got Unknown if (!__result && (int)type > 3) { ColorData colorData = NeedleforgePlugin.newColors[type - 4]; __result = colorData.isAttackType; } } [HarmonyPatch(typeof(InventoryItemToolManager), "GetAvailableSlotCount")] [HarmonyPostfix] private static void GetAvailableSlotCountMultiColor(IEnumerable<InventoryToolCrestSlot> slots, ToolItemType? toolType, bool checkEmpty, ref int __result) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Invalid comparison between Unknown and I4 //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Invalid comparison between Unknown and I4 //IL_0045: 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_0051: Expected I4, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected I4, but got Unknown //IL_008c: Unknown result type (might be due to invalid IL or missing references) int num = 0; foreach (InventoryToolCrestSlot slot in slots) { if (slot.IsLocked && !((Object)(object)slot.EquippedItem == (Object)null) && checkEmpty) { continue; } ToolItemType valueOrDefault = toolType.GetValueOrDefault(); if ((int)slot.Type > 3) { ColorData colorData = NeedleforgePlugin.newColors[slot.Type - 4]; if (colorData.ValidTypes.Contains(valueOrDefault) || colorData.allColorsValid) { num++; } } else if ((int)valueOrDefault > 3) { ColorData colorData2 = NeedleforgePlugin.newColors[valueOrDefault - 4]; if (colorData2.ValidTypes.Contains(slot.Type) || colorData2.allColorsValid) { num++; } } } __result += num; } [HarmonyPatch(typeof(InventoryItemToolManager), "GetAvailableSlot")] [HarmonyPostfix] private static void GetAvailableSlotMultiColor(IEnumerable<InventoryToolCrestSlot> slots, ToolItemType toolType, ref InventoryToolCrestSlot __result) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Invalid comparison between Unknown and I4 //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected I4, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected I4, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) foreach (InventoryToolCrestSlot slot in slots) { if (slot.IsLocked) { continue; } if ((int)slot.Type > 3) { ColorData colorData = NeedleforgePlugin.newColors[slot.Type - 4]; if ((colorData.ValidTypes.Contains(toolType) || colorData.allColorsValid) && (Object)(object)slot.EquippedItem == (Object)null) { __result = slot; } } else if ((int)toolType > 3) { ColorData colorData2 = NeedleforgePlugin.newColors[toolType - 4]; if ((colorData2.ValidTypes.Contains(slot.Type) || colorData2.allColorsValid) && (Object)(object)slot.EquippedItem == (Object)null) { __result = slot; } } } } [HarmonyPatch(typeof(InventoryItemToolManager), "PlaceTool")] [HarmonyPrefix] private static bool PlaceMultiColorTool(InventoryItemToolManager __instance, InventoryToolCrestSlot slot, bool isManual) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Invalid comparison between Unknown and I4 //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Invalid comparison between Unknown and I4 //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected I4, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected I4, but got Unknown //IL_00c6: Unknown result type (might be due to invalid IL or missing references) InventoryItemToolManager __instance2 = __instance; InventoryToolCrestSlot slot2 = slot; if ((Object)(object)slot2 == (Object)null) { return true; } ToolItem tool; if ((int)slot2.Type > 3) { ColorData colorData = NeedleforgePlugin.newColors[slot2.Type - 4]; tool = __instance2.PickedUpTool; if (colorData.ValidTypes.Contains(tool.Type) || colorData.allColorsValid) { RealPlace(); } return false; } if ((int)__instance2.PickedUpTool.Type > 3) { ColorData colorData2 = NeedleforgePlugin.newColors[__instance2.PickedUpTool.Type - 4]; if (colorData2.ValidTypes.Contains(slot2.Type) || colorData2.allColorsValid) { tool = __instance2.PickedUpTool; RealPlace(); } return false; } return true; void RealPlace() { //IL_0093: 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_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) __instance2.PickedUpTool = null; __instance2.EquipState = (EquipStates)0; if (isManual) { slot2.SetEquipped(tool, true, true); } if (Object.op_Implicit((Object)(object)__instance2.selectedBeforePickup)) { if (isManual) { slot2.PreOpenSlot(); } if (Object.op_Implicit((Object)(object)__instance2.tweenTool) && Object.op_Implicit((Object)(object)slot2)) { __instance2.tweenTool.DoPlace(Vector2.op_Implicit(((Component)__instance2.selectedBeforePickup).transform.position), Vector2.op_Implicit(((Component)slot2).transform.position), tool, (Action)Selected); } else { Selected(); } } } void Selected() { ((InventoryItemManager)__instance2).SetSelected(__instance2.selectedBeforePickup, (SelectionDirection?)null, false); __instance2.selectedBeforePickup = null; } } } [HarmonyPatch] internal class MultiSlotNav { [MethodImpl(MethodImplOptions.NoInlining)] [HarmonyReversePatch(/*Could not decode attribute arguments.*/)] [HarmonyPatch(typeof(InventoryItemSelectableDirectional), "GetNextSelectable", new Type[] { typeof(SelectionDirection) })] private static InventoryItemSelectable BaseGetNextSelectable(InventoryItemTool instance, SelectionDirection direction) { return null; } [HarmonyPatch(typeof(InventoryItemTool), "GetNextSelectable")] [HarmonyPostfix] private static void MultiColorNav(SelectionDirection direction, InventoryItemTool __instance, ref InventoryItemSelectable __result) { //IL_000e: 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_0037: Invalid comparison between Unknown and I4 //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected I4, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Invalid comparison between Unknown and I4 //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected I4, but got Unknown //IL_0093: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)__instance == (Object)(object)__result)) { return; } InventoryItemSelectable val = BaseGetNextSelectable(__instance, direction); InventoryItemTool val2 = (InventoryItemTool)(object)((val is InventoryItemTool) ? val : null); if (!((Object)(object)val2 == (Object)null) && (int)__instance.manager.SelectedSlot.Type > 3) { ColorData colorData = NeedleforgePlugin.newColors[__instance.manager.SelectedSlot.Type - 4]; ColorData colorData2 = null; if ((int)val2.itemData.Type > 3) { colorData2 = NeedleforgePlugin.newColors[val2.itemData.Type - 4]; } bool flag = false; if (colorData2 != null) { flag = colorData2.allColorsValid; } if (colorData.ValidTypes.Contains(val2.ToolType) || flag || colorData.allColorsValid) { __result = val; } } } [HarmonyPatch(typeof(InventoryItemToolManager), "EndSelection")] [HarmonyPrefix] private static bool MultiColorEndSelection(InventoryItemTool tool, InventoryItemToolManager __instance) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Invalid comparison between Unknown and I4 //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected I4, but got Unknown //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) InventoryItemToolManager __instance2 = __instance; if ((int)__instance2.SelectedSlot.Type > 3) { if (!Object.op_Implicit((Object)(object)__instance2.SelectedSlot)) { return true; } ColorData colorData = NeedleforgePlugin.newColors[__instance2.SelectedSlot.Type - 4]; if (Object.op_Implicit((Object)(object)tool) && Object.op_Implicit((Object)(object)((InventoryItemToolBase)tool).ItemData) && (colorData.ValidTypes.Contains(tool.ToolType) || colorData.allColorsValid)) { if (Object.op_Implicit((Object)(object)__instance2.tweenTool)) { __instance2.SelectedSlot.SetEquipped(((InventoryItemToolBase)tool).ItemData, true, true); __instance2.tweenTool.DoPlace(Vector2.op_Implicit(((Component)tool).transform.position), Vector2.op_Implicit(((Component)__instance2.SelectedSlot).transform.position), ((InventoryItemToolBase)tool).ItemData, (Action)SelectionEnd); return false; } __instance2.SelectedSlot.SetEquipped(((InventoryItemToolBase)tool).ItemData, true, true); } SelectionEnd(); return false; } return true; void SelectionEnd() { ((InventoryItemManager)__instance2).PlayMoveSound(); ((InventoryItemManager)__instance2).SetSelected((InventoryItemSelectable)(object)__instance2.SelectedSlot, (SelectionDirection?)null, false); __instance2.SelectedSlot = null; __instance2.EquipState = (EquipStates)0; __instance2.RefreshTools(); } } [HarmonyPatch(typeof(InventoryItemToolManager), "StartSelection")] [HarmonyPrefix] private static bool MultiColorStartSelection(InventoryToolCrestSlot slot, InventoryItemToolManager __instance) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected I4, but got Unknown if ((int)slot.Type > 3) { if ((Object)(object)__instance.toolList == (Object)null) { return true; } ColorData slotData = NeedleforgePlugin.newColors[slot.Type - 4]; List<InventoryItemTool> listItems = __instance.toolList.GetListItems<InventoryItemTool>((Func<InventoryItemTool, bool>)((InventoryItemTool tool) => (slotData.ValidTypes.Contains(tool.ToolType) || slotData.allColorsValid) && !((ToolBase)tool.itemData).IsEquipped)); InventoryItemTool val = null; if (listItems.Count > 0) { val = listItems[0]; } if ((Object)(object)val == (Object)null) { return false; } __instance.SelectedSlot = slot; __instance.EquipState = (EquipStates)2; ((InventoryItemManager)__instance).PlayMoveSound(); ((InventoryItemManager)__instance).SetSelected((InventoryItemSelectable)(object)val, (SelectionDirection?)null, false); __instance.RefreshTools(); return false; } return true; } [HarmonyPatch(typeof(InventoryToolCrestSlot), "IsSlotInvalid")] [HarmonyPostfix] private static void MultiColorInvalid(ToolItemType type, InventoryToolCrestSlot nextSlot, InventoryToolCrestSlot __instance, ref bool __result) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected I4, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected I4, but got Unknown if (!__result) { return; } ToolItemType type2 = __instance.manager.PickedUpTool.Type; if (!((Object)(object)nextSlot.EquippedItem != (Object)null)) { if ((int)nextSlot.Type > 3) { ColorData colorData = NeedleforgePlugin.newColors[nextSlot.Type - 4]; __result = (!colorData.ValidTypes.Contains(type2) && !colorData.allColorsValid) || (nextSlot.IsLocked && !__instance.manager.CanUnlockSlot); } else if (type2 == nextSlot.Type) { __result = nextSlot.IsLocked && !__instance.manager.CanUnlockSlot; } if ((int)type2 > 3 && NeedleforgePlugin.newColors[nextSlot.Type - 4].allColorsValid) { __result = nextSlot.IsLocked && !__instance.manager.CanUnlockSlot; } } } } } namespace Needleforge.Patches.HUD { [HarmonyPatch(typeof(BindOrbHudFrame), "Awake")] internal class AddHudRootsAndAnims { [HarmonyPostfix] private static void Postfix(BindOrbHudFrame __instance) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown GameObject val = new GameObject("NeedleforgeHudRoots") { layer = 5 }; val.transform.SetParent(((Component)__instance).transform); ResetPos(val); Extensions.SetLocalPositionZ(val.transform, -0.0001f); ModHelper.Log("Adding Needleforge Hud Roots"); foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { GameObject val2 = new GameObject(newCrestDatum.name + "HUDRoot") { layer = 5 }; val2.transform.SetParent(val.transform); ResetPos(val2); NeedleforgePlugin.hudRoots[newCrestDatum.name] = val2; UpdateHudAnimLibrary(__instance, newCrestDatum.HudFrame); newCrestDatum.HudFrame.InitializeRoot(); } static void ResetPos(GameObject go) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) go.transform.localScale = Vector3.one; go.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); } } private static void UpdateHudAnimLibrary(BindOrbHudFrame hudFrame, HudFrameData hudData) { if (hudData.HasAnyRegularCustomAnims) { List<tk2dSpriteAnimationClip> list = hudFrame.animator.Library.clips.ToList(); foreach (tk2dSpriteAnimationClip item in hudData.AllRegularCustomAnims()) { Extensions.AddIfNotPresent<tk2dSpriteAnimationClip>(list, item); } hudFrame.animator.Library.clips = list.ToArray(); hudFrame.animator.Library.isValid = false; hudFrame.animator.Library.ValidateLookup(); } if (!hudData.HasAnySteelCustomAnims) { return; } SteelSoulAnimProxy component = ((Component)hudFrame).GetComponent<SteelSoulAnimProxy>(); List<tk2dSpriteAnimationClip> list2 = component.steelSoulAnims.clips.ToList(); foreach (tk2dSpriteAnimationClip item2 in hudData.AllSteelCustomAnims()) { Extensions.AddIfNotPresent<tk2dSpriteAnimationClip>(list2, item2); } component.steelSoulAnims.clips = list2.ToArray(); component.steelSoulAnims.isValid = false; component.steelSoulAnims.ValidateLookup(); } internal static void UpdateHudAnimLibrary(HudFrameData hudData) { BindOrbHudFrame val = Object.FindAnyObjectByType<BindOrbHudFrame>(); if (Object.op_Implicit((Object)(object)hudData.Root) && Object.op_Implicit((Object)(object)val) && ((MonoBehaviour)val).didAwake) { UpdateHudAnimLibrary(val, hudData); } } } [HarmonyPatch(typeof(BindOrbHudFrame), "DoChangeFrame")] internal static class ReplaceInGameHud { private enum ReturnBehaviour { ReturnFalse, NextElseIf, ElseIfCompleted } private const BindingFlags PUBLICSTATIC = BindingFlags.Static | BindingFlags.Public; [HarmonyTranspiler] private static IEnumerable<CodeInstruction> ChangeHud(IEnumerable<CodeInstruction> instructions, ILGenerator generator) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Expected O, but got Unknown //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Expected O, but got Unknown //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Expected O, but got Unknown //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Expected O, but got Unknown //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Expected O, but got Unknown //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Expected O, but got Unknown //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Expected O, but got Unknown //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Expected O, but got Unknown //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Expected O, but got Unknown //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Expected O, but got Unknown //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Expected O, but got Unknown //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Expected O, but got Unknown //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Expected O, but got Unknown //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_029e: Expected O, but got Unknown //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Expected O, but got Unknown MethodInfo get_HunterCrest2 = typeof(Gameplay).GetProperty("HunterCrest2", BindingFlags.Static | BindingFlags.Public).GetGetMethod(); MethodInfo get_ToolBase_IsEquipped = typeof(ToolBase).GetProperty("IsEquipped").GetGetMethod(); int localsObject_idx = -1; int hunter2_idx = -1; FieldInfo newFrameAnims_f = null; FieldInfo customAnimRoutine_f = null; Label elseIfCompleted_label = default(Label); Label label = generator.DefineLabel(); Label label2 = generator.DefineLabel(); Label oldLabel; return new CodeMatcher(instructions, generator).Start().MatchStartForward((CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Ldloc(x, out localsObject_idx)), (string)null), new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Ldfld(x, "newFrameAnims")), (string)null) }).Start() .MatchStartForward((CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Stfld(x, "newFrameAnims", out newFrameAnims_f)), (string)null) }) .Start() .MatchStartForward((CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Stfld(x, "customAnimRoutine", out customAnimRoutine_f)), (string)null) }) .Start() .MatchStartForward((CodeMatch[])(object)new CodeMatch[2] { new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Call(x, get_HunterCrest2)), (string)null), new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Stloc(x, out hunter2_idx)), (string)null) }) .MatchStartForward((CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Br(x, out elseIfCompleted_label)), (string)null), new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Ldloc(x, hunter2_idx)), (string)null), new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction x) => ILUtils.Callvirt(x, get_ToolBase_IsEquipped)), (string)null) }) .Advance(1) .StealLabel(label, out oldLabel) .Insert((CodeInstruction[])(object)new CodeInstruction[9] { new CodeInstruction(OpCodes.Ldarg_0, (object)null) { labels = new List<Label>(1) { oldLabel } }, new CodeInstruction(OpCodes.Ldloc, (object)localsObject_idx), new CodeInstruction(OpCodes.Ldflda, (object)newFrameAnims_f), new CodeInstruction(OpCodes.Ldloc, (object)localsObject_idx), new CodeInstruction(OpCodes.Ldflda, (object)customAnimRoutine_f), Transpilers.EmitDelegate<<>F{00000048}<BindOrbHudFrame, BasicFrameAnims, CoroutineFunction, ReturnBehaviour>>((<>F{00000048}<BindOrbHudFrame, BasicFrameAnims, CoroutineFunction, ReturnBehaviour>)SetCustomHudVars), new CodeInstruction(OpCodes.Switch, (object)new Label[3] { label2, label, elseIfCompleted_label }), new CodeInstruction(OpCodes.Ldc_I4_0, (object)null) { labels = new List<Label>(1) { label2 } }, new CodeInstruction(OpCodes.Ret, (object)null) }) .InstructionEnumeration(); } private static ReturnBehaviour SetCustomHudVars(BindOrbHudFrame self, ref BasicFrameAnims basicFrameAnims, ref CoroutineFunction? coroutineFunction) { //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown BindOrbHudFrame self2 = self; foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { CrestData crest = newCrestDatum; if (crest.IsEquipped) { if ((Object)(object)crest.ToolCrest == (Object)(object)self2.currentFrameCrest) { return ReturnBehaviour.ReturnFalse; } self2.currentFrameCrest = crest.ToolCrest; basicFrameAnims = (crest.HudFrame.HasRegularCustomBasicAnims ? crest.HudFrame.CustomBasicFrameAnims() : PresetBasicAnims(self2, crest.HudFrame.Preset)); if (crest.HudFrame.Coroutine != null) { coroutineFunction = new CoroutineFunction(HudCoro); } return ReturnBehaviour.ElseIfCompleted; } IEnumerator HudCoro() { return crest.HudFrame.Coroutine(self2); } } return ReturnBehaviour.NextElseIf; } private static BasicFrameAnims PresetBasicAnims(BindOrbHudFrame self, VanillaCrest crest) { return (BasicFrameAnims)(crest switch { VanillaCrest.HUNTER_V2 => self.hunterV2FrameAnims, VanillaCrest.HUNTER_V3 => self.hunterV3FrameAnims, VanillaCrest.BEAST => self.warriorFrameAnims, VanillaCrest.REAPER => self.reaperFrameAnims, VanillaCrest.WANDERER => self.wandererFrameAnims, VanillaCrest.WITCH => self.witchFrameAnims, VanillaCrest.ARCHITECT => self.toolmasterFrameAnims, VanillaCrest.SHAMAN => self.spellFrameAnims, VanillaCrest.CURSED => self.cursedV1FrameAnims, VanillaCrest.CLOAKLESS => self.cloaklessFrameAnims, _ => self.defaultFrameAnims, }); } } [HarmonyPatch(typeof(SaveProfileHealthBar), "ShowHealth")] internal static class ReplaceProfileHud { private static void Postfix(SaveProfileHealthBar __instance, bool steelsoulMode, string crestId) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { if (newCrestDatum.name == crestId) { CrestTypeInfo val = __instance.crests[ConvertCrestType(newCrestDatum.HudFrame.Preset)]; Sprite val2 = (Sprite)(((Object)(object)newCrestDatum.HudFrame.ProfileIcon != (Object)null) ? ((object)newCrestDatum.HudFrame.ProfileIcon) : ((object)val.SpoolImage)); Sprite val3 = (Sprite)(((Object)(object)newCrestDatum.HudFrame.SteelProfileIcon != (Object)null) ? ((object)newCrestDatum.HudFrame.SteelProfileIcon) : ((object)val.SpoolImageSteel)); __instance.spoolImage.sprite = (steelsoulMode ? val3 : val2); } } } private static CrestTypes ConvertCrestType(VanillaCrest crest) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) return (CrestTypes)(crest switch { VanillaCrest.HUNTER_V2 => 1, VanillaCrest.HUNTER_V3 => 2, VanillaCrest.BEAST => 9, VanillaCrest.REAPER => 5, VanillaCrest.WANDERER => 8, VanillaCrest.WITCH => 10, VanillaCrest.ARCHITECT => 7, VanillaCrest.SHAMAN => 6, VanillaCrest.CURSED => 4, VanillaCrest.CLOAKLESS => 3, _ => 0, }); } } [HarmonyPatch] internal static class ReplaceProfileHud_EnumTryParse { private static MethodBase TargetMethod() { return typeof(Enum).GetMethods().Single((MethodInfo x) => x.Name == "TryParse" && x.GetParameters().Length == 2).MakeGenericMethod(typeof(CrestTypes)); } private static bool Prefix(string value, ref CrestTypes result, ref bool __result) { string value2 = value; if (NeedleforgePlugin.newCrestData.FindIndex((CrestData x) => x.name == value2) >= 0) { result = (CrestTypes)0; __result = true; return false; } return true; } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] internal static class ShowBindCostInHud { private static void Postfix(ref float __result) { CrestData crestData = NeedleforgePlugin.newCrestData.FirstOrDefault((CrestData x) => x.IsEquipped); if (crestData != null) { __result = crestData.bindCost; } } } } namespace Needleforge.Patches.HeroControl { [HarmonyPatch(typeof(HeroController))] internal static class AddMovesetsAndAnims { private static readonly Dictionary<string, (string orig, bool keepTriggers)> requiredAnimations = new Dictionary<string, (string, bool)> { { "DownSlash", ("DownSpike", true) }, { "DownSlashAlt", ("DownSpike", true) }, { "Slash_Charged_Loop", ("Slash_Charged", false) }, { "Dash Attack 1", ("Dash Attack", true) }, { "Dash Attack Antic 1", ("Dash Attack Antic", true) } }; [HarmonyPatch("Awake")] [HarmonyPostfix] private static void InitMovesets(HeroController __instance) { ModHelper.Log("Initializing Crest Movesets..."); foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { ModHelper.Log("Init " + newCrestDatum.name + " Moveset"); TryAddDefaultAnimations(__instance); MovesetMaker.InitializeMoveset(newCrestDatum.Moveset); } } [HarmonyPatch("SetConfigGroup")] [HarmonyPrefix] private static bool SilenceError(HeroController __instance, ConfigGroup configGroup) { HeroController __instance2 = __instance; if (((MonoBehaviour)__instance2).didStart) { return true; } if (configGroup == null && NeedleforgePlugin.newCrests.Any((ToolCrest x) => x.HeroConfig == __instance2.crestConfig)) { return false; } return true; } private static void TryAddDefaultAnimations(HeroController hc) { tk2dSpriteAnimation library = hc.AnimCtrl.animator.Library; List<tk2dSpriteAnimationClip> list = new List<tk2dSpriteAnimationClip>(); foreach (KeyValuePair<string, (string, bool)> requiredAnimation in requiredAnimations) { requiredAnimation.Deconstruct(out var key, out var value); (string, bool) tuple = value; string text = key; var (text2, keepTriggers) = tuple; if (library.GetClipByName(text) == null) { tk2dSpriteAnimationClip clipByName = library.GetClipByName(text2); list.Add(CopyClip(text, clipByName, keepTriggers)); } } if (list.Count <= 0) { return; } tk2dSpriteAnimation val = library; tk2dSpriteAnimationClip[] clips = library.clips; List<tk2dSpriteAnimationClip> list2 = list; int num = 0; tk2dSpriteAnimationClip[] array = (tk2dSpriteAnimationClip[])(object)new tk2dSpriteAnimationClip[clips.Length + list2.Count]; ReadOnlySpan<tk2dSpriteAnimationClip> readOnlySpan = new ReadOnlySpan<tk2dSpriteAnimationClip>(clips); readOnlySpan.CopyTo(new Span<tk2dSpriteAnimationClip>(array).Slice(num, readOnlySpan.Length)); num += readOnlySpan.Length; foreach (tk2dSpriteAnimationClip item in list2) { array[num] = item; num++; } val.clips = array; library.isValid = false; library.ValidateLookup(); } private static tk2dSpriteAnimationClip CopyClip(string newName, tk2dSpriteAnimationClip orig, bool keepTriggers) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown tk2dSpriteAnimationFrame[] array = orig.frames; if (!keepTriggers) { array = ((IEnumerable<tk2dSpriteAnimationFrame>)array).Select((Func<tk2dSpriteAnimationFrame, tk2dSpriteAnimationFrame>)((tk2dSpriteAnimationFrame f) => new tk2dSpriteAnimationFrame { spriteCollection = f.spriteCollection, spriteId = f.spriteId, triggerEvent = false })).ToArray(); } return new tk2dSpriteAnimationClip { name = newName, fps = orig.fps, frames = array, loopStart = orig.loopStart, wrapMode = orig.wrapMode }; } } [HarmonyPatch(typeof(HeroController), "BindCompleted")] internal class BindComplete { [HarmonyPostfix] private static void Postfix() { foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { if (newCrestDatum.IsEquipped) { newCrestDatum.BindCompleteEvent(); } } } } [HarmonyPatch] internal class CustomDownspikeBehaviour { [HarmonyPatch(typeof(HeroController), "Downspike")] [HarmonyPostfix] private static void SetVelocity(HeroController __instance) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //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_009b: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) if ((int)__instance.Config.DownSlashType == 0 && __instance.Config.DownspikeThrusts && __instance.cState.downSpiking && __instance.Config is HeroConfigNeedleforge heroConfigNeedleforge && __instance.downSpikeTimer - Time.deltaTime <= __instance.Config.DownSpikeTime) { Vector2 val = (Vector2)(__instance.cState.facingRight ? new Vector2(-1f, 1f) : Vector2.one); __instance.rb2d.linearVelocity = (heroConfigNeedleforge.DownspikeVelocity + heroConfigNeedleforge.DownspikeAcceleration * __instance.downSpikeTimer) * val; } } [HarmonyPatch(typeof(HeroController), "DownspikeBounce")] [HarmonyPrefix] private static void SetBounceConfig(HeroController __instance, ref HeroSlashBounceConfig bounceConfig) { if (__instance.currentDownspike is DownspikeWithBounceConfig downspikeWithBounceConfig) { bounceConfig = downspikeWithBounceConfig.bounceConfig; } } } [HarmonyPatch(typeof(HeroController), "Start")] internal static class MovesetFSMEdits { private static readonly FsmEvent needleforgeDefaultEvent = FsmEvent.GetFsmEvent("NEEDLEFORGE DEFAULT"); private static readonly FsmEvent noEvent = FsmEvent.GetFsmEvent(""); private static void Prefix(HeroController __instance) { ModHelper.Log("Editing Moveset FSMs..."); DownSlashFSMEdits(__instance); DashSlashFSMEdits(__instance); ChargedSlashFSMEdits(__instance); } private static void DownSlashFSMEdits(HeroController hc) { //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Invalid comparison between Unknown and I4 IEnumerable<MovesetData> enumerable = from cd in NeedleforgePlugin.newCrestData select cd.Moveset into m where Object.op_Implicit((Object)(object)m.HeroConfig) && ((int)((HeroControllerConfig)m.HeroConfig).DownSlashType == 2 || m.HeroConfig.DownSlashFsmEdit != null) select m; if (!enumerable.Any()) { return; } PlayMakerFSM crestAttacksFSM = hc.crestAttacksFSM; if (!crestAttacksFSM.Fsm.preprocessed) { crestAttacksFSM.Preprocess(); } FsmState state = FsmUtil.GetState(crestAttacksFSM, "Idle"); FsmState state2 = FsmUtil.GetState(crestAttacksFSM, "End"); foreach (MovesetData item in enumerable) { string name = item.Crest.name; ModHelper.Log(name + " Down Slash"); HeroConfigNeedleforge.FsmEdit downSlashFsmEdit = item.HeroConfig.DownSlashFsmEdit; if (downSlashFsmEdit == null) { ModHelper.LogError("Crest " + name + " has a custom downslash type, but doesn't define a DownSlashFsmEdit function."); continue; } if ((int)((HeroControllerConfig)item.HeroConfig).DownSlashType != 2) { ModHelper.LogError("Crest " + name + " has a DownSlashFsmEdit function, but its DownSlashType " + $"is not {(object)(DownSlashTypes)2}."); continue; } if (string.IsNullOrWhiteSpace(((HeroControllerConfig)item.HeroConfig).downSlashEvent)) { ModHelper.LogError("Crest " + name + " has a custom downslash, but doesn't have a valid downSlashEvent."); continue; } FsmState val = FsmUtil.AddState(crestAttacksFSM, name + " Start"); FsmUtil.AddTransition(state, ((HeroControllerConfig)item.HeroConfig).downSlashEvent, val.Name); downSlashFsmEdit(crestAttacksFSM, val, out var endStates); FsmState[] array = endStates; for (int i = 0; i < array.Length; i++) { FsmUtil.AddTransition(array[i], "FINISHED", state2.Name); } } } private static void DashSlashFSMEdits(HeroController hc) { PlayMakerFSM fsm = hc.sprintFSM; if (!fsm.Fsm.preprocessed) { fsm.Preprocess(); } FsmState state = FsmUtil.GetState(fsm, "Start Attack"); FsmState state2 = FsmUtil.GetState(fsm, "Regain Control Normal"); FsmInt crestIdx = FsmUtil.AddIntVariable(fsm, "Equipped Crest io.github.needleforge"); FsmUtil.InsertMethod(state, 1 + Array.FindLastIndex(state.Actions, (FsmStateAction x) => x is SetIntValue), (Action)delegate { crestIdx.Value = NeedleforgePlugin.newCrestData.FindIndex((CrestData x) => x.IsEquipped); if (crestIdx.Value >= 0) { CrestData crestData = NeedleforgePlugin.newCrestData[crestIdx.Value]; Transform transform3 = crestData.Moveset.ConfigGroup.DashStab.transform; FsmUtil.GetIntVariable(fsm, "Attack Steps").Value = transform3.childCount; if (transform3.childCount <= 0) { ModHelper.LogWarning(crestData.name + ": DashSlash has no steps; the attack won't do anything."); } else if (((HeroControllerConfig)crestData.Moveset.HeroConfig).dashStabSteps > transform3.childCount) { ModHelper.LogWarning(crestData.name + ": The HeroConfig.dashStabSteps field has no effect for Needleforge crests. Modify the DashSlash.Steps array instead."); } fsm.Fsm.Event("MULTIPLE"); } }, false); FsmState state3 = FsmUtil.GetState(fsm, "Set Attack Multiple"); FsmUtil.InsertMethod(state3, Array.FindLastIndex(state3.Actions, (FsmStateAction x) => x is SetPolygonCollider), (Action)delegate { if (crestIdx.Value >= 0) { Transform transform2 = NeedleforgePlugin.newCrestData[crestIdx.Value].Moveset.ConfigGroup.DashStab.transform; int num3 = FsmUtil.GetIntVariable(fsm, "Attack Step").Value - 1; FsmUtil.GetStringVariable(fsm, "Attack Child Name").Value = ((Object)transform2.GetChild(num3)).name; } }, false); FsmState AttackDashStart = FsmUtil.GetState(fsm, "Attack Dash Start"); FsmUtil.InsertMethod(AttackDashStart, 0, (Action)delegate { CallMethodProper[] actionsOfType = FsmUtil.GetActionsOfType<CallMethodProper>(AttackDashStart); foreach (CallMethodProper val3 in actionsOfType) { if (typeof(NailAttackBase).IsAssignableFrom(val3.cachedType) && val3.cachedType != typeof(DashStabNailAttack)) { val3.cachedType = null; val3.cachedMethodInfo = null; val3.cachedParameterInfo = Array.Empty<ParameterInfo>(); } } }, false); FsmUtil.InsertMethod(AttackDashStart, Array.FindIndex(AttackDashStart.Actions, (FsmStateAction x) => x is PlayAudioEvent), (Action)delegate { if (crestIdx.Value >= 0) { Transform transform = NeedleforgePlugin.newCrestData[crestIdx.Value].Moveset.ConfigGroup.DashStab.transform; int num2 = FsmUtil.GetIntVariable(fsm, "Attack Step").Value - 1; AudioSource component = ((Component)transform.GetChild(num2)).GetComponent<AudioSource>(); if (Object.op_Implicit((Object)(object)component)) { fsm.FsmVariables.FindFsmObject("Clip").Value = (Object)(object)component.clip; } } }, false); IEnumerable<MovesetData> enumerable = from cd in NeedleforgePlugin.newCrestData select cd.Moveset into m where Object.op_Implicit((Object)(object)m.HeroConfig) && m.HeroConfig.DashSlashFsmEdit != null select m; if (!enumerable.Any()) { return; } int num = 1 + Array.FindLastIndex(state.Actions, (FsmStateAction x) => x is CheckIfCrestEquipped); foreach (MovesetData item in enumerable) { string name = item.Crest.name; ModHelper.Log(name + " Dash Slash"); FsmState val = FsmUtil.AddState(fsm, name + " Start"); CheckIfCrestEquipped val2 = CreateCrestEquipCheck(item.Crest); FsmUtil.InsertAction(state, num, (FsmStateAction)(object)val2); FsmUtil.AddTransition(state, ((CheckFsmStateAction)val2).trueEvent.Name, val.name); item.HeroConfig.DashSlashFsmEdit(fsm, val, out var endStates); FsmState[] array = endStates; for (int i = 0; i < array.Length; i++) { FsmUtil.AddTransition(array[i], "FINISHED", state2.Name); } } } private static void ChargedSlashFSMEdits(HeroController hc) { //IL_007a: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00b9: 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) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Expected O, but got Unknown //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Expected O, but got Unknown PlayMakerFSM fsm = FsmUtil.GetFsmPreprocessed(((Component)hc).gameObject, "Nail Arts"); FsmState state = FsmUtil.GetState(fsm, "Antic Type"); FsmState state2 = FsmUtil.GetState(fsm, "Set Finished"); FsmState val = FsmUtil.AddState(fsm, "Needleforge Kickoff"); FsmUtil.AddMethod(state, (Action)delegate { CrestData crestData = NeedleforgePlugin.newCrestData.FirstOrDefault((CrestData x) => x.IsEquipped); if (crestData != null && crestData.Moveset.HeroConfig.ChargedSlashFsmEdit == null) { GameObject val4 = crestData.Moveset.ChargedSlash?.GameObject; if (Object.op_Implicit((Object)(object)val4) && val4.transform.childCount <= 0) { ModHelper.LogWarning(crestData.name + ": ChargedSlash has no steps; the attack won't do anything."); } fsm.Fsm.Event(needleforgeDefaultEvent); } }, false); FsmUtil.AddTransition(state, needleforgeDefaultEvent.Name, val.Name); FsmUtil.AddAction(val, (FsmStateAction)new CheckIsCharacterGrounded { Target = new FsmOwnerDefault { OwnerOption = (OwnerDefaultOption)0 }, RayCount = new FsmInt { Value = 3 }, GroundDistance = new FsmFloat { Value = 0.2f }, SkinWidth = new FsmFloat { Value = -0.05f }, SkinHeight = new FsmFloat { Value = 0.1f }, StoreResult = new FsmBool { Value = false }, NotGroundedEvent = FsmEvent.GetFsmEvent("FINISHED"), EveryFrame = false }); FsmUtil.AddMethod(val, (Action)delegate { HeroController instance = HeroController.instance; if (instance.Config is HeroConfigNeedleforge heroConfigNeedleforge && heroConfigNeedleforge.ChargedSlashDoesKickoff) { instance.rb2d.linearVelocityY = 10f; } }, false); FsmUtil.AddTransition(val, "FINISHED", "Antic"); FsmState state3 = FsmUtil.GetState(fsm, "Slash Recoil?"); if (state3 != null) { FsmUtil.DisableActionsOfType<CheckIfCrestEquipped>(state3); } IEnumerable<MovesetData> enumerable = from cd in NeedleforgePlugin.newCrestData select cd.Moveset into m where Object.op_Implicit((Object)(object)m.HeroConfig) && m.HeroConfig.ChargedSlashFsmEdit != null select m; if (!enumerable.Any()) { return; } int num = 1 + Array.FindLastIndex(state.Actions, (FsmStateAction x) => x is CheckIfCrestEquipped); foreach (MovesetData item in enumerable) { string name = item.Crest.name; ModHelper.Log(name + " Charged Slash"); FsmState val2 = FsmUtil.AddState(fsm, name + " Start"); CheckIfCrestEquipped val3 = CreateCrestEquipCheck(item.Crest); FsmUtil.InsertAction(state, num, (FsmStateAction)(object)val3); FsmUtil.AddTransition(state, ((CheckFsmStateAction)val3).trueEvent.Name, val2.name); item.HeroConfig.ChargedSlashFsmEdit(fsm, val2, out var endStates); FsmState[] array = endStates; for (int i = 0; i < array.Length; i++) { FsmUtil.AddTransition(array[i], "FINISHED", state2.Name); } } } private static CheckIfCrestEquipped CreateCrestEquipCheck(CrestData crest) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown return new CheckIfCrestEquipped { Crest = new FsmObject { Value = (Object)(object)crest.ToolCrest }, trueEvent = FsmEvent.GetFsmEvent(crest.name), falseEvent = noEvent, storeValue = FsmBool.op_Implicit(false) }; } } [HarmonyPatch(typeof(HeroController), "Start")] internal class Tool_CrestFSMEdits { private static readonly CrestData.BindEventHandler defaultBind = delegate(FsmInt value, FsmInt amount, FsmFloat time, PlayMakerFSM fsm) { value.Value = 3; amount.Value = 1; time.Value = 1.2f; }; private static readonly Dictionary<UniqueBindDirection, Func<bool>> directionGet = new Dictionary<UniqueBindDirection, Func<bool>> { { UniqueBindDirection.UP, () => ((OneAxisInputControl)HeroInput.Up).IsPressed }, { UniqueBindDirection.DOWN, () => ((OneAxisInputControl)HeroInput.Down).IsPressed }, { UniqueBindDirection.LEFT, () => ((OneAxisInputControl)HeroInput.Left).IsPressed }, { UniqueBindDirection.RIGHT, () => ((OneAxisInputControl)HeroInput.Right).IsPressed } }; private static HeroActions HeroInput => HeroController.instance.inputHandler.inputActions; [HarmonyPrefix] private static void AddCrests(HeroController __instance) { //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Expected O, but got Unknown //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0267: Expected O, but got Unknown PlayMakerFSM bind = FsmUtil.GetFsmPreprocessed(((Component)__instance).gameObject, "Bind"); FsmState state = FsmUtil.GetState(bind, "Can Bind?"); FsmState state2 = FsmUtil.GetState(bind, "Bind Type"); FsmState state3 = FsmUtil.GetState(bind, "Quick Bind?"); FsmState state4 = FsmUtil.GetState(bind, "Bind Bell?"); FsmState state5 = FsmUtil.GetState(bind, "End Bind"); FsmState state6 = FsmUtil.GetState(bind, "Quick Craft?"); FsmState state7 = FsmUtil.GetState(bind, "Use Reserve Bind?"); FsmState state8 = FsmUtil.GetState(bind, "Reserve Bind Burst"); FsmInt healValue = FsmUtil.GetIntVariable(bind, "Heal Amount"); FsmInt healAmount = FsmUtil.GetIntVariable(bind, "Bind Amount"); FsmFloat healTime = FsmUtil.GetFloatVariable(bind, "Bind Time"); FsmState val = FsmUtil.AddState(bind, "Which Crest?"); FsmUtil.AddTransition(val, "Toolmaster", state6.name); FsmUtil.AddMethod(val, (Action)delegate { if (!NeedleforgePlugin.uniqueBind.ContainsKey(PlayerData.instance.CurrentCrestID)) { bind.SendEvent("Toolmaster"); } }, false); FsmUtil.ChangeTransition(state7, "FALSE", val.name); FsmUtil.ChangeTransition(state8, "FINISHED", val.name); foreach (ToolCrest crest in NeedleforgePlugin.newCrests) { FsmBool val2 = FsmUtil.AddBoolVariable(bind, "Is " + crest.name + " Equipped"); FsmUtil.AddAction(state, (FsmStateAction)new CheckIfCrestEquipped { Crest = FsmObject.op_Implicit((Object)(object)crest), storeValue = val2 }); FsmState val3 = FsmUtil.AddState(bind, crest.name + " Bind"); FsmEvent isTrue = FsmUtil.AddTransition(state2, crest.name ?? "", val3.name); FsmUtil.AddAction(state2, (FsmStateAction)new BoolTest { boolVariable = val2, isTrue = isTrue, everyFrame = false }); FsmUtil.AddTransition(val3, "FINISHED", state3.name); FsmUtil.AddMethod(val3, (Action)delegate { defaultBind(healValue, healAmount, healTime, bind); NeedleforgePlugin.bindEvents[crest.name](healValue, healAmount, healTime, bind); }, false); if (!NeedleforgePlugin.uniqueBind.TryGetValue(crest.name, out UniqueBindEvent bindData)) { continue; } FsmState val4 = FsmUtil.AddState(bind, crest.name + " Special Bind?"); FsmState val5 = FsmUtil.AddState(bind, crest.name + " Special Bind Trigger"); FsmUtil.AddTransition(val, crest.name + " Special", val4.name); FsmUtil.AddMethod(val, (Action)delegate { if (((ToolBase)crest).IsEquipped) { bind.SendEvent(crest.name + " Special"); } }, false); FsmUtil.AddTransition(val4, "FALSE", state4.name); FsmUtil.AddTransition(val4, "TRUE", val5.name); FsmUtil.AddMethod(val4, (Action)delegate { bind.SendEvent(directionGet[bindData.Direction]() ? "TRUE" : "FALSE"); }, false); FsmUtil.AddTransition(val5, "FINISHED", state5.name); FsmUtil.AddLambdaMethod(val5, bindData.lambdaMethod); } DelegateAction<Action> val6 = new DelegateAction<Action> { Method = delegate(Action action) { FsmInt intVariable = FsmUtil.GetIntVariable(bind, "Current Silk Cost"); FsmInt intVariable2 = FsmUtil.GetIntVariable(bind, "Silk Cost Witch"); FsmBool boolVariable = FsmUtil.GetBoolVariable(bind, "Is Witch Equipped"); bool flag = true; if (boolVariable.Value) { intVariable.Value = intVariable2.Value; } else { foreach (CrestData newCrestDatum in NeedleforgePlugin.newCrestData) { if (newCrestDatum.IsEquipped) { intVariable.Value = newCrestDatum.bindCost; flag = false; } } if (flag) { intVariable.Value = 9; } } action(); } }; val6.Arg = ((FsmStateAction)val6).Finish; int num = Array.FindIndex(state.Actions, delegate(FsmStateAction x) { ConvertBoolToInt val7 = (ConvertBoolToInt)(object)((x is ConvertBoolToInt) ? x : null); return val7 != null && ((NamedVariable)val7.intVariable).Name == "Current Silk Cost"; }); FsmUtil.ReplaceAction(state, num, (FsmStateAction)(object)val6); } [HarmonyPrefix] private static void AddTools(HeroController __instance) { PlayMakerFSM toolEventTarget = __instance.toolEventTarget; FsmState state = FsmUtil.GetState(toolEventTarget, "Tool Choice"); foreach (ToolData newTool in NeedleforgePlugin.newToolData) { if (newTool is LiquidToolData liquidToolData) { FsmState val = FsmUtil.AddState(toolEventTarget, liquidToolData.name + " ANIM"); tk2dSpriteAnimator animator = ((Component)__instance).GetComponent<tk2dSpriteAnimator>(); string clipName = liquidToolData.clip; FsmUtil.AddLambdaMethod(val, (Action<Action>)delegate(Action finish) { Action finish2 = finish; animator.Play(clipName); tk2dSpriteAnimator obj = animator; obj.AnimationCompleted = (Action<tk2dSpriteAnimator, tk2dSpriteAnimationClip>)Delegate.Combine(obj.AnimationCompleted, new Action<tk2dSpriteAnimator, tk2dSpriteAnimationClip>(FinishEventThenRemove)); NeedleforgePlugin.toolEventHooks[newTool.name + " BEFORE ANIM"](); void FinishEventThenRemove(tk2dSpriteAnimator sprite, tk2dSpriteAnimationClip clip) { if (!(clip.name != clipName)) { NeedleforgePlugin.toolEventHooks[newTool.name + " AFTER ANIM"](); tk2dSpriteAnimator obj2 = animator; obj2.AnimationCompleted = (Action<tk2dSpriteAnimator, tk2dSpriteAnimationClip>)Delegate.Remove(obj2.AnimationCompleted, new Action<tk2dSpriteAnimator, tk2dSpriteAnimationClip>(FinishEventThenRemove)); finish2(); } } }); FsmEvent val2 = FsmUtil.AddTransition(state, liquidToolData.name ?? "", val.name); Fsm fsm = toolEventTarget.FsmTemplate.fsm; FsmEvent[] events = toolEventTarget.Fsm.Events; int num = 0; FsmEvent[] array = (FsmEvent[])(object)new FsmEvent[1 + events.Length]; ReadOnlySpan<FsmEvent> readOnlySpan = new ReadOnlySpan<FsmEvent>(events); readOnlySpan.CopyTo(new Span<FsmEvent>(array).Slice(num, readOnlySpan.Length)); num += readOnlySpan.Length; array[num] = val2; fsm.Events = array; FsmUtil.AddTransition(val, "FINISHED", "Return Control"); } } } } } namespace Needleforge.Makers { internal static class CrestMaker { internal static Data CreateDefaultSaveData() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) Data result = default(Data); result.IsUnlocked = true; result.Slots = new List<SlotData>(); result.DisplayNewIndicator = true; return result; } internal static ToolCrest CreateCrest(CrestData crestData) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) ToolCrest val = ToolItemManager.GetAllCrests()[0]; ToolCrest val2 = ScriptableObject.CreateInstance<ToolCrest>(); val2.name = crestData.name; val2.crestGlow = (Sprite)(Object.op_Implicit((Object)(object)crestData.CrestGlow) ? ((object)crestData.CrestGlow) : ((object)val.crestGlow)); val2.crestSilhouette = (Sprite)(Object.op_Implicit((Object)(object)crestData.Silhouette) ? ((object)crestData.Silhouette) : ((object)val.crestSilhouette)); val2.crestSprite = (Sprite)(Object.op_Implicit((Object)(object)crestData.RealSprite) ? ((object)crestData.RealSprite) : ((object)val.crestSprite)); val2.displayName = crestData.displayName; val2.description = crestData.description; val2.slots = crestData.slots.ToArray(); val2.heroConfig = (HeroControllerConfig)(object)crestData.Moveset.HeroConfig; ((NamedScriptableObjectList<ToolCrest>)(object)ManagerSingleton<ToolItemManager>.Instance.crestList).Add(val2); NeedleforgePlugin.newCrests.Add(val2); return val2; } } internal class MovesetMaker { private static ConfigGroup? hunter; internal static void InitializeMoveset(MovesetData moveset) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_0100: 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_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_016f: 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_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Expected O, but got Unknown HeroControll