Decompiled source of Chair View v0.0.4

ChairView.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using CG;
using CG.Client;
using CG.Game;
using CG.Game.Player;
using CG.Input;
using CG.Ship.Modules;
using CG.Space;
using CG.Space.SpaceObjects;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;
using UnityEngine.InputSystem;
using VoidManager;
using VoidManager.MPModChecks;
using VoidManager.Utilities;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("ChairView")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Pressing switch view (TAB) while in a chair shows the ship exterior view")]
[assembly: AssemblyFileVersion("0.0.4.0")]
[assembly: AssemblyInformationalVersion("0.0.4+bc7c61c4eeee017a51353c50b93d880d21402032")]
[assembly: AssemblyProduct("ChairView")]
[assembly: AssemblyTitle("Pressing switch view (TAB) while in a chair shows the ship exterior view")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.4.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 ChairView
{
	[BepInPlugin("18107.ChairView", "ChairView", "0.0.4")]
	[BepInProcess("Void Crew.exe")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class BepinPlugin : BaseUnityPlugin
	{
		internal static ManualLogSource Log;

		private void Awake()
		{
			Log = ((BaseUnityPlugin)this).Logger;
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "18107.ChairView");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin 18107.ChairView is loaded!");
		}
	}
	[HarmonyPatch(typeof(ChairBase))]
	internal class ChairBasePatch
	{
		private static ChairBase playerChair;

		internal static bool isHelm = true;

		private static readonly MethodInfo AbilityStartedMethod = AccessTools.Method(typeof(ControllingHelm), "AbilityStarted", (Type[])null, (Type[])null);

		private static readonly MethodInfo AbilityStoppedMethod = AccessTools.Method(typeof(ControllingHelm), "AbilityStopped", (Type[])null, (Type[])null);

		[HarmonyPostfix]
		[HarmonyPatch("TakeChairLocal")]
		private static void TakeChairLocal(ChairBase __instance)
		{
			ClientGame current = ClientGame.Current;
			object obj;
			if (current == null)
			{
				obj = null;
			}
			else
			{
				AbstractPlayerControlledShip playerShip = current.PlayerShip;
				if (playerShip == null)
				{
					obj = null;
				}
				else
				{
					GameObject gameObject = ((Component)playerShip).gameObject;
					if (gameObject == null)
					{
						obj = null;
					}
					else
					{
						Helm componentInChildren = gameObject.GetComponentInChildren<Helm>();
						obj = ((componentInChildren != null) ? componentInChildren.Chair : null);
					}
				}
			}
			ChairBase val = (ChairBase)obj;
			if (!((Object)(object)val == (Object)null) && ((MonoBehaviourPun)__instance).photonView.Owner == PhotonNetwork.LocalPlayer && !(__instance is TurretChair) && __instance is TakeoverChair && !((Object)(object)__instance == (Object)(object)val))
			{
				playerChair = __instance;
				ControllingHelmPatch.controllingHelm.AbilityActivator = (IAbilityActivator)(object)((Component)ClientGame.Current.PlayerShip).gameObject.GetComponentInChildren<Helm>();
				isHelm = false;
				AbilityStartedMethod.Invoke(ControllingHelmPatch.controllingHelm, null);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("FreeChairLocal")]
		private static void FreeChairLocal(ChairBase __instance)
		{
			if (!((Object)(object)__instance != (Object)(object)playerChair))
			{
				playerChair = null;
				AbilityStoppedMethod.Invoke(ControllingHelmPatch.controllingHelm, new object[1] { true });
				isHelm = true;
			}
		}

		internal static void Reset(object sender = null, EventArgs e = null)
		{
			if (ControllingHelmPatch.controllingHelm != null)
			{
				AbilityStoppedMethod.Invoke(ControllingHelmPatch.controllingHelm, new object[1] { true });
				isHelm = true;
				ControllingHelmPatch.controllingHelm = null;
			}
		}
	}
	[HarmonyPatch(typeof(ControllingHelm))]
	internal class ControllingHelmPatch
	{
		internal static ControllingHelm controllingHelm;

		private static List<ControllingHelm> potentialHelm = new List<ControllingHelm>();

		private static LocalPlayer nullPlayer;

		private static readonly FieldInfo helmParentSpacecraftField = AccessTools.Field(typeof(ControllingHelm), "_helmParentSpacecraft");

		private static readonly FieldInfo helmField = AccessTools.Field(typeof(ControllingHelm), "_helm");

		private static readonly FieldInfo localPlayerField = AccessTools.Field(typeof(ControllingHelm), "_localPlayer");

		private static readonly MethodInfo ToggleExternalThirdPersonShipViewMethod = AccessTools.Method(typeof(ControllingHelm), "ToggleExternalThirdPersonShipView", (Type[])null, (Type[])null);

		[HarmonyPostfix]
		[HarmonyPatch("Awake")]
		private static void Awake(ControllingHelm __instance, LocalPlayer ____localPlayer)
		{
			nullPlayer = ____localPlayer;
			if (potentialHelm.Count == 0)
			{
				Events.Instance.LateUpdate += CheckHelm;
			}
			potentialHelm.Add(__instance);
		}

		private static void CheckHelm(object sender, EventArgs e)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			for (int num = potentialHelm.Count - 1; num >= 0; num--)
			{
				ControllingHelm obj = potentialHelm[num];
				LocalPlayer val = (LocalPlayer)localPlayerField.GetValue(obj);
				if ((Object)(object)LocalPlayer.Instance == (Object)(object)val)
				{
					controllingHelm = obj;
					potentialHelm.RemoveAt(num);
				}
				else
				{
					potentialHelm.RemoveAt(num);
				}
			}
			if (potentialHelm.Count == 0)
			{
				Events.Instance.LateUpdate -= CheckHelm;
			}
		}

		[HarmonyTranspiler]
		[HarmonyPatch("AbilityStarted")]
		private static IEnumerable<CodeInstruction> AbilityStarted(IEnumerable<CodeInstruction> instructions)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Expected O, but got Unknown
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Expected O, but got Unknown
			List<CodeInstruction> list = new List<CodeInstruction>
			{
				new CodeInstruction(OpCodes.Call, (object)null),
				new CodeInstruction(OpCodes.Ldfld, (object)null),
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Ldfld, (object)null),
				new CodeInstruction(OpCodes.Ldc_I4_1, (object)null),
				new CodeInstruction(OpCodes.Callvirt, (object)null)
			};
			List<CodeInstruction> list2 = new List<CodeInstruction>();
			list2.Add(new CodeInstruction(OpCodes.Ldc_I4_1, (object)null));
			list2.Add(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ControllingHelmPatch), "ShipControlEvent", (Type[])null, (Type[])null)));
			List<CodeInstruction> list3 = list2;
			return HarmonyHelpers.PatchBySequence(instructions, (IEnumerable<CodeInstruction>)list, (IEnumerable<CodeInstruction>)list3, (PatchMode)2, (CheckMode)2, false);
		}

		[HarmonyTranspiler]
		[HarmonyPatch("AbilityStopped")]
		private static IEnumerable<CodeInstruction> AbilityStopped(IEnumerable<CodeInstruction> instructions)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Expected O, but got Unknown
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Expected O, but got Unknown
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Expected O, but got Unknown
			List<CodeInstruction> list = new List<CodeInstruction>
			{
				new CodeInstruction(OpCodes.Call, (object)null),
				new CodeInstruction(OpCodes.Ldfld, (object)null),
				new CodeInstruction(OpCodes.Ldarg_0, (object)null),
				new CodeInstruction(OpCodes.Ldfld, (object)null),
				new CodeInstruction(OpCodes.Ldc_I4_0, (object)null),
				new CodeInstruction(OpCodes.Callvirt, (object)null)
			};
			List<CodeInstruction> list2 = new List<CodeInstruction>();
			list2.Add(new CodeInstruction(OpCodes.Ldc_I4_0, (object)null));
			list2.Add(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(ControllingHelmPatch), "ShipControlEvent", (Type[])null, (Type[])null)));
			List<CodeInstruction> list3 = list2;
			return HarmonyHelpers.PatchBySequence(instructions, (IEnumerable<CodeInstruction>)list, (IEnumerable<CodeInstruction>)list3, (PatchMode)2, (CheckMode)2, false);
		}

		private static void ShipControlEvent(bool b)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			if (ChairBasePatch.isHelm)
			{
				ViewEventBus.Instance.OnShipControlToggle.Publish((ISpaceCraft)helmParentSpacecraftField.GetValue(controllingHelm), b);
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("EnableInput")]
		private static bool EnableInput()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			if (ChairBasePatch.isHelm)
			{
				return true;
			}
			InputActionReferences inputActionReferences = ServiceBase<InputService>.Instance.InputActionReferences;
			Helm @object = (Helm)helmField.GetValue(controllingHelm);
			inputActionReferences.ChangeView.action.started += (Action<CallbackContext>)ToggleExternalThirdPersonShipViewMethod.CreateDelegate(typeof(Action<CallbackContext>), controllingHelm);
			inputActionReferences.CameraViewHorizontal.action.performed += @object.SetMouseDeltaX;
			inputActionReferences.CameraViewHorizontal.action.canceled += @object.SetMouseDeltaX;
			inputActionReferences.CameraViewVertical.action.performed += @object.SetMouseDeltaY;
			inputActionReferences.CameraViewVertical.action.canceled += @object.SetMouseDeltaY;
			return false;
		}

		[HarmonyPrefix]
		[HarmonyPatch("DisableInput")]
		private static bool DisableInput()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			if (ChairBasePatch.isHelm)
			{
				return true;
			}
			InputActionReferences inputActionReferences = ServiceBase<InputService>.Instance.InputActionReferences;
			Helm @object = (Helm)helmField.GetValue(controllingHelm);
			inputActionReferences.ChangeView.action.started -= (Action<CallbackContext>)ToggleExternalThirdPersonShipViewMethod.CreateDelegate(typeof(Action<CallbackContext>), controllingHelm);
			inputActionReferences.CameraViewHorizontal.action.performed -= @object.SetMouseDeltaX;
			inputActionReferences.CameraViewHorizontal.action.canceled -= @object.SetMouseDeltaX;
			inputActionReferences.CameraViewVertical.action.performed -= @object.SetMouseDeltaY;
			inputActionReferences.CameraViewVertical.action.canceled -= @object.SetMouseDeltaY;
			return false;
		}
	}
	public class MyPluginInfo
	{
		public const string PLUGIN_GUID = "18107.ChairView";

		public const string PLUGIN_NAME = "ChairView";

		public const string USERS_PLUGIN_NAME = "Chair View";

		public const string PLUGIN_VERSION = "0.0.4";

		public const string PLUGIN_DESCRIPTION = "Pressing switch view (TAB) while in a chair shows the ship exterior view";

		public const string PLUGIN_ORIGINAL_AUTHOR = "18107";

		public const string PLUGIN_AUTHORS = "18107";

		public const string PLUGIN_THUNDERSTORE_ID = "";
	}
	public class VoidManagerPlugin : VoidPlugin
	{
		public override MultiplayerType MPType => (MultiplayerType)8;

		public override string Author => "18107";

		public override string Description => "Pressing switch view (TAB) while in a chair shows the ship exterior view";

		public override string ThunderstoreID => "";

		static VoidManagerPlugin()
		{
			Events.Instance.JoinedRoom += ChairBasePatch.Reset;
			Events.Instance.LeftRoom += ChairBasePatch.Reset;
		}
	}
}