using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using PitchCompany.Configuration;
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("PitchCompany")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PitchCompany")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("49972d47-6436-4b8e-a73f-73c935fab0fc")]
[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 PitchCompany
{
[BepInPlugin("bizkit.PitchCompany", "PitchCompany", "1.0.0")]
public class PitchCompany : BaseUnityPlugin
{
private const string modGUID = "bizkit.PitchCompany";
private const string modName = "PitchCompany";
private const string modVersion = "1.0.0";
private readonly Harmony harmony = new Harmony("bizkit.PitchCompany");
private static PitchCompany Instance;
internal static ManualLogSource mls;
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
mls = Logger.CreateLogSource("bizkit.PitchCompany");
mls.LogInfo((object)"PitchCompany is here!");
Config.Init();
harmony.PatchAll();
}
}
}
namespace PitchCompany.Patches
{
public class AudioConfig
{
private PlayerControllerB playerControllerB;
private bool lowPassFilter = false;
private bool highPassFilter = false;
private float panStereo = 0f;
private float playerVoicePitchTargets = 0f;
private float playerPitch = 0f;
private float spatialBlend = 0f;
private bool set2D = false;
private float volume = 0f;
public bool LowPassFilter => lowPassFilter;
public bool HighPassFilter => highPassFilter;
public float PanStereo => panStereo;
public float PlayerVoicePitchTargets => playerVoicePitchTargets;
public float PlayerPitch => Config.PitchValue;
public float SpatialBlend => spatialBlend;
public bool Set2D => set2D;
public float Volume => volume;
public Transform AudioSourceT => ((Component)playerControllerB.currentVoiceChatAudioSource).transform;
public AudioConfig(PlayerControllerB playerControllerB, bool lowPassFilter, bool highPassFilter, float panStereo, float playerVoicePitchTargets, float playerPitch, float spatialBlend, bool set2D)
{
this.playerControllerB = playerControllerB;
this.lowPassFilter = lowPassFilter;
this.highPassFilter = highPassFilter;
this.panStereo = panStereo;
this.playerVoicePitchTargets = playerVoicePitchTargets;
this.playerPitch = playerPitch;
this.spatialBlend = spatialBlend;
this.set2D = set2D;
}
}
[HarmonyPatch(typeof(StartOfRound), "UpdatePlayerVoiceEffects")]
internal class UpdatePlayerVoiceEffectsPatch
{
private static bool updateStarted = false;
private static Dictionary<PlayerControllerB, AudioConfig> configs = new Dictionary<PlayerControllerB, AudioConfig>();
public static Dictionary<PlayerControllerB, AudioConfig> Configs => configs;
[HarmonyBefore(new string[] { "MoreCompany" })]
private static void Prefix()
{
if (configs == null)
{
configs = new Dictionary<PlayerControllerB, AudioConfig>();
}
if (!updateStarted)
{
((MonoBehaviour)HUDManager.Instance).StartCoroutine(UpdateNumerator());
updateStarted = true;
}
if ((Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null || (Object)(object)StartOfRound.Instance == (Object)null || StartOfRound.Instance.allPlayerScripts == null)
{
return;
}
for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Length; i++)
{
PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[i];
if (!((Object)(object)val == (Object)null) && (val.isPlayerControlled || !val.isPlayerDead) && (Object)(object)val != (Object)(object)GameNetworkManager.Instance.localPlayerController)
{
AudioSource currentVoiceChatAudioSource = val.currentVoiceChatAudioSource;
if (!((Object)(object)currentVoiceChatAudioSource == (Object)null) && !val.isPlayerDead && !configs.ContainsKey(val))
{
Dictionary<PlayerControllerB, AudioConfig> dictionary = configs;
bool enabled = ((Behaviour)((Component)currentVoiceChatAudioSource).GetComponent<AudioLowPassFilter>()).enabled;
bool enabled2 = ((Behaviour)((Component)currentVoiceChatAudioSource).GetComponent<AudioHighPassFilter>()).enabled;
float panStereo = (currentVoiceChatAudioSource.panStereo = 0f);
dictionary.Add(val, new AudioConfig(val, enabled, enabled2, panStereo, SoundManager.Instance.playerVoicePitchTargets[(int)(IntPtr)(long)val.playerClientId], GetPitch(val), currentVoiceChatAudioSource.spatialBlend, val.currentVoiceChatIngameSettings.set2D));
}
}
}
}
private static void Postfix()
{
if (configs == null)
{
configs = new Dictionary<PlayerControllerB, AudioConfig>();
}
if ((Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)
{
return;
}
PlayerControllerB[] array = configs.Keys.ToArray();
foreach (PlayerControllerB val in array)
{
if ((Object)(object)val == (Object)null)
{
continue;
}
AudioConfig audioConfig = configs[val];
if (audioConfig == null)
{
continue;
}
if ((val.isPlayerControlled || !val.isPlayerDead) && !((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController))
{
if (!((Object)(object)val.currentVoiceChatAudioSource == (Object)null))
{
AudioSource currentVoiceChatAudioSource = val.currentVoiceChatAudioSource;
AudioLowPassFilter component = ((Component)currentVoiceChatAudioSource).GetComponent<AudioLowPassFilter>();
AudioHighPassFilter component2 = ((Component)currentVoiceChatAudioSource).GetComponent<AudioHighPassFilter>();
if ((Object)(object)component != (Object)null)
{
((Behaviour)component).enabled = audioConfig.LowPassFilter;
}
if ((Object)(object)component2 != (Object)null)
{
((Behaviour)component2).enabled = audioConfig.HighPassFilter;
}
if ((Object)(object)SoundManager.Instance != (Object)null)
{
SoundManager.Instance.playerVoicePitchTargets[(int)(IntPtr)(long)val.playerClientId] = audioConfig.PlayerVoicePitchTargets;
SoundManager.Instance.SetPlayerPitch(audioConfig.PlayerPitch, (int)val.playerClientId);
}
val.currentVoiceChatIngameSettings.set2D = audioConfig.Set2D;
val.currentVoiceChatAudioSource.volume = audioConfig.Volume;
}
}
else if (val.isPlayerDead)
{
configs.Remove(val);
}
}
}
private static IEnumerator UpdateNumerator()
{
yield return 0;
while (true)
{
UpdatePlayersStatus();
yield return (object)new WaitForFixedUpdate();
}
}
private static void UpdatePlayersStatus()
{
if (configs == null)
{
return;
}
bool flag = false;
KeyValuePair<PlayerControllerB, AudioConfig>[] array = configs.ToArray();
for (int i = 0; i < array.Length; i++)
{
KeyValuePair<PlayerControllerB, AudioConfig> keyValuePair = array[i];
if (!((Object)(object)keyValuePair.Key == (Object)null) && keyValuePair.Key.isPlayerDead)
{
configs.Remove(keyValuePair.Key);
flag = true;
}
}
if (flag)
{
StartOfRound.Instance.UpdatePlayerVoiceEffects();
}
}
private static float GetPitch(PlayerControllerB playerControllerB)
{
int num = (int)playerControllerB.playerClientId;
float result = default(float);
SoundManager.Instance.diageticMixer.GetFloat($"PlayerPitch{num}", ref result);
return result;
}
}
}
namespace PitchCompany.Configuration
{
internal static class Config
{
private const string CONFIG_FILE_NAME = "PitchCompany.cfg";
private static ConfigFile config;
private static ConfigEntry<float> pitchValue;
public static float PitchValue => pitchValue.Value;
public static void Init()
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Expected O, but got Unknown
string text = Path.Combine(Paths.ConfigPath, "PitchCompany.cfg");
config = new ConfigFile(text, true);
pitchValue = config.Bind<float>("Config", "Pitch", 3f, "Changes pitch of the player to given value");
}
}
}