Decompiled source of SphereEditorTools v2.2.3

SphereEditorTools.dll

Decompiled 9 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("SphereEditorTools")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SphereEditorTools")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("5c6f6fb6-a5c8-40be-b244-861f8232abf0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.2.0.0")]
[module: UnverifiableCode]
namespace SphereEditorTools;

internal class Comm
{
	public static UIDysonEditor dysonEditor;

	private static string infoString;

	private static int infoCounter;

	public static int DisplayMode;

	public static bool SymmetricMode = true;

	public static int MirrorMode;

	public static int RadialCount = 1;

	public static int MaxRadialCount = 90;

	[HarmonyPostfix]
	[HarmonyPatch(typeof(UIDysonEditor), "_OnOpen")]
	public static void Init(UIDysonEditor __instance)
	{
		dysonEditor = __instance;
		Stringpool.Set();
		if (SphereEditorTools.EnableGUI.Value)
		{
			UIWindow.OnOpen();
		}
		HideLayer.SetDisplayMode(DisplayMode);
		HideLayer.SetMask(HideLayer.EnableMask);
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(UIDysonEditor), "_OnClose")]
	public static void Free()
	{
		dysonEditor = null;
		if (SphereEditorTools.EnableGUI.Value)
		{
			UIWindow.OnClose();
		}
		HideLayer.Free();
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(GameMain), "Resume")]
	public static void OnResume()
	{
		UIWindow.SaveWindowPos();
		SphereEditorTools.Config.Reload();
		Stringpool.Set();
		UIWindow.LoadWindowPos();
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(GameMain), "End")]
	public static void OnGameEnd()
	{
		if (SphereEditorTools.EnableGUI.Value)
		{
			UIWindow.SaveWindowPos();
		}
		SphereEditorTools.Config.Save();
	}

	public static void SetInfoString(string str, int counter)
	{
		infoString = str;
		infoCounter = counter;
	}

	public static void ShowSymmetricToolStatus()
	{
		string str = ((!SymmetricMode) ? $"{Stringpool.SymmetricTool} OFF" : $"{Stringpool.SymmetricTool} {Stringpool.Rotation}:{RadialCount,-2} {Stringpool.Mirror}:{Stringpool.MirrorModes[MirrorMode]}");
		SetInfoString(str, 120);
	}

	public static void SetSymmetricMode(bool state)
	{
		SymmetricMode = state;
		if (SymmetricMode)
		{
			SymmetryTool.ChangeParameters(MirrorMode, RadialCount);
		}
		else
		{
			SymmetryTool.ChangeParameters(0, 1);
		}
		ShowSymmetricToolStatus();
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(UIDysonEditor), "UpdateBrushes")]
	public static void Update_CheckKeyDown(UIDysonEditor __instance)
	{
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Invalid comparison between Unknown and I4
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Invalid comparison between Unknown and I4
		//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00df: Invalid comparison between Unknown and I4
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Invalid comparison between Unknown and I4
		if (infoCounter > 0)
		{
			__instance.controlPanel.toolbox.brushError = infoString;
			infoCounter--;
		}
		if (!Input.anyKeyDown)
		{
			return;
		}
		infoCounter = 0;
		DysonSphereLayer singleSelectedLayer = __instance.selection.singleSelectedLayer;
		if (singleSelectedLayer != null && SphereEditorTools.EnableToolboxHotkey.Value)
		{
			if (Input.GetKeyDown(SphereEditorTools.KeySelect.Value))
			{
				__instance.brushMode = (EBrushMode)1;
			}
			else if (Input.GetKeyDown(SphereEditorTools.KeyNode.Value))
			{
				__instance.brushMode = (EBrushMode)(((int)__instance.brushMode == 2) ? 1 : 2);
			}
			else if (Input.GetKeyDown(SphereEditorTools.KeyFrameGeo.Value))
			{
				__instance.brushMode = (EBrushMode)(((int)__instance.brushMode == 3) ? 1 : 3);
			}
			else if (Input.GetKeyDown(SphereEditorTools.KeyFrameEuler.Value))
			{
				__instance.brushMode = (EBrushMode)(((int)__instance.brushMode == 4) ? 1 : 4);
			}
			else if (Input.GetKeyDown(SphereEditorTools.KeyShell.Value))
			{
				__instance.brushMode = (EBrushMode)(((int)__instance.brushMode == 5) ? 1 : 5);
			}
			else if (Input.GetKeyDown(SphereEditorTools.KeyGrid.Value))
			{
				singleSelectedLayer.drawingGridMode = (singleSelectedLayer.drawingGridMode + 1) % 5;
			}
		}
		if (Input.GetKeyDown(SphereEditorTools.KeyHideMode.Value))
		{
			DisplayMode = (DisplayMode + 1) % 4;
			HideLayer.SetDisplayMode(DisplayMode);
			SetInfoString(Stringpool.DisplayMode[DisplayMode], 120);
		}
		if (!SphereEditorTools.EnableSymmetryTool.Value)
		{
			return;
		}
		if (Input.GetKeyDown(SphereEditorTools.KeySymmetryTool.Value))
		{
			SetSymmetricMode(!SymmetricMode);
		}
		else if (Input.GetKeyDown(SphereEditorTools.KeyMirroring.Value))
		{
			SymmetricMode = true;
			MirrorMode = (MirrorMode + 1) % 3;
			SymmetryTool.ChangeParameters(MirrorMode, RadialCount);
			ShowSymmetricToolStatus();
		}
		else if (Input.GetKeyDown(SphereEditorTools.KeyRotationInc.Value))
		{
			SymmetricMode = true;
			if (RadialCount < MaxRadialCount)
			{
				SymmetryTool.ChangeParameters(MirrorMode, ++RadialCount);
			}
			ShowSymmetricToolStatus();
		}
		else if (Input.GetKeyDown(SphereEditorTools.KeyRotationDec.Value))
		{
			SymmetricMode = true;
			if (RadialCount > 1)
			{
				SymmetryTool.ChangeParameters(MirrorMode, --RadialCount);
			}
			ShowSymmetricToolStatus();
		}
	}
}
public class EditOrbit
{
	public static bool EnableAnchorMode;

	public static float AuglarSpeed;

	private static DysonSphereLayer selectedLayer;

	public static bool Toggle(bool enable)
	{
		if (enable && selectedLayer != null)
		{
			selectedLayer.orbitAngularSpeed = 0f;
			EnableAnchorMode = true;
		}
		else if (!enable && selectedLayer != null)
		{
			selectedLayer.orbitAngularSpeed = AuglarSpeed;
			EnableAnchorMode = false;
		}
		return EnableAnchorMode;
	}

	public static void TrySetAngularSpeed(float angularSpeed)
	{
		if (selectedLayer != null)
		{
			if (angularSpeed < 0f)
			{
				AuglarSpeed = Mathf.Sqrt(selectedLayer.dysonSphere.gravity / selectedLayer.orbitRadius) / selectedLayer.orbitRadius * 57.29578f;
			}
			else
			{
				AuglarSpeed = angularSpeed;
			}
			Log.LogInfo($"Set angular speed of layer[{selectedLayer.id}]: {selectedLayer.orbitAngularSpeed} => {AuglarSpeed}");
			selectedLayer.orbitAngularSpeed = AuglarSpeed;
			UIWindow.SpeedInput = AuglarSpeed.ToString();
			EnableAnchorMode = false;
		}
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(DESelection), "NotifySelectionChange")]
	public static void DESelection_Postfix(DESelection __instance)
	{
		if (__instance.singleSelectedLayer != selectedLayer)
		{
			if (EnableAnchorMode)
			{
				selectedLayer.orbitAngularSpeed = AuglarSpeed;
				EnableAnchorMode = false;
			}
			if (__instance.singleSelectedLayer != null)
			{
				AuglarSpeed = __instance.singleSelectedLayer.orbitAngularSpeed;
				UIWindow.SpeedInput = AuglarSpeed.ToString();
			}
			selectedLayer = __instance.singleSelectedLayer;
		}
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(DysonSphereLayer), "InitOrbitRotation")]
	public static bool InitOrbitRotation_Prefix(DysonSphereLayer __instance, Quaternion __1)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		if (EnableAnchorMode)
		{
			ChangeLayer(__instance, __1);
			return false;
		}
		return true;
	}

	public static void ConvertQuaternion(Quaternion rotation, out float inclination, out float longitude)
	{
		//IL_0003: 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_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		inclination = ((((Quaternion)(ref rotation)).eulerAngles.z == 0f) ? 0f : (360f - ((Quaternion)(ref rotation)).eulerAngles.z));
		longitude = ((((Quaternion)(ref rotation)).eulerAngles.y == 0f) ? 0f : (360f - ((Quaternion)(ref rotation)).eulerAngles.y));
	}

	public static void ChangeLayer(DysonSphereLayer layer, Quaternion rotation)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		Quaternion orbitRotation = rotation;
		Quaternion orbitRotation2 = layer.orbitRotation;
		layer.orbitRotation = orbitRotation;
		rotation = orbitRotation2;
		ConvertQuaternion(rotation, out var inclination, out var longitude);
		Log.LogInfo($"Previous Layer[{layer.id}]: ({inclination},{longitude})");
		ConvertQuaternion(layer.orbitRotation, out inclination, out longitude);
		Log.LogInfo($" Current Layer[{layer.id}]: ({inclination},{longitude})");
		Quaternion currentRotation = layer.currentRotation;
		layer.currentAngle = 0f;
		layer.currentRotation = layer.orbitRotation * Quaternion.Euler(0f, 0f - layer.currentAngle, 0f);
		MoveStructure(layer, currentRotation);
	}

	public static void MoveStructure(DysonSphereLayer layer, Quaternion previousRotation)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		DysonSphere dysonSphere = layer.dysonSphere;
		MoveNodes(layer, previousRotation);
		SyncNodeBuffer(layer);
		MoveFrames(layer);
		dysonSphere.CheckAutoNodes();
		for (int i = dysonSphere.autoNodeCount; i < 8; i++)
		{
			dysonSphere.PickAutoNode();
		}
		dysonSphere.modelRenderer.RebuildModels();
		MoveShells(layer);
	}

	public static void SyncNodeBuffer(DysonSphereLayer layer)
	{
		//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)
		DysonSphere dysonSphere = layer.dysonSphere;
		for (int i = 0; i < layer.nodeCursor; i++)
		{
			DysonNode val = layer.nodePool[i];
			if (val != null && val.id == i)
			{
				dysonSphere.nrdPool[val.rid].pos = val.pos;
				dysonSphere.nrdPool[val.rid].angularVel = layer.orbitAngularSpeed;
			}
		}
		dysonSphere.nrdBuffer.SetData((Array)dysonSphere.nrdPool);
	}

	public static void MoveNodes(DysonSphereLayer layer, Quaternion previousRotation)
	{
		//IL_0022: 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_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		for (int i = 0; i < layer.nodeCursor; i++)
		{
			DysonNode val = layer.nodePool[i];
			if (val != null && val.id == i && EnableAnchorMode)
			{
				val.pos = Quaternion.Inverse(layer.currentRotation) * previousRotation * val.pos;
			}
		}
	}

	public static void MoveFrames(DysonSphereLayer layer)
	{
		for (int i = 0; i < layer.frameCursor; i++)
		{
			DysonFrame val = layer.framePool[i];
			if (val != null && val.id == i)
			{
				int spMax = val.spMax;
				int spReqOrder = val.nodeA.spReqOrder;
				int spReqOrder2 = val.nodeB.spReqOrder;
				val.spMax = val.segCount * 10;
				val.nodeA.RecalcSpReq();
				val.nodeB.RecalcSpReq();
				Log.LogDebug($"Frame[{i}]: spMax {spMax}->{val.spMax}; " + $"ReqSP nodeA[{val.nodeA.id}]:{spReqOrder}->{val.nodeA.spReqOrder}, nodeB[{val.nodeB.id}]:{spReqOrder2}->{val.nodeB.spReqOrder}");
				val.segPoints = null;
			}
		}
	}

	public static void MoveShells(DysonSphereLayer layer)
	{
		List<int> list = new List<int>(6);
		List<int> list2 = new List<int>(6);
		for (int i = 0; i < layer.shellCursor; i++)
		{
			DysonShell val = layer.shellPool[i];
			if (val == null || i != val.id)
			{
				continue;
			}
			list.Clear();
			list2.Clear();
			for (int j = 0; j < val.nodes.Count; j++)
			{
				list.Add(val.nodes[j].id);
			}
			for (int k = 0; k < val.nodes.Count + 1; k++)
			{
				list2.Add(val.nodecps[k]);
				val.nodecps[k] = 0;
			}
			int vertexCount = val.vertexCount;
			int protoId = val.protoId;
			layer.RemoveDysonShell(val.id);
			int num = layer.NewDysonShell(protoId, list);
			val = layer.shellPool[num];
			for (int l = 0; l < val.nodes.Count; l++)
			{
				int num2 = list2[l];
				while (num2 > 0 && val.Construct(l, false))
				{
					num2--;
				}
				val.nodes[l].RecalcCpReq();
				val.nodecps[l] += num2;
			}
			Log.LogDebug($"Shell[{i}]:Vertex {vertexCount}->{val.vertexCount}; Total CP {list2[val.nodes.Count]}->{val.nodecps[val.nodes.Count]}");
			val.nodecps[val.nodes.Count] = list2[val.nodes.Count];
		}
	}
}
internal class HideLayer : MonoBehaviour
{
	private static int displayMode;

	public static bool EnableMask;

	private static GameObject blackmask;

	[HarmonyPostfix]
	[HarmonyPatch(typeof(DESelection), "SetViewStar")]
	public static void SetViewStar_Postfix()
	{
		Free();
		SetDisplayMode(displayMode);
		SetMask(EnableMask);
	}

	public static void Free()
	{
		if ((Object)(object)blackmask != (Object)null)
		{
			Object.Destroy((Object)(object)blackmask);
			blackmask = null;
		}
	}

	public static void SetDisplayMode(int mode)
	{
		displayMode = mode;
		GameObject obj = GameObject.Find("UI Root/Dyson Map/Star");
		if (obj != null)
		{
			obj.SetActive(displayMode < 2);
		}
		SetMask((mode & 1) == 1);
	}

	public static void SetMask(bool enable)
	{
		//IL_006a: 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_0089: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)blackmask == (Object)null)
		{
			GameObject val = GameObject.Find("UI Root/Dyson Map/Star/black-mask");
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			blackmask = Object.Instantiate<GameObject>(val, val.transform.parent.parent);
			Object.Destroy((Object)(object)blackmask.GetComponent<SphereCollider>());
			GameObject val2 = GameObject.Find("UI Root/Dyson Map/preview/compass");
			blackmask.transform.localScale = new Vector3(val2.transform.localScale.x, val2.transform.localScale.y, 0f);
		}
		blackmask.SetActive(enable);
		EnableMask = enable;
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(DysonMapCamera), "_OnLateUpdate")]
	public static void UpdateMask(DysonMapCamera __instance)
	{
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		if (EnableMask && (Object)(object)blackmask != (Object)null)
		{
			blackmask.transform.rotation = ((Component)__instance.editorCamera).transform.rotation;
		}
	}
}
internal class Stringpool
{
	public static string Tool;

	public static string Display_options;

	public static string Star;

	public static string Mask;

	public static string SymmetryTool;

	public static string None;

	public static string Equatorial;

	public static string Antipodal;

	public static string[] MirrorModes;

	public static string LAYER;

	public static string[] DisplayMode;

	public static string SymmetricTool;

	public static string Rotation;

	public static string Mirror;

	public static string OrbitTool;

	public static string AnchorMode;

	public static string AngularSpeed;

	public static string Set1;

	public static string Reset;

	public static void Set()
	{
		if (Localization.isZHCN)
		{
			LAYER = "层级";
			SymmetricTool = "[对称工具]";
			Rotation = "旋转";
			Mirror = "镜像";
			Tool = "工具";
			Display_options = "显示选项";
			Star = "恒星";
			Mask = "遮罩";
			SymmetryTool = "对称工具";
			None = "无";
			Equatorial = "赤道对称";
			Antipodal = "对跖点";
			OrbitTool = "轨道工具";
			AnchorMode = "锚定模式";
			AngularSpeed = "角速度";
			Set1 = "设置";
			Reset = "还原";
		}
		else
		{
			LAYER = Localization.Translate("LAYER");
			SymmetricTool = Localization.Translate("[Symmetry]");
			Rotation = Localization.Translate("Rotation");
			Mirror = Localization.Translate("Mirror");
			Tool = Localization.Translate("Tool");
			Display_options = Localization.Translate("Display");
			Star = Localization.Translate("Star");
			Mask = Localization.Translate("Mask");
			SymmetryTool = Localization.Translate("Symmetry Tool");
			None = Localization.Translate("None");
			Equatorial = Localization.Translate("Equatorial");
			Antipodal = Localization.Translate("Antipodal");
			OrbitTool = Localization.Translate("Orbit Tool");
			AnchorMode = Localization.Translate("Anchor Mode");
			AngularSpeed = Localization.Translate("Angular Speed");
			Set1 = Localization.Translate("Set");
			Reset = Localization.Translate("Reset");
		}
		MirrorModes = new string[3] { None, Equatorial, Antipodal };
		DisplayMode = new string[4]
		{
			Display_options + " : " + Star,
			Display_options + " : " + Star + "," + Mask,
			Display_options + " : " + None,
			Display_options + " : " + Mask
		};
	}
}
internal class SymmetryTool : MonoBehaviour
{
	private static UIDysonEditor dysnoEditor;

	private static List<UIDysonBrush>[] brushes;

	private static int brushId;

	private static int mirrorMode;

	private static int rdialCount;

	private static bool overwrite;

	private static Vector3 dataPoint;

	private static float castRadius;

	private static bool resultSnap;

	private static Vector3 clickPoint;

	private static float castDist;

	private static Vector3 rayOrigin;

	private static Ray castRay;

	private static bool paint_gridMode;

	private static int paint_cast_type;

	private static int tick;

	[HarmonyPostfix]
	[HarmonyPatch(typeof(UIDysonEditor), "_OnOpen")]
	public static void Init(UIDysonEditor __instance)
	{
		dysnoEditor = __instance;
		brushes = new List<UIDysonBrush>[dysnoEditor.brushes.Length];
		for (int i = 0; i < brushes.Length; i++)
		{
			brushes[i] = new List<UIDysonBrush> { null };
		}
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(UIDysonEditor), "_OnClose")]
	public static void Free()
	{
		if (brushes != null)
		{
			for (int i = 0; i < brushes.Length; i++)
			{
				foreach (UIDysonBrush item in brushes[i])
				{
					if (item != null)
					{
						((ManualBehaviour)item)._OnClose();
					}
					if ((Object)(object)((item != null) ? ((Component)item).gameObject : null) != (Object)null)
					{
						Object.Destroy((Object)(object)((item != null) ? ((Component)item).gameObject : null));
					}
				}
			}
			brushes = null;
		}
		Comm.SymmetricMode = false;
	}

	public static void ChangeParameters(int newMirrorMode, int newRadialCount)
	{
		int num = rdialCount * ((mirrorMode <= 0) ? 1 : 2);
		mirrorMode = newMirrorMode;
		rdialCount = newRadialCount;
		int num2 = rdialCount * ((mirrorMode <= 0) ? 1 : 2);
		while (brushes[2].Count < num2)
		{
			AddBrushes();
		}
		for (int i = 0; i < brushes.Length; i++)
		{
			if (brushes[i].Count < num)
			{
				continue;
			}
			for (int j = num2; j < num; j++)
			{
				UIDysonBrush obj = brushes[i][j];
				if (obj != null)
				{
					((ManualBehaviour)obj)._OnClose();
				}
				UIDysonBrush obj2 = brushes[i][j];
				if (obj2 != null)
				{
					((Component)obj2).gameObject.SetActive(false);
				}
			}
		}
	}

	private static void AddBrushes()
	{
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Expected O, but got Unknown
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Expected O, but got Unknown
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0149: Expected O, but got Unknown
		//IL_0171: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dd: Expected O, but got Unknown
		//IL_0205: Unknown result type (might be due to invalid IL or missing references)
		//IL_026b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0272: Expected O, but got Unknown
		//IL_029c: 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_0303: Expected O, but got Unknown
		//IL_032d: Unknown result type (might be due to invalid IL or missing references)
		//IL_038d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0394: Expected O, but got Unknown
		//IL_03be: Unknown result type (might be due to invalid IL or missing references)
		int num = 1;
		UIDysonBrush_Select val = (UIDysonBrush_Select)Object.Instantiate<UIDysonBrush>(dysnoEditor.brushes[num], ((Component)dysnoEditor.brushes[num]).transform.parent);
		brushes[num].Add((UIDysonBrush)(object)val);
		foreach (Transform item in ((Component)val).gameObject.transform)
		{
			Object.Destroy((Object)(object)((Component)item).gameObject);
		}
		((ManualBehaviour)val)._OnInit();
		num = 2;
		UIDysonBrush_Node val2 = (UIDysonBrush_Node)Object.Instantiate<UIDysonBrush>(dysnoEditor.brushes[num], ((Component)dysnoEditor.brushes[num]).transform.parent);
		brushes[num].Add((UIDysonBrush)(object)val2);
		foreach (Transform item2 in ((Component)val2).gameObject.transform)
		{
			Object.Destroy((Object)(object)((Component)item2).gameObject);
		}
		((ManualBehaviour)val2)._OnInit();
		num = 3;
		UIDysonBrush_Frame val3 = (UIDysonBrush_Frame)Object.Instantiate<UIDysonBrush>(dysnoEditor.brushes[num], ((Component)dysnoEditor.brushes[num]).transform.parent);
		brushes[num].Add((UIDysonBrush)(object)val3);
		foreach (Transform item3 in ((Component)val3).gameObject.transform)
		{
			Object.Destroy((Object)(object)((Component)item3).gameObject);
		}
		((ManualBehaviour)val3)._OnInit();
		val3.isEuler = false;
		num = 4;
		val3 = (UIDysonBrush_Frame)Object.Instantiate<UIDysonBrush>(dysnoEditor.brushes[num], ((Component)dysnoEditor.brushes[num]).transform.parent);
		brushes[num].Add((UIDysonBrush)(object)val3);
		foreach (Transform item4 in ((Component)val3).gameObject.transform)
		{
			Object.Destroy((Object)(object)((Component)item4).gameObject);
		}
		((ManualBehaviour)val3)._OnInit();
		val3.isEuler = true;
		num = 5;
		UIDysonBrush_Shell val4 = (UIDysonBrush_Shell)Object.Instantiate<UIDysonBrush>(dysnoEditor.brushes[num], ((Component)dysnoEditor.brushes[num]).transform.parent);
		brushes[num].Add((UIDysonBrush)(object)val4);
		foreach (Transform item5 in ((Component)val4).gameObject.transform)
		{
			Object.Destroy((Object)(object)((Component)item5).gameObject);
		}
		((ManualBehaviour)val4)._OnInit();
		num = 6;
		UIDysonBrush_Paint val5 = (UIDysonBrush_Paint)Object.Instantiate<UIDysonBrush>(dysnoEditor.brushes[num], ((Component)dysnoEditor.brushes[num]).transform.parent);
		brushes[num].Add((UIDysonBrush)(object)val5);
		foreach (Transform item6 in ((Component)val5).gameObject.transform)
		{
			Object.Destroy((Object)(object)((Component)item6).gameObject);
		}
		((ManualBehaviour)val5)._OnInit();
		num = 7;
		UIDysonBrush_Remove val6 = (UIDysonBrush_Remove)Object.Instantiate<UIDysonBrush>(dysnoEditor.brushes[num], ((Component)dysnoEditor.brushes[num]).transform.parent);
		brushes[num].Add((UIDysonBrush)(object)val6);
		foreach (Transform item7 in ((Component)val6).gameObject.transform)
		{
			Object.Destroy((Object)(object)((Component)item7).gameObject);
		}
		((ManualBehaviour)val6)._OnInit();
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(UIDysonEditor), "UpdateBrushes")]
	public static void Brushes_Prepare()
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Invalid comparison between I4 and Unknown
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Expected I4, but got Unknown
		if (rdialCount * ((mirrorMode <= 0) ? 1 : 2) <= 1 || brushId == (int)dysnoEditor.brushMode)
		{
			return;
		}
		foreach (UIDysonBrush item in brushes[brushId])
		{
			if (item != null)
			{
				((ManualBehaviour)item)._OnClose();
			}
			if (item != null)
			{
				((Component)item).gameObject.SetActive(false);
			}
		}
		brushId = (int)dysnoEditor.brushMode;
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(UIDysonEditor), "UpdateBrushes")]
	public static void Brushes_OnUpdate()
	{
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: Unknown result type (might be due to invalid IL or missing references)
		//IL_020c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0211: 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_021e: Invalid comparison between Unknown and I4
		//IL_0237: Unknown result type (might be due to invalid IL or missing references)
		//IL_023c: Unknown result type (might be due to invalid IL or missing references)
		//IL_024d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0252: 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_0655: Unknown result type (might be due to invalid IL or missing references)
		//IL_065a: Unknown result type (might be due to invalid IL or missing references)
		//IL_065f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0664: Unknown result type (might be due to invalid IL or missing references)
		//IL_033f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0344: Unknown result type (might be due to invalid IL or missing references)
		//IL_0346: Unknown result type (might be due to invalid IL or missing references)
		//IL_0348: Unknown result type (might be due to invalid IL or missing references)
		//IL_034a: Unknown result type (might be due to invalid IL or missing references)
		//IL_034f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0354: Unknown result type (might be due to invalid IL or missing references)
		//IL_0356: Unknown result type (might be due to invalid IL or missing references)
		//IL_035b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0360: Unknown result type (might be due to invalid IL or missing references)
		//IL_0365: Unknown result type (might be due to invalid IL or missing references)
		//IL_0369: Unknown result type (might be due to invalid IL or missing references)
		//IL_036e: 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_0377: Unknown result type (might be due to invalid IL or missing references)
		//IL_037c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0381: Unknown result type (might be due to invalid IL or missing references)
		//IL_0386: Unknown result type (might be due to invalid IL or missing references)
		//IL_0162: Unknown result type (might be due to invalid IL or missing references)
		//IL_0425: Unknown result type (might be due to invalid IL or missing references)
		//IL_0436: Unknown result type (might be due to invalid IL or missing references)
		//IL_0442: Unknown result type (might be due to invalid IL or missing references)
		//IL_044f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0459: Unknown result type (might be due to invalid IL or missing references)
		//IL_0467: Unknown result type (might be due to invalid IL or missing references)
		//IL_0473: Unknown result type (might be due to invalid IL or missing references)
		//IL_0480: Unknown result type (might be due to invalid IL or missing references)
		//IL_048a: Unknown result type (might be due to invalid IL or missing references)
		//IL_04a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_04ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_04da: Unknown result type (might be due to invalid IL or missing references)
		//IL_04e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_04f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0500: Unknown result type (might be due to invalid IL or missing references)
		//IL_050c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0517: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e7: 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_02ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_0547: Unknown result type (might be due to invalid IL or missing references)
		//IL_054c: Unknown result type (might be due to invalid IL or missing references)
		//IL_054e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0550: Unknown result type (might be due to invalid IL or missing references)
		//IL_0552: Unknown result type (might be due to invalid IL or missing references)
		//IL_0557: Unknown result type (might be due to invalid IL or missing references)
		//IL_055c: Unknown result type (might be due to invalid IL or missing references)
		//IL_055e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0563: Unknown result type (might be due to invalid IL or missing references)
		//IL_0568: Unknown result type (might be due to invalid IL or missing references)
		//IL_056d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0571: Unknown result type (might be due to invalid IL or missing references)
		//IL_0576: Unknown result type (might be due to invalid IL or missing references)
		//IL_057b: Unknown result type (might be due to invalid IL or missing references)
		//IL_057f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0584: Unknown result type (might be due to invalid IL or missing references)
		//IL_0589: Unknown result type (might be due to invalid IL or missing references)
		//IL_058e: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			if (brushId == 6)
			{
				if (dysnoEditor.brush_paint.castNodeGizmo != null)
				{
					paint_cast_type = 1;
				}
				else if (dysnoEditor.brush_paint.castFrameGizmo != null)
				{
					paint_cast_type = 2;
				}
				else if (dysnoEditor.brush_paint.castShellGizmo != null)
				{
					paint_cast_type = 3;
				}
				else
				{
					paint_cast_type = 0;
				}
			}
			int num = rdialCount * ((mirrorMode <= 0) ? 1 : 2);
			if (num > 1)
			{
				if (Input.GetMouseButton(0))
				{
					foreach (UIDysonBrush item in brushes[brushId])
					{
						if (!((Object)(object)item != (Object)null))
						{
							continue;
						}
						switch (brushId)
						{
						case 1:
						{
							UIDysonBrush obj = ((item is UIDysonBrush_Select) ? item : null);
							UIDysonBrush obj2 = dysnoEditor.brushes[brushId];
							UIDysonBrush_Select val2 = (UIDysonBrush_Select)(object)((obj2 is UIDysonBrush_Select) ? obj2 : null);
							((UIDysonBrush_Select)obj).selectedLayerId = val2.selectedLayerId;
							break;
						}
						case 3:
						case 4:
							((UIDysonBrush_Frame)((item is UIDysonBrush_Frame) ? item : null)).frameProtoId = dysnoEditor.frameProtoId;
							break;
						case 5:
							((UIDysonBrush_Shell)((item is UIDysonBrush_Shell) ? item : null)).shellProtoId = dysnoEditor.shellProtoId;
							break;
						case 6:
						{
							UIDysonBrush_Paint val = (UIDysonBrush_Paint)(object)((item is UIDysonBrush_Paint) ? item : null);
							if (dysnoEditor.brush_paint.pickColorMode)
							{
								return;
							}
							val.paint = dysnoEditor.brush_paint.paint;
							val.eraseMode = dysnoEditor.brush_paint.eraseMode;
							val.size = dysnoEditor.brush_paint.size;
							break;
						}
						}
					}
				}
				DysonSphere viewDysonSphere = dysnoEditor.selection.viewDysonSphere;
				DysonSphereLayer singleSelectedLayer = dysnoEditor.selection.singleSelectedLayer;
				string brushError = dysnoEditor.controlPanel.toolbox.brushError;
				overwrite = true;
				Vector3 val3 = dataPoint;
				Quaternion val4 = Quaternion.identity;
				Ray val5 = dysnoEditor.screenCamera.ScreenPointToRay(Input.mousePosition);
				paint_gridMode = (int)dysnoEditor.brushMode == 6 && dysnoEditor.brush_paint.isGridMode;
				if (clickPoint != Vector3.zero)
				{
					Vector3 origin = ((Ray)(ref val5)).origin;
					castRadius = ((Vector3)(ref origin)).magnitude * 4000f / ((Vector3)(ref rayOrigin)).magnitude;
					bool flag = Vector3.Dot(((Ray)(ref val5)).direction, clickPoint) < 0f;
					for (int num2 = viewDysonSphere.layersSorted.Length - 1; num2 >= 0; num2--)
					{
						DysonSphereLayer val6 = viewDysonSphere.layersSorted[flag ? num2 : (viewDysonSphere.layersSorted.Length - 1 - num2)];
						if (val6 != null && Mathf.Abs(val6.orbitRadius - castRadius) < 1f)
						{
							castRadius = 0f;
							val4 = val6.currentRotation;
							val3 = Quaternion.Inverse(val4) * clickPoint;
							break;
						}
					}
				}
				if (brushes[brushId].Count >= num)
				{
					for (int i = 1; i < rdialCount; i++)
					{
						Quaternion val7 = Quaternion.Euler(0f, 360f * (float)i / (float)rdialCount, 0f);
						dataPoint = val7 * val3;
						clickPoint = val4 * dataPoint;
						castRay = new Ray(val7 * ((Ray)(ref val5)).origin, val7 * ((Ray)(ref val5)).direction);
						brushes[brushId][i].SetDysonSphere(viewDysonSphere);
						brushes[brushId][i].layer = singleSelectedLayer;
						((ManualBehaviour)brushes[brushId][i])._Open();
						((Component)brushes[brushId][i]).gameObject.SetActive(true);
						((ManualBehaviour)brushes[brushId][i])._OnUpdate();
					}
					if (mirrorMode > 0)
					{
						val3.y = 0f - val3.y;
						((Ray)(ref val5)).origin = new Vector3(((Ray)(ref val5)).origin.x, 0f - ((Ray)(ref val5)).origin.y, ((Ray)(ref val5)).origin.z);
						((Ray)(ref val5)).direction = new Vector3(((Ray)(ref val5)).direction.x, 0f - ((Ray)(ref val5)).direction.y, ((Ray)(ref val5)).direction.z);
						if (mirrorMode == 2)
						{
							val3.x = 0f - val3.x;
							val3.z = 0f - val3.z;
							((Ray)(ref val5)).origin = new Vector3(0f - ((Ray)(ref val5)).origin.x, ((Ray)(ref val5)).origin.y, 0f - ((Ray)(ref val5)).origin.z);
							((Ray)(ref val5)).direction = new Vector3(0f - ((Ray)(ref val5)).direction.x, ((Ray)(ref val5)).direction.y, 0f - ((Ray)(ref val5)).direction.z);
						}
						for (int j = rdialCount; j < 2 * rdialCount; j++)
						{
							Quaternion val8 = Quaternion.Euler(0f, 360f * (float)j / (float)rdialCount, 0f);
							dataPoint = val8 * val3;
							clickPoint = val4 * dataPoint;
							castRay = new Ray(val8 * ((Ray)(ref val5)).origin, val8 * ((Ray)(ref val5)).direction);
							brushes[brushId][j].SetDysonSphere(viewDysonSphere);
							brushes[brushId][j].layer = singleSelectedLayer;
							((ManualBehaviour)brushes[brushId][j]).active = true;
							((ManualBehaviour)brushes[brushId][j])._Open();
							((Component)brushes[brushId][j]).gameObject.SetActive(true);
							((ManualBehaviour)brushes[brushId][j])._OnUpdate();
						}
					}
				}
				overwrite = false;
				dysnoEditor.controlPanel.toolbox.brushError = brushError;
				clickPoint = Vector3.zero;
				dataPoint = Vector3.zero;
			}
		}
		catch (Exception obj3)
		{
			Log.LogError(obj3);
			Comm.SetInfoString(Stringpool.SymmetricTool + " Error. The function is now disable", 120);
			ChangeParameters(0, 1);
		}
		tick = (tick + 1) % 600;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(UIDysonBrush_Node), "RecalcCollides")]
	public static void ForceUpdate(UIDysonBrush_Node __instance)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		if (Input.GetMouseButtonDown(0))
		{
			__instance.lastCalcPos = Vector3.zero;
		}
	}

	[HarmonyTranspiler]
	[HarmonyPatch(typeof(UIDysonBrush_Node), "_OnUpdate")]
	[HarmonyPatch(typeof(UIDysonBrush_Frame), "_OnUpdate")]
	[HarmonyPatch(typeof(UIDysonBrush_Shell), "_OnUpdate")]
	[HarmonyPatch(typeof(UIDysonBrush_Select), "_OnUpdate")]
	[HarmonyPatch(typeof(UIDysonBrush_Remove), "_OnUpdate")]
	[HarmonyPatch(typeof(UIDysonBrush_Paint), "_OnUpdate")]
	public static IEnumerable<CodeInstruction> Transpiler_OnUpdate(IEnumerable<CodeInstruction> instructions)
	{
		List<CodeInstruction> list = instructions.ToList();
		List<CodeInstruction> list2 = new List<CodeInstruction>(list);
		try
		{
			MethodInfo method = typeof(UIDysonDrawingGrid).GetMethod("RaySnap", new Type[2]
			{
				typeof(Ray),
				typeof(Vector3).MakeByRefType()
			});
			MethodInfo method2 = typeof(UIDysonDrawingGrid).GetMethod("RaySnap", new Type[3]
			{
				typeof(Ray),
				typeof(Vector3).MakeByRefType(),
				typeof(int).MakeByRefType()
			});
			MethodInfo method3 = typeof(UIDysonDrawingGrid).GetMethod("RayCast");
			MethodInfo method4 = typeof(Phys).GetMethod("RayCastSphere", new Type[6]
			{
				typeof(Vector3),
				typeof(Vector3),
				typeof(float),
				typeof(Vector3),
				typeof(float),
				typeof(RCHCPU)
			});
			for (int i = 0; i < list.Count; i++)
			{
				if (list[i].operand is MethodInfo methodInfo)
				{
					if (list[i].opcode == OpCodes.Call && methodInfo == method4)
					{
						list[i].operand = typeof(SymmetryTool).GetMethod("Overwrite_RayCastSphere");
					}
					if (list[i].opcode == OpCodes.Callvirt && methodInfo == method)
					{
						list[i].opcode = OpCodes.Call;
						list[i].operand = typeof(SymmetryTool).GetMethod("Overwrite_RaySnap");
					}
					else if (list[i].opcode == OpCodes.Callvirt && methodInfo == method2)
					{
						list[i].opcode = OpCodes.Call;
						list[i].operand = typeof(SymmetryTool).GetMethod("Overwrite_RaySnap2");
					}
					else if (list[i].opcode == OpCodes.Callvirt && methodInfo == method3)
					{
						list[i].opcode = OpCodes.Call;
						list[i].operand = typeof(SymmetryTool).GetMethod("Overwrite_RayCast");
					}
				}
			}
		}
		catch (Exception obj)
		{
			Log.LogError(obj);
			list = list2;
			Log.LogWarning("Brush transpiler failed. Restore backup IL");
			SphereEditorTools.ErrorMessage += "SymmetryTool ";
		}
		return list.AsEnumerable();
	}

	public static bool Overwrite_RayCastSphere(Vector3 origin, Vector3 dir, float length, Vector3 center, float radius, out RCHCPU rch)
	{
		//IL_0067: 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_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: 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_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		if (overwrite)
		{
			rch.point = Vector3.zero;
			rch.normal = Vector3.zero;
			if (origin == rayOrigin)
			{
				Vector3 val = center - clickPoint;
				if ((double)((Vector3)(ref val)).sqrMagnitude < 1E-06)
				{
					rch.dist = castDist;
					return true;
				}
			}
			rch.dist = 0f;
			return false;
		}
		bool num = Phys.RayCastSphere(origin, dir, length, center, radius, ref rch);
		if (num)
		{
			rayOrigin = origin;
			clickPoint = center;
			castDist = rch.dist;
		}
		return num;
	}

	public static bool Overwrite_RayCast(UIDysonDrawingGrid uidysonDrawingGrid, Ray lookRay, Quaternion rotation, float radius, out Vector3 cast, bool front = true)
	{
		//IL_002c: 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_0043: 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_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_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		if (overwrite)
		{
			if (radius == castRadius)
			{
				cast = dataPoint;
				return true;
			}
			cast = Vector3.zero;
			return false;
		}
		bool num = uidysonDrawingGrid.RayCast(lookRay, rotation, radius, ref cast, front);
		if (num)
		{
			castRadius = radius;
			dataPoint = cast;
		}
		return num;
	}

	public static bool Overwrite_RaySnap(UIDysonDrawingGrid uidysonDrawingGrid, Ray lookRay, out Vector3 snap)
	{
		//IL_0019: 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_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		if (overwrite)
		{
			snap = dataPoint;
			return resultSnap;
		}
		resultSnap = uidysonDrawingGrid.RaySnap(lookRay, ref snap);
		dataPoint = snap;
		return resultSnap;
	}

	public static bool Overwrite_RaySnap2(UIDysonDrawingGrid uidysonDrawingGrid, Ray lookRay, out Vector3 snap, out int triIdx)
	{
		//IL_0031: 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_0044: 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_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		if (overwrite)
		{
			if (paint_gridMode)
			{
				return uidysonDrawingGrid.RaySnap(castRay, ref snap, ref triIdx);
			}
			snap = dataPoint;
			triIdx = 0;
			return resultSnap;
		}
		resultSnap = uidysonDrawingGrid.RaySnap(lookRay, ref snap, ref triIdx);
		dataPoint = snap;
		return resultSnap;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(UIDysonPaintingGrid), "RayCastAndHightlight")]
	public static void Overwrite_RayCastAndHightlight(ref Ray lookRay)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		if (overwrite)
		{
			lookRay = castRay;
		}
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(UIDysonBrush_Shell), "AddNodeGizmo")]
	public static bool Overwrite_AddNodeGizmo()
	{
		return !overwrite;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(UIDysonPaintingGrid), "SetCursorCellsGraticule")]
	[HarmonyPatch(typeof(UIDysonPaintingGrid), "SetCursorCells")]
	public static bool Overwrite_Paint()
	{
		if (overwrite)
		{
			return Input.GetMouseButton(0);
		}
		return true;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(DESelection), "OnNodeClick")]
	public static bool Overwrite_OnNodeClick(DESelection __instance, DysonNode node)
	{
		if (!overwrite || node == null)
		{
			return true;
		}
		if (!__instance.selectedNodes.Contains(node))
		{
			__instance.AddNodeSelection(node);
		}
		return false;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(DESelection), "OnFrameClick")]
	public static bool Overwrite_OnFrameClick(DESelection __instance, DysonFrame frame)
	{
		if (!overwrite || frame == null)
		{
			return true;
		}
		if (!__instance.selectedFrames.Contains(frame))
		{
			__instance.AddFrameSelection(frame);
		}
		return false;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(DESelection), "OnShellClick")]
	public static bool Overwrite_OnFrameClick(DESelection __instance, DysonShell shell)
	{
		if (!overwrite || shell == null)
		{
			return true;
		}
		if (!__instance.selectedShells.Contains(shell))
		{
			__instance.AddShellSelection(shell);
		}
		return false;
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(UIDysonBrush_Paint), "_OnUpdate")]
	public static bool UIDysonBrush_Paint_OnUpdate(UIDysonBrush_Paint __instance)
	{
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0123: 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_012a: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: 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_01ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0626: Unknown result type (might be due to invalid IL or missing references)
		//IL_062b: Unknown result type (might be due to invalid IL or missing references)
		//IL_019e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_025e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0263: Unknown result type (might be due to invalid IL or missing references)
		//IL_0265: Unknown result type (might be due to invalid IL or missing references)
		//IL_026a: Unknown result type (might be due to invalid IL or missing references)
		//IL_065a: Unknown result type (might be due to invalid IL or missing references)
		//IL_064f: Unknown result type (might be due to invalid IL or missing references)
		//IL_04c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_04bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0553: Unknown result type (might be due to invalid IL or missing references)
		//IL_0548: Unknown result type (might be due to invalid IL or missing references)
		//IL_04cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_03dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_05da: Unknown result type (might be due to invalid IL or missing references)
		//IL_05cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_0558: Unknown result type (might be due to invalid IL or missing references)
		//IL_035c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0361: Unknown result type (might be due to invalid IL or missing references)
		//IL_0365: Unknown result type (might be due to invalid IL or missing references)
		//IL_0370: Unknown result type (might be due to invalid IL or missing references)
		//IL_0375: Unknown result type (might be due to invalid IL or missing references)
		//IL_0379: Unknown result type (might be due to invalid IL or missing references)
		//IL_037e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0380: Unknown result type (might be due to invalid IL or missing references)
		//IL_0382: Unknown result type (might be due to invalid IL or missing references)
		//IL_05df: Unknown result type (might be due to invalid IL or missing references)
		//IL_040a: Unknown result type (might be due to invalid IL or missing references)
		if (!overwrite)
		{
			return true;
		}
		__instance.size = ((__instance.size > __instance.maxPainterBrushSize) ? __instance.maxPainterBrushSize : __instance.size);
		UIDysonDrawingGrid[] drawingGrids = ((UIDysonBrush)__instance).editor.drawingGrids;
		Camera screenCamera = ((UIDysonBrush)__instance).editor.screenCamera;
		UIDysonPaintingGrid val = ((UIDysonBrush)__instance).editor.paintingGrids[((UIDysonBrush)__instance).layer.paintingGridMode];
		if (!RectTransformUtility.RectangleContainsScreenPoint(((UIDysonBrush)__instance).editor.controlPanel.inspector.selfRect, Vector2.op_Implicit(Input.mousePosition), ((UIDysonBrush)__instance).editor.uiCamera) && !RectTransformUtility.RectangleContainsScreenPoint(((UIDysonBrush)__instance).editor.controlPanel.hierarchy.selfRect, Vector2.op_Implicit(Input.mousePosition), ((UIDysonBrush)__instance).editor.uiCamera))
		{
			if (__instance.eraseMode)
			{
				UICursor.SetCursor((ECursor)12);
			}
			else if (__instance.pickColorMode)
			{
				UICursor.SetCursor((ECursor)11);
			}
			else
			{
				UICursor.SetCursor((ECursor)10);
			}
		}
		if (!UIBlockZone.blocked && !UIDysonEditor.onGUIOperate)
		{
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			int num4 = 0;
			if (((UIDysonBrush)__instance).layer != null)
			{
				int id = ((UIDysonBrush)__instance).layer.id;
				Ray val2 = screenCamera.ScreenPointToRay(Input.mousePosition);
				Ray val3 = val2;
				((Ray)(ref val3)).origin = ((Ray)(ref val3)).origin / (float)((double)((UIDysonBrush)__instance).layer.orbitRadius * 0.00025);
				if (paint_cast_type == 1)
				{
					for (int i = 1; i < ((UIDysonBrush)__instance).layer.nodeCursor; i++)
					{
						if (((UIDysonBrush)__instance).layer.nodePool[i] != null && ((UIDysonBrush)__instance).layer.nodePool[i].id == i && Vector3.SqrMagnitude(((Vector3)(ref ((UIDysonBrush)__instance).layer.nodePool[i].pos)).normalized - dataPoint) < 0.001f)
						{
							num2 = i;
							num = id;
						}
					}
				}
				__instance._tmp_frame_list.Clear();
				__instance._tmp_shell_list.Clear();
				if (Overwrite_RayCast(drawingGrids[0], val2, ((UIDysonBrush)__instance).layer.currentRotation, ((UIDysonBrush)__instance).layer.orbitRadius, out var cast))
				{
					double num5 = 0.16099441051483154;
					Vector3 val5;
					for (int j = 1; j < ((UIDysonBrush)__instance).layer.nodeCursor; j++)
					{
						DysonNode val4 = ((UIDysonBrush)__instance).layer.nodePool[j];
						if (val4 == null || val4.id != j)
						{
							continue;
						}
						val5 = ((Vector3)(ref ((UIDysonBrush)__instance).layer.nodePool[j].pos)).normalized - cast;
						if (!((double)((Vector3)(ref val5)).sqrMagnitude < num5))
						{
							continue;
						}
						List<DysonFrame> frames = val4.frames;
						for (int k = 0; k < frames.Count; k++)
						{
							if (!__instance._tmp_frame_list.Contains(frames[k]))
							{
								__instance._tmp_frame_list.Add(frames[k]);
							}
						}
						List<DysonShell> shells = val4.shells;
						for (int l = 0; l < shells.Count; l++)
						{
							if (!__instance._tmp_shell_list.Contains(shells[l]))
							{
								__instance._tmp_shell_list.Add(shells[l]);
							}
						}
					}
					float num6 = 0.00028900002f;
					DysonFrame val6 = null;
					DysonShell val7 = null;
					foreach (DysonFrame item in __instance._tmp_frame_list)
					{
						List<Vector3> segments = item.GetSegments();
						for (int m = 0; m < segments.Count - 1; m++)
						{
							val5 = segments[m];
							Vector3 normalized = ((Vector3)(ref val5)).normalized;
							val5 = segments[m + 1];
							Vector3 normalized2 = ((Vector3)(ref val5)).normalized;
							float num7 = UIDysonBrush_Paint.PointToSegmentSqr(normalized, normalized2, cast);
							if (num7 < num6)
							{
								num6 = num7;
								val6 = item;
							}
						}
					}
					VectorLF3 val8 = VectorLF3.op_Implicit(cast * ((UIDysonBrush)__instance).layer.orbitRadius);
					if (val6 != null)
					{
						num3 = val6.id;
						num = id;
					}
					else
					{
						foreach (DysonShell item2 in __instance._tmp_shell_list)
						{
							if (item2.IsPointInShell(val8))
							{
								val7 = item2;
								break;
							}
						}
						if (val7 != null)
						{
							num4 = val7.id;
							num = id;
						}
					}
				}
				__instance._tmp_frame_list.Clear();
			}
			if (num > 0 && ((UIDysonBrush)__instance).layer != null)
			{
				if (num2 > 0 && (__instance.targetFilter & 1) > 0)
				{
					DysonNode val10 = (__instance.castNodeGizmo = ((UIDysonBrush)__instance).layer.nodePool[num2]);
					DysonNode val11 = val10;
					__instance.castFrameGizmo = null;
					__instance.castShellGizmo = null;
					if (__instance.pickColorMode)
					{
						return false;
					}
					if (Input.GetMouseButton(0))
					{
						val11.color = (Color32)(__instance.eraseMode ? new Color32((byte)0, (byte)0, (byte)0, (byte)0) : __instance.paint);
						((UIDysonBrush)__instance).editor.selection.viewDysonSphere.UpdateColor(val11);
					}
				}
				else if (num3 > 0 && (__instance.targetFilter & 2) > 0)
				{
					__instance.castNodeGizmo = null;
					DysonFrame val13 = (__instance.castFrameGizmo = ((UIDysonBrush)__instance).layer.framePool[num3]);
					DysonFrame val14 = val13;
					__instance.castShellGizmo = null;
					if (__instance.pickColorMode)
					{
						return false;
					}
					if (Input.GetMouseButton(0))
					{
						val14.color = (Color32)(__instance.eraseMode ? new Color32((byte)0, (byte)0, (byte)0, (byte)0) : __instance.paint);
						((UIDysonBrush)__instance).editor.selection.viewDysonSphere.UpdateColor(val14);
					}
				}
				else if (num4 > 0 && (__instance.targetFilter & 4) > 0)
				{
					__instance.castNodeGizmo = null;
					__instance.castFrameGizmo = null;
					DysonShell val16 = (__instance.castShellGizmo = ((UIDysonBrush)__instance).layer.shellPool[num4]);
					DysonShell val17 = val16;
					if (__instance.pickColorMode)
					{
						return false;
					}
					if (Input.GetMouseButton(0))
					{
						val17.color = (Color32)(__instance.eraseMode ? new Color32((byte)0, (byte)0, (byte)0, (byte)0) : __instance.paint);
					}
				}
				else
				{
					__instance.castNodeGizmo = null;
					__instance.castFrameGizmo = null;
					__instance.castShellGizmo = null;
				}
			}
			else
			{
				__instance.castNodeGizmo = null;
				__instance.castFrameGizmo = null;
				__instance.castShellGizmo = null;
			}
			if (__instance.isGridMode)
			{
				if (__instance.pickColorMode)
				{
					return false;
				}
				if (val.RayCastAndHightlight(screenCamera.ScreenPointToRay(Input.mousePosition), __instance.size) && Input.GetMouseButton(0))
				{
					val.PaintCells((Color32)(__instance.eraseMode ? new Color32((byte)0, (byte)0, (byte)0, (byte)0) : __instance.paint));
				}
			}
			if (__instance.pickColorMode && Input.GetMouseButtonUp(0))
			{
				__instance.pickColorMode = false;
			}
			if (Input.GetMouseButtonDown(1))
			{
				if (!__instance.isGridMode)
				{
					((UIDysonBrush)__instance).editor.brushMode = (EBrushMode)1;
					((ManualBehaviour)__instance)._Close();
					return false;
				}
				__instance.paintingbox.SwitchPaintingGrid();
			}
			if (Input.GetKeyDown((KeyCode)101))
			{
				__instance.eraseMode = !__instance.eraseMode;
				return false;
			}
		}
		else
		{
			__instance.castNodeGizmo = null;
			__instance.castFrameGizmo = null;
			__instance.castShellGizmo = null;
			val.ClearCursorCells();
		}
		return false;
	}
}
[BepInPlugin("com.starfi5h.plugin.SphereEditorTools", "SphereEditorTools", "2.2.3")]
public class SphereEditorTools : BaseUnityPlugin
{
	private Harmony harmony;

	internal static string ErrorMessage;

	internal static ConfigFile Config;

	public static ConfigEntry<bool> EnableToolboxHotkey;

	public static ConfigEntry<bool> EnableDisplayOptions;

	public static ConfigEntry<bool> EnableSymmetryTool;

	public static ConfigEntry<bool> EnableOrbitTool;

	public static ConfigEntry<bool> EnableVisualEffect;

	public static ConfigEntry<bool> EnableGUI;

	public static ConfigEntry<string> WindowPosition;

	public static ConfigEntry<string> WindowSize;

	public static ConfigEntry<string> KeySelect;

	public static ConfigEntry<string> KeyNode;

	public static ConfigEntry<string> KeyFrameGeo;

	public static ConfigEntry<string> KeyFrameEuler;

	public static ConfigEntry<string> KeyShell;

	public static ConfigEntry<string> KeyGrid;

	public static ConfigEntry<string> KeyShowAllLayers;

	public static ConfigEntry<string> KeyHideMode;

	public static ConfigEntry<string> KeySymmetryTool;

	public static ConfigEntry<string> KeyMirroring;

	public static ConfigEntry<string> KeyRotationInc;

	public static ConfigEntry<string> KeyRotationDec;

	public static ConfigEntry<string> VFXchainedSequence;

	private void BindConfig()
	{
		EnableToolboxHotkey = Config.Bind<bool>("- General -", "EnableToolboxHotkey", true, "Switch between build plan tools with hotkeys.\n启用工具箱热键");
		EnableDisplayOptions = Config.Bind<bool>("- General -", "EnableDisplayOptions", true, "Enable display control of star and black mask.\n启用显示控制(恒星/黑色遮罩)");
		EnableSymmetryTool = Config.Bind<bool>("- General -", "EnableSymmetryTool", true, "Enable mirror and rotation symmetry of building tools.\n启用对称建造工具(镜像/旋转)");
		EnableOrbitTool = Config.Bind<bool>("- General -", "EnableOrbitTool", true, "Enable dyson sphere layer orbit modifiy tool.\n启用壳层轨道工具");
		EnableGUI = Config.Bind<bool>("GUI", "EnableGUI", true, "Show a simple window to use the tools. \n启用图形操作界面窗口");
		WindowPosition = Config.Bind<string>("GUI", "WindowPosition", "300, 250", "Position of the window. Format: x,y\n窗口的位置 格式: x,y");
		WindowSize = Config.Bind<string>("GUI", "WindowSize", "240, 200", "Size of the window. Format: width,height\n窗口的大小 格式: 宽度,高度");
		KeySelect = Config.Bind<string>("Hotkeys - Toolbox", "KeySelect", "space", "Inspect / 查看");
		KeyNode = Config.Bind<string>("Hotkeys - Toolbox", "KeyNode", "q", "Build Node / 修建节点");
		KeyFrameGeo = Config.Bind<string>("Hotkeys - Toolbox", "KeyFrameGeo", "w", "Build Frame(Geodesic) / 修建测地线框架");
		KeyFrameEuler = Config.Bind<string>("Hotkeys - Toolbox", "KeyFrameEuler", "e", "Build Frame(Euler) / 修建经纬度框架");
		KeyShell = Config.Bind<string>("Hotkeys - Toolbox", "KeyShell", "r", "Build Shell / 修建壳");
		KeyGrid = Config.Bind<string>("Hotkeys - Toolbox", "KeyGrid", "g", "Toggle Grid / 切换网格");
		KeyHideMode = Config.Bind<string>("Hotkeys - Visibility", "KeyHideMode", "h", "Toggle mask & star display mode / 切换遮罩與恒星显示模式");
		KeySymmetryTool = Config.Bind<string>("Hotkeys - Symmetry Tool", "KeySymmetryTool", "tab", "Toggle symmetry tool / 开关对称建造工具");
		KeyMirroring = Config.Bind<string>("Hotkeys - Symmetry Tool", "KeyMirroring", "m", "Toggle mirroring mode / 切换镜像对称模式");
		KeyRotationInc = Config.Bind<string>("Hotkeys - Symmetry Tool", "KeyRotationInc", "[+]", "Increase the degree of rotational symmetry / 增加旋转对称的个数");
		KeyRotationDec = Config.Bind<string>("Hotkeys - Symmetry Tool", "KeyRotationDec", "[-]", "Decrease the degree of rotational symmetry / 减少旋转对称的个数");
	}

	public void Start()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Expected O, but got Unknown
		harmony = new Harmony("com.starfi5h.plugin.SphereEditorTools");
		Config = ((BaseUnityPlugin)this).Config;
		BindConfig();
		Log.Init(((BaseUnityPlugin)this).Logger);
		TryPatch(typeof(Comm));
		if (EnableDisplayOptions.Value)
		{
			TryPatch(typeof(HideLayer));
		}
		if (EnableSymmetryTool.Value)
		{
			TryPatch(typeof(SymmetryTool));
		}
		if (EnableOrbitTool.Value)
		{
			TryPatch(typeof(EditOrbit));
		}
		if (EnableGUI.Value)
		{
			UIWindow.LoadWindowPos();
			UIWindow.LoadWindowSize();
		}
	}

	public void TryPatch(Type type)
	{
		try
		{
			harmony.PatchAll(type);
		}
		catch (Exception ex)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)("Patch " + type.Name + " error"));
			((BaseUnityPlugin)this).Logger.LogError((object)ex);
			throw new Exception("SphereEditorTools: " + type.Name + " patch error. Disable this function in the config file.\n" + ex.ToString());
		}
	}

	public void OnGUI()
	{
		if (UIWindow.isShow)
		{
			UIWindow.OnGUI();
		}
	}

	public void OnDestroy()
	{
		harmony.UnpatchSelf();
		HideLayer.Free();
		SymmetryTool.Free();
	}
}
public static class Log
{
	private static ManualLogSource _logger;

	public static void Init(ManualLogSource logger)
	{
		_logger = logger;
	}

	public static void LogError(object obj)
	{
		_logger.LogError(obj);
	}

	public static void LogWarning(object obj)
	{
		_logger.LogWarning(obj);
	}

	public static void LogInfo(object obj)
	{
		_logger.LogInfo(obj);
	}

	public static void LogDebug(object obj)
	{
		_logger.LogDebug(obj);
	}

	public static void LogPeriod(object obj)
	{
		if (GameMain.gameTick % 600 == 0L)
		{
			_logger.LogDebug(obj);
		}
	}
}
internal class UIWindow
{
	public static bool isShow;

	private static bool isMin;

	private static Rect normalSize = new Rect(0f, 0f, 240f, 200f);

	private static Rect miniSize = new Rect(0f, 0f, 75f, 20f);

	private static Rect windowRect = new Rect(300f, 250f, 240f, 200f);

	private static GUIStyle textStyle;

	public static string SpeedInput;

	public static void LoadWindowPos()
	{
		try
		{
			string[] array = SphereEditorTools.WindowPosition.Value.Split(new char[1] { ',' });
			int num = int.Parse(array[0].Trim());
			int num2 = int.Parse(array[^1].Trim());
			((Rect)(ref windowRect)).x = num;
			((Rect)(ref windowRect)).y = num2;
		}
		catch (Exception obj)
		{
			Log.LogWarning("WindowPos parse error, use defualt position (300, 250)");
			Log.LogWarning(obj);
		}
	}

	public static void LoadWindowSize()
	{
		try
		{
			string[] array = SphereEditorTools.WindowSize.Value.Split(new char[1] { ',' });
			int num = int.Parse(array[0].Trim());
			int num2 = int.Parse(array[^1].Trim());
			((Rect)(ref normalSize)).width = num;
			((Rect)(ref normalSize)).height = num2;
			Log.LogDebug($"window size: {num},{num2}");
		}
		catch (Exception obj)
		{
			Log.LogWarning("WindowPos parse error, use defualt size (240, 200)");
			Log.LogWarning(obj);
			((Rect)(ref normalSize)).width = 240f;
			((Rect)(ref normalSize)).height = 200f;
		}
		((Rect)(ref windowRect)).width = ((Rect)(ref normalSize)).width;
		((Rect)(ref windowRect)).height = ((Rect)(ref normalSize)).height;
	}

	public static void SaveWindowPos()
	{
		string value = $"{((Rect)(ref windowRect)).x}, {((Rect)(ref windowRect)).y}";
		SphereEditorTools.WindowPosition.Value = value;
	}

	public static void OnOpen()
	{
		isShow = true;
		SpeedInput = "";
	}

	public static void OnClose()
	{
		isShow = false;
	}

	public static void OnGUI()
	{
		//IL_0033: 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_004e: Expected O, but got Unknown
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: 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_0027: Expected O, but got Unknown
		//IL_0022: 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_0053: Unknown result type (might be due to invalid IL or missing references)
		if (isMin)
		{
			windowRect = GUI.Window(1297890671, windowRect, new WindowFunction(MinWindowFun), Stringpool.Tool);
		}
		else
		{
			windowRect = GUI.Window(1297890671, windowRect, new WindowFunction(NormalWindowFun), Stringpool.Tool);
		}
		EatInputInRect(windowRect);
	}

	private static void MinWindowFun(int id)
	{
		//IL_0014: 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)
		GUILayout.BeginArea(new Rect(10f, 1f, 40f, 16f));
		GUILayout.Label(Stringpool.Tool, Array.Empty<GUILayoutOption>());
		GUILayout.EndArea();
		GUILayout.BeginArea(new Rect(((Rect)(ref windowRect)).width - 27f, 1f, 25f, 16f));
		if (GUILayout.Button("▼", Array.Empty<GUILayoutOption>()))
		{
			isMin = false;
			((Rect)(ref windowRect)).height = ((Rect)(ref normalSize)).height;
			((Rect)(ref windowRect)).width = ((Rect)(ref normalSize)).width;
			((Rect)(ref windowRect)).x = ((Rect)(ref windowRect)).x - (((Rect)(ref normalSize)).width - ((Rect)(ref miniSize)).width);
		}
		GUILayout.EndArea();
		GUI.DragWindow();
	}

	private static void NormalWindowFun(int id)
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_027b: 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_028c: Expected O, but got Unknown
		GUILayout.BeginArea(new Rect(((Rect)(ref windowRect)).width - 27f, 1f, 25f, 16f));
		if (GUILayout.Button("▲", Array.Empty<GUILayoutOption>()))
		{
			isMin = true;
			((Rect)(ref windowRect)).height = ((Rect)(ref miniSize)).height;
			((Rect)(ref windowRect)).width = ((Rect)(ref miniSize)).width;
			((Rect)(ref windowRect)).x = ((Rect)(ref windowRect)).x + (((Rect)(ref normalSize)).width - ((Rect)(ref miniSize)).width);
			return;
		}
		GUILayout.EndArea();
		if (SphereEditorTools.EnableDisplayOptions.Value)
		{
			GUILayout.BeginVertical(GUI.skin.box, Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.Label(Stringpool.Display_options, Array.Empty<GUILayoutOption>());
			bool flag = Comm.DisplayMode < 2;
			if (flag != GUILayout.Toggle(flag, Stringpool.Star, Array.Empty<GUILayoutOption>()))
			{
				Comm.DisplayMode ^= 2;
				HideLayer.SetDisplayMode(Comm.DisplayMode);
			}
			if (HideLayer.EnableMask != GUILayout.Toggle(HideLayer.EnableMask, Stringpool.Mask, Array.Empty<GUILayoutOption>()))
			{
				HideLayer.SetMask(!HideLayer.EnableMask);
			}
			GUILayout.EndHorizontal();
			GUILayout.EndVertical();
		}
		if (SphereEditorTools.EnableSymmetryTool.Value)
		{
			GUILayout.BeginVertical(GUI.skin.box, Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.Label(Stringpool.SymmetryTool, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.MinWidth(180f) });
			if (GUILayout.Toggle(Comm.SymmetricMode, "", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(20f) }) != Comm.SymmetricMode)
			{
				Comm.SetSymmetricMode(!Comm.SymmetricMode);
			}
			GUILayout.EndHorizontal();
			int result = GUILayout.Toolbar(Comm.MirrorMode, Stringpool.MirrorModes, Array.Empty<GUILayoutOption>());
			if (result != Comm.MirrorMode)
			{
				Comm.MirrorMode = result;
				SymmetryTool.ChangeParameters(Comm.MirrorMode, Comm.RadialCount);
				Comm.SymmetricMode = true;
			}
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("<<", Array.Empty<GUILayoutOption>()))
			{
				Comm.RadialCount = Math.Max(Comm.RadialCount - 10, 1);
				SymmetryTool.ChangeParameters(Comm.MirrorMode, Comm.RadialCount);
				Comm.SymmetricMode = true;
			}
			if (GUILayout.Button("-", Array.Empty<GUILayoutOption>()))
			{
				if (Comm.RadialCount > 1)
				{
					SymmetryTool.ChangeParameters(Comm.MirrorMode, --Comm.RadialCount);
				}
				Comm.SymmetricMode = true;
			}
			if (textStyle == null)
			{
				textStyle = new GUIStyle(GUI.skin.textField)
				{
					alignment = (TextAnchor)4
				};
			}
			if (int.TryParse(GUILayout.TextField(Comm.RadialCount.ToString(), 3, textStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.MinWidth(35f) }), out result) && result != Comm.RadialCount && result < Comm.MaxRadialCount && result > 0)
			{
				Comm.RadialCount = result;
				SymmetryTool.ChangeParameters(Comm.MirrorMode, Comm.RadialCount);
				Comm.SymmetricMode = true;
			}
			if (GUILayout.Button("+", Array.Empty<GUILayoutOption>()))
			{
				if (Comm.RadialCount < Comm.MaxRadialCount)
				{
					SymmetryTool.ChangeParameters(Comm.MirrorMode, ++Comm.RadialCount);
				}
				Comm.SymmetricMode = true;
			}
			if (GUILayout.Button(">>", Array.Empty<GUILayoutOption>()))
			{
				Comm.RadialCount = Math.Min(Comm.RadialCount + 10, Comm.MaxRadialCount);
				SymmetryTool.ChangeParameters(Comm.MirrorMode, Comm.RadialCount);
				Comm.SymmetricMode = true;
			}
			GUILayout.EndHorizontal();
			GUILayout.EndVertical();
		}
		if (SphereEditorTools.EnableOrbitTool.Value)
		{
			GUILayout.BeginVertical(GUI.skin.box, Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.Label(Stringpool.OrbitTool, Array.Empty<GUILayoutOption>());
			bool flag = EditOrbit.EnableAnchorMode;
			if (flag != GUILayout.Toggle(flag, Stringpool.AnchorMode, Array.Empty<GUILayoutOption>()))
			{
				EditOrbit.Toggle(!flag);
			}
			GUILayout.EndHorizontal();
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.Label(Stringpool.AngularSpeed, Array.Empty<GUILayoutOption>());
			SpeedInput = GUILayout.TextField(SpeedInput, 7, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.MinWidth(35f) });
			if (GUILayout.Button(Stringpool.Set1, Array.Empty<GUILayoutOption>()))
			{
				if (float.TryParse(SpeedInput, out var result2) && result2 >= 0f)
				{
					EditOrbit.TrySetAngularSpeed(result2);
				}
				else if (SpeedInput == "")
				{
					EditOrbit.TrySetAngularSpeed(-1f);
				}
				else
				{
					SpeedInput = EditOrbit.AuglarSpeed.ToString();
				}
			}
			GUILayout.EndHorizontal();
			GUILayout.EndVertical();
		}
		GUI.DragWindow();
	}

	public static void EatInputInRect(Rect eatRect)
	{
		//IL_0013: 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_002e: Unknown result type (might be due to invalid IL or missing references)
		if ((Input.GetMouseButton(0) || Input.GetMouseButtonDown(0)) && ((Rect)(ref eatRect)).Contains(new Vector2(Input.mousePosition.x, (float)Screen.height - Input.mousePosition.y)))
		{
			Input.ResetInputAxes();
		}
	}
}