Decompiled source of AerodynamicLobsterDisconnectFix v1.0.0

BepInEx/plugins/asm.LobsterDisconnectFix/LobsterDisconnectFix.dll

Decompiled 2 days ago
using System;
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.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")]
[assembly: AssemblyCompany("LobsterDisconnectFix")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+9cb8e50c55a4ae05e0c6461fec53dcc365f1b2c6")]
[assembly: AssemblyProduct("LobsterDisconnectFix")]
[assembly: AssemblyTitle("LobsterDisconnectFix")]
[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 LobsterDisconnectFix
{
	[BepInPlugin("LobsterDisconnectFix", "LobsterDisconnectFix", "1.0.0")]
	[HarmonyPatch]
	public class Plugin : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(GameNetworkManager))]
		private static class GameNetworkManager_Patch
		{
			[HarmonyPatch("Singleton_OnClientDisconnectCallback")]
			[HarmonyPostfix]
			[HarmonyWrapSafe]
			private static void Singleton_OnClientDisconnectCallback_Postfix(GameNetworkManager __instance, ulong clientId)
			{
				if ((clientId == 0L || clientId == NetworkManager.Singleton.LocalClientId) && NetworkManager.Singleton.IsClient && !NetworkManager.Singleton.IsServer)
				{
					__instance.disconnectReason = 1;
					__instance.Disconnect();
				}
			}
		}

		[HarmonyPatch(typeof(MenuManager))]
		private static class DisplayMenuNotification_Patch
		{
			[HarmonyPatch("DisplayMenuNotification")]
			[HarmonyPrefix]
			[HarmonyWrapSafe]
			private static void DisplayMenuNotification_Postfix(MenuManager __instance, string notificationText, string buttonText)
			{
				//IL_0063: Unknown result type (might be due to invalid IL or missing references)
				//IL_0069: Expected O, but got Unknown
				//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00db: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
				//IL_0104: Unknown result type (might be due to invalid IL or missing references)
				Transform val = __instance.menuNotification.transform.Find("Panel");
				Transform val2 = val.Find("LobsterImage");
				GameObject val3 = (((Object)(object)val2 != (Object)null) ? ((Component)val2).gameObject : null);
				if ((Object)(object)val3 == (Object)null)
				{
					if ((Object)(object)LobsterSprite == (Object)null)
					{
						Logger.LogWarning((object)"Sprite not loaded, skipping lobster.");
						return;
					}
					val3 = new GameObject("LobsterImage");
					val3.transform.SetParent(val, false);
					Image obj = val3.AddComponent<Image>();
					obj.sprite = LobsterSprite;
					obj.preserveAspect = true;
					((Graphic)obj).raycastTarget = false;
					val3.AddComponent<LayoutElement>().ignoreLayout = true;
					RectTransform component = val3.GetComponent<RectTransform>();
					component.anchorMin = new Vector2(0.5f, 1f);
					component.anchorMax = new Vector2(0.5f, 1f);
					component.pivot = new Vector2(0.5f, 0f);
					component.anchoredPosition = new Vector2(0f, 35f);
					component.sizeDelta = new Vector2(200f, 200f);
					if ((Object)(object)LobsterSound != (Object)null)
					{
						AudioSource val4 = val3.GetComponent<AudioSource>();
						if ((Object)(object)val4 == (Object)null)
						{
							val4 = val3.AddComponent<AudioSource>();
						}
						val4.clip = LobsterSound;
						val4.volume = 1f;
					}
				}
				if (GameNetworkManager.Instance.disconnectReason == 1)
				{
					AudioSource component2 = val3.GetComponent<AudioSource>();
					if ((Object)(object)component2 != (Object)null)
					{
						component2.Play();
					}
					val3.SetActive(true);
				}
				else
				{
					val3.SetActive(false);
				}
			}
		}

		internal static ManualLogSource Logger;

		internal static Harmony Harmony = new Harmony("LobsterDisconnectFix");

		internal static Sprite LobsterSprite;

		internal static AudioClip LobsterSound;

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			Logger.LogInfo((object)"Plugin LobsterDisconnectFix is loaded!");
			LobsterSprite = LoadSpriteFromEmbeddedResource("lobster.png");
			byte[] resourceBytes = GetResourceBytes("lobster.wav");
			if (resourceBytes != null)
			{
				LobsterSound = WavUtility.ToAudioClip(resourceBytes, "LobsterMusic");
			}
			Harmony.PatchAll();
		}

		private static byte[] GetResourceBytes(string resourceName, string firstName = "LobsterDisconnectFix.Embedded")
		{
			try
			{
				using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(firstName + "." + resourceName);
				if (stream == null)
				{
					Logger.LogError((object)("Resource not found: " + resourceName));
					return null;
				}
				byte[] array = new byte[stream.Length];
				stream.Read(array, 0, (int)stream.Length);
				return array;
			}
			catch (Exception ex)
			{
				Logger.LogError((object)ex);
				return null;
			}
		}

		private static Sprite LoadSpriteFromEmbeddedResource(string resourceName, string firstName = "LobsterDisconnectFix.Embedded")
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				byte[] resourceBytes = GetResourceBytes(resourceName, firstName);
				Texture2D val = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val, resourceBytes))
				{
					((Texture)val).filterMode = (FilterMode)1;
					return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
				}
			}
			catch (Exception ex)
			{
				Logger.LogError((object)("Error loading sprite: " + ex.Message));
			}
			return null;
		}
	}
	public static class WavUtility
	{
		public static AudioClip ToAudioClip(byte[] wavFile, string name = "wav")
		{
			int num = BitConverter.ToInt32(wavFile, 16);
			BitConverter.ToInt16(wavFile, 20);
			int num2 = BitConverter.ToInt16(wavFile, 22);
			int num3 = BitConverter.ToInt32(wavFile, 24);
			int num4 = BitConverter.ToInt16(wavFile, 34);
			int i;
			for (i = 20 + num; i < wavFile.Length; i++)
			{
				if (wavFile[i] == 100 && wavFile[i + 1] == 97 && wavFile[i + 2] == 116 && wavFile[i + 3] == 97)
				{
					i += 4;
					break;
				}
			}
			int num5 = BitConverter.ToInt32(wavFile, i);
			i += 4;
			float[] array = new float[num5 / (num4 / 8)];
			int num6 = 0;
			switch (num4)
			{
			case 16:
			{
				for (int k = 0; k < array.Length; k++)
				{
					short num7 = BitConverter.ToInt16(wavFile, i + num6);
					array[k] = (float)num7 / 32768f;
					num6 += 2;
				}
				break;
			}
			case 8:
			{
				for (int l = 0; l < array.Length; l++)
				{
					array[l] = (float)(wavFile[i + num6] - 128) / 128f;
					num6++;
				}
				break;
			}
			case 32:
			{
				for (int j = 0; j < array.Length; j++)
				{
					array[j] = BitConverter.ToSingle(wavFile, i + num6);
					num6 += 4;
				}
				break;
			}
			}
			AudioClip obj = AudioClip.Create(name, array.Length / num2, num2, num3, false);
			obj.SetData(array, 0);
			return obj;
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "LobsterDisconnectFix";

		public const string PLUGIN_NAME = "LobsterDisconnectFix";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}