public static IEnumerator ModifyHoldables() { HoldablesSettingCache = settings.Holdables; yield return(null); var holdableSettings = settings.Holdables; var holdables = SceneManager.Instance.SetupState .GetValue <SetupRoom>("setupRoom") .GetComponentsInChildren <FloatingHoldable>() .ToDictionary(holdable => holdable.name.Replace("(Clone)", "").Replace("Holdable", ""), holdable => holdable); var holdableSpots = holdables.ToDictionary(pair => pair.Key, pair => pair.Key); foreach (var pair in holdables) { var name = pair.Key; var holdable = pair.Value; if (!holdableSettings.ContainsKey(name)) { userSettings.Holdables.Add(name, true); holdableSettings.Add(name, true); UpdateSettings(false); } Dictionary <string, Vector3> positionOffsets = new Dictionary <string, Vector3>() { { "FreeplayDevice", new Vector3(0.1f, 0.0075f, -0.15f) } }; Dictionary <string, Vector3> rotationOffsets = new Dictionary <string, Vector3>() { { "FreeplayDevice", new Vector3(0, 90, -5) }, { "ModManager", new Vector3(0, 90, 0) } }; switch (holdableSettings[name]) { case bool active: holdable.gameObject.SetActive(active); break; case string originalTargetName when holdables.ContainsKey(originalTargetName): var targetName = holdableSpots[originalTargetName]; var targetHoldable = holdables[targetName]; var oldPosition = holdable.transform.position; var oldRotation = holdable.transform.rotation.eulerAngles; var newRotation = targetHoldable.transform.rotation.eulerAngles; positionOffsets.TryGetValue(targetName, out Vector3 oldPosOffset); positionOffsets.TryGetValue(name, out Vector3 newPosOffset); rotationOffsets.TryGetValue(targetName, out Vector3 oldRotOffset); rotationOffsets.TryGetValue(name, out Vector3 newRotOffset); holdable.transform.position = targetHoldable.transform.position + oldPosOffset - newPosOffset; holdable.transform.rotation = Quaternion.Euler(newRotation + oldRotOffset - newRotOffset); holdable.OrigPosition = holdable.transform.position; holdable.OrigRotation = holdable.transform.rotation; targetHoldable.transform.position = oldPosition - oldPosOffset + newPosOffset; targetHoldable.transform.rotation = Quaternion.Euler(oldRotation + newRotOffset - oldRotOffset); targetHoldable.OrigPosition = targetHoldable.transform.position; targetHoldable.OrigRotation = targetHoldable.transform.rotation; holdableSpots[name] = targetName; holdableSpots[targetName] = name; break; default: Instance.OnReadError(new Exception($"Unexpected value for holdable {name}: {holdableSettings[name]}")); break; } } }