Bladeren bron

FFS Leaderboard rewrites, and new mcrank command.

nossr50 12 jaren geleden
bovenliggende
commit
6bbdbee669

+ 2 - 0
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

+ 4 - 1
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"));

+ 1 - 0
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); }

+ 13 - 0
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.

+ 7 - 7
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;
     }

+ 111 - 211
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<SkillType, List<PlayerStat>> playerStatHash = new HashMap<SkillType, List<PlayerStat>>();
+    
     /**
-     * Create the leaderboards.
+     * Update the leader boards.
      */
-    public static void makeLeaderboards() {
-        //Make Lists
-        List<PlayerStat> Mining = new ArrayList<PlayerStat>();
-        List<PlayerStat> WoodCutting = new ArrayList<PlayerStat>();
-        List<PlayerStat> Herbalism = new ArrayList<PlayerStat>();
-        List<PlayerStat> Excavation = new ArrayList<PlayerStat>();
-        List<PlayerStat> Acrobatics = new ArrayList<PlayerStat>();
-        List<PlayerStat> Repair = new ArrayList<PlayerStat>();
-        List<PlayerStat> Swords = new ArrayList<PlayerStat>();
-        List<PlayerStat> Axes = new ArrayList<PlayerStat>();
-        List<PlayerStat> Archery = new ArrayList<PlayerStat>();
-        List<PlayerStat> Unarmed = new ArrayList<PlayerStat>();
-        List<PlayerStat> Taming = new ArrayList<PlayerStat>();
-        List<PlayerStat> Fishing = new ArrayList<PlayerStat>();
-        List<PlayerStat> PowerLevel = new ArrayList<PlayerStat>();
-
-        //Add Data To Lists
+    public static void updateLeaderboards() {
+        //Initialize lists
+        List<PlayerStat> mining, woodcutting, herbalism, excavation, acrobatics, repair, swords, axes, archery, unarmed, taming, fishing, powerlevel;
+
+        mining = new ArrayList<PlayerStat>();
+        woodcutting = new ArrayList<PlayerStat>();
+        herbalism = new ArrayList<PlayerStat>();
+        excavation = new ArrayList<PlayerStat>();
+        acrobatics = new ArrayList<PlayerStat>();
+        repair = new ArrayList<PlayerStat>();
+        swords = new ArrayList<PlayerStat>();
+        axes = new ArrayList<PlayerStat>();
+        archery = new ArrayList<PlayerStat>();
+        unarmed = new ArrayList<PlayerStat>();
+        taming = new ArrayList<PlayerStat>();
+        fishing = new ArrayList<PlayerStat>();
+        powerlevel = new ArrayList<PlayerStat>();
+
+        //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";
-
-        try {
-            FileReader file = new FileReader(theLocation);
-            BufferedReader in = new BufferedReader(file);
-            int destination;
-
-            //How many lines to skip through
+    public static String[] retrieveInfo(SkillType skillType, int pagenumber) {
+    	String[] info = new String[10];
+
+        List<PlayerStat> 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;
-        }
-        catch (Exception e) {
-            plugin.getLogger().severe("Exception while reading " + theLocation + " (Are you sure you formatted it correctly?)" + e.toString());
+            
+        	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...
         }
-
-        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<PlayerStat> 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<PlayerStat> {
         @Override
         public int compare(PlayerStat o1, PlayerStat o2) {

+ 0 - 27
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 */

+ 0 - 1
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();

+ 0 - 2
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);

+ 2 - 0
src/main/resources/config.yml

@@ -301,6 +301,8 @@ Commands:
         Enabled: true
     mctop:
         Enabled: true
+    mcrank:
+        Enabled: true
     xplock:
         Enabled: true
     inspect:

+ 3 - 0
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