1919public class AlignUtils {
2020 private static final double ALIGN_EPSILON = 1.0E-4D ;
2121 private static final long DEBUG_SAMPLE_DELAY_MS = 500L ;
22+ private static final int SNAP_MOVEMENT_LOCK_TICKS = 2 ;
2223 private static final int COLOR_WHITE = 0xFFFFFFFF ;
2324 private static final int LINE_HEIGHT = 10 ;
2425 private static final int DEBUG_STEP_COUNT = 2 ;
@@ -39,6 +40,9 @@ public class AlignUtils {
3940 private static int alignState = 0 ;
4041 private static float yaw1 = 0 ;
4142 private static float yaw2 = 0 ;
43+ private static int movementLockTicks = 0 ;
44+ private static boolean forcedForward = false ;
45+ private static boolean forcedSneak = false ;
4246
4347 private static boolean debugExpectedAvailable ;
4448 private static double debugExpectedX ;
@@ -109,6 +113,10 @@ public static void tick() {
109113 Minecraft mc = Minecraft .getInstance ();
110114 updateDebugMeasurement (mc );
111115
116+ if (movementLockTicks > 0 ) {
117+ movementLockTicks --;
118+ }
119+
112120 if (!active ) {
113121 return ;
114122 }
@@ -190,22 +198,38 @@ public static void tick() {
190198 private static void applyMovement (Minecraft mc , LocalPlayer player , float targetYaw , boolean sneak ) {
191199 capturePendingStep (player );
192200 applyExactYaw (player , targetYaw );
201+ forcedForward = true ;
202+ forcedSneak = sneak ;
193203 setKeyState (mc .options .keyUp , true );
194204 if (sneak ) {
195205 setKeyState (mc .options .keyShift , true );
206+ } else {
207+ setKeyState (mc .options .keyShift , false );
196208 }
197209 }
198210
199211 public static void cancel () {
200212 if (!active ) return ;
201213 active = false ;
214+ movementLockTicks = 0 ;
202215 releasePressedKeys (Minecraft .getInstance ());
203216 }
204217
205218 public static boolean isActive () {
206219 return active ;
207220 }
208221
222+ public static boolean shouldBlockMovementInput () {
223+ return active || movementLockTicks > 0 ;
224+ }
225+
226+ public static boolean isAllowedMovementKey (Minecraft mc , KeyMapping keyMapping ) {
227+ if (mc == null || mc .options == null ) return false ;
228+ if (keyMapping == mc .options .keyUp ) return forcedForward ;
229+ if (keyMapping == mc .options .keyShift ) return forcedSneak ;
230+ return false ;
231+ }
232+
209233 public static List <String > getDebugInfo () {
210234 List <String > info = new ArrayList <>();
211235 if (!active && !debugAwaitingSample && !debugExpectedAvailable && !debugMeasuredAvailable ) {
@@ -307,8 +331,10 @@ private static void finish(Minecraft mc) {
307331 debugAwaitingSample = true ;
308332 releasePressedKeys (mc );
309333 if (!doLookAfter ) {
334+ movementLockTicks = 0 ;
310335 return ;
311336 }
337+ movementLockTicks = SNAP_MOVEMENT_LOCK_TICKS ;
312338 if (alignUseLookAfterCoords ) {
313339 RotationManager .getInstance ().snapToBlock (alignLookAtX , alignLookAtY , alignLookAtZ , 0 );
314340 } else {
@@ -318,6 +344,7 @@ private static void finish(Minecraft mc) {
318344
319345 private static void releaseMovementKeys (Minecraft mc ) {
320346 if (mc == null || mc .options == null ) return ;
347+ clearForcedMovement ();
321348 setKeyState (mc .options .keyUp , false );
322349 setKeyState (mc .options .keyDown , false );
323350 setKeyState (mc .options .keyLeft , false );
@@ -328,10 +355,16 @@ private static void releaseMovementKeys(Minecraft mc) {
328355
329356 private static void releasePressedKeys (Minecraft mc ) {
330357 if (mc == null || mc .options == null ) return ;
358+ clearForcedMovement ();
331359 restorePhysicalState (mc .options .keyUp , mc );
332360 restorePhysicalState (mc .options .keyShift , mc );
333361 }
334362
363+ private static void clearForcedMovement () {
364+ forcedForward = false ;
365+ forcedSneak = false ;
366+ }
367+
335368 private static void setKeyState (KeyMapping key , boolean pressed ) {
336369 if (key instanceof KeyBindingAccessor accessor ) {
337370 KeyMapping .set (accessor .getBoundKey (), pressed );
0 commit comments