The BepInEx console will not appear when launching like it does for other games on Thunderstore. This is normal (and helps prevent crashes during startup). You can turn it back on in your BepInEx.cfg file.
Decompiled source of MicIndicator v1.0.1
BepInEx/plugins/MicIndicator.dll
Decompiled 3 days agousing System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using MicIndicator; using Microsoft.CodeAnalysis; using Photon.Voice; using Photon.Voice.PUN; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")] [assembly: AssemblyCompany("MicIndicator")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.1.0")] [assembly: AssemblyInformationalVersion("1.0.1+bd85f4333f96a49d69afe1d68fa647bf6067186f")] [assembly: AssemblyProduct("MicIndicator")] [assembly: AssemblyTitle("MicIndicator")] [assembly: AssemblyVersion("1.0.1.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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; } } } internal class ConstantFields { private static FieldInfo ampPeak; private static FieldInfo ampPeakShort; public static FieldInfo GetVoiceAudioField() { if (ampPeak == null) { FieldInfo[] fields = typeof(LevelMeterFloat).GetFields(BindingFlags.Instance | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fields) { if (fieldInfo.Name.ToLower().Contains("amppeak")) { ampPeak = fieldInfo; break; } } } return ampPeak; } public static FieldInfo GetVoiceAudioFieldShort() { if (ampPeakShort == null) { FieldInfo[] fields = typeof(LevelMeterShort).GetFields(BindingFlags.Instance | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fields) { if (fieldInfo.Name.ToLower().Contains("amppeak")) { ampPeakShort = fieldInfo; break; } } } return ampPeakShort; } } public class EventComponent : MonoBehaviour { private RawImage micIcon; private PhotonVoiceView micView; private void Update() { //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0081: 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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) if (!Plugin.itsTimeXD) { return; } if ((Object)(object)micIcon == (Object)null) { GameObject val = GameObject.Find("/GAME/GUIManager/Canvas_HUD/Inventory/Layout/UI_InventoryBackpack/Icon/"); GameObject val2 = GameObject.Find("/GAME/GUIManager/Canvas_HUD/"); if ((Object)(object)val != (Object)null && (Object)(object)val2 != (Object)null) { val = Object.Instantiate<GameObject>(val); val.transform.parent = val2.transform; Transform transform = val.transform; Transform obj = ((transform is RectTransform) ? transform : null); ((RectTransform)obj).anchoredPosition = new Vector2(Plugin.configPosition.Value.x, Plugin.configPosition.Value.y); ((RectTransform)obj).sizeDelta = new Vector2(Plugin.configScale.Value, Plugin.configScale.Value); ((RectTransform)obj).anchorMax = new Vector2(0f, 0f); ((RectTransform)obj).anchorMin = new Vector2(0f, 0f); obj.localScale = new Vector3(1f, 1f, 1f); RawImage component = val.GetComponent<RawImage>(); if ((Object)(object)component != (Object)null) { micIcon = component; ((Behaviour)micIcon).enabled = Plugin.configIsActive.Value; } } return; } if (Input.GetKeyDown(Plugin.configToggleKey.Value)) { ConfigEntry<bool> configIsActive = Plugin.configIsActive; configIsActive.Value = !configIsActive.Value; ((Behaviour)micIcon).enabled = Plugin.configIsActive.Value; } if ((Object)(object)micView != (Object)null) { ILevelMeter levelMeter = micView.RecorderInUse.LevelMeter; if (levelMeter == null) { return; } if (levelMeter is LevelMeterShort) { if (micView.IsRecording && (float)ConstantFields.GetVoiceAudioFieldShort().GetValue(levelMeter) > Plugin.configMicDetectionThreshold.Value) { micIcon.texture = (Texture)(object)Plugin.micOnTex; } else { micIcon.texture = (Texture)(object)Plugin.micOffTex; } } else if (levelMeter is LevelMeterFloat) { if (micView.IsRecording && (float)ConstantFields.GetVoiceAudioField().GetValue(levelMeter) > Plugin.configMicDetectionThreshold.Value) { micIcon.texture = (Texture)(object)Plugin.micOnTex; } else { micIcon.texture = (Texture)(object)Plugin.micOffTex; } } else { Plugin.Logger.LogInfo((object)"Zamn ;-; Thats crazy my man"); } } else if ((Object)(object)Character.localCharacter != (Object)null) { Character localCharacter = Character.localCharacter; PhotonVoiceView val3 = ((localCharacter != null) ? ((Component)localCharacter).GetComponent<PhotonVoiceView>() : null); if ((Object)(object)val3 != (Object)null) { micView = val3; } } } private void OnGUI() { } private void LateUpdate() { } private void Start() { } } namespace MicIndicator { [BepInPlugin("MicIndicator", "MicIndicator", "1.0.1")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; internal static EventComponent Component; public static ConfigEntry<KeyCode> configToggleKey; public static ConfigEntry<bool> configIsActive; public static ConfigEntry<Vector2> configPosition; public static ConfigEntry<float> configScale; public static ConfigEntry<float> configMicDetectionThreshold; internal static Texture2D micOnTex; internal static Texture2D micOffTex; internal static bool itsTimeXD; private void Awake() { //IL_005e: Unknown result type (might be due to invalid IL or missing references) configToggleKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Keybinds", "ToggleKey", (KeyCode)279, "The key used to toggle the GUI on and off"); configIsActive = ((BaseUnityPlugin)this).Config.Bind<bool>("GUI", "IsActive", true, "If the icon is showing"); configPosition = ((BaseUnityPlugin)this).Config.Bind<Vector2>("GUI", "Position", new Vector2(100f, 160f), "The position of the icon"); configScale = ((BaseUnityPlugin)this).Config.Bind<float>("GUI", "Scale", 100f, "The scale of the icon"); configMicDetectionThreshold = ((BaseUnityPlugin)this).Config.Bind<float>("Mic", "MicDetectionThreshold", 0.001f, "Mic Detection Min Value. Increase to make mic detection less sensitive. Decrease to make it more sensitive"); Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"Plugin MicIndicator is loaded!"); string[] commandLineArgs = Environment.GetCommandLineArgs(); foreach (string text in commandLineArgs) { Logger.LogInfo((object)("Launch Options " + text + ".!")); } Component = ((Component)this).gameObject.AddComponent<EventComponent>(); micOnTex = GetTextureFromAssemImage("MicIndicator.Images.MicOn.png"); micOffTex = GetTextureFromAssemImage("MicIndicator.Images.MicOff.png"); itsTimeXD = true; } internal Texture2D GetTextureFromAssemImage(string imageName) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(imageName); if (stream == null) { Logger.LogError((object)"COULD NOT FIND MIC ICON. REPORT THIS TO MOD MAKER"); return null; } Image val = Image.FromStream(stream); Texture2D val2 = new Texture2D(val.Width, val.Height); using (MemoryStream memoryStream = new MemoryStream()) { val.Save((Stream)memoryStream, ImageFormat.Png); ImageConversion.LoadImage(val2, memoryStream.ToArray()); val2.Apply(); } return val2; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "MicIndicator"; public const string PLUGIN_NAME = "MicIndicator"; public const string PLUGIN_VERSION = "1.0.1"; } }