From 6bbdbee669b69bb673625b5dfba552a14cd31a1b Mon Sep 17 00:00:00 2001 From: nossr50 Date: Tue, 15 Jan 2013 14:49:20 -0800 Subject: [PATCH] FFS Leaderboard rewrites, and new mcrank command. --- Changelog.txt | 2 + .../nossr50/commands/mc/MctopCommand.java | 5 +- .../java/com/gmail/nossr50/config/Config.java | 1 + .../gmail/nossr50/datatypes/SkillType.java | 13 + src/main/java/com/gmail/nossr50/mcMMO.java | 14 +- .../com/gmail/nossr50/util/Leaderboard.java | 318 ++++++------------ .../java/com/gmail/nossr50/util/Skills.java | 27 -- .../java/com/gmail/nossr50/util/Users.java | 1 - .../shatt/backup/ZipLibrary.java | 2 - src/main/resources/config.yml | 2 + src/main/resources/plugin.yml | 3 + 11 files changed, 141 insertions(+), 247 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index af13c1bf5..ba20d3d78 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -10,10 +10,12 @@ Key: Version 1.3.13-dev ! Overall SQL query improvements ! Reduced number of SQL queries for mcTop command from 11 to 1, speeding it up immensely + ! Changed FFS Leaderboards to hold information in memory rather than doing IO work (optimizations) + Added task to prune old and powerless users from the SQL database. *** WARNING: THIS WILL RUN AUTOMATICALLY ON YOUR DB. IF YOU ARE WORRIED *** *** ABOUT DATA LOSS, BACK UP YOUR SQL DATA BEFORE INSTALLING THIS BUILD *** + Added Craftbukkit 1.4.6 compatibility + + Added new /mcrank command for showing a players leader board ranking for all skills in one place + Added a configurable durability cap for ArmorImpact to advanced.yml + Added the version number to /mcmmo + Added bats, giants, witches, withers, and wither skeletons to the mcMMO combat experience list, and makes their experience drops configurable diff --git a/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java b/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java index 555f60843..b63d7425f 100644 --- a/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java @@ -10,6 +10,7 @@ import org.bukkit.command.CommandSender; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.Database; import com.gmail.nossr50.util.Leaderboard; @@ -105,7 +106,9 @@ public class MctopCommand implements CommandExecutor { } private void flatfileDisplay(int page, String skill, CommandSender sender) { - String[] info = Leaderboard.retrieveInfo(skill, page); + Leaderboard.updateLeaderboards(); //Make sure we have the latest information + SkillType skillType = SkillType.getSkill(skill); + String[] info = Leaderboard.retrieveInfo(skillType, page); if (skill.equals("ALL")) { sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Leaderboard")); diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index ce1405ad5..cf92c4e30 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -80,6 +80,7 @@ public class Config extends ConfigLoader { public boolean getCommandXPLockEnabled() { return config.getBoolean("Commands.xplock.Enabled", true); } public boolean getCommandXPRateEnabled() { return config.getBoolean("Commands.xprate.Enabled", true); } public boolean getCommandMCTopEnabled() { return config.getBoolean("Commands.mctop.Enabled", true); } + public boolean getCommandMCRankEnabled() { return config.getBoolean("Commands.mcrank.Enabled", true); } public boolean getCommandAddXPEnabled() { return config.getBoolean("Commands.addxp.Enabled", true); } public boolean getCommandAddLevelsEnabled() { return config.getBoolean("Commands.addlevels.Enabled", true); } public boolean getCommandMCAbilityEnabled() { return config.getBoolean("Commands.mcability.Enabled", true); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/SkillType.java b/src/main/java/com/gmail/nossr50/datatypes/SkillType.java index c414f7980..df84ea4ff 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/SkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/SkillType.java @@ -117,6 +117,19 @@ public enum SkillType { public double getXpModifier() { return xpModifier; } + + public static SkillType getSkill(String skillName) { + if(skillName.equalsIgnoreCase("powerlevel") || skillName.equalsIgnoreCase("all")) { + return SkillType.ALL; + } else { + for(SkillType st : SkillType.values()) { + if(st.name().equalsIgnoreCase(skillName)) + return st; + } + System.out.println("[DEBUG] Invalid mcMMO skill ("+skillName+")"); + return null; + } + } /** * Get the skill level for this skill. diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 16aeb6922..b63258bf2 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -27,6 +27,7 @@ import com.gmail.nossr50.commands.mc.MccCommand; import com.gmail.nossr50.commands.mc.McgodCommand; import com.gmail.nossr50.commands.mc.McmmoCommand; import com.gmail.nossr50.commands.mc.McpurgeCommand; +import com.gmail.nossr50.commands.mc.McrankCommand; import com.gmail.nossr50.commands.mc.McrefreshCommand; import com.gmail.nossr50.commands.mc.McremoveCommand; import com.gmail.nossr50.commands.mc.MctopCommand; @@ -172,13 +173,13 @@ public class mcMMO extends JavaPlugin { PluginDescriptionFile pdfFile = getDescription(); - //Setup the leaderboards + //Setup the leader boards if (configInstance.getUseMySQL()) { database = new Database(this); database.createStructure(); } else { - Leaderboard.makeLeaderboards(); + Leaderboard.updateLeaderboards(); } for (Player player : getServer().getOnlinePlayers()) { @@ -260,7 +261,6 @@ public class mcMMO extends JavaPlugin { mainDirectory = getDataFolder().getPath() + File.separator; flatFileDirectory = mainDirectory + "FlatFileStuff" + File.separator; usersFile = flatFileDirectory + "mcmmo.users"; - leaderboardDirectory = flatFileDirectory + "Leaderboards" + File.separator; modDirectory = mainDirectory + "ModConfigs" + File.separator; } @@ -392,6 +392,10 @@ public class mcMMO extends JavaPlugin { if (configInstance.getCommandMCTopEnabled()) { getCommand("mctop").setExecutor(new MctopCommand()); } + + if(configInstance.getCommandMCRankEnabled()) { + getCommand("mcrank").setExecutor(new McrankCommand()); + } if (configInstance.getCommandMCStatsEnabled()) { getCommand("mcstats").setExecutor(new McstatsCommand()); @@ -528,10 +532,6 @@ public class mcMMO extends JavaPlugin { return usersFile; } - public static String getLeaderboardDirectory() { - return leaderboardDirectory; - } - public static String getModDirectory() { return modDirectory; } diff --git a/src/main/java/com/gmail/nossr50/util/Leaderboard.java b/src/main/java/com/gmail/nossr50/util/Leaderboard.java index 70ed0fc91..f0f6a75c8 100644 --- a/src/main/java/com/gmail/nossr50/util/Leaderboard.java +++ b/src/main/java/com/gmail/nossr50/util/Leaderboard.java @@ -1,45 +1,44 @@ package com.gmail.nossr50.util; import java.io.BufferedReader; -import java.io.File; import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.PlayerStat; import com.gmail.nossr50.datatypes.SkillType; public class Leaderboard { private static mcMMO plugin = mcMMO.p; - private static String leaderboardsDirectory = mcMMO.getLeaderboardDirectory(); private final static String location = mcMMO.getUsersFile(); - + private static HashMap> playerStatHash = new HashMap>(); + /** - * Create the leaderboards. + * Update the leader boards. */ - public static void makeLeaderboards() { - //Make Lists - List Mining = new ArrayList(); - List WoodCutting = new ArrayList(); - List Herbalism = new ArrayList(); - List Excavation = new ArrayList(); - List Acrobatics = new ArrayList(); - List Repair = new ArrayList(); - List Swords = new ArrayList(); - List Axes = new ArrayList(); - List Archery = new ArrayList(); - List Unarmed = new ArrayList(); - List Taming = new ArrayList(); - List Fishing = new ArrayList(); - List PowerLevel = new ArrayList(); + public static void updateLeaderboards() { + //Initialize lists + List mining, woodcutting, herbalism, excavation, acrobatics, repair, swords, axes, archery, unarmed, taming, fishing, powerlevel; - //Add Data To Lists + mining = new ArrayList(); + woodcutting = new ArrayList(); + herbalism = new ArrayList(); + excavation = new ArrayList(); + acrobatics = new ArrayList(); + repair = new ArrayList(); + swords = new ArrayList(); + axes = new ArrayList(); + archery = new ArrayList(); + unarmed = new ArrayList(); + taming = new ArrayList(); + fishing = new ArrayList(); + powerlevel = new ArrayList(); + + //Read from the FlatFile database and fill our arrays with information try { FileReader file = new FileReader(location); BufferedReader in = new BufferedReader(file); @@ -52,7 +51,7 @@ public class Leaderboard { String p = character[0]; int powerLevel = 0; - //Prevent the same player from being added multiple times + //Prevent the same player from being added multiple times (I'd like to note that this shouldn't happen...) if (players.contains(p)) { continue; } @@ -60,66 +59,66 @@ public class Leaderboard { players.add(p); if (character.length > 1 && Misc.isInt(character[1])) { - Mining.add(new PlayerStat(p, Integer.valueOf(character[1]))); + mining.add(new PlayerStat(p, Integer.valueOf(character[1]))); powerLevel += Integer.valueOf(character[1]); } if (character.length > 5 && Misc.isInt(character[5])) { - WoodCutting.add(new PlayerStat(p, Integer.valueOf(character[5]))); + woodcutting.add(new PlayerStat(p, Integer.valueOf(character[5]))); powerLevel += Integer.valueOf(character[5]); } if (character.length > 7 && Misc.isInt(character[7])) { - Repair.add(new PlayerStat(p, Integer.valueOf(character[7]))); + repair.add(new PlayerStat(p, Integer.valueOf(character[7]))); powerLevel += Integer.valueOf(character[7]); } if (character.length > 8 && Misc.isInt(character[8])) { - Unarmed.add(new PlayerStat(p, Integer.valueOf(character[8]))); + unarmed.add(new PlayerStat(p, Integer.valueOf(character[8]))); powerLevel += Integer.valueOf(character[8]); } if (character.length > 9 && Misc.isInt(character[9])) { - Herbalism.add(new PlayerStat(p, Integer.valueOf(character[9]))); + herbalism.add(new PlayerStat(p, Integer.valueOf(character[9]))); powerLevel += Integer.valueOf(character[9]); } if (character.length > 10 && Misc.isInt(character[10])) { - Excavation.add(new PlayerStat(p, Integer.valueOf(character[10]))); + excavation.add(new PlayerStat(p, Integer.valueOf(character[10]))); powerLevel += Integer.valueOf(character[10]); } if (character.length > 11 && Misc.isInt(character[11])) { - Archery.add(new PlayerStat(p, Integer.valueOf(character[11]))); + archery.add(new PlayerStat(p, Integer.valueOf(character[11]))); powerLevel += Integer.valueOf(character[11]); } if (character.length > 12 && Misc.isInt(character[12])) { - Swords.add(new PlayerStat(p, Integer.valueOf(character[12]))); + swords.add(new PlayerStat(p, Integer.valueOf(character[12]))); powerLevel += Integer.valueOf(character[12]); } if (character.length > 13 && Misc.isInt(character[13])) { - Axes.add(new PlayerStat(p, Integer.valueOf(character[13]))); + axes.add(new PlayerStat(p, Integer.valueOf(character[13]))); powerLevel += Integer.valueOf(character[13]); } if (character.length > 14 && Misc.isInt(character[14])) { - Acrobatics.add(new PlayerStat(p, Integer.valueOf(character[14]))); + acrobatics.add(new PlayerStat(p, Integer.valueOf(character[14]))); powerLevel += Integer.valueOf(character[14]); } if (character.length > 24 && Misc.isInt(character[24])) { - Taming.add(new PlayerStat(p, Integer.valueOf(character[24]))); + taming.add(new PlayerStat(p, Integer.valueOf(character[24]))); powerLevel += Integer.valueOf(character[24]); } if (character.length > 34 && Misc.isInt(character[34])) { - Fishing.add(new PlayerStat(p, Integer.valueOf(character[34]))); + fishing.add(new PlayerStat(p, Integer.valueOf(character[34]))); powerLevel += Integer.valueOf(character[34]); } - PowerLevel.add(new PlayerStat(p, powerLevel)); + powerlevel.add(new PlayerStat(p, powerLevel)); } in.close(); } @@ -127,101 +126,34 @@ public class Leaderboard { plugin.getLogger().severe(("Exception while reading " + location + " (Are you sure you formatted it correctly?)" + e.toString())); } - if(PowerLevel.isEmpty()) - return; - - //Sort the leader boards SkillComparator c = new SkillComparator(); - Collections.sort(Mining, c); - Collections.sort(WoodCutting, c); - Collections.sort(Repair, c); - Collections.sort(Unarmed, c); - Collections.sort(Herbalism, c); - Collections.sort(Excavation, c); - Collections.sort(Archery, c); - Collections.sort(Swords, c); - Collections.sort(Axes, c); - Collections.sort(Acrobatics, c); - Collections.sort(Taming, c); - Collections.sort(Fishing, c); - Collections.sort(PowerLevel, c); - - //Write the leader board files - PlayerStat[] a = new PlayerStat[1]; - leaderWrite(Mining.toArray(a), SkillType.MINING); - leaderWrite(WoodCutting.toArray(a), SkillType.WOODCUTTING); - leaderWrite(Repair.toArray(a), SkillType.REPAIR); - leaderWrite(Unarmed.toArray(a), SkillType.UNARMED); - leaderWrite(Herbalism.toArray(a), SkillType.HERBALISM); - leaderWrite(Excavation.toArray(a), SkillType.EXCAVATION); - leaderWrite(Archery.toArray(a), SkillType.ARCHERY); - leaderWrite(Swords.toArray(a), SkillType.SWORDS); - leaderWrite(Axes.toArray(a), SkillType.AXES); - leaderWrite(Acrobatics.toArray(a), SkillType.ACROBATICS); - leaderWrite(Taming.toArray(a), SkillType.TAMING); - leaderWrite(Fishing.toArray(a), SkillType.FISHING); - leaderWrite(PowerLevel.toArray(a), SkillType.ALL); - } - - /** - * Write to the leaderboards. - * - * @param ps Stats to write to the leaderboard - * @param skillType Skill type to write the leaderboard of - */ - private static void leaderWrite(PlayerStat[] ps, SkillType skillType) { - String theLocation = leaderboardsDirectory + skillType.toString().toLowerCase() + ".mcmmo"; - File theDir = new File(theLocation); - - //CHECK IF THE FILE EXISTS - if (!theDir.exists()) { - FileWriter writer = null; - - try { - writer = new FileWriter(theLocation); - } - catch (Exception e) { - plugin.getLogger().severe(("Exception while creating " + theLocation + e.toString())); - } - finally { - try { - if (writer != null) { - writer.close(); - } - } - catch (IOException e) { - plugin.getLogger().severe("Exception while closing writer for " + theLocation + e.toString()); - } - } - } - else { - try { - FileReader file = new FileReader(theLocation); - BufferedReader in = new BufferedReader(file); - StringBuilder writer = new StringBuilder(); - - for (PlayerStat p : ps) { - if (p.name.equals("$mcMMO_DummyInfo")) { - continue; - } - - if (p.statVal == 0) { - continue; - } - - writer.append(p.name + ":" + p.statVal); - writer.append("\r\n"); - } - - in.close(); - FileWriter out = new FileWriter(theLocation); - out.write(writer.toString()); - out.close(); - } - catch (Exception e) { - plugin.getLogger().severe("Exception while writing to " + theLocation + " (Are you sure you formatted it correctly?)" + e.toString()); - } - } + Collections.sort(mining, c); + Collections.sort(woodcutting, c); + Collections.sort(repair, c); + Collections.sort(unarmed, c); + Collections.sort(herbalism, c); + Collections.sort(excavation, c); + Collections.sort(archery, c); + Collections.sort(swords, c); + Collections.sort(axes, c); + Collections.sort(acrobatics, c); + Collections.sort(taming, c); + Collections.sort(fishing, c); + Collections.sort(powerlevel, c); + + playerStatHash.put(SkillType.MINING, mining); + playerStatHash.put(SkillType.WOODCUTTING, woodcutting); + playerStatHash.put(SkillType.REPAIR, repair); + playerStatHash.put(SkillType.UNARMED, unarmed); + playerStatHash.put(SkillType.HERBALISM, herbalism); + playerStatHash.put(SkillType.EXCAVATION, excavation); + playerStatHash.put(SkillType.ARCHERY, archery); + playerStatHash.put(SkillType.SWORDS, swords); + playerStatHash.put(SkillType.AXES, axes); + playerStatHash.put(SkillType.ACROBATICS, acrobatics); + playerStatHash.put(SkillType.TAMING, taming); + playerStatHash.put(SkillType.FISHING, fishing); + playerStatHash.put(SkillType.ALL, powerlevel); } /** @@ -231,95 +163,63 @@ public class Leaderboard { * @param pagenumber Which page in the leaderboards to retrieve * @return the requested leaderboard information */ - public static String[] retrieveInfo(String skillName, int pagenumber) { - String theLocation = leaderboardsDirectory + skillName.toLowerCase() + ".mcmmo"; + public static String[] retrieveInfo(SkillType skillType, int pagenumber) { + String[] info = new String[10]; - try { - FileReader file = new FileReader(theLocation); - BufferedReader in = new BufferedReader(file); - int destination; - - //How many lines to skip through + List statsList = playerStatHash.get(skillType); + + if(statsList != null) { + int destination; + + //How many lines to skip through if (pagenumber == 1) { destination = 0; } else { destination = (pagenumber * 10) - 9; } - - int x = 0; //how many lines we've gone through - int y = 0; //going through the lines - String line = ""; - String[] info = new String[10]; //what to return - - while ((line = in.readLine()) != null && y < 10) { - x++; - - if (x >= destination && y < 10) { - info[y] = line.toString(); - y++; - } - } - - in.close(); - return info; + + int currentPos = 0; + + for(PlayerStat ps : statsList) { + if(currentPos == 10) + break; + if(destination > 1) { + destination--; + continue; + } + + info[currentPos] = ps.name+":"+ps.statVal; + currentPos++; + } + + } else { + info[0] = "DummyPlayer:0"; //Coming up with a better solution soon... } - catch (Exception e) { - plugin.getLogger().severe("Exception while reading " + theLocation + " (Are you sure you formatted it correctly?)" + e.toString()); - } - - return null; //Shouldn't get here + + return info; } - - /** - * Update the leaderboards. - * - * @param ps Stats to update the leaderboard with. - * @param skillType Skill whose leaderboard is being updated. - */ - public static void updateLeaderboard(PlayerStat ps, SkillType skillType) { - if (Config.getInstance().getUseMySQL()) { - return; - } - - String theLocation = leaderboardsDirectory + skillType.toString().toLowerCase() + ".mcmmo"; - - try { - FileReader file = new FileReader(theLocation); - BufferedReader in = new BufferedReader(file); - StringBuilder writer = new StringBuilder(); - String line = ""; - Boolean inserted = false; - - while ((line = in.readLine()) != null) { - - //Insert the player into the line before it finds a smaller one - if (Integer.valueOf(line.split(":")[1]) < ps.statVal && !inserted) { - writer.append(ps.name + ":" + ps.statVal).append("\r\n"); - inserted = true; - } - - //Write anything that isn't the player already in the file so we remove the duplicate - if (!line.split(":")[0].equalsIgnoreCase(ps.name)) { - writer.append(line).append("\r\n"); - } - } - - if (!inserted) { - writer.append(ps.name + ":" + ps.statVal).append("\r\n"); - } - - in.close(); - - //Write the new file - FileWriter out = new FileWriter(theLocation); - out.write(writer.toString()); - out.close(); - } - catch (Exception e) { - plugin.getLogger().severe("Exception while writing to " + theLocation + " (Are you sure you formatted it correctly?)" + e.toString()); + + public static int getPlayerRank(String playerName, SkillType skillType) { + int currentPos = 1; + List statsList = playerStatHash.get(skillType); + + if(statsList != null) { + for(PlayerStat ps : statsList) { + if(ps.name.equalsIgnoreCase(playerName)) { + return currentPos; + } else { + currentPos++; + continue; + } + } + + return 0; + } else { + return 0; } } + private static class SkillComparator implements Comparator { @Override public int compare(PlayerStat o1, PlayerStat o2) { diff --git a/src/main/java/com/gmail/nossr50/util/Skills.java b/src/main/java/com/gmail/nossr50/util/Skills.java index 423911c47..8704765b6 100644 --- a/src/main/java/com/gmail/nossr50/util/Skills.java +++ b/src/main/java/com/gmail/nossr50/util/Skills.java @@ -189,28 +189,6 @@ public class Skills { } } - /** - * Update the leaderboards. - * - * @param skillType The skill to update the leaderboards for - * @param player The player whose skill to update - */ - public static void processLeaderboardUpdate(SkillType skillType, Player player) { - McMMOPlayer mcMMOPlayer = Users.getPlayer(player); - PlayerProfile profile = mcMMOPlayer.getProfile(); - PlayerStat ps = new PlayerStat(); - - if (skillType != SkillType.ALL) { - ps.statVal = profile.getSkillLevel(skillType); - } - else { - ps.statVal = mcMMOPlayer.getPowerLevel(); - } - - ps.name = player.getName(); - Leaderboard.updateLeaderboard(ps, skillType); - } - /** * Check the XP of a skill. * @@ -237,11 +215,6 @@ public class Skills { } } - if (!Config.getInstance().getUseMySQL()) { - processLeaderboardUpdate(skillType, player); - processLeaderboardUpdate(SkillType.ALL, player); - } - String capitalized = Misc.getCapitalized(skillType.toString()); /* Spout Stuff */ diff --git a/src/main/java/com/gmail/nossr50/util/Users.java b/src/main/java/com/gmail/nossr50/util/Users.java index be2640eca..c4df4bdf5 100644 --- a/src/main/java/com/gmail/nossr50/util/Users.java +++ b/src/main/java/com/gmail/nossr50/util/Users.java @@ -20,7 +20,6 @@ public class Users { */ public static void loadUsers() { new File(mcMMO.getFlatFileDirectory()).mkdir(); - new File(mcMMO.getLeaderboardDirectory()).mkdir(); try { new File(mcMMO.getUsersFile()).createNewFile(); diff --git a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java index 80e01cace..ea967f2e7 100644 --- a/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java +++ b/src/main/java/net/shatteredlands/shatt/backup/ZipLibrary.java @@ -23,7 +23,6 @@ public class ZipLibrary { private static File UsersFile = new File(mcMMO.getUsersFile()); private static File ConfigFile = new File(mcMMO.getMainDirectory() + "config.yml"); private static File TreasuresFile = new File(mcMMO.getMainDirectory() + "treasures.yml"); - private static File Leaderboards = new File(mcMMO.getLeaderboardDirectory()); public static void mcMMObackup() throws IOException { if (Config.getInstance().getUseMySQL()) { @@ -50,7 +49,6 @@ public class ZipLibrary { sources.add(UsersFile); sources.add(ConfigFile); sources.add(TreasuresFile); - sources.add(Leaderboards); if (ModFileDirectory.exists()) { sources.add(ModFileDirectory); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 248fbcaaf..0a97751df 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -301,6 +301,8 @@ Commands: Enabled: true mctop: Enabled: true + mcrank: + Enabled: true xplock: Enabled: true inspect: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 863ac3278..7e1b8bbf6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -38,6 +38,9 @@ commands: mctop: aliases: [] description: Shows leader boards for mcMMO + mcrank: + aliases: [] + description: Show your individual ranking in mcMMO addxp: aliases: [] description: Add XP to a user