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; }
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); }
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); }
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); }
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); }
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); }
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); }