using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.EventSystems; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("CleanCaseboard")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("CleanCaseboard")] [assembly: AssemblyTitle("CleanCaseboard")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } public class CleanCaseboardBehaviour : MonoBehaviour { private PinnedItemController _hoveredPic; private PinnedItemController _pendingSnap; private readonly List _sharedResults = new List(); public static CleanCaseboardBehaviour Instance { get; private set; } private void Awake() { Instance = this; } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } private void Update() { //IL_0001: 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 (Input.GetKeyDown(CleanCaseboardPlugin.SnapKey) || Input.GetKeyDown(CleanCaseboardPlugin.SnapButton)) { _pendingSnap = ResolveTargetCard(); } } public void NoteHover(PinnedItemController pic, bool hovered) { if (!((Object)(object)pic == (Object)null)) { if (hovered) { _hoveredPic = pic; } else if ((Object)(object)_hoveredPic == (Object)(object)pic) { _hoveredPic = null; } } } public void ApplySnap(PinnedItemController pic) { if ((Object)(object)pic == (Object)null || (Object)(object)_pendingSnap != (Object)(object)pic) { return; } _pendingSnap = null; RectTransform val = ((Il2CppObjectBase)((Component)pic).transform).TryCast(); if (!((Object)(object)val == (Object)null)) { Transform parent = ((Transform)val).parent; if (!((Object)(object)parent == (Object)null)) { DoSnap(pic, parent, val); } } } private PinnedItemController ResolveTargetCard() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown //IL_001e: 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) EventSystem current = EventSystem.current; if ((Object)(object)current != (Object)null) { PointerEventData val = new PointerEventData(current); val.position = Vector2.op_Implicit(Input.mousePosition); _sharedResults.Clear(); current.RaycastAll(val, _sharedResults); int num = ((_sharedResults.Count < 40) ? _sharedResults.Count : 40); for (int i = 0; i < num; i++) { GameObject gameObject = _sharedResults[i].gameObject; if (!((Object)(object)gameObject == (Object)null)) { PinnedItemController val2 = FindPicUpwards(gameObject.transform); if ((Object)(object)val2 != (Object)null) { return val2; } } } } if ((Object)(object)_hoveredPic != (Object)null) { return _hoveredPic; } if ((Object)(object)current != (Object)null) { GameObject currentSelectedGameObject = current.currentSelectedGameObject; if ((Object)(object)currentSelectedGameObject != (Object)null) { return FindPicUpwards(currentSelectedGameObject.transform); } } return null; } private PinnedItemController FindPicUpwards(Transform t) { Transform val = t; int num = 0; while ((Object)(object)val != (Object)null && num < 64) { PinnedItemController component = ((Component)val).GetComponent(); if ((Object)(object)component != (Object)null) { return component; } val = val.parent; num++; } return null; } private void DoSnap(PinnedItemController pic, Transform pinnedRoot, RectTransform dragTarget) { //IL_0004: 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_000d: 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_0034: 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_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) Vector2 alignPointLocal = GetAlignPointLocal(pinnedRoot, dragTarget); FindReferences(pinnedRoot, dragTarget, alignPointLocal, out RectTransform refX, out RectTransform refY); if (!((Object)(object)refX == (Object)null) || !((Object)(object)refY == (Object)null)) { Vector2 val = alignPointLocal; if ((Object)(object)refX != (Object)null) { val.x = GetAlignPointLocal(pinnedRoot, refX).x; } if ((Object)(object)refY != (Object)null) { val.y = GetAlignPointLocal(pinnedRoot, refY).y; } Vector2 rootLocal = GetRootLocal(pinnedRoot, dragTarget); Vector2 val2 = alignPointLocal - rootLocal; WritePosition(pic, dragTarget, val - val2); } } private void WritePosition(PinnedItemController pic, RectTransform dragTarget, Vector2 targetLocal) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0023: 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) //IL_0028: 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_003a: 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_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_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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) Vector3 position = ((Transform)dragTarget).position; Vector2 val = (((Object)(object)pic.joint != (Object)null) ? ((AnchoredJoint2D)pic.joint).connectedAnchor : Vector2.zero); pic.SetPostion(targetLocal); Vector3 position2 = ((Transform)dragTarget).position; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(position2.x - position.x, position2.y - position.y); if ((Object)(object)pic.joint != (Object)null && (Object)(object)((Joint2D)pic.joint).connectedBody == (Object)null) { Vector2 connectedAnchor = ((AnchoredJoint2D)pic.joint).connectedAnchor; Vector2 val3 = connectedAnchor - val; if (((Vector2)(ref val3)).sqrMagnitude < 0.0001f && ((Vector2)(ref val2)).sqrMagnitude > 0.0001f) { ((AnchoredJoint2D)pic.joint).connectedAnchor = connectedAnchor + val2; } } if ((Object)(object)pic.rb != (Object)null) { pic.rb.velocity = Vector2.zero; pic.rb.angularVelocity = 0f; pic.rb.position = new Vector2(position2.x, position2.y); } } private bool IsCandidate(RectTransform child, RectTransform dragTarget) { if ((Object)(object)child == (Object)null) { return false; } if ((Object)(object)child == (Object)(object)dragTarget) { return false; } if (!((Component)child).gameObject.activeInHierarchy) { return false; } return true; } private void FindReferences(Transform pinnedRoot, RectTransform dragTarget, Vector2 origin, out RectTransform refX, out RectTransform refY) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) refX = null; refY = null; float value = CleanCaseboardPlugin.SearchRadius.Value; RectTransform val = null; RectTransform val2 = null; float num = float.MaxValue; float num2 = float.MaxValue; int childCount = pinnedRoot.childCount; for (int i = 0; i < childCount; i++) { RectTransform val3 = ((Il2CppObjectBase)pinnedRoot.GetChild(i)).TryCast(); if (IsCandidate(val3, dragTarget)) { Vector2 alignPointLocal = GetAlignPointLocal(pinnedRoot, val3); float num3 = Mathf.Abs(origin.x - alignPointLocal.x); if (num3 <= value && num3 < num) { num = num3; val = val3; } float num4 = Mathf.Abs(origin.y - alignPointLocal.y); if (num4 <= value && num4 < num2) { num2 = num4; val2 = val3; } } } if ((Object)(object)val != (Object)null) { refX = WalkColumnToTop(pinnedRoot, dragTarget, val); } if ((Object)(object)val2 != (Object)null) { refY = WalkRowToLeft(pinnedRoot, dragTarget, val2); } } private RectTransform WalkColumnToTop(Transform pinnedRoot, RectTransform dragTarget, RectTransform seed) { //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_002a: 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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006e: 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_0093: Unknown result type (might be due to invalid IL or missing references) float value = CleanCaseboardPlugin.LineTolerance.Value; RectTransform val = seed; int childCount = pinnedRoot.childCount; for (int i = 0; i < 8; i++) { Vector2 alignPointLocal = GetAlignPointLocal(pinnedRoot, val); RectTransform val2 = val; float y = alignPointLocal.y; for (int j = 0; j < childCount; j++) { RectTransform val3 = ((Il2CppObjectBase)pinnedRoot.GetChild(j)).TryCast(); if (IsCandidate(val3, dragTarget)) { Vector2 alignPointLocal2 = GetAlignPointLocal(pinnedRoot, val3); if (Mathf.Abs(alignPointLocal2.x - alignPointLocal.x) <= value && alignPointLocal2.y > y) { y = alignPointLocal2.y; val2 = val3; } } } if ((Object)(object)val2 == (Object)(object)val) { break; } val = val2; } return val; } private RectTransform WalkRowToLeft(Transform pinnedRoot, RectTransform dragTarget, RectTransform seed) { //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_002a: 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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006e: 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_0093: Unknown result type (might be due to invalid IL or missing references) float value = CleanCaseboardPlugin.LineTolerance.Value; RectTransform val = seed; int childCount = pinnedRoot.childCount; for (int i = 0; i < 8; i++) { Vector2 alignPointLocal = GetAlignPointLocal(pinnedRoot, val); RectTransform val2 = val; float x = alignPointLocal.x; for (int j = 0; j < childCount; j++) { RectTransform val3 = ((Il2CppObjectBase)pinnedRoot.GetChild(j)).TryCast(); if (IsCandidate(val3, dragTarget)) { Vector2 alignPointLocal2 = GetAlignPointLocal(pinnedRoot, val3); if (Mathf.Abs(alignPointLocal2.y - alignPointLocal.y) <= value && alignPointLocal2.x < x) { x = alignPointLocal2.x; val2 = val3; } } } if ((Object)(object)val2 == (Object)(object)val) { break; } val = val2; } return val; } private Vector2 GetRootLocal(Transform pinnedRoot, RectTransform rt) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_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_0022: Unknown result type (might be due to invalid IL or missing references) Vector3 val = pinnedRoot.InverseTransformPoint(((Transform)rt).position); return new Vector2(val.x, val.y); } private Vector2 GetAlignPointLocal(Transform pinnedRoot, RectTransform rt) { //IL_0016: 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_00d2: 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_007f: 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_0053: 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_005e: Unknown result type (might be due to invalid IL or missing references) //IL_009c: 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_00a2: 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_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_00af: 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_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Transform)rt).parent != (Object)(object)pinnedRoot) { return GetRootLocal(pinnedRoot, rt); } PinnedItemController component = ((Component)rt).GetComponent(); Vector3 val = default(Vector3); if ((Object)(object)component != (Object)null && (Object)(object)component.joint != (Object)null) { Vector2 anchor = ((AnchoredJoint2D)component.joint).anchor; ((Vector3)(ref val))..ctor(anchor.x, anchor.y, 0f); } else { Rect rect = rt.rect; ((Vector3)(ref val))..ctor(((Rect)(ref rect)).center.x, ((Rect)(ref rect)).yMax, 0f); } Vector3 val2 = ((Transform)rt).localRotation * val; Vector3 localPosition = ((Transform)rt).localPosition; return new Vector2(localPosition.x + val2.x, localPosition.y + val2.y); } } [HarmonyPatch] public static class CleanCaseboardPatches { [HarmonyPatch(typeof(PinnedItemController), "LateUpdate")] [HarmonyPostfix] public static void PinnedItemController_LateUpdate_Postfix(PinnedItemController __instance) { CleanCaseboardBehaviour instance = CleanCaseboardBehaviour.Instance; if (!((Object)(object)instance == (Object)null)) { instance.ApplySnap(__instance); } } [HarmonyPatch(typeof(PinnedItemController), "SetHovered")] [HarmonyPostfix] public static void PinnedItemController_SetHovered_Postfix(PinnedItemController __instance, bool val) { CleanCaseboardBehaviour instance = CleanCaseboardBehaviour.Instance; if (!((Object)(object)instance == (Object)null)) { instance.NoteHover(__instance, val); } } } [BepInPlugin("orionis.cleancaseboard", "Clean Caseboard", "1.0.0")] public class CleanCaseboardPlugin : BasePlugin { public static KeyCode SnapKey = (KeyCode)304; public static KeyCode SnapButton = (KeyCode)332; public static ConfigEntry SearchRadius; public static ConfigEntry LineTolerance; private static ConfigEntry _snapKeyName; private static ConfigEntry _snapButtonName; private Harmony _harmony; public override void Load() { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Expected O, but got Unknown _snapKeyName = ((BasePlugin)this).Config.Bind("Controls", "SnapKey", "LeftShift", "Key pressed while hovering a pinned item to snap it into the nearest row and column. Accepts any Unity KeyCode name, such as LeftShift, Space, or F. Set to None to disable."); _snapButtonName = ((BasePlugin)this).Config.Bind("Controls", "SnapButton", "JoystickButton2", "Controller button for the same action. JoystickButton2 is X on an Xbox pad. Accepts JoystickButton0 through JoystickButton19. Set to None to disable."); SearchRadius = ((BasePlugin)this).Config.Bind("Tuning", "SearchRadius", 150f, new ConfigDescription("How far away another item can be and still count as a row or column to join. Larger values snap more eagerly.", (AcceptableValueBase)(object)new AcceptableValueRange(20f, 600f), Array.Empty())); LineTolerance = ((BasePlugin)this).Config.Bind("Tuning", "LineTolerance", 50f, new ConfigDescription("How far apart two items can be and still count as part of the same row or column. Larger values group ragged rows together.", (AcceptableValueBase)(object)new AcceptableValueRange(5f, 200f), Array.Empty())); RefreshBindings(); _snapKeyName.SettingChanged += OnBindingChanged; _snapButtonName.SettingChanged += OnBindingChanged; _harmony = new Harmony("orionis.cleancaseboard"); _harmony.PatchAll(); ((BasePlugin)this).AddComponent(); ((BasePlugin)this).Log.LogInfo((object)"Clean Caseboard loaded."); } private static void OnBindingChanged(object sender, EventArgs e) { RefreshBindings(); } private static void RefreshBindings() { //IL_0010: 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_0029: 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) SnapKey = Parse(_snapKeyName.Value, (KeyCode)304); SnapButton = Parse(_snapButtonName.Value, (KeyCode)332); } private static KeyCode Parse(string name, KeyCode fallback) { //IL_000b: 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_0020: 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_001c: 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_0024: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(name)) { return fallback; } if (Enum.TryParse(name, ignoreCase: true, out KeyCode result)) { return result; } return fallback; } }