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 TuneWeaver v0.1.1
TuneWeaver.dll
Decompiled 4 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HarmonyLib; using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using Microsoft.CodeAnalysis; using Silksong.FsmUtil; using Silksong.FsmUtil.Actions; using TuneWeaver.Data; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TuneWeaver")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("0.1.1.0")] [assembly: AssemblyInformationalVersion("0.1.1+700ca7bdd4a6ebec87e4b7278d748df8ec507656")] [assembly: AssemblyProduct("TuneWeaver")] [assembly: AssemblyTitle("TuneWeaver")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/GamingInfinite/TuneWeaver")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.1.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Microsoft.CodeAnalysis.Embedded] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] [Microsoft.CodeAnalysis.Embedded] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace Microsoft.CodeAnalysis { [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace TuneWeaver { [BepInPlugin("io.github.gaminginfinite.tuneweaver", "TuneWeaver", "0.1.1")] public class TuneWeaverPlugin : BaseUnityPlugin { public static ManualLogSource logSource; public static Harmony harmony; public static List<SongData> AllSongs = new List<SongData>(); public static Action ActivationCheck = delegate { if (ActiveSongData != null) { logSource.LogInfo((object)(ActiveSongData.id ?? "")); } }; private static SongData? _activeSongData; public const string Id = "io.github.gaminginfinite.tuneweaver"; public static SongData? ActiveSongData { get { return _activeSongData; } set { _activeSongData = value ?? AllSongs.FirstOrDefault((SongData s) => s.isActive); } } public static string Name => "TuneWeaver"; public static string Version => "0.1.1"; private void Awake() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogInfo((object)("Plugin " + Name + " (io.github.gaminginfinite.tuneweaver) has loaded!")); logSource = ((BaseUnityPlugin)this).Logger; harmony = new Harmony("voidbaroness.tuneweaver"); harmony.PatchAll(); } public static SongData RegisterSong(string id, AudioClip audioClip) { SongData songData = new SongData(id, audioClip); AllSongs.Add(songData); return songData; } } } namespace TuneWeaver.Patches { [HarmonyPatch(typeof(PlayMakerFSM), "Start")] public class NeedolinPatch { [HarmonyPostfix] public static void Postfix(PlayMakerFSM __instance) { //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Expected O, but got Unknown bool flag = ((Object)__instance).name.Contains("RestBench") && __instance.FsmName == "Bench Control"; if (!((__instance != null && ((Object)__instance).name == "Hero_Hornet(Clone)" && __instance.FsmName == "Silk Specials") || flag)) { return; } Fsm fsm = __instance.Fsm; Fsm val; if (flag) { RunFSM action2 = FsmUtil.GetAction<RunFSM>(fsm, "Needolin Sub", 0); val = ((action2 != null) ? action2.fsmTemplateControl.RunFsm : null); } else { RunFSM action3 = FsmUtil.GetAction<RunFSM>(fsm, "Needolin Sub", 2); val = ((action3 != null) ? action3.fsmTemplateControl.RunFsm : null); } FsmState state = val.GetState("Start Needolin"); FsmState state2 = val.GetState("Start Needolin Benched"); FsmState startNeedolinProper = val.GetState("Start Needolin Proper"); val.GetState("Cancelable"); FsmState state3 = val.GetState("Set Silk Drain Time"); FsmState state4 = val.GetState("Play Needolin"); FsmState state5 = val.GetState("Play Needolin Benched"); FsmState val2 = FsmUtil.AddState(val, "Tune Weaver"); FsmUtil.AddTransition(val2, "FINISHED", startNeedolinProper.Name); FsmUtil.ChangeTransition(state3, "FINISHED", val2.Name); FsmBool atBench = val.GetFsmBool("At Bench"); AudioClip defaultHornetNeedolin = (AudioClip)FsmUtil.GetAction<StartNeedolinAudioLoop>(startNeedolinProper, 6).DefaultClip.Value; FsmString needolinClip = val.GetFsmString("Play Clip"); DelegateAction<Action> val3 = new DelegateAction<Action> { Method = delegate(Action action) { TuneWeaverPlugin.ActivationCheck(); SongData activeSongData3 = TuneWeaverPlugin.ActiveSongData; if (activeSongData3 == null) { needolinClip.Value = (atBench.Value ? "NeedolinSit Start" : "Needolin Start"); } else if (activeSongData3.SitStartAnimName == "" && atBench.Value) { needolinClip.Value = "NeedolinSit Start"; } else if (activeSongData3.StandStartAnimName == "" && !atBench.Value) { needolinClip.Value = "Needolin Start"; } else { needolinClip.Value = (atBench.Value ? activeSongData3.SitStartAnimName : activeSongData3.StandStartAnimName); } action(); } }; val3.Arg = ((FsmStateAction)val3).Finish; DelegateAction<Action> val4 = new DelegateAction<Action> { Method = delegate(Action action) { TuneWeaverPlugin.ActivationCheck(); SongData activeSongData2 = TuneWeaverPlugin.ActiveSongData; if (activeSongData2 == null) { needolinClip.Value = (atBench.Value ? "NeedolinSit Play" : "Needolin Play"); } else if (activeSongData2.SitAnimName == "" && atBench.Value) { needolinClip.Value = "NeedolinSit Play"; } else if (activeSongData2.StandAnimName == "" && !atBench.Value) { needolinClip.Value = "Needolin Play"; } else { needolinClip.Value = (atBench.Value ? activeSongData2.SitAnimName : activeSongData2.StandAnimName); } action(); } }; val4.Arg = ((FsmStateAction)val4).Finish; FsmUtil.ReplaceAction(state, (FsmStateAction)(object)val3, 6); FsmUtil.ReplaceAction(state2, (FsmStateAction)(object)val3, 2); FsmUtil.ReplaceAction(state4, (FsmStateAction)(object)val4, 4); FsmUtil.ReplaceAction(state5, (FsmStateAction)(object)val4, 2); FsmUtil.AddLambdaMethod(val2, (Action<Action>)delegate(Action finish) { TuneWeaverPlugin.ActivationCheck(); SongData activeSongData = TuneWeaverPlugin.ActiveSongData; if (activeSongData == null) { FsmUtil.GetAction<StartNeedolinAudioLoop>(startNeedolinProper, 6).DefaultClip.Value = (Object)(object)defaultHornetNeedolin; } else { AudioClip audioClip = activeSongData.audioClip; FsmUtil.GetAction<StartNeedolinAudioLoop>(startNeedolinProper, 6).DefaultClip.Value = (Object)(object)audioClip; } finish(); }); } } } namespace TuneWeaver.Data { public class SongData { public string id = ""; public bool isActive; public AudioClip audioClip; public string StandStartAnimName = ""; public string SitStartAnimName = ""; public string StandAnimName = ""; public string SitAnimName = ""; public SongData(string id, AudioClip audioClip) { this.id = id; this.audioClip = audioClip; } public void AssignAnims(string startStand = "", string startSit = "", string playStand = "", string playSit = "") { StandStartAnimName = startStand; StandAnimName = playStand; SitStartAnimName = startSit; SitAnimName = playSit; } public void Activate() { isActive = true; TuneWeaverPlugin.ActiveSongData = this; } public void Deactivate() { isActive = false; TuneWeaverPlugin.ActiveSongData = null; } } }