Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/main/java/dev/deepcore/DeepCorePlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public void onEnable() {
return;
}

deepCoreLogger.info("DeepCore enabled.");
deepCoreLogger.info("DeepCore loaded!");
}

@Override
Expand All @@ -35,6 +35,13 @@ public void onDisable() {
challengeRuntime.getChallengeManager().saveToConfig();
}
if (challengeRuntime != null) {
challengeRuntime.getTrainingManager().shutdown();
}
if (challengeRuntime != null) {
if (challengeRuntime.getChallengeSessionManager().isRunningPhase()
|| challengeRuntime.getChallengeSessionManager().isPausedPhase()) {
challengeRuntime.getChallengeSessionManager().endChallengeAndReturnToPrep();
}
challengeRuntime.getChallengeSessionManager().shutdown();
}
if (challengeRuntime != null) {
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/dev/deepcore/challenge/ChallengeAdminFacade.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package dev.deepcore.challenge;

import dev.deepcore.DeepCorePlugin;
import dev.deepcore.challenge.training.TrainingManager;
import dev.deepcore.challenge.world.WorldResetManager;
import dev.deepcore.logging.DeepCoreLogger;
import java.util.Map;
import org.bukkit.World;
import org.bukkit.command.CommandSender;

/**
Expand All @@ -15,6 +17,7 @@ public final class ChallengeAdminFacade {
private final ChallengeManager challengeManager;
private final ChallengeSessionManager challengeSessionManager;
private final WorldResetManager worldResetManager;
private final TrainingManager trainingManager;
private final DeepCoreLogger logger;

/**
Expand All @@ -25,18 +28,21 @@ public final class ChallengeAdminFacade {
* @param challengeManager challenge configuration manager
* @param challengeSessionManager session lifecycle coordinator
* @param worldResetManager world reset orchestration service
* @param trainingManager training gym orchestration service
* @param logger logger used for command and config operations
*/
public ChallengeAdminFacade(
DeepCorePlugin plugin,
ChallengeManager challengeManager,
ChallengeSessionManager challengeSessionManager,
WorldResetManager worldResetManager,
TrainingManager trainingManager,
DeepCoreLogger logger) {
this.plugin = plugin;
this.challengeManager = challengeManager;
this.challengeSessionManager = challengeSessionManager;
this.worldResetManager = worldResetManager;
this.trainingManager = trainingManager;
this.logger = logger;
}

Expand Down Expand Up @@ -171,6 +177,26 @@ public void resetWorlds(CommandSender sender) {
worldResetManager.resetThreeWorlds(sender);
}

/**
* Selects the active lobby world by key.
*
* @param selector one of limbo, overworld, or nether
* @return selected lobby world name, or null when selection failed
*/
public String selectLobbyWorld(String selector) {
World selected = worldResetManager.selectLobbyWorld(selector);
return selected == null ? null : selected.getName();
}

/**
* Teleports online players to the currently selected active lobby world.
*
* @return count of players teleported
*/
public int teleportOnlinePlayersToActiveLobby() {
return worldResetManager.teleportOnlinePlayersToActiveLobby();
}

/**
* Reloads config and applies settings immediately when in prep phase.
*
Expand All @@ -179,6 +205,7 @@ public void resetWorlds(CommandSender sender) {
public boolean reloadConfigAndApply() {
plugin.reloadConfig();
logger.loadFromConfig();
trainingManager.reloadFromConfig();
if (!challengeSessionManager.isPrepPhase()) {
return false;
}
Expand Down
15 changes: 12 additions & 3 deletions src/main/java/dev/deepcore/challenge/ChallengeCommand.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.deepcore.challenge;

import dev.deepcore.DeepCorePlugin;
import dev.deepcore.challenge.training.TrainingManager;
import dev.deepcore.challenge.world.WorldResetManager;
import java.util.List;
import org.bukkit.command.Command;
Expand All @@ -22,15 +23,23 @@ public final class ChallengeCommand implements CommandExecutor, TabCompleter {
* @param challengeManager challenge settings and component manager
* @param challengeSessionManager challenge session orchestration manager
* @param worldResetManager world reset and world lifecycle manager
* @param trainingManager training gym manager
*/
public ChallengeCommand(
DeepCorePlugin plugin,
ChallengeManager challengeManager,
ChallengeSessionManager challengeSessionManager,
WorldResetManager worldResetManager) {
WorldResetManager worldResetManager,
TrainingManager trainingManager) {
ChallengeAdminFacade adminFacade = new ChallengeAdminFacade(
plugin, challengeManager, challengeSessionManager, worldResetManager, plugin.getDeepCoreLogger());
this.coreCommandHandler = new ChallengeCoreCommandHandler(adminFacade, plugin.getDeepCoreLogger());
plugin,
challengeManager,
challengeSessionManager,
worldResetManager,
trainingManager,
plugin.getDeepCoreLogger());
this.coreCommandHandler =
new ChallengeCoreCommandHandler(adminFacade, trainingManager, plugin.getDeepCoreLogger());
this.logsCommandHandler = new ChallengeLogsCommandHandler(plugin.getDeepCoreLogger());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.deepcore.challenge;

import dev.deepcore.challenge.training.TrainingManager;
import dev.deepcore.logging.DeepCoreLogger;
import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -15,16 +16,20 @@
*/
public final class ChallengeCoreCommandHandler {
private final ChallengeAdminFacade adminFacade;
private final TrainingManager trainingManager;
private final DeepCoreLogger logger;

/**
* Creates a core command handler for non-logs `/challenge` subcommands.
*
* @param adminFacade admin facade providing challenge control operations
* @param logger logger used for command diagnostics
* @param adminFacade admin facade providing challenge control operations
* @param trainingManager training gym manager
* @param logger logger used for command diagnostics
*/
public ChallengeCoreCommandHandler(ChallengeAdminFacade adminFacade, DeepCoreLogger logger) {
public ChallengeCoreCommandHandler(
ChallengeAdminFacade adminFacade, TrainingManager trainingManager, DeepCoreLogger logger) {
this.adminFacade = adminFacade;
this.trainingManager = trainingManager;
this.logger = logger;
}

Expand All @@ -43,6 +48,9 @@ public boolean handle(CommandSender sender, String[] args) {

String subcommand = args[0].toLowerCase(Locale.ROOT);
switch (subcommand) {
case "train" -> {
return trainingManager.handleCommand(sender, args);
}
case "list" -> {
sendInfo(sender, ChatColor.GOLD + "Available challenge modes:");
for (ChallengeMode mode : ChallengeMode.values()) {
Expand All @@ -52,6 +60,9 @@ public boolean handle(CommandSender sender, String[] args) {
return true;
}
case "enable" -> {
if (!requireAdminPermission(sender)) {
return true;
}
if (!canEditSettings(sender)) {
return true;
}
Expand All @@ -61,6 +72,9 @@ public boolean handle(CommandSender sender, String[] args) {
return true;
}
case "disable" -> {
if (!requireAdminPermission(sender)) {
return true;
}
if (!canEditSettings(sender)) {
return true;
}
Expand All @@ -70,6 +84,9 @@ public boolean handle(CommandSender sender, String[] args) {
return true;
}
case "mode" -> {
if (!requireAdminPermission(sender)) {
return true;
}
if (!canEditSettings(sender)) {
return true;
}
Expand Down Expand Up @@ -166,8 +183,34 @@ public boolean handle(CommandSender sender, String[] args) {
adminFacade.resetWorlds(sender);
return true;
}
case "lobby" -> {
if (!requireAdminPermission(sender)) {
return true;
}

if (args.length < 2) {
sendInfo(sender, ChatColor.RED + "Usage: /challenge lobby <limbo|overworld|nether>");
return true;
}

String selector = args[1].toLowerCase(Locale.ROOT);
String selectedWorldName = adminFacade.selectLobbyWorld(selector);
if (selectedWorldName == null) {
sendInfo(sender, ChatColor.RED + "Unknown lobby selector. Use limbo|overworld|nether.");
return true;
}

int teleported = adminFacade.teleportOnlinePlayersToActiveLobby();
sendInfo(
sender, ChatColor.GREEN + "Active lobby world set to: " + ChatColor.YELLOW + selectedWorldName);
sendInfo(
sender,
ChatColor.GREEN + "Teleported players to active lobby: " + ChatColor.YELLOW + teleported);
return true;
}
case "reload" -> {
if (!sender.hasPermission("deepcore.challenge.reload")) {
if (!sender.hasPermission("deepcore.challenge.reload")
&& !sender.hasPermission("deepcore.challenge.admin")) {
sendInfo(sender, ChatColor.RED + "You do not have permission to reload config.");
return true;
}
Expand All @@ -186,7 +229,7 @@ public boolean handle(CommandSender sender, String[] args) {
sendInfo(
sender,
ChatColor.RED
+ "Unknown subcommand. Use /challenge <status|list|enable|disable|mode|component|end|stop|pause|resume|reset|resetworld|reload|logs>.");
+ "Unknown subcommand. Use /challenge <status|train|list|enable|disable|mode|component|end|stop|pause|resume|reset|resetworld|lobby|reload|logs>.");
return true;
}
}
Expand All @@ -204,6 +247,7 @@ public List<String> tabComplete(String[] args) {
args[0],
Arrays.asList(
"status",
"train",
"list",
"enable",
"disable",
Expand All @@ -215,10 +259,15 @@ public List<String> tabComplete(String[] args) {
"resume",
"reset",
"resetworld",
"lobby",
"reload",
"logs"));
}

if (args.length >= 2 && args[0].equalsIgnoreCase("train")) {
return trainingManager.tabComplete(args);
}

if (args.length == 2 && args[0].equalsIgnoreCase("mode")) {
return filterByPrefix(
args[1],
Expand All @@ -227,6 +276,10 @@ public List<String> tabComplete(String[] args) {
.collect(Collectors.toList()));
}

if (args.length == 2 && args[0].equalsIgnoreCase("lobby")) {
return filterByPrefix(args[1], Arrays.asList("limbo", "overworld", "nether"));
}

if (args.length == 2 && args[0].equalsIgnoreCase("component")) {
List<String> options = new ArrayList<>();
options.add("list");
Expand Down Expand Up @@ -271,6 +324,10 @@ private void handleComponentSubcommand(CommandSender sender, String[] args) {
return;
}

if (!requireAdminPermission(sender)) {
return;
}

if (!canEditSettings(sender)) {
return;
}
Expand Down Expand Up @@ -341,6 +398,15 @@ private boolean canEditSettings(CommandSender sender) {
return false;
}

private boolean requireAdminPermission(CommandSender sender) {
if (sender.hasPermission("deepcore.challenge.admin")) {
return true;
}

sendInfo(sender, ChatColor.RED + "You do not have permission to manage challenge settings.");
return false;
}

private void sendInfo(CommandSender sender, String message) {
logger.sendInfo(sender, message);
}
Expand Down
16 changes: 15 additions & 1 deletion src/main/java/dev/deepcore/challenge/ChallengeRuntime.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.deepcore.challenge;

import dev.deepcore.challenge.training.TrainingManager;
import dev.deepcore.challenge.world.WorldResetManager;
import dev.deepcore.records.RunRecordsService;

Expand All @@ -11,6 +12,7 @@ public final class ChallengeRuntime {
private final ChallengeSessionManager challengeSessionManager;
private final WorldResetManager worldResetManager;
private final RunRecordsService runRecordsService;
private final TrainingManager trainingManager;

/**
* Creates an immutable runtime container for challenge services.
Expand All @@ -19,16 +21,19 @@ public final class ChallengeRuntime {
* @param challengeSessionManager challenge session orchestration manager
* @param worldResetManager world reset and lifecycle manager
* @param runRecordsService run records persistence/query service
* @param trainingManager training gym manager
*/
public ChallengeRuntime(
ChallengeManager challengeManager,
ChallengeSessionManager challengeSessionManager,
WorldResetManager worldResetManager,
RunRecordsService runRecordsService) {
RunRecordsService runRecordsService,
TrainingManager trainingManager) {
this.challengeManager = challengeManager;
this.challengeSessionManager = challengeSessionManager;
this.worldResetManager = worldResetManager;
this.runRecordsService = runRecordsService;
this.trainingManager = trainingManager;
}

/**
Expand Down Expand Up @@ -66,4 +71,13 @@ public WorldResetManager getWorldResetManager() {
public RunRecordsService getRunRecordsService() {
return runRecordsService;
}

/**
* Returns the training gym manager instance.
*
* @return training manager
*/
public TrainingManager getTrainingManager() {
return trainingManager;
}
}
Loading
Loading