Decompiled source of YetAnotherLethalLibrary v0.0.1

YetAnotherLethalLibrary.dll

Decompiled 5 months ago
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.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Networking;

[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("YetAnotherLethalLibrary")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("My first plugin")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("YetAnotherLethalLibrary")]
[assembly: AssemblyTitle("YetAnotherLethalLibrary")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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 YetAnotherLethalLibrary
{
	public static class AudioManager
	{
		private const string AUDIO_PLAYER_NAME = "YALLAudioSource";

		public static List<AudioSource> allAudioSources = new List<AudioSource>();

		public static void AddAudioSourceToPlayer(PlayerControllerB controller)
		{
			//IL_0059: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: 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_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Expected O, but got Unknown
			Utility.ConditionLog($"Client Spawned: {controller.actualClientId}", condition: true, (LogLevel)16);
			GameObject gameObject = ((Component)controller).gameObject;
			Transform val = gameObject.transform.Find("YALLAudioSource");
			if ((Object)(object)val == (Object)null)
			{
				Utility.ConditionLog("Creating audio player...", condition: true, (LogLevel)16);
				val = new GameObject("YALLAudioSource").transform;
				val.SetParent(gameObject.transform);
				val.localPosition = Vector3.zero;
				val.localRotation = Quaternion.identity;
				val.localScale = Vector3.one;
				AudioSource val2 = ((Component)val).gameObject.AddComponent<AudioSource>();
				val2.rolloffMode = (AudioRolloffMode)2;
				val2.playOnAwake = false;
				val2.spatialBlend = 1f;
				val2.maxDistance = 20f;
				AnimationCurve val3 = new AnimationCurve((Keyframe[])(object)new Keyframe[5]
				{
					new Keyframe(0f, 1f, -4.666667f, -4.666667f),
					new Keyframe(0.04f, 0.84f, -3.708333f, -3.708333f),
					new Keyframe(0.2f, 0.42f, -1.975f, -1.975f),
					new Keyframe(0.4f, 0.18f, -17f / 24f, -17f / 24f),
					new Keyframe(1f, 0.05f, 0f, 0f)
				});
				val2.SetCustomCurve((AudioSourceCurveType)0, val3);
				Utility.ConditionLog("Adding audio player to list...", condition: true, (LogLevel)16);
				allAudioSources.Add(val2);
			}
		}

		public static List<AudioClip> LoadAudioClipsFromFolder(string folderPath)
		{
			string[] files = Directory.GetFiles(folderPath);
			List<AudioClip> list = new List<AudioClip>();
			string[] array = files;
			foreach (string text in array)
			{
				Utility.ConditionLog("Loading audio clip: " + text, condition: true, (LogLevel)16);
				AudioClip val = LoadAudioClipFromPath(text);
				if ((Object)(object)val != (Object)null)
				{
					list.Add(val);
				}
			}
			return list;
		}

		public static AudioClip LoadAudioClipFromPath(string path)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			return LoadAudioClipFromPath(path, AudioTypeFromPath(path));
		}

		public static AudioClip LoadAudioClipFromPath(string path, AudioType type)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Invalid comparison between Unknown and I4
			UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(path, type);
			try
			{
				audioClip.SendWebRequest();
				string text;
				try
				{
					while (!audioClip.isDone)
					{
					}
					if ((int)audioClip.result == 1)
					{
						AudioClip content = DownloadHandlerAudioClip.GetContent(audioClip);
						((Object)content).name = Path.GetFileNameWithoutExtension(path);
						return content;
					}
					text = audioClip.error;
				}
				catch (Exception ex)
				{
					text = ex.ToString();
				}
				Utility.ConditionLog("Failed to load audio clip from " + path + ".\nError: " + text, condition: true, (LogLevel)2);
				return null;
			}
			finally
			{
				((IDisposable)audioClip)?.Dispose();
			}
		}

		public static AudioType AudioTypeFromPath(string path)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			return AudioTypeFromExtension(Path.GetExtension(path).ToLower());
		}

		public static AudioType AudioTypeFromExtension(string extension)
		{
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: 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_00e0: Unknown result type (might be due to invalid IL or missing references)
			return (AudioType)(extension switch
			{
				".wav" => 20, 
				".mp3" => 13, 
				".ogg" => 14, 
				".aiff" => 2, 
				".aif" => 2, 
				".aifc" => 2, 
				".flac" => 24, 
				_ => 0, 
			});
		}

		public static void PlayAudio(ulong clientID, AudioClip clip, float volume = 1f, float range = 20f, float loudness = 0.5f, bool audibleToEnemies = true)
		{
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			if (Utility.ConditionLog("Attempting to play a null audioclip!", (Object)(object)clip == (Object)null, (LogLevel)2))
			{
				return;
			}
			if (!TryGetPlayerCustomAudioSource(clientID, out var audioSource))
			{
				Utility.ConditionLog($"Audio Source not found for ID: {clientID}", condition: true, (LogLevel)2);
				return;
			}
			Utility.ConditionLog($"Playing clip {((Object)clip).name} for {clientID}", condition: true, (LogLevel)32);
			audioSource.volume = volume;
			audioSource.minDistance = 0f;
			audioSource.maxDistance = Mathf.Max(0.01f, range);
			audioSource.PlayOneShot(clip);
			if (!audibleToEnemies)
			{
				return;
			}
			Utility.ConditionLog("Playing audible noise...", condition: true, (LogLevel)16);
			if (GameManager.TryGetPlayerController(clientID, out var player))
			{
				bool flag = player.isInHangarShipRoom && StartOfRound.Instance.hangarDoorsClosed;
				Utility.ConditionLog($"Audible noise playing for {player.playerUsername}. (In Closed Ship: {flag})", condition: true, (LogLevel)32);
				if (clip.length <= 1f)
				{
					RoundManager.Instance.PlayAudibleNoise(((Component)player).transform.position, range, loudness, 0, flag, 0);
				}
				else
				{
					((MonoBehaviour)RoundManager.Instance).StartCoroutine(PlayAudibleNoiseForTime(clip.length - 0.5f, ((Component)player).transform.position, range / 2f, loudness, flag));
				}
			}
			else
			{
				Utility.ConditionLog($"Couldn't match ID {clientID} with a controller!", condition: true, (LogLevel)16);
			}
		}

		public static IEnumerator PlayAudibleNoiseForTime(float time, Vector3 position, float range = 20f, float loudness = 0.5f, bool isInClosedShip = false, float frequencyInSeconds = 0.5f)
		{
			//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)
			if (frequencyInSeconds < 0.2f)
			{
				frequencyInSeconds = 0.2f;
				Utility.ConditionLog("Adjust audible noise frequency to 0.2 seconds.", condition: true, (LogLevel)4);
			}
			while (time > 0f)
			{
				RoundManager.Instance.PlayAudibleNoise(position, range, loudness, 0, isInClosedShip, 0);
				time -= frequencyInSeconds;
				yield return (object)new WaitForSeconds(frequencyInSeconds);
			}
		}

		public static bool TryGetPlayerCustomAudioSource(ulong clientID, out AudioSource audioSource)
		{
			audioSource = null;
			if (GameManager.TryGetPlayerController(clientID, out var player))
			{
				Transform val = ((Component)player).transform.Find("YALLAudioSource");
				return ((Component)val).TryGetComponent<AudioSource>(ref audioSource);
			}
			Utility.ConditionLog($"Failed to get player controller for client {clientID}!", condition: true, (LogLevel)2);
			return false;
		}

		public static void Initialize()
		{
			Utility.ConditionLog("Initializing AudioManager...", condition: true, (LogLevel)16);
			GameManager.OnPlayerSpawned = (Action<PlayerControllerB>)Delegate.Remove(GameManager.OnPlayerSpawned, new Action<PlayerControllerB>(AddAudioSourceToPlayer));
			GameManager.OnPlayerSpawned = (Action<PlayerControllerB>)Delegate.Combine(GameManager.OnPlayerSpawned, new Action<PlayerControllerB>(AddAudioSourceToPlayer));
		}
	}
	public static class GameManager
	{
		public static Action<PlayerControllerB> OnPlayerSpawned;

		public static Action<PlayerControllerB> OnClientPlayerConnected;

		public static Action OnClientPlayerDisconnected;

		public static Action<PlayerControllerB> OnPlayerLateUpdate;

		public static Action<StartOfRound> OnRoundStart;

		public static Action<StartOfRound> OnRoundEnd;

		public static PlayerControllerB localPlayer;

		[HarmonyPatch(typeof(PlayerControllerB), "Start")]
		[HarmonyPostfix]
		private static void PlayerControllerBStartPostFix(PlayerControllerB __instance)
		{
			OnPlayerSpawned?.Invoke(__instance);
		}

		[HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")]
		[HarmonyPostfix]
		private static void PlayerControllerBLateUpdatePostFix(PlayerControllerB __instance)
		{
			OnPlayerLateUpdate?.Invoke(__instance);
		}

		[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
		[HarmonyPostfix]
		private static void PlayerControllerBConnectClientToPlayerObjectPostFix(PlayerControllerB __instance)
		{
			localPlayer = __instance;
			OnClientPlayerConnected?.Invoke(__instance);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
		private static void GameNetworkManagerStartDisconnectPostFix()
		{
			OnClientPlayerDisconnected?.Invoke();
		}

		[HarmonyPatch(typeof(StartOfRound), "OnShipLandedMiscEvents")]
		[HarmonyPostfix]
		private static void StartOfOnShipLandedMiscEventsPostFix(StartOfRound __instance)
		{
			OnRoundStart?.Invoke(__instance);
		}

		[HarmonyPatch(typeof(StartOfRound), "ShipHasLeft")]
		[HarmonyPostfix]
		private static void StartOfRoundEndOfGamePostFix(StartOfRound __instance)
		{
			OnRoundEnd?.Invoke(__instance);
		}

		public static bool TryGetPlayerController(ulong id, out PlayerControllerB player)
		{
			player = null;
			StartOfRound instance = StartOfRound.Instance;
			if (Utility.ConditionLog("StartOfRound.Instance is null! Can't get player controller.", (Object)(object)instance == (Object)null, (LogLevel)2))
			{
				return false;
			}
			player = ((IEnumerable<PlayerControllerB>)StartOfRound.Instance.allPlayerScripts).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB pc) => pc.actualClientId == id));
			return (Object)(object)player != (Object)null;
		}
	}
	public static class Utility
	{
		public struct FloatRange
		{
			public float min;

			public float max;

			public FloatRange(float min, float max)
			{
				this.min = min;
				this.max = max;
			}

			public float RandomInRange()
			{
				return Random.Range(min, max);
			}

			public bool HasInRange(float value)
			{
				return value >= min && value <= max;
			}
		}

		internal static bool ConditionLog(string message, bool condition = true, LogLevel logLevel = 16)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			if (condition)
			{
				YALLPlugin.instance.logSource.Log(logLevel, (object)message);
			}
			return condition;
		}

		public static float[] NormalizeChances(params float[] chances)
		{
			float[] array = new float[chances.Length];
			float num = chances.Sum();
			for (int i = 0; i < chances.Length; i++)
			{
				array[i] = chances[i] / num;
			}
			return array;
		}

		public static FloatRange[] SpreadNormalizedChances(float[] normalizedChances, float maxRange = 100f)
		{
			FloatRange[] array = new FloatRange[normalizedChances.Length];
			float num = 0f;
			for (int i = 0; i < normalizedChances.Length; i++)
			{
				float num2 = normalizedChances[i] * maxRange;
				array[i] = new FloatRange(num, num + num2);
				num += num2;
			}
			return array;
		}
	}
	[BepInPlugin("YetAnotherLethalLibrary", "YetAnotherLethalLibrary", "1.0.0")]
	public class YALLPlugin : BaseUnityPlugin
	{
		internal static readonly Harmony _harmony = new Harmony("YetAnotherLethalLibrary");

		public static YALLPlugin instance;

		internal ManualLogSource logSource => ((BaseUnityPlugin)this).Logger;

		private void Awake()
		{
			instance = this;
			logSource.LogInfo((object)"Plugin YetAnotherLethalLibrary is loaded!");
			_harmony.PatchAll(typeof(GameManager));
			AudioManager.Initialize();
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "YetAnotherLethalLibrary";

		public const string PLUGIN_NAME = "YetAnotherLethalLibrary";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}