using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LCAlwaysHearWalkieMod.Patches;
using Microsoft.CodeAnalysis;
using UnityEngine;
[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("AlwaysHearWalkie")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.4.5.0")]
[assembly: AssemblyInformationalVersion("1.4.5+598af90ecbca7dbe992d00a9f1bf49979bdb5912")]
[assembly: AssemblyProduct("Always Hear Active Walkies")]
[assembly: AssemblyTitle("AlwaysHearWalkie")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.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 BepInEx5.PluginTemplate
{
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "AlwaysHearWalkie";
public const string PLUGIN_NAME = "Always Hear Active Walkies";
public const string PLUGIN_VERSION = "1.4.5";
}
}
namespace LCAlwaysHearWalkieMod
{
public static class PluginInfo
{
public const string modGUID = "suskitech.LCAlwaysHearActiveWalkie";
public const string modName = "LC Always Hear Active Walkies";
public const string modVersion = "1.4.4";
}
[BepInPlugin("suskitech.LCAlwaysHearActiveWalkie", "LC Always Hear Active Walkies", "1.4.4")]
public class Plugin : BaseUnityPlugin
{
private ConfigEntry<float> configAudibleDistance;
public static float AudibleDistance;
private ConfigEntry<float> configWalkieRecordingRange;
public static float WalkieRecordingRange;
private ConfigEntry<float> configPlayerToPlayerSpatialHearingRange;
public static float PlayerToPlayerSpatialHearingRange;
public static ManualLogSource Log;
private static Plugin Instance;
public void Awake()
{
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Expected O, but got Unknown
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
configAudibleDistance = ((BaseUnityPlugin)this).Config.Bind<float>("General", "AudibleDistance", 12f, "");
AudibleDistance = configAudibleDistance.Value;
configWalkieRecordingRange = ((BaseUnityPlugin)this).Config.Bind<float>("General", "WalkieRecordingRange", 20f, "");
WalkieRecordingRange = configWalkieRecordingRange.Value;
configPlayerToPlayerSpatialHearingRange = ((BaseUnityPlugin)this).Config.Bind<float>("General", "PlayerToPlayerSpatialHearingRange", 20f, "");
PlayerToPlayerSpatialHearingRange = configPlayerToPlayerSpatialHearingRange.Value;
Log = Logger.CreateLogSource("suskitech.LCAlwaysHearActiveWalkie");
Harmony val = new Harmony("suskitech.LCAlwaysHearActiveWalkie");
val.PatchAll(typeof(Plugin));
val.PatchAll(typeof(PlayerControllerBPatch));
val.PatchAll(typeof(WalkieTalkiePatch));
Log.LogInfo((object)"\\ /");
Log.LogInfo((object)"/|\\");
Log.LogInfo((object)" |----|");
Log.LogInfo((object)" |[__]| Always Hear Active Walkies");
Log.LogInfo((object)" |. .| Version 1.4.4 Loaded");
Log.LogInfo((object)" |____|");
Log.LogInfo((object)"");
Log.LogInfo((object)("AudibleDistance: " + AudibleDistance));
Log.LogInfo((object)("WalkieRecordingRange: " + WalkieRecordingRange));
Log.LogInfo((object)("PlayerToPlayerSpatialHearingRange: " + PlayerToPlayerSpatialHearingRange));
}
}
}
namespace LCAlwaysHearWalkieMod.Patches
{
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerControllerBPatch
{
private static readonly float throttleInterval = 0.35f;
private static float throttle = 0f;
private static readonly float AverageDistanceToHeldWalkie = 2f;
private static readonly float AudibleDistance = Plugin.AudibleDistance;
private static readonly float WalkieRecordingRange = Plugin.WalkieRecordingRange;
private static readonly float PlayerToPlayerSpatialHearingRange = Plugin.PlayerToPlayerSpatialHearingRange;
[HarmonyPatch("Update")]
[HarmonyPostfix]
private static void alwaysHearWalkieTalkiesPatch(ref bool ___holdingWalkieTalkie, ref PlayerControllerB __instance)
{
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_0293: Unknown result type (might be due to invalid IL or missing references)
//IL_029f: Unknown result type (might be due to invalid IL or missing references)
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
//IL_035c: Unknown result type (might be due to invalid IL or missing references)
//IL_0368: Unknown result type (might be due to invalid IL or missing references)
throttle += Time.deltaTime;
if (throttle < throttleInterval)
{
return;
}
throttle = 0f;
if ((Object)(object)__instance == (Object)null || (Object)(object)GameNetworkManager.Instance == (Object)null || (Object)(object)__instance != (Object)(object)GameNetworkManager.Instance.localPlayerController || (Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)
{
return;
}
if (!GameNetworkManager.Instance.localPlayerController.isPlayerDead)
{
List<WalkieTalkie> list = new List<WalkieTalkie>();
List<WalkieTalkie> list2 = new List<WalkieTalkie>();
for (int i = 0; i < WalkieTalkie.allWalkieTalkies.Count; i++)
{
float num = Vector3.Distance(((Component)WalkieTalkie.allWalkieTalkies[i]).transform.position, ((Component)__instance).transform.position);
if (num <= AudibleDistance)
{
if (((GrabbableObject)WalkieTalkie.allWalkieTalkies[i]).isBeingUsed)
{
list.Add(WalkieTalkie.allWalkieTalkies[i]);
}
}
else
{
list2.Add(WalkieTalkie.allWalkieTalkies[i]);
}
}
bool flag = list.Count > 0;
if (flag != __instance.holdingWalkieTalkie)
{
___holdingWalkieTalkie = flag;
for (int j = 0; j < list2.Count; j++)
{
if (j < list.Count)
{
list2[j].thisAudio.Stop();
}
}
}
if (!flag)
{
return;
}
}
PlayerControllerB val = ((!GameNetworkManager.Instance.localPlayerController.isPlayerDead || !((Object)(object)GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript != (Object)null)) ? GameNetworkManager.Instance.localPlayerController : GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript);
for (int k = 0; k < StartOfRound.Instance.allPlayerScripts.Length; k++)
{
PlayerControllerB val2 = StartOfRound.Instance.allPlayerScripts[k];
if ((!val2.isPlayerControlled && !val2.isPlayerDead) || (Object)(object)val2 == (Object)(object)GameNetworkManager.Instance.localPlayerController || val2.isPlayerDead || !val2.holdingWalkieTalkie)
{
continue;
}
float num2 = Vector3.Distance(((Component)val).transform.position, ((Component)val2).transform.position);
float num3 = float.MaxValue;
float num4 = float.MaxValue;
for (int l = 0; l < WalkieTalkie.allWalkieTalkies.Count; l++)
{
WalkieTalkie val3 = WalkieTalkie.allWalkieTalkies[l];
if (!((GrabbableObject)val3).isBeingUsed)
{
continue;
}
float num5 = Vector3.Distance(((Component)val3.target).transform.position, ((Component)val).transform.position);
if (num5 < num3)
{
num3 = num5;
}
if (Object.op_Implicit((Object)(object)((GrabbableObject)val3).playerHeldBy) && (!Object.op_Implicit((Object)(object)((GrabbableObject)val3).playerHeldBy) || ((GrabbableObject)val3).playerHeldBy.speakingToWalkieTalkie))
{
float num6 = Vector3.Distance(((Component)val3).transform.position, ((Component)val2).transform.position);
if (num6 < num4)
{
num4 = num6;
}
}
}
float num7 = 1f - Mathf.InverseLerp(AverageDistanceToHeldWalkie, WalkieRecordingRange, num4);
float num8 = 1f - Mathf.InverseLerp(AverageDistanceToHeldWalkie, WalkieRecordingRange, num3);
float num9 = Mathf.Clamp01(1f + (num7 - num8));
float num10 = 1f - Mathf.InverseLerp(1f, PlayerToPlayerSpatialHearingRange, num2);
val2.voicePlayerState.Volume = Mathf.Max(num9, num10);
if (num9 > num10)
{
makePlayerSoundWalkieTalkie(val2);
}
else
{
makePlayerSoundSpatial(val2);
}
}
static void makePlayerSoundSpatial(PlayerControllerB playerController)
{
AudioSource currentVoiceChatAudioSource = playerController.currentVoiceChatAudioSource;
AudioLowPassFilter component = ((Component)currentVoiceChatAudioSource).GetComponent<AudioLowPassFilter>();
AudioHighPassFilter component2 = ((Component)currentVoiceChatAudioSource).GetComponent<AudioHighPassFilter>();
OccludeAudio component3 = ((Component)currentVoiceChatAudioSource).GetComponent<OccludeAudio>();
((Behaviour)component2).enabled = false;
((Behaviour)component).enabled = true;
component3.overridingLowPass = playerController.voiceMuffledByEnemy;
currentVoiceChatAudioSource.spatialBlend = 1f;
playerController.currentVoiceChatIngameSettings.set2D = false;
currentVoiceChatAudioSource.bypassListenerEffects = false;
currentVoiceChatAudioSource.bypassEffects = false;
currentVoiceChatAudioSource.outputAudioMixerGroup = SoundManager.Instance.playerVoiceMixers[playerController.playerClientId];
component.lowpassResonanceQ = 1f;
}
static void makePlayerSoundWalkieTalkie(PlayerControllerB playerController)
{
AudioSource currentVoiceChatAudioSource2 = playerController.currentVoiceChatAudioSource;
AudioLowPassFilter component4 = ((Component)currentVoiceChatAudioSource2).GetComponent<AudioLowPassFilter>();
AudioHighPassFilter component5 = ((Component)currentVoiceChatAudioSource2).GetComponent<AudioHighPassFilter>();
OccludeAudio component6 = ((Component)currentVoiceChatAudioSource2).GetComponent<OccludeAudio>();
((Behaviour)component5).enabled = true;
((Behaviour)component4).enabled = true;
component6.overridingLowPass = true;
currentVoiceChatAudioSource2.spatialBlend = 0f;
playerController.currentVoiceChatIngameSettings.set2D = true;
currentVoiceChatAudioSource2.outputAudioMixerGroup = SoundManager.Instance.playerVoiceMixers[playerController.playerClientId];
currentVoiceChatAudioSource2.bypassListenerEffects = false;
currentVoiceChatAudioSource2.bypassEffects = false;
currentVoiceChatAudioSource2.panStereo = (GameNetworkManager.Instance.localPlayerController.isPlayerDead ? 0f : 0.4f);
component6.lowPassOverride = 4000f;
component4.lowpassResonanceQ = 3f;
}
}
}
[HarmonyPatch(typeof(WalkieTalkie))]
internal class WalkieTalkiePatch
{
[HarmonyPatch("EnableWalkieTalkieListening")]
[HarmonyPrefix]
private static bool alwaysHearWalkieTalkiesEnableWalkieTalkieListeningPatch(bool enable)
{
if (!enable)
{
return false;
}
return true;
}
}
}