Decompiled source of MikuBraken v1.2.2

BepInEx/plugins/MikuBraken/MikuBraken.dll

Decompiled 2 weeks ago
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.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;
				}
			}
		}
	}
}