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 FlintSlatePlus v1.0.3
FlintSlatePlus.dll
Decompiled 10 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("MHZ")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyCopyright("Copyright © 2025 Masaicker")] [assembly: AssemblyDescription("A Hollow Knight Silksong mod that extends FlintSlate and Flea Brew (Quickening) duration")] [assembly: AssemblyFileVersion("1.0.3.0")] [assembly: AssemblyInformationalVersion("1.0.3")] [assembly: AssemblyProduct("FlintSlatePlus")] [assembly: AssemblyTitle("FlintSlatePlus")] [assembly: AssemblyVersion("1.0.3.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } 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; } } } namespace FlintSlatePlus { [BepInPlugin("Mhz.FlintSlatePlus", "FlintSlatePlus", "1.0.3")] public class FlintSlatePlus : BaseUnityPlugin { public const string PluginGuid = "Mhz.FlintSlatePlus"; public const string PluginName = "FlintSlatePlus"; public const string PluginVersion = "1.0.3"; internal static ManualLogSource? Log; private Harmony? harmony; public static ConfigEntry<float>? FlintSlateDuration; public static ConfigEntry<bool>? EnableFlintSlateMod; public static ConfigEntry<bool>? EnableFlintSlateVisualEffects; public static ConfigEntry<float>? FleaBrewDuration; public static ConfigEntry<bool>? EnableFleaBrewMod; public static ConfigEntry<bool>? EnableFleaBrewVisualEffects; private void Awake() { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; EnableFlintSlateMod = ((BaseUnityPlugin)this).Config.Bind<bool>("General / 通用设置", "EnableFlintSlateMod", true, "Enable FlintSlate duration modification / 启用燧石板持续时间修改"); FlintSlateDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Settings / 设置", "FlintSlateDuration", 60f, new ConfigDescription("FlintSlate BUFF duration in seconds (vanilla: ~8s) / 燧石板BUFF持续时间(秒)(原版约8秒)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 9999f), Array.Empty<object>())); EnableFlintSlateVisualEffects = ((BaseUnityPlugin)this).Config.Bind<bool>("Visual Effects / 视觉效果", "EnableFlintSlateVisualEffects", false, "Enable FlintSlate flashing effect / 启用燧石板闪烁效果"); EnableFleaBrewMod = ((BaseUnityPlugin)this).Config.Bind<bool>("General / 通用设置", "EnableFleaBrewMod", true, "Enable Flea Brew (Quickening) duration modification / 启用跳蚤秘酿(加速)持续时间修改"); FleaBrewDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Settings / 设置", "FleaBrewDuration", 60f, new ConfigDescription("Flea Brew (Quickening) duration in seconds (vanilla: ~10s) / 跳蚤秘酿(加速)持续时间(秒)(原版约10秒)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 9999f), Array.Empty<object>())); EnableFleaBrewVisualEffects = ((BaseUnityPlugin)this).Config.Bind<bool>("Visual Effects / 视觉效果", "EnableFleaBrewVisualEffects", false, "Enable Flea Brew flashing effect / 启用跳蚤秘酿闪烁效果"); Log.LogInfo((object)"FlintSlatePlus v1.0.3 loaded! / 已加载!"); Log.LogInfo((object)$"Current config - FlintSlate Enabled / 燧石板启用: {EnableFlintSlateMod.Value}, Duration / 持续时间: {FlintSlateDuration.Value}秒, Visual Effects / 视觉效果: {EnableFlintSlateVisualEffects.Value}"); Log.LogInfo((object)$"Current config - FleaBrew Enabled / 跳蚤秘酿启用: {EnableFleaBrewMod.Value}, Duration / 持续时间: {FleaBrewDuration.Value}秒, Visual Effects / 视觉效果: {EnableFleaBrewVisualEffects.Value}"); harmony = new Harmony("Mhz.FlintSlatePlus"); harmony.PatchAll(); } private void OnDestroy() { Harmony? obj = harmony; if (obj != null) { obj.UnpatchSelf(); } } public static float GetOriginalDuration(HeroNailImbuement instance, NailElements element) { try { FieldInfo field = typeof(HeroNailImbuement).GetField("currentImbuement", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { object value = field.GetValue(instance); if (value != null) { Type type = value.GetType(); FieldInfo field2 = type.GetField("Duration", BindingFlags.Instance | BindingFlags.Public); if (field2 != null) { return (float)field2.GetValue(value); } } } } catch (Exception ex) { ManualLogSource? log = Log; if (log != null) { log.LogWarning((object)("Failed to get original duration / 获取原始持续时间失败: " + ex.Message)); } } return 60f; } } [HarmonyPatch(typeof(HeroNailImbuement))] [HarmonyPatch("SetElement")] public class HeroNailImbuement_SetElement_Patch { private static void Postfix(HeroNailImbuement __instance, NailElements element) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Invalid comparison between Unknown and I4 //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Invalid comparison between Unknown and I4 if ((FlintSlatePlus.EnableFlintSlateMod != null && !FlintSlatePlus.EnableFlintSlateMod.Value) || ((int)element != 1 && (int)element != 2)) { return; } float originalDuration = FlintSlatePlus.GetOriginalDuration(__instance, element); FieldInfo field = typeof(HeroNailImbuement).GetField("imbuementTimeLeft", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { if (FlintSlatePlus.FlintSlateDuration != null) { float value = FlintSlatePlus.FlintSlateDuration.Value; field.SetValue(__instance, value); string arg = (((int)element == 1) ? "Fire/火元素(燧石板)" : "Poison/毒元素(花心囊)"); ManualLogSource? log = FlintSlatePlus.Log; if (log != null) { log.LogInfo((object)$"{arg} BUFF duration modified / BUFF持续时间已修改: {originalDuration:F1}s → {value:F1}s"); } } } else { ManualLogSource? log2 = FlintSlatePlus.Log; if (log2 != null) { log2.LogError((object)"Cannot find imbuementTimeLeft field - MOD may be incompatible with current game version / 无法找到imbuementTimeLeft字段 - MOD可能不兼容当前游戏版本"); } } if (FlintSlatePlus.EnableFlintSlateVisualEffects == null || FlintSlatePlus.EnableFlintSlateVisualEffects.Value) { return; } FieldInfo field2 = typeof(HeroNailImbuement).GetField("flashingHandle", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field3 = typeof(HeroNailImbuement).GetField("spriteFlash", BindingFlags.Instance | BindingFlags.NonPublic); if (field2 != null && field3 != null) { object value2 = field3.GetValue(__instance); object value3 = field2.GetValue(__instance); if (value2 != null && value3 != null) { value2.GetType().GetMethod("CancelRepeatingFlash", new Type[1] { typeof(FlashHandle) })?.Invoke(value2, new object[1] { value3 }); } } } } [HarmonyPatch(typeof(HeroController))] [HarmonyPatch("ActivateQuickening")] public class HeroController_ActivateQuickening_Patch { private static void Postfix(HeroController __instance) { if (FlintSlatePlus.EnableFleaBrewMod != null && !FlintSlatePlus.EnableFleaBrewMod.Value) { return; } FieldInfo field = typeof(HeroController).GetField("quickeningTimeLeft", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null && FlintSlatePlus.FleaBrewDuration != null) { float num = (float)field.GetValue(__instance); float value = FlintSlatePlus.FleaBrewDuration.Value; field.SetValue(__instance, value); ManualLogSource? log = FlintSlatePlus.Log; if (log != null) { log.LogInfo((object)$"Flea Brew (Quickening) duration modified / 跳蚤秘酿(加速)持续时间已修改: {num:F1}s → {value:F1}s"); } } else { ManualLogSource? log2 = FlintSlatePlus.Log; if (log2 != null) { log2.LogError((object)"Cannot find quickeningTimeLeft field - MOD may be incompatible with current game version / 无法找到quickeningTimeLeft字段 - MOD可能不兼容当前游戏版本"); } } if (FlintSlatePlus.EnableFleaBrewVisualEffects == null || FlintSlatePlus.EnableFleaBrewVisualEffects.Value) { return; } FieldInfo field2 = typeof(HeroController).GetField("quickeningFlash", BindingFlags.Instance | BindingFlags.NonPublic); FieldInfo field3 = typeof(HeroController).GetField("spriteFlash", BindingFlags.Instance | BindingFlags.NonPublic); if (field2 != null && field3 != null) { object value2 = field3.GetValue(__instance); object value3 = field2.GetValue(__instance); if (value2 != null && value3 != null) { value2.GetType().GetMethod("CancelRepeatingFlash", new Type[1] { typeof(FlashHandle) })?.Invoke(value2, new object[1] { value3 }); } } } } }