The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of Conchversations Beta v1.1.0
tony4twentys-Conchversations.dll
Decompiled 2 months agousing System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Photon.Pun; using Photon.Voice.Unity; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("Conchversations")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Conchversations")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("32855ccf-9a00-4c8f-8e6f-798feca50f5e")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace Conchversations; [BepInPlugin("tony4twentys.Conchversations", "Conchversations", "1.1.0")] public class Conchversations : BaseUnityPlugin { [HarmonyPatch(typeof(CharacterItems), "EquipSlotRpc")] public class CharacterItemsPatch { private static void Postfix(CharacterItems __instance, int slotID, int objectViewID) { PhotonView photonView = PhotonNetwork.GetPhotonView(objectViewID); Item val = null; if ((Object)(object)photonView != (Object)null) { val = ((Component)photonView).GetComponent<Item>(); } if ((Object)(object)val != (Object)null && val.itemID == 69) { Instance.SetTransmitting(((MonoBehaviourPun)__instance).photonView.Controller.ActorNumber, isTransmitting: true); } else { Instance.SetTransmitting(((MonoBehaviourPun)__instance).photonView.Controller.ActorNumber, isTransmitting: false); } } } public class CharacterAudioData { public Character Character; public Speaker Speaker; public AudioSource AudioSource; public AudioEchoFilter Echo; public AudioLowPassFilter LowPass; public AudioHighPassFilter HighPass; public CharacterAudioData(Character character, Speaker speaker) { Character = character; Speaker = speaker; AudioSource = ((Component)speaker).GetComponent<AudioSource>(); Echo = ((Component)speaker).GetComponent<AudioEchoFilter>(); if ((Object)(object)Echo == (Object)null) { Echo = ((Component)speaker).gameObject.AddComponent<AudioEchoFilter>(); } LowPass = ((Component)speaker).GetComponent<AudioLowPassFilter>(); if ((Object)(object)LowPass == (Object)null) { LowPass = ((Component)speaker).gameObject.AddComponent<AudioLowPassFilter>(); } LowPass.cutoffFrequency = 2000f; LowPass.lowpassResonanceQ = 3f; ((Behaviour)LowPass).enabled = false; HighPass = ((Component)speaker).GetComponent<AudioHighPassFilter>(); if ((Object)(object)HighPass == (Object)null) { HighPass = ((Component)speaker).gameObject.AddComponent<AudioHighPassFilter>(); } HighPass.cutoffFrequency = 1000f; HighPass.highpassResonanceQ = 10f; ((Behaviour)HighPass).enabled = false; } } [HarmonyPatch(typeof(CharacterVoiceHandler), "Start")] private class CharacterVoiceHandlerPatch { private static void Postfix(CharacterVoiceHandler __instance) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown FieldInfo fieldInfo = AccessTools.Field(typeof(CharacterVoiceHandler), "m_character"); if (fieldInfo != null) { Character val = (Character)fieldInfo.GetValue(__instance); Speaker component = ((Component)__instance).GetComponent<Speaker>(); if ((Object)(object)val != (Object)null && (Object)(object)component != (Object)null) { AddCharacterAudio(val, new CharacterAudioData(val, component)); } } } } [HarmonyPatch(typeof(CharacterVoiceHandler), "LateUpdate")] private class PatchVoiceHandlerLateUpdate { private static readonly FieldInfo characterField = AccessTools.Field(typeof(CharacterVoiceHandler), "m_character"); private static void Postfix(CharacterVoiceHandler __instance) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown Character val = (Character)characterField.GetValue(__instance); if ((Object)(object)val == (Object)null || !CharacterAudioDict.TryGetValue(val, out var value) || value == null) { return; } if (Instance.GetTransmitting(((MonoBehaviourPun)value.Character).photonView.Controller.ActorNumber) && Instance.canListen) { value.AudioSource.spatialBlend = 0f; ((Behaviour)value.Echo).enabled = false; if (ConfigEnableRadioFilter.Value) { ((Behaviour)value.LowPass).enabled = true; ((Behaviour)value.HighPass).enabled = true; } } else { value.AudioSource.spatialBlend = 1f; ((Behaviour)value.Echo).enabled = true; if (ConfigEnableRadioFilter.Value) { ((Behaviour)value.LowPass).enabled = false; ((Behaviour)value.HighPass).enabled = false; } } } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] private class ItemCarryWeightPatch { private static bool Prefix(Item __instance, ref int __result) { if ((Object)(object)__instance != (Object)null && __instance.itemID == 69) { __result = 0; return false; } return true; } } private static Conchversations Instance; private const int CONCH_ITEM_ID = 69; internal static ConfigEntry<bool> ConfigEnableRadioFilter; public bool canTransmit = false; public bool canListen = false; public Dictionary<int, bool> CharacterTransmittingDict = new Dictionary<int, bool>(); public static Dictionary<Character, CharacterAudioData> CharacterAudioDict = new Dictionary<Character, CharacterAudioData>(); private void Awake() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) Instance = this; new Harmony("tony4twentys.Conchversations").PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin initialized and waiting for gameplay scene."); ConfigEnableRadioFilter = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableRadioFilter", true, "Enables the radio filter for all communications through the conch."); } public bool GetTransmitting(int characterId) { bool value; return CharacterTransmittingDict.TryGetValue(characterId, out value) && value; } public void AddCharacter(int characterId, bool isTransmitting = false) { if (!CharacterTransmittingDict.ContainsKey(characterId)) { CharacterTransmittingDict.Add(characterId, isTransmitting); } } public void SetTransmitting(int characterId, bool isTransmitting) { if (CharacterTransmittingDict.ContainsKey(characterId)) { CharacterTransmittingDict[characterId] = isTransmitting; } else { CharacterTransmittingDict.Add(characterId, isTransmitting); } } public static void CleanupCharacterAudioDict() { List<Character> list = CharacterAudioDict.Keys.Where((Character c) => (Object)(object)c == (Object)null || (Object)(object)((MonoBehaviourPun)c).photonView == (Object)null || ((MonoBehaviourPun)c).photonView.Controller == null).ToList(); foreach (Character item in list) { CharacterAudioDict.Remove(item); } } public static void AddCharacterAudio(Character character, CharacterAudioData audioData) { if ((Object)(object)character != (Object)null && audioData != null) { CharacterAudioDict[character] = audioData; } } public static void GetCharacterValue(CharacterVoiceHandler handler) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown FieldInfo fieldInfo = AccessTools.Field(typeof(CharacterVoiceHandler), "m_character"); if (fieldInfo != null) { Character val = (Character)fieldInfo.GetValue(handler); } } private void Update() { if ((Object)(object)Character.localCharacter != (Object)null) { canListen = HasConchAnywhere(Character.localCharacter.player); } } public static bool HasConchAnywhere(Player p) { ItemSlot[] itemSlots = p.itemSlots; foreach (ItemSlot val in itemSlots) { if (!val.IsEmpty() && (Object)(object)val.prefab != (Object)null && val.prefab.itemID == 69) { return true; } } if (!p.tempFullSlot.IsEmpty() && (Object)(object)p.tempFullSlot.prefab != (Object)null && p.tempFullSlot.prefab.itemID == 69) { return true; } if (p.backpackSlot.hasBackpack && HasConchInBackpack(((ItemSlot)p.backpackSlot).data)) { return true; } return false; } private static bool IsConch(ItemSlot slot) { return (Object)(object)slot?.prefab != (Object)null && slot.prefab.itemID == 69; } public static bool HasConchInHand(Player p) { if ((Object)(object)p.character.data.currentItem != (Object)null && p.character.data.currentItem.itemID == 69) { return true; } if (IsConch(p.tempFullSlot)) { return true; } return false; } public static bool HasConchInBackpack(ItemInstanceData data) { BackpackData val = default(BackpackData); if (data.TryGetDataEntry<BackpackData>((DataEntryKey)7, ref val)) { ItemSlot[] itemSlots = val.itemSlots; ItemSlot[] array = itemSlots; foreach (ItemSlot val2 in array) { if ((Object)(object)val2.prefab != (Object)null && val2.prefab.itemID == 69) { return true; } } } return false; } }