new public bool Pre()
        {
            if (settings.MovementScript.scriptList.Length == 0 ||
                (!SceneUtil.isInSong && !settings.MovementScript.enableInMenu) ||
                cam.settings.type == Configuration.CameraType.FirstPerson
                )
            {
                Reset();
                return(true);
            }

            if (loadedScript == null)
            {
                var possibleScripts = settings.MovementScript.scriptList.Where(MovementScriptManager.movementScripts.ContainsKey).ToArray();

                if (possibleScripts.Length == 0)
                {
                    return(true);
                }

                var scriptToUse = possibleScripts[randomSource.Next(possibleScripts.Length)];

                loadedScript = MovementScriptManager.movementScripts[scriptToUse];

                if (loadedScript == null)
                {
                    return(true);
                }

                lastFov = cam.UCamera.fieldOfView;

                Plugin.Log.Info($"Applying Movementscript {scriptToUse} for camera {cam.name}");

                scriptTransformer ??= cam.transformchain.AddOrGet("MovementScript", TransformerOrders.MovementScriptProcessor);
            }

            if (loadedScript.syncToSong && SceneUtil.isInSong)
            {
                /*
                 * In MP the TimeSyncController doesnt exist in the countdown phase,
                 * so if the script is synced to the song we'll just hardlock the time
                 * at 0 if the controller doesnt exist
                 */
                currentAnimationTime = !SceneUtil.hasSongPlayer ? 0 : SceneUtil.audioTimeSyncController.songTime;
            }
            else
            {
                currentAnimationTime += cam.timeSinceLastRender;
            }

            if (settings.MovementScript.fromOrigin)
            {
                cam.transformer.position = Vector3.zero;
                cam.transformer.rotation = Quaternion.identity;
            }

            if (currentAnimationTime > loadedScript.scriptDuration)
            {
                if (!loadedScript.loop)
                {
                    return(true);
                }

                currentAnimationTime %= loadedScript.scriptDuration;
                frameIndex            = 0;
            }

            for (; ;)
            {
                if (targetFrame.startTime > currentAnimationTime)
                {
                    break;
                }

                if (targetFrame.transitionEndTime <= currentAnimationTime)
                {
                    lastPos = scriptTransformer.position = targetFrame.position;
                    lastRot = scriptTransformer.rotation = targetFrame.rotation;
                    if (targetFrame.FOV > 0)
                    {
                        lastFov = cam.UCamera.fieldOfView = targetFrame.FOV;
                    }
                }
                else if (targetFrame.startTime <= currentAnimationTime)
                {
                    var frameProgress = (currentAnimationTime - targetFrame.startTime) / targetFrame.duration;

                    if (targetFrame.transition == MoveType.Eased)
                    {
                        frameProgress = Easings.EaseInOutCubic01(frameProgress);
                    }

                    scriptTransformer.position = Vector3.LerpUnclamped(lastPos, targetFrame.position, frameProgress);
                    scriptTransformer.rotation = Quaternion.LerpUnclamped(lastRot, targetFrame.rotation, frameProgress);

                    if (targetFrame.FOV > 0f)
                    {
                        cam.UCamera.fieldOfView = Mathf.LerpUnclamped(lastFov, targetFrame.FOV, frameProgress);
                    }

                    break;
                }

                if (++frameIndex >= loadedScript.frames.Count)
                {
                    frameIndex = 0;
                    break;
                }
            }

            return(true);
        }