Просмотр исходного кода

Use a single manager to handle our databases.

T00thpick1 12 лет назад
Родитель
Сommit
8705974e08

+ 2 - 34
src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java

@@ -3,7 +3,6 @@ package com.gmail.nossr50.commands.player;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.bukkit.ChatColor;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
@@ -12,10 +11,7 @@ import org.bukkit.util.StringUtil;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.database.FlatfileDatabaseManager;
-import com.gmail.nossr50.datatypes.database.PlayerStat;
 import com.gmail.nossr50.datatypes.skills.SkillType;
-import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.runnables.commands.MctopCommandAsyncTask;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.StringUtils;
@@ -84,39 +80,11 @@ public class MctopCommand implements TabExecutor {
             ScoreboardManager.enableGlobalStatsScoreboard((Player) sender, skill, page);
         }
         else {
-            if (Config.getInstance().getUseMySQL()) {
-                sqlDisplay(page, skill, sender);
-            }
-            else {
-                flatfileDisplay(page, skill, sender);
-            }
+            display(page, skill, sender);
         }
     }
 
-    private void flatfileDisplay(int page, String skill, CommandSender sender) {
-        FlatfileDatabaseManager.updateLeaderboards(); // Make sure we have the latest information
-
-        if (skill.equalsIgnoreCase("all")) {
-            sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Leaderboard"));
-        }
-        else {
-            sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", StringUtils.getCapitalized(skill)));
-        }
-
-        int position = (page * 10) - 9;
-
-        for (PlayerStat stat : FlatfileDatabaseManager.retrieveInfo(skill, page, 10)) {
-            String digit = (position < 10) ? "0" : "" + String.valueOf(position);
-
-            // Format: 1. Playername - skill value
-            sender.sendMessage(digit + ". " + ChatColor.GREEN + stat.name + " - " + ChatColor.WHITE + stat.statVal);
-            position++;
-        }
-
-        sender.sendMessage(LocaleLoader.getString("Commands.mctop.Tip"));
-    }
-
-    private void sqlDisplay(int page, String query, CommandSender sender) {
+    private void display(int page, String query, CommandSender sender) {
         new MctopCommandAsyncTask(page, query, sender).runTaskAsynchronously(mcMMO.p);
     }
 

+ 76 - 60
src/main/java/com/gmail/nossr50/database/DatabaseManager.java

@@ -1,63 +1,79 @@
 package com.gmail.nossr50.database;
 
-import java.io.File;
-import java.io.IOException;
-
-import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.util.Misc;
-
-public class DatabaseManager {
-    private final mcMMO plugin;
-    private final boolean isUsingSQL;
-    private File usersFile;
-
-    public DatabaseManager(final mcMMO plugin, final boolean isUsingSQL) {
-        this.plugin = plugin;
-        this.isUsingSQL = isUsingSQL;
-
-        if (isUsingSQL) {
-            SQLDatabaseManager.checkConnected();
-            SQLDatabaseManager.createStructure();
-        }
-        else {
-            usersFile = new File(mcMMO.getUsersFilePath());
-            createFlatfileDatabase();
-            FlatfileDatabaseManager.updateLeaderboards();
-        }
-    }
-
-    public void purgePowerlessUsers() {
-        plugin.getLogger().info("Purging powerless users...");
-        plugin.getLogger().info("Purged " + (isUsingSQL ? SQLDatabaseManager.purgePowerlessSQL() : FlatfileDatabaseManager.purgePowerlessFlatfile()) + " users from the database.");
-    }
-
-    public void purgeOldUsers() {
-        plugin.getLogger().info("Purging old users...");
-        plugin.getLogger().info("Purged " + (isUsingSQL ? SQLDatabaseManager.purgeOldSQL() : FlatfileDatabaseManager.removeOldFlatfileUsers()) + " users from the database.");
-    }
-
-    public boolean removeUser(String playerName) {
-        if (isUsingSQL ? SQLDatabaseManager.removeUserSQL(playerName) : FlatfileDatabaseManager.removeFlatFileUser(playerName)) {
-            Misc.profileCleanup(playerName);
-            return true;
-        }
-
-        return false;
-    }
-
-    private void createFlatfileDatabase() {
-        if (usersFile.exists()) {
-            return;
-        }
-
-        usersFile.getParentFile().mkdir();
-
-        try {
-            plugin.debug("Creating mcmmo.users file...");
-            new File(mcMMO.getUsersFilePath()).createNewFile();
-        }
-        catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
+import java.util.List;
+import java.util.Map;
+
+import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.database.PlayerStat;
+import com.gmail.nossr50.datatypes.player.PlayerProfile;
+
+public interface DatabaseManager {
+    public final long PURGE_TIME = 2630000000L * Config.getInstance().getOldUsersCutoff();
+
+    /**
+     * Purge users with 0 power level from the database.
+     */
+    public void purgePowerlessUsers();
+
+    /**
+     * Purge users who haven't logged on in over a certain time frame from the database.
+     */
+    public void purgeOldUsers();
+
+    /**
+     * Remove a user from the database.
+     *
+     * @param playerName The name of the user to remove
+     * @return true if the user was successfully removed, false otherwise
+     */
+    public boolean removeUser(String playerName);
+
+    /**
+     * Save a user to the database.
+     *
+     * @param profile The profile of the player to save
+     */
+    public void saveUser(PlayerProfile profile);
+
+    /**
+    * Retrieve leaderboard info.
+    *
+    * @param skillName The skill to retrieve info on
+    * @param pageNumber Which page in the leaderboards to retrieve
+    * @param statsPerPage The number of stats per page
+    * @return the requested leaderboard information
+    */
+    public List<PlayerStat> readLeaderboard(String skillName, int pageNumber, int statsPerPage);
+
+    /**
+     * Retrieve rank info.
+     *
+     * @param playerName The name of the user to retrieve the rankings for
+     * @return the requested rank information
+     */
+    public Map<String, Integer> readRank(String playerName);
+
+    /**
+     * Add a new user to the database.
+     *
+     * @param playerName The name of the player to be added to the database
+     */
+    public void newUser(String playerName);
+
+    /**
+     * Load a player from the database.
+     *
+     * @param playerName The name of the player to load from the database
+     * @return The player's data
+     */
+    public List<String> loadPlayerData(String playerName);
+
+    /**
+     * Convert player data to a different storage format.
+     *
+     * @param data The player's data
+     * @return true if the conversion was successful, false otherwise
+     * @throws Exception
+     */
+    public boolean convert(String[] data) throws Exception;
 }

+ 9 - 0
src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java

@@ -0,0 +1,9 @@
+package com.gmail.nossr50.database;
+
+import com.gmail.nossr50.config.Config;
+
+public class DatabaseManagerFactory {
+    public static DatabaseManager getDatabaseManager() {
+        return Config.getInstance().getUseMySQL() ? new SQLDatabaseManager() : new FlatfileDatabaseManager();
+    }
+}

+ 380 - 178
src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java

@@ -1,6 +1,8 @@
 package com.gmail.nossr50.database;
 
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -11,134 +13,66 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.bukkit.entity.Player;
+
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.MobHealthbarType;
 import com.gmail.nossr50.datatypes.database.PlayerStat;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.datatypes.player.PlayerProfile;
+import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
-import com.gmail.nossr50.util.StringUtils;
-
-public final class FlatfileDatabaseManager {
-    private static HashMap<SkillType, List<PlayerStat>> playerStatHash = new HashMap<SkillType, List<PlayerStat>>();
-    private static List<PlayerStat> powerLevels = new ArrayList<PlayerStat>();
-    private static long lastUpdate = 0;
+import com.gmail.nossr50.datatypes.spout.huds.HudType;
+import com.gmail.nossr50.util.Misc;
+import com.gmail.nossr50.util.player.UserManager;
 
-    private static final long UPDATE_WAIT_TIME = 600000L; // 10 minutes
-    private static final long ONE_MONTH = 2630000000L;
+public final class FlatfileDatabaseManager implements DatabaseManager {
+    private final HashMap<SkillType, List<PlayerStat>> playerStatHash = new HashMap<SkillType, List<PlayerStat>>();
+    private final List<PlayerStat> powerLevels = new ArrayList<PlayerStat>();
+    private long lastUpdate = 0;
 
-    private FlatfileDatabaseManager() {}
+    private final long UPDATE_WAIT_TIME = 600000L; // 10 minutes
+    private final File usersFile;
 
-    /**
-     * Update the leader boards.
-     */
-    public static void updateLeaderboards() {
-        // Only update FFS leaderboards every 10 minutes.. this puts a lot of strain on the server (depending on the size of the database) and should not be done frequently
-        if (System.currentTimeMillis() < lastUpdate + UPDATE_WAIT_TIME) {
-            return;
-        }
-
-        String usersFilePath = mcMMO.getUsersFilePath();
-        lastUpdate = System.currentTimeMillis(); // Log when the last update was run
-        powerLevels.clear(); // Clear old values from the power levels
+    public FlatfileDatabaseManager() {
+        usersFile = new File(mcMMO.getUsersFilePath());
+        createDatabase();
+        updateLeaderboards();
+    }
 
-        // Initialize 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>();
+    public void purgePowerlessUsers() {
+        int purgedUsers = 0;
 
-        // Read from the FlatFile database and fill our arrays with information
-        try {
-            BufferedReader in = new BufferedReader(new FileReader(usersFilePath));
-            String line = "";
-            ArrayList<String> players = new ArrayList<String>();
+        mcMMO.p.getLogger().info("Purging powerless users...");
 
-            while ((line = in.readLine()) != null) {
-                String[] data = line.split(":");
+        for (PlayerStat stat : powerLevels) {
+            if (stat.statVal == 0 && mcMMO.p.getServer().getPlayerExact(stat.name) == null && removeUser(stat.name)) {
+                purgedUsers++;
+            }
+        }
 
-                String playerName = data[0];
-                int powerLevel = 0;
+        mcMMO.p.getLogger().info("Purged " + purgedUsers + " users from the database.");
+    }
 
-                // Prevent the same player from being added multiple times (I'd like to note that this shouldn't happen...)
-                if (players.contains(playerName)) {
-                    continue;
-                }
+    public void purgeOldUsers() {
+        int removedPlayers = 0;
+        long currentTime = System.currentTimeMillis();
 
-                players.add(playerName);
+        mcMMO.p.getLogger().info("Purging old users...");
 
-                powerLevel += loadStat(mining, playerName, data, 1);
-                powerLevel += loadStat(woodcutting, playerName, data, 5);
-                powerLevel += loadStat(repair, playerName, data, 7);
-                powerLevel += loadStat(unarmed, playerName, data, 8);
-                powerLevel += loadStat(herbalism, playerName, data, 9);
-                powerLevel += loadStat(excavation, playerName, data, 10);
-                powerLevel += loadStat(archery, playerName, data, 11);
-                powerLevel += loadStat(swords, playerName, data, 12);
-                powerLevel += loadStat(axes, playerName, data, 13);
-                powerLevel += loadStat(acrobatics, playerName, data, 14);
-                powerLevel += loadStat(taming, playerName, data, 24);
-                powerLevel += loadStat(fishing, playerName, data, 34);
+        for (McMMOPlayer mcMMOPlayer : UserManager.getPlayers().values()) {
+            Player player = mcMMOPlayer.getPlayer();
 
-                powerLevels.add(new PlayerStat(playerName, powerLevel));
+            if (currentTime - player.getLastPlayed() > PURGE_TIME && removeUser(player.getName())) {
+                removedPlayers++;
             }
-            in.close();
-        }
-        catch (Exception e) {
-            mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString());
         }
 
-        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(powerLevels, 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);
+        mcMMO.p.getLogger().info("Purged " + removedPlayers + " users from the database.");
     }
 
-    /**
-     * Retrieve leaderboard info.
-     *
-     * @param skillType Skill to retrieve info on.
-     * @param pageNumber Which page in the leaderboards to retrieve
-     * @return the requested leaderboard information
-     */
-    public static List<PlayerStat> retrieveInfo(String skillType, int pageNumber, int statsPerPage) {
-        List<PlayerStat> statsList = skillType.equalsIgnoreCase("all") ? powerLevels : playerStatHash.get(SkillType.getSkill(skillType));
-        int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage;
-
-        return statsList.subList(Math.min(fromIndex, statsList.size()), Math.min(fromIndex + statsPerPage, statsList.size()));
-    }
-
-    public static boolean removeFlatFileUser(String playerName) {
+    public boolean removeUser(String playerName) {
         boolean worked = false;
 
         BufferedReader in = null;
@@ -146,22 +80,19 @@ public final class FlatfileDatabaseManager {
         String usersFilePath = mcMMO.getUsersFilePath();
 
         try {
-            FileReader file = new FileReader(usersFilePath);
-            in = new BufferedReader(file);
+            in = new BufferedReader(new FileReader(usersFilePath));
             StringBuilder writer = new StringBuilder();
             String line = "";
 
             while ((line = in.readLine()) != null) {
-
                 // Write out the same file but when we get to the player we want to remove, we skip his line.
-                if (!line.split(":")[0].equalsIgnoreCase(playerName)) {
-                    writer.append(line).append("\r\n");
-                }
-                else {
+                if (!worked && line.split(":")[0].equalsIgnoreCase(playerName)) {
                     mcMMO.p.getLogger().info("User found, removing...");
                     worked = true;
                     continue; // Skip the player
                 }
+
+                writer.append(line).append("\r\n");
             }
 
             out = new FileWriter(usersFilePath); // Write out the new file
@@ -190,63 +121,83 @@ public final class FlatfileDatabaseManager {
             }
         }
 
-        return worked;
-    }
-
-    public static int purgePowerlessFlatfile() {
-        mcMMO.p.getLogger().info("Purging powerless users...");
-
-        int purgedUsers = 0;
+        Misc.profileCleanup(playerName);
 
-        for (PlayerStat stat : powerLevels) {
-            if (stat.statVal == 0 && !mcMMO.p.getServer().getOfflinePlayer(stat.name).isOnline() && removeFlatFileUser(stat.name)) {
-                purgedUsers++;
-            }
-        }
-
-        return purgedUsers;
+        return worked;
     }
 
-    public static int removeOldFlatfileUsers() {
-        int removedPlayers = 0;
-        long currentTime = System.currentTimeMillis();
-        long purgeTime = ONE_MONTH * Config.getInstance().getOldUsersCutoff();
+    public void saveUser(PlayerProfile profile) {
+        String playerName = profile.getPlayerName();
 
         BufferedReader in = null;
         FileWriter out = null;
         String usersFilePath = mcMMO.getUsersFilePath();
 
         try {
-            FileReader file = new FileReader(usersFilePath);
-            in = new BufferedReader(file);
+            // Open the file
+            in = new BufferedReader(new FileReader(usersFilePath));
             StringBuilder writer = new StringBuilder();
-            String line = "";
+            String line;
 
+            // While not at the end of the file
             while ((line = in.readLine()) != null) {
-
-                // Write out the same file but when we get to the player we want to remove, we skip his line.
-                String[] splitLine = line.split(":");
-
-                if (splitLine.length > 37) {
-                    if (currentTime - (StringUtils.getLong(line.split(":")[37]) * 1000) <= purgeTime) {
-                        writer.append(line).append("\r\n");
-                    }
-                    else {
-                        mcMMO.p.getLogger().info("User found, removing...");
-                        removedPlayers++;
-                        continue; // Skip the player
-                    }
+                // Read the line in and copy it to the output it's not the player we want to edit
+                if (!line.split(":")[0].equalsIgnoreCase(playerName)) {
+                    writer.append(line).append("\r\n");
                 }
                 else {
-                    writer.append(line).append("\r\n");
+                    // Otherwise write the new player information
+                    writer.append(playerName).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.MINING)).append(":");
+                    writer.append(":");
+                    writer.append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.MINING)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.WOODCUTTING)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.WOODCUTTING)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.REPAIR)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.UNARMED)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.HERBALISM)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.EXCAVATION)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.ARCHERY)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.SWORDS)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.AXES)).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.ACROBATICS)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.REPAIR)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.UNARMED)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.HERBALISM)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.EXCAVATION)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.ARCHERY)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.SWORDS)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.AXES)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.ACROBATICS)).append(":");
+                    writer.append(":");
+                    writer.append(profile.getSkillLevel(SkillType.TAMING)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.TAMING)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.BERSERK)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.GIGA_DRILL_BREAKER)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.TREE_FELLER)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.GREEN_TERRA)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.SERRATED_STRIKES)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.SKULL_SPLITTER)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.SUPER_BREAKER)).append(":");
+                    HudType hudType = profile.getHudType();
+                    writer.append(hudType == null ? "STANDARD" : hudType.toString()).append(":");
+                    writer.append(profile.getSkillLevel(SkillType.FISHING)).append(":");
+                    writer.append(profile.getSkillXpLevel(SkillType.FISHING)).append(":");
+                    writer.append((int) profile.getSkillDATS(AbilityType.BLAST_MINING)).append(":");
+                    writer.append(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR).append(":");
+                    MobHealthbarType mobHealthbarType = profile.getMobHealthbarType();
+                    writer.append(mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString()).append(":");
+                    writer.append("\r\n");
                 }
             }
 
-            out = new FileWriter(usersFilePath); // Write out the new file
+            // Write the new file
+            out = new FileWriter(usersFilePath);
             out.write(writer.toString());
         }
         catch (Exception e) {
-            mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString());
+            e.printStackTrace();
         }
         finally {
             if (in != null) {
@@ -267,58 +218,309 @@ public final class FlatfileDatabaseManager {
                 }
             }
         }
+    }
+
+    public List<PlayerStat> readLeaderboard(String skillName, int pageNumber, int statsPerPage) {
+        updateLeaderboards();
+        List<PlayerStat> statsList = skillName.equalsIgnoreCase("all") ? powerLevels : playerStatHash.get(SkillType.getSkill(skillName));
+        int fromIndex = (Math.max(pageNumber, 1) - 1) * statsPerPage;
 
-        return removedPlayers;
+        return statsList.subList(Math.min(fromIndex, statsList.size()), Math.min(fromIndex + statsPerPage, statsList.size()));
     }
 
-    private static Integer getPlayerRank(String playerName, List<PlayerStat> statsList) {
-        int currentPos = 1;
+    public Map<String, Integer> readRank(String playerName) {
+        updateLeaderboards();
 
-        if (statsList == null) {
-            return null;
+        Map<String, Integer> skills = new HashMap<String, Integer>();
+
+        for (SkillType skill : SkillType.nonChildSkills()) {
+            skills.put(skill.name(), getPlayerRank(playerName, playerStatHash.get(skill)));
         }
 
-        for (PlayerStat stat : statsList) {
-            if (stat.name.equalsIgnoreCase(playerName)) {
-                return currentPos;
+        skills.put("ALL", getPlayerRank(playerName, powerLevels));
+
+        return skills;
+    }
+
+    public void newUser(String playerName) {
+        try {
+            // Open the file to write the player
+            BufferedWriter out = new BufferedWriter(new FileWriter(mcMMO.getUsersFilePath(), true));
+
+            // Add the player to the end
+            out.append(playerName).append(":");
+            out.append("0:"); // Mining
+            out.append(":");
+            out.append(":");
+            out.append("0:"); // Xp
+            out.append("0:"); // Woodcutting
+            out.append("0:"); // WoodCuttingXp
+            out.append("0:"); // Repair
+            out.append("0:"); // Unarmed
+            out.append("0:"); // Herbalism
+            out.append("0:"); // Excavation
+            out.append("0:"); // Archery
+            out.append("0:"); // Swords
+            out.append("0:"); // Axes
+            out.append("0:"); // Acrobatics
+            out.append("0:"); // RepairXp
+            out.append("0:"); // UnarmedXp
+            out.append("0:"); // HerbalismXp
+            out.append("0:"); // ExcavationXp
+            out.append("0:"); // ArcheryXp
+            out.append("0:"); // SwordsXp
+            out.append("0:"); // AxesXp
+            out.append("0:"); // AcrobaticsXp
+            out.append(":");
+            out.append("0:"); // Taming
+            out.append("0:"); // TamingXp
+            out.append("0:"); // DATS
+            out.append("0:"); // DATS
+            out.append("0:"); // DATS
+            out.append("0:"); // DATS
+            out.append("0:"); // DATS
+            out.append("0:"); // DATS
+            out.append("0:"); // DATS
+            out.append("STANDARD").append(":"); // HUD
+            out.append("0:"); // Fishing
+            out.append("0:"); // FishingXp
+            out.append("0:"); // Blast Mining
+            out.append(String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)).append(":"); // LastLogin
+            out.append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); // Mob Healthbar HUD
+
+            // Add more in the same format as the line above
+
+            out.newLine();
+            out.close();
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public List<String> loadPlayerData(String playerName) {
+        List<String> playerData = new ArrayList<String>();
+        try {
+            // Open the user file
+            FileReader file = new FileReader(mcMMO.getUsersFilePath());
+            BufferedReader in = new BufferedReader(file);
+            String line;
+
+            while ((line = in.readLine()) != null) {
+                // Find if the line contains the player we want.
+                String[] character = line.split(":");
+
+                if (!character[0].equalsIgnoreCase(playerName)) {
+                    continue;
+                }
+
+                // Skill levels
+                playerData.add(character[24]); // Taming
+                playerData.add(character[1]); // Mining
+                playerData.add(character[7]); // Repair
+                playerData.add(character[5]); // Woodcutting
+                playerData.add(character[8]); // Unarmed
+                playerData.add(character[9]); // Herbalism
+                playerData.add(character[10]); // Excavation
+                playerData.add(character[11]); // Archery
+                playerData.add(character[12]); // Swords
+                playerData.add(character[13]); // Axes
+                playerData.add(character[14]); // Acrobatics
+                playerData.add(character[34]); // Fishing
+
+                // Experience
+                playerData.add(character[25]); // Taming
+                playerData.add(character[4]); // Mining
+                playerData.add(character[15]); // Repair
+                playerData.add(character[6]); // Woodcutting
+                playerData.add(character[16]); // Unarmed
+                playerData.add(character[17]); // Herbalism
+                playerData.add(character[18]); // Excavation
+                playerData.add(character[19]); // Archery
+                playerData.add(character[20]); // Swords
+                playerData.add(character[21]); // Axes
+                playerData.add(character[22]); // Acrobatics
+                playerData.add(character[35]); // Fishing
+
+                // Cooldowns
+                playerData.add(null); // Taming
+                playerData.add(character[32]); // SuperBreaker
+                playerData.add(null); // Repair
+                playerData.add(character[28]); // Tree Feller
+                playerData.add(character[26]); // Beserk
+                playerData.add(character[29]); // Green Terra
+                playerData.add(character[27]); // Giga Drill Breaker
+                playerData.add(null); // Archery
+                playerData.add(character[30]); // Serrated Strikes
+                playerData.add(character[31]); // Skull Splitter
+                playerData.add(null); // Acrobatics
+                playerData.add(character[36]); // Blast Mining
+
+                playerData.add(character.length > 33 ? character[33] : null); // HudType
+                playerData.add(character.length > 38 ? character[38] : null); // MobHealthBar
             }
 
-            currentPos++;
+            in.close();
+        }
+        catch (Exception e) {
+            e.printStackTrace();
         }
 
-        return null;
+        return playerData;
     }
 
-    public static Map<String, Integer> getPlayerRanks(String playerName) {
-        updateLeaderboards();
+    public boolean convert(String[] character) throws Exception {
+        // Not implemented
+        return false;
+    }
 
-        Map<String, Integer> skills = new HashMap<String, Integer>();
+    public boolean checkConnected() {
+        // Not implemented
+        return false;
+    }
 
-        for (SkillType skill : SkillType.nonChildSkills()) {
-            skills.put(skill.name(), getPlayerRank(playerName, playerStatHash.get(skill)));
+    /**
+* Update the leader boards.
+*/
+    private void updateLeaderboards() {
+        // Only update FFS leaderboards every 10 minutes.. this puts a lot of strain on the server (depending on the size of the database) and should not be done frequently
+        if (System.currentTimeMillis() < lastUpdate + UPDATE_WAIT_TIME) {
+            return;
         }
 
-        skills.put("ALL", getPlayerRank(playerName, powerLevels));
+        String usersFilePath = mcMMO.getUsersFilePath();
+        lastUpdate = System.currentTimeMillis(); // Log when the last update was run
+        powerLevels.clear(); // Clear old values from the power levels
 
-        return skills;
+        // Initialize 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>();
+
+        // Read from the FlatFile database and fill our arrays with information
+        try {
+            BufferedReader in = new BufferedReader(new FileReader(usersFilePath));
+            String line = "";
+            ArrayList<String> players = new ArrayList<String>();
+
+            while ((line = in.readLine()) != null) {
+                String[] data = line.split(":");
+                String playerName = data[0];
+                int powerLevel = 0;
+
+                // Prevent the same player from being added multiple times (I'd like to note that this shouldn't happen...)
+                if (players.contains(playerName)) {
+                    continue;
+                }
+
+                players.add(playerName);
+
+                powerLevel += loadStat(mining, playerName, data, 1);
+                powerLevel += loadStat(woodcutting, playerName, data, 5);
+                powerLevel += loadStat(repair, playerName, data, 7);
+                powerLevel += loadStat(unarmed, playerName, data, 8);
+                powerLevel += loadStat(herbalism, playerName, data, 9);
+                powerLevel += loadStat(excavation, playerName, data, 10);
+                powerLevel += loadStat(archery, playerName, data, 11);
+                powerLevel += loadStat(swords, playerName, data, 12);
+                powerLevel += loadStat(axes, playerName, data, 13);
+                powerLevel += loadStat(acrobatics, playerName, data, 14);
+                powerLevel += loadStat(taming, playerName, data, 24);
+                powerLevel += loadStat(fishing, playerName, data, 34);
+
+                powerLevels.add(new PlayerStat(playerName, powerLevel));
+            }
+            in.close();
+        }
+        catch (Exception e) {
+            mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString());
+        }
+
+        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(powerLevels, 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);
     }
 
-    public static List<PlayerStat> getPlayerStats(String skillName) {
-        return (skillName.equalsIgnoreCase("all")) ? powerLevels : playerStatHash.get(SkillType.getSkill(skillName));
+    private void createDatabase() {
+        if (usersFile.exists()) {
+            return;
+        }
+
+        usersFile.getParentFile().mkdir();
+
+        try {
+            mcMMO.p.debug("Creating mcmmo.users file...");
+            new File(mcMMO.getUsersFilePath()).createNewFile();
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
     }
 
-    private static int loadStat(List<PlayerStat> statList, String playerName, String[] data, int dataIndex) {
-        if (data.length > dataIndex) {
-            int statValue = Integer.parseInt(data[dataIndex]);
+    private Integer getPlayerRank(String playerName, List<PlayerStat> statsList) {
+        if (statsList == null) {
+            return null;
+        }
+
+        int currentPos = 1;
+
+        for (PlayerStat stat : statsList) {
+            if (stat.name.equalsIgnoreCase(playerName)) {
+                return currentPos;
+            }
+
+            currentPos++;
+        }
 
-            statList.add(new PlayerStat(playerName, statValue));
-            return statValue;
+        return null;
+    }
+
+    private int loadStat(List<PlayerStat> statList, String playerName, String[] data, int dataIndex) {
+        if (data.length <= dataIndex) {
+            return 0;
         }
 
-        return 0;
+        int statValue = Integer.parseInt(data[dataIndex]);
+        statList.add(new PlayerStat(playerName, statValue));
+
+        return statValue;
     }
 
-    private static class SkillComparator implements Comparator<PlayerStat> {
+    private class SkillComparator implements Comparator<PlayerStat> {
         @Override
         public int compare(PlayerStat o1, PlayerStat o2) {
             return (o2.statVal - o1.statVal);

Разница между файлами не показана из-за своего большого размера
+ 495 - 361
src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java


+ 50 - 398
src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java

@@ -1,11 +1,7 @@
 package com.gmail.nossr50.datatypes.player;
 
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -14,18 +10,15 @@ import org.bukkit.scoreboard.Scoreboard;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.spout.SpoutConfig;
-import com.gmail.nossr50.database.SQLDatabaseManager;
 import com.gmail.nossr50.datatypes.MobHealthbarType;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.datatypes.spout.huds.HudType;
 import com.gmail.nossr50.datatypes.spout.huds.McMMOHud;
 import com.gmail.nossr50.skills.child.FamilyTree;
-import com.gmail.nossr50.util.Misc;
 
 public class PlayerProfile {
     private final String playerName;
-    private int userId;
     private boolean loaded;
 
     /* HUDs */
@@ -36,7 +29,7 @@ public class PlayerProfile {
 
     /* Skill Data */
     private final Map<SkillType, Integer>   skills     = new HashMap<SkillType, Integer>();   // Skill & Level
-    private final Map<SkillType, Float>     skillsXp   = new HashMap<SkillType, Float>();   // Skill & XP
+    private final Map<SkillType, Float>     skillsXp   = new HashMap<SkillType, Float>();     // Skill & XP
     private final Map<AbilityType, Integer> skillsDATS = new HashMap<AbilityType, Integer>(); // Ability & Cooldown
 
     public PlayerProfile(String playerName, boolean addNew) {
@@ -55,18 +48,13 @@ public class PlayerProfile {
         }
 
         if (!loadPlayer() && addNew) {
-            addPlayer();
+            mcMMO.getDatabaseManager().newUser(playerName);
             loaded = true;
         }
     }
 
     public void save() {
-        if (Config.getInstance().getUseMySQL()) {
-            saveMySQL();
-        }
-        else {
-            saveFlatfile();
-        }
+        mcMMO.getDatabaseManager().saveUser(this);
     }
 
     public String getPlayerName() {
@@ -138,7 +126,7 @@ public class PlayerProfile {
     /**
      * Set the current DATS of a skill.
      *
-     * @param abilityType Ability to set the DATS for
+     *  @param abilityType Ability to set the DATS for
      * @param DATS the DATS of the ability
      */
     public void setSkillDATS(AbilityType abilityType, long DATS) {
@@ -268,123 +256,60 @@ public class PlayerProfile {
     }
 
     private boolean loadPlayer() {
-        return Config.getInstance().getUseMySQL() ? loadMySQL() : loadFlatfile();
-    }
-
-    private void addPlayer() {
-        if (Config.getInstance().getUseMySQL()) {
-            addMySQLPlayer();
-        }
-        else {
-            addFlatfilePlayer();
-        }
-    }
-
-    private boolean loadMySQL() {
-        String tablePrefix = Config.getInstance().getMySQLTablePrefix();
-
-        ArrayList<String> playerData = SQLDatabaseManager.read(
-                "SELECT " +
-                "u.id, " +
-                "s.taming, s.mining, s.repair, s.woodcutting, s.unarmed, s.herbalism, s.excavation, s.archery, s.swords, s.axes, s.acrobatics, s.fishing, " +
-                "e.taming, e.mining, e.repair, e.woodcutting, e.unarmed, e.herbalism, e.excavation, e.archery, e.swords, e.axes, e.acrobatics, e.fishing, " +
-                "c.taming, c.mining, c.repair, c.woodcutting, c.unarmed, c.herbalism, c.excavation, c.archery, c.swords, c.axes, c.acrobatics, c.blast_mining, " +
-                "h.hudtype, h.mobhealthbar " +
-                "FROM " + tablePrefix + "users u " +
-                "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) " +
-                "JOIN " + tablePrefix + "experience e ON (u.id = e.user_id) " +
-                "JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " +
-                "JOIN " + tablePrefix + "huds h ON (u.id = h.user_id) " +
-                "WHERE u.user = '" + playerName + "'"
-                ).get(1);
-
-        if (playerData == null || playerData.size() == 0) {
-            userId = SQLDatabaseManager.getInt("SELECT id FROM " + tablePrefix + "users WHERE user = '" + playerName + "'");
-
-            // Check if user doesn't exist
-            if (userId == 0) {
-                return false;
-            }
-
-            // Write missing table rows
-            SQLDatabaseManager.write("INSERT IGNORE INTO " + tablePrefix + "skills (user_id) VALUES (" + userId + ")");
-            SQLDatabaseManager.write("INSERT IGNORE INTO " + tablePrefix + "experience (user_id) VALUES (" + userId + ")");
-            SQLDatabaseManager.write("INSERT IGNORE INTO " + tablePrefix + "cooldowns (user_id) VALUES (" + userId + ")");
-            SQLDatabaseManager.write("INSERT IGNORE INTO " + tablePrefix + "huds (user_id, mobhealthbar) VALUES (" + userId + ",'" + mobHealthbarType.name() + "')");
-
-            // Re-read data
-            playerData = SQLDatabaseManager.read(
-                    "SELECT " +
-                    "u.id, " +
-                    "s.taming, s.mining, s.repair, s.woodcutting, s.unarmed, s.herbalism, s.excavation, s.archery, s.swords, s.axes, s.acrobatics, s.fishing, " +
-                    "e.taming, e.mining, e.repair, e.woodcutting, e.unarmed, e.herbalism, e.excavation, e.archery, e.swords, e.axes, e.acrobatics, e.fishing, " +
-                    "c.taming, c.mining, c.repair, c.woodcutting, c.unarmed, c.herbalism, c.excavation, c.archery, c.swords, c.axes, c.acrobatics, c.blast_mining, " +
-                    "h.hudtype, h.mobhealthbar " +
-                    "FROM " + tablePrefix + "users u " +
-                    "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) " +
-                    "JOIN " + tablePrefix + "experience e ON (u.id = e.user_id) " +
-                    "JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " +
-                    "JOIN " + tablePrefix + "huds h ON (u.id = h.user_id) " +
-                    "WHERE u.user = '" + playerName + "'"
-                    ).get(1);
-
-            // Should never happen but just in case
-            if (playerData == null || playerData.size() == 0) {
-                return false;
-            }
+        List<String> playerData = mcMMO.getDatabaseManager().loadPlayerData(playerName);
+        
+        if (playerData == null || playerData.isEmpty()) {
+            return false;
         }
 
-        userId = Integer.valueOf(playerData.get(0));
-
-        skills.put(SkillType.TAMING, Integer.valueOf(playerData.get(1)));
-        skills.put(SkillType.MINING, Integer.valueOf(playerData.get(2)));
-        skills.put(SkillType.REPAIR, Integer.valueOf(playerData.get(3)));
-        skills.put(SkillType.WOODCUTTING, Integer.valueOf(playerData.get(4)));
-        skills.put(SkillType.UNARMED, Integer.valueOf(playerData.get(5)));
-        skills.put(SkillType.HERBALISM, Integer.valueOf(playerData.get(6)));
-        skills.put(SkillType.EXCAVATION, Integer.valueOf(playerData.get(7)));
-        skills.put(SkillType.ARCHERY, Integer.valueOf(playerData.get(8)));
-        skills.put(SkillType.SWORDS, Integer.valueOf(playerData.get(9)));
-        skills.put(SkillType.AXES, Integer.valueOf(playerData.get(10)));
-        skills.put(SkillType.ACROBATICS, Integer.valueOf(playerData.get(11)));
-        skills.put(SkillType.FISHING, Integer.valueOf(playerData.get(12)));
-
-        skillsXp.put(SkillType.TAMING, (float) Integer.valueOf(playerData.get(13)));
-        skillsXp.put(SkillType.MINING, (float) Integer.valueOf(playerData.get(14)));
-        skillsXp.put(SkillType.REPAIR, (float) Integer.valueOf(playerData.get(15)));
-        skillsXp.put(SkillType.WOODCUTTING, (float) Integer.valueOf(playerData.get(16)));
-        skillsXp.put(SkillType.UNARMED, (float) Integer.valueOf(playerData.get(17)));
-        skillsXp.put(SkillType.HERBALISM, (float) Integer.valueOf(playerData.get(18)));
-        skillsXp.put(SkillType.EXCAVATION, (float) Integer.valueOf(playerData.get(19)));
-        skillsXp.put(SkillType.ARCHERY, (float) Integer.valueOf(playerData.get(20)));
-        skillsXp.put(SkillType.SWORDS, (float) Integer.valueOf(playerData.get(21)));
-        skillsXp.put(SkillType.AXES, (float) Integer.valueOf(playerData.get(22)));
-        skillsXp.put(SkillType.ACROBATICS, (float) Integer.valueOf(playerData.get(23)));
-        skillsXp.put(SkillType.FISHING, (float) Integer.valueOf(playerData.get(24)));
-
-        // Taming 25 - Unused
-        skillsDATS.put(AbilityType.SUPER_BREAKER, Integer.valueOf(playerData.get(26)));
-        // Repair 27 - Unused
-        skillsDATS.put(AbilityType.TREE_FELLER, Integer.valueOf(playerData.get(28)));
-        skillsDATS.put(AbilityType.BERSERK, Integer.valueOf(playerData.get(29)));
-        skillsDATS.put(AbilityType.GREEN_TERRA, Integer.valueOf(playerData.get(30)));
-        skillsDATS.put(AbilityType.GIGA_DRILL_BREAKER, Integer.valueOf(playerData.get(31)));
-        // Archery 32 - Unused
-        skillsDATS.put(AbilityType.SERRATED_STRIKES, Integer.valueOf(playerData.get(33)));
-        skillsDATS.put(AbilityType.SKULL_SPLITTER, Integer.valueOf(playerData.get(34)));
-        // Acrobatics 35 - Unused
-        skillsDATS.put(AbilityType.BLAST_MINING, Integer.valueOf(playerData.get(36)));
+        skills.put(SkillType.TAMING, Integer.valueOf(playerData.get(0)));
+        skills.put(SkillType.MINING, Integer.valueOf(playerData.get(1)));
+        skills.put(SkillType.REPAIR, Integer.valueOf(playerData.get(2)));
+        skills.put(SkillType.WOODCUTTING, Integer.valueOf(playerData.get(3)));
+        skills.put(SkillType.UNARMED, Integer.valueOf(playerData.get(4)));
+        skills.put(SkillType.HERBALISM, Integer.valueOf(playerData.get(5)));
+        skills.put(SkillType.EXCAVATION, Integer.valueOf(playerData.get(6)));
+        skills.put(SkillType.ARCHERY, Integer.valueOf(playerData.get(7)));
+        skills.put(SkillType.SWORDS, Integer.valueOf(playerData.get(8)));
+        skills.put(SkillType.AXES, Integer.valueOf(playerData.get(9)));
+        skills.put(SkillType.ACROBATICS, Integer.valueOf(playerData.get(10)));
+        skills.put(SkillType.FISHING, Integer.valueOf(playerData.get(11)));
+
+        skillsXp.put(SkillType.TAMING, (float) Integer.valueOf(playerData.get(12)));
+        skillsXp.put(SkillType.MINING, (float) Integer.valueOf(playerData.get(13)));
+        skillsXp.put(SkillType.REPAIR, (float) Integer.valueOf(playerData.get(14)));
+        skillsXp.put(SkillType.WOODCUTTING, (float) Integer.valueOf(playerData.get(15)));
+        skillsXp.put(SkillType.UNARMED, (float) Integer.valueOf(playerData.get(16)));
+        skillsXp.put(SkillType.HERBALISM, (float) Integer.valueOf(playerData.get(17)));
+        skillsXp.put(SkillType.EXCAVATION, (float) Integer.valueOf(playerData.get(18)));
+        skillsXp.put(SkillType.ARCHERY, (float) Integer.valueOf(playerData.get(19)));
+        skillsXp.put(SkillType.SWORDS, (float) Integer.valueOf(playerData.get(20)));
+        skillsXp.put(SkillType.AXES, (float) Integer.valueOf(playerData.get(21)));
+        skillsXp.put(SkillType.ACROBATICS, (float) Integer.valueOf(playerData.get(22)));
+        skillsXp.put(SkillType.FISHING, (float) Integer.valueOf(playerData.get(23)));
+
+        // Taming 24 - Unused
+        skillsDATS.put(AbilityType.SUPER_BREAKER, Integer.valueOf(playerData.get(25)));
+        // Repair 26 - Unused
+        skillsDATS.put(AbilityType.TREE_FELLER, Integer.valueOf(playerData.get(27)));
+        skillsDATS.put(AbilityType.BERSERK, Integer.valueOf(playerData.get(28)));
+        skillsDATS.put(AbilityType.GREEN_TERRA, Integer.valueOf(playerData.get(29)));
+        skillsDATS.put(AbilityType.GIGA_DRILL_BREAKER, Integer.valueOf(playerData.get(30)));
+        // Archery 31 - Unused
+        skillsDATS.put(AbilityType.SERRATED_STRIKES, Integer.valueOf(playerData.get(32)));
+        skillsDATS.put(AbilityType.SKULL_SPLITTER, Integer.valueOf(playerData.get(33)));
+        // Acrobatics 34 - Unused
+        skillsDATS.put(AbilityType.BLAST_MINING, Integer.valueOf(playerData.get(35)));
 
         try {
-            hudType = HudType.valueOf(playerData.get(37));
+            hudType = HudType.valueOf(playerData.get(36));
         }
         catch (Exception e) {
-            // Shouldn't happen unless database is being tampered with
-            hudType = HudType.STANDARD;
+            hudType = HudType.STANDARD; // Shouldn't happen unless database is being tampered with
         }
 
         try {
-            mobHealthbarType = MobHealthbarType.valueOf(playerData.get(38));
+            mobHealthbarType = MobHealthbarType.valueOf(playerData.get(37));
         }
         catch (Exception e) {
             mobHealthbarType = Config.getInstance().getMobHealthbarDefault();
@@ -393,277 +318,4 @@ public class PlayerProfile {
         loaded = true;
         return true;
     }
-
-    private void addMySQLPlayer() {
-        String tablePrefix = Config.getInstance().getMySQLTablePrefix();
-
-        SQLDatabaseManager.write("INSERT INTO " + tablePrefix + "users (user, lastlogin) VALUES ('" + playerName + "'," + System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR + ")");
-        userId = SQLDatabaseManager.getInt("SELECT id FROM " + tablePrefix + "users WHERE user = '" + playerName + "'");
-
-        SQLDatabaseManager.write("INSERT INTO " + tablePrefix + "huds (user_id, mobhealthbar) VALUES (" + userId + ", '" + mobHealthbarType.name() + "')");
-        SQLDatabaseManager.write("INSERT INTO " + tablePrefix + "cooldowns (user_id) VALUES (" + userId + ")");
-        SQLDatabaseManager.write("INSERT INTO " + tablePrefix + "skills (user_id) VALUES (" + userId + ")");
-        SQLDatabaseManager.write("INSERT INTO " + tablePrefix + "experience (user_id) VALUES (" + userId + ")");
-    }
-
-
-    private void addFlatfilePlayer() {
-        try {
-            // Open the file to write the player
-            BufferedWriter out = new BufferedWriter(new FileWriter(mcMMO.getUsersFilePath(), true));
-
-            // Add the player to the end
-            out.append(playerName).append(":");
-            out.append("0:"); // Mining
-            out.append(":");
-            out.append(":");
-            out.append("0:"); // Xp
-            out.append("0:"); // Woodcutting
-            out.append("0:"); // WoodCuttingXp
-            out.append("0:"); // Repair
-            out.append("0:"); // Unarmed
-            out.append("0:"); // Herbalism
-            out.append("0:"); // Excavation
-            out.append("0:"); // Archery
-            out.append("0:"); // Swords
-            out.append("0:"); // Axes
-            out.append("0:"); // Acrobatics
-            out.append("0:"); // RepairXp
-            out.append("0:"); // UnarmedXp
-            out.append("0:"); // HerbalismXp
-            out.append("0:"); // ExcavationXp
-            out.append("0:"); // ArcheryXp
-            out.append("0:"); // SwordsXp
-            out.append("0:"); // AxesXp
-            out.append("0:"); // AcrobaticsXp
-            out.append(":");
-            out.append("0:"); // Taming
-            out.append("0:"); // TamingXp
-            out.append("0:"); // DATS
-            out.append("0:"); // DATS
-            out.append("0:"); // DATS
-            out.append("0:"); // DATS
-            out.append("0:"); // DATS
-            out.append("0:"); // DATS
-            out.append("0:"); // DATS
-            out.append(hudType == null ? "STANDARD" : hudType.toString()).append(":"); // HUD
-            out.append("0:"); // Fishing
-            out.append("0:"); // FishingXp
-            out.append("0:"); // Blast Mining
-            out.append(String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)).append(":"); // LastLogin
-            out.append(mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString()).append(":"); // Mob Healthbar HUD
-
-            // Add more in the same format as the line above
-
-            out.newLine();
-            out.close();
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private boolean loadFlatfile() {
-        try {
-            // Open the user file
-            FileReader file = new FileReader(mcMMO.getUsersFilePath());
-            BufferedReader in = new BufferedReader(file);
-            String line;
-
-            while ((line = in.readLine()) != null) {
-                // Find if the line contains the player we want.
-                String[] character = line.split(":");
-
-                if (!character[0].equalsIgnoreCase(playerName)) {
-                    continue;
-                }
-
-                loadSkillData(SkillType.MINING, character, 1);
-                loadSkillData(SkillType.WOODCUTTING, character, 5);
-                loadSkillData(SkillType.REPAIR, character, 7);
-                loadSkillData(SkillType.UNARMED, character, 8);
-                loadSkillData(SkillType.HERBALISM, character, 9);
-                loadSkillData(SkillType.EXCAVATION, character, 10);
-                loadSkillData(SkillType.ARCHERY, character, 11);
-                loadSkillData(SkillType.SWORDS, character, 12);
-                loadSkillData(SkillType.AXES, character, 13);
-                loadSkillData(SkillType.ACROBATICS, character, 14);
-                loadSkillData(SkillType.TAMING, character, 24);
-                loadSkillData(SkillType.FISHING, character, 34);
-
-                loadSkillXpData(SkillType.MINING, character, 4);
-                loadSkillXpData(SkillType.WOODCUTTING, character, 6);
-                loadSkillXpData(SkillType.REPAIR, character, 15);
-                loadSkillXpData(SkillType.UNARMED, character, 16);
-                loadSkillXpData(SkillType.HERBALISM, character, 17);
-                loadSkillXpData(SkillType.EXCAVATION, character, 18);
-                loadSkillXpData(SkillType.ARCHERY, character, 19);
-                loadSkillXpData(SkillType.SWORDS, character, 20);
-                loadSkillXpData(SkillType.AXES, character, 21);
-                loadSkillXpData(SkillType.ACROBATICS, character, 22);
-                loadSkillXpData(SkillType.TAMING, character, 25);
-                loadSkillXpData(SkillType.FISHING, character, 35);
-
-                loadDATSData(AbilityType.BERSERK, character, 26);
-                loadDATSData(AbilityType.GIGA_DRILL_BREAKER, character, 27);
-                loadDATSData(AbilityType.TREE_FELLER, character, 28);
-                loadDATSData(AbilityType.GREEN_TERRA, character, 29);
-                loadDATSData(AbilityType.SERRATED_STRIKES, character, 30);
-                loadDATSData(AbilityType.SKULL_SPLITTER, character, 31);
-                loadDATSData(AbilityType.SUPER_BREAKER, character, 32);
-                loadDATSData(AbilityType.BLAST_MINING, character, 36);
-
-                hudType = character.length > 33 ? HudType.valueOf(character[33]) : null;
-                mobHealthbarType = character.length > 38 ? MobHealthbarType.valueOf(character[38]) : null;
-
-                loaded = true;
-            }
-
-            in.close();
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return loaded;
-    }
-
-    private void saveMySQL() {
-        if (Config.getInstance().getUseMySQL()) {
-            String tablePrefix = Config.getInstance().getMySQLTablePrefix();
-
-            SQLDatabaseManager.write("UPDATE " + tablePrefix + "users SET lastlogin = " + ((int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)) + " WHERE id = " + userId);
-            SQLDatabaseManager.write("UPDATE " + tablePrefix + "huds SET "
-                    + "  hudtype = '" + (hudType == null ? "STANDARD" : hudType.toString() + "'")
-                    + ", mobhealthbar = '" + (mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString() + "'")
-                    + "  WHERE user_id = " + userId);
-            SQLDatabaseManager.write("UPDATE " + tablePrefix + "cooldowns SET "
-                    + "  mining = " + skillsDATS.get(AbilityType.SUPER_BREAKER)
-                    + ", woodcutting = " + skillsDATS.get(AbilityType.TREE_FELLER)
-                    + ", unarmed = " + skillsDATS.get(AbilityType.BERSERK)
-                    + ", herbalism = " + skillsDATS.get(AbilityType.GREEN_TERRA)
-                    + ", excavation = " + skillsDATS.get(AbilityType.GIGA_DRILL_BREAKER)
-                    + ", swords = " + skillsDATS.get(AbilityType.SERRATED_STRIKES)
-                    + ", axes = " + skillsDATS.get(AbilityType.SKULL_SPLITTER)
-                    + ", blast_mining = " + skillsDATS.get(AbilityType.BLAST_MINING)
-                    + "  WHERE user_id = " + userId);
-            SQLDatabaseManager.write("UPDATE " + tablePrefix + "skills SET "
-                    + "  taming = " + skills.get(SkillType.TAMING)
-                    + ", mining = " + skills.get(SkillType.MINING)
-                    + ", repair = " + skills.get(SkillType.REPAIR)
-                    + ", woodcutting = " + skills.get(SkillType.WOODCUTTING)
-                    + ", unarmed = " + skills.get(SkillType.UNARMED)
-                    + ", herbalism = " + skills.get(SkillType.HERBALISM)
-                    + ", excavation = " + skills.get(SkillType.EXCAVATION)
-                    + ", archery = " + skills.get(SkillType.ARCHERY)
-                    + ", swords = " + skills.get(SkillType.SWORDS)
-                    + ", axes = " + skills.get(SkillType.AXES)
-                    + ", acrobatics = " + skills.get(SkillType.ACROBATICS)
-                    + ", fishing = " + skills.get(SkillType.FISHING)
-                    + "  WHERE user_id = " + userId);
-            SQLDatabaseManager.write("UPDATE " + tablePrefix + "experience SET "
-                    + "  taming = " + getSkillXpLevel(SkillType.TAMING)
-                    + ", mining = " + getSkillXpLevel(SkillType.MINING)
-                    + ", repair = " + getSkillXpLevel(SkillType.REPAIR)
-                    + ", woodcutting = " + getSkillXpLevel(SkillType.WOODCUTTING)
-                    + ", unarmed = " + getSkillXpLevel(SkillType.UNARMED)
-                    + ", herbalism = " + getSkillXpLevel(SkillType.HERBALISM)
-                    + ", excavation = " + getSkillXpLevel(SkillType.EXCAVATION)
-                    + ", archery = " + getSkillXpLevel(SkillType.ARCHERY)
-                    + ", swords = " + getSkillXpLevel(SkillType.SWORDS)
-                    + ", axes = " + getSkillXpLevel(SkillType.AXES)
-                    + ", acrobatics = " + getSkillXpLevel(SkillType.ACROBATICS)
-                    + ", fishing = " + getSkillXpLevel(SkillType.FISHING)
-                    + "  WHERE user_id = " + userId);
-        }
-    }
-
-    private void saveFlatfile() {
-        try {
-            // Open the file
-            BufferedReader in = new BufferedReader(new FileReader(mcMMO.getUsersFilePath()));
-            StringBuilder writer = new StringBuilder();
-            String line;
-
-            // While not at the end of the file
-            while ((line = in.readLine()) != null) {
-                // Read the line in and copy it to the output it's not the player we want to edit
-                if (!line.split(":")[0].equalsIgnoreCase(playerName)) {
-                    writer.append(line).append("\r\n");
-                }
-                else {
-                    // Otherwise write the new player information
-                    writer.append(playerName).append(":");
-                    writer.append(skills.get(SkillType.MINING)).append(":");
-                    writer.append(":");
-                    writer.append(":");
-                    writer.append(getSkillXpLevel(SkillType.MINING)).append(":");
-                    writer.append(skills.get(SkillType.WOODCUTTING)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.WOODCUTTING)).append(":");
-                    writer.append(skills.get(SkillType.REPAIR)).append(":");
-                    writer.append(skills.get(SkillType.UNARMED)).append(":");
-                    writer.append(skills.get(SkillType.HERBALISM)).append(":");
-                    writer.append(skills.get(SkillType.EXCAVATION)).append(":");
-                    writer.append(skills.get(SkillType.ARCHERY)).append(":");
-                    writer.append(skills.get(SkillType.SWORDS)).append(":");
-                    writer.append(skills.get(SkillType.AXES)).append(":");
-                    writer.append(skills.get(SkillType.ACROBATICS)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.REPAIR)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.UNARMED)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.HERBALISM)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.EXCAVATION)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.ARCHERY)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.SWORDS)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.AXES)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.ACROBATICS)).append(":");
-                    writer.append(":");
-                    writer.append(skills.get(SkillType.TAMING)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.TAMING)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.BERSERK)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.GIGA_DRILL_BREAKER)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.TREE_FELLER)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.GREEN_TERRA)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.SERRATED_STRIKES)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.SKULL_SPLITTER)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.SUPER_BREAKER)).append(":");
-                    writer.append(hudType == null ? "STANDARD" : hudType.toString()).append(":");
-                    writer.append(skills.get(SkillType.FISHING)).append(":");
-                    writer.append(getSkillXpLevel(SkillType.FISHING)).append(":");
-                    writer.append(skillsDATS.get(AbilityType.BLAST_MINING)).append(":");
-                    writer.append(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR).append(":");
-                    writer.append(mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString()).append(":");
-                    writer.append("\r\n");
-                }
-            }
-
-            in.close();
-
-            // Write the new file
-            FileWriter out = new FileWriter(mcMMO.getUsersFilePath());
-            out.write(writer.toString());
-            out.flush();
-            out.close();
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private void loadSkillXpData(SkillType skill, String[] data, int dataIndex) {
-        if (data.length > dataIndex) {
-            skillsXp.put(skill, (float) Integer.valueOf(data[dataIndex]));
-        }
-    }
-
-    private void loadSkillData(SkillType skill, String[] data, int dataIndex) {
-        if (data.length > dataIndex) {
-            skills.put(skill, Integer.valueOf(data[dataIndex]));
-        }
-    }
-
-    private void loadDATSData(AbilityType ability, String[] data, int dataIndex) {
-        if (data.length > dataIndex) {
-            skillsDATS.put(ability, Integer.valueOf(data[dataIndex]));
-        }
-    }
 }

+ 0 - 2
src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

@@ -21,8 +21,6 @@ import org.bukkit.event.player.PlayerDropItemEvent;
 import org.bukkit.event.player.PlayerFishEvent;
 import org.bukkit.event.player.PlayerInteractEvent;
 import org.bukkit.event.player.PlayerJoinEvent;
-import org.bukkit.event.player.PlayerLoginEvent;
-import org.bukkit.event.player.PlayerLoginEvent.Result;
 import org.bukkit.event.player.PlayerPickupItemEvent;
 import org.bukkit.event.player.PlayerQuitEvent;
 import org.bukkit.event.player.PlayerRespawnEvent;

+ 9 - 3
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -23,6 +23,7 @@ import com.gmail.nossr50.config.mods.CustomToolConfig;
 import com.gmail.nossr50.config.spout.SpoutConfig;
 import com.gmail.nossr50.config.treasure.TreasureConfig;
 import com.gmail.nossr50.database.DatabaseManager;
+import com.gmail.nossr50.database.DatabaseManagerFactory;
 import com.gmail.nossr50.listeners.BlockListener;
 import com.gmail.nossr50.listeners.EntityListener;
 import com.gmail.nossr50.listeners.InventoryListener;
@@ -109,7 +110,7 @@ public class mcMMO extends JavaPlugin {
 
             combatTagEnabled = getServer().getPluginManager().getPlugin("CombatTag") != null;
 
-            databaseManager = new DatabaseManager(this, Config.getInstance().getUseMySQL());
+            databaseManager = DatabaseManagerFactory.getDatabaseManager();
 
             registerEvents();
             registerCustomRecipes();
@@ -227,12 +228,17 @@ public class mcMMO extends JavaPlugin {
         return placeStore;
     }
 
+    public static RepairableManager getRepairableManager() {
+        return repairableManager;
+    }
+
     public static DatabaseManager getDatabaseManager() {
         return databaseManager;
     }
 
-    public static RepairableManager getRepairableManager() {
-        return repairableManager;
+    @Deprecated
+    public static void setDatabaseManager(DatabaseManager databaseManager) {
+        mcMMO.databaseManager = databaseManager;
     }
 
     public static boolean isSpoutEnabled() {

+ 2 - 4
src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandAsyncTask.java

@@ -6,9 +6,6 @@ import org.bukkit.command.CommandSender;
 import org.bukkit.scheduler.BukkitRunnable;
 
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.database.FlatfileDatabaseManager;
-import com.gmail.nossr50.database.SQLDatabaseManager;
 
 public class McrankCommandAsyncTask extends BukkitRunnable {
     private final String playerName;
@@ -21,8 +18,9 @@ public class McrankCommandAsyncTask extends BukkitRunnable {
 
     @Override
     public void run() {
-        Map<String, Integer> skills = Config.getInstance().getUseMySQL() ? SQLDatabaseManager.readSQLRank(playerName) : FlatfileDatabaseManager.getPlayerRanks(playerName);
+        Map<String, Integer> skills = mcMMO.getDatabaseManager().readRank(playerName);
 
         new McrankCommandDisplayTask(skills, sender, playerName).runTaskLater(mcMMO.p, 1);
     }
 }
+

+ 7 - 10
src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandAsyncTask.java

@@ -1,31 +1,28 @@
 package com.gmail.nossr50.runnables.commands;
 
-import java.util.ArrayList;
-import java.util.Collection;
+import java.util.List;
 
 import org.bukkit.command.CommandSender;
 import org.bukkit.scheduler.BukkitRunnable;
 
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.database.SQLDatabaseManager;
+import com.gmail.nossr50.datatypes.database.PlayerStat;
 
 public class MctopCommandAsyncTask extends BukkitRunnable {
     private CommandSender sender;
-    private String query;
+    private String skill;
     private int page;
 
-    public MctopCommandAsyncTask(int page, String query, CommandSender sender) {
+    public MctopCommandAsyncTask(int page, String skill, CommandSender sender) {
         this.page = page;
-        this.query = query.equalsIgnoreCase("ALL") ? "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing" : query;
+        this.skill = skill;
         this.sender = sender;
     }
 
     @Override
     public void run() {
-        String tablePrefix = Config.getInstance().getMySQLTablePrefix();
-        final Collection<ArrayList<String>> userStats = SQLDatabaseManager.read("SELECT " + query + ", user, NOW() FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON (user_id = id) WHERE " + query + " > 0 ORDER BY " + query + " DESC, user LIMIT " + ((page * 10) - 10) + ",10").values();
+        final List<PlayerStat> userStats = mcMMO.getDatabaseManager().readLeaderboard(skill, page, 10);
 
-        new MctopCommandDisplayTask(userStats, page, tablePrefix, sender).runTaskLater(mcMMO.p, 1);
+        new MctopCommandDisplayTask(userStats, page, skill, sender).runTaskLater(mcMMO.p, 1);
     }
 }

+ 10 - 10
src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java

@@ -1,44 +1,44 @@
 package com.gmail.nossr50.runnables.commands;
 
-import java.util.ArrayList;
-import java.util.Collection;
+import java.util.List;
 
 import org.bukkit.ChatColor;
 import org.bukkit.command.CommandSender;
 import org.bukkit.scheduler.BukkitRunnable;
 
+import com.gmail.nossr50.datatypes.database.PlayerStat;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.StringUtils;
 
 public class MctopCommandDisplayTask extends BukkitRunnable {
-    private Collection<ArrayList<String>> userStats;
+    private List<PlayerStat> userStats;
     private CommandSender sender;
-    private String query;
+    private String skill;
     private int page;
 
-    public MctopCommandDisplayTask(Collection<ArrayList<String>> userStats, int page, String query, CommandSender sender) {
+    public MctopCommandDisplayTask(List<PlayerStat> userStats, int page, String skill, CommandSender sender) {
         this.userStats = userStats;
         this.page = page;
-        this.query = query;
+        this.skill = skill;
         this.sender = sender;
     }
 
     @Override
     public void run() {
-        if (query.equalsIgnoreCase("taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing")) {
+        if (skill.equalsIgnoreCase("all")) {
             sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Leaderboard"));
         }
         else {
-            sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", StringUtils.getCapitalized(query)));
+            sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", StringUtils.getCapitalized(skill)));
         }
 
         int place = (page * 10) - 9;
 
-        for (ArrayList<String> stat : userStats) {
+        for (PlayerStat stat : userStats) {
             String digit = (place < 10) ? "0" : "" + String.valueOf(place);
 
             // Format: 1. Playername - skill value
-            sender.sendMessage(digit + ". " + ChatColor.GREEN + stat.get(1) + " - " + ChatColor.WHITE + stat.get(0));
+            sender.sendMessage(digit + ". " + ChatColor.GREEN + stat.name + " - " + ChatColor.WHITE + stat.statVal);
             place++;
         }
 

+ 6 - 248
src/main/java/com/gmail/nossr50/runnables/database/SQLConversionTask.java

@@ -6,270 +6,28 @@ import java.io.FileReader;
 import org.bukkit.scheduler.BukkitRunnable;
 
 import com.gmail.nossr50.mcMMO;
-import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.database.SQLDatabaseManager;
-import com.gmail.nossr50.util.Misc;
-import com.gmail.nossr50.util.StringUtils;
 
 public class SQLConversionTask extends BukkitRunnable {
-    private String tablePrefix = Config.getInstance().getMySQLTablePrefix();
 
     @Override
     public void run() {
         String location = mcMMO.getUsersFilePath();
 
         try {
-            FileReader file = new FileReader(location);
-            BufferedReader in = new BufferedReader(file);
+            BufferedReader in = new BufferedReader(new FileReader(location));
             String line = "";
-            String playerName = null;
-            String mining = null;
-            String woodcutting = null;
-            String repair = null;
-            String unarmed = null;
-            String herbalism = null;
-            String excavation = null;
-            String archery = null;
-            String swords = null;
-            String axes = null;
-            String acrobatics = null;
-            String taming = null;
-            String fishing = null;
-            String miningXP = null;
-            String woodCuttingXP = null;
-            String repairXP = null;
-            String unarmedXP = null;
-            String herbalismXP = null;
-            String excavationXP = null;
-            String archeryXP = null;
-            String swordsXP = null;
-            String axesXP = null;
-            String acrobaticsXP = null;
-            String tamingXP = null;
-            String fishingXP = null;
-            int id = 0;
-            int theCount = 0;
+            int converted = 0;
 
             while ((line = in.readLine()) != null) {
 
                 // Find if the line contains the player we want.
-                String[] character = line.split(":");
-                playerName = character[0];
-
-                // Check for things we don't want put in the DB
-                if (playerName == null || playerName.equalsIgnoreCase("null") || playerName.equalsIgnoreCase("#Storage place for user information")) {
-                    continue;
-                }
-
-                if (character.length > 1) {
-                    mining = character[1];
-                }
-
-                if (character.length > 4) {
-                    miningXP = character[4];
-                }
-
-                if (character.length > 5) {
-                    woodcutting = character[5];
-                }
-
-                if (character.length > 6) {
-                    woodCuttingXP = character[6];
-                }
-
-                if (character.length > 7) {
-                    repair = character[7];
-                }
-
-                if (character.length > 8) {
-                    unarmed = character[8];
-                }
-
-                if (character.length > 9) {
-                    herbalism = character[9];
-                }
-
-                if (character.length > 10) {
-                    excavation = character[10];
-                }
-
-                if (character.length > 11) {
-                    archery = character[11];
-                }
-
-                if (character.length > 12) {
-                    swords = character[12];
-                }
-
-                if (character.length > 13) {
-                    axes = character[13];
-                }
-
-                if (character.length > 14) {
-                    acrobatics = character[14];
-                }
-
-                if (character.length > 15) {
-                    repairXP = character[15];
-                }
-
-                if (character.length > 16) {
-                    unarmedXP = character[16];
-                }
-
-                if (character.length > 17) {
-                    herbalismXP = character[17];
-                }
-
-                if (character.length > 18) {
-                    excavationXP = character[18];
-                }
-
-                if (character.length > 19) {
-                    archeryXP = character[19];
-                }
-
-                if (character.length > 20) {
-                    swordsXP = character[20];
-                }
-
-                if (character.length > 21) {
-                    axesXP = character[21];
-                }
-
-                if (character.length > 22) {
-                    acrobaticsXP = character[22];
-                }
-
-                if (character.length > 24) {
-                    taming = character[24];
-                }
-
-                if (character.length > 25) {
-                    tamingXP = character[25];
-                }
-
-                if (character.length > 34) {
-                    fishing = character[34];
-                }
-
-                if (character.length > 35) {
-                    fishingXP = character[35];
-                }
-
-                // Check to see if the user is in the DB
-                id = SQLDatabaseManager.getInt("SELECT id FROM "
-                        + tablePrefix
-                        + "users WHERE user = '" + playerName + "'");
-
-                if (id > 0) {
-                    theCount++;
-
-                    // Update the skill values
-                    SQLDatabaseManager.write("UPDATE "
-                            + tablePrefix
-                            + "users SET lastlogin = " + 0
-                            + " WHERE id = " + id);
-                    SQLDatabaseManager.write("UPDATE "
-                            + tablePrefix
-                            + "skills SET "
-                            + "  taming = taming+" + StringUtils.getInt(taming)
-                            + ", mining = mining+" + StringUtils.getInt(mining)
-                            + ", repair = repair+" + StringUtils.getInt(repair)
-                            + ", woodcutting = woodcutting+" + StringUtils.getInt(woodcutting)
-                            + ", unarmed = unarmed+" + StringUtils.getInt(unarmed)
-                            + ", herbalism = herbalism+" + StringUtils.getInt(herbalism)
-                            + ", excavation = excavation+" + StringUtils.getInt(excavation)
-                            + ", archery = archery+" + StringUtils.getInt(archery)
-                            + ", swords = swords+" + StringUtils.getInt(swords)
-                            + ", axes = axes+" + StringUtils.getInt(axes)
-                            + ", acrobatics = acrobatics+" + StringUtils.getInt(acrobatics)
-                            + ", fishing = fishing+" + StringUtils.getInt(fishing)
-                            + " WHERE user_id = " + id);
-                    SQLDatabaseManager.write("UPDATE "
-                            + tablePrefix
-                            + "experience SET "
-                            + "  taming = " + StringUtils.getInt(tamingXP)
-                            + ", mining = " + StringUtils.getInt(miningXP)
-                            + ", repair = " + StringUtils.getInt(repairXP)
-                            + ", woodcutting = " + StringUtils.getInt(woodCuttingXP)
-                            + ", unarmed = " + StringUtils.getInt(unarmedXP)
-                            + ", herbalism = " + StringUtils.getInt(herbalismXP)
-                            + ", excavation = " + StringUtils.getInt(excavationXP)
-                            + ", archery = " + StringUtils.getInt(archeryXP)
-                            + ", swords = " + StringUtils.getInt(swordsXP)
-                            + ", axes = " + StringUtils.getInt(axesXP)
-                            + ", acrobatics = " + StringUtils.getInt(acrobaticsXP)
-                            + ", fishing = " + StringUtils.getInt(fishingXP)
-                            + " WHERE user_id = " + id);
-                }
-                else {
-                    theCount++;
-
-                    // Create the user in the DB
-                    SQLDatabaseManager.write("INSERT INTO "
-                            + tablePrefix
-                            + "users (user, lastlogin) VALUES ('"
-                            + playerName + "',"
-                            + System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR + ")");
-                    id = SQLDatabaseManager.getInt("SELECT id FROM "
-                            + tablePrefix
-                            + "users WHERE user = '"
-                            + playerName + "'");
-                    SQLDatabaseManager.write("INSERT INTO "
-                            + tablePrefix
-                            + "skills (user_id) VALUES (" + id + ")");
-                    SQLDatabaseManager.write("INSERT INTO "
-                            + tablePrefix
-                            + "experience (user_id) VALUES (" + id
-                            + ")");
-                    // Update the skill values
-                    SQLDatabaseManager.write("UPDATE "
-                            + tablePrefix
-                            + "users SET lastlogin = " + 0
-                            + " WHERE id = " + id);
-                    /*
-                    Database.write("UPDATE "
-                            + tablePrefix
-                            + "users SET party = '" + party
-                            + "' WHERE id = " + id);
-                    */
-                    SQLDatabaseManager.write("UPDATE "
-                            + tablePrefix
-                            + "skills SET "
-                            + "  taming = taming+" + StringUtils.getInt(taming)
-                            + ", mining = mining+" + StringUtils.getInt(mining)
-                            + ", repair = repair+" + StringUtils.getInt(repair)
-                            + ", woodcutting = woodcutting+" + StringUtils.getInt(woodcutting)
-                            + ", unarmed = unarmed+" + StringUtils.getInt(unarmed)
-                            + ", herbalism = herbalism+" + StringUtils.getInt(herbalism)
-                            + ", excavation = excavation+" + StringUtils.getInt(excavation)
-                            + ", archery = archery+" + StringUtils.getInt(archery)
-                            + ", swords = swords+" + StringUtils.getInt(swords)
-                            + ", axes = axes+" + StringUtils.getInt(axes)
-                            + ", acrobatics = acrobatics+" + StringUtils.getInt(acrobatics)
-                            + ", fishing = fishing+" + StringUtils.getInt(fishing)
-                            + " WHERE user_id = " + id);
-                    SQLDatabaseManager.write("UPDATE "
-                            + tablePrefix
-                            + "experience SET "
-                            + "  taming = " + StringUtils.getInt(tamingXP)
-                            + ", mining = " + StringUtils.getInt(miningXP)
-                            + ", repair = " + StringUtils.getInt(repairXP)
-                            + ", woodcutting = " + StringUtils.getInt(woodCuttingXP)
-                            + ", unarmed = " + StringUtils.getInt(unarmedXP)
-                            + ", herbalism = " + StringUtils.getInt(herbalismXP)
-                            + ", excavation = " + StringUtils.getInt(excavationXP)
-                            + ", archery = " + StringUtils.getInt(archeryXP)
-                            + ", swords = " + StringUtils.getInt(swordsXP)
-                            + ", axes = " + StringUtils.getInt(axesXP)
-                            + ", acrobatics = " + StringUtils.getInt(acrobaticsXP)
-                            + ", fishing = " + StringUtils.getInt(fishingXP)
-                            + " WHERE user_id = " + id);
+                String[] playerData = line.split(":");
+                if (mcMMO.getDatabaseManager().convert(playerData)) {
+                    converted++;
                 }
             }
 
-            mcMMO.p.getLogger().info("[mcMMO] MySQL Updated from users file, " + theCount + " items added/updated to MySQL DB");
+            mcMMO.p.getLogger().info("MySQL Updated from users file, " + converted + " items added/updated to MySQL DB");
             in.close();
         }
         catch (Exception e) {

+ 1 - 1
src/main/java/com/gmail/nossr50/runnables/database/SQLReconnectTask.java

@@ -10,7 +10,7 @@ import com.gmail.nossr50.util.player.UserManager;
 public class SQLReconnectTask extends BukkitRunnable {
     @Override
     public void run() {
-        if (SQLDatabaseManager.checkConnected()) {
+        if (((SQLDatabaseManager) mcMMO.getDatabaseManager()).checkConnected()) {
             UserManager.saveAll();  // Save all profiles
             UserManager.clearAll(); // Clear the profiles
 

+ 8 - 29
src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java

@@ -1,7 +1,6 @@
 package com.gmail.nossr50.util.scoreboards;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -15,8 +14,6 @@ import org.bukkit.scoreboard.Scoreboard;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
-import com.gmail.nossr50.database.FlatfileDatabaseManager;
-import com.gmail.nossr50.database.SQLDatabaseManager;
 import com.gmail.nossr50.datatypes.database.PlayerStat;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
@@ -199,7 +196,7 @@ public class ScoreboardManager {
         Server server = mcMMO.p.getServer();
         Integer rank;
 
-        Map<String, Integer> skills = Config.getInstance().getUseMySQL() ? SQLDatabaseManager.readSQLRank(playerName) : FlatfileDatabaseManager.getPlayerRanks(playerName);
+        Map<String, Integer> skills = mcMMO.getDatabaseManager().readRank(playerName);
 
         for (SkillType skill : SkillType.nonChildSkills()) {
             if (!Permissions.skillEnabled(player, skill)) {
@@ -226,7 +223,7 @@ public class ScoreboardManager {
         Server server = mcMMO.p.getServer();
         Integer rank;
 
-        Map<String, Integer> skills = Config.getInstance().getUseMySQL() ? SQLDatabaseManager.readSQLRank(targetName) : FlatfileDatabaseManager.getPlayerRanks(targetName);
+        Map<String, Integer> skills = mcMMO.getDatabaseManager().readRank(targetName);
 
         for (SkillType skill : SkillType.nonChildSkills()) {
             rank = skills.get(skill.name());
@@ -289,33 +286,15 @@ public class ScoreboardManager {
         String endPosition = String.valueOf(position + 14);
         Server server = mcMMO.p.getServer();
 
-        if (Config.getInstance().getUseMySQL()) {
-            String tablePrefix = Config.getInstance().getMySQLTablePrefix();
-            String query = (skillName.equalsIgnoreCase("all") ? "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing" : skillName);
-            final Collection<ArrayList<String>> userStats = SQLDatabaseManager.read("SELECT " + query + ", user, NOW() FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON (user_id = id) WHERE " + query + " > 0 ORDER BY " + query + " DESC, user LIMIT " + ((pageNumber * 15) - 15) + ",15").values();
+        for (PlayerStat stat : mcMMO.getDatabaseManager().readLeaderboard(skillName, pageNumber, 15)) {
+            String playerName = stat.name;
+            playerName = (playerName.equals(player.getName()) ? ChatColor.GOLD : "") + playerName;
 
-            for (ArrayList<String> stat : userStats) {
-                String playerName = stat.get(1);
-                playerName = (playerName.equals(player.getName()) ? ChatColor.GOLD : "") + playerName;
-
-                if (playerName.length() > 16) {
-                    playerName = playerName.substring(0, 16);
-                }
-
-                objective.getScore(server.getOfflinePlayer(playerName)).setScore(Integer.valueOf(stat.get(0)));
+            if (playerName.length() > 16) {
+                playerName = playerName.substring(0, 16);
             }
-        }
-        else {
-            for (PlayerStat stat : FlatfileDatabaseManager.retrieveInfo(skillName, pageNumber, 15)) {
-                String playerName = stat.name;
-                playerName = (playerName.equals(player.getName()) ? ChatColor.GOLD : "") + playerName;
-
-                if (playerName.length() > 16) {
-                    playerName = playerName.substring(0, 16);
-                }
 
-                objective.getScore(server.getOfflinePlayer(playerName)).setScore(stat.statVal);
-            }
+            objective.getScore(server.getOfflinePlayer(playerName)).setScore(stat.statVal);
         }
 
         objective.setDisplayName(objective.getDisplayName() + " (" + startPosition + " - " + endPosition + ")");

Некоторые файлы не были показаны из-за большого количества измененных файлов