Decompiled source of BuildInSeatruckPlus v1.0.1

plugins/BuildInSeatruckPlus/BuildInSeatruckPlus.dll

Decompiled a day ago
using System;
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.Logging;
using BuildInSeatruckPlus.Buildables;
using FMODUnity;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Nautilus.Assets;
using Nautilus.Assets.Gadgets;
using Nautilus.Assets.PrefabTemplates;
using Nautilus.Crafting;
using Nautilus.Handlers;
using Nautilus.Json;
using Nautilus.Options.Attributes;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("BuildInSeatruckPlus")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+341eb082facde1de1e99abb1ffd16118b3cf20b6")]
[assembly: AssemblyProduct("BuildInSeatruckPlus")]
[assembly: AssemblyTitle("BuildInSeatruckPlus")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 BuildInSeatruckPlus
{
	[Menu("Build In Seatruck Plus")]
	public class Config : ConfigFile
	{
		[Keybind("Playback hotkey (in Seatruck / base)")]
		public KeyCode Hotkey = (KeyCode)114;

		[Slider("Long-press seconds", 0.1f, 2f, DefaultValue = 0.5f, Step = 0.05f, Format = "{0:F2}")]
		public float LongPressSeconds = 0.5f;

		[Toggle("Cheap recipe (1 Titanium) - restart required")]
		public bool CheapRecipe;

		[Toggle("Unlock buildables at start - restart required")]
		public bool UnlockBuildables;

		[Toggle("New jukeboxes start in shuffle mode")]
		public bool DefaultShuffle = true;

		[Toggle("Show 'Now playing' notifications")]
		public bool ShowTrackName = true;
	}
	internal class HotkeyController : MonoBehaviour
	{
		private float _downTime = -1f;

		private bool _longFired;

		private void Update()
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			Config config = Plugin.Config;
			if (config == null || (Object)(object)Player.main == (Object)null)
			{
				return;
			}
			if (!PlayerInInterior())
			{
				_downTime = -1f;
				_longFired = false;
				return;
			}
			if (Input.GetKeyDown(config.Hotkey))
			{
				_downTime = Time.unscaledTime;
				_longFired = false;
			}
			if (_downTime >= 0f && !_longFired && Input.GetKey(config.Hotkey) && Time.unscaledTime - _downTime >= config.LongPressSeconds)
			{
				_longFired = true;
				TogglePlayStop();
			}
			if (Input.GetKeyUp(config.Hotkey))
			{
				if (_downTime >= 0f && !_longFired)
				{
					NextTrack();
				}
				_downTime = -1f;
				_longFired = false;
			}
		}

		private static bool PlayerInInterior()
		{
			if (!(Player.main.currentInterior is SeaTruckSegment))
			{
				return (Object)(object)Player.main.GetCurrentSub() != (Object)null;
			}
			return true;
		}

		private static JukeboxInstance ResolveInstance()
		{
			IInteriorSpace currentInterior = Player.main.currentInterior;
			ISpeakerHost host = Speaker.GetHost((MonoBehaviour)(object)((currentInterior is MonoBehaviour) ? currentInterior : null));
			if (host == null && (Object)(object)Player.main.GetCurrentSub() != (Object)null)
			{
				host = Speaker.GetHost((MonoBehaviour)(object)Player.main.GetCurrentSub());
			}
			foreach (JukeboxInstance item in JukeboxInstance.all)
			{
				if (!((Object)(object)item == (Object)null) && Speaker.IsSameHost(Speaker.GetHost((MonoBehaviour)(object)item), host))
				{
					return item;
				}
			}
			return Jukebox.instance;
		}

		private void TogglePlayStop()
		{
			JukeboxInstance val = ResolveInstance();
			if (!((Object)(object)val == (Object)null))
			{
				if (Jukebox.isStartingOrPlaying && (Object)(object)Jukebox.instance == (Object)(object)val)
				{
					Jukebox.Stop();
					return;
				}
				val.shuffle = Plugin.Config.DefaultShuffle;
				Jukebox.Play(val);
			}
		}

		private void NextTrack()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			JukeboxInstance val = ResolveInstance();
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			string next = Jukebox.GetNext(val, true);
			if (string.IsNullOrEmpty(next))
			{
				return;
			}
			val.file = next;
			Jukebox.Play(val);
			if (Plugin.Config.ShowTrackName)
			{
				string label = Jukebox.GetInfo(next).label;
				if (!string.IsNullOrEmpty(label))
				{
					ErrorMessage.AddMessage("Now playing: " + label);
				}
			}
		}
	}
	[BepInPlugin("com.tristyn.buildinseatruckplus", "Build In Seatruck Plus", "1.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public const string GUID = "com.tristyn.buildinseatruckplus";

		public const string NAME = "Build In Seatruck Plus";

		public const string VERSION = "1.0.1";

		public static ManualLogSource Log { get; private set; }

		public static Config Config { get; private set; }

		private void Awake()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			Log = ((BaseUnityPlugin)this).Logger;
			Config = OptionsPanelHandler.RegisterModOptions<Config>();
			MiniBuildables.Register();
			new Harmony("com.tristyn.buildinseatruckplus").PatchAll();
			Log.LogInfo((object)"Build In Seatruck Plus 1.0.1 loaded.");
			((Component)this).gameObject.AddComponent<HotkeyController>();
		}
	}
	internal static class SeaTruckSegmentHelper
	{
		public static bool isPlayerInSeaTruckSegment()
		{
			if ((Object)(object)Player.main != (Object)null)
			{
				return Player.main.currentInterior is SeaTruckSegment;
			}
			return false;
		}

		public static SeaTruckSegment getCurrentSeaTruckSegment()
		{
			if (!((Object)(object)Player.main != (Object)null))
			{
				return null;
			}
			IInteriorSpace currentInterior = Player.main.currentInterior;
			return (SeaTruckSegment)(object)((currentInterior is SeaTruckSegment) ? currentInterior : null);
		}

		public static SeaTruckSegment getParentSeaTruckSegment(GameObject gameObject)
		{
			return gameObject.GetComponentInParent<SeaTruckSegment>();
		}

		public static SubRoot getCurrentSeaTruckSegmentSubRoot()
		{
			SeaTruckSegment currentSeaTruckSegment = getCurrentSeaTruckSegment();
			if (!((Object)(object)currentSeaTruckSegment == (Object)null))
			{
				return ((Component)currentSeaTruckSegment).gameObject.GetComponent<SubRoot>();
			}
			return null;
		}
	}
}
namespace BuildInSeatruckPlus.Patches
{
	[HarmonyPatch(typeof(Builder), "CheckAsSubModule")]
	internal static class Builder_CheckAsSubModule_Patch
	{
		private static bool Prefix(out Collider hitCollider, ref bool __result)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			hitCollider = null;
			if ((Object)(object)SeaTruckSegmentHelper.getCurrentSeaTruckSegment() == (Object)null)
			{
				return true;
			}
			Builder.placementTarget = null;
			Transform aimTransform = Builder.GetAimTransform();
			RaycastHit val = default(RaycastHit);
			if (!Physics.Raycast(aimTransform.position, aimTransform.forward, ref val, Builder.placeMaxDistance, ((LayerMask)(ref Builder.placeLayerMask)).value, (QueryTriggerInteraction)1))
			{
				__result = false;
				return false;
			}
			if (!Constructable.CheckFlags(Builder.allowedInBase, Builder.allowedInSub, Builder.allowedOutside, Builder.allowedUnderwater, ((RaycastHit)(ref val)).point))
			{
				__result = false;
				return false;
			}
			hitCollider = ((RaycastHit)(ref val)).collider;
			Builder.placementTarget = ((Component)hitCollider).gameObject;
			Builder.SetPlaceOnSurface(val, ref Builder.placePosition, ref Builder.placeRotation);
			__result = true;
			return false;
		}
	}
	[HarmonyPatch(typeof(Builder), "TryPlace")]
	internal static class Builder_TryPlace_Patch
	{
		private static readonly int UseableLayer = LayerMask.NameToLayer("Useable");

		private static bool Prefix(ref bool __result)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			SeaTruckSegment currentSeaTruckSegment = SeaTruckSegmentHelper.getCurrentSeaTruckSegment();
			if ((Object)(object)currentSeaTruckSegment == (Object)null)
			{
				return true;
			}
			if ((Object)(object)Builder.prefab == (Object)null || !Builder.canPlace)
			{
				RuntimeManager.PlayOneShot("event:/bz/ui/item_error", default(Vector3));
				__result = false;
				return false;
			}
			RuntimeManager.PlayOneShot("event:/tools/builder/place", Builder.ghostModel.transform.position);
			GameObject obj = Object.Instantiate<GameObject>(Builder.prefab);
			obj.transform.parent = ((Component)currentSeaTruckSegment).transform;
			obj.transform.position = Builder.placePosition;
			obj.transform.rotation = Builder.placeRotation;
			Constructable componentInParent = obj.GetComponentInParent<Constructable>();
			componentInParent.SetState(false, true);
			if ((Object)(object)Builder.ghostModel != (Object)null)
			{
				Object.Destroy((Object)(object)Builder.ghostModel);
			}
			componentInParent.SetIsInside(true);
			SkyEnvironmentChanged.Send(obj, (Component)(object)currentSeaTruckSegment);
			NeutralizeCollidersForDocking(obj);
			Builder.ghostModel = null;
			Builder.prefab = null;
			Builder.canPlace = false;
			__result = true;
			return false;
		}

		private static void NeutralizeCollidersForDocking(GameObject go)
		{
			Collider[] componentsInChildren = go.GetComponentsInChildren<Collider>(true);
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				((Component)componentsInChildren[i]).gameObject.layer = UseableLayer;
			}
		}
	}
	[HarmonyPatch(typeof(Builder), "CheckTag")]
	internal static class Builder_CheckTag_Patch
	{
		private static bool Prefix(Collider c, ref bool __result)
		{
			if ((Object)(object)c != (Object)null && (Object)(object)((Component)c).GetComponentInParent<MoonpoolExpansionManager>() != (Object)null)
			{
				__result = true;
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Constructable), "CheckFlags")]
	internal static class Constructable_CheckFlags_Patch
	{
		private static bool Prefix(ref bool __result)
		{
			if ((Object)(object)SeaTruckSegmentHelper.getCurrentSeaTruckSegment() == (Object)null)
			{
				return true;
			}
			__result = true;
			return false;
		}
	}
	[HarmonyPatch(typeof(PowerConsumer), "IsPowered")]
	internal static class PowerConsumer_IsPowered_Patch
	{
		private static bool Prefix(PowerConsumer __instance, ref bool __result)
		{
			SeaTruckSegment parentSeaTruckSegment = SeaTruckSegmentHelper.getParentSeaTruckSegment(((Component)__instance).gameObject);
			if ((Object)(object)parentSeaTruckSegment == (Object)null)
			{
				return true;
			}
			__result = ((IInteriorSpace)parentSeaTruckSegment).CanBreathe();
			return false;
		}
	}
	[HarmonyPatch(typeof(SeaTruckSegment), "CanEnter")]
	internal static class SeaTruckSegment_CanEnter_Patch
	{
		private static bool Prefix(ref bool __result)
		{
			__result = true;
			return false;
		}
	}
}
namespace BuildInSeatruckPlus.Buildables
{
	internal static class MiniBuildables
	{
		public static TechType MiniJukebox { get; private set; }

		public static TechType MiniSpeaker { get; private set; }

		public static void Register()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			MiniJukebox = Make("MiniJukebox", "Mini Jukebox", "A compact jukebox that fits inside a Seatruck.", (TechType)1564, 0.25f);
			MiniSpeaker = Make("MiniSpeaker", "Mini Speaker", "A compact speaker for tight interiors.", (TechType)1566, 0.5f);
		}

		private static TechType Make(string classId, string friendly, string description, TechType cloneOf, float scale)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Expected O, but got Unknown
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			PrefabInfo val = PrefabInfo.WithTechType(classId, friendly, description, "English", false, (Assembly)null);
			PrefabInfo val2 = ((PrefabInfo)(ref val)).WithIcon(SpriteManager.Get(cloneOf));
			CustomPrefab val3 = new CustomPrefab(val2);
			CloneTemplate val4 = new CloneTemplate(val2, cloneOf);
			val4.ModifyPrefab = (Action<GameObject>)Delegate.Combine(val4.ModifyPrefab, (Action<GameObject>)delegate(GameObject go)
			{
				//IL_0007: Unknown result type (might be due to invalid IL or missing references)
				//IL_0012: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				Transform transform = go.transform;
				transform.localScale *= scale;
				ConstructableBounds[] componentsInChildren = go.GetComponentsInChildren<ConstructableBounds>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					componentsInChildren[i].bounds.extents = Vector3.one * 0.02f;
				}
				Plugin.Log.LogInfo((object)$"{classId}: scaled to {scale} with liberal bounds.");
			});
			val3.SetGameObject((PrefabTemplate)(object)val4);
			RecipeData val5 = (RecipeData)((!Plugin.Config.CheapRecipe) ? (((object)CraftDataHandler.GetRecipeData(cloneOf)) ?? ((object)new RecipeData((Ingredient[])(object)new Ingredient[1]
			{
				new Ingredient((TechType)16, 1)
			}))) : ((object)new RecipeData((Ingredient[])(object)new Ingredient[1]
			{
				new Ingredient((TechType)16, 1)
			})));
			GadgetExtensions.SetRecipe((ICustomPrefab)(object)val3, val5);
			TechGroup val6 = default(TechGroup);
			TechCategory val7 = default(TechCategory);
			int num = default(int);
			if (CraftData.GetBuilderIndex(cloneOf, ref val6, ref val7, ref num))
			{
				GadgetExtensions.SetPdaGroupCategory((ICustomPrefab)(object)val3, val6, val7);
			}
			if (!Plugin.Config.UnlockBuildables)
			{
				GadgetExtensions.SetUnlock((ICustomPrefab)(object)val3, (TechType)1564, 1);
			}
			val3.Register();
			return ((PrefabInfo)(ref val2)).TechType;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}