static void Postfix(ref Vector3 __result, ref NoteFloorMovement __instance) { var output = __result; output.y = UnityEngine.Random.Range(-__instance.distanceToPlayer * 1000, __instance.distanceToPlayer * 1000); __result = output; }
public static bool Prefix(NoteFloorMovement __instance, ref Vector3 __result, ref Vector3 ____localPosition, ref Vector3 ____startPos, ref Transform ____rotatedObject) { if (!Plugin.active) { return(true); } ____localPosition = ____startPos; Vector3 vector = ____localPosition; __instance.transform.SetPositionAndRotation(vector, __instance.transform.rotation); ____rotatedObject.transform.rotation = __instance.transform.rotation; __result = vector; return(false); }
private static Vector3 DefiniteNoteFloorMovement(Vector3 original, NoteFloorMovement noteFloorMovement) { NoodleObjectData noodleData = NoteControllerUpdate.NoodleData; if (noodleData != null) { AnimationHelper.GetDefinitePositionOffset(noodleData.AnimationObject, noodleData.Track, 0, out Vector3? position); if (position.HasValue) { Vector3 noteOffset = noodleData.NoteOffset; Vector3 endPos = NoteControllerUpdate._floorEndPosAccessor(ref noteFloorMovement); return(original + (position.Value + noteOffset - endPos)); } } return(original); }
public override void SetNoteControllerEventCallbacks(NoteController noteController) { noteController.noteDidStartJumpEvent += HandleNoteDidStartJump; noteController.noteDidFinishJumpEvent += HandleNoteDidFinishJump; noteController.noteWasCutEvent += HandleNoteWasCut; noteController.noteWasMissedEvent += HandleNoteWasMissed; noteController.noteDidDissolveEvent += HandleNoteDidDissolve; NoteJump noteJump = noteController.GetComponent <NoteJump>(); NoteJumpPlayerController(ref noteJump) = owner; NoteJumpAudioTimeSyncController(ref noteJump) = onlineSyncController; NoteFloorMovement noteFloorMovement = noteController.GetComponent <NoteFloorMovement>(); NoteFloorMovementAudioTimeSyncController(ref noteFloorMovement) = onlineSyncController; _activeNotes.Add(noteController); }
private static Vector3 DefiniteNoteFloorMovement(Vector3 original, NoteFloorMovement noteFloorMovement) { dynamic dynData = NoteControllerUpdate.CustomNoteData.customData; dynamic animationObject = Trees.at(dynData, "_animation"); Track track = Trees.at(dynData, "track"); AnimationHelper.GetDefinitePositionOffset(animationObject, track, 0, out Vector3? position); if (position.HasValue) { Vector3 noteOffset = Trees.at(dynData, "noteOffset"); Vector3 endPos = NoteControllerUpdate._floorEndPosAccessor(ref noteFloorMovement); return(original + (position.Value + noteOffset - endPos)); } else { return(original); } }
public override void RemoveNoteControllerEventCallbacks(NoteController noteController) { noteController.noteDidStartJumpEvent -= HandleNoteDidStartJump; noteController.noteDidFinishJumpEvent -= HandleNoteDidFinishJump; noteController.noteWasCutEvent -= HandleNoteWasCut; noteController.noteWasMissedEvent -= HandleNoteWasMissed; noteController.noteDidDissolveEvent -= HandleNoteDidDissolve; NoteJump noteJump = noteController.GetComponent <NoteJump>(); NoteJumpPlayerController(ref noteJump) = _localPlayer; NoteJumpAudioTimeSyncController(ref noteJump) = _localSyncController; NoteFloorMovement noteFloorMovement = noteController.GetComponent <NoteFloorMovement>(); NoteFloorMovementAudioTimeSyncController(ref noteFloorMovement) = _localSyncController; if (_activeNotes != null) { _activeNotes.Remove(noteController); } }
private static void Postfix(NoteController __instance, NoteData noteData, NoteMovement ____noteMovement) { if (noteData is CustomNoteData customData) { dynamic dynData = customData.customData; float?cutDir = (float?)Trees.at(dynData, CUTDIRECTION); NoteJump noteJump = _noteJumpAccessor(ref ____noteMovement); NoteFloorMovement floorMovement = _noteFloorMovementAccessor(ref ____noteMovement); if (cutDir.HasValue) { Quaternion rotation = Quaternion.Euler(0, 0, cutDir.Value); _endRotationAccessor(ref noteJump) = rotation; Vector3 vector = rotation.eulerAngles; vector += _randomRotationsAccessor(ref noteJump)[_randomRotationIdxAccessor(ref noteJump)] * 20; Quaternion midrotation = Quaternion.Euler(vector); _middleRotationAccessor(ref noteJump) = midrotation; } } }
#pragma warning disable SA1313 // Parameter names should begin with lower-case letter private static void Postfix(NoteController __instance, NoteData noteData, NoteMovement ____noteMovement, Vector3 moveStartPos, Vector3 moveEndPos, Vector3 jumpEndPos) #pragma warning restore SA1313 // Parameter names should begin with lower-case letter { if (noteData is CustomNoteData customData) { dynamic dynData = customData.customData; float?cutDir = (float?)Trees.at(dynData, CUTDIRECTION); NoteJump noteJump = _noteJumpAccessor(ref ____noteMovement); NoteFloorMovement floorMovement = _noteFloorMovementAccessor(ref ____noteMovement); if (cutDir.HasValue) { Quaternion cutQuaternion = Quaternion.Euler(0, 0, cutDir.Value); _endRotationAccessor(ref noteJump) = cutQuaternion; Vector3 vector = cutQuaternion.eulerAngles; vector += _randomRotationsAccessor(ref noteJump)[_randomRotationIdxAccessor(ref noteJump)] * 20; Quaternion midrotation = Quaternion.Euler(vector); _middleRotationAccessor(ref noteJump) = midrotation; } dynamic rotation = Trees.at(dynData, ROTATION); IEnumerable <float> localrot = ((List <object>)Trees.at(dynData, LOCALROTATION))?.Select(n => Convert.ToSingle(n)); Transform transform = __instance.transform; Quaternion localRotation = _quaternionIdentity; if (rotation != null || localRotation != null) { if (localrot != null) { localRotation = Quaternion.Euler(localrot.ElementAt(0), localrot.ElementAt(1), localrot.ElementAt(2)); } Quaternion worldRotationQuatnerion; if (rotation != null) { if (rotation is List <object> list) { IEnumerable <float> rot = list?.Select(n => Convert.ToSingle(n)); worldRotationQuatnerion = Quaternion.Euler(rot.ElementAt(0), rot.ElementAt(1), rot.ElementAt(2)); } else { worldRotationQuatnerion = Quaternion.Euler(0, (float)rotation, 0); } Quaternion inverseWorldRotation = Quaternion.Euler(-worldRotationQuatnerion.eulerAngles); _worldRotationJumpAccessor(ref noteJump) = worldRotationQuatnerion; _inverseWorldRotationJumpAccessor(ref noteJump) = inverseWorldRotation; _worldRotationFloorAccessor(ref floorMovement) = worldRotationQuatnerion; _inverseWorldRotationFloorAccessor(ref floorMovement) = inverseWorldRotation; worldRotationQuatnerion *= localRotation; transform.localRotation = worldRotationQuatnerion; } else { transform.localRotation *= localRotation; } } transform.localScale = Vector3.one; // This is a fix for animation due to notes being recycled Track track = AnimationHelper.GetTrack(dynData); if (track != null && ParentObject.Controller != null) { ParentObject parentObject = ParentObject.Controller.GetParentObjectTrack(track); if (parentObject != null) { parentObject.ParentToObject(transform); } else { ParentObject.ResetTransformParent(transform); } } else { ParentObject.ResetTransformParent(transform); } dynData.moveStartPos = moveStartPos; dynData.moveEndPos = moveEndPos; dynData.jumpEndPos = jumpEndPos; dynData.worldRotation = __instance.worldRotation; dynData.localRotation = localRotation; } if (__instance is GameNoteController) { _gameNoteControllerUpdate.Invoke(__instance, null); } else { _noteControllerUpdate.Invoke(__instance, null); } }
#pragma warning disable SA1313 // Parameter names should begin with lower-case letter private static void Prefix(NoteController __instance, NoteData ____noteData, NoteMovement ____noteMovement) #pragma warning restore SA1313 // Parameter names should begin with lower-case letter { if (____noteData is CustomNoteData customData) { CustomNoteData = customData; dynamic dynData = customData.customData; Track track = Trees.at(dynData, "track"); dynamic animationObject = Trees.at(dynData, "_animation"); if (track != null || animationObject != null) { NoteJump noteJump = NoteControllerInit._noteJumpAccessor(ref ____noteMovement); NoteFloorMovement floorMovement = NoteControllerInit._noteFloorMovementAccessor(ref ____noteMovement); // idk i just copied base game time float jumpDuration = _jumpDurationAccessor(ref noteJump); float elapsedTime = _audioTimeSyncControllerAccessor(ref noteJump).songTime - (____noteData.time - (jumpDuration * 0.5f)); elapsedTime = NoteJumpManualUpdate.NoteJumpTimeAdjust(elapsedTime, jumpDuration); float normalTime = elapsedTime / jumpDuration; AnimationHelper.GetObjectOffset(animationObject, track, normalTime, out Vector3? positionOffset, out Quaternion? rotationOffset, out Vector3? scaleOffset, out Quaternion? localRotationOffset, out float?dissolve, out float?dissolveArrow, out float?cuttable); if (positionOffset.HasValue) { Vector3 moveStartPos = Trees.at(dynData, "moveStartPos"); Vector3 moveEndPos = Trees.at(dynData, "moveEndPos"); Vector3 jumpEndPos = Trees.at(dynData, "jumpEndPos"); Vector3 offset = positionOffset.Value; _floorStartPosAccessor(ref floorMovement) = moveStartPos + offset; _floorEndPosAccessor(ref floorMovement) = moveEndPos + offset; _jumpStartPosAccessor(ref noteJump) = moveEndPos + offset; _jumpEndPosAccessor(ref noteJump) = jumpEndPos + offset; } Transform transform = __instance.transform; if (rotationOffset.HasValue || localRotationOffset.HasValue) { Quaternion worldRotation = Trees.at(dynData, "worldRotation"); Quaternion localRotation = Trees.at(dynData, "localRotation"); Quaternion worldRotationQuatnerion = worldRotation; if (rotationOffset.HasValue) { worldRotationQuatnerion *= rotationOffset.Value; Quaternion inverseWorldRotation = Quaternion.Euler(-worldRotationQuatnerion.eulerAngles); NoteControllerInit._worldRotationJumpAccessor(ref noteJump) = worldRotationQuatnerion; NoteControllerInit._inverseWorldRotationJumpAccessor(ref noteJump) = inverseWorldRotation; NoteControllerInit._worldRotationFloorAccessor(ref floorMovement) = worldRotationQuatnerion; NoteControllerInit._inverseWorldRotationFloorAccessor(ref floorMovement) = inverseWorldRotation; } worldRotationQuatnerion *= localRotation; if (localRotationOffset.HasValue) { worldRotationQuatnerion *= localRotationOffset.Value; } transform.localRotation = worldRotationQuatnerion; } if (scaleOffset.HasValue) { transform.localScale = scaleOffset.Value; } if (dissolve.HasValue) { CutoutEffect cutoutEffect = Trees.at(dynData, "cutoutEffect"); if (cutoutEffect == null) { BaseNoteVisuals baseNoteVisuals = __instance.gameObject.GetComponent <BaseNoteVisuals>(); CutoutAnimateEffect cutoutAnimateEffect = _noteCutoutAnimateEffectAccessor(ref baseNoteVisuals); CutoutEffect[] cutoutEffects = _cutoutEffectAccessor(ref cutoutAnimateEffect); cutoutEffect = cutoutEffects.First(n => n.name != "NoteArrow"); // 1.11 NoteArrow has been added to the CutoutAnimateEffect and we don't want that dynData.cutoutAnimateEffect = cutoutEffect; } cutoutEffect.SetCutout(1 - dissolve.Value); } if (dissolveArrow.HasValue && __instance.noteData.noteType != NoteType.Bomb) { DisappearingArrowController disappearingArrowController = Trees.at(dynData, "disappearingArrowController"); if (disappearingArrowController == null) { disappearingArrowController = __instance.gameObject.GetComponent <DisappearingArrowController>(); dynData.disappearingArrowController = disappearingArrowController; } disappearingArrowController.SetArrowTransparency(dissolveArrow.Value); } if (cuttable.HasValue) { bool enabled = cuttable.Value >= 1; switch (__instance) { case GameNoteController gameNoteController: BoxCuttableBySaber bigCuttableBySaber = _gameNoteBigCuttableAccessor(ref gameNoteController); if (bigCuttableBySaber.enabled != enabled) { bigCuttableBySaber.enabled = enabled; _gameNoteSmallCuttableAccessor(ref gameNoteController).enabled = enabled; } break; case BombNoteController bombNoteController: CuttableBySaber boxCuttableBySaber = _bombNoteCuttableAccessor(ref bombNoteController); if (boxCuttableBySaber.enabled != enabled) { boxCuttableBySaber.enabled = enabled; } break; } } } } }
private static bool Prefix(NoteMovement __instance, Vector3 moveStartPos, Vector3 moveEndPos, Vector3 jumpEndPos, float moveDuration, float jumpDuration, float startTime, float jumpGravity, float flipYSide, NoteCutDirection cutDirection, ref float ____zOffset, ref NoteFloorMovement ____floorMovement, ref Vector3 ____position, ref Vector3 ____prevPosition, ref NoteJump ____jump, ref Action ___didInitEvent) { if (!Plugin.active) { return(true); } moveStartPos += __instance.transform.forward * ____zOffset; moveEndPos += __instance.transform.forward * ____zOffset; jumpEndPos += __instance.transform.forward * ____zOffset; ____floorMovement.Init(moveStartPos, moveEndPos, moveDuration, startTime); ____position = ____floorMovement.SetToStart(); ____prevPosition = ____position; ____jump.Init(moveEndPos, jumpEndPos, jumpDuration, startTime + moveDuration, jumpGravity, flipYSide, cutDirection); ReflectionUtil.SetPrivateProperty(__instance, "movementPhase", NoteMovement.MovementPhase.MovingOnTheFloor); ___didInitEvent?.Invoke(); return(false); }
private static void Postfix(NoteController __instance, NoteData noteData, NoteMovement ____noteMovement, Vector3 moveStartPos, Vector3 moveEndPos, Vector3 jumpEndPos, float endRotation) { if (__instance is MultiplayerConnectedPlayerNoteController) { return; } NoodleNoteData noodleData = (NoodleNoteData)NoodleObjectDatas[noteData]; Quaternion?cutQuaternion = noodleData.CutQuaternion; NoteJump noteJump = _noteJumpAccessor(ref ____noteMovement); NoteFloorMovement floorMovement = _noteFloorMovementAccessor(ref ____noteMovement); if (cutQuaternion.HasValue) { Quaternion quatVal = cutQuaternion.Value; _endRotationAccessor(ref noteJump) = quatVal; Vector3 vector = quatVal.eulerAngles; vector += _randomRotationsAccessor(ref noteJump)[_randomRotationIdxAccessor(ref noteJump)] * 20; Quaternion midrotation = Quaternion.Euler(vector); _middleRotationAccessor(ref noteJump) = midrotation; } Quaternion?worldRotationQuaternion = noodleData.WorldRotationQuaternion; Quaternion?localRotationQuaternion = noodleData.LocalRotationQuaternion; Transform transform = __instance.transform; Quaternion localRotation = _quaternionIdentity; if (worldRotationQuaternion.HasValue || localRotationQuaternion.HasValue) { if (localRotationQuaternion.HasValue) { localRotation = localRotationQuaternion.Value; } if (worldRotationQuaternion.HasValue) { Quaternion quatVal = worldRotationQuaternion.Value; Quaternion inverseWorldRotation = Quaternion.Inverse(quatVal); _worldRotationJumpAccessor(ref noteJump) = quatVal; _inverseWorldRotationJumpAccessor(ref noteJump) = inverseWorldRotation; _worldRotationFloorAccessor(ref floorMovement) = quatVal; _inverseWorldRotationFloorAccessor(ref floorMovement) = inverseWorldRotation; quatVal *= localRotation; transform.localRotation = quatVal; } else { transform.localRotation *= localRotation; } } if (transform.localScale != Vector3.one) { transform.localScale = Vector3.one; // This is a fix for animation due to notes being recycled } Track track = noodleData.Track; if (track != null && ParentObject.Controller != null) { ParentObject parentObject = ParentObject.Controller.GetParentObjectTrack(track); if (parentObject != null) { parentObject.ParentToObject(transform); } else { ParentObject.ResetTransformParent(transform); } } else { ParentObject.ResetTransformParent(transform); } noodleData.EndRotation = endRotation; noodleData.MoveStartPos = moveStartPos; noodleData.MoveEndPos = moveEndPos; noodleData.JumpEndPos = jumpEndPos; noodleData.WorldRotation = __instance.worldRotation; noodleData.LocalRotation = localRotation; }
private static void Prefix(NoteController __instance, NoteData ____noteData, NoteMovement ____noteMovement) { if (__instance is MultiplayerConnectedPlayerNoteController) { NoodleData = null; return; } NoodleData = NoodleObjectDatas[____noteData]; NoodleNoteData noodleData = (NoodleNoteData)NoodleData; Track track = noodleData.Track; NoodleObjectData.AnimationObjectData animationObject = noodleData.AnimationObject; if (track != null || animationObject != null) { NoteJump noteJump = NoteControllerInit._noteJumpAccessor(ref ____noteMovement); NoteFloorMovement floorMovement = NoteControllerInit._noteFloorMovementAccessor(ref ____noteMovement); // idk i just copied base game time float jumpDuration = _jumpDurationAccessor(ref noteJump); float elapsedTime = _audioTimeSyncControllerAccessor(ref noteJump).songTime - (____noteData.time - (jumpDuration * 0.5f)); elapsedTime = NoteJumpManualUpdate.NoteJumpTimeAdjust(elapsedTime, jumpDuration); float normalTime = elapsedTime / jumpDuration; AnimationHelper.GetObjectOffset(animationObject, track, normalTime, out Vector3? positionOffset, out Quaternion? rotationOffset, out Vector3? scaleOffset, out Quaternion? localRotationOffset, out float?dissolve, out float?dissolveArrow, out float?cuttable); if (positionOffset.HasValue) { Vector3 moveStartPos = noodleData.MoveStartPos; Vector3 moveEndPos = noodleData.MoveEndPos; Vector3 jumpEndPos = noodleData.JumpEndPos; Vector3 offset = positionOffset.Value; _floorStartPosAccessor(ref floorMovement) = moveStartPos + offset; _floorEndPosAccessor(ref floorMovement) = moveEndPos + offset; _jumpStartPosAccessor(ref noteJump) = moveEndPos + offset; _jumpEndPosAccessor(ref noteJump) = jumpEndPos + offset; } Transform transform = __instance.transform; if (rotationOffset.HasValue || localRotationOffset.HasValue) { Quaternion worldRotation = noodleData.WorldRotation; Quaternion localRotation = noodleData.LocalRotation; Quaternion worldRotationQuatnerion = worldRotation; if (rotationOffset.HasValue) { worldRotationQuatnerion *= rotationOffset.Value; Quaternion inverseWorldRotation = Quaternion.Inverse(worldRotationQuatnerion); NoteControllerInit._worldRotationJumpAccessor(ref noteJump) = worldRotationQuatnerion; NoteControllerInit._inverseWorldRotationJumpAccessor(ref noteJump) = inverseWorldRotation; NoteControllerInit._worldRotationFloorAccessor(ref floorMovement) = worldRotationQuatnerion; NoteControllerInit._inverseWorldRotationFloorAccessor(ref floorMovement) = inverseWorldRotation; } worldRotationQuatnerion *= localRotation; if (localRotationOffset.HasValue) { worldRotationQuatnerion *= localRotationOffset.Value; } transform.localRotation = worldRotationQuatnerion; } if (scaleOffset.HasValue) { transform.localScale = scaleOffset.Value; } if (dissolve.HasValue) { CutoutEffect cutoutEffect = noodleData.CutoutEffect; if (cutoutEffect == null) { BaseNoteVisuals baseNoteVisuals = __instance.gameObject.GetComponent <BaseNoteVisuals>(); CutoutAnimateEffect cutoutAnimateEffect = _noteCutoutAnimateEffectAccessor(ref baseNoteVisuals); CutoutEffect[] cutoutEffects = _cutoutEffectAccessor(ref cutoutAnimateEffect); cutoutEffect = cutoutEffects.First(n => n.name != "NoteArrow"); // 1.11 NoteArrow has been added to the CutoutAnimateEffect and we don't want that noodleData.CutoutEffect = cutoutEffect; } cutoutEffect.SetCutout(1 - dissolve.Value); } if (dissolveArrow.HasValue && __instance.noteData.colorType != ColorType.None) { MonoBehaviour disappearingArrowController = noodleData.DisappearingArrowController; if (disappearingArrowController == null) { disappearingArrowController = __instance.gameObject.GetComponent <DisappearingArrowControllerBase <GameNoteController> >(); if (disappearingArrowController == null) { disappearingArrowController = __instance.gameObject.GetComponent <DisappearingArrowControllerBase <MultiplayerConnectedPlayerGameNoteController> >(); } noodleData.DisappearingArrowController = disappearingArrowController; noodleData.DisappearingArrowMethod = GetSetArrowTransparency(disappearingArrowController.GetType()); } // gross nasty reflection noodleData.DisappearingArrowMethod.Invoke(disappearingArrowController, new object[] { dissolveArrow.Value }); } if (cuttable.HasValue) { bool enabled = cuttable.Value >= 1; switch (__instance) { case GameNoteController gameNoteController: BoxCuttableBySaber[] bigCuttableBySaberList = _gameNoteBigCuttableAccessor(ref gameNoteController); foreach (BoxCuttableBySaber bigCuttableBySaber in bigCuttableBySaberList) { if (bigCuttableBySaber.canBeCut != enabled) { bigCuttableBySaber.canBeCut = enabled; } } BoxCuttableBySaber[] smallCuttableBySaberList = _gameNoteSmallCuttableAccessor(ref gameNoteController); foreach (BoxCuttableBySaber smallCuttableBySaber in smallCuttableBySaberList) { if (smallCuttableBySaber.canBeCut != enabled) { smallCuttableBySaber.canBeCut = enabled; } } break; case BombNoteController bombNoteController: CuttableBySaber boxCuttableBySaber = _bombNoteCuttableAccessor(ref bombNoteController); if (boxCuttableBySaber.canBeCut != enabled) { boxCuttableBySaber.canBeCut = enabled; } break; } } } }
private static void Postfix(NoteController __instance, NoteData noteData, NoteMovement ____noteMovement, Vector3 moveStartPos, Vector3 moveEndPos, Vector3 jumpEndPos, float endRotation) { NoodleNoteData?noodleData = TryGetObjectData <NoodleNoteData>(noteData); if (noodleData == null) { return; } Quaternion?cutQuaternion = noodleData.CutQuaternion; NoteJump noteJump = _noteJumpAccessor(ref ____noteMovement); NoteFloorMovement floorMovement = _noteFloorMovementAccessor(ref ____noteMovement); if (cutQuaternion.HasValue) { Quaternion quatVal = cutQuaternion.Value; _endRotationAccessor(ref noteJump) = quatVal; Vector3 vector = quatVal.eulerAngles; vector += _randomRotationsAccessor(ref noteJump)[_randomRotationIdxAccessor(ref noteJump)] * 20; Quaternion midrotation = Quaternion.Euler(vector); _middleRotationAccessor(ref noteJump) = midrotation; } Quaternion?worldRotationQuaternion = noodleData.WorldRotationQuaternion; Quaternion?localRotationQuaternion = noodleData.LocalRotationQuaternion; Transform transform = __instance.transform; Quaternion localRotation = Quaternion.identity; if (worldRotationQuaternion.HasValue || localRotationQuaternion.HasValue) { if (localRotationQuaternion.HasValue) { localRotation = localRotationQuaternion.Value; } if (worldRotationQuaternion.HasValue) { Quaternion quatVal = worldRotationQuaternion.Value; Quaternion inverseWorldRotation = Quaternion.Inverse(quatVal); _worldRotationJumpAccessor(ref noteJump) = quatVal; _inverseWorldRotationJumpAccessor(ref noteJump) = inverseWorldRotation; _worldRotationFloorAccessor(ref floorMovement) = quatVal; _inverseWorldRotationFloorAccessor(ref floorMovement) = inverseWorldRotation; quatVal *= localRotation; transform.localRotation = quatVal; } else { transform.localRotation *= localRotation; } } if (transform.localScale != Vector3.one) { transform.localScale = Vector3.one; // This is a fix for animation due to notes being recycled } IEnumerable <Track>?tracks = noodleData.Track; if (tracks != null) { foreach (Track track in tracks) { // add to gameobjects track.AddGameObject(__instance.gameObject); } } // how f*****g long has _zOffset existed???!?? float zOffset = _zOffsetAccessor(ref ____noteMovement); moveStartPos.z += zOffset; moveEndPos.z += zOffset; jumpEndPos.z += zOffset; noodleData.EndRotation = endRotation; noodleData.MoveStartPos = moveStartPos; noodleData.MoveEndPos = moveEndPos; noodleData.JumpEndPos = jumpEndPos; noodleData.WorldRotation = __instance.worldRotation; noodleData.LocalRotation = localRotation; }
private static void Prefix(NoteController __instance, NoteData ____noteData, NoteMovement ____noteMovement) { NoodleData = TryGetObjectData <NoodleObjectData>(____noteData); if (NoodleData == null) { return; } NoodleNoteData noodleData = (NoodleNoteData)NoodleData; IEnumerable <Track>?tracks = noodleData.Track; NoodleObjectData.AnimationObjectData?animationObject = noodleData.AnimationObject; if (tracks != null || animationObject != null) { NoteJump noteJump = NoteControllerInit._noteJumpAccessor(ref ____noteMovement); NoteFloorMovement floorMovement = NoteControllerInit._noteFloorMovementAccessor(ref ____noteMovement); // idk i just copied base game time float jumpDuration = _jumpDurationAccessor(ref noteJump); float elapsedTime = _audioTimeSyncControllerAccessor(ref noteJump).songTime - (____noteData.time - (jumpDuration * 0.5f)); elapsedTime = NoteJumpManualUpdate.NoteJumpTimeAdjust(elapsedTime, jumpDuration); float normalTime = elapsedTime / jumpDuration; Animation.AnimationHelper.GetObjectOffset(animationObject, tracks, normalTime, out Vector3? positionOffset, out Quaternion? rotationOffset, out Vector3? scaleOffset, out Quaternion? localRotationOffset, out float?dissolve, out float?dissolveArrow, out float?cuttable); if (positionOffset.HasValue) { Vector3 moveStartPos = noodleData.MoveStartPos; Vector3 moveEndPos = noodleData.MoveEndPos; Vector3 jumpEndPos = noodleData.JumpEndPos; Vector3 offset = positionOffset.Value; _floorStartPosAccessor(ref floorMovement) = moveStartPos + offset; _floorEndPosAccessor(ref floorMovement) = moveEndPos + offset; _jumpStartPosAccessor(ref noteJump) = moveEndPos + offset; _jumpEndPosAccessor(ref noteJump) = jumpEndPos + offset; } Transform transform = __instance.transform; if (rotationOffset.HasValue || localRotationOffset.HasValue) { Quaternion worldRotation = noodleData.WorldRotation; Quaternion localRotation = noodleData.LocalRotation; Quaternion worldRotationQuatnerion = worldRotation; if (rotationOffset.HasValue) { worldRotationQuatnerion *= rotationOffset.Value; Quaternion inverseWorldRotation = Quaternion.Inverse(worldRotationQuatnerion); NoteControllerInit._worldRotationJumpAccessor(ref noteJump) = worldRotationQuatnerion; NoteControllerInit._inverseWorldRotationJumpAccessor(ref noteJump) = inverseWorldRotation; NoteControllerInit._worldRotationFloorAccessor(ref floorMovement) = worldRotationQuatnerion; NoteControllerInit._inverseWorldRotationFloorAccessor(ref floorMovement) = inverseWorldRotation; } worldRotationQuatnerion *= localRotation; if (localRotationOffset.HasValue) { worldRotationQuatnerion *= localRotationOffset.Value; } transform.localRotation = worldRotationQuatnerion; } if (scaleOffset.HasValue) { transform.localScale = scaleOffset.Value; } if (dissolve.HasValue) { if (CutoutManager.NoteCutoutEffects.TryGetValue(__instance, out CutoutEffectWrapper cutoutEffect)) { cutoutEffect.SetCutout(dissolve.Value); } } if (dissolveArrow.HasValue && __instance.noteData.colorType != ColorType.None) { if (CutoutManager.NoteDisappearingArrowWrappers.TryGetValue(__instance, out DisappearingArrowWrapper disappearingArrowWrapper)) { disappearingArrowWrapper.SetCutout(dissolveArrow.Value); } } if (cuttable.HasValue) { bool enabled = cuttable.Value >= 1; switch (__instance) { case GameNoteController gameNoteController: BoxCuttableBySaber[] bigCuttableBySaberList = _gameNoteBigCuttableAccessor(ref gameNoteController); foreach (BoxCuttableBySaber bigCuttableBySaber in bigCuttableBySaberList) { if (bigCuttableBySaber.canBeCut != enabled) { bigCuttableBySaber.canBeCut = enabled; } } BoxCuttableBySaber[] smallCuttableBySaberList = _gameNoteSmallCuttableAccessor(ref gameNoteController); foreach (BoxCuttableBySaber smallCuttableBySaber in smallCuttableBySaberList) { if (smallCuttableBySaber.canBeCut != enabled) { smallCuttableBySaber.canBeCut = enabled; } } break; case BombNoteController bombNoteController: CuttableBySaber boxCuttableBySaber = _bombNoteCuttableAccessor(ref bombNoteController); if (boxCuttableBySaber.canBeCut != enabled) { boxCuttableBySaber.canBeCut = enabled; } break; } } } }