private static void Postfix(BaseNoteVisuals __instance, NoteControllerBase ____noteController) { GameObject gameObject = __instance.gameObject; BaseNoteVisuals baseNoteVisuals = gameObject.GetComponent <BaseNoteVisuals>(); CutoutAnimateEffect cutoutAnimateEffect = _noteCutoutAnimateEffectAccessor(ref baseNoteVisuals); CutoutEffect[] cutoutEffects = _cutoutEffectAccessor(ref cutoutAnimateEffect); CutoutEffect cutoutEffect = cutoutEffects.First(n => n.name != "NoteArrow"); // 1.11 NoteArrow has been added to the CutoutAnimateEffect and we don't want that CutoutManager.NoteCutoutEffects.Add(____noteController, new CutoutEffectWrapper(cutoutEffect)); if (____noteController is ICubeNoteTypeProvider) { Type constructed = typeof(DisappearingArrowControllerBase <>).MakeGenericType(____noteController.GetType()); MonoBehaviour disappearingArrowController = (MonoBehaviour)gameObject.GetComponent(constructed); MethodInfo method = GetSetArrowTransparency(disappearingArrowController.GetType()); DisappearingArrowWrapper wrapper = new DisappearingArrowWrapper(disappearingArrowController, method); wrapper.SetCutout(1); // i have no f*****g idea how this fixes the weird ghost arrow bug CutoutManager.NoteDisappearingArrowWrappers.Add(____noteController, wrapper); } }
#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; } } } } }
internal CutoutAnimateEffectWrapper(CutoutAnimateEffect cutoutAnimateEffect) { _cutoutAnimateEffect = cutoutAnimateEffect; }
private static void Postfix(ObstacleController ____obstacleController, CutoutAnimateEffect ____cutoutAnimateEffect) { CutoutManager.ObstacleCutoutEffects.Add(____obstacleController, new CutoutAnimateEffectWrapper(____cutoutAnimateEffect)); }
#pragma warning disable SA1313 // Parameter names should begin with lower-case letter private static void Prefix( ObstacleController __instance, ObstacleData ____obstacleData, AudioTimeSyncController ____audioTimeSyncController, float ____startTimeOffset, ref Vector3 ____startPos, ref Vector3 ____midPos, ref Vector3 ____endPos, float ____move1Duration, float ____move2Duration, float ____obstacleDuration, ref Quaternion ____worldRotation, ref Quaternion ____inverseWorldRotation, ref Bounds ____bounds) #pragma warning restore SA1313 // Parameter names should begin with lower-case letter { if (____obstacleData is CustomObstacleData customData) { dynamic dynData = customData.customData; Track track = Trees.at(dynData, "track"); dynamic animationObject = Trees.at(dynData, "_animation"); if (track != null || animationObject != null) { // idk i just copied base game time float elapsedTime = ____audioTimeSyncController.songTime - ____startTimeOffset; float normalTime = (elapsedTime - ____move1Duration) / (____move2Duration + ____obstacleDuration); AnimationHelper.GetObjectOffset(animationObject, track, normalTime, out Vector3? positionOffset, out Quaternion? rotationOffset, out Vector3? scaleOffset, out Quaternion? localRotationOffset, out float?dissolve, out float?_, out float?cuttable); if (positionOffset.HasValue) { Vector3 startPos = Trees.at(dynData, "startPos"); Vector3 midPos = Trees.at(dynData, "midPos"); Vector3 endPos = Trees.at(dynData, "endPos"); Vector3 offset = positionOffset.Value; ____startPos = startPos + offset; ____midPos = midPos + offset; ____endPos = endPos + 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); ____worldRotation = worldRotationQuatnerion; ____inverseWorldRotation = inverseWorldRotation; } worldRotationQuatnerion *= localRotation; if (localRotationOffset.HasValue) { worldRotationQuatnerion *= localRotationOffset.Value; } transform.localRotation = worldRotationQuatnerion; } bool cuttableEnabled = true; if (cuttable.HasValue) { cuttableEnabled = cuttable.Value >= 1; if (cuttableEnabled) { if (____bounds.size != _vectorZero) { ____bounds.size = _vectorZero; } } else { Vector3 boundsSize = Trees.at(dynData, "boundsSize"); if (____bounds.size != boundsSize) { ____bounds.size = boundsSize; } } } if (scaleOffset.HasValue) { transform.localScale = scaleOffset.Value; } if (dissolve.HasValue) { CutoutAnimateEffect cutoutAnimateEffect = Trees.at(dynData, "cutoutAnimateEffect"); if (cutoutAnimateEffect == null) { ObstacleDissolve obstacleDissolve = __instance.gameObject.GetComponent <ObstacleDissolve>(); cutoutAnimateEffect = _obstacleCutoutAnimateEffectAccessor(ref obstacleDissolve); dynData.cutoutAnimateEffect = cutoutAnimateEffect; } cutoutAnimateEffect.SetCutout(1 - dissolve.Value); } } } }
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 Prefix( ObstacleController __instance, ObstacleData ____obstacleData, AudioTimeSyncController ____audioTimeSyncController, float ____startTimeOffset, ref Vector3 ____startPos, ref Vector3 ____midPos, ref Vector3 ____endPos, float ____move1Duration, float ____move2Duration, float ____obstacleDuration, ref Quaternion ____worldRotation, ref Quaternion ____inverseWorldRotation, ref Bounds ____bounds) { if (__instance is MultiplayerConnectedPlayerObstacleController) { return; } NoodleObstacleData noodleData = (NoodleObstacleData)NoodleObjectDatas[____obstacleData]; Track track = noodleData.Track; NoodleObjectData.AnimationObjectData animationObject = noodleData.AnimationObject; if (track != null || animationObject != null) { // idk i just copied base game time float elapsedTime = ____audioTimeSyncController.songTime - ____startTimeOffset; float normalTime = (elapsedTime - ____move1Duration) / (____move2Duration + ____obstacleDuration); AnimationHelper.GetObjectOffset(animationObject, track, normalTime, out Vector3? positionOffset, out Quaternion? rotationOffset, out Vector3? scaleOffset, out Quaternion? localRotationOffset, out float?dissolve, out float?_, out float?cuttable); if (positionOffset.HasValue) { Vector3 startPos = noodleData.StartPos; Vector3 midPos = noodleData.MidPos; Vector3 endPos = noodleData.EndPos; Vector3 offset = positionOffset.Value; ____startPos = startPos + offset; ____midPos = midPos + offset; ____endPos = endPos + 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); ____worldRotation = worldRotationQuatnerion; ____inverseWorldRotation = inverseWorldRotation; } worldRotationQuatnerion *= localRotation; if (localRotationOffset.HasValue) { worldRotationQuatnerion *= localRotationOffset.Value; } transform.localRotation = worldRotationQuatnerion; } bool cuttableEnabled = true; if (cuttable.HasValue) { cuttableEnabled = cuttable.Value >= 1; if (cuttableEnabled) { if (____bounds.size != _vectorZero) { ____bounds.size = _vectorZero; } } else { Vector3 boundsSize = noodleData.BoundsSize; if (____bounds.size != boundsSize) { ____bounds.size = boundsSize; } } } if (scaleOffset.HasValue) { transform.localScale = scaleOffset.Value; } if (dissolve.HasValue) { CutoutAnimateEffect cutoutAnimateEffect = noodleData.CutoutAnimateEffect; if (cutoutAnimateEffect == null) { ObstacleDissolve obstacleDissolve = __instance.gameObject.GetComponent <ObstacleDissolve>(); cutoutAnimateEffect = _obstacleCutoutAnimateEffectAccessor(ref obstacleDissolve); noodleData.CutoutAnimateEffect = cutoutAnimateEffect; } cutoutAnimateEffect.SetCutout(1 - dissolve.Value); } } if (noodleData.DoUnhide) { __instance.hide = false; } }