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 MikuBraken v1.2.2
BepInEx/plugins/MikuBraken/MikuBraken.dll
Decompiled 6 months agousing 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.Configuration; using BepInEx.Logging; using HarmonyLib; using LCSoundTool; using MikuBraken.Patches; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace MikuBraken { public class ConfigManager { private const string SectionGeneral = "General"; private const string SectionSound = "Sound"; public static ConfigEntry<bool> MikuModel; public static ConfigEntry<bool> MikuTerminal; public static ConfigEntry<bool> MikuDeleteOnKilled; public static ConfigEntry<bool> MikuScanTag; public static ConfigEntry<bool> MikuGlowingEyes; public static ConfigEntry<bool> MikuAngry; public static ConfigEntry<bool> MikuCaught; public static ConfigEntry<bool> MikuDies; public static ConfigEntry<bool> MikuFootsteps; public static ConfigEntry<bool> MikuCrackNeck; public static ConfigEntry<bool> MikuStun; public ConfigManager(ConfigFile cfg) { MikuModel = cfg.Bind<bool>("General", "MikuModel", true, "The Braken's model will be replaced by Miku"); MikuGlowingEyes = cfg.Bind<bool>("General", "MikuGlowingEyes", true, "Miku will have glowing eyes similar to the Braken"); MikuTerminal = cfg.Bind<bool>("General", "Terminal", true, "The Braken's bestiary entry will be replaced by Miku"); MikuDeleteOnKilled = cfg.Bind<bool>("General", "DeleteOnKilled", false, "Miku's model is deleted on death"); MikuScanTag = cfg.Bind<bool>("General", "ScanTag", true, "The Braken's scan tag is replaced with 'Hatune Miku'"); MikuAngry = cfg.Bind<bool>("Sound", "MikuAngry", true, "Replaces the sound when the Braken begins to chase the player"); MikuCaught = cfg.Bind<bool>("Sound", "MikuCaught", true, "Replaces the sound when a player spots the Braken in stealth"); MikuDies = cfg.Bind<bool>("Sound", "MikuDies", true, "Replaces the Braken's death sound"); MikuFootsteps = cfg.Bind<bool>("Sound", "MikuFootsteps", true, "Replaces the Braken's footstep sounds"); MikuCrackNeck = cfg.Bind<bool>("Sound", "MikuCrackNeck", true, "Adds a sound after Miku kills a player"); MikuStun = cfg.Bind<bool>("Sound", "MikuStun", true, "Replaces the Braken's stun sound"); } } [BepInPlugin("Wolfmyths.MikuBraken", "Miku Braken", "1.2.2")] public class MikuBrakenBase : BaseUnityPlugin { private const string modGUID = "Wolfmyths.MikuBraken"; private const string modName = "Miku Braken"; private const string modVersion = "1.2.2"; private readonly Harmony harmony = new Harmony("Wolfmyths.MikuBraken"); internal static MikuBrakenBase Instance; internal static ManualLogSource mls; internal static AudioClip Miku_Angry; internal static AudioClip Miku_Angry1; internal static AudioClip Miku_Caught; internal static AudioClip Miku_Caught1; internal static AudioClip Miku_Caught2; internal static AudioClip Miku_CrackNeck; internal static AudioClip Miku_Dies; internal static AudioClip Miku_Footstep; internal static AudioClip Miku_Footstep1; internal static AudioClip Miku_Footstep2; internal static AudioClip Miku_Footstep3; internal static AudioClip Miku_Stun; internal static List<GameObject> Prefabs; internal static GameObject Miku; internal static GameObject Miku_Eyes; internal static AssetBundle PrefabBundle; public static ConfigManager myConfig { get; internal set; } private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } myConfig = new ConfigManager(((BaseUnityPlugin)this).Config); mls = Logger.CreateLogSource("Wolfmyths.MikuBraken"); Log_Info("Mikudayooo"); mls = ((BaseUnityPlugin)this).Logger; string text = Mod_Folder(); PrefabBundle = AssetBundle.LoadFromFile(text + "model"); if ((Object)(object)PrefabBundle != (Object)null) { Log_Info("Prefab Mesh Asset bundles loaded"); Prefabs = PrefabBundle.LoadAllAssets<GameObject>().ToList(); Miku_Eyes = Prefabs[0]; Miku = Prefabs[1]; } else { Log_Error("Failed to load Prefab bundle, Miku's model will not work :("); } harmony.PatchAll(typeof(MikuBrakenBase)); harmony.PatchAll(typeof(FlowerManAIPatch)); harmony.PatchAll(typeof(TerminalPatch)); } private void Start() { string text = Mod_Folder(); Miku_Angry = SoundTool.GetAudioClip(text, "sfx", "Miku_Angry.wav", (AudioType)0); Miku_Angry1 = SoundTool.GetAudioClip(text, "sfx", "Miku_Angry1.wav", (AudioType)0); Miku_Caught = SoundTool.GetAudioClip(text, "sfx", "Miku_Caught.wav", (AudioType)0); Miku_Caught1 = SoundTool.GetAudioClip(text, "sfx", "Miku_Caught1.wav", (AudioType)0); Miku_Caught2 = SoundTool.GetAudioClip(text, "sfx", "Miku_Caught2.wav", (AudioType)0); Miku_CrackNeck = SoundTool.GetAudioClip(text, "sfx", "Miku_CrackNeck.wav", (AudioType)0); Miku_Dies = SoundTool.GetAudioClip(text, "sfx", "Miku_Dies.wav", (AudioType)0); Miku_Footstep = SoundTool.GetAudioClip(text, "sfx", "Miku_Footstep.wav", (AudioType)0); Miku_Footstep1 = SoundTool.GetAudioClip(text, "sfx", "Miku_Footstep1.wav", (AudioType)0); Miku_Footstep2 = SoundTool.GetAudioClip(text, "sfx", "Miku_Footstep2.wav", (AudioType)0); Miku_Footstep3 = SoundTool.GetAudioClip(text, "sfx", "Miku_Footstep3.wav", (AudioType)0); Miku_Stun = SoundTool.GetAudioClip(text, "sfx", "Miku_Stun.wav", (AudioType)0); if (ConfigManager.MikuFootsteps.Value) { SoundTool.ReplaceAudioClip("Step1", Miku_Footstep, 0.25f, "Flowerman(Clone)"); SoundTool.ReplaceAudioClip("Step2", Miku_Footstep1, 0.25f, "Flowerman(Clone)"); SoundTool.ReplaceAudioClip("Step3", Miku_Footstep2, 0.25f, "Flowerman(Clone)"); SoundTool.ReplaceAudioClip("Step4", Miku_Footstep3, 0.25f, "Flowerman(Clone)"); } if (ConfigManager.MikuCaught.Value) { SoundTool.ReplaceAudioClip("Found1", Miku_Caught, 0.35f, "Flowerman(Clone)"); SoundTool.ReplaceAudioClip("Found1", Miku_Caught1, 0.35f, "Flowerman(Clone)"); SoundTool.ReplaceAudioClip("Found1", Miku_Caught2, 0.3f, "Flowerman(Clone)"); } } public static void Log_Info(object msg) { mls.LogInfo(msg); } public static void Log_Warning(object msg) { mls.LogWarning(msg); } public static void Log_Error(object msg) { mls.LogError(msg); } public static string Mod_Folder() { return ((BaseUnityPlugin)Instance).Info.Location.TrimEnd("MikuBraken.dll".ToCharArray()); } public static AudioClip Roll_Next_Angry_Clip() { float num = Random.Range(0f, 1f); if (num >= 0.5f) { return Miku_Angry; } return Miku_Angry1; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "MikuBraken"; public const string PLUGIN_NAME = ""; public const string PLUGIN_VERSION = "1.0.0.0"; } } namespace MikuBraken.Patches { [HarmonyPatch(typeof(FlowermanAI))] internal class FlowerManAIPatch { private const int ENRAGE_BEHAVIOR_INDEX = 2; [HarmonyPatch(typeof(FlowermanAI), "Start")] [HarmonyPostfix] private static void OverrideStart(FlowermanAI __instance) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) if (ConfigManager.MikuModel.Value) { GameObject val = Object.Instantiate<GameObject>(MikuBrakenBase.Miku, ((Component)__instance).transform); ((Object)val).name = "Miku(Clone)"; val.SetActive(true); if (ConfigManager.MikuGlowingEyes.Value) { GameObject val2 = Object.Instantiate<GameObject>(MikuBrakenBase.Miku_Eyes, val.transform); ((Object)val2).name = "MikuEyes(Clone)"; val2.transform.localPosition = new Vector3(-0.0817f, 2.5481f, 0.1302f); val2.SetActive(true); } Renderer[] componentsInChildren = ((Component)((Component)__instance).transform.Find("FlowermanModel")).GetComponentsInChildren<Renderer>(); Renderer[] array = componentsInChildren; foreach (Renderer val3 in array) { val3.enabled = false; } } if (ConfigManager.MikuScanTag.Value) { ((Component)((Component)__instance).transform.Find("ScanNode")).GetComponent<ScanNodeProperties>().headerText = "Hatsune Miku"; } if (ConfigManager.MikuAngry.Value) { __instance.creatureAngerVoice.maxDistance = 35f; } if (ConfigManager.MikuDies.Value) { ((EnemyAI)__instance).dieSFX = MikuBrakenBase.Miku_Dies; } if (ConfigManager.MikuStun.Value) { ((EnemyAI)__instance).enemyType.stunSFX = MikuBrakenBase.Miku_Stun; } } [HarmonyPatch(typeof(EnemyAI), "PlayAudioOfCurrentState")] [HarmonyPrefix] private static void PreOverridePlayAudioOfCurrentState(FlowermanAI __instance) { if (ConfigManager.MikuAngry.Value && ((EnemyAI)__instance).currentBehaviourStateIndex == 2) { __instance.creatureAngerVoice.clip = MikuBrakenBase.Roll_Next_Angry_Clip(); } } [HarmonyPatch(typeof(FlowermanAI), "killAnimation")] [HarmonyPostfix] private static void OverrideKillAnimation(FlowermanAI __instance) { if (ConfigManager.MikuCrackNeck.Value) { __instance.crackNeckAudio.PlayOneShot(MikuBrakenBase.Miku_CrackNeck); } } [HarmonyPatch(typeof(FlowermanAI), "KillEnemy")] [HarmonyPostfix] private static void overrideKillEnemy(FlowermanAI __instance) { if (ConfigManager.MikuModel.Value) { if (!ConfigManager.MikuDeleteOnKilled.Value) { Transform val = ((Component)__instance).transform.Find("Miku(Clone)"); val.Rotate(-90f, 0f, 0f); } else { ((Component)((Component)__instance).transform.Find("Miku(Clone)")).gameObject.SetActive(false); } } } } internal class TerminalPatch { [HarmonyPatch(typeof(Terminal), "Awake")] [HarmonyPostfix] private static void OverrideTerminal(Terminal __instance) { if (!ConfigManager.MikuTerminal.Value) { return; } for (int i = 0; i < __instance.enemyFiles.Count; i++) { TerminalNode val = __instance.enemyFiles[i]; if (val.creatureName == "Brackens") { val.creatureName = "Hatsune Miku"; val.displayText = "PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\n\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPi-\r\n\r\nPiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!\r\n\r\n\r\nSaa nome, o mae suki darou? Yasai jusu\r\nWatashi ga kimeta, ima kimeta\r\nDakara nonde watashi no yasai JUICE,\r\nKakaku wa nihyaku en~!\r\n\r\nsoiya! soiya!\r\ndotsee! dotsee!\r\nsoiya! soiya!\r\ndotsee! dotsee!\r\n\r\n\r\nMaroyaka, yasai JUICE,\r\nFuwa fuwa yasai juice\r\nIchiban osusume na no wa\r\nMidori no jusuuu~!\r\n\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nVegitabura-na a-aa-aa-a-a-aaa!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nSeimei afureta, a-aa-aa-a-a-aaa!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nAnata mo ima a-aa-aa-a-a-aaa!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nYasai jusu ga suki ni naru!\r\n\r\n\r\nPiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!\r\n\r\nCome now, don't you love\r\nit? Vegetable juice\r\nThat's my decision, I've decided it now.\r\nThus you should drink\r\nmy vegetable juice,\r\nIt costs just 200 yen~!\r\n\r\nsoiya! soiya!\r\ndotsee! dotsee!\r\nsoiya! soiya!\r\ndotsee! dotsee!\r\n\r\n\r\nIt'll agree with you, vegetable juice,\r\nLight-weighted vegetable juice\r\nThe best juice I choose for you would be\r\nthe green vegtable juice~!\r\n\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nWe are vegetarian a-aa-aa-a-a-aaa!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nbursting with life, a-aa-aa-a-a-aaa!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nhappy vegetarians a-aa-aa-a-a-aaa!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nPoPiPoPiPo PoPiPo! PoPiPoPiPo PoPiPo!\r\nY.A.S.A Come here to love\r\n\r\nvegetable juice!"; break; } } for (int j = 0; j < __instance.terminalNodes.allKeywords.Count(); j++) { TerminalKeyword val2 = __instance.terminalNodes.allKeywords[j]; if (val2.word == "brackens") { val2.word = "hatsune miku"; break; } } } } }