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 VoiceActedMithrixRedux v1.1.1
plugins/Voice Acted Mithrix.dll
Decompiled 3 months agousing System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using On.RoR2; using On.RoR2.CharacterSpeech; using On.RoR2.UI.MainMenu; using R2API; using R2API.Networking; using R2API.Networking.Interfaces; using RoR2; using RoR2.CharacterSpeech; using RoR2.UI; using RoR2.UI.MainMenu; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI; using VoiceActedMithrix.UI; [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("Voice Acted Mithrix")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Voice Acted Mithrix")] [assembly: AssemblyTitle("Voice Acted Mithrix")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] namespace Voice_Acted_Mithrix.Properties { [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { ResourceManager resourceManager = new ResourceManager("Voice_Acted_Mithrix.Properties.Resources", typeof(Resources).Assembly); resourceMan = resourceManager; } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal Resources() { } } } namespace VoiceActedMithrix { internal class BossLineEvent { public string eventName; public GameObject source; public GameObject owner; public bool angyLine; public BossLineEvent(string name, GameObject gameObject, GameObject ownerObject, bool angy = false) { eventName = name; source = gameObject; angyLine = angy; owner = ownerObject; } public uint Play() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown if (Configuration.PlayerSourcedVoice.Value) { source = ((Component)VoiceActedMithrix.GetLocalPlayer()).gameObject; } uint result = AkSoundEngine.PostEvent(eventName, source, 1u, new EventCallback(EndEventCallback), (object)null); if (NetworkServer.active) { NetMessageExtensions.Send((INetMessage)(object)new NetworkBossVoiceMessage { name = eventName, source = source }, (NetworkDestination)1); } return result; } private void EndEventCallback(object in_cookie, AkCallbackType callbackType, object in_info) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 if ((int)callbackType == 1 && NetworkServer.active && Object.op_Implicit((Object)(object)source) && Object.op_Implicit((Object)(object)owner)) { BossVoiceComponent bossVoiceComponent = owner.GetComponent<BossVoiceComponent>(); if (!Object.op_Implicit((Object)(object)bossVoiceComponent)) { bossVoiceComponent = owner.AddComponent<BossVoiceComponent>(); } if (angyLine) { bossVoiceComponent.angy = false; } bossVoiceComponent.playingLine = false; } } } internal class BossVoiceComponent : MonoBehaviour { internal bool playingLine = false; internal bool delaying = false; private List<BossLineEvent> queuedLines = new List<BossLineEvent>(); internal bool gone = false; internal bool angy = false; private bool hurt = false; internal bool canBeAngy = false; private int angyCounter = 2; private float timer; private float baseDelay = 1f; private float deltaDelay = 0.3f; private void Start() { timer = baseDelay + Random.Range(0f - deltaDelay, deltaDelay); } internal void FixedUpdate() { if (timer > 0f) { timer -= Time.fixedDeltaTime; } else { delaying = false; } if (queuedLines.Count > 0 && !playingLine && !delaying) { PlaySound(queuedLines[0]); queuedLines.RemoveAt(0); } } internal void TryVoiceLine(BossLineEvent sound) { if (!angy) { if (!hurt && sound.eventName.Contains("BROTHERHURT")) { hurt = true; } if (queuedLines.Count > 2) { BecomePissed(sound.source); } else if (playingLine || delaying || queuedLines.Count > 0) { queuedLines.Add(sound); } else { PlaySound(sound); } } } internal void BecomePissed(GameObject source) { if (canBeAngy) { queuedLines.Clear(); if (Random.Range(0, angyCounter * 4 + 1) == 0) { angy = true; BossLineEvent item = ((!((Object)((Component)this).gameObject).name.Contains("FalseSon")) ? (hurt ? new BossLineEvent("VAMR_" + Configuration.MithrixVoice.Value + "_BROTHERHURT_QUEUEFULL", source, source, angy: true) : new BossLineEvent("VAMR_" + Configuration.MithrixVoice.Value + "_BROTHER_QUEUEFULL", source, source, angy: true)) : new BossLineEvent("VAMR_" + Configuration.FalseSonVoice.Value + "_FALSESON_QUEUEFULL", source, source, angy: true)); queuedLines.Add(item); angyCounter = 2; } else { angyCounter--; } } } internal void PlaySound(BossLineEvent soundEvent) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Invalid comparison between Unknown and I4 timer = baseDelay + Random.Range(0f - deltaDelay, deltaDelay); playingLine = true; delaying = true; uint value = soundEvent.Play(); uint[] array = new uint[10]; uint num = (uint)array.Length; AKRESULT playingIDsFromGameObject = AkSoundEngine.GetPlayingIDsFromGameObject(soundEvent.source, ref num, array); if ((int)playingIDsFromGameObject != 1 || !array.Contains(value)) { playingLine = (angy = false); } } } internal class Configuration { private static ConfigFile configFile; internal const int DefaultMithrixVoice = 0; internal const int DefaultFalseSonVoice = 0; internal const bool DefaultPlayerSourcedVoice = false; internal const bool DefaultDisplayUI = true; internal static ConfigEntry<int> MithrixVoice { get; private set; } internal static ConfigEntry<int> FalseSonVoice { get; private set; } internal static ConfigEntry<bool> PlayerSourcedVoice { get; private set; } internal static ConfigEntry<bool> DisplayUI { get; private set; } internal static void LoadConfig() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown configFile = new ConfigFile(Paths.ConfigPath + "/VAMithrix.cfg", true); MithrixVoice = configFile.Bind<int>("Voices", "Mithrix VA", 0, "Voice actor to use for Mithrix boss. 0: MotherEgg | 1: KKing"); FalseSonVoice = configFile.Bind<int>("Voices", "False Son VA", 0, "Voice actor to use for False Son boss. 0: SkellyVA | 1: KKing"); PlayerSourcedVoice = configFile.Bind<bool>("Settings", "Use Player As Voice Source", false, "If true, the voice will source directly from the player object rather than the boss, giving more consistent volume without scaling over distance"); DisplayUI = configFile.Bind<bool>("Settings", "Display Voice Changing UI", true, "If false, will no longer display the UI on the title screen and will not allow changing voice without opening config file"); } } internal class NetworkBossVoiceMessage : INetMessage, ISerializableObject { internal string name; internal GameObject source; public void Serialize(NetworkWriter writer) { writer.Write(name); writer.Write(source); } public void Deserialize(NetworkReader reader) { name = reader.ReadString(); source = reader.ReadGameObject(); } public void OnReceived() { if (Object.op_Implicit((Object)(object)source) && !NetworkServer.active) { if (Configuration.PlayerSourcedVoice.Value) { source = ((Component)VoiceActedMithrix.GetLocalPlayer()).gameObject; } AkSoundEngine.PostEvent(name, source); } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.Egg.VoiceActedMithrix", "Voice Acted Mithrix Redux", "1.1.1")] public class VoiceActedMithrix : BaseUnityPlugin { public const string MODNAME = "com.Egg.VoiceActedMithrix"; public const string MODTITLE = "Voice Acted Mithrix Redux"; public const string MODVERS = "1.1.1"; internal static string BankPathBrother; internal static string BankPathFalseson; internal static string BankPathVulture; internal static string BankPathSolus; internal static string BankPathChef; private static string[] brotherFileNames = new string[2] { "vamithrixredux.bnk", "vakkingmithrix.bnk" }; private static string[] falseSonFileNames = new string[2] { "vafalseson.bnk", "vakkingfalseson.bnk" }; private static string vultureFileName = "vavulture.bnk"; private static string solusFileName = "vasolus.bnk"; private static string chefFileName = "vachef.bnk"; internal static uint currentMithrixVoiceBank; internal static uint currentFalseSonVoiceBank; public static PluginInfo PInfo { get; private set; } private void Awake() { PInfo = ((BaseUnityPlugin)this).Info; Configuration.LoadConfig(); BankPathBrother = GetBrotherPath(Configuration.MithrixVoice.Value); BankPathFalseson = GetFalseSonPath(Configuration.FalseSonVoice.Value); BankPathVulture = GetVulturePath(); BankPathChef = GetChefPath(); BankPathSolus = GetSolusPath(); SoundBanks.Add(BankPathVulture); SoundBanks.Add(BankPathChef); SoundBanks.Add(BankPathSolus); currentMithrixVoiceBank = SoundBanks.Add(BankPathBrother); currentFalseSonVoiceBank = SoundBanks.Add(BankPathFalseson); NetworkingAPI.RegisterMessageType<NetworkBossVoiceMessage>(); if (Configuration.MithrixVoice.Value == 0) { HereticKurskanFix(); } if (Configuration.DisplayUI.Value) { UIManager.Init(); } } internal static string GetBrotherPath(int index) { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "soundbanks", brotherFileNames[index]); } internal static string GetFalseSonPath(int index) { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "soundbanks", falseSonFileNames[index]); } internal static string GetVulturePath() { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "soundbanks", vultureFileName); } internal static string GetChefPath() { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "soundbanks", chefFileName); } internal static string GetSolusPath() { return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "soundbanks", solusFileName); } internal static void LoadBrotherVoice() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) SoundBanks.Remove(currentMithrixVoiceBank); currentMithrixVoiceBank = SoundBanks.Add(GetBrotherPath(Configuration.MithrixVoice.Value)); } internal static void LoadFalseSonVoice() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) SoundBanks.Remove(currentFalseSonVoiceBank); currentFalseSonVoiceBank = SoundBanks.Add(GetFalseSonPath(Configuration.FalseSonVoice.Value)); } private void OnEnable() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown BrotherSpeechDriver.SendReponseFromPool += new hook_SendReponseFromPool(BrotherSpeechDriver_SendReponseFromPool); FalseSonBossSpeechDriver.SendReponseFromPool += new hook_SendReponseFromPool(FalseSonBossSpeechDriver_SendReponseFromPool); CharacterSpeechController.SpeakNow += new hook_SpeakNow(OnSpeak); OverrideFightBase.NpcMessage += new hook_NpcMessage(VultureSpeak); if (Configuration.DisplayUI.Value) { MainMenuController.Start += new hook_Start(UIManager.AddUI); } } private void OnDisable() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown BrotherSpeechDriver.SendReponseFromPool -= new hook_SendReponseFromPool(BrotherSpeechDriver_SendReponseFromPool); FalseSonBossSpeechDriver.SendReponseFromPool -= new hook_SendReponseFromPool(FalseSonBossSpeechDriver_SendReponseFromPool); CharacterSpeechController.SpeakNow -= new hook_SpeakNow(OnSpeak); OverrideFightBase.NpcMessage -= new hook_NpcMessage(VultureSpeak); if (Configuration.DisplayUI.Value) { MainMenuController.Start -= new hook_Start(UIManager.AddUI); } } private static void OnSpeak(orig_SpeakNow orig, CharacterSpeechController self, ref SpeechInfo speechInfo) { orig.Invoke(self, ref speechInfo); CharacterBody currentCharacterBody = self.currentCharacterBody; GameObject sourceObject = ((!Object.op_Implicit((Object)(object)currentCharacterBody)) ? ((Component)self).gameObject : ((Component)self.currentCharacterBody).gameObject); if (speechInfo.token.Contains("BROTHER")) { BrotherSpeak(speechInfo.token, sourceObject); } else if (speechInfo.token.Contains("FALSESONBOSS")) { FalseSonSpeak(speechInfo.token, sourceObject); } else if (speechInfo.token.Contains("SOLUSHEART")) { HeartSpeak(speechInfo.token, sourceObject); } else if (speechInfo.token.Contains("MEALPREP")) { ChefSpeak(speechInfo.token, sourceObject); } } private static void BrotherSpeak(string token, GameObject sourceObject) { string modifiedToken = GetModifiedToken(token, Configuration.MithrixVoice.Value); BossVoiceComponent bossVoiceComponent = sourceObject.GetComponent<BossVoiceComponent>(); if (!Object.op_Implicit((Object)(object)bossVoiceComponent)) { bossVoiceComponent = sourceObject.AddComponent<BossVoiceComponent>(); bossVoiceComponent.canBeAngy = true; } bossVoiceComponent.TryVoiceLine(new BossLineEvent(modifiedToken, sourceObject, sourceObject)); } private static void FalseSonSpeak(string token, GameObject sourceObject) { string modifiedToken = GetModifiedToken(token, Configuration.FalseSonVoice.Value); if (modifiedToken.Contains("_DEATH_") || modifiedToken.Contains("PURIFICATION")) { sourceObject = GameObject.Find("MeridianEventTriggerCore"); } BossVoiceComponent bossVoiceComponent = sourceObject.GetComponent<BossVoiceComponent>(); if (!Object.op_Implicit((Object)(object)bossVoiceComponent)) { bossVoiceComponent = sourceObject.AddComponent<BossVoiceComponent>(); bossVoiceComponent.canBeAngy = true; } bossVoiceComponent.TryVoiceLine(new BossLineEvent(modifiedToken, sourceObject, sourceObject)); } private static void HeartSpeak(string token, GameObject sourceObject) { string name = "VAMR_" + token; BossVoiceComponent bossVoiceComponent = sourceObject.GetComponent<BossVoiceComponent>(); if (!Object.op_Implicit((Object)(object)bossVoiceComponent)) { bossVoiceComponent = sourceObject.AddComponent<BossVoiceComponent>(); } bossVoiceComponent.TryVoiceLine(new BossLineEvent(name, GetLocalPlayer().bodyInstanceObject, sourceObject)); } private static void ChefSpeak(string token, GameObject sourceObject) { string name = "VAMR_" + token; BossVoiceComponent bossVoiceComponent = sourceObject.GetComponent<BossVoiceComponent>(); if (!Object.op_Implicit((Object)(object)bossVoiceComponent)) { bossVoiceComponent = sourceObject.AddComponent<BossVoiceComponent>(); } bossVoiceComponent.TryVoiceLine(new BossLineEvent(name, sourceObject, sourceObject)); } private static void VultureSpeak(orig_NpcMessage orig, OverrideFightBase self, string message, string formatString, string sound) { orig.Invoke(self, message, formatString, sound); string name = "VAMR_" + message; BossVoiceComponent bossVoiceComponent = ((Component)self).gameObject.GetComponent<BossVoiceComponent>(); if (!Object.op_Implicit((Object)(object)bossVoiceComponent)) { bossVoiceComponent = ((Component)self).gameObject.AddComponent<BossVoiceComponent>(); } bossVoiceComponent.TryVoiceLine(new BossLineEvent(name, GetLocalPlayer().bodyInstanceObject, ((Component)self).gameObject)); } private static string GetModifiedToken(string baseToken, int voiceIndex) { return "VAMR_" + voiceIndex + "_" + baseToken; } private void HereticKurskanFix() { LanguageAPI.Add("BROTHER_SEE_HERETIC_1", "Regret this journey, Kur-skan.", "en"); LanguageAPI.Add("BROTHER_KILL_HERETIC_2", "Die again, Kur-skan.", "en"); LanguageAPI.Add("BROTHERHURT_KILL_HERETIC_2", "DIE AGAIN, KUR-SKAN.", "en"); } internal static CharacterMaster GetLocalPlayer() { return CharacterMaster.readOnlyInstancesList[0]; } private static void FalseSonBossSpeechDriver_SendReponseFromPool(orig_SendReponseFromPool orig, FalseSonBossSpeechDriver self, SpeechInfo[] responsePool) { if (responsePool.Length != 0) { ((BaseCharacterSpeechDriver)self).characterSpeechController.EnqueueSpeech(ref responsePool[Random.Range(0, responsePool.Length)]); } } private static void BrotherSpeechDriver_SendReponseFromPool(orig_SendReponseFromPool orig, BrotherSpeechDriver self, SpeechInfo[] responsePool) { if (responsePool.Length != 0) { ((BaseCharacterSpeechDriver)self).characterSpeechController.EnqueueSpeech(ref responsePool[Random.Range(0, responsePool.Length)]); } } } } namespace VoiceActedMithrix.UI { internal class UIManager { private static AssetBundle bundle; private static GameObject prefab; private static GameObject instance; private static Sprite sprite; private const string BUNDLE_NAME = "vamithrixbundle"; private const string FOLDER_NAME = "assets"; private static ColorBlock colors; internal static void Init() { RegisterTokens(); RegisterPrefab(); } private static void RegisterPrefab() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) string text = Path.Combine(Path.GetDirectoryName(VoiceActedMithrix.PInfo.Location), "assets", "vamithrixbundle"); bundle = AssetBundle.LoadFromFile(text); prefab = bundle.LoadAsset<GameObject>("VoiceSelectionPanel"); GameObject gameObject = ((Component)prefab.transform.Find("Canvas/B1")).gameObject; GameObject gameObject2 = ((Component)prefab.transform.Find("Canvas/B2")).gameObject; Image component = gameObject.GetComponent<Image>(); Sprite val2 = (gameObject2.GetComponent<Image>().sprite = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/UI/texUICleanPanel.png").WaitForCompletion()); component.sprite = val2; ModifyButton(gameObject).hoverToken = "VMR_TITLE_MITHRIXVOICE_DESC"; ModifyButton(gameObject2).hoverToken = "VMR_TITLE_FALSESONVOICE_DESC"; } private static HGButton ModifyButton(GameObject button) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) VoiceChanger voiceChanger = button.AddComponent<VoiceChanger>(); HGButton val = button.AddComponent<HGButton>(); ((Selectable)val).targetGraphic = (Graphic)(object)button.GetComponent<Image>(); ((MPButton)val).selectOnPointerEnter = true; ((MPButton)val).submitOnPointerUp = true; val.updateTextOnHover = true; ((MPButton)val).allowAllEventSystems = true; ((Selectable)val).colors = colors; LanguageTextMeshController val2 = button.AddComponent<LanguageTextMeshController>(); return val; } private static void RegisterTokens() { LanguageAPI.Add("VMR_TITLE_MITHRIXVOICE_DESC", "Cycle through which voice actor to use for the Mithrix voice.", "en"); LanguageAPI.Add("VMR_TITLE_FALSESONVOICE_DESC", "Cycle through which voice actor to use for the False Son voice.", "en"); } internal static void AddUI(orig_Start orig, MainMenuController self) { //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Expected O, but got Unknown orig.Invoke(self); Transform val = ((Component)self).transform.Find("MENU: Title/TitleMenu/SafeZone"); if (!((Object)(object)val == (Object)null)) { instance = Object.Instantiate<GameObject>(prefab, val); GameObject gameObject = ((Component)instance.transform.Find("Canvas/B1")).gameObject; GameObject gameObject2 = ((Component)instance.transform.Find("Canvas/B2")).gameObject; HGButton component = gameObject.GetComponent<HGButton>(); VoiceChanger b1Component = gameObject.GetComponent<VoiceChanger>(); HGButton component2 = gameObject2.GetComponent<HGButton>(); VoiceChanger b2Component = gameObject2.GetComponent<VoiceChanger>(); component.hoverLanguageTextMeshController = (component2.hoverLanguageTextMeshController = ((Component)val.Find("GenericMenuButtonPanel/JuicePanel/DescriptionPanel, Naked/ContentSizeFitter/DescriptionText")).GetComponent<LanguageTextMeshController>()); ((UnityEvent)((Button)component).onClick).AddListener((UnityAction)delegate { b1Component.UpdateText(changeConfig: true); }); ((UnityEvent)((Button)component2).onClick).AddListener((UnityAction)delegate { b2Component.UpdateText(changeConfig: true); }); } } static UIManager() { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) ColorBlock val = default(ColorBlock); ((ColorBlock)(ref val)).colorMultiplier = 1f; ((ColorBlock)(ref val)).disabledColor = new Color(0.254f, 0.2f, 0.2f, 0.713f); ((ColorBlock)(ref val)).highlightedColor = new Color(0.988f, 1f, 0.693f, 0.733f); ((ColorBlock)(ref val)).normalColor = new Color(0.327f, 0.402f, 0.471f, 1f); ((ColorBlock)(ref val)).pressedColor = new Color(0.739f, 0.754f, 0.444f, 0.984f); ((ColorBlock)(ref val)).selectedColor = new Color(0.988f, 1f, 0.693f, 0.733f); colors = val; } } public class VoiceChanger : MonoBehaviour { private static string MithrixPreface = "Mithrix Voice Actor: "; private static string FalseSonPreface = "False Son Voice Actor: "; private bool voiceM; private Text textAsset; private static string[] voiceMapM = new string[2] { "MotherEgg", "KKing" }; private static string[] voiceMapFS = new string[2] { "SkellyVA", "KKing" }; private void Start() { voiceM = ((Object)((Component)this).gameObject).name == "B1"; textAsset = ((Component)((Component)this).transform.Find("Text")).GetComponent<Text>(); UpdateText(changeConfig: false); } public void UpdateText(bool changeConfig) { if (changeConfig) { if (voiceM) { Configuration.MithrixVoice.Value = (Configuration.MithrixVoice.Value + 1) % voiceMapM.Length; VoiceActedMithrix.LoadBrotherVoice(); } else { Configuration.FalseSonVoice.Value = (Configuration.FalseSonVoice.Value + 1) % voiceMapFS.Length; VoiceActedMithrix.LoadFalseSonVoice(); } } if (voiceM) { textAsset.text = MithrixPreface + voiceMapM[Configuration.MithrixVoice.Value]; } else { textAsset.text = FalseSonPreface + voiceMapFS[Configuration.FalseSonVoice.Value]; } } } }