Decompiled source of CruiserTerminal v1.1.2

CruiserTerminal.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using CruiserTerminal.CTerminal;
using CruiserTerminal.Compatibility;
using CruiserTerminal.Methods;
using CruiserTerminal.NetcodePatcher;
using CruiserTerminal.Patches;
using GameNetcodeStuff;
using HarmonyLib;
using LethalConfig;
using LethalConfig.ConfigItems;
using Malfunctions;
using Malfunctions.Patches;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[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("CruiserTerminal")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3075d97465c3ef62f97065f14941bdebad3df087")]
[assembly: AssemblyProduct("CruiserTerminal")]
[assembly: AssemblyTitle("CruiserTerminal")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: NetcodePatchedAssembly]
internal class <Module>
{
	static <Module>()
	{
	}
}
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace CruiserTerminal
{
	internal class CTConfig
	{
		internal static ConfigEntry<bool> canDestroy;

		internal static ConfigEntry<int> maxHealth;

		internal static ConfigEntry<float> invTime;

		internal static ConfigEntry<bool> enablePenalty;

		internal static ConfigEntry<float> penalty;

		internal static ConfigEntry<bool> canCruiserDamage;

		internal static ConfigEntry<int> cruiserDamage;

		internal static void Config(ConfigFile cfg)
		{
			canDestroy = cfg.Bind<bool>("Health", "Can be destroyed", true, "Enables cruiser terminal damage");
			maxHealth = cfg.Bind<int>("Health", "Maximum terminal health", 2, "Maximum terminal health.\nIf the value is below 1, it will set the value to 2.");
			invTime = cfg.Bind<float>("Health", "Terminal invulnerability time", 1f, "The terminal's invulnerability time after receiving a hit.\nSetting 0 will result in the possibility of one hit being triggered multiple times.\nIf the value is below 0, it will set the value to 1.");
			enablePenalty = cfg.Bind<bool>("Health", "Enable penalty for destruction", true, (ConfigDescription)null);
			penalty = cfg.Bind<float>("Health", "Penalty amount", 0.05f, "Penalty amount.\nIf the value is below 0.01 or above 0.33, it will set the value to 0.05.");
			canCruiserDamage = cfg.Bind<bool>("Health", "Can cruiser damage terminal", true, "Enables Cruiser Terminal damage from your driving skills.");
			cruiserDamage = cfg.Bind<int>("Health", "Cruiser damage", 1, "Damage from cruiser to terminal.\nIf the value is below 1, it will set the value to 1.");
			ConfigCheck();
		}

		internal static void ConfigCheck()
		{
			if (maxHealth.Value < 1)
			{
				maxHealth.Value = 2;
			}
			if (invTime.Value < 0f)
			{
				invTime.Value = 1f;
			}
			if (penalty.Value < 0.01f || penalty.Value > 0.33f)
			{
				penalty.Value = 0.05f;
			}
			if (cruiserDamage.Value < 1)
			{
				cruiserDamage.Value = 1;
			}
		}
	}
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("mborsh.CruiserTerminal", "CruiserTerminal", "1.1.2")]
	public class CTPlugin : BaseUnityPlugin
	{
		private const string modGUID = "mborsh.CruiserTerminal";

		private const string modName = "CruiserTerminal";

		private const string modVersion = "1.1.2";

		private readonly Harmony harmony = new Harmony("mborsh.CruiserTerminal");

		public static ManualLogSource mls;

		public static AssetBundle mainAssetBundle;

		private static CTPlugin Instance;

		public static GameObject terminalPrefab;

		private static void NetcodePatcher()
		{
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			Type[] array = types;
			foreach (Type type in array)
			{
				MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
				MethodInfo[] array2 = methods;
				foreach (MethodInfo methodInfo in array2)
				{
					object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
					if (customAttributes.Length != 0)
					{
						methodInfo.Invoke(null, null);
					}
				}
			}
		}

		private void Awake()
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			NetcodePatcher();
			Instance = this;
			mls = Logger.CreateLogSource("Cruiser Terminal");
			mls = ((BaseUnityPlugin)this).Logger;
			ConfigFile cfg = new ConfigFile(Path.Combine(Paths.ConfigPath, "mborsh.CruiserTerminal.cfg"), true);
			CTConfig.Config(cfg);
			if (Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"))
			{
				LethalConfigCompat.LethalConfigSetup();
			}
			if (!LoadAssetBundle())
			{
				mls.LogError((object)"Failed to load asset bundle! Abort mission!");
				return;
			}
			mls.LogInfo((object)"Cruiser Terminal loaded. Patching.");
			if (Chainloader.PluginInfos.ContainsKey("com.zealsprince.malfunctions"))
			{
				harmony.PatchAll(typeof(MalfunctionsCompat));
			}
			harmony.PatchAll(typeof(CTPatches));
			static bool LoadAssetBundle()
			{
				mls.LogInfo((object)"Loading AssetBundle...");
				string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
				mainAssetBundle = AssetBundle.LoadFromFile(Path.Combine(directoryName, "CruiserTerminal"));
				if ((Object)(object)mainAssetBundle == (Object)null)
				{
					return false;
				}
				mls.LogInfo((object)("AssetBundle " + ((Object)mainAssetBundle).name + " loaded from " + directoryName + "."));
				return true;
			}
		}
	}
}
namespace CruiserTerminal.Patches
{
	public static class CTPatches
	{
		public static CruiserTerminalScript cterminal;

		[HarmonyPostfix]
		[HarmonyPatch(typeof(GameNetworkManager), "Start")]
		private static void AddPrefabsToNetwork()
		{
			CTPlugin.terminalPrefab = CTPlugin.mainAssetBundle.LoadAsset<GameObject>("CruiserTerminal.prefab");
			CTPlugin.terminalPrefab.AddComponent<CruiserTerminalScript>();
			NetworkManager.Singleton.AddNetworkPrefab(CTPlugin.terminalPrefab);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(VehicleController), "Awake")]
		private static void AwakePatch()
		{
			CTMethods.Init();
			CTMethods.Spawn();
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(VehicleController), "DestroyCarServerRpc")]
		private static void DestroyCarServerRpcPatch()
		{
			cterminal.TerminalExplosionServerRpc(cterminal.health);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(VehicleController), "DealDamageServerRpc")]
		private static void DealDamageServerRpcPatch()
		{
			cterminal.TerminalExplosionServerRpc(CTConfig.cruiserDamage.Value);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(VehicleController), "OnDisable")]
		private static void OnDisablePatch()
		{
			try
			{
				CTMethods.Despawn();
			}
			catch
			{
				CTPlugin.mls.LogError((object)"Tried to despawn the terminal but it doesn't exist. If nothing broke then everything is ok =)");
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Terminal), "SetTerminalInUseClientRpc")]
		private static void SetTerminalInUsePatch(ref bool ___terminalInUse)
		{
			if (!((Object)(object)cterminal == (Object)null))
			{
				cterminal.SetTerminalBusyServerRpc(___terminalInUse);
				CTPlugin.mls.LogInfo((object)("cruiser terminal interactable:" + !___terminalInUse));
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(ManualCameraRenderer), "MeetsCameraEnabledConditions")]
		private static void MeetsCameraEnabledConditionsPatch(ref bool __result)
		{
			if (!((Object)(object)StartOfRound.Instance == (Object)null) && !((Object)(object)cterminal == (Object)null) && cterminal.cruiserTerminalInUse)
			{
				__result = true;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(StartOfRound), "ShipHasLeft")]
		private static void ShipHasLeftPatch()
		{
			if (!((Object)(object)cterminal == (Object)null))
			{
				cterminal.SetTerminalBusyServerRpc(busy: false);
				cterminal.ResetHp();
			}
		}
	}
}
namespace CruiserTerminal.Methods
{
	internal class CTMethods
	{
		private static bool isSpawned;

		private static bool isHostOrServer;

		private static NetworkObject terminalNO;

		internal static void Init()
		{
			isHostOrServer = NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer;
			isSpawned = false;
		}

		internal static void Spawn()
		{
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			if (!isSpawned)
			{
				if (isHostOrServer)
				{
					GameObject val = Object.Instantiate<GameObject>(CTPlugin.terminalPrefab);
					CTPatches.cterminal = val.GetComponent<CruiserTerminalScript>();
					terminalNO = val.GetComponent<NetworkObject>();
					terminalNO.Spawn(false);
				}
				Object obj = CTPlugin.mainAssetBundle.LoadAsset("terminalPosition.prefab");
				GameObject val2 = Object.Instantiate<GameObject>((GameObject)(object)((obj is GameObject) ? obj : null));
				((Object)val2).name = "terminalPosition";
				val2.transform.SetParent(GameObject.Find("CompanyCruiser(Clone)").transform);
				val2.transform.localPosition = new Vector3(1.293f, 0.938f, -3.274f);
				isSpawned = true;
			}
		}

		internal static void Despawn()
		{
			if (isHostOrServer)
			{
				terminalNO.Despawn(true);
			}
			isSpawned = false;
		}
	}
}
namespace CruiserTerminal.CTerminal
{
	internal class CruiserTerminalPosition : MonoBehaviour
	{
	}
	public class CruiserTerminalScript : NetworkBehaviour, IHittable
	{
		private int maxHealth;

		internal int health;

		private float invTime;

		private bool canBeHit;

		private bool canDestroy;

		internal bool isDestroyed;

		private bool punishment;

		private float penalty;

		internal bool shipPowerSurge = false;

		public bool cruiserTerminalInUse;

		private InteractTrigger interactTrigger;

		private Transform canvasMainContainer;

		private float timeSinceLastKeyboardPress;

		private PlayerActions playerActions;

		private Transform cruiserTerminal;

		private Transform cruiserTerminalPos;

		private Transform terminal;

		private Terminal terminalScript;

		private InteractTrigger terminalInteractTrigger;

		private AudioSource audioSource;

		private AudioClip enterTerminalAudioClip;

		private AudioClip exitTerminalAudioClip;

		private AudioClip[] keyboardAudioClips;

		private Light terminalLight;

		private VehicleController cruiserController;

		bool IHittable.Hit(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit, bool playHitSFX, int hitID)
		{
			if (isDestroyed)
			{
				return true;
			}
			CTPlugin.mls.LogInfo((object)$"Terminal hit! Force: {force}");
			TerminalExplosionServerRpc(force);
			return true;
		}

		[ServerRpc(RequireOwnership = false)]
		internal void TerminalExplosionServerRpc(int force)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
			{
				ServerRpcParams val = default(ServerRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(485009299u, val, (RpcDelivery)0);
				BytePacker.WriteValueBitPacked(val2, force);
				((NetworkBehaviour)this).__endSendServerRpc(ref val2, 485009299u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost) || force <= 0 || !canBeHit || isDestroyed || !canDestroy)
			{
				return;
			}
			if (canBeHit)
			{
				health -= force;
				((MonoBehaviour)this).StartCoroutine(InvulnerabilityTime());
			}
			if (health <= 0 && !isDestroyed)
			{
				TerminalExplosionClientRpc(punishment);
				if (punishment)
				{
					StartOfRound instance = StartOfRound.Instance;
					instance.companyBuyingRate -= penalty;
					StartOfRound.Instance.SyncCompanyBuyingRateServerRpc();
				}
			}
		}

		[ClientRpc]
		private void TerminalExplosionClientRpc(bool punish)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(365707709u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref punish, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 365707709u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				if (cruiserTerminalInUse)
				{
					QuitCruiserTerminal();
				}
				((MonoBehaviour)this).StartCoroutine(TerminalMalfunction());
				if (punish)
				{
					HUDManager.Instance.DisplayTip("Cruiser Terminal", "The Company's property was damaged. You will be punished for this.", false, false, "LC_Tip1");
				}
				isDestroyed = true;
			}
		}

		private IEnumerator TerminalMalfunction()
		{
			yield return (object)new WaitForSeconds(0.1f);
			Landmine.SpawnExplosion(((Component)this).gameObject.transform.position, true, 0f, 2f, 5, 1f, (GameObject)null, false);
			yield return (object)new WaitForSeconds(0.6f);
			Landmine.SpawnExplosion(((Component)this).gameObject.transform.position, true, 0f, 3f, 5, 1f, (GameObject)null, false);
			yield return (object)new WaitForSeconds(1.6f);
			Landmine.SpawnExplosion(((Component)this).gameObject.transform.position, true, 0f, 3f, 5, 1f, (GameObject)null, false);
		}

		private IEnumerator InvulnerabilityTime()
		{
			canBeHit = false;
			yield return (object)new WaitForSeconds(invTime);
			canBeHit = true;
		}

		internal void ResetHp()
		{
			maxHealth = CTConfig.maxHealth.Value;
			health = maxHealth;
			invTime = CTConfig.invTime.Value;
			canBeHit = true;
			canDestroy = CTConfig.canDestroy.Value;
			isDestroyed = false;
			punishment = CTConfig.enablePenalty.Value;
			penalty = CTConfig.penalty.Value;
			shipPowerSurge = false;
		}

		private void Start()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			CTConfig.ConfigCheck();
			cruiserTerminal = ((Component)this).gameObject.transform;
			playerActions = new PlayerActions();
			MovementActions movement = playerActions.Movement;
			((MovementActions)(ref movement)).Enable();
			cruiserController = Object.FindAnyObjectByType<VehicleController>();
			interactTrigger = ((Component)cruiserTerminal.Find("TerminalTrigger")).gameObject.GetComponent<InteractTrigger>();
			((UnityEvent<PlayerControllerB>)(object)interactTrigger.onInteractEarly).AddListener((UnityAction<PlayerControllerB>)BeginUsingCruiserTerminal);
			((UnityEvent<PlayerControllerB>)(object)interactTrigger.onCancelAnimation).AddListener((UnityAction<PlayerControllerB>)SetTerminalNoLongerInUse);
			terminalScript = Object.FindAnyObjectByType<Terminal>();
			terminalInteractTrigger = ((Component)terminalScript).gameObject.GetComponent<InteractTrigger>();
			terminal = ((Component)terminalScript).transform.parent.parent;
			cruiserTerminalPos = ((Component)Object.FindAnyObjectByType<CruiserTerminalPosition>()).transform;
			cruiserTerminalInUse = false;
			canvasMainContainer = terminal.Find("Canvas");
			audioSource = ((Component)cruiserTerminal.Find("TerminalTrigger/TerminalAudio")).gameObject.GetComponent<AudioSource>();
			enterTerminalAudioClip = terminalScript.enterTerminalSFX;
			exitTerminalAudioClip = terminalScript.leaveTerminalSFX;
			keyboardAudioClips = terminalScript.keyboardClips;
			terminalLight = ((Component)cruiserTerminal.Find("terminalLight")).GetComponent<Light>();
			ResetHp();
		}

		private void Update()
		{
			//IL_000d: 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)
			cruiserTerminal.position = cruiserTerminalPos.position;
			cruiserTerminal.rotation = cruiserTerminalPos.rotation;
			if (cruiserTerminalInUse)
			{
				if (((ButtonControl)Keyboard.current.anyKey).wasPressedThisFrame && timeSinceLastKeyboardPress > 0.07f)
				{
					timeSinceLastKeyboardPress = 0f;
					RoundManager.PlayRandomClip(audioSource, keyboardAudioClips, true, 1f, 0, 1000);
				}
				timeSinceLastKeyboardPress += Time.deltaTime;
			}
		}

		public void BeginUsingCruiserTerminal(PlayerControllerB nullPlayer)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			cruiserController.SetVehicleCollisionForPlayer(false, GameNetworkManager.Instance.localPlayerController);
			MovementActions movement = playerActions.Movement;
			((MovementActions)(ref movement)).OpenMenu.performed += PressESC;
			if (!isDestroyed)
			{
				audioSource.PlayOneShot(enterTerminalAudioClip);
				SetTerminalBusyServerRpc(busy: true);
				cruiserTerminalInUse = true;
				((MonoBehaviour)this).StartCoroutine(waitUntilFrameEndAndParent(active: true));
				terminalScript.BeginUsingTerminal();
				CTPlugin.mls.LogInfo((object)"Begin using cruiser terminal.");
			}
		}

		public void QuitCruiserTerminal()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			cruiserController.SetVehicleCollisionForPlayer(true, GameNetworkManager.Instance.localPlayerController);
			MovementActions movement = playerActions.Movement;
			((MovementActions)(ref movement)).OpenMenu.performed -= PressESC;
			if (!isDestroyed)
			{
				terminalScript.QuitTerminal(true);
			}
			audioSource.PlayOneShot(exitTerminalAudioClip);
			interactTrigger.StopSpecialAnimation();
		}

		public void SetTerminalNoLongerInUse(PlayerControllerB nullPlayer)
		{
			cruiserTerminalInUse = false;
			SetTerminalBusyServerRpc(busy: false, shipPowerSurge);
			((MonoBehaviour)this).StartCoroutine(waitUntilFrameEndAndParent(active: false));
			CTPlugin.mls.LogInfo((object)"Stop using cruiser terminal.");
		}

		private void PressESC(CallbackContext context)
		{
			if (((CallbackContext)(ref context)).performed)
			{
				QuitCruiserTerminal();
			}
		}

		private IEnumerator waitUntilFrameEndAndParent(bool active)
		{
			if (active)
			{
				canvasMainContainer.SetParent(cruiserTerminal);
				canvasMainContainer.localPosition = new Vector3(-0.03f, 1.4f, 0.011f);
				canvasMainContainer.localScale = new Vector3(0.004f, 0.0043f, 0.0016f);
				canvasMainContainer.localRotation = Quaternion.Euler(new Vector3(0f, 90f, 0f));
			}
			else
			{
				canvasMainContainer.SetParent(terminal);
				canvasMainContainer.localPosition = new Vector3(-0.516f, 0.284f, 1.284f);
				canvasMainContainer.localScale = new Vector3(0.0015f, 0.0015f, 0.0016f);
				canvasMainContainer.localRotation = Quaternion.Euler(new Vector3(0f, 78.0969f, 90f));
			}
			yield return (object)new WaitForEndOfFrame();
		}

		[ServerRpc(RequireOwnership = false)]
		internal void SetTerminalBusyServerRpc(bool busy, bool powerSurge = false)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2309568785u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref busy, default(ForPrimitives));
					((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref powerSurge, default(ForPrimitives));
					((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2309568785u, val, (RpcDelivery)0);
				}
				if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					SetTerminalBusyClientRpc(busy, powerSurge);
				}
			}
		}

		[ClientRpc]
		internal void SetTerminalBusyClientRpc(bool busy, bool powerSurge)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Invalid comparison between Unknown and I4
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
			if (networkManager == null || !networkManager.IsListening)
			{
				return;
			}
			if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
			{
				ClientRpcParams val = default(ClientRpcParams);
				FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1172566531u, val, (RpcDelivery)0);
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref busy, default(ForPrimitives));
				((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref powerSurge, default(ForPrimitives));
				((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1172566531u, val, (RpcDelivery)0);
			}
			if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
			{
				CTPlugin.mls.LogInfo((object)$"Set interaction: {busy}, power surge: {powerSurge}");
				if (powerSurge)
				{
					interactTrigger.interactable = false;
					terminalInteractTrigger.interactable = false;
					((Behaviour)terminalLight).enabled = false;
				}
				else
				{
					interactTrigger.interactable = !busy;
					terminalInteractTrigger.interactable = !busy;
					((Behaviour)terminalLight).enabled = busy;
				}
			}
		}

		protected override void __initializeVariables()
		{
			((NetworkBehaviour)this).__initializeVariables();
		}

		[RuntimeInitializeOnLoadMethod]
		internal static void InitializeRPCS_CruiserTerminalScript()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			NetworkManager.__rpc_func_table.Add(485009299u, new RpcReceiveHandler(__rpc_handler_485009299));
			NetworkManager.__rpc_func_table.Add(365707709u, new RpcReceiveHandler(__rpc_handler_365707709));
			NetworkManager.__rpc_func_table.Add(2309568785u, new RpcReceiveHandler(__rpc_handler_2309568785));
			NetworkManager.__rpc_func_table.Add(1172566531u, new RpcReceiveHandler(__rpc_handler_1172566531));
		}

		private static void __rpc_handler_485009299(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				int force = default(int);
				ByteUnpacker.ReadValueBitPacked(reader, ref force);
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((CruiserTerminalScript)(object)target).TerminalExplosionServerRpc(force);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_365707709(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool punish = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref punish, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((CruiserTerminalScript)(object)target).TerminalExplosionClientRpc(punish);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_2309568785(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool busy = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref busy, default(ForPrimitives));
				bool powerSurge = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref powerSurge, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				((CruiserTerminalScript)(object)target).SetTerminalBusyServerRpc(busy, powerSurge);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_1172566531(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (networkManager != null && networkManager.IsListening)
			{
				bool busy = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref busy, default(ForPrimitives));
				bool powerSurge = default(bool);
				((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref powerSurge, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)2;
				((CruiserTerminalScript)(object)target).SetTerminalBusyClientRpc(busy, powerSurge);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		protected internal override string __getTypeName()
		{
			return "CruiserTerminalScript";
		}
	}
}
namespace CruiserTerminal.Compatibility
{
	internal class LethalConfigCompat
	{
		internal static void LethalConfigSetup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			BoolCheckBoxConfigItem val = new BoolCheckBoxConfigItem(CTConfig.canDestroy);
			IntInputFieldConfigItem val2 = new IntInputFieldConfigItem(CTConfig.maxHealth);
			FloatInputFieldConfigItem val3 = new FloatInputFieldConfigItem(CTConfig.invTime);
			BoolCheckBoxConfigItem val4 = new BoolCheckBoxConfigItem(CTConfig.enablePenalty);
			FloatInputFieldConfigItem val5 = new FloatInputFieldConfigItem(CTConfig.penalty);
			BoolCheckBoxConfigItem val6 = new BoolCheckBoxConfigItem(CTConfig.canCruiserDamage);
			IntInputFieldConfigItem val7 = new IntInputFieldConfigItem(CTConfig.cruiserDamage);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val3);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val4);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val5);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val6);
			LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val7);
		}
	}
	internal class MalfunctionsCompat
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(StartOfRoundPatches), "HandleLevelStart")]
		private static void PowerSurgeEvent()
		{
			if (((MalfunctionWithTrigger)State.MalfunctionPower).Triggered && (Object)(object)CTPatches.cterminal != (Object)null)
			{
				CTPatches.cterminal.shipPowerSurge = true;
				if (CTPatches.cterminal.cruiserTerminalInUse)
				{
					CTPatches.cterminal.QuitCruiserTerminal();
				}
				CTPatches.cterminal.isDestroyed = true;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(TimeOfDayPatches), "CheckMalfunctionDistortionTrigger")]
		private static void ElectroMagneticDistortionEvent()
		{
			if (((MalfunctionWithTrigger)State.MalfunctionDistortion).Triggered && (Object)(object)CTPatches.cterminal != (Object)null)
			{
				CTPatches.cterminal.shipPowerSurge = true;
				if (CTPatches.cterminal.cruiserTerminalInUse)
				{
					CTPatches.cterminal.QuitCruiserTerminal();
				}
				CTPatches.cterminal.isDestroyed = true;
			}
		}
	}
}
namespace CruiserTerminal.NetcodePatcher
{
	[AttributeUsage(AttributeTargets.Module)]
	internal class NetcodePatchedAssemblyAttribute : Attribute
	{
	}
}