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 ToggleMute v0.1.0
ToggleMute.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using Photon.Voice.Unity; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.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("ToggleMute")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Mod for Repo")] [assembly: AssemblyFileVersion("0.0.5.0")] [assembly: AssemblyInformationalVersion("0.0.5+aa462c2528c5f320c76e4bb3dc1bd54924d662a5")] [assembly: AssemblyProduct("ToggleMute")] [assembly: AssemblyTitle("ToggleMute")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.5.0")] [module: UnverifiableCode] [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; } } } namespace ToggleMute { [HarmonyPatch(typeof(PlayerVoiceChat), "OnDestroy")] internal class PushToMuteCleanupPatch { [HarmonyPrefix] private static void Prefix(PlayerVoiceChat __instance) { if (PushToMutePatch.playerRecorders.ContainsKey(__instance)) { PushToMutePatch.playerRecorders.Remove(__instance); PushToMutePatch.AnimateIconCoroutine = null; } else { Debug.Log((object)("PlayerVoiceChat OnDestroy: No recorder found for " + ((Component)__instance).GetComponent<PhotonView>().Owner.NickName + ".")); } } } [HarmonyPatch(typeof(PlayerVoiceChat), "Awake")] internal class PushToMuteInitPatch { [HarmonyPostfix] private static void Postfix(PlayerVoiceChat __instance) { PhotonView component = ((Component)__instance).GetComponent<PhotonView>(); Recorder component2 = ((Component)__instance).GetComponent<Recorder>(); if ((Object)(object)component != (Object)null && component.IsMine && (Object)(object)component2 != (Object)null) { PushToMutePatch.playerRecorders[__instance] = component2; } } } [BepInPlugin("com.coddingcat.togglemute", "ToggleMute", "1.0.0")] public class PushToMuteMod : BaseUnityPlugin { private Harmony harmony; private static GameObject hudCanvas; public AssetBundle muteIconBundle; public static PushToMuteMod Instance; public static ConfigEntry<string> MuteKeyString { get; private set; } public static ConfigEntry<float> SoundVolume { get; private set; } public static ConfigEntry<int> AnimationTime { get; private set; } public static KeyCode MuteKey => ParseKeyCode(MuteKeyString.Value); private void Awake() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) Instance = this; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; BindConfigs(); string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); harmony = new Harmony("com.coddingcat.pushtomute"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Push-to-Mute mod loaded! Key: {MuteKey}"); SceneManager.sceneLoaded += OnSceneLoaded; } private void BindConfigs() { MuteKeyString = ((BaseUnityPlugin)this).Config.Bind<string>("General", "MuteKey", "M", "Key to toggle Push-to-Mute (write any valid KeyCode name, like 'V', 'X', 'B')\nFull List Right Here: https://docs.unity3d.com/352/Documentation/ScriptReference/KeyCode.html"); SoundVolume = ((BaseUnityPlugin)this).Config.Bind<float>("General", "SoundVolume", 0.3f, "Volume of mute/unmute sound (0.0 - 1.0)"); AnimationTime = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Animation Duration", 200, "Duration of the mute icon animation in milliseconds."); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { PushToMutePatch.UpdateUI(PushToMutePatch.isMuted); } private void LogAssetNames(AssetBundle bundle) { if (!((Object)(object)bundle == (Object)null)) { string[] allAssetNames = bundle.GetAllAssetNames(); string[] array = allAssetNames; foreach (string text in array) { Debug.Log((object)("Asset in bundle: " + text)); } } } private static KeyCode ParseKeyCode(string keyString) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (Enum.TryParse<KeyCode>(keyString, ignoreCase: true, out KeyCode result)) { return result; } Debug.LogWarning((object)("Invalid key: '" + keyString + "', defaulting to KeyCode.M")); return (KeyCode)109; } public static GameObject GetHudCanvas() { if ((Object)(object)hudCanvas == (Object)null) { hudCanvas = GameObject.Find("UI/HUD/HUD Canvas"); if ((Object)(object)hudCanvas == (Object)null) { Debug.LogError((object)"HUD Canvas not found"); } } return hudCanvas; } } [HarmonyPatch(typeof(PlayerVoiceChat), "Update")] internal class PushToMutePatch { public static Dictionary<PlayerVoiceChat, Recorder> playerRecorders = new Dictionary<PlayerVoiceChat, Recorder>(); private static GameObject muteIcon; private static GameObject cutLineIcon; private static Image muteIconImage; private static Image cutLineImage; private static Color muteIconColor; private static Color cutLineColor; private static AssetBundle muteIconBundle; private static AudioSource audioSource; private static AudioClip muteSound; private static AudioClip unmuteSound; public static PlayerVoiceChat instance; public static Coroutine AnimateIconCoroutine; public static bool isMuted = false; private static float t = 0f; public static void UpdateUI(bool Animation) { if ((Object)(object)muteIcon == (Object)null) { InitMuteIcon(); } isMuted = Animation; AnimateIconCoroutine = ((MonoBehaviour)PushToMuteMod.Instance).StartCoroutine(AnimateIcon()); } [HarmonyPostfix] private static void Postfix(PlayerVoiceChat __instance) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) instance = __instance; if (!playerRecorders.TryGetValue(__instance, out var value)) { return; } KeyCode muteKey = PushToMuteMod.MuteKey; if ((Object)(object)muteIcon == (Object)null) { InitMuteIcon(); } if (!(bool)typeof(ChatManager).GetField("chatActive", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(ChatManager.instance)) { if (Input.GetKeyDown(muteKey)) { isMuted = !isMuted; audioSource.clip = (isMuted ? muteSound : unmuteSound); audioSource.Play(); value.TransmitEnabled = !isMuted; value.RecordingEnabled = !isMuted; } bool flag = AnimateIconCoroutine != null; bool flag2 = (t != 1f || !isMuted) && (t != 0f || isMuted); if (!flag && flag2) { AnimateIconCoroutine = ((MonoBehaviour)__instance).StartCoroutine(AnimateIcon()); } } } private static void InitMuteIcon() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_00b9: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) GameObject hudCanvas = PushToMuteMod.GetHudCanvas(); if ((Object)(object)hudCanvas == (Object)null) { return; } GameObject val = new GameObject("MuteIconContainer"); RectTransform val2 = val.AddComponent<RectTransform>(); ((Transform)val2).SetParent(hudCanvas.transform, false); Vector2 sizeDelta = default(Vector2); ((Vector2)(ref sizeDelta))..ctor(40f, 40f); val2.anchorMin = new Vector2(1f, 0f); val2.anchorMax = new Vector2(1f, 0f); val2.pivot = new Vector2(1f, 0f); val2.anchoredPosition = new Vector2(-10f, 10f); val2.sizeDelta = sizeDelta; muteIcon = new GameObject("MuteIcon"); RectTransform val3 = muteIcon.AddComponent<RectTransform>(); ((Transform)val3).SetParent((Transform)(object)val2); val3.pivot = new Vector2(0.5f, 0.5f); val3.anchoredPosition = Vector2.op_Implicit(Vector3.zero); val3.sizeDelta = sizeDelta; cutLineIcon = new GameObject("CutLine"); RectTransform val4 = cutLineIcon.AddComponent<RectTransform>(); ((Transform)val4).SetParent((Transform)(object)val2, false); val4.anchorMin = Vector2.zero; val4.anchorMax = Vector2.zero; val4.pivot = Vector2.zero; val4.anchoredPosition = Vector2.op_Implicit(Vector3.zero); val4.sizeDelta = sizeDelta; muteIconImage = muteIcon.AddComponent<Image>(); cutLineImage = cutLineIcon.AddComponent<Image>(); string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); if ((Object)(object)muteIconBundle == (Object)null) { muteIconBundle = AssetBundle.LoadFromFile(Path.Combine(directoryName, "togglemutebundle")); } if ((Object)(object)muteIconBundle != (Object)null) { Sprite val5 = muteIconBundle.LoadAsset<Sprite>("assets/unmuted.png"); Sprite val6 = muteIconBundle.LoadAsset<Sprite>("assets/cutLine.png"); muteSound = muteIconBundle.LoadAsset<AudioClip>("assets/on.ogg"); unmuteSound = muteIconBundle.LoadAsset<AudioClip>("assets/off.ogg"); if ((Object)(object)val5 != (Object)null && (Object)(object)val6 != (Object)null) { muteIconImage.sprite = val5; cutLineImage.sprite = val6; } } muteIconColor = ((Graphic)muteIconImage).color; cutLineColor = ((Graphic)cutLineImage).color; if ((Object)(object)audioSource == (Object)null) { audioSource = muteIcon.AddComponent<AudioSource>(); } audioSource.volume = PushToMuteMod.SoundVolume.Value; } private static IEnumerator AnimateIcon() { while (true) { if ((Object)(object)muteIcon == (Object)null || (Object)(object)muteIconImage == (Object)null) { AnimateIconCoroutine = null; yield break; } if (t == 1f && isMuted) { muteIcon.transform.localScale = Vector3.one; muteIconColor.a = 1f; ((Graphic)muteIconImage).color = muteIconColor; cutLineIcon.transform.localScale = Vector3.one; cutLineColor.a = 1f; ((Graphic)cutLineImage).color = cutLineColor; AnimateIconCoroutine = null; yield break; } if (t == 0f && !isMuted) { break; } if (PushToMuteMod.AnimationTime.Value == 0) { t = (isMuted ? 1f : 0f); } else { float animationTimeInSeconds = (float)PushToMuteMod.AnimationTime.Value * 0.001f; t = Mathf.MoveTowards(t, isMuted ? 1f : 0f, Time.deltaTime / animationTimeInSeconds); } float easeT = EaseInOut(t); muteIcon.transform.localScale = Vector3.Lerp(Vector3.zero, Vector3.one, easeT); cutLineIcon.transform.localScale = Vector3.Lerp(Vector3.zero, Vector3.one, easeT); muteIconColor = ((Graphic)muteIconImage).color; muteIconColor.a = Mathf.Lerp(0f, 1f, easeT); cutLineColor = ((Graphic)cutLineImage).color; cutLineColor.a = Mathf.Lerp(0f, 1f, easeT); ((Graphic)cutLineImage).color = cutLineColor; ((Graphic)muteIconImage).color = muteIconColor; yield return null; } muteIcon.transform.localScale = Vector3.zero; muteIconColor.a = 0f; ((Graphic)muteIconImage).color = muteIconColor; cutLineIcon.transform.localScale = Vector3.zero; cutLineColor.a = 0f; ((Graphic)cutLineImage).color = cutLineColor; AnimateIconCoroutine = null; } private static float EaseInOut(float t) { return t * t * (3f - 2f * t); } } public static class PluginInfo { public const string PLUGIN_GUID = "ToggleMute"; public const string PLUGIN_NAME = "ToggleMute"; public const string PLUGIN_VERSION = "0.0.5"; } }