#pragma warning disable SA1313 // Parameter names should begin with lower-case letter private static void Postfix(BeatmapObjectSpawnMovementData __instance, Vector3 ____centerPos, float ____jumpDuration, NoteData noteData, ref BeatmapObjectSpawnMovementData.NoteSpawnData __result) #pragma warning restore SA1313 // Parameter names should begin with lower-case letter { if (noteData is CustomNoteData customData) { dynamic dynData = customData.customData; IEnumerable <float?> position = ((List <object>)Trees.at(dynData, POSITION))?.Select(n => n.ToNullableFloat()); float?flipLineIndex = (float?)Trees.at(dynData, "flipLineIndex"); float?njs = (float?)Trees.at(dynData, NOTEJUMPSPEED); float?spawnoffset = (float?)Trees.at(dynData, NOTESPAWNOFFSET); float?startlinelayer = (float?)Trees.at(dynData, "startNoteLineLayer"); bool gravityOverride = (bool?)Trees.at(dynData, NOTEGRAVITYDISABLE) ?? false; float?startRow = position?.ElementAtOrDefault(0); float?startHeight = position?.ElementAtOrDefault(1); 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 (position != null || flipLineIndex != null || 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); jumpEndPos = localJumpEndPos + noteOffset; // IsBasicNote() check is skipped so bombs can flip too Vector3 noteOffset2 = GetNoteOffset(noteData, flipLineIndex ?? startRow, gravityOverride ? startHeight : startlinelayer ?? (float)noteData.startNoteLineLayer); moveStartPos = localMoveStartPos + noteOffset2; 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); dynData.noteOffset = ____centerPos + noteOffset + new Vector3(0, yOffset, 0); } }
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); }