Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SilkPhial v1.0.0
plugins/Silkphialmod.dll
Decompiled 5 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using Needleforge; using Needleforge.Data; using TeamCherry.Localization; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("silkphial")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("silkphial")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("319e44e5-02f1-45d1-b5d1-bbc42878e380")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] [BepInPlugin("com.xTruesX.silkphialmod", "Silk Phial Mod", "1.0.0")] public class main : BaseUnityPlugin { [HarmonyPatch(typeof(ToolItemStatesLiquid))] [HarmonyPatch(/*Could not decode attribute arguments.*/)] private class SilkPhial_UsableWhenEmpty_Patch { private static void Postfix(ToolItemStatesLiquid __instance, ref bool __result) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (!(((ToolItem)__instance).name != "Silk Phial") && ((ToolItem)__instance).SavedData.AmountLeft <= 0) { __result = false; } } } [HarmonyPatch(typeof(ToolItem), "get_IsUnlockedTest")] internal static class ToolItem_IsUnlockedTest_NullFix { private static bool Prefix(ToolItem __instance, ref bool __result) { if (AccessTools.Field(typeof(ToolItem), "alternateUnlockedTest")?.GetValue(__instance) == null) { __result = false; return false; } return true; } } [HarmonyPatch(typeof(PlayerData), "CountGameCompletion")] internal static class PlayerData_CountGameCompletionFixForSiPhi { private static void Postfix(PlayerData __instance) { ToolItem toolByName = ToolItemManager.GetToolByName("Silk Phial"); if ((Object)(object)toolByName != (Object)null && toolByName.IsUnlocked) { __instance.completionPercentage -= 1f; } } } [HarmonyPatch(typeof(LocalisedString))] [HarmonyPatch("ToString", new Type[] { typeof(bool) })] internal static class SilkPhial_ForceText_NoSheetKey { private static void Postfix(LocalisedString __instance, ref string __result) { if (PlayerData.instance == null) { return; } ToolItem toolByName = ToolItemManager.GetToolByName("Silk Phial"); if ((Object)(object)toolByName == (Object)null || !toolByName.IsUnlocked) { return; } string text = __result; if (!text.Contains("SilkPhial") && !text.Contains("silkphial") && !text.Contains("!!")) { return; } if (text.ToLower().Contains("display") || text.Contains("Name")) { __result = "Silk Phial"; } else if (text.ToLower().Contains("desc")) { if (PlayerData.instance.CurrentCrestID == "Toolmaster") { __result = "A phial filled to the brim with Silk. Used to inject silk into a bug's shell \n\nGives 1-2 spools of silk when injected."; } else { __result = "A phial filled to the brim with Silk. Used to inject silk into a bug's shell \n\nGives 3 spools of silk when injected."; } } } } [CompilerGenerated] private sealed class <BenchRefillWatcher>d__2 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public main <>4__this; private string <toolName>5__2; private bool <wasAtBench>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <BenchRefillWatcher>d__2(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <toolName>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; main main2 = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; goto IL_0042; case 1: <>1__state = -1; goto IL_0042; case 2: { <>1__state = -1; break; } IL_0042: if ((Object)(object)HeroController.instance == (Object)null || PlayerData.instance == null) { <>2__current = null; <>1__state = 1; return true; } <toolName>5__2 = "Silk Phial"; <wasAtBench>5__3 = false; break; } bool atBench = PlayerData.instance.atBench; if (atBench && !<wasAtBench>5__3) { ToolItemStatesLiquid val = null; foreach (ToolItem newTool in NeedleforgePlugin.newTools) { if (newTool.name == <toolName>5__2) { val = (ToolItemStatesLiquid)(object)((newTool is ToolItemStatesLiquid) ? newTool : null); break; } } if (!((ToolItem)val).IsUnlocked) { ((ToolItem)val).Unlock((Action)null, (PopupFlags)3); } if ((Object)(object)val != (Object)null) { Data data = ((SerializableNamedList<Data, NamedData>)(object)PlayerData.instance.ToolLiquids).GetData(<toolName>5__2); data.RefillsLeft = val.RefillsMax; data.UsedExtra = false; data.SeenEmptyState = true; ((SerializableNamedList<Data, NamedData>)(object)PlayerData.instance.ToolLiquids).SetData(<toolName>5__2, data); } else { ((BaseUnityPlugin)main2).Logger.LogError((object)"Bench refill: Tool N/A"); } } <wasAtBench>5__3 = atBench; <>2__current = null; <>1__state = 2; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private void Awake() { //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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_00dc: 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_00ed: Expected O, but got Unknown //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Expected O, but got Unknown //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin loaded"); Harmony.CreateAndPatchAll(typeof(main), (string)null); Harmony.CreateAndPatchAll(typeof(SilkPhial_UsableWhenEmpty_Patch), (string)null); Harmony.CreateAndPatchAll(typeof(ToolItem_IsUnlockedTest_NullFix), (string)null); Harmony.CreateAndPatchAll(typeof(PlayerData_CountGameCompletionFixForSiPhi), (string)null); Harmony.CreateAndPatchAll(typeof(SilkPhial_ForceText_NoSheetKey), (string)null); AssetBundle obj = AssetBundle.LoadFromFile(Path.Combine(Paths.PluginPath, "silkphial")); Sprite inventorySprite = obj.LoadAsset<Sprite>("SilkPhial"); Sprite hudSprite = obj.LoadAsset<Sprite>("SilkPhialHud"); Sprite poisonInventorySprite = obj.LoadAsset<Sprite>("SilkPhial_Poison"); Sprite poisonHudSprite = obj.LoadAsset<Sprite>("SilkPhial_PoisonHud"); Sprite val = obj.LoadAsset<Sprite>("SilkPhial_Empty"); Sprite val2 = obj.LoadAsset<Sprite>("SilkPhial_EmptyHud"); StateSprites val3 = new StateSprites { InventorySprite = inventorySprite, HudSprite = hudSprite, PoisonInventorySprite = poisonInventorySprite, PoisonHudSprite = poisonHudSprite }; StateSprites val4 = new StateSprites { InventorySprite = val, HudSprite = val2, PoisonInventorySprite = val, PoisonHudSprite = val2 }; LiquidToolData val5 = NeedleforgePlugin.AddLiquidTool("Silk Phial", 10, 4, "SilkPhial_InfiniteBench", Color.white, (ReplenishResources)1, (ReplenishUsages)0, 1f, val3, val4, "Reserve BindBurst Air"); int CrSilk = 1; ((SerializableNamedList<Data, NamedData>)(object)PlayerData.instance.ToolLiquids).SetData("Silk Phial", new Data { RefillsLeft = 10, UsedExtra = false, SeenEmptyState = false }); ((ToolData)val5).displayName = new LocalisedString { Sheet = "silkphial", Key = "Display" }; ((ToolData)val5).description = new LocalisedString { Key = "desc", Sheet = "silkphial" }; LiquidToolData liquidData = val5; liquidData.beforeAnim = delegate { //IL_0017: 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) ToolItemStatesLiquid item = liquidData.Item; if (!((Object)(object)item == (Object)null) && ((ToolItem)item).SavedData.AmountLeft <= 0) { AttackToolBinding? attackToolBinding = ToolItemManager.GetAttackToolBinding((ToolItem)(object)item); if (attackToolBinding.HasValue) { ToolItemManager.ReportBoundAttackToolFailed(attackToolBinding.Value); } } }; val5.afterAnim = delegate { if (!((Object)(object)HeroController.instance == (Object)null)) { if (PlayerData.instance.CurrentCrestID == "Toolmaster") { PlayerData instance = PlayerData.instance; instance.silk += CrSilk; if (CrSilk == 1) { CrSilk = 2; } else { CrSilk = 1; } } else { PlayerData instance2 = PlayerData.instance; instance2.silk += 3; } HeroController.instance.AddSilk(0, false); } }; ((MonoBehaviour)this).StartCoroutine(BenchRefillWatcher()); } private void Update() { } [IteratorStateMachine(typeof(<BenchRefillWatcher>d__2))] private IEnumerator BenchRefillWatcher() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <BenchRefillWatcher>d__2(0) { <>4__this = this }; } private void SetPrivate(object obj, string fieldName, object value) { if (obj == null) { throw new Exception("SetPrivate: obj is null"); } Type type = obj.GetType(); while (type != null) { FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { field.SetValue(obj, value); return; } type = type.BaseType; } throw new Exception($"SetPrivate: Field '{fieldName}' not found on {obj.GetType()}"); } }