diff --git a/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleEventManager.java b/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleEventManager.java index cc2d69f..f1ae3db 100644 --- a/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleEventManager.java +++ b/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleEventManager.java @@ -99,6 +99,8 @@ public class LifecycleEventManager { if (generator.state.playerSpawn != null) { player.teleport(generator.state.playerSpawn); } + // Clear scored blocks so same coordinates can be re-scored after respawn + player.clearScoredBlocks(); } // Reset generator state diff --git a/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleTickManager.java b/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleTickManager.java index d56b838..7148d65 100644 --- a/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleTickManager.java +++ b/src/main/java/dev/loki/loparkour/generator/lifecycle/loop/LifecycleTickManager.java @@ -74,7 +74,7 @@ public class LifecycleTickManager { for (var player : generator.getPlayers()) { if (player.player.getLocation().getY() < fallThreshold) { generator.fall(); - break; // Only trigger once per tick + continue; // Don't break — keep checking remaining players } } } diff --git a/src/main/java/dev/loki/loparkour/generator/lifecycle/player/GeneratorCleanup.java b/src/main/java/dev/loki/loparkour/generator/lifecycle/player/GeneratorCleanup.java index 17a3548..1b9b30b 100644 --- a/src/main/java/dev/loki/loparkour/generator/lifecycle/player/GeneratorCleanup.java +++ b/src/main/java/dev/loki/loparkour/generator/lifecycle/player/GeneratorCleanup.java @@ -88,8 +88,10 @@ public class GeneratorCleanup { } } - // Remove from history - generator.state.history.subList(startIndex, endIndex).clear(); + // Remove from history (synchronized to prevent concurrent index shift) + synchronized (generator.state.history) { + generator.state.history.subList(startIndex, endIndex).clear(); + } } /** diff --git a/src/main/java/dev/loki/loparkour/player/core/ParkourPlayer.java b/src/main/java/dev/loki/loparkour/player/core/ParkourPlayer.java index 77e056e..ba43cda 100644 --- a/src/main/java/dev/loki/loparkour/player/core/ParkourPlayer.java +++ b/src/main/java/dev/loki/loparkour/player/core/ParkourPlayer.java @@ -115,6 +115,13 @@ public class ParkourPlayer extends ParkourUser { save(LoParkour.getPlugin().isEnabled()); } + /** + * Clear scored blocks set, typically on fall/respawn so same coordinates can be re-scored. + */ + public void clearScoredBlocks() { + scoredBlocks.clear(); + } + private static String blockKey(Block block) { return block.getX() + "," + block.getY() + "," + block.getZ(); }