diff --git a/src/main/java/com/replaymod/replay/ReplayHandler.java b/src/main/java/com/replaymod/replay/ReplayHandler.java index 45007209..c54081a9 100755 --- a/src/main/java/com/replaymod/replay/ReplayHandler.java +++ b/src/main/java/com/replaymod/replay/ReplayHandler.java @@ -348,20 +348,22 @@ public class ReplayHandler { public void setQuickMode(boolean quickMode) { if (quickMode == this.quickMode) return; - if (quickMode && !fullReplaySender.isAsyncMode()) return; // Cannot activate quick mode when already in sync mode + if (quickMode && fullReplaySender.isAsyncMode()) { + // If this method is called via runLater, then it cannot switch to sync mode by itself as there might be + // some rogue packets in the task queue after it. Instead the caller must switch to sync mode first and + // use runLater until all packets have been processed (when using setAsyncModeAndWait, one runLater should + // be sufficient). + throw new IllegalStateException("Cannot switch to quick mode while in async mode."); + } this.quickMode = quickMode; if (quickMode) { - fullReplaySender.setSyncModeAndWait(); quickReplaySender.register(); quickReplaySender.restart(); quickReplaySender.sendPacketsTill(fullReplaySender.currentTimeStamp()); - quickReplaySender.setAsyncMode(true); } else { - quickReplaySender.setSyncModeAndWait(); quickReplaySender.unregister(); fullReplaySender.sendPacketsTill(0); fullReplaySender.sendPacketsTill(quickReplaySender.currentTimeStamp()); - fullReplaySender.setAsyncMode(true); } } diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index 5ff5a373..0032acea 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -144,8 +144,12 @@ public class ReplayModReplay { core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.quickmode", Keyboard.KEY_Q, () -> { if (replayHandler != null) { - replayHandler.ensureQuickModeInitialized(() -> - replayHandler.setQuickMode(!replayHandler.isQuickMode())); + replayHandler.getReplaySender().setSyncModeAndWait(); + core.runLater(() -> + replayHandler.ensureQuickModeInitialized(() -> { + replayHandler.setQuickMode(!replayHandler.isQuickMode()); + replayHandler.getReplaySender().setAsyncMode(true); + })); } });