Decompiled source of LongSorter v1.3.3

LongSorter.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("LongSorter")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyFileVersion("1.3.3.0")]
[assembly: AssemblyInformationalVersion("1.0.0+1d3582f957efb8fb66ae9225fa1380a9af0944c3")]
[assembly: AssemblyProduct("LongSorter")]
[assembly: AssemblyTitle("LongSorter")]
[assembly: AssemblyVersion("1.3.3.0")]
namespace LongSorter;

[BepInPlugin("com.sylf.dsp.LongSorter", "LongSorter", "1.3.3")]
public class LongSorter : BaseUnityPlugin
{
	internal static class Patch
	{
		[CompilerGenerated]
		private sealed class <CheckBuildConditions_Transpiler>d__0 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private CodeInstruction <>2__current;

			private int <>l__initialThreadId;

			private IEnumerable<CodeInstruction> instructions;

			public IEnumerable<CodeInstruction> <>3__instructions;

			private List<CodeInstruction> <ins>5__2;

			private List<int> <patchPos>5__3;

			private MethodInfo <m>5__4;

			private int <i>5__5;

			CodeInstruction IEnumerator<CodeInstruction>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <CheckBuildConditions_Transpiler>d__0(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<ins>5__2 = null;
				<patchPos>5__3 = null;
				<m>5__4 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0206: Unknown result type (might be due to invalid IL or missing references)
				//IL_0210: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					<ins>5__2 = instructions.ToList();
					<patchPos>5__3 = new List<int>(2);
					FieldInfo fieldInfo = AccessTools.Field(typeof(BuildPreview), "condition");
					<m>5__4 = typeof(Patch).GetMethod("LengthCorrection");
					for (int i = 0; i < <ins>5__2.Count; i++)
					{
						if (!(<ins>5__2[i].opcode != OpCodes.Stfld) && <ins>5__2[i].operand is FieldInfo fieldInfo2 && !(fieldInfo2 != fieldInfo) && !(<ins>5__2[i - 1].opcode != OpCodes.Ldc_I4_S) && <ins>5__2[i - 1].operand is sbyte b && b == 14 && (!(<ins>5__2[i - 3].opcode != OpCodes.Ble_Un) || !(<ins>5__2[i - 3].opcode != OpCodes.Ble_Un_S)))
						{
							<patchPos>5__3.Add(i - 5);
							if (<patchPos>5__3.Count == 2)
							{
								break;
							}
						}
					}
					<i>5__5 = 0;
					break;
				}
				case 1:
					<>1__state = -1;
					<>2__current = <ins>5__2[<i>5__5 + 1];
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					<>2__current = new CodeInstruction(OpCodes.Call, (object)<m>5__4);
					<>1__state = 3;
					return true;
				case 3:
					<>1__state = -1;
					<>2__current = <ins>5__2[<i>5__5 + 2];
					<>1__state = 4;
					return true;
				case 4:
					<>1__state = -1;
					<i>5__5 += 2;
					goto IL_0280;
				case 5:
					{
						<>1__state = -1;
						goto IL_0280;
					}
					IL_0280:
					<i>5__5++;
					break;
				}
				if (<i>5__5 < <ins>5__2.Count)
				{
					if (<patchPos>5__3.Contains(<i>5__5))
					{
						<>2__current = <ins>5__2[<i>5__5];
						<>1__state = 1;
						return true;
					}
					<>2__current = <ins>5__2[<i>5__5];
					<>1__state = 5;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}

			[DebuggerHidden]
			IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator()
			{
				<CheckBuildConditions_Transpiler>d__0 <CheckBuildConditions_Transpiler>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<CheckBuildConditions_Transpiler>d__ = this;
				}
				else
				{
					<CheckBuildConditions_Transpiler>d__ = new <CheckBuildConditions_Transpiler>d__0(0);
				}
				<CheckBuildConditions_Transpiler>d__.instructions = <>3__instructions;
				return <CheckBuildConditions_Transpiler>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<CodeInstruction>)this).GetEnumerator();
			}
		}

		[IteratorStateMachine(typeof(<CheckBuildConditions_Transpiler>d__0))]
		private static IEnumerable<CodeInstruction> CheckBuildConditions_Transpiler(IEnumerable<CodeInstruction> instructions)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <CheckBuildConditions_Transpiler>d__0(-2)
			{
				<>3__instructions = instructions
			};
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(BuildTool_Inserter), "CheckBuildConditions")]
		public static IEnumerable<CodeInstruction> BuildTool_Inserter_Transpiler(IEnumerable<CodeInstruction> instructions)
		{
			return CheckBuildConditions_Transpiler(instructions);
		}

		[HarmonyTranspiler]
		[HarmonyPatch(typeof(BuildTool_Inserter), "DeterminePreviews")]
		public static IEnumerable<CodeInstruction> BuildTool_Inserter_DeterminePreviews_Transpiler(IEnumerable<CodeInstruction> instructions)
		{
			MethodInfo method = typeof(List<PosePair>).GetMethod("Add");
			MethodInfo method2 = typeof(Patch).GetMethod("AngleCorrection11");
			MethodInfo method3 = typeof(Patch).GetMethod("AngleCorrection14");
			MethodInfo methodInfo = typeof(Patch).GetMethod("AngleCorrection40");
			List<CodeInstruction> list = instructions.ToList();
			for (int i = 0; i < list.Count; i++)
			{
				if (list[i].opcode == OpCodes.Callvirt && list[i].operand is MethodInfo methodInfo2 && methodInfo2 == method)
				{
					for (int num = i - 1; num > i - 22; num--)
					{
						if (!(list[num].opcode != OpCodes.Ldc_R4) && list[num].operand is float num2)
						{
							if (Mathf.Approximately(num2, 11f))
							{
								list[num].opcode = OpCodes.Call;
								list[num].operand = method2;
								break;
							}
							if (Mathf.Approximately(num2, 14f))
							{
								list[num].opcode = OpCodes.Call;
								list[num].operand = method3;
								break;
							}
						}
					}
				}
				if (methodInfo != null && list[i].opcode == OpCodes.Ldloc_S && i + 1 < list.Count && list[i + 1].opcode == OpCodes.Ldc_R4 && list[i + 1].operand is float num3 && num3 == 40f)
				{
					list[i + 1].opcode = OpCodes.Call;
					list[i + 1].operand = methodInfo;
					methodInfo = null;
				}
			}
			return list.AsEnumerable();
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(BuildTool_Inserter), "CheckBuildConditions")]
		public static void BuildTool_Inserter_CheckBuildConditions_Postfix(BuildTool_Inserter __instance, ref bool __result)
		{
			//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_0031: Invalid comparison between Unknown and I4
			//IL_0047: 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_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Invalid comparison between Unknown and I4
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			if (__result || !LongMode() || ((BuildTool)__instance).buildPreviews.Count != 1)
			{
				return;
			}
			BuildPreview val = ((BuildTool)__instance).buildPreviews[0];
			EBuildCondition condition = val.condition;
			if ((int)condition != 13)
			{
				if ((int)condition == 33 && CanIgnoreCollide(__instance, val))
				{
					__result = true;
				}
			}
			else if ((double)Vector3.Distance(val.lpos, val.lpos2) > 1.1333332538604737)
			{
				__result = true;
			}
			if (__result)
			{
				val.condition = (EBuildCondition)0;
				((BuildTool)__instance).actionBuild.model.cursorText = val.conditionText;
				((BuildTool)__instance).actionBuild.model.cursorState = 0;
				if (!VFInput.onGUI)
				{
					UICursor.SetCursor((ECursor)0);
				}
			}
		}

		private static bool CanIgnoreCollide(BuildTool_Inserter tool, BuildPreview buildPreview)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			if (!buildPreview.desc.hasBuildCollider)
			{
				return false;
			}
			ColliderData val2 = default(ColliderData);
			for (int i = 0; i < BuildToolAccess.TmpColsLength(); i++)
			{
				Collider val = BuildToolAccess.TmpCols()[i];
				if (((BuildTool)tool).planet.physics.GetColliderData(val, ref val2) && (int)((ColliderData)(ref val2)).objType == 0)
				{
					int objId = ((ColliderData)(ref val2)).objId;
					if (((BuildTool)tool).planet.factory.entityPool[objId].beltId <= 0)
					{
						return false;
					}
				}
			}
			return true;
		}

		private static bool LongMode()
		{
			return VFInput.control;
		}

		public static float LengthCorrection(float val)
		{
			if (!LongMode())
			{
				return val;
			}
			return val * 5f;
		}

		public static float AngleCorrection11()
		{
			if (!LongMode())
			{
				return 11f;
			}
			return 1000f;
		}

		public static float AngleCorrection14()
		{
			if (!LongMode())
			{
				return 14f;
			}
			return 1000f;
		}

		public static float AngleCorrection40()
		{
			if (!LongMode())
			{
				return 40f;
			}
			if (!VFInput.shift)
			{
				return 1000f;
			}
			return 6f;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(PlanetFactory), "OnInserterBuilt")]
		public static bool PlanetFactory_OnInserterBuilt_Prefix()
		{
			return false;
		}
	}

	private class BuildToolAccess : BuildTool
	{
		public static int TmpColsLength()
		{
			int num = 0;
			Collider[] tmp_cols = BuildTool._tmp_cols;
			for (int i = 0; i < tmp_cols.Length && (Object)(object)tmp_cols[i] != (Object)null; i++)
			{
				num++;
			}
			return num;
		}

		public static Collider[] TmpCols()
		{
			return BuildTool._tmp_cols;
		}
	}

	private const string Name = "LongSorter";

	private const string Guid = "com.sylf.dsp.LongSorter";

	private static ManualLogSource _logger;

	private void Awake()
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		_logger = ((BaseUnityPlugin)this).Logger;
		new Harmony("com.sylf.dsp.LongSorter").PatchAll(typeof(Patch));
	}
}
public static class MyPluginInfo
{
	public const string PLUGIN_GUID = "LongSorter";

	public const string PLUGIN_NAME = "LongSorter";

	public const string PLUGIN_VERSION = "1.0.0";
}