Decompiled source of BlueprintTweaks v1.6.10

patchers/BlueprintTweaksPatcher.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx.Logging;
using Mono.Cecil;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("BlueprintTweaksPatcher")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+06b777a8b850ef142e561fc02fcdbcdd1eae64af")]
[assembly: AssemblyProduct("BlueprintTweaksPatcher")]
[assembly: AssemblyTitle("BlueprintTweaksPatcher")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace BlueprintTweaks;

public static class Preloader
{
	public static ManualLogSource logSource;

	public static IEnumerable<string> TargetDLLs { get; } = new string[1] { "Assembly-CSharp.dll" };


	public static void Initialize()
	{
		logSource = Logger.CreateLogSource("BlueprintTweaks Preloader");
	}

	public static MethodReference DefaultCtorFor(TypeReference type)
	{
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Expected O, but got Unknown
		TypeDefinition val = type.Resolve();
		if (val == null)
		{
			return null;
		}
		MethodDefinition val2 = ((IEnumerable<MethodDefinition>)val.Methods).SingleOrDefault((Func<MethodDefinition, bool>)((MethodDefinition m) => m.IsConstructor && ((MethodReference)m).Parameters.Count == 0 && !m.IsStatic));
		if (val2 == null)
		{
			return DefaultCtorFor(val.BaseType);
		}
		return new MethodReference(".ctor", ((MemberReference)type).Module.TypeSystem.Void, type)
		{
			HasThis = true
		};
	}

	public static void Patch(AssemblyDefinition assembly)
	{
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Expected O, but got Unknown
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Expected O, but got Unknown
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Expected O, but got Unknown
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Expected O, but got Unknown
		try
		{
			ModuleDefinition mainModule = assembly.MainModule;
			TypeDefinition val = ((IEnumerable<TypeDefinition>)mainModule.Types).First((TypeDefinition t) => ((MemberReference)t).FullName == "BlueprintData");
			TypeDefinition val2 = ((IEnumerable<TypeDefinition>)mainModule.Types).First((TypeDefinition t) => ((MemberReference)t).FullName == "AssemblerComponent");
			TypeDefinition val3 = ((IEnumerable<TypeDefinition>)mainModule.Types).First((TypeDefinition t) => ((MemberReference)t).FullName == "LabComponent");
			val.Fields.Add(new FieldDefinition("anchorType", (FieldAttributes)6, mainModule.ImportReference(typeof(int))));
			val.Fields.Add(new FieldDefinition("autoReformMode", (FieldAttributes)6, mainModule.ImportReference(typeof(int))));
			val2.Fields.Add(new FieldDefinition("recipeIsLocked", (FieldAttributes)6, mainModule.ImportReference(typeof(bool))));
			val3.Fields.Add(new FieldDefinition("recipeIsLocked", (FieldAttributes)6, mainModule.ImportReference(typeof(bool))));
			logSource.LogInfo((object)"Preloader patching is successful!");
		}
		catch (Exception)
		{
			logSource.LogError((object)"Preloader patching failed!");
			throw;
		}
	}
}

plugins/BlueprintTweaks.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Threading;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using BlueprintTweaks.BlueprintBrowserUIChanges;
using BlueprintTweaks.BlueprintDataSaveEdit;
using BlueprintTweaks.BrowserRememberFolder;
using BlueprintTweaks.DragToMoveBlueprints;
using BlueprintTweaks.FactoryUndo;
using BlueprintTweaks.FactoryUndo.Nebula;
using BlueprintTweaks.GlobalPatch;
using BlueprintTweaks.KeepBPName;
using BlueprintTweaks.Nebula;
using BlueprintTweaks.Patches;
using CommonAPI;
using CommonAPI.Systems;
using CommonAPI.Systems.ModLocalization;
using HarmonyLib;
using NebulaAPI;
using NebulaAPI.GameState;
using NebulaAPI.Interfaces;
using NebulaAPI.Networking;
using NebulaAPI.Packets;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("BlueprintTweaks")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+5d9927f8b94b47d54266ca4c5da71038871c90fc")]
[assembly: AssemblyProduct("BlueprintTweaks")]
[assembly: AssemblyTitle("BlueprintTweaks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace BlueprintTweaks
{
	[HarmonyPatch]
	public static class BuildTool_BlueprintPastePatch
	{
		[HarmonyPatch(typeof(BuildTool_BlueprintPaste), "CheckBuildConditions")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: 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)
			//IL_0027: Expected O, but got Unknown
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Expected O, but got Unknown
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Expected O, but got Unknown
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Expected O, but got Unknown
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Expected O, but got Unknown
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).End().MatchBack(false, (CodeMatch[])(object)new CodeMatch[2]
			{
				new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldflda, (object)AccessTools.Field(typeof(BuildTool_BlueprintPaste), "cursorTarget"), (string)null)
			});
			CodeMatcher val2 = val.Clone().MatchForward(false, (CodeMatch[])(object)new CodeMatch[3]
			{
				new CodeMatch((OpCode?)OpCodes.Ldloc_S, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldc_I4_S, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Stfld, (object)AccessTools.Field(typeof(BuildPreview), "condition"), (string)null)
			});
			object operand = val2.Operand;
			val.Advance(1);
			while (!CodeInstructionExtensions.IsStloc(val.Instruction, (LocalBuilder)null))
			{
				val.RemoveInstruction();
			}
			val.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
			{
				new CodeInstruction(OpCodes.Ldloc_S, operand)
			}).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { Transpilers.EmitDelegate<Func<BuildTool_BlueprintPaste, BuildPreview, Vector3>>((Func<BuildTool_BlueprintPaste, BuildPreview, Vector3>)((BuildTool_BlueprintPaste tool, BuildPreview preview) => ((Vector3)(ref preview.lpos)).normalized * Mathf.Min(((BuildTool)tool).planet.realRadius * 0.025f, 20f))) });
			return val.InstructionEnumeration();
		}
	}
	[HarmonyPatch]
	public static class PlayerControllerPatch
	{
		[HarmonyPatch(typeof(PlayerController), "OpenBlueprintCopyMode")]
		[HarmonyPatch(typeof(PlayerController), "OpenBlueprintPasteMode")]
		[HarmonyPatch(typeof(BuildTool_BlueprintCopy), "DetermineActive")]
		[HarmonyPatch(typeof(BuildTool_BlueprintPaste), "CheckBuildConditionsPrestage")]
		[HarmonyPatch(typeof(BuildTool_BlueprintPaste), "DetermineActive")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> RemoveGasGiantBlocks(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Expected O, but got Unknown
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Expected O, but got Unknown
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(true, (CodeMatch[])(object)new CodeMatch[1]
			{
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(PlanetData), "gasItems"), (string)null)
			}).Advance(1).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
			{
				new CodeInstruction(OpCodes.Pop, (object)null)
			})
				.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
				{
					new CodeInstruction(OpCodes.Ldc_I4_0, (object)null)
				})
				.MatchForward(true, (CodeMatch[])(object)new CodeMatch[1]
				{
					new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(PlanetData), "gasItems"), (string)null)
				})
				.Advance(2)
				.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
				{
					new CodeInstruction(OpCodes.Pop, (object)null)
				})
				.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1]
				{
					new CodeInstruction(OpCodes.Ldc_I4_0, (object)null)
				});
			return val.InstructionEnumeration();
		}

		[HarmonyPatch(typeof(BuildTool_BlueprintCopy), "UpdateRaycast")]
		[HarmonyPatch(typeof(BuildTool_BlueprintPaste), "UpdateRaycast")]
		[HarmonyTranspiler]
		public static IEnumerable<CodeInstruction> ChangeCastDistance(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: 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_002b: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
			{
				new CodeMatch((OpCode?)OpCodes.Ldc_R4, (object)800f, (string)null)
			}).SetInstruction(Transpilers.EmitDelegate<Func<float>>((Func<float>)(() => GameCamera.instance.blueprintPoser.planetRadius * 2.4f)));
			return val.InstructionEnumeration();
		}

		[HarmonyPatch(typeof(PlayerController), "OpenBlueprintPasteMode")]
		[HarmonyPrefix]
		public static bool CheckBpForGasGiants(PlayerController __instance, BlueprintData blueprint)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Invalid comparison between Unknown and I4
			if (GameMain.history.blueprintLimit == 0)
			{
				return false;
			}
			if (blueprint == null)
			{
				blueprint = __instance.actionBuild.blueprintClipboard;
			}
			if (BlueprintData.IsNullOrEmpty(blueprint))
			{
				return false;
			}
			if (BlueprintTweaksPlugin.genesisBookIsInstalled)
			{
				PlanetData localPlanet = __instance.gameData.localPlanet;
				if (localPlanet == null || (int)localPlanet.type != 5)
				{
					return true;
				}
			}
			else if (__instance.gameData.localPlanet?.gasItems == null || __instance.gameData.localPlanet.gasItems.Length == 0)
			{
				return true;
			}
			BlueprintBuilding[] buildings = blueprint.buildings;
			foreach (BlueprintBuilding val in buildings)
			{
				ItemProto val2 = ((ProtoSet<ItemProto>)(object)LDB.items).Select((int)val.itemId);
				if (!val2.BuildInGas)
				{
					UIRealtimeTip.Popup(Localization.Translate("CantPasteThisInGasGiantWarn"), true, 0);
					return false;
				}
			}
			return true;
		}

		[HarmonyPatch(typeof(PlayerController), "OpenBlueprintCopyMode")]
		[HarmonyPatch(typeof(PlayerController), "OpenBlueprintPasteMode")]
		[HarmonyPostfix]
		public static void OnBPOpenOnGasGiants(PlayerController __instance)
		{
			GameCamera.instance.blueprintPoser.planetRadius = __instance.gameData.localPlanet.realRadius;
		}
	}
	[BepInPlugin("org.kremnev8.plugin.BlueprintTweaks", "Blueprint Tweaks", "1.6.10")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[CommonAPISubmoduleDependency(new string[] { "ProtoRegistry", "CustomKeyBindSystem", "PickerExtensionsSystem", "LocalizationModule" })]
	public class BlueprintTweaksPlugin : BaseUnityPlugin, IMultiplayerMod
	{
		public const string MODNAME = "BlueprintTweaks";

		public const string MODGUID = "org.kremnev8.plugin.BlueprintTweaks";

		public const string MOD_DISP_NAME = "Blueprint Tweaks";

		public const string VERSION = "1.6.10";

		public const string GENESIS_BOOK_MODGUID = "org.LoShin.GenesisBook";

		public const string FREE_FOUNDATIONS_GUID = "de.Hotte.DSP.FreeFoundations";

		public const string FREE_FOUNDATIONS_GUID_2 = "com.aekoch.mods.dsp.UnlimitedFoundations";

		public const string DRAG_REMOVE = "DragRemove";

		public const string BLUEPRINT_FOUNDATIONS = "BlueprintFoundations";

		public const string PASTE_LOCKED = "PasteLocked";

		public const string FACTORY_UNDO = "FactoryUndo";

		public static ManualLogSource logger;

		public static ResourceData resource;

		internal static ConfigFile configFile;

		private static Harmony harmony;

		public static DragRemoveBuildTool tool;

		public static bool gotPluginInfo;

		public static bool freeFoundationsIsInstalled;

		public static bool genesisBookIsInstalled;

		public static ConfigEntry<bool> cameraToggleEnabled;

		public static ConfigEntry<bool> addPasteButtonEnabled;

		public static ConfigEntry<bool> recipeChangeEnabled;

		public static ConfigEntry<bool> changeTierEnabled;

		public static ConfigEntry<bool> logisticCargoChangeEnabled;

		public static ConfigEntry<bool> beltHintsChangeEnable;

		public static ConfigEntry<bool> keepBlueprintDesc;

		public static ConfigEntry<bool> keepBrowserPath;

		public static ConfigEntry<bool> forcePasteEnabled;

		public static ConfigEntry<bool> axisLockEnabled;

		public static ConfigEntry<bool> gridControlFeature;

		public static ConfigEntry<bool> blueprintMirroring;

		public static ConfigEntry<bool> dragRemove;

		public static ConfigEntry<bool> pasteLocked;

		public static ConfigEntry<bool> moveWithDragNDrop;

		public static ConfigEntry<bool> factoryUndo;

		public static ConfigEntry<bool> resetFunctionsOnMenuExit;

		public static ConfigEntry<bool> canBlueprintOnGasGiants;

		public static ConfigEntry<bool> excludeStations;

		public static ConfigEntry<bool> undoExcludeStations;

		public static ConfigEntry<int> undoMaxHistory;

		public static ConfigEntry<bool> showUndoClearedMessage;

		private static bool appliedBlueprintDataPatch = false;

		internal static List<PressKeyBind> modKeybinds = new List<PressKeyBind>();

		public string Version => "1.6.10";

		private void Awake()
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Expected O, but got Unknown
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			logger = ((BaseUnityPlugin)this).Logger;
			configFile = ((BaseUnityPlugin)this).Config;
			LoadConfigs();
			((BaseUnityPlugin)this).Config.Save();
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			resource = new ResourceData("BlueprintTweaks", "blueprinttweaks", directoryName);
			resource.LoadAssetBundle("blueprinttweaks");
			ProtoRegistry.AddResource(resource);
			string text = Path.Combine(directoryName, "Locale");
			LocalizationModule.LoadTranslationsFromFolder(text);
			harmony = new Harmony("org.kremnev8.plugin.BlueprintTweaks");
			if (factoryUndo.Value)
			{
				UndoManager.Init();
			}
			UIBlueprintInspectorPatch.Init();
			BlueprintUtilsPatch2.Init();
			RegisterKeyBinds();
			NebulaModAPI.RegisterPackets(Assembly.GetExecutingAssembly());
			if (factoryUndo.Value)
			{
				HarmonyRegisterExtension.PatchAll(harmony, "FactoryUndo");
			}
			if (keepBrowserPath.Value)
			{
				harmony.PatchAll(typeof(BlueprintTweaks.BrowserRememberFolder.UIBlueprintBrowser_Patch));
			}
			if (moveWithDragNDrop.Value)
			{
				harmony.PatchAll(typeof(BuildTool_Copy_Patch));
				harmony.PatchAll(typeof(BlueprintTweaks.DragToMoveBlueprints.UIBlueprintBrowser_Patch));
			}
			if (keepBlueprintDesc.Value)
			{
				harmony.PatchAll(typeof(BlueprintTweaks.KeepBPName.UIBlueprintInspectorPatch));
			}
			if (pasteLocked.Value)
			{
				HarmonyRegisterExtension.PatchAll(harmony, "PasteLocked");
			}
			if (addPasteButtonEnabled.Value)
			{
				harmony.PatchAll(typeof(UIBlueprintBrowserPatch));
			}
			if (blueprintMirroring.Value)
			{
				harmony.PatchAll(typeof(BlueprintUtilsPatch2));
			}
			if (dragRemove.Value)
			{
				HarmonyRegisterExtension.PatchAll(harmony, "DragRemove");
			}
			if (changeTierEnabled.Value)
			{
				harmony.PatchAll(typeof(UIBlueprintComponentItemPatch));
			}
			if (canBlueprintOnGasGiants.Value)
			{
				harmony.PatchAll(typeof(PlayerControllerPatch));
				harmony.PatchAll(typeof(BuildTool_BlueprintPastePatch));
			}
			if (axisLockEnabled.Value || gridControlFeature.Value)
			{
				harmony.PatchAll(typeof(GridSnappingPatches));
				harmony.PatchAll(typeof(BuildTool_BlueprintPaste_Patch));
				ApplyBlueprintDataPatch();
			}
			if (cameraToggleEnabled.Value)
			{
				harmony.PatchAll(typeof(CameraFixPatch));
			}
			if (recipeChangeEnabled.Value || gridControlFeature.Value)
			{
				harmony.PatchAll(typeof(UIBlueprintInspectorPatch));
			}
			_ = forcePasteEnabled.Value;
			harmony.PatchAll(typeof(BuildTool_BlueprintPaste_Patch_3));
			logger.LogInfo((object)"Blueprint tweaks mod is initialized!");
		}

		private void LoadConfigs()
		{
			cameraToggleEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "cameraToggle", true, "Allows toggling camera between 3rd person and god view\nAll values are applied on restart");
			addPasteButtonEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "addBluprintPasteButton", true, "If enabled new button will be added to Blueprint Browser. Pressing it will paste curretly selected blueprint\nAll values are applied on restart");
			recipeChangeEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "recipeChange", true, "Add recipe change panel to blueprint inspectors\nAll values are applied on restart");
			logisticCargoChangeEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "changeLogisticCargo", true, "Allows changing cargo requested/provided by logistic stations");
			changeTierEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "changeTier", true, "Allows using change tier functionality\nAll values are applied on restart");
			beltHintsChangeEnable = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "beltHintChange", true, "Add belt hint change panel to blueprint inspectors\nAll values are applied on restart");
			keepBlueprintDesc = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "keepBlueprintDescription", true, "When pasting blueprint string into existing blueprint you can hold shift to keep description and icons");
			keepBrowserPath = ((BaseUnityPlugin)this).Config.Bind<bool>("Interface", "keepBroserPath", true, "Preserve last open Blueprint Browser directory. Also when creating new blueprints, they will be saved in the last open directory");
			forcePasteEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "forcePaste", true, "Allow to force paste using Shift+Click");
			axisLockEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "axisLock", true, "Allows using Latitude/Longtitude axis locks\nAll values are applied on restart");
			gridControlFeature = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "gridControl", true, "Allows changing grid size and its offset\nAll values are applied on restart");
			blueprintMirroring = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "blueprintMirroring", true, "Allows mirroring Blueprints\nAll values are applied on restart");
			dragRemove = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "dragRemove", true, "Allows using drag remove function\nAll values are applied on restart");
			pasteLocked = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "PasteLockedRecipes", true, "Allow pasting assemblers with recipes which have not been unlocked yet. Assemblers with recipes that are not unlocked will not work.");
			moveWithDragNDrop = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "moveBPWithDragNDrop", true, "Allow moving blueprints using drag and drop");
			factoryUndo = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "factoryUndo", true, "Enable Factory Undo feature. Allows to undo/redo most building actions. Will force dragRemove to true");
			resetFunctionsOnMenuExit = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "resetOnExit", true, "If enabled when you exit build mode, some functions (Axis/Grid lock, Mirror) will reset their state");
			canBlueprintOnGasGiants = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "bpOnGasGiants", true, "Allow using Blueprints on Gas Giants\nAll values are applied on restart");
			excludeStations = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "excludeStations", true, "When using drag remove tool, logistic stations (and miners Mk.II) will not get removed. This is a safeguard against errors which occur most of the time when you try to mass dismantle logistic stations.");
			undoMaxHistory = ((BaseUnityPlugin)this).Config.Bind<int>("Misc", "undoMaxHistory", 50, "Defines undo history size. When history reaches it's capacity, old entries will get removed. When using Nebula host controls the used value");
			undoExcludeStations = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "undoExcludeStations", true, "When enabled factory undo will not undo/redo actions with logistic stations.");
			showUndoClearedMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "showUndoClearedMessage", true, "Should a message informing you that undo history has been cleared be shown whenever you leave a planet?");
			ConfigFileExtension.MigrateConfig<bool>(((BaseUnityPlugin)this).Config, "General", "Interface", new string[4] { "cameraToggle", "recipeChange", "changeLogisticCargo", "changeTier" });
			ConfigFileExtension.MigrateConfig<bool>(((BaseUnityPlugin)this).Config, "General", "Features", new string[5] { "forcePaste", "axisLock", "gridControl", "gridControl", "blueprintFoundations" });
			ConfigFileExtension.MigrateConfig<bool>(((BaseUnityPlugin)this).Config, "General", "Misc", new string[1] { "bpOnGasGiants" });
			if (factoryUndo.Value)
			{
				dragRemove.Value = true;
			}
		}

		private static void RegisterKeyBinds()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: 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)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: 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_00d1: 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)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: 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_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: 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_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0260: 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)
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_029a: Unknown result type (might be due to invalid IL or missing references)
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
			if (cameraToggleEnabled.Value)
			{
				modKeybinds.Add(CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(new BuiltinKey
				{
					key = new CombineKey(106, (byte)0, (ECombineKeyAction)0, false),
					conflictGroup = 3071,
					name = "ToggleBPGodModeDesc",
					canOverride = true
				}));
			}
			if (forcePasteEnabled.Value)
			{
				modKeybinds.Add((PressKeyBind)(object)CustomKeyBindSystem.RegisterKeyBindWithReturn<HoldKeyBind>(new BuiltinKey
				{
					key = new CombineKey(0, (byte)1, (ECombineKeyAction)0, false),
					conflictGroup = 2052,
					name = "ForceBPPlace",
					canOverride = true
				}));
			}
			if (axisLockEnabled.Value)
			{
				modKeybinds.Add(CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(new BuiltinKey
				{
					key = new CombineKey(103, (byte)2, (ECombineKeyAction)0, false),
					conflictGroup = 2052,
					name = "LockLongAxis",
					canOverride = true
				}));
				modKeybinds.Add(CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(new BuiltinKey
				{
					key = new CombineKey(116, (byte)2, (ECombineKeyAction)0, false),
					conflictGroup = 2052,
					name = "LockLatAxis",
					canOverride = true
				}));
			}
			if (gridControlFeature.Value)
			{
				modKeybinds.Add(CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(new BuiltinKey
				{
					key = new CombineKey(98, (byte)2, (ECombineKeyAction)0, false),
					conflictGroup = 2052,
					name = "SetLocalOffset",
					canOverride = true
				}));
			}
			if (blueprintMirroring.Value)
			{
				modKeybinds.Add(CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(new BuiltinKey
				{
					key = new CombineKey(103, (byte)1, (ECombineKeyAction)0, false),
					conflictGroup = 2052,
					name = "MirrorLongAxis",
					canOverride = true
				}));
				modKeybinds.Add(CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(new BuiltinKey
				{
					key = new CombineKey(116, (byte)1, (ECombineKeyAction)0, false),
					conflictGroup = 2052,
					name = "MirrorLatAxis",
					canOverride = true
				}));
			}
			if (factoryUndo.Value)
			{
				BuiltinKey val = default(BuiltinKey);
				val.key = new CombineKey(122, (byte)2, (ECombineKeyAction)0, false);
				val.conflictGroup = 2052;
				val.name = "FactoryUndo";
				val.canOverride = true;
				CustomKeyBindSystem.RegisterKeyBind<PressKeyBind>(val);
				val = default(BuiltinKey);
				val.key = new CombineKey(122, (byte)1, (ECombineKeyAction)0, false);
				val.conflictGroup = 2052;
				val.name = "FactoryRedo";
				val.canOverride = true;
				CustomKeyBindSystem.RegisterKeyBind<PressKeyBind>(val);
			}
		}

		private void Update()
		{
			if (!gotPluginInfo)
			{
				if (Chainloader.PluginInfos.ContainsKey("de.Hotte.DSP.FreeFoundations"))
				{
					freeFoundationsIsInstalled = true;
				}
				if (Chainloader.PluginInfos.ContainsKey("com.aekoch.mods.dsp.UnlimitedFoundations"))
				{
					freeFoundationsIsInstalled = true;
				}
				if (Chainloader.PluginInfos.ContainsKey("org.LoShin.GenesisBook"))
				{
					genesisBookIsInstalled = true;
				}
				gotPluginInfo = true;
			}
			if (!GameMain.isRunning || GameMain.localPlanet == null)
			{
				return;
			}
			if (factoryUndo.Value)
			{
				if (CustomKeyBindSystem.GetKeyBind("FactoryUndo").keyValue)
				{
					UndoManager.TryUndo();
				}
				if (CustomKeyBindSystem.GetKeyBind("FactoryRedo").keyValue)
				{
					UndoManager.TryRedo();
				}
			}
			if (cameraToggleEnabled.Value && CustomKeyBindSystem.GetKeyBind("ToggleBPGodModeDesc").keyValue)
			{
				CameraFixPatch.mode = !CameraFixPatch.mode;
			}
			if (axisLockEnabled.Value && CustomKeyBindSystem.GetKeyBind("LockLongAxis").keyValue)
			{
				GridSnappingPatches.LockLongitude();
			}
			if (axisLockEnabled.Value && CustomKeyBindSystem.GetKeyBind("LockLatAxis").keyValue)
			{
				GridSnappingPatches.LockLatitude();
			}
			if (gridControlFeature.Value && CustomKeyBindSystem.GetKeyBind("SetLocalOffset").keyValue)
			{
				GridSnappingPatches.SetOffset();
			}
			_ = forcePasteEnabled.Value;
			if (blueprintMirroring.Value && CustomKeyBindSystem.GetKeyBind("MirrorLongAxis").keyValue)
			{
				BlueprintUtilsPatch2.mirrorLong = !BlueprintUtilsPatch2.mirrorLong;
				BlueprintUtilsPatch2.UpdateBlueprintDisplay();
			}
			if (blueprintMirroring.Value && CustomKeyBindSystem.GetKeyBind("MirrorLatAxis").keyValue)
			{
				BlueprintUtilsPatch2.mirrorLat = !BlueprintUtilsPatch2.mirrorLat;
				BlueprintUtilsPatch2.UpdateBlueprintDisplay();
			}
		}

		private void PrintKeyDebugInfo()
		{
			HashSet<KeyCode> source = new HashSet<KeyCode>((KeyCode[])Enum.GetValues(typeof(KeyCode)));
			string text = GeneralExtensions.Join<string>(from code in source
				select Input.GetKeyDown(code) ? ((object)(KeyCode)(ref code)).ToString() : "" into s
				where !string.IsNullOrEmpty(s)
				select s, (Func<string, string>)null, " ");
			string text2 = GeneralExtensions.Join<string>(from code in source
				select Input.GetKey(code) ? ((object)(KeyCode)(ref code)).ToString() : "" into s
				where !string.IsNullOrEmpty(s)
				select s, (Func<string, string>)null, " ");
			logger.LogInfo((object)("Key Debug Info: down: " + text + ", pressed: " + text2));
		}

		public static void RegisterCustomBlueprintDataSerializer<T>(string key) where T : ICustomBlueprintDataSerializer, new()
		{
			ApplyBlueprintDataPatch();
			if (BlueprintData_Patch_2.customSerializers.ContainsKey(key))
			{
				logger.LogError((object)("Failed to register custom blueprint data serializer with key '" + key + "' and type " + typeof(T).FullName + ", because the key has been already taken!"));
			}
			else
			{
				T val = new T();
				BlueprintData_Patch_2.customSerializers.Add(key, val);
				logger.LogInfo((object)("Registered custom blueprint data serializer with key '" + key + "'"));
			}
		}

		private static void ApplyBlueprintDataPatch()
		{
			if (!appliedBlueprintDataPatch)
			{
				harmony.PatchAll(typeof(BlueprintData_Patch_2));
				appliedBlueprintDataPatch = true;
			}
		}

		public bool CheckVersion(string hostVersion, string clientVersion)
		{
			return hostVersion.Equals(clientVersion);
		}
	}
	public class CustomWindowData
	{
		public UIBlueprintPanel[] panels;

		public RectTransform mainPane;
	}
	public abstract class UIBlueprintPanel : MonoBehaviour
	{
		[HideInInspector]
		public UIBlueprintInspector inspector;

		[HideInInspector]
		public RectTransform panelTrs;

		public abstract int verticalSize { get; }

		public virtual void Create(UIBlueprintInspector inspector)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			this.inspector = inspector;
			panelTrs = (RectTransform)((Component)this).transform;
		}

		public void RefreshUI()
		{
			if (inspector.blueprint != null && inspector.blueprint.isValid)
			{
				OnUpdate();
			}
		}

		public virtual void OnOpen()
		{
		}

		public virtual void OnUpdate()
		{
		}
	}
	public class UIBlueprintRecipeItem : MonoBehaviour
	{
		[HideInInspector]
		public UIRecipesPanel panel;

		public RectTransform rectTrans;

		public UIButton button;

		public Image iconImage;

		private int recipeId;

		private ERecipeType recipeFilter;

		private const int kMargin = 0;

		private const int kWidth = 46;

		private const int kHeight = 46;

		private const int kColCount = 8;

		public int position
		{
			get
			{
				//IL_0006: 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)
				return Mathf.RoundToInt(rectTrans.anchoredPosition.x / 46f) + Mathf.RoundToInt((0f - rectTrans.anchoredPosition.y) / 46f) * 8;
			}
			set
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				rectTrans.anchoredPosition = new Vector2((float)(value % 8 * 46), (float)(-(value / 8 * 46)));
			}
		}

		public void Create(UIRecipesPanel panel)
		{
			this.panel = panel;
			button.onClick += OnClick;
		}

		public void Free()
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			button.onClick -= OnClick;
			recipeId = 0;
			button.tips.itemId = 0;
			button.data = 0;
			iconImage.sprite = null;
			((Graphic)iconImage).color = Color.clear;
		}

		public void Open()
		{
			((Component)this).gameObject.SetActive(true);
		}

		public void Close()
		{
			button.tips.itemId = 0;
			button.data = 0;
			recipeId = 0;
			((Component)this).gameObject.SetActive(false);
		}

		public int SetDisplay(int newIndex, int recipeID)
		{
			//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_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			position = newIndex;
			if (recipeId != recipeID)
			{
				recipeId = recipeID;
				button.data = recipeId;
				RecipeProto val = ((ProtoSet<RecipeProto>)(object)LDB.recipes).Select(recipeID);
				button.tips.itemId = 0;
				button.tips.tipTitle = "";
				button.tips.tipText = "";
				if (val != null)
				{
					button.tips.itemId = val.Results[0];
					recipeFilter = val.Type;
					iconImage.sprite = val.iconSprite;
					((Graphic)iconImage).color = Color.white;
				}
				else if (recipeID < 0)
				{
					recipeFilter = (ERecipeType)(-recipeID);
					string arg = Localization.Translate($"{recipeFilter}RecipeKind");
					button.tips.tipTitle = string.Format(Localization.Translate("SelectEmptyRecipeTitle"), arg);
					button.tips.tipText = string.Format(Localization.Translate("SelectEmptyRecipeText"), arg);
					iconImage.sprite = UIRecipesPanel.noRecipeIcon;
					((Graphic)iconImage).color = Color.white;
				}
				else
				{
					iconImage.sprite = null;
					((Graphic)iconImage).color = Color.clear;
				}
			}
			return (newIndex / 8 + 1) * 46;
		}

		private void OnClick(int obj)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: 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)
			VFAudio.Create("ui-click-0", (Transform)null, Vector3.zero, true, 1, -1, -1L);
			Vector2 val = default(Vector2);
			((Vector2)(ref val))..ctor(-300f, 238f);
			UIRecipePicker.Close();
			UIRecipePicker.Popup(val, (Action<RecipeProto>)delegate(RecipeProto proto)
			{
				if (proto != null)
				{
					panel.ChangeRecipe(recipeId, proto);
				}
			}, recipeFilter);
		}
	}
	public class UIBPComponentPanel : UIBlueprintPanel
	{
		public override int verticalSize
		{
			get
			{
				if (inspector.componentCount == 0)
				{
					return 22;
				}
				return 22 + ((inspector.componentCount - 1) / 8 + 1) * 46;
			}
		}

		public override void Create(UIBlueprintInspector inspector)
		{
			base.Create(inspector);
			panelTrs = inspector.group2;
		}
	}
	public class UIBPReformsPanel : UIBlueprintPanel
	{
		public override int verticalSize
		{
			get
			{
				if (inspector.blueprint.reformData.reformCount == 0)
				{
					return 0;
				}
				return 68;
			}
		}

		public override void Create(UIBlueprintInspector inspector)
		{
			base.Create(inspector);
			panelTrs = inspector.group4;
		}
	}
	public class UIBPStringCopyPanel : UIBlueprintPanel
	{
		public override int verticalSize => 110;

		public override void Create(UIBlueprintInspector inspector)
		{
			base.Create(inspector);
			panelTrs = inspector.group3;
		}
	}
	public class UIHintItem : MonoBehaviour
	{
		[HideInInspector]
		public UIHintsPanel panel;

		public RectTransform rectTrans;

		public UIButton button;

		public Image iconImage;

		public Text countText;

		private HintData currentHint;

		private const int kMargin = 0;

		private const int kWidth = 46;

		private const int kHeight = 46;

		private const int kColCount = 8;

		public int position
		{
			get
			{
				//IL_0006: 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)
				return Mathf.RoundToInt(rectTrans.anchoredPosition.x / 46f) + Mathf.RoundToInt((0f - rectTrans.anchoredPosition.y) / 46f) * 8;
			}
			set
			{
				//IL_0015: Unknown result type (might be due to invalid IL or missing references)
				rectTrans.anchoredPosition = new Vector2((float)(value % 8 * 46), (float)(-(value / 8 * 46)));
			}
		}

		public void Create(UIHintsPanel panel)
		{
			this.panel = panel;
			button.onClick += OnClick;
		}

		public void Free()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			button.onClick -= OnClick;
			currentHint = default(HintData);
			button.tips.itemId = 0;
			button.data = 0;
			iconImage.sprite = null;
			((Graphic)iconImage).color = Color.clear;
			countText.text = "";
		}

		public void Open()
		{
			((Component)this).gameObject.SetActive(true);
		}

		public void Close()
		{
			button.tips.itemId = 0;
			button.data = 0;
			currentHint = default(HintData);
			((Component)this).gameObject.SetActive(false);
		}

		public int SetDisplay(int newIndex, HintData newHint)
		{
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			position = newIndex;
			if (!object.Equals(currentHint, newHint))
			{
				currentHint = newHint;
				button.data = currentHint.signalId;
				Sprite val = LDB.signals.IconSprite(currentHint.signalId);
				if ((Object)(object)val != (Object)null)
				{
					button.tips.itemId = currentHint.signalId;
					iconImage.sprite = val;
					((Graphic)iconImage).color = Color.white;
				}
				else
				{
					iconImage.sprite = null;
					((Graphic)iconImage).color = Color.clear;
				}
				countText.text = ((newHint.value != 0) ? newHint.value.ToString() : "");
			}
			return (newIndex / 8 + 1) * 46;
		}

		private void OnClick(int obj)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			VFAudio.Create("ui-click-0", (Transform)null, Vector3.zero, true, 1, -1, -1L);
			Vector2 val = default(Vector2);
			((Vector2)(ref val))..ctor(-300f, 238f);
			UISignalPicker.Close();
			UINumberPickerExtension.Popup(val, (Action<int, int>)delegate(int signalId, int value)
			{
				if (value < 0)
				{
					value = 0;
				}
				panel.ChangeHint(currentHint.signalId, new HintData(signalId, value));
			}, currentHint.value, currentHint.signalId, (Func<int, bool>)null);
		}
	}
	public struct HintData
	{
		public int signalId;

		public int value;

		public HintData(int signalId, int value)
		{
			this.signalId = signalId;
			this.value = value;
		}
	}
	public class UIHintsPanel : UIBlueprintPanel
	{
		public List<UIHintItem> hintsItems = new List<UIHintItem>();

		public List<HintData> tmpHintList = new List<HintData>();

		public int hintsCount;

		public UIHintItem prefab;

		public override int verticalSize
		{
			get
			{
				if (hintsCount == 0)
				{
					return 22;
				}
				return 22 + ((hintsCount - 1) / 8 + 1) * 46;
			}
		}

		public override void OnUpdate()
		{
			tmpHintList.Clear();
			BlueprintBuilding[] buildings = inspector.blueprint.buildings;
			foreach (BlueprintBuilding val in buildings)
			{
				int itemId = val.itemId;
				ItemProto val2 = ((ProtoSet<ItemProto>)(object)LDB.items).Select(itemId);
				if (val2 == null || !val2.prefabDesc.isBelt || val.parameters == null || val.parameters.Length < 1)
				{
					continue;
				}
				int signalId = val.parameters[0];
				if (signalId != 0)
				{
					int count = 0;
					if (val.parameters.Length >= 2)
					{
						count = val.parameters[1];
					}
					if (!tmpHintList.Any((HintData data) => data.signalId == signalId && data.value == count))
					{
						tmpHintList.Add(new HintData(signalId, count));
					}
				}
			}
			int num = 0;
			foreach (HintData tmpHint in tmpHintList)
			{
				SetItem(num, tmpHint);
				num++;
			}
			ClearComponentItems(num);
		}

		public void SetItem(int index, HintData itemId)
		{
			if (index >= 0 && index <= 256)
			{
				while (index >= hintsItems.Count)
				{
					UIHintItem uIHintItem = Object.Instantiate<UIHintItem>(prefab, ((Component)prefab).transform.parent);
					uIHintItem.Create(this);
					hintsItems.Add(uIHintItem);
				}
				hintsItems[index].SetDisplay(index, itemId);
				hintsItems[index].Open();
			}
		}

		public void ClearComponentItems(int activeCount = 0)
		{
			for (int i = activeCount; i < hintsItems.Count; i++)
			{
				hintsItems[i].Close();
			}
			hintsCount = activeCount;
		}

		public void ChangeHint(int oldSignalId, HintData newSignal)
		{
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Invalid comparison between Unknown and I4
			BlueprintBuilding[] buildings = inspector.blueprint.buildings;
			foreach (BlueprintBuilding val in buildings)
			{
				int itemId = val.itemId;
				ItemProto val2 = ((ProtoSet<ItemProto>)(object)LDB.items).Select(itemId);
				if (val2.prefabDesc.isBelt && val.parameters != null && val.parameters.Length >= 1 && val.parameters[0] == oldSignalId)
				{
					val.parameters[0] = newSignal.signalId;
					if (val.parameters.Length >= 2)
					{
						val.parameters[1] = newSignal.value;
					}
					else if (newSignal.value != 0)
					{
						val.parameters = new int[2] { newSignal.signalId, newSignal.value };
					}
				}
			}
			if ((int)inspector.usage == 2)
			{
				inspector.pasteBuildTool.ResetStates();
			}
			inspector.Refresh(true, true, true, false);
		}
	}
	public class UIKeybindHintsPanel : UIBlueprintPanel
	{
		public ConfigEntry<bool> isCollapsed;

		public int currentSize = 22;

		public Text collapseText;

		public Text hintText;

		public override int verticalSize => currentSize;

		private void Awake()
		{
			isCollapsed = BlueprintTweaksPlugin.configFile.Bind<bool>("Runtime", "KeyBindHints_IsCollapsed", true, "This is a runtime option. You don't need to change it here, it can be altered ingame!");
		}

		public override void OnOpen()
		{
			OnUpdate();
		}

		public override void OnUpdate()
		{
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
			currentSize = 22;
			string text = Localization.Translate("KeyHintsCollapseText");
			string text2 = (isCollapsed.Value ? "▶" : "▼");
			collapseText.text = text2 + " " + text;
			if (isCollapsed.Value)
			{
				hintText.text = "";
				return;
			}
			StringBuilder stringBuilder = new StringBuilder();
			foreach (PressKeyBind modKeybind in BlueprintTweaksPlugin.modKeybinds)
			{
				CombineKey val = modKeybind.defaultBind.key;
				if (!((CombineKey)(ref VFInput.override_keys[modKeybind.defaultBind.id])).IsNull())
				{
					val = VFInput.override_keys[modKeybind.defaultBind.id];
				}
				string text3 = "KEY" + modKeybind.defaultBind.name;
				stringBuilder.Append(string.Format(Localization.Translate("KeyHintsPress"), ((object)(CombineKey)(ref val)).ToString(), Localization.Translate(text3)));
				stringBuilder.Append('\n');
				currentSize += 22;
			}
			hintText.text = stringBuilder.ToString();
		}

		public void OnCollapseClicked()
		{
			isCollapsed.Value = !isCollapsed.Value;
			inspector.Refresh(true, true, true, false);
		}
	}
	public class UIRecipesPanel : UIBlueprintPanel
	{
		public List<UIBlueprintRecipeItem> recipeItems = new List<UIBlueprintRecipeItem>();

		public List<int> tmpRecipeList = new List<int>();

		public int recipeCount;

		public UIBlueprintRecipeItem prefab;

		public static Sprite noRecipeIcon;

		public override int verticalSize
		{
			get
			{
				if (recipeCount == 0)
				{
					return 22;
				}
				return 22 + ((recipeCount - 1) / 8 + 1) * 46;
			}
		}

		private void Awake()
		{
			noRecipeIcon = Resources.Load<Sprite>("ui/textures/sprites/icons/select-recipe");
		}

		public override void OnUpdate()
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unsupported input type for neg.
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected I4, but got Unknown
			tmpRecipeList.Clear();
			BlueprintBuilding[] buildings = inspector.blueprint.buildings;
			foreach (BlueprintBuilding val in buildings)
			{
				int num = val.recipeId;
				if (num == 0)
				{
					ItemProto val2 = ((ProtoSet<ItemProto>)(object)LDB.items).Select((int)val.itemId);
					if (val2.prefabDesc != null)
					{
						num = 0 - val2.prefabDesc.assemblerRecipeType;
						if (val2.prefabDesc.isLab && val.parameters.Length != 0 && val.parameters[0] != 2)
						{
							num = -15;
						}
					}
				}
				if (num != 0 && !tmpRecipeList.Contains(num))
				{
					tmpRecipeList.Add(num);
				}
			}
			int num2 = 0;
			foreach (int tmpRecipe in tmpRecipeList)
			{
				SetItem(num2, tmpRecipe);
				num2++;
			}
			ClearComponentItems(num2);
		}

		public void SetItem(int index, int recipeId)
		{
			if (index >= 0 && index <= 256)
			{
				while (index >= recipeItems.Count)
				{
					UIBlueprintRecipeItem uIBlueprintRecipeItem = Object.Instantiate<UIBlueprintRecipeItem>(prefab, ((Component)prefab).transform.parent);
					uIBlueprintRecipeItem.Create(this);
					recipeItems.Add(uIBlueprintRecipeItem);
				}
				recipeItems[index].SetDisplay(index, recipeId);
				recipeItems[index].Open();
			}
		}

		public void ClearComponentItems(int activeCount = 0)
		{
			for (int i = activeCount; i < recipeItems.Count; i++)
			{
				recipeItems[i].Close();
			}
			recipeCount = activeCount;
		}

		public void ChangeRecipe(int oldRecipe, RecipeProto newRecipe)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Invalid comparison between Unknown and I4
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Invalid comparison between Unknown and I4
			BlueprintBuilding[] buildings = inspector.blueprint.buildings;
			if (oldRecipe < 0)
			{
				ERecipeType val = (ERecipeType)(-oldRecipe);
				BlueprintBuilding[] array = buildings;
				foreach (BlueprintBuilding val2 in array)
				{
					if (val2.recipeId != 0)
					{
						continue;
					}
					ItemProto val3 = ((ProtoSet<ItemProto>)(object)LDB.items).Select((int)val2.itemId);
					if (val3.prefabDesc != null)
					{
						if (val3.prefabDesc.assemblerRecipeType == val)
						{
							val2.recipeId = ((Proto)newRecipe).ID;
						}
						else if (val3.prefabDesc.isLab && (int)val == 15 && val2.parameters.Length != 0 && val2.parameters[0] != 2)
						{
							val2.recipeId = ((Proto)newRecipe).ID;
							val2.parameters[0] = 1;
						}
					}
				}
			}
			else
			{
				BlueprintBuilding[] array2 = buildings;
				foreach (BlueprintBuilding val4 in array2)
				{
					if (val4.recipeId == oldRecipe)
					{
						val4.recipeId = ((Proto)newRecipe).ID;
					}
				}
			}
			if ((int)inspector.usage == 2)
			{
				inspector.pasteBuildTool.ResetStates();
			}
			inspector.Refresh(true, true, true, false);
		}
	}
	[HarmonyPatch]
	public static class UIBlueprintComponentItemPatch
	{
		[HarmonyPatch(typeof(UIBlueprintComponentItem), "_OnRegEvent")]
		[HarmonyPostfix]
		public static void AddEvent(UIBlueprintComponentItem __instance)
		{
			__instance.button.onClick += GetAction(__instance.inspector);
		}

		[HarmonyPatch(typeof(UIBlueprintComponentItem), "_OnUnregEvent")]
		[HarmonyPostfix]
		public static void RemoveEvent(UIBlueprintComponentItem __instance)
		{
			__instance.button.onClick -= GetAction(__instance.inspector);
		}

		public static Action<int> GetAction(UIBlueprintInspector inspector)
		{
			return OnClick;
			void OnClick(int itemId)
			{
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				UIItemPickerExtension.Popup(new Vector2(-300f, 238f), (Action<ItemProto>)delegate(ItemProto proto)
				{
					if (proto != null)
					{
						SetBuildings(inspector, itemId, proto);
					}
				}, (Func<ItemProto, bool>)((ItemProto proto) => proto.Upgrades?.Contains(itemId) ?? false));
			}
		}

		public static void SetBuildings(UIBlueprintInspector inspector, int oldItemId, ItemProto newItem)
		{
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Invalid comparison between Unknown and I4
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Invalid comparison between Unknown and I4
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Invalid comparison between Unknown and I4
			BlueprintBuilding[] buildings = inspector.blueprint.buildings;
			foreach (BlueprintBuilding val in buildings)
			{
				if (val.itemId == oldItemId)
				{
					val.itemId = (short)((Proto)newItem).ID;
					val.modelIndex = (short)newItem.ModelIndex;
				}
			}
			if ((int)inspector.usage == 0 || (int)inspector.usage == 2)
			{
				if ((int)inspector.usage == 2)
				{
					inspector.pasteBuildTool.ResetStates();
				}
			}
			else if ((int)inspector.usage == 1)
			{
				_ = ((BuildTool)inspector.copyBuildTool).active;
			}
			inspector.Refresh(true, true, true, false);
		}
	}
	[HarmonyPatch]
	public static class UIBlueprintInspectorPatch
	{
		public static Dictionary<UIBlueprintInspector, CustomWindowData> panelData = new Dictionary<UIBlueprintInspector, CustomWindowData>();

		public static List<string> panelPrefabs = new List<string>();

		public static void Init()
		{
			if (BlueprintTweaksPlugin.gridControlFeature.Value)
			{
				panelPrefabs.Add("assets/blueprinttweaks/ui/panels/grid-size-panel.prefab");
			}
			panelPrefabs.Add("assets/blueprinttweaks/ui/panels/component-panel.prefab#ReformOverride");
			panelPrefabs.Add("assets/blueprinttweaks/ui/panels/component-panel.prefab");
			if (BlueprintTweaksPlugin.recipeChangeEnabled.Value)
			{
				panelPrefabs.Add("assets/blueprinttweaks/ui/panels/recipe-panel.prefab");
			}
			if (BlueprintTweaksPlugin.logisticCargoChangeEnabled.Value)
			{
				panelPrefabs.Add("Assets/BlueprintTweaks/UI/panels/transport-panel.prefab");
			}
			if (BlueprintTweaksPlugin.beltHintsChangeEnable.Value)
			{
				panelPrefabs.Add("Assets/BlueprintTweaks/UI/panels/hints-group.prefab");
			}
			panelPrefabs.Add("assets/blueprinttweaks/ui/panels/string-copy-panel.prefab");
			panelPrefabs.Add("Assets/BlueprintTweaks/UI/panels/keybind-hints-panel.prefab");
		}

		[HarmonyPatch(typeof(UIBlueprintBrowser), "_OnCreate")]
		[HarmonyPostfix]
		public static void OnCreateBrowser(UIBlueprintBrowser __instance)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: 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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			RectTransform val = (RectTransform)((Component)__instance).transform;
			val.sizeDelta = new Vector2(val.sizeDelta.x + 22f, val.sizeDelta.y);
			RectTransform val2 = (RectTransform)((Transform)val).Find("inspector-group-bg");
			val2.sizeDelta = new Vector2(val2.sizeDelta.x + 22f, val2.sizeDelta.y);
		}

		[HarmonyPatch(typeof(UIBlueprintInspector), "_OnCreate")]
		[HarmonyPostfix]
		public static void OnCreateInspector(UIBlueprintInspector __instance)
		{
			//IL_00a4: 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_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bc: Expected O, but got Unknown
			if (panelData == null || panelData.ContainsKey(__instance))
			{
				return;
			}
			GameObject val = BlueprintTweaksPlugin.resource.bundle.LoadAsset<GameObject>("assets/blueprinttweaks/ui/bp-panel-scroll.prefab");
			GameObject val2 = Object.Instantiate<GameObject>(val, (Transform)(object)__instance.rectTrans, false);
			GameObject gameObject = ((Component)val2.transform.Find("Viewport/pane")).gameObject;
			((Transform)__instance.group1).SetParent(gameObject.transform, false);
			((Transform)__instance.group2).SetParent(gameObject.transform, false);
			((Transform)__instance.group3).SetParent(gameObject.transform, false);
			((Transform)__instance.group4).SetParent(gameObject.transform, false);
			RectTransform rectTrans = __instance.rectTrans;
			rectTrans.sizeDelta = new Vector2(rectTrans.sizeDelta.x + 16f, rectTrans.sizeDelta.y);
			UIBlueprintPanel[] array = new UIBlueprintPanel[panelPrefabs.Count];
			for (int i = 0; i < panelPrefabs.Count; i++)
			{
				string text = panelPrefabs[i];
				string text2 = "";
				string[] array2 = text.Split(new char[1] { '#' });
				if (array2.Length == 2)
				{
					text = array2[0];
					text2 = array2[1];
				}
				GameObject val3 = BlueprintTweaksPlugin.resource.bundle.LoadAsset<GameObject>(text);
				GameObject val4 = Object.Instantiate<GameObject>(val3, gameObject.transform, false);
				UIBlueprintPanel uIBlueprintPanel = val4.GetComponent<UIBlueprintPanel>();
				if (text2 == "ReformOverride")
				{
					Object.DestroyImmediate((Object)(object)uIBlueprintPanel);
					uIBlueprintPanel = val4.AddComponent<UIBPReformsPanel>();
				}
				uIBlueprintPanel.Create(__instance);
				array[i] = uIBlueprintPanel;
			}
			((Component)__instance.group1).transform.SetAsLastSibling();
			CustomWindowData value = new CustomWindowData
			{
				panels = array,
				mainPane = (RectTransform)gameObject.transform
			};
			panelData.Add(__instance, value);
		}

		[HarmonyPatch(typeof(UIBlueprintInspector), "_OnOpen")]
		[HarmonyPostfix]
		public static void OnOpen(UIBlueprintInspector __instance)
		{
			if (panelData != null && panelData.ContainsKey(__instance))
			{
				UIBlueprintPanel[] panels = panelData[__instance].panels;
				UIBlueprintPanel[] array = panels;
				foreach (UIBlueprintPanel uIBlueprintPanel in array)
				{
					uIBlueprintPanel.OnOpen();
				}
			}
		}

		[HarmonyPatch(typeof(UIBlueprintInspector), "Refresh")]
		[HarmonyPostfix]
		public static void OnRefresh(UIBlueprintInspector __instance, bool refreshComponent)
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: 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_00bf: Unknown result type (might be due to invalid IL or missing references)
			if (panelData == null || !panelData.ContainsKey(__instance))
			{
				return;
			}
			UIBlueprintPanel[] panels = panelData[__instance].panels;
			RectTransform mainPane = panelData[__instance].mainPane;
			int num = Mathf.RoundToInt((__instance.descTextInput.preferredHeight - 0.1f) / 2f) * 2;
			if (num < 38)
			{
				num = 38;
			}
			int num2 = num + 136;
			int num3 = (((int)__instance.usage == 0) ? 18 : 24);
			int num4 = num2 + num3;
			UIBlueprintPanel[] array = panels;
			foreach (UIBlueprintPanel uIBlueprintPanel in array)
			{
				try
				{
					uIBlueprintPanel.RefreshUI();
					int verticalSize = uIBlueprintPanel.verticalSize;
					uIBlueprintPanel.panelTrs.anchoredPosition = new Vector2(uIBlueprintPanel.panelTrs.anchoredPosition.x, (float)(-num4));
					num4 += verticalSize + num3;
					((Component)uIBlueprintPanel).gameObject.SetActive(true);
				}
				catch (Exception arg)
				{
					((Component)uIBlueprintPanel).gameObject.SetActive(false);
					BlueprintTweaksPlugin.logger.LogWarning((object)$"Failed to update {((object)uIBlueprintPanel).GetType().Name}:\n{arg}");
				}
			}
			mainPane.sizeDelta = new Vector2(mainPane.sizeDelta.x, (float)num4);
		}
	}
	[HarmonyPatch]
	public static class CameraFixPatch
	{
		public static bool mode;

		[HarmonyPatch(typeof(GameCamera), "Logic")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> FixCamera(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Expected O, but got Unknown
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(true, (CodeMatch[])(object)new CodeMatch[2]
			{
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(PlayerController), "actionBuild"), (string)null),
				new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(PlayerAction_Build), "get_blueprintMode", (Type[])null, (Type[])null), (string)null)
			}).MatchForward(true, (CodeMatch[])(object)new CodeMatch[3]
			{
				new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldc_I4_4, (object)null, (string)null)
			}).SetInstruction(Transpilers.EmitDelegate<Func<int>>((Func<int>)(() => (!mode) ? 1 : 4)));
			return val.InstructionEnumeration();
		}

		[HarmonyPatch(typeof(PlayerMove_Drift), "GameTick")]
		[HarmonyPatch(typeof(PlayerMove_Fly), "GameTick")]
		[HarmonyPatch(typeof(PlayerMove_Walk), "GameTick")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> FixMovement(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Expected O, but got Unknown
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(true, (CodeMatch[])(object)new CodeMatch[4]
			{
				new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(PlayerController), "actionBuild"), (string)null),
				new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(PlayerAction_Build), "get_blueprintMode", (Type[])null, (Type[])null), (string)null),
				new CodeMatch((OpCode?)OpCodes.Ldc_I4_0, (object)null, (string)null),
				new CodeMatch((OpCode?)OpCodes.Cgt_Un, (object)null, (string)null)
			}).Advance(1).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { Transpilers.EmitDelegate<Func<bool, bool>>((Func<bool, bool>)((bool isBp) => isBp && mode)) });
			return val.InstructionEnumeration();
		}
	}
	public class DragRemoveBuildTool : BuildTool
	{
		public bool castTerrain;

		public bool castGround;

		public Vector3 castGroundPos = Vector3.zero;

		public Vector3 castGroundPosSnapped = Vector3.zero;

		public int castObjectId;

		public Vector3 castObjectPos;

		public bool cursorValid;

		public Vector3 cursorTarget;

		public Vector3 startGroundPosSnapped = Vector3.zero;

		public Vector3 lastGroundPosSnapped = Vector3.zero;

		public BPGratBox selectGratBox = BPGratBox.zero;

		public BPGratBox lastSelectGratBox = BPGratBox.zero;

		public BPGratBox selectArcBox = BPGratBox.zero;

		public HashSet<int> selectObjIds;

		public HashSet<int> edgeObjIds;

		public BuildPreview[] bpPool;

		public AnimData[] animPool;

		public ComputeBuffer animBuffer;

		public int bpCursor = 1;

		private int bpPoolCapacity;

		private int[] bpRecycle;

		private int bpRecycleCursor;

		private List<int> _tmp_int_list;

		public bool isSelecting;

		private UIMessageBox dismantleQueryBox;

		private bool waitingForPlayerInput;

		public int segment => base.planet.aux.activeGrid?.segment ?? 200;

		public override void _OnInit()
		{
			selectObjIds = new HashSet<int>();
			edgeObjIds = new HashSet<int>();
			SetDisplayPreviewCapacity(256);
			waitingForPlayerInput = false;
		}

		public override void _OnFree()
		{
			selectObjIds = null;
			edgeObjIds = null;
			FreeBuildPreviews();
			waitingForPlayerInput = false;
		}

		public override void _OnOpen()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: 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_0051: 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)
			//IL_0053: 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_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			ClearSelection();
			ResetBuildPreviews();
			castTerrain = false;
			castGround = false;
			castGroundPos = Vector3.zero;
			startGroundPosSnapped = (lastGroundPosSnapped = (castGroundPosSnapped = Vector3.zero));
			lastSelectGratBox = (selectGratBox = (selectArcBox = BPGratBox.zero));
			castObjectId = 0;
			castObjectPos = Vector3.zero;
			cursorValid = false;
			cursorTarget = Vector3.zero;
			isSelecting = false;
			waitingForPlayerInput = false;
		}

		public override void _OnClose()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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)
			//IL_001c: 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)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: 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_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			DismantleQueryRemove();
			ClearSelection();
			ResetBuildPreviews();
			startGroundPosSnapped = (lastGroundPosSnapped = (castGroundPosSnapped = Vector3.zero));
			lastSelectGratBox = (selectGratBox = (selectArcBox = BPGratBox.zero));
			castObjectId = 0;
			castObjectPos = Vector3.zero;
			cursorValid = false;
			cursorTarget = Vector3.zero;
			waitingForPlayerInput = false;
		}

		public override void _OnTick(long time)
		{
			UpdateRaycast();
			Operating();
			if (((BuildTool)this).active)
			{
				((BuildTool)this).UpdatePreviewModels(((BuildTool)this).actionBuild.model);
			}
		}

		public override bool DetermineActive()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			if ((int)((BuildTool)this).actionBuild.blueprintMode != 0)
			{
				return false;
			}
			if (((BuildTool)this).controller.cmd.mode == -1)
			{
				return ((BuildTool)this).actionBuild.dismantleTool.cursorType == 2;
			}
			return false;
		}

		public void UpdateRaycast()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0373: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0378: 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_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Invalid comparison between Unknown and I4
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Invalid comparison between Unknown and I4
			//IL_01eb: 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_00ca: 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)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: 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_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: 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_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Invalid comparison between Unknown and I4
			//IL_024c: 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_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_0278: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: 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)
			//IL_0286: Unknown result type (might be due to invalid IL or missing references)
			//IL_0288: Unknown result type (might be due to invalid IL or missing references)
			//IL_028d: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Unknown result type (might be due to invalid IL or missing references)
			//IL_029b: 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_02b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c7: 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_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02df: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f5: 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_02fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_032e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0333: Unknown result type (might be due to invalid IL or missing references)
			//IL_0322: Unknown result type (might be due to invalid IL or missing references)
			//IL_0327: Unknown result type (might be due to invalid IL or missing references)
			castTerrain = false;
			castGround = false;
			castGroundPos = Vector3.zero;
			castGroundPosSnapped = Vector3.zero;
			castObjectId = 0;
			castObjectPos = Vector3.zero;
			cursorValid = false;
			cursorTarget = Vector3.zero;
			if (!VFInput.onGUI && VFInput.inScreen)
			{
				RaycastHit val = default(RaycastHit);
				castGround = Physics.Raycast(base.mouseRay, ref val, 800f, 8720, (QueryTriggerInteraction)2);
				if (castGround)
				{
					Layer val2 = (Layer)((Component)((RaycastHit)(ref val)).collider).gameObject.layer;
					castTerrain = (int)val2 == 9 || (int)val2 == 4;
					castGroundPos = (((BuildTool)this).controller.cmd.test = (((BuildTool)this).controller.cmd.target = ((RaycastHit)(ref val)).point));
					castGroundPosSnapped = ((BuildTool)this).actionBuild.planetAux.Snap(castGroundPos, castTerrain);
					castGroundPosSnapped = ((Vector3)(ref castGroundPosSnapped)).normalized * (base.planet.realRadius + 0.2f);
					((BuildTool)this).controller.cmd.test = castGroundPosSnapped;
					Vector3 normalized = ((Vector3)(ref castGroundPosSnapped)).normalized;
					if (Physics.Raycast(new Ray(castGroundPosSnapped + normalized * 10f, -normalized), ref val, 20f, 8720, (QueryTriggerInteraction)2))
					{
						((BuildTool)this).controller.cmd.test = ((RaycastHit)(ref val)).point;
					}
					cursorTarget = castGroundPosSnapped;
					cursorValid = true;
				}
				int castAllCount = ((BuildTool)this).controller.cmd.raycast.castAllCount;
				RaycastData[] castAll = ((BuildTool)this).controller.cmd.raycast.castAll;
				int num = 0;
				for (int i = 0; i < castAllCount; i++)
				{
					if ((int)castAll[i].objType == 0 || (int)castAll[i].objType == 3)
					{
						num = (((int)castAll[i].objType == 0) ? castAll[i].objId : (-castAll[i].objId));
						break;
					}
				}
				if (num != 0)
				{
					castObjectId = num;
					castObjectPos = ((BuildTool)this).GetObjectPose(num).position;
					cursorTarget = castObjectPos;
					((BuildTool)this).controller.cmd.test = castObjectPos;
					castGroundPosSnapped = (castGroundPos = castObjectPos);
					castGroundPosSnapped = ((Vector3)(ref castGroundPosSnapped)).normalized * (base.planet.realRadius + 0.2f);
					((BuildTool)this).controller.cmd.test = castGroundPosSnapped;
					Vector3 normalized2 = ((Vector3)(ref castGroundPosSnapped)).normalized;
					if (Physics.Raycast(new Ray(castGroundPosSnapped + normalized2 * 10f, -normalized2), ref val, 20f, 8720, (QueryTriggerInteraction)2))
					{
						((BuildTool)this).controller.cmd.test = ((RaycastHit)(ref val)).point;
					}
					cursorTarget = castGroundPosSnapped;
					cursorValid = true;
				}
			}
			((BuildTool)this).controller.cmd.state = (cursorValid ? 1 : 0);
			((BuildTool)this).controller.cmd.target = (cursorValid ? cursorTarget : Vector3.zero);
		}

		public void Operating()
		{
			//IL_0050: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: 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_0011: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: 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_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			if (waitingForPlayerInput)
			{
				return;
			}
			if (!isSelecting && VFInput.blueprintCopyOperate0.onDown && cursorValid)
			{
				isSelecting = true;
				startGroundPosSnapped = castGroundPosSnapped;
				lastGroundPosSnapped = startGroundPosSnapped;
				InitSelectGratBox();
				VFInput.UseMouseLeft();
			}
			Vector3 val = castGroundPosSnapped - startGroundPosSnapped;
			bool flag = ((Vector3)(ref val)).sqrMagnitude > 0.01f;
			bool flag2 = VFInput.blueprintCopyOperate0.onDown || VFInput.blueprintCopyOperate1.onDown;
			if (isSelecting && ((flag2 && cursorValid) || (VFInput.blueprintCopyOperate0.onUp && castObjectId != 0 && !flag)))
			{
				CheckDismantle();
				if (waitingForPlayerInput)
				{
					return;
				}
				ResetBuildPreviews();
				isSelecting = false;
				VFInput.UseMouseLeft();
				VFInput.UseEnterConfirm();
			}
			else if (isSelecting && VFInput.rtsCancel.onUp)
			{
				isSelecting = false;
				startGroundPosSnapped = castGroundPosSnapped;
				lastGroundPosSnapped = startGroundPosSnapped;
				ClearSelection();
				ResetBuildPreviews();
			}
			if (isSelecting)
			{
				DetermineSelectGratBox();
				if (lastSelectGratBox != selectGratBox)
				{
					DetermineAddSelection();
					lastSelectGratBox = selectGratBox;
				}
			}
			else
			{
				startGroundPosSnapped = castGroundPosSnapped;
				ReDeterminePreviews();
			}
			if (flag)
			{
				ReDeterminePreviews();
			}
		}

		public void CheckDismantle()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: 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_00d3: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Expected O, but got Unknown
			//IL_00ba: Expected O, but got Unknown
			//IL_015a: 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_0137: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Expected O, but got Unknown
			//IL_0141: Expected O, but got Unknown
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Expected O, but got Unknown
			//IL_01be: Expected O, but got Unknown
			foreach (int selectObjId in selectObjIds)
			{
				PrefabDesc prefabDesc = ((BuildTool)this).GetPrefabDesc(selectObjId);
				if (!BuildTool_Dismantle.showDemolishContainerQuery || selectObjId <= 0)
				{
					continue;
				}
				EntityData val = base.factory.entityPool[selectObjId];
				if (prefabDesc.isStorage)
				{
					int storageId = val.storageId;
					if (!base.factory.factoryStorage.TryTakeBackItems_Storage(((BuildTool)this).player.package, storageId))
					{
						dismantleQueryBox = UIMessageBox.Show(Localization.Translate("拆除储物仓标题"), Localization.Translate("拆除储物仓文字"), Localization.Translate("否"), Localization.Translate("是"), 0, new Response(DismantleQueryCancel), new Response(DismantleQueryConfirm));
						waitingForPlayerInput = true;
						return;
					}
				}
				if (prefabDesc.isTank)
				{
					int tankId = val.tankId;
					if (!base.factory.factoryStorage.TryTakeBackItems_Tank(((BuildTool)this).player.package, tankId))
					{
						dismantleQueryBox = UIMessageBox.Show(Localization.Translate("拆除储液罐标题"), Localization.Translate("拆除储液罐文字"), Localization.Translate("否"), Localization.Translate("是"), 0, new Response(DismantleQueryCancel), new Response(DismantleQueryConfirm));
						waitingForPlayerInput = true;
						return;
					}
				}
				if (prefabDesc.isStation)
				{
					int stationId = val.stationId;
					if (base.factory.transport.stationPool[stationId] != null)
					{
						dismantleQueryBox = UIMessageBox.Show(Localization.Translate("拆除物流站标题"), Localization.Translate("拆除物流站文字"), Localization.Translate("否"), Localization.Translate("是"), 0, new Response(DismantleQueryCancel), new Response(DismantleQueryConfirm));
						waitingForPlayerInput = true;
						return;
					}
				}
			}
			DismantleAction();
		}

		public void DismantleAction()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			RemoveHelper.SwitchDelete(base.factory, selectObjIds.ToList(), edgeObjIds.ToList());
			VFAudio.Create("demolish-large", (Transform)null, GameMain.mainPlayer.position, true, 5, -1, -1L);
			ClearSelection();
			isSelecting = false;
			waitingForPlayerInput = false;
		}

		public void DismantleQueryCancel()
		{
			ClearSelection();
			dismantleQueryBox = null;
			waitingForPlayerInput = false;
		}

		public void DismantleQueryConfirm()
		{
			DismantleAction();
			dismantleQueryBox = null;
		}

		public void DismantleQueryRemove()
		{
			if ((Object)(object)dismantleQueryBox != (Object)null)
			{
				dismantleQueryBox.OnButton1Click();
				dismantleQueryBox = null;
			}
			waitingForPlayerInput = false;
		}

		private void InitSelectGratBox()
		{
			//IL_0006: 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_001d: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
			BlueprintUtils.GetMinimumGratBox(((Vector3)(ref startGroundPosSnapped)).normalized, ref selectGratBox);
			selectArcBox = selectGratBox;
			if (selectArcBox.y >= 1.5707864f)
			{
				selectArcBox.y = (selectArcBox.w = (float)Math.PI / 2f);
				selectArcBox.z = selectArcBox.x + (float)Math.PI * 200f;
			}
			else if (selectArcBox.y <= -1.5707864f)
			{
				selectArcBox.y = (selectArcBox.w = -(float)Math.PI / 2f);
				selectArcBox.z = selectArcBox.x + (float)Math.PI * 200f;
			}
			lastSelectGratBox = selectGratBox;
		}

		public void DetermineSelectGratBox()
		{
			//IL_0011: 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)
			//IL_0033: 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_02e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0317: Unknown result type (might be due to invalid IL or missing references)
			//IL_031c: Unknown result type (might be due to invalid IL or missing references)
			if (!cursorValid)
			{
				return;
			}
			float longitudeRad = BlueprintUtils.GetLongitudeRad(((Vector3)(ref castGroundPosSnapped)).normalized);
			float longitudeRad2 = BlueprintUtils.GetLongitudeRad(((Vector3)(ref lastGroundPosSnapped)).normalized);
			float latitudeRad = BlueprintUtils.GetLatitudeRad(((Vector3)(ref castGroundPosSnapped)).normalized);
			bool flag = latitudeRad >= 1.5707864f || latitudeRad <= -1.5707864f;
			float num = (flag ? 0f : (longitudeRad - longitudeRad2));
			num = Mathf.Repeat(num + (float)Math.PI, (float)Math.PI * 2f) - (float)Math.PI;
			((BPGratBox)(ref selectArcBox)).endLongitudeRad = ((BPGratBox)(ref selectArcBox)).endLongitudeRad + num;
			((BPGratBox)(ref selectArcBox)).endLatitudeRad = latitudeRad;
			selectGratBox = selectArcBox;
			selectGratBox.x = ((selectArcBox.x < selectArcBox.z) ? selectArcBox.x : selectArcBox.z);
			selectGratBox.z = ((selectArcBox.x > selectArcBox.z) ? selectArcBox.x : selectArcBox.z);
			if (selectArcBox.x < selectArcBox.z)
			{
				if (selectGratBox.z > selectGratBox.x + (float)Math.PI * 2f - 1E-05f - 4E-06f)
				{
					selectGratBox.z = selectGratBox.x + (float)Math.PI * 2f - 1E-05f - 4E-06f;
				}
				selectGratBox.z = Mathf.Repeat(selectGratBox.z + (float)Math.PI, (float)Math.PI * 2f) - (float)Math.PI;
			}
			else
			{
				if (selectGratBox.x < selectGratBox.z - (float)Math.PI * 2f + 1E-05f + 4E-06f)
				{
					selectGratBox.x = selectGratBox.z - (float)Math.PI * 2f + 1E-05f + 4E-06f;
				}
				selectGratBox.x = Mathf.Repeat(selectGratBox.x + (float)Math.PI, (float)Math.PI * 2f) - (float)Math.PI;
			}
			selectGratBox.y = ((selectArcBox.y < selectArcBox.w) ? selectArcBox.y : selectArcBox.w);
			selectGratBox.w = ((selectArcBox.y > selectArcBox.w) ? selectArcBox.y : selectArcBox.w);
			float num2 = BlueprintUtils.GetLongitudeRadPerGrid((Mathf.Abs(castGroundPosSnapped.y) < Mathf.Abs(startGroundPosSnapped.y)) ? ((Vector3)(ref castGroundPosSnapped)).normalized : ((Vector3)(ref startGroundPosSnapped)).normalized, 200) * 0.33f;
			((BPGratBox)(ref selectGratBox)).Extend(num2, 0.002f);
			if (!flag)
			{
				lastGroundPosSnapped = castGroundPosSnapped;
			}
		}

		public void DetermineAddSelection()
		{
			//IL_0106: 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_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			int segmentCount = 200;
			PlanetData localPlanet = GameMain.localPlanet;
			object obj;
			if (localPlanet == null)
			{
				obj = null;
			}
			else
			{
				PlanetAuxData aux = localPlanet.aux;
				obj = ((aux != null) ? aux.activeGrid : null);
			}
			if (obj != null)
			{
				segmentCount = GameMain.localPlanet.aux.activeGrid.segment;
			}
			selectObjIds.Clear();
			edgeObjIds.Clear();
			if (Mathf.Abs(selectArcBox.x - selectArcBox.z) < 0.01f && Mathf.Abs(selectArcBox.y - selectArcBox.w) < 0.01f && castObjectId != 0)
			{
				if (ShouldAddObject(castObjectId))
				{
					selectObjIds.Add(castObjectId);
				}
			}
			else
			{
				EntityData[] entityPool = base.factory.entityPool;
				int entityCursor = base.factory.entityCursor;
				for (int i = 1; i < entityCursor; i++)
				{
					int num = i;
					if (entityPool[i].id == i && ((BPGratBox)(ref selectGratBox)).InGratBox(entityPool[i].pos) && ShouldAddObject(num))
					{
						selectObjIds.Add(num);
						if (selectGratBox.IsOnEdgeOfGratBox(entityPool[i].pos, segmentCount))
						{
							edgeObjIds.Add(num);
						}
					}
				}
				PrebuildData[] prebuildPool = base.factory.prebuildPool;
				int prebuildCursor = base.factory.prebuildCursor;
				for (int j = 1; j < prebuildCursor; j++)
				{
					int num2 = -j;
					if (prebuildPool[j].id == j && ((BPGratBox)(ref selectGratBox)).InGratBox(prebuildPool[j].pos) && ShouldAddObject(num2))
					{
						selectObjIds.Add(num2);
						if (selectGratBox.IsOnEdgeOfGratBox(prebuildPool[j].pos, segmentCount))
						{
							edgeObjIds.Add(num2);
						}
					}
				}
			}
			DetermineChainSelection();
			DeterminePreviews();
		}

		public bool ShouldAddObject(int objId)
		{
			PrefabDesc prefabDesc = ((BuildTool)this).GetPrefabDesc(objId);
			if (prefabDesc.isStation)
			{
				return !BlueprintTweaksPlugin.excludeStations.Value;
			}
			if (prefabDesc.isInserter)
			{
				return ((BuildTool)this).actionBuild.dismantleTool.filterInserter;
			}
			if (prefabDesc.isBelt)
			{
				return ((BuildTool)this).actionBuild.dismantleTool.filterBelt;
			}
			return ((BuildTool)this).actionBuild.dismantleTool.filterFacility;
		}

		public void DetermineChainSelection()
		{
			if (!VFInput._chainReaction)
			{
				return;
			}
			if (_tmp_int_list == null)
			{
				_tmp_int_list = new List<int>();
			}
			_tmp_int_list.Clear();
			bool flag = default(bool);
			int num2 = default(int);
			int num3 = default(int);
			foreach (int selectObjId in selectObjIds)
			{
				int num = ((BuildTool)this).GetPrefabDesc(selectObjId).slotPoses.Length;
				if (num <= 0)
				{
					continue;
				}
				for (int i = 0; i < num; i++)
				{
					base.factory.ReadObjectConn(selectObjId, i, ref flag, ref num2, ref num3);
					if (num2 != 0)
					{
						_tmp_int_list.Add(num2);
					}
				}
			}
			foreach (int item in _tmp_int_list)
			{
				if (ShouldAddObject(item))
				{
					selectObjIds.Add(item);
				}
			}
			_tmp_int_list.Clear();
		}

		public void ClearSelection()
		{
			//IL_0019: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			selectObjIds.Clear();
			edgeObjIds.Clear();
			lastSelectGratBox = (selectGratBox = (selectArcBox = BPGratBox.zero));
		}

		public void ReDeterminePreviews()
		{
			ResetBuildPreviews();
			foreach (int selectObjId in selectObjIds)
			{
				BuildPreview buildPreview = GetBuildPreview(selectObjId);
				AddBPGPUIModel(buildPreview);
			}
			if (castObjectId != 0)
			{
				BuildPreview buildPreview2 = GetBuildPreview(castObjectId);
				AddBPGPUIModel(buildPreview2);
			}
			SyncAnimBuffer();
			base.planet.factoryModel.bpgpuiManager.animBuffer = animBuffer;
			base.planet.factoryModel.bpgpuiManager.SyncAllGPUBuffer();
		}

		public void DeterminePreviews()
		{
			HashSet<int> hashSet = new HashSet<int>(selectObjIds);
			for (int i = 1; i < bpCursor; i++)
			{
				BuildPreview val = bpPool[i];
				if (val == null || val.bpgpuiModelId <= 0)
				{
					continue;
				}
				if (!selectObjIds.Contains(val.objId))
				{
					if (val.bpgpuiModelInstIndex >= 0)
					{
						base.planet.factoryModel.bpgpuiManager.RemoveBuildPreviewModel(val.desc.modelIndex, val.bpgpuiModelInstIndex, false);
					}
					RemoveBuildPreview(i);
				}
				else
				{
					hashSet.Remove(val.objId);
				}
			}
			foreach (int item in hashSet)
			{
				BuildPreview buildPreview = GetBuildPreview(item);
				AddBPGPUIModel(buildPreview);
			}
			if (castObjectId != 0)
			{
				BuildPreview buildPreview2 = GetBuildPreview(castObjectId);
				AddBPGPUIModel(buildPreview2);
			}
			SyncAnimBuffer();
			base.planet.factoryModel.bpgpuiManager.animBuffer = animBuffer;
			base.planet.factoryModel.bpgpuiManager.SyncAllGPUBuffer();
		}

		public override void UpdatePreviewModels(BuildModel model)
		{
			//IL_008e: 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_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: 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)
			for (int i = 1; i < bpCursor; i++)
			{
				BuildPreview val = bpPool[i];
				if (val == null || val.bpgpuiModelId <= 0 || !val.isConnNode)
				{
					continue;
				}
				if (val.objId > 0)
				{
					base.factory.cargoTraffic.SetBeltSelected(base.factory.entityPool[val.objId].beltId);
				}
				else
				{
					uint beltSpeed = (uint)val.desc.beltSpeed;
					if (val.outputObjId == 0 || val.inputObjId == 0 || val.coverbp != null)
					{
						model.connRenderer.AddBlueprintBeltMajorPoint(val.lpos, val.lrot, beltSpeed);
					}
					else
					{
						model.connRenderer.AddBlueprintBeltPoint(val.lpos, val.lrot, beltSpeed);
					}
				}
				model.connRenderer.AddXSign(val.lpos, val.lrot);
			}
		}

		public void AddBPGPUIModel(BuildPreview preview)
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: 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)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			if (preview == null || preview.bpgpuiModelId <= 0 || !preview.needModel)
			{
				return;
			}
			ModelProto val = ((ProtoSet<ModelProto>)(object)LDB.models).Select(preview.desc.modelIndex);
			Color32 copyErrorColor = Configs.builtin.copyErrorColor;
			if (val.RendererType == 2)
			{
				bool flag = default(bool);
				bool flag2 = default(bool);
				((BuildTool)this).GetInserterT1T2(preview.objId, ref flag, ref flag2);
				if (preview.objId > 0)
				{
					animPool[preview.bpgpuiModelId] = base.factory.entityAnimPool[preview.objId];
				}
				animPool[preview.bpgpuiModelId].state = (uint)((copyErrorColor.r << 24) + (copyErrorColor.g << 16) + (copyErrorColor.b << 8) + copyErrorColor.a);
				base.planet.factoryModel.bpgpuiManager.AddBuildPreviewModel(preview.desc.modelIndex, ref preview.bpgpuiModelInstIndex, preview.bpgpuiModelId, preview.lpos, preview.lrot, preview.lpos2, preview.lrot2, flag ? 1 : 0, flag2 ? 1 : 0, false);
				return;
			}
			if (val.RendererType == 3)
			{
				bool flag3 = default(bool);
				int num = default(int);
				int num2 = default(int);
				base.factory.ReadObjectConn(preview.objId, 14, ref flag3, ref num, ref num2);
				if (preview.objId > 0)
				{
					animPool[preview.bpgpuiModelId] = base.factory.entityAnimPool[preview.objId];
				}
				animPool[preview.bpgpuiModelId].state = (uint)((copyErrorColor.r << 24) + (copyErrorColor.g << 16) + (copyErrorColor.b << 8) + copyErrorColor.a);
				base.planet.factoryModel.bpgpuiManager.AddBuildPreviewModel(preview.desc.modelIndex, ref preview.bpgpuiModelInstIndex, preview.bpgpuiModelId, preview.lpos, preview.lrot, (num != 0) ? 1u : 0u, false);
				return;
			}
			if (preview.objId > 0)
			{
				animPool[preview.bpgpuiModelId] = base.factory.entityAnimPool[preview.objId];
			}
			animPool[preview.bpgpuiModelId].state = (uint)((copyErrorColor.r << 24) + (copyErrorColor.g << 16) + (copyErrorColor.b << 8) + copyErrorColor.a);
			if (preview.objId > 0 && preview.desc.isEjector)
			{
				animPool[preview.bpgpuiModelId].power = base.factory.factorySystem.ejectorPool[base.factory.entityPool[preview.objId].ejectorId].localDir.z;
			}
			base.planet.factoryModel.bpgpuiManager.AddBuildPreviewModel(preview.desc.modelIndex, ref preview.bpgpuiModelInstIndex, preview.bpgpuiModelId, preview.lpos, preview.lrot, false);
		}

		public void GeneratePreviewByObjId(BuildPreview preview, int objId)
		{
			//IL_001f: 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_0032: 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_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: 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_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: 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_0141: Unknown result type (might be due to inval