Skip to content
Open
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: 9 additions & 0 deletions src/main/java/com/azuredoom/levelingcore/LevelingCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -28,6 +29,8 @@ public class LevelingCore extends JavaPlugin {

public static LevelServiceImpl levelingService;

public static RankManager rankManager;

private static LevelingCore INSTANCE;

private final Config<GUIConfig> config;
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import javax.annotation.Nonnull;

import com.azuredoom.levelingcore.LevelingCore;
import com.azuredoom.levelingcore.api.LevelingCoreApi;

/**
Expand Down Expand Up @@ -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));
}
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/com/azuredoom/levelingcore/rank/RankConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.azuredoom.levelingcore.rank;

import java.util.List;

public class RankConfig {

public List<RankEntry> ranks;

public static class RankEntry {
public String id;
public String name;
public int minLevel;
public int maxLevel;
}
}
63 changes: 63 additions & 0 deletions src/main/java/com/azuredoom/levelingcore/rank/RankManager.java
Original file line number Diff line number Diff line change
@@ -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<RankConfig.RankEntry> 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();
}
}