diff --git a/src/main/java/dev/loki/loparkour/config/Locales.java b/src/main/java/dev/loki/loparkour/config/Locales.java index ae58583..1271396 100644 --- a/src/main/java/dev/loki/loparkour/config/Locales.java +++ b/src/main/java/dev/loki/loparkour/config/Locales.java @@ -90,9 +90,15 @@ public class Locales { @NotNull public static Item getItem(@NotNull String locale, @NotNull String path, String... replace) { synchronized (locales) { - if (locales.isEmpty()) return new Item(Material.STONE, ""); + if (locales.isEmpty()) { + LoParkour.getPlugin().getLogger().warning("Locales are empty! Returning STONE item for path: " + path); + return new Item(Material.STONE, ""); + } FileConfiguration config = locales.get(locale); - if (config == null) return new Item(Material.STONE, ""); + if (config == null) { + LoParkour.getPlugin().getLogger().warning("Locale '" + locale + "' not found! Available: " + locales.keySet() + ". Returning STONE for path: " + path); + return new Item(Material.STONE, ""); + } return buildItem(config, path, replace); } } diff --git a/src/main/java/dev/loki/loparkour/generator/ParkourGenerator.java b/src/main/java/dev/loki/loparkour/generator/ParkourGenerator.java index c7126a9..363616c 100644 --- a/src/main/java/dev/loki/loparkour/generator/ParkourGenerator.java +++ b/src/main/java/dev/loki/loparkour/generator/ParkourGenerator.java @@ -72,7 +72,7 @@ public class ParkourGenerator { // Lifecycle methods public void startTick() { lifecycle.startTick(); } public void tick() { lifecycle.tick(); } - protected void fall() { lifecycle.fall(); } + public void fall() { lifecycle.fall(); } protected void score() { lifecycle.score(); } public void reset(boolean regenerate) { diff --git a/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleTickManager.java b/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleTickManager.java index d888802..4e4ca0c 100644 --- a/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleTickManager.java +++ b/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleTickManager.java @@ -44,20 +44,41 @@ public class LifecycleTickManager { */ public void tick() { tickCounter++; - + + // Check if players fell below threshold + checkPlayerFall(); + if (tickCounter % Option.CLEANUP_INTERVAL == 0) { cleanup.cleanupDistantBlocks(); } if (tickCounter % TIME_UI_INTERVAL == 0) { visualUpdater.updateTimeDisplays(); } - + // Generate more blocks if needed maintainBlockLead(); - + // Update player visuals visualUpdater.updateAllPlayers(); } + + /** + * Check if any player fell below the threshold. + */ + private void checkPlayerFall() { + if (generator.state.playerSpawn == null) { + return; + } + + double fallThreshold = generator.state.playerSpawn.getY() - 30; + + for (var player : generator.getPlayers()) { + if (player.player.getLocation().getY() < fallThreshold) { + generator.fall(); + break; // Only trigger once per tick + } + } + } /** * Reset tick counter. diff --git a/src/main/java/dev/loki/loparkour/mode/CoopMode.java b/src/main/java/dev/loki/loparkour/mode/CoopMode.java index 4350453..7312f8f 100644 --- a/src/main/java/dev/loki/loparkour/mode/CoopMode.java +++ b/src/main/java/dev/loki/loparkour/mode/CoopMode.java @@ -163,7 +163,7 @@ public class CoopMode implements MultiMode { } @Override - protected void fall() { + public void fall() { // Show each player their individual contribution before reset getPlayers().forEach(pp -> { int contrib = contributions.getOrDefault(pp.getUUID(), 0);