static bool Prefix(GameNoteController __instance, Saber saber, Vector3 cutPoint, Quaternion orientation, Vector3 cutDirVec, bool allowBadCut, ref AudioTimeSyncController ____audioTimeSyncController, ref BoxCuttableBySaber ____bigCuttableBySaber, ref BoxCuttableBySaber ____smallCuttableBySaber, NoteBasicCutInfoSO ____noteBasicCutInfo) { if ((int)__instance.noteData.cutDirection >= 2000) { float timeDeviation = __instance.noteData.time - ____audioTimeSyncController.songTime; bool flag; bool flag2; bool flag3; float cutDirDeviation; ____noteBasicCutInfo.GetBasicCutInfo(__instance.noteTransform, __instance.noteData.noteType, NoteCutDirection.Any, saber.saberType, saber.bladeSpeed, cutDirVec, out flag, out flag2, out flag3, out cutDirDeviation); float swingRating = 0f; SaberAfterCutSwingRatingCounter afterCutSwingRatingCounter = null; if (flag && flag2 && flag3) { swingRating = saber.ComputeSwingRating(); afterCutSwingRatingCounter = saber.CreateAfterCutSwingRatingCounter(); } else if (!allowBadCut) { return(false); } Vector3 vector = orientation * Vector3.up; Plane plane = new Plane(vector, cutPoint); float cutDistanceToCenter = Mathf.Abs(plane.GetDistanceToPoint(__instance.noteTransform.position)); NoteCutInfo noteCutInfo = new NoteCutInfo(flag2, flag, flag3, false, saber.bladeSpeed, cutDirVec, saber.saberType, swingRating, timeDeviation, cutDirDeviation, plane.ClosestPointOnPlane(__instance.transform.position), vector, afterCutSwingRatingCounter, cutDistanceToCenter); ____bigCuttableBySaber.canBeCut = false; ____smallCuttableBySaber.canBeCut = false; __instance.SendNoteWasCutEvent(noteCutInfo); return(false); } return(true); }
private static void Postfix(BoxCuttableBySaber __instance, ref BoxCollider ____collider) { if (!Config.Instance.IsEnabled) { return; } GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.name = "VisibleCubeCollider"; cube.transform.SetParent(__instance.transform, false); cube.transform.localScale = __instance.colliderSize; cube.transform.position = new Vector3(0, 1, 0); cube.GetComponent <MeshRenderer>().material = Plugin.hitboxMaterial; // Silhouette-Outlined Diffuse }
#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(GameNoteController __instance, NoteData noteData, Vector3 moveStartPos, Vector3 moveEndPos, Vector3 jumpEndPos, float moveDuration, float jumpDuration, float startTime, float jumpGravity, bool disappearingArrow, bool ghostNote, ref bool ____disappearingArrow, ref bool ____ghostNote, ref BoxCuttableBySaber ____bigCuttableBySaber, ref BoxCuttableBySaber ____smallCuttableBySaber) { var beatmapData = BS_Utils.Plugin.LevelData.GameplayCoreSceneSetupData.difficultyBeatmap.beatmapData; ____disappearingArrow = disappearingArrow; ____ghostNote = (noteData.id >= beatmapData.bombsCount + beatmapData.notesCount) ? true : ghostNote; ____bigCuttableBySaber.canBeCut = false; ____smallCuttableBySaber.canBeCut = false; ((NoteController)__instance).Init(noteData, moveStartPos, moveEndPos, jumpEndPos, moveDuration, jumpDuration, startTime, jumpGravity); return(false); }