Exemplo n.º 1
0
    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;
            }
        }
    }