using ABI.CCK.Components; using ABI_RC.Core.Savior; using HarmonyLib; using MelonLoader; using UnityEngine; //Thanks Ben! I was scared of transpiler so I reworked a bit... namespace DesktopVRSwitch.Patches; [HarmonyPatch] internal class CVRPickupObject_Patch { [HarmonyPrefix] [HarmonyPatch(typeof(CVRPickupObject), "Start")] private static void CVRPickupObject_Start_Prefix(ref CVRPickupObject __instance) { Transform desktopOrigin = __instance.gripOrigin.Find("[Desktop]"); if (desktopOrigin == null) return; var pickupTracker = __instance.GetComponent(); if (pickupTracker != null) return; __instance.gameObject.AddComponent(); StorePreviousPosition(__instance, (!MetaPort.Instance.isUsingVr) ? __instance.gripOrigin : desktopOrigin); } private static void StorePreviousPosition(CVRPickupObject pickupObject, Transform gripOrigin) { MelonLogger.Msg("Storing previous gripOrigin."); CVRPickupObjectTracker.previousGripOrigin[pickupObject] = gripOrigin; } } public class CVRPickupObjectTracker : MonoBehaviour { //maybe i should store both transforms instead and getcomponent for CVRPickupObject..? public static Dictionary previousGripOrigin = new(); public void OnSwitch() { var pickupObject = GetComponent(); if (pickupObject != null) { if (pickupObject.IsGrabbedByMe()) pickupObject.Drop(); (previousGripOrigin[pickupObject], pickupObject.gripOrigin) = (pickupObject.gripOrigin, previousGripOrigin[pickupObject]); } } private void OnDestroy() { var pickupObject = GetComponent(); if (pickupObject != null) previousGripOrigin.Remove(pickupObject); } }