diff --git a/src/main/java/dev/loki/loparkour/config/Locales.java b/src/main/java/dev/loki/loparkour/config/Locales.java index 44de605..ae58583 100644 --- a/src/main/java/dev/loki/loparkour/config/Locales.java +++ b/src/main/java/dev/loki/loparkour/config/Locales.java @@ -101,24 +101,20 @@ public class Locales { private static void loadLocalesAsync() { Plugin plugin = LoParkour.getPlugin(); - Scheduler.get(plugin).runAsync(() -> { - try { - FileConfiguration embedded = YamlConfiguration.loadConfiguration( - new InputStreamReader(plugin.getResource("locales/en.yml"), StandardCharsets.UTF_8)); + try { + FileConfiguration embedded = YamlConfiguration.loadConfiguration( + new InputStreamReader(plugin.getResource("locales/en.yml"), StandardCharsets.UTF_8)); - Map loaded = loadFromDisk(embedded); + Map loaded = loadFromDisk(embedded); - Scheduler.get(plugin).run(() -> { - synchronized (locales) { - locales.clear(); - locales.putAll(loaded); - } - LoParkour.log("Locales reloaded successfully (" + loaded.size() + " locales)"); - }); - } catch (Exception ex) { - plugin.getLogger().severe("Error while loading locale files: " + ex.getMessage()); + synchronized (locales) { + locales.clear(); + locales.putAll(loaded); } - }); + LoParkour.log("Locales loaded successfully (" + loaded.size() + " locales)"); + } catch (Exception ex) { + plugin.getLogger().severe("Error while loading locale files: " + ex.getMessage()); + } } @NotNull diff --git a/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleEventManager.java b/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleEventManager.java index e853412..80168be 100644 --- a/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleEventManager.java +++ b/src/main/java/dev/loki/loparkour/generator/lifecycle/LifecycleEventManager.java @@ -91,9 +91,16 @@ public class LifecycleEventManager { // Record statistics String time = generator.getFormattedTime(); String difficulty = String.valueOf(generator.getDifficultyScore()); - + generator.registerScore(time, difficulty, generator.state.score); - + + // Teleport players back to spawn before reset + for (ParkourPlayer player : generator.getPlayers()) { + if (generator.state.playerSpawn != null) { + player.teleport(generator.state.playerSpawn); + } + } + // Reset generator state generator.reset(true); } diff --git a/src/main/java/dev/loki/loparkour/session/SessionStateManager.java b/src/main/java/dev/loki/loparkour/session/SessionStateManager.java index 975576f..1d75a9c 100644 --- a/src/main/java/dev/loki/loparkour/session/SessionStateManager.java +++ b/src/main/java/dev/loki/loparkour/session/SessionStateManager.java @@ -1,8 +1,11 @@ package dev.loki.loparkour.session; +import dev.loki.loparkour.LoParkour; import dev.loki.loparkour.generator.ParkourGenerator; import dev.loki.loparkour.player.ParkourUser; import dev.loki.loparkour.world.Divider; +import dev.lolib.scheduler.Scheduler; +import dev.lolib.scheduler.ScheduledTask; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -20,6 +23,7 @@ public class SessionStateManager { private Location spawnLocation; private Session.Visibility visibility = Session.Visibility.PUBLIC; private final Map mutedUsers = new HashMap<>(); + private ScheduledTask tickTask = null; public SessionStateManager(@NotNull Session session) { this.session = session; @@ -31,26 +35,57 @@ public class SessionStateManager { public void initialize(@NotNull Function generatorFunction) { // Allocate spawn location this.spawnLocation = Divider.add(session); - + // Create generator ParkourGenerator generator = generatorFunction.apply(session); session.setGenerator(generator); - + // Build island at spawn location generator.island.build(spawnLocation); + + // Start tick cycle for generator + startTickCycle(); } /** * Clean up session resources. */ public void cleanup() { + // Stop tick cycle + stopTickCycle(); + if (session.generator != null) { session.generator.reset(false); } - + Divider.remove(session); mutedUsers.clear(); } + + /** + * Start tick cycle for generator. + */ + private void startTickCycle() { + if (session.generator == null || tickTask != null) { + return; + } + + tickTask = Scheduler.get(LoParkour.getPlugin()).runTimer(() -> { + if (session.generator != null) { + session.generator.tick(); + } + }, 0, 1); // Run every tick (1 = 50ms) + } + + /** + * Stop tick cycle. + */ + private void stopTickCycle() { + if (tickTask != null) { + tickTask.cancel(); + tickTask = null; + } + } /** * Set session visibility.