private static void Postfix(Vector3 ____centerPos, ObstacleData obstacleData, ref BeatmapObjectSpawnMovementData.ObstacleSpawnData __result)
        {
            if (!NoodleObjectDatas.TryGetValue(obstacleData, out NoodleObjectData noodleObjectData))
            {
                return;
            }

            NoodleObstacleData noodleData = (NoodleObstacleData)noodleObjectData;

            float?njs         = noodleData.NJS;
            float?spawnoffset = noodleData.SpawnOffset;

            float?startX = noodleData.StartX;
            float?startY = noodleData.StartY;

            float?height = noodleData.Height;

            Vector3?finalNoteOffset = null;

            Vector3 moveStartPos   = __result.moveStartPos;
            Vector3 moveEndPos     = __result.moveEndPos;
            Vector3 jumpEndPos     = __result.jumpEndPos;
            float   obstacleHeight = __result.obstacleHeight;

            GetNoteJumpValues(njs, spawnoffset, out float jumpDuration, out float _, out Vector3 localMoveStartPos, out Vector3 localMoveEndPos, out Vector3 localJumpEndPos);

            // Actual wall stuff
            if (startX.HasValue || startY.HasValue || njs.HasValue || spawnoffset.HasValue)
            {
                // Ripped from base game
                Vector3 noteOffset = GetNoteOffset(obstacleData, startX, null);
                noteOffset.y = startY.HasValue ? VerticalObstaclePosY + (startY.GetValueOrDefault(0) * NoteLinesDistance) : ((obstacleData.obstacleType == ObstacleType.Top)
                    ? (TopObstaclePosY + JumpOffsetY) : VerticalObstaclePosY);

                finalNoteOffset = noteOffset;

                moveStartPos = localMoveStartPos + noteOffset;
                moveEndPos   = localMoveEndPos + noteOffset;
                jumpEndPos   = localJumpEndPos + noteOffset;
            }

            if (height.HasValue)
            {
                obstacleHeight = height.Value * NoteLinesDistance;
            }

            __result = new BeatmapObjectSpawnMovementData.ObstacleSpawnData(moveStartPos, moveEndPos, jumpEndPos, obstacleHeight, __result.moveDuration, jumpDuration, __result.noteLinesDistance);

            if (!finalNoteOffset.HasValue)
            {
                Vector3 noteOffset = GetNoteOffset(obstacleData, startX, null);
                noteOffset.y    = (obstacleData.obstacleType == ObstacleType.Top) ? (TopObstaclePosY + JumpOffsetY) : VerticalObstaclePosY;
                finalNoteOffset = noteOffset;
            }

            noodleData.NoteOffset = ____centerPos + finalNoteOffset.Value;
            float?width = noodleData.Width;

            noodleData.XOffset = ((width.GetValueOrDefault(obstacleData.lineIndex) / 2f) - 0.5f) * NoteLinesDistance;
        }
Пример #2
0
        private static float ObstacleTimeAdjust(float original, ObstacleData obstacleData, float move1Duration, float finishMovementTime)
        {
            if (original > move1Duration && NoodleObjectDatas.TryGetValue(obstacleData, out NoodleObjectData noodleData))
            {
                float?time = (float?)AnimationHelper.TryGetPropertyAsObject(noodleData.Track, TIME);
                if (time.HasValue)
                {
                    return((time.Value * (finishMovementTime - move1Duration)) + move1Duration);
                }
            }

            return(original);
        }
Пример #3
0
        private static float GetCustomLength(float @default, ObstacleData obstacleData)
        {
            if (NoodleObjectDatas.TryGetValue(obstacleData, out NoodleObjectData noodleObjectData))
            {
                NoodleObstacleData noodleData = (NoodleObstacleData)noodleObjectData;
                float?length = noodleData.Length;
                if (length.HasValue)
                {
                    return(length.Value * NoteLinesDistance);
                }
            }

            return(@default);
        }
Пример #4
0
        private static float GetCustomWidth(float @default, ObstacleData obstacleData)
        {
            if (NoodleObjectDatas.TryGetValue(obstacleData, out NoodleObjectData noodleObjectData))
            {
                NoodleObstacleData noodleData = (NoodleObstacleData)noodleObjectData;
                float?width = noodleData.Width;
                if (width.HasValue)
                {
                    return(width.Value);
                }
            }

            return(@default);
        }
Пример #5
0
        private static float GetFlipYSide(NoteData noteData, float @default)
        {
            float output = @default;

            if (NoodleObjectDatas.TryGetValue(noteData, out NoodleObjectData noodleObjectData))
            {
                NoodleNoteData noodleData = (NoodleNoteData)noodleObjectData;
                float?         flipYSide  = noodleData.FlipYSideInternal;
                if (flipYSide.HasValue)
                {
                    output = flipYSide.Value;
                }
            }

            return(output);
        }
        private static float GetAheadTime(BeatmapObjectCallbackData beatmapObjectCallbackData, BeatmapObjectData beatmapObjectData, float @default)
        {
            if (beatmapObjectCallbackData.callback.Method == _beatmapObjectSpawnControllerCallback &&
                (beatmapObjectData is CustomObstacleData || beatmapObjectData is CustomNoteData || beatmapObjectData is WaypointData))
            {
                if (NoodleObjectDatas.TryGetValue(beatmapObjectData, out NoodleObjectData noodleData))
                {
                    float?aheadTime = noodleData.AheadTimeInternal;
                    if (aheadTime.HasValue)
                    {
                        return(aheadTime.Value);
                    }
                }
            }

            return(@default);
        }
Пример #7
0
        private static Quaternion GetWorldRotation(ObstacleData obstacleData, float @default)
        {
            Quaternion worldRotation = Quaternion.Euler(0, @default, 0);

            if (NoodleObjectDatas.TryGetValue(obstacleData, out NoodleObjectData noodleObjectData))
            {
                NoodleObstacleData noodleData = (NoodleObstacleData)noodleObjectData;

                Quaternion?worldRotationQuaternion = noodleData.WorldRotationQuaternion;
                if (worldRotationQuaternion.HasValue)
                {
                    worldRotation = worldRotationQuaternion.Value;
                }

                noodleData.WorldRotation = worldRotation;
            }

            return(worldRotation);
        }
Пример #8
0
        private static bool Prefix(
            ref Vector3 __result,
            ObstacleData ____obstacleData,
            Vector3 ____startPos,
            Vector3 ____midPos,
            float ____move1Duration,
            float ____move2Duration,
            float ____obstacleDuration,
            float time)
        {
            if (!NoodleObjectDatas.TryGetValue(____obstacleData, out NoodleObjectData noodleObjectData))
            {
                return(true);
            }

            NoodleObstacleData noodleData = (NoodleObstacleData)noodleObjectData;

            float jumpTime = Mathf.Clamp((time - ____move1Duration) / (____move2Duration + ____obstacleDuration), 0, 1);

            AnimationHelper.GetDefinitePositionOffset(noodleData.AnimationObject, noodleData.Track, jumpTime, out Vector3? position);

            if (position.HasValue)
            {
                Vector3 noteOffset       = noodleData.NoteOffset;
                Vector3 definitePosition = position.Value + noteOffset;
                definitePosition.x += noodleData.XOffset;
                if (time < ____move1Duration)
                {
                    __result  = Vector3.LerpUnclamped(____startPos, ____midPos, time / ____move1Duration);
                    __result += definitePosition - ____midPos;
                }
                else
                {
                    __result = definitePosition;
                }

                return(false);
            }

            return(true);
        }
        private static void Postfix(BeatmapObjectSpawnMovementData __instance, Vector3 ____centerPos, float ____jumpDuration, NoteData noteData, ref BeatmapObjectSpawnMovementData.NoteSpawnData __result)
        {
            if (!NoodleObjectDatas.TryGetValue(noteData, out NoodleObjectData noodleObjectData))
            {
                return;
            }

            NoodleNoteData noodleData = (NoodleNoteData)noodleObjectData;

            float?flipLineIndex  = noodleData.FlipLineIndexInternal;
            float?njs            = noodleData.NJS;
            float?spawnoffset    = noodleData.SpawnOffset;
            float?startlinelayer = noodleData.StartNoteLineLayerInternal;

            bool gravityOverride = noodleData.DisableGravity;

            float?startRow    = noodleData.StartX;
            float?startHeight = noodleData.StartY;

            float jumpDuration = ____jumpDuration;

            ////Vector3 moveStartPos = __result.moveStartPos;
            ////Vector3 moveEndPos = __result.moveEndPos;
            ////Vector3 jumpEndPos = __result.jumpEndPos;
            float jumpGravity = __result.jumpGravity;

            Vector3 noteOffset = GetNoteOffset(noteData, startRow, startlinelayer ?? (float)noteData.startNoteLineLayer);

            if (startRow.HasValue || startHeight.HasValue || flipLineIndex.HasValue || njs.HasValue || spawnoffset.HasValue || startlinelayer.HasValue || gravityOverride)
            {
                GetNoteJumpValues(njs, spawnoffset, out float localJumpDuration, out float localJumpDistance, out Vector3 localMoveStartPos, out Vector3 localMoveEndPos, out Vector3 localJumpEndPos);
                jumpDuration = localJumpDuration;

                float localNoteJumpMovementSpeed = njs ?? NoteJumpMovementSpeed;

                float startLayerLineYPos = LineYPosForLineLayer(noteData, startlinelayer ?? (float)noteData.startNoteLineLayer);
                float lineYPos           = LineYPosForLineLayer(noteData, startHeight);

                // Magic numbers below found with linear regression y=mx+b using existing HighestJumpPosYForLineLayer values
                float highestJump = startHeight.HasValue ? (0.875f * lineYPos) + 0.639583f + JumpOffsetY :
                                    __instance.HighestJumpPosYForLineLayer(noteData.noteLineLayer);
                jumpGravity = 2f * (highestJump - (gravityOverride ? lineYPos : startLayerLineYPos)) /
                              Mathf.Pow(localJumpDistance / localNoteJumpMovementSpeed * 0.5f, 2f);

                Vector3 jumpEndPos = localJumpEndPos + noteOffset;

                // IsBasicNote() check is skipped so bombs can flip too
                Vector3 noteOffset2  = GetNoteOffset(noteData, flipLineIndex ?? startRow, gravityOverride ? startHeight : startlinelayer ?? (float)noteData.startNoteLineLayer);
                Vector3 moveStartPos = localMoveStartPos + noteOffset2;
                Vector3 moveEndPos   = localMoveEndPos + noteOffset2;

                __result = new BeatmapObjectSpawnMovementData.NoteSpawnData(moveStartPos, moveEndPos, jumpEndPos, jumpGravity, __result.moveDuration, jumpDuration);
            }

            // DEFINITE POSITION IS WEIRD, OK?
            // ty reaxt
            float startVerticalVelocity = jumpGravity * jumpDuration * 0.5f;
            float num     = jumpDuration * 0.5f;
            float yOffset = (startVerticalVelocity * num) - (jumpGravity * num * num * 0.5f);

            noodleData.NoteOffset = ____centerPos + noteOffset + new Vector3(0, yOffset, 0);
        }