Until now, these were haphazardly enforce inline in blueprint
implementations. The only thing stopping complete breakage is that
`EndPlacement` wasn't called (too much) from outside the blueprint,
leaving them responsible for their own placement.
By moving this conditional out of the provided paramters to
`EndPlacement`, it allows more flexible usage of that method externally.
Coming in a future PR.
Matching osu!stable. I use these quite a lot while mapping and I'm sure
others do as well.
Hold `Shift` = invert grid snap
Hold `Alt` = invert distance snap
Scroll speed is not saved and doesn't affect gameplay.
It is purely a feature for a better visualization.
It is currently bind to scroll speed increase/decrease.
Default F3/F4 crashes with editor shortcuts so it has to be changed.
Timeline blueprint is glitched when the hit object has negative duration.
Negative duration is unwanted anyways so placement implementation is fixed instead of supporting it in timline blueprint.
While osu!catch also implements a distance snap grid, it doesn't rely on
`GetBeatSnapDistanceAt` (unlike osu!), therefore it can't have the
"distance spacing" multiplier yet.