Decompiled source of Truck Editor v1.0.2

TruckEditor.dll

Decompiled 13 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using MenuLib;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.UI;

[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("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TruckEditor")]
[assembly: AssemblyTitle("TruckEditor")]
[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.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;
		}
	}
	[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;
		}
	}
}
[BepInPlugin("Omniscye.TruckEditor", "Truck Editor", "1.0.0")]
public sealed class TruckEditorPlugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(MenuPageMain), "ButtonEventHostGame")]
	private static class MenuPageMainHostGamePatch
	{
		private static bool Prefix()
		{
			TruckEditorPlugin instance = Instance;
			if ((Object)(object)instance == (Object)null || !instance.ShouldHijackHostGameButton())
			{
				return true;
			}
			instance.hijackHostGameUntilTime = 0f;
			instance.OpenTruckEditorFromMenu();
			return false;
		}
	}

	[HarmonyPatch(typeof(MenuButton), "OnSelect")]
	private static class MenuButtonOnSelectPatch
	{
		private static bool Prefix(MenuButton __instance)
		{
			TruckEditorPlugin instance = Instance;
			if ((Object)(object)instance == (Object)null || !instance.IsInjectedTruckEditorButton(__instance))
			{
				return true;
			}
			instance.hijackHostGameUntilTime = Time.unscaledTime + 0.5f;
			instance.OpenTruckEditorFromMenu();
			return false;
		}
	}

	[HarmonyPatch(typeof(ChargingStation), "Start")]
	private static class ChargingStationStartPatch
	{
		private static bool Prefix(ChargingStation __instance)
		{
			TruckEditorPlugin instance = Instance;
			if ((Object)(object)instance == (Object)null || !instance.ShouldForceEditorChargingStation())
			{
				return true;
			}
			instance.PrepareEditorChargingStation(__instance);
			return false;
		}
	}

	private sealed class CatalogEntry
	{
		public string ResourcePath = string.Empty;

		public string DisplayName = string.Empty;

		public string Category = string.Empty;

		public string Section = string.Empty;
	}

	[Serializable]
	private sealed class SerializableVector3
	{
		public float X;

		public float Y;

		public float Z;

		public SerializableVector3()
		{
		}

		public SerializableVector3(Vector3 value)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			X = value.x;
			Y = value.y;
			Z = value.z;
		}

		public Vector3 ToVector3()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			return new Vector3(X, Y, Z);
		}
	}

	[Serializable]
	private sealed class TruckObjectRecord
	{
		public string Id = string.Empty;

		public string ResourcePath = string.Empty;

		public string DisplayName = string.Empty;

		public string Category = string.Empty;

		public string Section = string.Empty;

		public SerializableVector3 Position = new SerializableVector3();

		public SerializableVector3 Rotation = new SerializableVector3();
	}

	[Serializable]
	private sealed class TruckLayoutData
	{
		public string Name = string.Empty;

		public string CreatedUtc = string.Empty;

		public string LastEditedUtc = string.Empty;

		public List<TruckObjectRecord> Objects = new List<TruckObjectRecord>();
	}

	private sealed class PlacedMarker : MonoBehaviour
	{
		public string Id = string.Empty;
	}

	private readonly struct TruckAnchorInfo
	{
		public readonly RoomVolume Room;

		public readonly Vector3 WorldPosition;

		public readonly Quaternion WorldRotation;

		public readonly Bounds LocalBounds;

		public TruckAnchorInfo(RoomVolume room, Vector3 worldPosition, Quaternion worldRotation, Bounds localBounds)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			Room = room;
			WorldPosition = worldPosition;
			WorldRotation = worldRotation;
			LocalBounds = localBounds;
		}
	}

	private readonly struct PlacementState
	{
		public readonly Vector3 Position;

		public readonly Quaternion Rotation;

		public PlacementState(Vector3 position, Quaternion rotation)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			Position = position;
			Rotation = rotation;
		}
	}

	public const string PluginGuid = "Omniscye.TruckEditor";

	public const string PluginName = "Truck Editor";

	public const string PluginVersion = "1.0.0";

	private const string RoomPropertyTruckLayoutName = "OMNI_TRUCK_LAYOUT_NAME";

	private const string RoomPropertyTruckLayoutPayload = "OMNI_TRUCK_LAYOUT_DATA";

	private const float UiCaptureRefresh = 0.2f;

	private const float PlacementRotationDegreesPerSecond = 90f;

	private readonly JsonSerializerSettings jsonSettings = new JsonSerializerSettings
	{
		Formatting = (Formatting)1,
		NullValueHandling = (NullValueHandling)1
	};

	private ConfigEntry<string> layoutDirectoryConfig = null;

	private ConfigEntry<string> selectedLayoutConfig = null;

	private ConfigEntry<bool> enableHostTruckDecorConfig = null;

	private ConfigEntry<KeyboardShortcut> openEditorHotkeyConfig = null;

	private ConfigEntry<KeyCode> toggleForgeModeKeyConfig = null;

	private ConfigEntry<KeyCode> toggleEditorUiKeyConfig = null;

	private ConfigEntry<KeyCode> exitToMenuKeyConfig = null;

	private ConfigEntry<KeyCode> cursorModifierKeyConfig = null;

	private ConfigEntry<KeyCode> fastMoveModifierKeyConfig = null;

	private ConfigEntry<KeyCode> moveForwardKeyConfig = null;

	private ConfigEntry<KeyCode> moveBackwardKeyConfig = null;

	private ConfigEntry<KeyCode> moveLeftKeyConfig = null;

	private ConfigEntry<KeyCode> moveRightKeyConfig = null;

	private ConfigEntry<KeyCode> moveUpKeyConfig = null;

	private ConfigEntry<KeyCode> moveDownKeyConfig = null;

	private ConfigEntry<KeyCode> placementRotateXKeyConfig = null;

	private ConfigEntry<KeyCode> placementRotateYKeyConfig = null;

	private ConfigEntry<KeyCode> placementRotateZKeyConfig = null;

	private ConfigEntry<KeyCode> placementOffsetDownKeyConfig = null;

	private ConfigEntry<KeyCode> placementOffsetUpKeyConfig = null;

	private ConfigEntry<KeyCode> moveSelectedModifierKeyConfig = null;

	private ConfigEntry<KeyCode> rotateSelectedKeyConfig = null;

	private ConfigEntry<KeyCode> duplicateSelectedKeyConfig = null;

	private ConfigEntry<KeyCode> deleteSelectedKeyConfig = null;

	private ConfigEntry<KeyCode> selectedHeightUpKeyConfig = null;

	private ConfigEntry<KeyCode> selectedHeightDownKeyConfig = null;

	private ConfigEntry<bool> showMainMenuFallbackButtonConfig = null;

	private ConfigEntry<float> moveSpeedConfig = null;

	private ConfigEntry<float> fastMoveSpeedConfig = null;

	private static TruckEditorPlugin? Instance;

	private Harmony? harmony;

	private Texture2D? pixel;

	private Texture2D? editorCursorTexture;

	private GUIStyle? titleStyle;

	private GUIStyle? subtitleStyle;

	private GUIStyle? bodyStyle;

	private GUIStyle? smallStyle;

	private GUIStyle? buttonStyle;

	private GUIStyle? selectedButtonStyle;

	private GUIStyle? textFieldStyle;

	private GUIStyle? listButtonStyle;

	private GUIStyle? selectedListButtonStyle;

	private GUIStyle? overlayStyle;

	private bool menuRegistered;

	private MenuButton? injectedMainMenuButton;

	private float hijackHostGameUntilTime;

	private bool pendingTruckEditorLaunch;

	private bool truckSessionActive;

	private bool forgeModeActive;

	private bool editorCursorActive;

	private bool editorUiVisible = true;

	private string editorLayoutName = "Untitled_Truck";

	private string editorSearch = string.Empty;

	private string selectedCategory = "All";

	private string selectedObjectId = string.Empty;

	private string selectedPlacedObjectId = string.Empty;

	private string loadedLayoutFileName = string.Empty;

	private string editorCreatedUtc = string.Empty;

	private string statusText = string.Empty;

	private float statusTimer;

	private float editorYaw;

	private float editorPitch;

	private Vector3 placementRotationEuler;

	private float previewDistance = 3.5f;

	private float placementHeightOffset;

	private Vector2 categoryScroll;

	private Vector2 prefabScroll;

	private Vector2 filesScroll;

	private Transform? editorCameraRoot;

	private Transform? editorCameraRestoreParent;

	private Vector3 editorCameraRestoreLocalPosition;

	private Quaternion editorCameraRestoreLocalRotation;

	private GameObject? editorPreviewInstance;

	private string previewResourcePath = string.Empty;

	private RoomVolume? sessionTruckRoom;

	private Transform? sessionTruckAnchorRoot;

	private readonly List<CatalogEntry> catalogEntries = new List<CatalogEntry>();

	private readonly List<string> categoryNames = new List<string>();

	private readonly Dictionary<string, TruckObjectRecord> editorObjects = new Dictionary<string, TruckObjectRecord>(StringComparer.OrdinalIgnoreCase);

	private readonly Dictionary<string, GameObject> editorInstances = new Dictionary<string, GameObject>(StringComparer.OrdinalIgnoreCase);

	private LevelGenerator? trackedLevelGenerator;

	private string runtimePublishedFingerprint = string.Empty;

	private string runtimeAppliedFingerprint = string.Empty;

	private string runtimeAppliedLayoutName = string.Empty;

	private GameObject? runtimeDecorRoot;

	private ManualLogSource Log => ((BaseUnityPlugin)this).Logger;

	private void Awake()
	{
		Instance = this;
		BindConfig();
		EnsurePluginPersistence();
		EnsureHarmonyPatched();
		SetStatus("Truck Editor booted.", 2.5f);
	}

	private void Start()
	{
		BuildCatalogIfNeeded(force: true);
	}

	private void OnDestroy()
	{
		if (Instance == this)
		{
			Instance = null;
		}
		if (harmony != null)
		{
			harmony.UnpatchSelf();
			harmony = null;
		}
		EndTruckEditorSession(loadMainMenu: false);
		ResetRuntimeTracking();
	}

	private void Update()
	{
		TickStatus();
		EnsureMenuRegistered();
		HandleMainMenuOpenHotkey();
		BuildCatalogIfNeeded(force: false);
		UpdateTruckEditorSessionLifecycle();
		UpdateRuntimeLifecycle();
	}

	private void OnGUI()
	{
		EnsureStyles();
		if (forgeModeActive && editorUiVisible)
		{
			DrawEditorGui();
		}
		if (forgeModeActive && !editorUiVisible)
		{
			DrawHiddenEditorHint();
		}
		if (truckSessionActive && !forgeModeActive)
		{
			DrawTruckSessionHint();
		}
		DrawMainMenuFallbackButton();
		DrawStatusOverlay();
	}

	private void EnsureHarmonyPatched()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		if (harmony == null)
		{
			harmony = new Harmony("Omniscye.TruckEditor");
			harmony.PatchAll(typeof(TruckEditorPlugin).Assembly);
		}
	}

	private void BindConfig()
	{
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		string text = Path.Combine(Paths.PluginPath, "Omniscye-TruckEditor", "Layouts");
		layoutDirectoryConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Files", "TruckLayoutsDirectory", text, "Folder for saved truck layout files.");
		selectedLayoutConfig = ((BaseUnityPlugin)this).Config.Bind<string>("Runtime", "SelectedTruckLayout", "Untitled_Truck", "Selected truck layout file name.");
		enableHostTruckDecorConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("Runtime", "EnableHostTruckDecor", true, "Host shares the selected truck decoration layout during real runs.");
		openEditorHotkeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Hotkeys", "OpenTruckEditorFromMainMenu", new KeyboardShortcut((KeyCode)116, Array.Empty<KeyCode>()), "Fallback hotkey for opening Truck Editor from the main menu.");
		toggleForgeModeKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ToggleForgeModeKey", (KeyCode)92, "Switches between normal truck view and forge mode.");
		toggleEditorUiKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ToggleEditorUiKey", (KeyCode)117, "Shows or hides the Truck Editor UI while forging.");
		exitToMenuKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ExitToMainMenuKey", (KeyCode)27, "Leaves Truck Editor and returns to the main menu.");
		cursorModifierKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "EditorCursorModifierKey", (KeyCode)308, "Hold this key to unlock the cursor and interact with the Truck Editor UI.");
		fastMoveModifierKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "FastMoveModifierKey", (KeyCode)304, "Hold this key for faster forge camera movement.");
		moveForwardKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "MoveForwardKey", (KeyCode)119, "Moves the forge camera forward.");
		moveBackwardKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "MoveBackwardKey", (KeyCode)115, "Moves the forge camera backward.");
		moveLeftKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "MoveLeftKey", (KeyCode)97, "Moves the forge camera left.");
		moveRightKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "MoveRightKey", (KeyCode)100, "Moves the forge camera right.");
		moveUpKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "MoveUpKey", (KeyCode)101, "Moves the forge camera upward.");
		moveDownKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "MoveDownKey", (KeyCode)113, "Moves the forge camera downward.");
		placementRotateXKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "RotatePlacementXKey", (KeyCode)114, "Smoothly rotates the current preview object around the X axis while held.");
		placementRotateYKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "RotatePlacementYKey", (KeyCode)116, "Smoothly rotates the current preview object around the Y axis while held.");
		placementRotateZKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "RotatePlacementZKey", (KeyCode)121, "Smoothly rotates the current preview object around the Z axis while held.");
		placementOffsetDownKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "PlacementOffsetDownKey", (KeyCode)91, "Lowers the current preview object.");
		placementOffsetUpKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "PlacementOffsetUpKey", (KeyCode)93, "Raises the current preview object.");
		moveSelectedModifierKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "MoveSelectedModifierKey", (KeyCode)306, "Hold this key and left click to move the selected placed object.");
		rotateSelectedKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "RotateSelectedKey", (KeyCode)103, "Smoothly rotates the selected placed object around the Y axis while held.");
		duplicateSelectedKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "DuplicateSelectedKey", (KeyCode)99, "Duplicates the selected placed object.");
		deleteSelectedKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "DeleteSelectedKey", (KeyCode)127, "Deletes the selected placed object.");
		selectedHeightUpKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "SelectedHeightUpKey", (KeyCode)280, "Moves the selected placed object upward.");
		selectedHeightDownKeyConfig = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "SelectedHeightDownKey", (KeyCode)281, "Moves the selected placed object downward.");
		showMainMenuFallbackButtonConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("UI", "ShowMainMenuFallbackButton", false, "Shows a backup main menu button drawn by the plugin itself.");
		moveSpeedConfig = ((BaseUnityPlugin)this).Config.Bind<float>("Editor", "MoveSpeed", 7f, "Base fly speed while forging inside the truck.");
		fastMoveSpeedConfig = ((BaseUnityPlugin)this).Config.Bind<float>("Editor", "FastMoveSpeed", 18f, "Fast fly speed while forging inside the truck.");
	}

	private bool IsConfiguredKeyDown(ConfigEntry<KeyCode> keyConfig)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Invalid comparison between Unknown and I4
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Invalid comparison between Unknown and I4
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Expected I4, but got Unknown
		KeyCode value = keyConfig.Value;
		if (Input.GetKeyDown(value))
		{
			return true;
		}
		if (1 == 0)
		{
		}
		bool result = (((int)value == 8) ? Input.GetKeyDown((KeyCode)127) : (((int)value == 127) ? Input.GetKeyDown((KeyCode)8) : ((value - 303) switch
		{
			5 => Input.GetKeyDown((KeyCode)307), 
			4 => Input.GetKeyDown((KeyCode)308), 
			1 => Input.GetKeyDown((KeyCode)303), 
			0 => Input.GetKeyDown((KeyCode)304), 
			3 => Input.GetKeyDown((KeyCode)305), 
			2 => Input.GetKeyDown((KeyCode)306), 
			_ => false, 
		})));
		if (1 == 0)
		{
		}
		return result;
	}

	private bool IsConfiguredKeyHeld(ConfigEntry<KeyCode> keyConfig)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: 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_0042: Expected I4, but got Unknown
		KeyCode value = keyConfig.Value;
		if (Input.GetKey(value))
		{
			return true;
		}
		if (1 == 0)
		{
		}
		bool result = (value - 303) switch
		{
			5 => Input.GetKey((KeyCode)307), 
			4 => Input.GetKey((KeyCode)308), 
			1 => Input.GetKey((KeyCode)303), 
			0 => Input.GetKey((KeyCode)304), 
			3 => Input.GetKey((KeyCode)305), 
			2 => Input.GetKey((KeyCode)306), 
			_ => false, 
		};
		if (1 == 0)
		{
		}
		return result;
	}

	private string KeyLabel(ConfigEntry<KeyCode> keyConfig)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		KeyCode value = keyConfig.Value;
		return ((object)(KeyCode)(ref value)).ToString();
	}

	private void EnsurePluginPersistence()
	{
		((Object)((Component)this).gameObject).name = "Omniscye.TruckEditor";
		((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
		Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
	}

	private void TickStatus()
	{
		if (!(statusTimer <= 0f))
		{
			statusTimer -= Time.deltaTime;
			if (statusTimer <= 0f)
			{
				statusText = string.Empty;
				statusTimer = 0f;
			}
		}
	}

	private void EnsureMenuRegistered()
	{
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Expected O, but got Unknown
		if (menuRegistered || (Object)(object)RunManager.instance == (Object)null || !SemiFunc.MenuLevel())
		{
			return;
		}
		try
		{
			MenuAPI.AddElementToMainMenu((BuilderDelegate)delegate(Transform parent)
			{
				TryInjectMainMenuButton(parent);
			});
			menuRegistered = true;
			Log.LogInfo((object)"[TruckEditor] MenuLib button registered.");
		}
		catch (Exception ex)
		{
			Log.LogWarning((object)("[TruckEditor] MenuLib registration failed: " + ex.Message));
		}
	}

	private void TryInjectMainMenuButton(Transform parent)
	{
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Expected O, but got Unknown
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Expected O, but got Unknown
		//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0208: Unknown result type (might be due to invalid IL or missing references)
		//IL_021f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0236: Unknown result type (might be due to invalid IL or missing references)
		//IL_024d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0264: Unknown result type (might be due to invalid IL or missing references)
		//IL_026f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0274: Unknown result type (might be due to invalid IL or missing references)
		//IL_0285: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)parent == (Object)null || (Object)(object)injectedMainMenuButton != (Object)null)
		{
			return;
		}
		MenuButton val = FindMainMenuButton(parent, "PRIVATE GAME");
		if ((Object)(object)val == (Object)null || (Object)(object)val.button == (Object)null || (Object)(object)val.buttonText == (Object)null)
		{
			Log.LogWarning((object)"[TruckEditor] Could not find the PRIVATE GAME button for MenuLib placement.");
			return;
		}
		MenuButton val2 = Object.Instantiate<MenuButton>(val, ((Component)val).transform.parent);
		((Object)((Component)val2).gameObject).name = "Menu Button - Truck Editor";
		val2.button.onClick = new ButtonClickedEvent();
		((UnityEvent)val2.button.onClick).AddListener(new UnityAction(OpenTruckEditorFromMenu));
		val2.buttonTextString = "TRUCK EDITOR";
		val2.originalText = "TRUCK EDITOR";
		((TMP_Text)val2.buttonText).text = "TRUCK EDITOR";
		val2.disabled = false;
		val2.doButtonEffect = val.doButtonEffect;
		val2.hasHold = false;
		if ((Object)(object)val2.rectTransform == (Object)null)
		{
			val2.rectTransform = ((Component)val2).GetComponent<RectTransform>();
		}
		if ((Object)(object)val.rectTransform == (Object)null)
		{
			val.rectTransform = ((Component)val).GetComponent<RectTransform>();
		}
		float num = 72f;
		MenuButton val3 = FindMainMenuButton(parent, "PUBLIC GAME");
		if ((Object)(object)val.rectTransform != (Object)null && (Object)(object)val3 != (Object)null)
		{
			if ((Object)(object)val3.rectTransform == (Object)null)
			{
				val3.rectTransform = ((Component)val3).GetComponent<RectTransform>();
			}
			if ((Object)(object)val3.rectTransform != (Object)null)
			{
				num = Mathf.Abs(val.rectTransform.anchoredPosition.y - val3.rectTransform.anchoredPosition.y);
			}
		}
		if ((Object)(object)val2.rectTransform != (Object)null && (Object)(object)val.rectTransform != (Object)null)
		{
			val2.rectTransform.anchorMin = val.rectTransform.anchorMin;
			val2.rectTransform.anchorMax = val.rectTransform.anchorMax;
			val2.rectTransform.pivot = val.rectTransform.pivot;
			val2.rectTransform.sizeDelta = val.rectTransform.sizeDelta;
			val2.rectTransform.anchoredPosition = val.rectTransform.anchoredPosition + new Vector2(0f, num);
			((Transform)val2.rectTransform).localScale = Vector3.one;
		}
		((Component)val2).transform.SetSiblingIndex(((Component)val).transform.GetSiblingIndex());
		if ((Object)(object)val2.menuSelectableElement != (Object)null)
		{
			val2.menuSelectableElement.menuID = "truck_editor_" + Guid.NewGuid().ToString("N");
		}
		val2.buttonPitch = (((Object)(object)val2.rectTransform != (Object)null) ? SemiFunc.MenuGetPitchFromYPos(val2.rectTransform) : val.buttonPitch);
		injectedMainMenuButton = val2;
	}

	private MenuButton? FindMainMenuButton(Transform parent, string label)
	{
		string label2 = label;
		if ((Object)(object)parent == (Object)null)
		{
			return null;
		}
		return ((IEnumerable<MenuButton>)((Component)parent).GetComponentsInChildren<MenuButton>(true)).FirstOrDefault((Func<MenuButton, bool>)delegate(MenuButton button)
		{
			string mainMenuButtonLabel = GetMainMenuButtonLabel(button);
			return !string.IsNullOrWhiteSpace(mainMenuButtonLabel) && mainMenuButtonLabel.IndexOf(label2, StringComparison.OrdinalIgnoreCase) >= 0;
		});
	}

	private string GetMainMenuButtonLabel(MenuButton? button)
	{
		if ((Object)(object)button == (Object)null)
		{
			return string.Empty;
		}
		if ((Object)(object)button.buttonText != (Object)null && !string.IsNullOrWhiteSpace(((TMP_Text)button.buttonText).text))
		{
			return ((TMP_Text)button.buttonText).text.Trim();
		}
		return button.buttonTextString?.Trim() ?? string.Empty;
	}

	private void OpenTruckEditorFromMenu()
	{
		if (GameManager.Multiplayer())
		{
			SetStatus("Truck Editor launches from the singleplayer main menu.");
			return;
		}
		pendingTruckEditorLaunch = true;
		SetStatus("Loading the truck bay...");
		if (!((Object)(object)RunManager.instance == (Object)null) && !((Object)(object)RunManager.instance.levelCurrent == (Object)(object)RunManager.instance.levelLobby))
		{
			RunManager.instance.ChangeLevel(false, false, (ChangeLevelType)0);
		}
	}

	private void HandleMainMenuOpenHotkey()
	{
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		if (!truckSessionActive && !forgeModeActive && !pendingTruckEditorLaunch && !((Object)(object)RunManager.instance == (Object)null) && !((Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelMainMenu))
		{
			KeyboardShortcut value = openEditorHotkeyConfig.Value;
			if (((KeyboardShortcut)(ref value)).IsDown())
			{
				OpenTruckEditorFromMenu();
			}
		}
	}

	private void DrawMainMenuFallbackButton()
	{
		//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_013b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Unknown result type (might be due to invalid IL or missing references)
		if (showMainMenuFallbackButtonConfig.Value && !truckSessionActive && !((Object)(object)RunManager.instance == (Object)null) && selectedButtonStyle != null && smallStyle != null && !((Object)(object)injectedMainMenuButton != (Object)null) && !((Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelMainMenu))
		{
			Rect val = default(Rect);
			if (!TryGetMainMenuButtonScreenRect("PRIVATE GAME", out var rect))
			{
				((Rect)(ref val))..ctor(72f, 280f, 300f, 44f);
			}
			else
			{
				((Rect)(ref val))..ctor(((Rect)(ref rect)).x, Mathf.Max(32f, ((Rect)(ref rect)).y - ((Rect)(ref rect)).height - 10f), Mathf.Max(((Rect)(ref rect)).width, 300f), ((Rect)(ref rect)).height);
			}
			if (GUI.Button(val, "TRUCK EDITOR", selectedButtonStyle))
			{
				OpenTruckEditorFromMenu();
			}
			Rect val2 = new Rect(((Rect)(ref val)).x, ((Rect)(ref val)).y - 22f, ((Rect)(ref val)).width, 20f);
			KeyboardShortcut value = openEditorHotkeyConfig.Value;
			GUI.Label(val2, "Fallback hotkey: " + ((object)(KeyboardShortcut)(ref value)).ToString(), smallStyle);
		}
	}

	private bool TryGetMainMenuButtonScreenRect(string label, out Rect rect)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cc: 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_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
		rect = default(Rect);
		if ((Object)(object)MenuPageMain.instance == (Object)null)
		{
			return false;
		}
		MenuButton val = FindMainMenuButton(((Component)MenuPageMain.instance).transform, label);
		if ((Object)(object)val == (Object)null)
		{
			return false;
		}
		RectTransform val2 = (((Object)(object)val.rectTransform != (Object)null) ? val.rectTransform : ((Component)val).GetComponent<RectTransform>());
		if ((Object)(object)val2 == (Object)null)
		{
			return false;
		}
		Vector3[] array = (Vector3[])(object)new Vector3[4];
		val2.GetWorldCorners(array);
		Vector3 val3 = Vector2.op_Implicit(RectTransformUtility.WorldToScreenPoint((Camera)null, array[0]));
		Vector3 val4 = Vector2.op_Implicit(RectTransformUtility.WorldToScreenPoint((Camera)null, array[2]));
		rect = new Rect(val3.x, (float)Screen.height - val4.y, val4.x - val3.x, val4.y - val3.y);
		return true;
	}

	private bool TryGetInjectedMainMenuButtonScreenRect(out Rect rect)
	{
		//IL_0002: 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_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: 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_008f: 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_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
		rect = default(Rect);
		if ((Object)(object)injectedMainMenuButton == (Object)null)
		{
			return false;
		}
		RectTransform val = (((Object)(object)injectedMainMenuButton.rectTransform != (Object)null) ? injectedMainMenuButton.rectTransform : ((Component)injectedMainMenuButton).GetComponent<RectTransform>());
		if ((Object)(object)val == (Object)null)
		{
			return false;
		}
		Vector3[] array = (Vector3[])(object)new Vector3[4];
		val.GetWorldCorners(array);
		Vector3 val2 = Vector2.op_Implicit(RectTransformUtility.WorldToScreenPoint((Camera)null, array[0]));
		Vector3 val3 = Vector2.op_Implicit(RectTransformUtility.WorldToScreenPoint((Camera)null, array[2]));
		rect = new Rect(val2.x, (float)Screen.height - val3.y, val3.x - val2.x, val3.y - val2.y);
		return ((Rect)(ref rect)).width > 1f && ((Rect)(ref rect)).height > 1f;
	}

	private bool ShouldHijackHostGameButton()
	{
		if ((Object)(object)RunManager.instance == (Object)null || (Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelMainMenu)
		{
			return false;
		}
		if (Time.unscaledTime <= hijackHostGameUntilTime)
		{
			return true;
		}
		if ((Object)(object)injectedMainMenuButton == (Object)null)
		{
			return false;
		}
		return injectedMainMenuButton.hovering || injectedMainMenuButton.clicked || injectedMainMenuButton.hoverTimer > 0f || injectedMainMenuButton.clickTimer > 0f;
	}

	private bool IsInjectedTruckEditorButton(MenuButton? button)
	{
		if ((Object)(object)button == (Object)null || (Object)(object)RunManager.instance == (Object)null || (Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelMainMenu)
		{
			return false;
		}
		if (button == injectedMainMenuButton)
		{
			return true;
		}
		if ((Object)(object)injectedMainMenuButton == (Object)null)
		{
			return false;
		}
		string mainMenuButtonLabel = GetMainMenuButtonLabel(button);
		return !string.IsNullOrWhiteSpace(mainMenuButtonLabel) && string.Equals(mainMenuButtonLabel, "TRUCK EDITOR", StringComparison.OrdinalIgnoreCase) && (Object)(object)((Component)button).transform.parent == (Object)(object)((Component)injectedMainMenuButton).transform.parent;
	}

	private void DrawTruckSessionHint()
	{
		//IL_004b: 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)
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		if (smallStyle != null && overlayStyle != null)
		{
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(24f, 90f, Mathf.Min(760f, (float)Screen.width - 48f), 76f);
			GUI.Box(val, GUIContent.none, overlayStyle);
			GUI.Label(new Rect(((Rect)(ref val)).x + 12f, ((Rect)(ref val)).y + 10f, ((Rect)(ref val)).width - 24f, 18f), "Truck Editor live", subtitleStyle);
			GUI.Label(new Rect(((Rect)(ref val)).x + 12f, ((Rect)(ref val)).y + 30f, ((Rect)(ref val)).width - 24f, 34f), "Walk around normally, then press " + KeyLabel(toggleForgeModeKeyConfig) + " to enter forge mode. Press " + KeyLabel(exitToMenuKeyConfig) + " to return to the menu.", smallStyle);
		}
	}

	private void DrawStatusOverlay()
	{
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		if (!string.IsNullOrWhiteSpace(statusText) && overlayStyle != null && bodyStyle != null)
		{
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(20f, (float)Screen.height - 64f, Mathf.Min((float)Screen.width - 40f, 760f), 40f);
			GUI.Box(val, GUIContent.none, overlayStyle);
			GUI.Label(new Rect(((Rect)(ref val)).x + 12f, ((Rect)(ref val)).y + 8f, ((Rect)(ref val)).width - 24f, ((Rect)(ref val)).height - 12f), statusText, bodyStyle);
		}
	}

	private void EnsureStyles()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Expected O, but got Unknown
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: Expected O, but got Unknown
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Expected O, but got Unknown
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_017d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0187: Expected O, but got Unknown
		//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Expected O, but got Unknown
		//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0226: Unknown result type (might be due to invalid IL or missing references)
		//IL_0251: Unknown result type (might be due to invalid IL or missing references)
		//IL_0281: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d7: Expected O, but got Unknown
		//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ec: Expected O, but got Unknown
		//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fe: Expected O, but got Unknown
		//IL_031e: Unknown result type (might be due to invalid IL or missing references)
		//IL_034e: Unknown result type (might be due to invalid IL or missing references)
		//IL_037e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0399: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a3: Expected O, but got Unknown
		//IL_03d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_03fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0425: Unknown result type (might be due to invalid IL or missing references)
		//IL_0455: Unknown result type (might be due to invalid IL or missing references)
		//IL_046c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0476: Expected O, but got Unknown
		//IL_04a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_04d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0503: Unknown result type (might be due to invalid IL or missing references)
		//IL_051a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0524: Expected O, but got Unknown
		//IL_0544: Unknown result type (might be due to invalid IL or missing references)
		//IL_0574: Unknown result type (might be due to invalid IL or missing references)
		//IL_05a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_05bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_05c9: Expected O, but got Unknown
		//IL_05e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0603: Unknown result type (might be due to invalid IL or missing references)
		//IL_060d: Expected O, but got Unknown
		//IL_061c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0626: Expected O, but got Unknown
		if ((Object)(object)pixel == (Object)null)
		{
			pixel = new Texture2D(1, 1, (TextureFormat)4, false);
			pixel.SetPixel(0, 0, new Color(0.07f, 0.06f, 0.07f, 0.96f));
			pixel.Apply();
		}
		if (titleStyle == null)
		{
			titleStyle = new GUIStyle(GUI.skin.label);
			titleStyle.fontSize = 28;
			titleStyle.fontStyle = (FontStyle)1;
			titleStyle.normal.textColor = new Color(0.95f, 0.95f, 0.97f, 1f);
			subtitleStyle = new GUIStyle(GUI.skin.label);
			subtitleStyle.fontSize = 16;
			subtitleStyle.fontStyle = (FontStyle)1;
			subtitleStyle.normal.textColor = new Color(0.92f, 0.34f, 0.3f, 1f);
			bodyStyle = new GUIStyle(GUI.skin.label);
			bodyStyle.fontSize = 14;
			bodyStyle.wordWrap = true;
			bodyStyle.normal.textColor = new Color(0.84f, 0.86f, 0.9f, 1f);
			smallStyle = new GUIStyle(bodyStyle);
			smallStyle.fontSize = 12;
			smallStyle.normal.textColor = new Color(0.66f, 0.69f, 0.77f, 1f);
			buttonStyle = new GUIStyle(GUI.skin.button);
			buttonStyle.fontSize = 14;
			buttonStyle.fontStyle = (FontStyle)1;
			buttonStyle.normal.textColor = Color.white;
			buttonStyle.hover.textColor = Color.white;
			buttonStyle.active.textColor = Color.white;
			buttonStyle.normal.background = MakeTexture(new Color(0.16f, 0.1f, 0.11f, 0.96f));
			buttonStyle.hover.background = MakeTexture(new Color(0.24f, 0.12f, 0.14f, 0.98f));
			buttonStyle.active.background = MakeTexture(new Color(0.35f, 0.15f, 0.17f, 1f));
			buttonStyle.padding = new RectOffset(10, 10, 8, 8);
			buttonStyle.border = new RectOffset(1, 1, 1, 1);
			selectedButtonStyle = new GUIStyle(buttonStyle);
			selectedButtonStyle.normal.background = MakeTexture(new Color(0.64f, 0.22f, 0.18f, 1f));
			selectedButtonStyle.hover.background = MakeTexture(new Color(0.76f, 0.27f, 0.2f, 1f));
			selectedButtonStyle.active.background = MakeTexture(new Color(0.86f, 0.34f, 0.23f, 1f));
			textFieldStyle = new GUIStyle(GUI.skin.textField);
			textFieldStyle.fontSize = 14;
			textFieldStyle.normal.textColor = new Color(0.96f, 0.96f, 0.96f, 1f);
			textFieldStyle.focused.textColor = new Color(0.98f, 0.98f, 0.98f, 1f);
			textFieldStyle.normal.background = MakeTexture(new Color(0.08f, 0.08f, 0.11f, 0.96f));
			textFieldStyle.focused.background = MakeTexture(new Color(0.11f, 0.11f, 0.15f, 0.98f));
			listButtonStyle = new GUIStyle(buttonStyle);
			listButtonStyle.alignment = (TextAnchor)3;
			listButtonStyle.normal.background = MakeTexture(new Color(0.11f, 0.11f, 0.15f, 0.96f));
			listButtonStyle.hover.background = MakeTexture(new Color(0.2f, 0.12f, 0.15f, 0.98f));
			listButtonStyle.active.background = MakeTexture(new Color(0.3f, 0.15f, 0.18f, 1f));
			selectedListButtonStyle = new GUIStyle(listButtonStyle);
			selectedListButtonStyle.normal.background = MakeTexture(new Color(0.54f, 0.18f, 0.15f, 1f));
			selectedListButtonStyle.hover.background = MakeTexture(new Color(0.66f, 0.23f, 0.18f, 1f));
			selectedListButtonStyle.active.background = MakeTexture(new Color(0.76f, 0.29f, 0.21f, 1f));
			overlayStyle = new GUIStyle(GUI.skin.box);
			overlayStyle.normal.background = MakeTexture(new Color(0.04f, 0.04f, 0.05f, 0.92f));
			overlayStyle.border = new RectOffset(1, 1, 1, 1);
			overlayStyle.padding = new RectOffset(12, 12, 12, 12);
		}
	}

	private Texture2D MakeTexture(Color color)
	{
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Expected O, but got Unknown
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		Texture2D val = new Texture2D(1, 1, (TextureFormat)4, false);
		val.SetPixel(0, 0, color);
		val.Apply();
		return val;
	}

	private void SetStatus(string message, float duration = 4f)
	{
		statusText = message;
		statusTimer = duration;
	}

	private string GetLayoutsDirectory()
	{
		string text = layoutDirectoryConfig.Value;
		if (string.IsNullOrWhiteSpace(text))
		{
			text = Path.Combine(Paths.PluginPath, "Omniscye-TruckEditor", "Layouts");
			layoutDirectoryConfig.Value = text;
		}
		Directory.CreateDirectory(text);
		return text;
	}

	private string GetLayoutPath(string layoutName)
	{
		string text = NormalizeLayoutName(layoutName);
		if (!text.EndsWith(".repotruck.json", StringComparison.OrdinalIgnoreCase))
		{
			text += ".repotruck.json";
		}
		return Path.Combine(GetLayoutsDirectory(), text);
	}

	private List<string> GetAvailableLayoutFiles()
	{
		string layoutsDirectory = GetLayoutsDirectory();
		return Directory.GetFiles(layoutsDirectory, "*.repotruck.json", SearchOption.TopDirectoryOnly).OrderByDescending(File.GetLastWriteTimeUtc).Select(Path.GetFileNameWithoutExtension)
			.Select(delegate(string name)
			{
				string result;
				if (!name.EndsWith(".repotruck", StringComparison.OrdinalIgnoreCase))
				{
					result = name;
				}
				else
				{
					result = name.Substring(0, name.Length - 10);
				}
				return result;
			})
			.Distinct<string>(StringComparer.OrdinalIgnoreCase)
			.ToList();
	}

	private string NormalizeLayoutName(string layoutName)
	{
		string text = (string.IsNullOrWhiteSpace(layoutName) ? "Untitled_Truck" : layoutName.Trim());
		StringBuilder stringBuilder = new StringBuilder(text.Length);
		string text2 = text;
		foreach (char c in text2)
		{
			if (char.IsLetterOrDigit(c) || c == '_' || c == '-' || c == ' ')
			{
				stringBuilder.Append((c == ' ') ? '_' : c);
			}
		}
		if (stringBuilder.Length == 0)
		{
			stringBuilder.Append("Untitled_Truck");
		}
		return stringBuilder.ToString();
	}

	private void UpdateTruckEditorSessionLifecycle()
	{
		if (pendingTruckEditorLaunch && CanBeginTruckEditorSession())
		{
			BeginTruckEditorSession();
		}
		if (!truckSessionActive)
		{
			return;
		}
		if (!CanRemainInTruckEditorSession())
		{
			EndTruckEditorSession(loadMainMenu: false);
			return;
		}
		EnsureSessionTruckAnchorRoot();
		if (!forgeModeActive)
		{
			if (IsConfiguredKeyDown(toggleForgeModeKeyConfig))
			{
				EnterForgeMode();
			}
			else if (IsConfiguredKeyDown(exitToMenuKeyConfig))
			{
				EndTruckEditorSession(loadMainMenu: true);
			}
		}
		else
		{
			UpdateForgeCursorMode();
			KeepPlayerFrozenForEditor();
			UpdateEditorCameraMotion();
			UpdatePreviewInstance();
			HandleEditorWorldInput();
		}
	}

	private bool CanBeginTruckEditorSession()
	{
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Invalid comparison between Unknown and I4
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Invalid comparison between Unknown and I4
		if (GameManager.Multiplayer())
		{
			return false;
		}
		if ((Object)(object)RunManager.instance == (Object)null || (Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelLobby)
		{
			return false;
		}
		if ((Object)(object)LevelGenerator.Instance == (Object)null || !LevelGenerator.Instance.Generated)
		{
			return false;
		}
		if ((Object)(object)GameDirector.instance == (Object)null || (Object)(object)GameDirector.instance.MainCamera == (Object)null)
		{
			return false;
		}
		if ((int)GameDirector.instance.currentState != 1 && (int)GameDirector.instance.currentState != 2)
		{
			return false;
		}
		TruckAnchorInfo anchor;
		return TryResolveTruckAnchor(out anchor);
	}

	private bool CanRemainInTruckEditorSession()
	{
		if (GameManager.Multiplayer())
		{
			return false;
		}
		if ((Object)(object)RunManager.instance == (Object)null || (Object)(object)RunManager.instance.levelCurrent != (Object)(object)RunManager.instance.levelLobby)
		{
			return false;
		}
		if ((Object)(object)GameDirector.instance == (Object)null || (Object)(object)GameDirector.instance.MainCamera == (Object)null)
		{
			return false;
		}
		return true;
	}

	private void BeginTruckEditorSession()
	{
		//IL_0030: 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)
		pendingTruckEditorLaunch = false;
		truckSessionActive = true;
		forgeModeActive = false;
		editorCursorActive = false;
		editorUiVisible = true;
		selectedPlacedObjectId = string.Empty;
		placementRotationEuler = Vector3.zero;
		placementHeightOffset = 0f;
		previewDistance = 3.5f;
		EnsureSessionTruckAnchorRoot();
		if (TryLoadLayout(selectedLayoutConfig.Value, out TruckLayoutData layoutData) && layoutData != null)
		{
			LoadLayoutIntoEditor(layoutData);
		}
		else
		{
			editorLayoutName = NormalizeLayoutName(selectedLayoutConfig.Value);
			editorCreatedUtc = string.Empty;
			loadedLayoutFileName = string.Empty;
			ClearEditorLayout();
		}
		SetEditorObjectCollidersEnabled(value: false);
		SetStatus("Truck Editor live. Walk around your truck, then press " + KeyLabel(toggleForgeModeKeyConfig) + " for forge mode.", 5f);
	}

	private void EndTruckEditorSession(bool loadMainMenu)
	{
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		if (truckSessionActive || pendingTruckEditorLaunch)
		{
			ExitForgeMode();
			truckSessionActive = false;
			pendingTruckEditorLaunch = false;
			sessionTruckRoom = null;
			ClearEditorLayout();
			DestroyEditorPreviewInstance();
			if ((Object)(object)sessionTruckAnchorRoot != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)sessionTruckAnchorRoot).gameObject);
				sessionTruckAnchorRoot = null;
			}
			Cursor.SetCursor((Texture2D)null, Vector2.zero, (CursorMode)0);
			Cursor.visible = false;
			Cursor.lockState = (CursorLockMode)1;
			if (loadMainMenu && (Object)(object)RunManager.instance != (Object)null)
			{
				RunManager.instance.ChangeLevel(false, false, (ChangeLevelType)4);
			}
		}
	}

	private void EnterForgeMode()
	{
		if (truckSessionActive && !forgeModeActive)
		{
			if (!EnsureSessionTruckAnchorRoot())
			{
				SetStatus("Truck anchor was not ready yet.");
				return;
			}
			forgeModeActive = true;
			editorCursorActive = false;
			editorUiVisible = true;
			selectedPlacedObjectId = string.Empty;
			DestroyEditorPreviewInstance();
			SetEditorObjectCollidersEnabled(value: true);
			AttachEditorCamera();
			AlignPlacementRotationToCurrentView();
			SetStatus("Forge mode live. Hold " + KeyLabel(cursorModifierKeyConfig) + " for the cursor. Press " + KeyLabel(toggleForgeModeKeyConfig) + " to walk around again.", 5f);
		}
	}

	private void ExitForgeMode()
	{
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		if (forgeModeActive)
		{
			forgeModeActive = false;
			editorCursorActive = false;
			editorUiVisible = true;
			selectedPlacedObjectId = string.Empty;
			DestroyEditorPreviewInstance();
			SetEditorObjectCollidersEnabled(value: false);
			RestoreMainCamera();
			Cursor.SetCursor((Texture2D)null, Vector2.zero, (CursorMode)0);
			Cursor.visible = false;
			Cursor.lockState = (CursorLockMode)1;
		}
	}

	private void AlignPlacementRotationToCurrentView()
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: 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_007c: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)GameDirector.instance == (Object)null) && !((Object)(object)GameDirector.instance.MainCamera == (Object)null) && !((Object)(object)sessionTruckAnchorRoot == (Object)null))
		{
			float num = ((Component)GameDirector.instance.MainCamera).transform.eulerAngles.y - sessionTruckAnchorRoot.eulerAngles.y;
			placementRotationEuler = new Vector3(0f, Mathf.Repeat(num, 360f), 0f);
		}
	}

	private void AttachEditorCamera()
	{
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0114: 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_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Expected O, but got Unknown
		if (!((Object)(object)GameDirector.instance == (Object)null) && !((Object)(object)GameDirector.instance.MainCamera == (Object)null))
		{
			Camera mainCamera = GameDirector.instance.MainCamera;
			if ((Object)(object)editorCameraRoot == (Object)null)
			{
				GameObject val = new GameObject("TruckEditor.CameraRoot");
				((Object)val).hideFlags = (HideFlags)61;
				editorCameraRoot = val.transform;
			}
			editorCameraRestoreParent = ((Component)mainCamera).transform.parent;
			editorCameraRestoreLocalPosition = ((Component)mainCamera).transform.localPosition;
			editorCameraRestoreLocalRotation = ((Component)mainCamera).transform.localRotation;
			editorCameraRoot.position = ((Component)mainCamera).transform.position;
			editorCameraRoot.rotation = ((Component)mainCamera).transform.rotation;
			editorYaw = editorCameraRoot.eulerAngles.y;
			editorPitch = NormalizePitch(editorCameraRoot.eulerAngles.x);
			((Component)mainCamera).transform.SetParent(editorCameraRoot, false);
			((Component)mainCamera).transform.localPosition = Vector3.zero;
			((Component)mainCamera).transform.localRotation = Quaternion.identity;
		}
	}

	private void RestoreMainCamera()
	{
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)GameDirector.instance == (Object)null) && !((Object)(object)GameDirector.instance.MainCamera == (Object)null))
		{
			Camera mainCamera = GameDirector.instance.MainCamera;
			if ((Object)(object)editorCameraRestoreParent != (Object)null)
			{
				((Component)mainCamera).transform.SetParent(editorCameraRestoreParent, false);
				((Component)mainCamera).transform.localPosition = editorCameraRestoreLocalPosition;
				((Component)mainCamera).transform.localRotation = editorCameraRestoreLocalRotation;
			}
			if ((Object)(object)editorCameraRoot != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)editorCameraRoot).gameObject);
				editorCameraRoot = null;
			}
			editorCameraRestoreParent = null;
		}
	}

	private float NormalizePitch(float rawPitch)
	{
		float num = rawPitch;
		if (num > 180f)
		{
			num -= 360f;
		}
		return Mathf.Clamp(num, -85f, 85f);
	}

	private void UpdateForgeCursorMode()
	{
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		bool flag = (editorCursorActive = IsConfiguredKeyHeld(cursorModifierKeyConfig));
		SuppressEditorMenuCursor();
		if ((Object)(object)CursorManager.instance != (Object)null)
		{
			CursorManager.instance.unlockTimer = -1234f;
		}
		if (flag)
		{
			Cursor.lockState = (CursorLockMode)0;
			Cursor.visible = true;
			EnsureEditorCursorTexture();
			Texture2D val = editorCursorTexture;
			Cursor.SetCursor(val, new Vector2((float)((Texture)val).width * 0.5f, (float)((Texture)val).height * 0.5f), (CursorMode)0);
		}
		else
		{
			Cursor.SetCursor((Texture2D)null, Vector2.zero, (CursorMode)0);
			Cursor.visible = false;
			Cursor.lockState = (CursorLockMode)1;
		}
	}

	private void SuppressEditorMenuCursor()
	{
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)MenuCursor.instance == (Object)null))
		{
			((Behaviour)MenuCursor.instance).enabled = false;
			MenuCursor.instance.showTimer = 0f;
			MenuCursor.instance.overridePosTimer = 0f;
			if ((Object)(object)MenuCursor.instance.mesh != (Object)null)
			{
				MenuCursor.instance.mesh.SetActive(false);
			}
			((Component)MenuCursor.instance).transform.localScale = Vector3.zero;
		}
	}

	private void EnsureEditorCursorTexture()
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Expected O, but got Unknown
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00eb: 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)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)editorCursorTexture != (Object)null)
		{
			return;
		}
		editorCursorTexture = new Texture2D(32, 32, (TextureFormat)4, false);
		((Texture)editorCursorTexture).filterMode = (FilterMode)0;
		Color val = default(Color);
		((Color)(ref val))..ctor(0f, 0f, 0f, 0f);
		Color val2 = default(Color);
		((Color)(ref val2))..ctor(0.98f, 0.98f, 0.98f, 1f);
		Color val3 = default(Color);
		((Color)(ref val3))..ctor(1f, 0.35f, 0.22f, 1f);
		for (int i = 0; i < ((Texture)editorCursorTexture).width; i++)
		{
			for (int j = 0; j < ((Texture)editorCursorTexture).height; j++)
			{
				editorCursorTexture.SetPixel(i, j, val);
			}
		}
		for (int k = 6; k <= 26; k++)
		{
			editorCursorTexture.SetPixel(k, 16, val2);
			editorCursorTexture.SetPixel(16, k, val2);
		}
		for (int l = 13; l <= 19; l++)
		{
			for (int m = 13; m <= 19; m++)
			{
				editorCursorTexture.SetPixel(l, m, val3);
			}
		}
		editorCursorTexture.Apply();
	}

	private void KeepPlayerFrozenForEditor()
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)PlayerController.instance == (Object)null))
		{
			PlayerController.instance.InputDisable(0.2f);
			PlayerController.instance.Kinematic(0.2f);
			PlayerController.instance.rb.velocity = Vector3.zero;
			PlayerController.instance.rb.angularVelocity = Vector3.zero;
			if ((Object)(object)GameDirector.instance != (Object)null)
			{
				GameDirector.instance.DisableInput = true;
				GameDirector.instance.DisableInputTimer = 0.2f;
			}
		}
	}

	private void UpdateEditorCameraMotion()
	{
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0122: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: 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_014e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_015c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)editorCameraRoot == (Object)null) && !editorCursorActive)
		{
			float num = (IsConfiguredKeyHeld(fastMoveModifierKeyConfig) ? fastMoveSpeedConfig.Value : moveSpeedConfig.Value);
			float num2 = 0f;
			if (IsConfiguredKeyHeld(moveRightKeyConfig))
			{
				num2 += 1f;
			}
			if (IsConfiguredKeyHeld(moveLeftKeyConfig))
			{
				num2 -= 1f;
			}
			float num3 = 0f;
			if (IsConfiguredKeyHeld(moveUpKeyConfig))
			{
				num3 += 1f;
			}
			if (IsConfiguredKeyHeld(moveDownKeyConfig))
			{
				num3 -= 1f;
			}
			float num4 = 0f;
			if (IsConfiguredKeyHeld(moveForwardKeyConfig))
			{
				num4 += 1f;
			}
			if (IsConfiguredKeyHeld(moveBackwardKeyConfig))
			{
				num4 -= 1f;
			}
			Vector3 val = editorCameraRoot.right * num2 + editorCameraRoot.forward * num4 + Vector3.up * num3;
			Vector3 normalized = ((Vector3)(ref val)).normalized;
			Transform? obj = editorCameraRoot;
			obj.position += normalized * (num * Time.deltaTime);
			float axis = Input.GetAxis("Mouse X");
			float axis2 = Input.GetAxis("Mouse Y");
			editorYaw += axis * 4.2f;
			editorPitch = Mathf.Clamp(editorPitch - axis2 * 4.2f, -85f, 85f);
			editorCameraRoot.rotation = Quaternion.Euler(editorPitch, editorYaw, 0f);
		}
	}

	private bool EnsureSessionTruckAnchorRoot()
	{
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: 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_0041: Expected O, but got Unknown
		if (!TryResolveTruckAnchor(out var anchor))
		{
			return false;
		}
		sessionTruckRoom = anchor.Room;
		if ((Object)(object)sessionTruckAnchorRoot == (Object)null)
		{
			GameObject val = new GameObject("TruckEditor.SessionAnchor");
			((Object)val).hideFlags = (HideFlags)61;
			sessionTruckAnchorRoot = val.transform;
		}
		sessionTruckAnchorRoot.SetParent((Transform)null, false);
		sessionTruckAnchorRoot.position = anchor.WorldPosition;
		sessionTruckAnchorRoot.rotation = anchor.WorldRotation;
		sessionTruckAnchorRoot.localScale = Vector3.one;
		return true;
	}

	private bool TryResolveTruckAnchor(out TruckAnchorInfo anchor)
	{
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: 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_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: 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_013e: 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_0157: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0334: Unknown result type (might be due to invalid IL or missing references)
		//IL_0342: Unknown result type (might be due to invalid IL or missing references)
		//IL_0357: Unknown result type (might be due to invalid IL or missing references)
		//IL_0359: Unknown result type (might be due to invalid IL or missing references)
		//IL_035e: Unknown result type (might be due to invalid IL or missing references)
		//IL_036b: Unknown result type (might be due to invalid IL or missing references)
		//IL_037a: Unknown result type (might be due to invalid IL or missing references)
		//IL_037f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0383: Unknown result type (might be due to invalid IL or missing references)
		//IL_0385: Unknown result type (might be due to invalid IL or missing references)
		//IL_0387: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0309: Unknown result type (might be due to invalid IL or missing references)
		//IL_030c: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_0325: Unknown result type (might be due to invalid IL or missing references)
		//IL_020b: Unknown result type (might be due to invalid IL or missing references)
		//IL_020e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0238: Unknown result type (might be due to invalid IL or missing references)
		//IL_023e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0243: Unknown result type (might be due to invalid IL or missing references)
		//IL_0248: Unknown result type (might be due to invalid IL or missing references)
		//IL_0289: Unknown result type (might be due to invalid IL or missing references)
		//IL_028b: Unknown result type (might be due to invalid IL or missing references)
		anchor = default(TruckAnchorInfo);
		List<RoomVolume> list = (from volume in Object.FindObjectsOfType<RoomVolume>()
			where (Object)(object)volume != (Object)null && volume.Truck
			select volume).ToList();
		if (list.Count == 0)
		{
			return false;
		}
		Vector3 val = Vector3.zero;
		if ((Object)(object)PlayerController.instance != (Object)null)
		{
			val = ((Component)PlayerController.instance).transform.position;
		}
		else if ((Object)(object)GameDirector.instance != (Object)null && (Object)(object)GameDirector.instance.MainCamera != (Object)null)
		{
			val = ((Component)GameDirector.instance.MainCamera).transform.position;
		}
		Transform val2 = (((Object)(object)TruckSafetySpawnPoint.instance != (Object)null) ? ((Component)TruckSafetySpawnPoint.instance).transform : null);
		RoomVolume val3 = null;
		Bounds val4 = default(Bounds);
		float num = float.MinValue;
		float num2 = float.MaxValue;
		foreach (RoomVolume item in list)
		{
			if (!TryBuildTruckLocalBounds(item, out var bounds))
			{
				((Bounds)(ref bounds))..ctor(Vector3.zero, new Vector3(6f, 3f, 10f));
			}
			float num3 = Mathf.Max(1f, ((Bounds)(ref bounds)).size.x * ((Bounds)(ref bounds)).size.y * ((Bounds)(ref bounds)).size.z);
			if ((Object)(object)((Component)item).GetComponentInChildren<TruckDoor>(true) != (Object)null)
			{
				num3 += 10000f;
			}
			if ((Object)(object)((Component)item).GetComponentInChildren<TruckScreenOpen>(true) != (Object)null || (Object)(object)((Component)item).GetComponentInChildren<TruckScreenText>(true) != (Object)null)
			{
				num3 += 5000f;
			}
			Vector3 val5 = ((Component)item).transform.position - val;
			float num4 = ((Vector3)(ref val5)).sqrMagnitude;
			if ((Object)(object)val2 != (Object)null)
			{
				if (val2.IsChildOf(((Component)item).transform))
				{
					num3 += 50000f;
				}
				else if (IsPointInsideTruckBounds(item, bounds, val2.position, 0.35f))
				{
					num3 += 30000f;
				}
				float num5 = num4;
				val5 = ((Component)item).transform.position - val2.position;
				num4 = Mathf.Min(num5, ((Vector3)(ref val5)).sqrMagnitude);
			}
			if ((Object)(object)val3 == (Object)null || num3 > num || (Mathf.Approximately(num3, num) && num4 < num2))
			{
				val3 = item;
				val4 = bounds;
				num = num3;
				num2 = num4;
			}
		}
		if ((Object)(object)val3 == (Object)null)
		{
			return false;
		}
		float y = ((Bounds)(ref val4)).min.y;
		if ((Object)(object)val2 != (Object)null)
		{
			Vector3 val6 = ((Component)val3).transform.InverseTransformPoint(val2.position);
			if (val2.IsChildOf(((Component)val3).transform) || IsPointInsideTruckBounds(val3, val4, val2.position, 0.5f))
			{
				y = val6.y;
			}
		}
		Vector3 val7 = default(Vector3);
		((Vector3)(ref val7))..ctor(((Bounds)(ref val4)).center.x, y, ((Bounds)(ref val4)).center.z);
		Vector3 worldPosition = ((Component)val3).transform.TransformPoint(val7);
		Quaternion worldRotation = Quaternion.Euler(0f, ((Component)val3).transform.eulerAngles.y, 0f);
		anchor = new TruckAnchorInfo(val3, worldPosition, worldRotation, val4);
		return true;
	}

	private bool IsPointInsideTruckBounds(RoomVolume roomVolume, Bounds bounds, Vector3 worldPoint, float padding)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//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)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = ((Component)roomVolume).transform.InverseTransformPoint(worldPoint);
		Bounds val2 = bounds;
		((Bounds)(ref val2)).Expand(padding * 2f);
		return ((Bounds)(ref val2)).Contains(val);
	}

	private bool TryBuildTruckLocalBounds(RoomVolume roomVolume, out Bounds bounds)
	{
		//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_006a: Unknown result type (might be due to invalid IL or missing references)
		bounds = default(Bounds);
		bool initialized = false;
		Collider[] componentsInChildren = ((Component)roomVolume).GetComponentsInChildren<Collider>(true);
		foreach (Collider val in componentsInChildren)
		{
			EncapsulateLocalBounds(((Component)roomVolume).transform, val.bounds, ref bounds, ref initialized);
		}
		if (initialized)
		{
			return true;
		}
		Renderer[] componentsInChildren2 = ((Component)roomVolume).GetComponentsInChildren<Renderer>(true);
		foreach (Renderer val2 in componentsInChildren2)
		{
			EncapsulateLocalBounds(((Component)roomVolume).transform, val2.bounds, ref bounds, ref initialized);
		}
		return initialized;
	}

	private void EncapsulateLocalBounds(Transform root, Bounds worldBounds, ref Bounds localBounds, ref bool initialized)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: 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_0025: 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_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: 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)
		//IL_003f: 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_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		Vector3 center = ((Bounds)(ref worldBounds)).center;
		Vector3 extents = ((Bounds)(ref worldBounds)).extents;
		for (int i = -1; i <= 1; i += 2)
		{
			for (int j = -1; j <= 1; j += 2)
			{
				for (int k = -1; k <= 1; k += 2)
				{
					Vector3 val = center + Vector3.Scale(extents, new Vector3((float)i, (float)j, (float)k));
					Vector3 val2 = root.InverseTransformPoint(val);
					if (!initialized)
					{
						localBounds = new Bounds(val2, Vector3.zero);
						initialized = true;
					}
					else
					{
						((Bounds)(ref localBounds)).Encapsulate(val2);
					}
				}
			}
		}
	}

	private bool IsGameplayRuntimeReady()
	{
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Invalid comparison between Unknown and I4
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Invalid comparison between Unknown and I4
		if ((Object)(object)RunManager.instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null || (Object)(object)LevelGenerator.Instance == (Object)null)
		{
			return false;
		}
		if (SemiFunc.MenuLevel() || SemiFunc.RunIsLobbyMenu() || SemiFunc.RunIsTutorial())
		{
			return false;
		}
		if (!IsTruckDecorRuntimeScene())
		{
			return false;
		}
		if (!LevelGenerator.Instance.Generated)
		{
			return false;
		}
		if ((int)GameDirector.instance.currentState != 1 && (int)GameDirector.instance.currentState != 2)
		{
			return false;
		}
		if (!GameManager.Multiplayer())
		{
			return true;
		}
		if (!PhotonNetwork.InRoom || !PhotonNetwork.IsConnectedAndReady)
		{
			return false;
		}
		return true;
	}

	private bool ShouldResetRuntimeTracking()
	{
		if ((Object)(object)RunManager.instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null || (Object)(object)LevelGenerator.Instance == (Object)null)
		{
			return true;
		}
		if (SemiFunc.MenuLevel() || SemiFunc.RunIsLobbyMenu() || SemiFunc.RunIsTutorial())
		{
			return true;
		}
		if (!IsTruckDecorRuntimeScene())
		{
			return true;
		}
		if (GameManager.Multiplayer() && (!PhotonNetwork.InRoom || !PhotonNetwork.IsConnectedAndReady))
		{
			return true;
		}
		return false;
	}

	private bool IsTruckDecorRuntimeScene()
	{
		return SemiFunc.RunIsLevel() || SemiFunc.RunIsLobby() || SemiFunc.RunIsShop();
	}

	private bool ShouldForceEditorChargingStation()
	{
		return pendingTruckEditorLaunch || truckSessionActive || forgeModeActive;
	}

	private void PrepareEditorChargingStation(ChargingStation station)
	{
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0380: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bd: Expected O, but got Unknown
		if ((Object)(object)station == (Object)null)
		{
			return;
		}
		ChargingStation.instance = station;
		((Component)station).gameObject.SetActive(true);
		GameObject meshObject = station.meshObject;
		if (meshObject != null)
		{
			meshObject.SetActive(true);
		}
		station.chargeBar = (((Object)(object)station.chargeBar != (Object)null) ? station.chargeBar : ((Component)station).transform.Find("Charge"));
		if ((Object)(object)station.chargeBar != (Object)null)
		{
			((Component)station.chargeBar).gameObject.SetActive(true);
			station.chargeBar.localScale = Vector3.one;
		}
		station.lockedTransform = (((Object)(object)station.lockedTransform != (Object)null) ? station.lockedTransform : ((Component)station).transform.Find("Locked"));
		if ((Object)(object)station.lockedTransform != (Object)null)
		{
			((Component)station.lockedTransform).gameObject.SetActive(true);
		}
		station.chargeArea = (((Object)(object)station.chargeArea != (Object)null) ? station.chargeArea : ((Component)station).transform.Find("Charge Area"));
		if ((Object)(object)station.chargeArea != (Object)null)
		{
			Collider[] componentsInChildren = ((Component)station.chargeArea).GetComponentsInChildren<Collider>(true);
			foreach (Collider val in componentsInChildren)
			{
				val.enabled = false;
			}
		}
		object light;
		if (!((Object)(object)station.light1 != (Object)null))
		{
			Transform obj = ((Component)station).transform.Find("Light1");
			light = ((obj != null) ? ((Component)obj).GetComponent<Light>() : null);
		}
		else
		{
			light = station.light1;
		}
		station.light1 = (Light)light;
		object light2;
		if (!((Object)(object)station.light2 != (Object)null))
		{
			Transform obj2 = ((Component)station).transform.Find("Light2");
			light2 = ((obj2 != null) ? ((Component)obj2).GetComponent<Light>() : null);
		}
		else
		{
			light2 = station.light2;
		}
		station.light2 = (Light)light2;
		if ((Object)(object)station.light1 != (Object)null)
		{
			((Behaviour)station.light1).enabled = true;
		}
		if ((Object)(object)station.light2 != (Object)null)
		{
			((Behaviour)station.light2).enabled = true;
		}
		if ((Object)(object)station.subtleLight != (Object)null)
		{
			station.subtleLight.SetActive(true);
			Light component = station.subtleLight.GetComponent<Light>();
			if ((Object)(object)component != (Object)null)
			{
				((Behaviour)component).enabled = true;
			}
		}
		station.crystalCylinder = (((Object)(object)station.crystalCylinder != (Object)null) ? station.crystalCylinder : ((Component)station).transform.Find("Crystal Cylinder"));
		if ((Object)(object)station.crystalCylinder != (Object)null)
		{
			station.crystals.Clear();
			foreach (Transform item in station.crystalCylinder)
			{
				Transform val2 = item;
				((Component)val2).gameObject.SetActive(true);
				station.crystals.Add(val2);
			}
		}
		if ((Object)(object)station.meshObject != (Object)null)
		{
			Renderer component2 = station.meshObject.GetComponent<Renderer>();
			if ((Object)(object)component2 != (Object)null)
			{
				station.chargingStationEmissionMaterial = component2.material;
				if (station.chargingStationEmissionMaterial.HasProperty("_EmissionColor"))
				{
					station.chargingStationEmissionMaterial.EnableKeyword("_EMISSION");
					station.chargingStationEmissionMaterial.SetColor("_EmissionColor", new Color(0.35f, 0.28f, 0.08f, 1f));
				}
			}
		}
		((Behaviour)station).enabled = false;
	}

	private bool HasSelectedLayoutFile()
	{
		if (string.IsNullOrWhiteSpace(selectedLayoutConfig.Value))
		{
			return false;
		}
		return File.Exists(GetLayoutPath(selectedLayoutConfig.Value));
	}

	private bool TryLoadLayout(string layoutName, out TruckLayoutData? layoutData)
	{
		layoutData = null;
		string layoutPath = GetLayoutPath(layoutName);
		if (!File.Exists(layoutPath))
		{
			return false;
		}
		try
		{
			layoutData = JsonConvert.DeserializeObject<TruckLayoutData>(File.ReadAllText(layoutPath), jsonSettings);
			if (layoutData == null)
			{
				return false;
			}
			layoutData.Name = (string.IsNullOrWhiteSpace(layoutData.Name) ? NormalizeLayoutName(layoutName) : NormalizeLayoutName(layoutData.Name));
			TruckLayoutData truckLayoutData = layoutData;
			if (truckLayoutData.Objects == null)
			{
				truckLayoutData.Objects = new List<TruckObjectRecord>();
			}
			return true;
		}
		catch (Exception ex)
		{
			Log.LogError((object)("[TruckEditor] Failed to load layout '" + layoutName + "': " + ex));
			SetStatus("Could not load " + layoutName + ".", 5f);
			return false;
		}
	}

	private CatalogEntry? GetSelectedCatalogEntry()
	{
		if (string.IsNullOrWhiteSpace(selectedObjectId))
		{
			return catalogEntries.FirstOrDefault();
		}
		CatalogEntry catalogEntry = catalogEntries.FirstOrDefault((CatalogEntry entry) => string.Equals(entry.ResourcePath, selectedObjectId, StringComparison.OrdinalIgnoreCase));
		return catalogEntry ?? catalogEntries.FirstOrDefault();
	}

	private IEnumerable<CatalogEntry> GetVisibleCatalogEntries()
	{
		IEnumerable<CatalogEntry> source = catalogEntries;
		if (!string.Equals(selectedCategory, "All", StringComparison.OrdinalIgnoreCase))
		{
			source = source.Where((CatalogEntry entry) => string.Equals(entry.Category, selectedCategory, StringComparison.OrdinalIgnoreCase));
		}
		if (!string.IsNullOrWhiteSpace(editorSearch))
		{
			string text = editorSearch.Trim();
			source = source.Where((CatalogEntry entry) => entry.DisplayName.IndexOf(text, StringComparison.OrdinalIgnoreCase) >= 0 || entry.Section.IndexOf(text, StringComparison.OrdinalIgnoreCase) >= 0);
		}
		return source.OrderBy<CatalogEntry, string>((CatalogEntry entry) => entry.Section, StringComparer.OrdinalIgnoreCase).ThenBy<CatalogEntry, string>((CatalogEntry entry) => entry.DisplayName, StringComparer.OrdinalIgnoreCase);
	}

	private string NiceNameFromPath(string rawName)
	{
		string text = rawName ?? string.Empty;
		if (text.Contains("/"))
		{
			text = text.Split('/').Last();
		}
		text = text.Replace('_', ' ').Replace('-', ' ').Trim();
		if (string.IsNullOrWhiteSpace(text))
		{
			text = "Decor Piece";
		}
		StringBuilder stringBuilder = new StringBuilder(text.Length + 8);
		for (int i = 0; i < text.Length; i++)
		{
			char c = text[i];
			if (i > 0 && char.IsUpper(c) && text[i - 1] != ' ' && !char.IsUpper(text[i - 1]))
			{
				stringBuilder.Append(' ');
			}
			stringBuilder.Append(c);
		}
		return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(stringBuilder.ToString().ToLowerInvariant());
	}

	private void BuildCatalogIfNeeded(bool force)
	{
		if (!force && catalogEntries.Count > 0)
		{
			return;
		}
		catalogEntries.Clear();
		categoryNames.Clear();
		HashSet<string> knownPaths = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
		if ((Object)(object)RunManager.instance != (Object)null)
		{
			IEnumerable<Level> levels = RunManager.instance.levels;
			foreach (Level item in levels ?? Enumerable.Empty<Level>())
			{
				IEnumerable<LevelValuables> valuablePresets = item.ValuablePresets;
				foreach (LevelValuables item2 in valuablePresets ?? Enumerable.Empty<LevelValuables>())
				{
					AddCatalogEntries(item2.tiny, "Valuable Decor", item.NarrativeName + " Tiny", knownPaths);
					AddCatalogEntries(item2.small, "Valuable Decor", item.NarrativeName + " Small", knownPaths);
					AddCatalogEntries(item2.medium, "Valuable Decor", item.NarrativeName + " Medium", knownPaths);
					AddCatalogEntries(item2.big, "Valuable Decor", item.NarrativeName + " Big", knownPaths);
					AddCatalogEntries(item2.wide, "Valuable Decor", item.NarrativeName + " Wide", knownPaths);
					AddCatalogEntries(item2.tall, "Valuable Decor", item.NarrativeName + " Tall", knownPaths);
					AddCatalogEntries(item2.veryTall, "Valuable Decor", item.NarrativeName + " Very Tall", knownPaths);
				}
			}
		}
		if ((Object)(object)StatsManager.instance != (Object)null)
		{
			foreach (Item item3 in StatsManager.instance.itemDictionary.Values.OrderBy<Item, string>((Item item) => item.itemName, StringComparer.OrdinalIgnoreCase))
			{
				if (item3?.prefab != null && item3.prefab.IsValid() && item3.physicalItem)
				{
					AddCatalogEntry(item3.prefab, "Item Decor", "Physical Items", knownPaths, item3.itemName);
				}
			}
		}
		categoryNames.Add("All");
		categoryNames.AddRange(catalogEntries.Select((CatalogEntry entry) => entry.Category).Distinct<string>(StringComparer.OrdinalIgnoreCase).OrderBy<string, string>((string category) => category, StringComparer.OrdinalIgnoreCase));
		if (!categoryNames.Contains(selectedCategory))
		{
			selectedCategory = "All";
		}
		if (GetSelectedCatalogEntry() == null && catalogEntries.Count > 0)
		{
			selectedObjectId = catalogEntries[0].ResourcePath;
		}
	}

	private void AddCatalogEntries(IEnumerable<PrefabRef> prefabRefs, string category, string section, HashSet<string> knownPaths)
	{
		if (prefabRefs == null)
		{
			return;
		}
		foreach (PrefabRef prefabRef in prefabRefs)
		{
			AddCatalogEntry(prefabRef, category, section, knownPaths, null);
		}
	}

	private void AddCatalogEntry(PrefabRef prefabRef, string category, string section, HashSet<string> knownPaths, string? preferredName)
	{
		if (prefabRef != null && prefabRef.IsValid() && !string.IsNullOrWhiteSpace(prefabRef.ResourcePath) && knownPaths.Add(prefabRef.ResourcePath))
		{
			catalogEntries.Add(new CatalogEntry
			{
				ResourcePath = prefabRef.ResourcePath,
				DisplayName = (string.IsNullOrWhiteSpace(preferredName) ? NiceNameFromPath(prefabRef.PrefabName) : preferredName),
				Category = category,
				Section = section
			});
		}
	}

	private void HandleEditorWorldInput()
	{
		//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
		if (!forgeModeActive || editorCursorActive || (Object)(object)GameDirector.instance == (Object)null || (Object)(object)GameDirector.instance.MainCamera == (Object)null)
		{
			return;
		}
		if (IsConfiguredKeyDown(toggleEditorUiKeyConfig))
		{
			editorUiVisible = !editorUiVisible;
			SetStatus(editorUiVisible ? "Truck Editor UI shown." : ("Truck Editor UI hidden. Press " + KeyLabel(toggleEditorUiKeyConfig) + " to show it again."), 3f);
		}
		if (IsConfiguredKeyDown(toggleForgeModeKeyConfig))
		{
			ExitForgeMode();
			SetStatus("Back in normal truck view.", 3f);
			return;
		}
		if (IsConfiguredKeyDown(exitToMenuKeyConfig))
		{
			EndTruckEditorSession(loadMainMenu: true);
			return;
		}
		float y = Input.mouseScrollDelta.y;
		if (Mathf.Abs(y) > 0.01f)
		{
			previewDistance = Mathf.Clamp(previewDistance + y * 0.4f, 0.8f, 12f);
		}
		if (IsConfiguredKeyDown(placementOffsetDownKeyConfig))
		{
			placementHeightOffset -= 0.08f;
			SetStatus("Placement offset " + placementHeightOffset.ToString("0.00", CultureInfo.InvariantCulture) + "m", 2f);
		}
		if (IsConfiguredKeyDown(placementOffsetUpKeyConfig))
		{
			placementHeightOffset += 0.08f;
			SetStatus("Placement offset " + placementHeightOffset.ToString("0.00", CultureInfo.InvariantCulture) + "m", 2f);
		}
		CatalogEntry selectedCatalogEntry = GetSelectedCatalogEntry();
		if (selectedCatalogEntry != null && Input.GetMouseButtonDown(0))
		{
			PlaceSelectedObject(selectedCatalogEntry);
		}
		UpdatePlacementRotationInput();
		if (Input.GetMouseButtonDown(1))
		{
			PickPlacedObject();
		}
		if (!string.IsNullOrWhiteSpace(selectedPlacedObjectId))
		{
			if (IsConfiguredKeyHeld(moveSelectedModifierKeyConfig) && Input.GetMouseButtonDown(0))
			{
				MoveSelectedObjectToCrosshair();
			}
			if (IsConfiguredKeyHeld(rotateSelectedKeyConfig))
			{
				RotateSelectedPlacedObject(90f * Time.deltaTime);
			}
			if (IsConfiguredKeyDown(deleteSelectedKeyConfig))
			{
				RemoveSelectedPlacedObject();
			}
			if (IsConfiguredKeyDown(duplicateSelectedKeyConfig))
			{
				DuplicateSelectedPlacedObject();
			}
			if (IsConfiguredKeyDown(selectedHeightUpKeyConfig))
			{
				AdjustSelectedPlacedHeight(0.08f);
			}
			if (IsConfiguredKeyDown(selectedHeightDownKeyConfig))
			{
				AdjustSelectedPlacedHeight(-0.08f);
			}
		}
	}

	private void UpdatePlacementRotationInput()
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: 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_0058: 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)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		float num = 90f * Time.deltaTime;
		Vector3 val = placementRotationEuler;
		bool flag = false;
		if (IsConfiguredKeyHeld(placementRotateXKeyConfig))
		{
			val.x = Mathf.Repeat(val.x + num, 360f);
			flag = true;
		}
		if (IsConfiguredKeyHeld(placementRotateYKeyConfig))
		{
			val.y = Mathf.Repeat(val.y + num, 360f);
			flag = true;
		}
		if (IsConfiguredKeyHeld(placementRotateZKeyConfig))
		{
			val.z = Mathf.Repeat(val.z + num, 360f);
			flag = true;
		}
		if (flag)
		{
			placementRotationEuler = val;
		}
	}

	private void PlaceSelectedObject(CatalogEntry entry)
	{
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)sessionTruckAnchorRoot == (Object)null))
		{
			PlacementState placementState = GetPlacementState(editorPreviewInstance);
			TruckObjectRecord obj = new TruckObjectRecord
			{
				Id = Guid.NewGuid().ToString("N"),
				ResourcePath = entry.ResourcePath,
				DisplayName = entry.DisplayName,
				Category = entry.Category,
				Section = entry.Section,
				Position = new SerializableVector3(sessionTruckAnchorRoot.InverseTransformPoint(placementState.Position))
			};
			Quaternion val = Quaternion.Inverse(sessionTruckAnchorRoot.rotation) * placementState.Rotation;
			obj.Rotation = new SerializableVector3(((Quaternion)(ref val)).eulerAngles);
			TruckObjectRecord truckObjectRecord = obj;
			editorObjects[truckObjectRecord.Id] = truckObjectRecord;
			GameObject val2 = InstantiateEditorObject(truckObjectRecord);
			if ((Object)(object)val2 == (Object)null)
			{
				editorObjects.Remove(truckObjectRecord.Id);
				SetStatus("Missing resource for " + entry.DisplayName + ".");
			}
			else
			{
				editorInstances[truckObjectRecord.Id] = val2;
				selectedPlacedObjectId = truckObjectRecord.Id;
				SetStatus("Placed " + entry.DisplayName + ".", 2f);
			}
		}
	}

	private GameObject? InstantiateEditorObject(TruckObjectRecord record)
	{
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)sessionTruckAnchorRoot == (Object)null)
		{
			return null;
		}
		GameObject val = Resources.Load<GameObject>(record.ResourcePath);
		if ((Object)(object)val == (Object)null)
		{
			return null;
		}
		GameObject val2 = Object.Instantiate<GameObject>(val);
		((Object)val2).name = "TruckEditor.Decor." + record.DisplayName;
		val2.transform.SetParent(sessionTruckAnchorRoot, false);
		val2.transform.localPosition = record.Position.ToVector3();
		val2.transform.localRotation = Quaternion.Euler(record.Rotation.ToVector3());
		PlacedMarker placedMarker = val2.GetComponent<PlacedMarker>();
		if ((Object)(object)placedMarker == (Object)null)
		{
			placedMarker = val2.AddComponent<PlacedMarker>();
		}
		placedMarker.Id = record.Id;
		MakeDecorativeInstanceDormant(val2, placedMarker, forgeModeActive);
		return val2;
	}

	private void MakeDecorativeInstanceDormant(GameObject instance, PlacedMarker? marker, bool collidersEnabled)
	{
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		Behaviour[] componentsInChildren = instance.GetComponentsInChildren<Behaviour>(true);
		foreach (Behaviour val in componentsInChildren)
		{
			if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)(object)marker))
			{
				val.enabled = false;
			}
		}
		Collider[] componentsInChildren2 = instance.GetComponentsInChildren<Collider>(true);
		foreach (Collider val2 in componentsInChildren2)
		{
			val2.enabled = collidersEnabled;
		}
		Rigidbody[] componentsInChildren3 = instance.GetComponentsInChildren<Rigidbody>(true);
		foreach (Rigidbody val3 in componentsInChildren3)
		{
			val3.isKinematic = true;
			val3.useGravity = false;
			val3.detectCollisions = collidersEnabled;
			val3.velocity = Vector3.zero;
			val3.angularVelocity = Vector3.zero;
		}
	}

	private void SetEditorObjectCollidersEnabled(bool value)
	{
		foreach (GameObject value2 in editorInstances.Values)
		{
			if (!((Object)(object)value2 == (Object)null))
			{
				Collider[] componentsInChildren = value2.GetComponentsInChildren<Collider>(true);
				foreach (Collider val in componentsInChildren)
				{
					val.enabled = value;
				}
				Rigidbody[] componentsInChildren2 = value2.GetComponentsInChildren<Rigidbody>(true);
				foreach (Rigidbody val2 in componentsInChildren2)
				{
					val2.detectCollisions = value;
				}
			}
		}
	}

	private void PickPlacedObject()
	{
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)GameDirector.instance == (Object)null || (Object)(object)GameDirector.instance.MainCamera == (Object)null)
		{
			return;
		}
		Camera mainCamera = GameDirector.instance.MainCamera;
		Ray val = default(Ray);
		((Ray)(ref val))..ctor(((Component)mainCamera).transform.position, ((Component)mainCamera).transform.forward);
		RaycastHit val2 = default(RaycastHit);
		if (!Physics.Raycast(val, ref val2, 40f, -1, (QueryTriggerInteraction)2))
		{
			selectedPlacedObjectId = string.Empty;
			return;
		}
		PlacedMarker componentInParent = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent<PlacedMarker>();
		selectedPlacedObjectId = (((Object)(object)componentInParent != (Object)null) ? componentInParent.Id : string.Empty);
		if (!string.IsNullOrWhiteSpace(selectedPlacedObjectId) && editorObjects.TryGetValue(selectedPlacedObjectId, out TruckObjectRecord value))
		{
			SetStatus("Selected " + value.DisplayName + ".", 2f);
		}
	}

	private void UpdatePreviewInstance()
	{
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
		if (!forgeModeActive || (Object)(object)sessionTruckAnchorRoot == (Object)null)
		{
			DestroyEditorPreviewInstance();
			return;
		}
		CatalogEntry selectedCatalogEntry = GetSelectedCatalogEntry();
		if (selectedCatalogEntry == null)
		{
			DestroyEditorPreviewInstance();
			return;
		}
		if ((Object)(object)editorPreviewInstance == (Object)null || !string.Equals(previewResourcePath, selectedCatalogEntry.ResourcePath, StringComparison.OrdinalIgnoreCase))
		{
			DestroyEditorPreviewInstance();
			editorPreviewInstance = CreatePreviewInstance(selectedCatalogEntry);
			previewResourcePath = selectedCatalogEntry.ResourcePath;
		}
		if (!((Object)(object)editorPreviewInstance == (Object)null))
		{
			PlacementState placementState = GetPlacementState(editorPreviewInstance);
			editorPreviewInstance.transform.SetPositionAndRotation(placementState.Position, placementState.Rotation);
		}
	}

	private GameObject? CreatePreviewInstance(CatalogEntry entry)
	{
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)sessionTruckAnchorRoot == (Object)null)
		{
			return null;
		}
		GameObject val = Resources.Load<GameObject>(entry.ResourcePath);
		if ((Object)(object)val == (Object)null)
		{
			return null;
		}
		GameObject val2 = Object.Instantiate<GameObject>(val);
		((Object)val2).name = "TruckEditor.Preview";
		val2.transform.SetParent(sessionTruckAnchorRoot, true);
		Behaviour[] componentsInChildren = val2.GetComponentsInChildren<Behaviour>(true);
		foreach (Behaviour val3 in componentsInChildren)
		{
			val3.enabled = false;
		}
		Collider[] componentsInChildren2 = val2.GetComponentsInChildren<Collider>(true);
		foreach (Collider val4 in componentsInChildren2)
		{
			val4.enabled = false;
		}
		Rigidbody[] componentsInChildren3 = val2.GetComponentsInChildren<Rigidbody>(true);
		foreach (Rigidbody val5 in componentsInChildren3)
		{
			val5.isKinematic = true;
			val5.useGravity = false;
			val5.velocity = Vector3.zero;
			val5.angularVelocity = Vector3.zero;
		}
		Renderer[] componentsInChildren4 = val2.GetComponentsInChildren<Renderer>(true);
		foreach (Renderer val6 in componentsInChildren4)
		{
			val6.material = CreatePreviewMaterial(val6.sharedMaterial);
			val6.shadowCastingMode = (ShadowCastingMode)0;
			val6.receiveShadows = false;
		}
		return val2;
	}

	private Material CreatePreviewMaterial(Material? sourceMaterial)
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Expected O, but got Unknown
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: 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_0107: Unknown result type (might be due to invalid IL or missing references)
		Shader val = Shader.Find("Standard");
		Material val2 = new Material(val);
		Color color = default(Color);
		((Color)(ref color))..ctor(0.9f, 0.4f, 0.24f, 0.28f);
		if ((Object)(object)sourceMaterial != (Object)null && sourceMaterial.HasProperty("_Color"))
		{
			color = sourceMaterial.color;
			color.a = 0.28f;
		}
		val2.color = color;
		val2.SetFloat("_Mode", 3f);
		val2.SetInt("_SrcBlend", 5);
		val2.SetInt("_DstBlend", 10);
		val2.SetInt("_ZWrite", 0);
		val2.DisableKeyword("_ALPHATEST_ON");
		val2.EnableKeyword("_ALPHABLEND_ON");
		val2.DisableKeyword("_ALPHAPREMULTIPLY_ON");
		val2.renderQueue = 3000;
		if (val2.HasProperty("_EmissionColor"))
		{
			val2.EnableKeyword("_EMISSION");
			val2.SetColor("_EmissionColor", new Color(0.17f, 0.06f, 0.03f, 1f));
		}
		return val2;
	}

	private void DestroyEditorPreviewInstance()
	{
		if ((Object)(object)editorPreviewInstance != (Object)null)
		{
			Object.Destroy((Object)(object)editorPreviewInstance);
			editorPreviewInstance = null;
		}
		previewResourcePath = string.Empty;
	}

	private void MoveSelectedObjectToCrosshair()
	{
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: 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_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)sessionTruckAnchorRoot == (Object)null) && editorObjects.TryGetValue(selectedPlacedObjectId, out TruckObjectRecord value) && editorInstances.TryGetValue(selectedPlacedObjectId, out GameObject value2))
		{
			PlacementState placementState = GetPlacementState(value2);
			value2.transform.SetPositionAndRotation(placementState.Position, placementState.Rotation);
			value.Position = new SerializableVector3(sessionTruckAnchorRoot.InverseTransformPoint(placementState.Position));
			TruckObjectRecord truckObjectRecord = value;
			Quaternion val = Quaternion.Inverse(sessionTruckAnchorRoot.rotation) * placementState.Rotation;
			truckObjectRecord.Rotation = new SerializableVector3(((Quaternion)(ref val)).eulerAngles);
			SetStatus("Moved " + value.DisplayName + ".", 2f);
		}
	}

	private void RotateSelectedPlacedObject(float amount)
	{
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or mi