diff --git a/src/main/java/com/azuredoom/levelingcore/LevelingCore.java b/src/main/java/com/azuredoom/levelingcore/LevelingCore.java index 83a3f48..df44a02 100644 --- a/src/main/java/com/azuredoom/levelingcore/LevelingCore.java +++ b/src/main/java/com/azuredoom/levelingcore/LevelingCore.java @@ -17,6 +17,7 @@ import com.azuredoom.levelingcore.events.LossXPEventSystem; import com.azuredoom.levelingcore.exceptions.LevelingCoreException; import com.azuredoom.levelingcore.level.LevelServiceImpl; +import com.azuredoom.levelingcore.rank.RankManager; public class LevelingCore extends JavaPlugin { @@ -28,6 +29,8 @@ public class LevelingCore extends JavaPlugin { public static LevelServiceImpl levelingService; + public static RankManager rankManager; + private static LevelingCore INSTANCE; private final Config config; @@ -57,6 +60,8 @@ protected void setup() { this.config.save(); LOGGER.at(Level.INFO).log("Leveling Core initializing"); levelingService = bootstrap.service(); + rankManager = new RankManager(); + rankManager.load(configPath); getCommandRegistry().registerCommand(new AddLevelCommand()); getCommandRegistry().registerCommand(new CheckLevelCommand()); getCommandRegistry().registerCommand(new AddXpCommand()); @@ -95,6 +100,10 @@ public static LevelServiceImpl getLevelService() { return levelingService; } + public static RankManager getRankManager() { + return rankManager; + } + /** * Provides access to the singleton instance of the {@code LevelingCore} class. This instance serves as the primary * entry point for managing the core functionality of the leveling system, including initialization, configuration, diff --git a/src/main/java/com/azuredoom/levelingcore/commands/CheckLevelCommand.java b/src/main/java/com/azuredoom/levelingcore/commands/CheckLevelCommand.java index facbefb..6452dde 100644 --- a/src/main/java/com/azuredoom/levelingcore/commands/CheckLevelCommand.java +++ b/src/main/java/com/azuredoom/levelingcore/commands/CheckLevelCommand.java @@ -10,6 +10,7 @@ import javax.annotation.Nonnull; +import com.azuredoom.levelingcore.LevelingCore; import com.azuredoom.levelingcore.api.LevelingCoreApi; /** @@ -40,7 +41,14 @@ protected void executeSync(@Nonnull CommandContext commandContext) { var playerRef = this.playerArg.get(commandContext); var playerUUID = playerRef.getUuid(); var levelRef = LevelingCoreApi.getLevelServiceIfPresent().get().getLevel(playerUUID); - var currentLevelMsg = playerRef.getUsername() + " current level is " + levelRef; + var rankName = "Unranked"; + var rankManager = LevelingCore.getRankManager(); + if (rankManager != null) { + rankName = rankManager.getRankForLevel(levelRef) + .map(rank -> rank.name) + .orElse("Unranked"); + } + var currentLevelMsg = playerRef.getUsername() + " current level is " + levelRef + " [" + rankName + "]"; EventTitleUtil.showEventTitleToPlayer(playerRef, Message.raw(currentLevelMsg), Message.raw(""), true); commandContext.sendMessage(Message.raw(currentLevelMsg)); } diff --git a/src/main/java/com/azuredoom/levelingcore/rank/RankConfig.java b/src/main/java/com/azuredoom/levelingcore/rank/RankConfig.java new file mode 100644 index 0000000..69ab59c --- /dev/null +++ b/src/main/java/com/azuredoom/levelingcore/rank/RankConfig.java @@ -0,0 +1,15 @@ +package com.azuredoom.levelingcore.rank; + +import java.util.List; + +public class RankConfig { + + public List ranks; + + public static class RankEntry { + public String id; + public String name; + public int minLevel; + public int maxLevel; + } +} diff --git a/src/main/java/com/azuredoom/levelingcore/rank/RankManager.java b/src/main/java/com/azuredoom/levelingcore/rank/RankManager.java new file mode 100644 index 0000000..0460d45 --- /dev/null +++ b/src/main/java/com/azuredoom/levelingcore/rank/RankManager.java @@ -0,0 +1,63 @@ +package com.azuredoom.levelingcore.rank; + +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.constructor.Constructor; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.Optional; +import java.util.logging.Level; + +import com.azuredoom.levelingcore.LevelingCore; +import com.azuredoom.levelingcore.exceptions.LevelingCoreException; + +public class RankManager { + + private RankConfig config; + + public void load(Path dataDir) { + try { + Files.createDirectories(dataDir); + + var rankPath = dataDir.resolve("ranks.yml"); + + if (Files.notExists(rankPath)) { + LevelingCore.LOGGER.at(Level.INFO).log("No ranks.yml found at {0}", rankPath); + this.config = null; + return; + } + + var opts = new LoaderOptions(); + opts.setMaxAliasesForCollections(50); + + var yaml = new Yaml(new Constructor(RankConfig.class, opts)); + try (var reader = Files.newBufferedReader(rankPath, StandardCharsets.UTF_8)) { + RankConfig loadedConfig = yaml.load(reader); + if (loadedConfig == null) { + this.config = null; + return; + } + if (loadedConfig.ranks != null) { + loadedConfig.ranks.sort(Comparator.comparingInt(rank -> rank.minLevel)); + } + this.config = loadedConfig; + LevelingCore.LOGGER.at(Level.INFO).log("Loaded ranks from {0}", rankPath); + } + } catch (Exception e) { + throw new LevelingCoreException("Failed to load ranks.yml", e); + } + } + + public Optional getRankForLevel(int level) { + if (config == null || config.ranks == null) { + return Optional.empty(); + } + + return config.ranks.stream() + .filter(rank -> level >= rank.minLevel && level <= rank.maxLevel) + .findFirst(); + } +}