From 21fcc83f56e18d40e88ac802052b4332df3c9edd Mon Sep 17 00:00:00 2001 From: ile123ile Date: Mon, 25 Aug 2014 17:39:00 -0700 Subject: [PATCH] Made flatfile expandable --- .../database/FlatfileDatabaseManager.java | 740 +++++++++--------- .../nossr50/datatypes/skills/AbilityType.java | 4 + 2 files changed, 392 insertions(+), 352 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index 460ca4847..04480618b 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -9,7 +9,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.EnumMap; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -138,11 +137,12 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - String name = character[0]; + String name = character[getNameIndexFromLine(character)].split(",")[1]; long lastPlayed = 0; boolean rewrite = false; + int lastPlayedIndex = getTimeIndexFromLine(character); try { - lastPlayed = Long.parseLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; + lastPlayed = Long.parseLong(character[lastPlayedIndex].split(",")[1]) * Misc.TIME_CONVERSION_FACTOR; } catch (NumberFormatException e) { } @@ -158,7 +158,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { else { if (rewrite) { // Rewrite their data with a valid time - character[37] = Long.toString(lastPlayed); + character[lastPlayedIndex] = "LastLogin," + Long.toString(lastPlayed); String newLine = org.apache.commons.lang.StringUtils.join(character, ":"); writer.append(newLine).append("\r\n"); } @@ -213,7 +213,8 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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 (!worked && line.split(":")[0].equalsIgnoreCase(playerName)) { + String[] character = line.split(":"); + if (!worked && character[getNameIndexFromLine(character)].split(",")[1].equalsIgnoreCase(playerName)) { mcMMO.p.getLogger().info("User found, removing..."); worked = true; continue; // Skip the player @@ -272,54 +273,24 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { // Read the line in and copy it to the output if it's not the player we want to edit String[] character = line.split(":"); - if (!character[41].equalsIgnoreCase(uuid.toString()) && !character[0].equalsIgnoreCase(playerName)) { + + if (!isPlayer(character, uuid.toString(), playerName)) { writer.append(line).append("\r\n"); } else { // 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.getAbilityDATS(AbilityType.berserk)).append(":"); - writer.append((int) profile.getAbilityDATS(AbilityType.gigaDrillBreaker)).append(":"); - writer.append((int) profile.getAbilityDATS(AbilityType.treeFeller)).append(":"); - writer.append((int) profile.getAbilityDATS(AbilityType.greenTerra)).append(":"); - writer.append((int) profile.getAbilityDATS(AbilityType.serratedStrikes)).append(":"); - writer.append((int) profile.getAbilityDATS(AbilityType.skullSplitter)).append(":"); - writer.append((int) profile.getAbilityDATS(AbilityType.superBreaker)).append(":"); - writer.append(":"); - writer.append(profile.getSkillLevel(SkillType.fishing)).append(":"); - writer.append(profile.getSkillXpLevel(SkillType.fishing)).append(":"); - writer.append((int) profile.getAbilityDATS(AbilityType.blastMining)).append(":"); - writer.append(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR).append(":"); + writer.append("Player,").append(playerName).append(":"); + for(SkillType skill : SkillType.getNonChildSkills()) { + writer.append(skill.getName()).append("LVL,").append(profile.getSkillLevel(skill)).append(":"); + writer.append(skill.getName()).append("XP,").append(profile.getSkillXpLevel(skill)).append(":"); + } + for(AbilityType ability : AbilityType.getAbilities()) { + writer.append(ability.getUnprettyName()).append(",").append((int) profile.getAbilityDATS(ability)).append(":"); + } + writer.append("LastLogin,").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(profile.getSkillLevel(SkillType.alchemy)).append(":"); - writer.append(profile.getSkillXpLevel(SkillType.alchemy)).append(":"); - writer.append(uuid.toString()).append(":"); + writer.append("MobHealthBar,").append(mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString()).append(":"); + writer.append("UUID,").append(uuid != null ? uuid.toString() : "NULL").append(":"); writer.append("\r\n"); } } @@ -384,50 +355,17 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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(":"); - 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 - out.append("0:"); // Alchemy - out.append("0:"); // AlchemyXp - out.append(uuid != null ? uuid.toString() : "NULL").append(":"); // UUID - - // Add more in the same format as the line above + out.append("Player,").append(playerName).append(":"); + for(String skill : SkillType.getSkillNames()) { + out.append(skill).append("LVL,0:"); //Skill Levels + out.append(skill).append("XP,0:"); //Skill XP + } + for(AbilityType ability : AbilityType.getAbilities()) { + out.append(ability.getUnprettyName()).append(",0:"); //DATS + } + out.append("LastLogin,").append(String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)).append(":"); // LastLogin + out.append("MobHealthBar,").append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); // Mob Healthbar HUD + out.append("UUID,").append(uuid != null ? uuid.toString() : "NULL").append(":"); // UUID out.newLine(); } @@ -469,15 +407,26 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { // Find if the line contains the player we want. String[] character = line.split(":"); - - if ((uuid != null && (!character[41].equalsIgnoreCase(uuid.toString()) && !character[41].equalsIgnoreCase("NULL"))) || (uuid == null && !character[0].equalsIgnoreCase(playerName))) { - continue; + int uuidIndex = getUUIDIndexFromLine(character); + int nameIndex = getNameIndexFromLine(character); + if (uuidIndex == -1 && nameIndex == -1) { + continue; + } + else if(uuidIndex != -1) { + if ((uuid != null && (!character[uuidIndex].split(",")[1].equalsIgnoreCase(uuid.toString()) && !character[uuidIndex].split(",")[1].equalsIgnoreCase("NULL")))) { + continue; + } + } + else if(nameIndex != -1) { + if (uuid == null && !character[nameIndex].split(",")[1].equalsIgnoreCase(playerName)) { + continue; + } } // Update playerName in database after name change - if (!character[0].equalsIgnoreCase(playerName)) { - mcMMO.p.debug("Name change detected: " + character[0] + " => " + playerName); - character[0] = playerName; + if (!character[nameIndex].split(",")[1].equalsIgnoreCase(playerName)) { + mcMMO.p.debug("Name change detected: " + character[nameIndex].split(",")[1] + " => " + playerName); + character[nameIndex] = "Player," + playerName; } return loadFromLine(character); @@ -518,6 +467,61 @@ public final class FlatfileDatabaseManager implements DatabaseManager { return new PlayerProfile(playerName, uuid); } + + /*private static String[] addNameToUser(String playerName, String uuid) { + String[] characterToRet = null; + + BufferedReader in = null; + FileWriter out = null; + String usersFilePath = mcMMO.getUsersFilePath(); + + synchronized (fileWritingLock) { + try { + in = new BufferedReader(new FileReader(usersFilePath)); + StringBuilder writer = new StringBuilder(); + String line; + + while ((line = in.readLine()) != null) { + String[] character = line.split(":"); + int uuidIndex = getUUIDIndexFromLine(character); + if(uuidIndex != -1) { + if (characterToRet == null && character[uuidIndex].equalsIgnoreCase(uuid)) { + line = line + "Player," + playerName + ":"; + characterToRet = line.split(":"); + } + } + + writer.append(line).append("\r\n"); + } + + out = new FileWriter(usersFilePath); // Write out the new file + out.write(writer.toString()); + } + catch (Exception e) { + mcMMO.p.getLogger().severe("Exception while reading " + usersFilePath + " (Are you sure you formatted it correctly?)" + e.toString()); + } + finally { + if (in != null) { + try { + in.close(); + } + catch (IOException e) { + // Ignore + } + } + if (out != null) { + try { + out.close(); + } + catch (IOException e) { + // Ignore + } + } + } + } + + return characterToRet; + }*/ public void convertUsers(DatabaseManager destination) { BufferedReader in = null; @@ -575,14 +579,15 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - if (!worked && character[0].equalsIgnoreCase(userName)) { - if (character.length < 42) { + if (!worked && character[getNameIndexFromLine(character)].split(",")[1].equalsIgnoreCase(userName)) { + int uuidIndex = getUUIDIndexFromLine(character); + if (uuidIndex == -1) { mcMMO.p.getLogger().severe("Could not update UUID for " + userName + "!"); mcMMO.p.getLogger().severe("Database entry is invalid."); break; } - line = line.replace(character[41], uuid.toString()); + line = line.replace(character[uuidIndex], "UUID," + uuid.toString()); worked = true; } @@ -631,14 +636,16 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while (((line = in.readLine()) != null) && !fetchedUUIDs.isEmpty()) { String[] character = line.split(":"); - if (fetchedUUIDs.containsKey(character[0])) { - if (character.length < 42) { - mcMMO.p.getLogger().severe("Could not update UUID for " + character[0] + "!"); + int nameIndex = getNameIndexFromLine(character); + if (fetchedUUIDs.containsKey(character[nameIndex].split(",")[1])) { + int uuidIndex = getUUIDIndexFromLine(character); + if (uuidIndex == -1) { + mcMMO.p.getLogger().severe("Could not update UUID for " + character[nameIndex].split(",")[1] + "!"); mcMMO.p.getLogger().severe("Database entry is invalid."); continue; } - character[41] = fetchedUUIDs.remove(character[0]).toString(); + character[uuidIndex] = "UUID," + fetchedUUIDs.remove(character[nameIndex].split(",")[1]).toString(); line = new StringBuilder(org.apache.commons.lang.StringUtils.join(character, ":")).append(":").toString(); } @@ -687,7 +694,10 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] character = line.split(":"); - users.add(character[0]); + int nameIndexFromLine = getNameIndexFromLine(character); + if(nameIndexFromLine != -1) { + users.add(character[nameIndexFromLine].split(",")[1]); + } } } catch (Exception e) { @@ -721,19 +731,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { powerLevels.clear(); // Clear old values from the power levels // Initialize lists - List mining = new ArrayList(); - List woodcutting = new ArrayList(); - List herbalism = new ArrayList(); - List excavation = new ArrayList(); - List acrobatics = new ArrayList(); - List repair = new ArrayList(); - List swords = new ArrayList(); - List axes = new ArrayList(); - List archery = new ArrayList(); - List unarmed = new ArrayList(); - List taming = new ArrayList(); - List fishing = new ArrayList(); - List alchemy = new ArrayList(); + Map> stats = new HashMap>(); BufferedReader in = null; String playerName = null; @@ -745,24 +743,18 @@ public final class FlatfileDatabaseManager implements DatabaseManager { while ((line = in.readLine()) != null) { String[] data = line.split(":"); - playerName = data[0]; + int nameIndex = getNameIndexFromLine(data); + playerName = data[nameIndex].split(",")[1]; int powerLevel = 0; Map skills = getSkillMapFromLine(data); - powerLevel += putStat(acrobatics, playerName, skills.get(SkillType.acrobatics)); - powerLevel += putStat(alchemy, playerName, skills.get(SkillType.alchemy)); - powerLevel += putStat(archery, playerName, skills.get(SkillType.archery)); - powerLevel += putStat(axes, playerName, skills.get(SkillType.axes)); - powerLevel += putStat(excavation, playerName, skills.get(SkillType.excavation)); - powerLevel += putStat(fishing, playerName, skills.get(SkillType.fishing)); - powerLevel += putStat(herbalism, playerName, skills.get(SkillType.herbalism)); - powerLevel += putStat(mining, playerName, skills.get(SkillType.mining)); - powerLevel += putStat(repair, playerName, skills.get(SkillType.repair)); - powerLevel += putStat(swords, playerName, skills.get(SkillType.swords)); - powerLevel += putStat(taming, playerName, skills.get(SkillType.taming)); - powerLevel += putStat(unarmed, playerName, skills.get(SkillType.unarmed)); - powerLevel += putStat(woodcutting, playerName, skills.get(SkillType.woodcutting)); + List stat; + for(SkillType skill : SkillType.getNonChildSkills()) { + stat = new ArrayList(); + powerLevel += putStat(stat, playerName, skills.containsKey(skill) ? skills.get(skill) : 0); + stats.put(skill, stat); + } putStat(powerLevels, playerName, powerLevel); } @@ -784,34 +776,11 @@ public final class FlatfileDatabaseManager implements DatabaseManager { 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(alchemy, c); + for(Map.Entry> pair : stats.entrySet()) { + Collections.sort(pair.getValue(), c); + playerStatHash.put(pair.getKey(), pair.getValue()); + } 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); - playerStatHash.put(SkillType.alchemy, alchemy); } /** @@ -822,7 +791,6 @@ public final class FlatfileDatabaseManager implements DatabaseManager { BufferedReader in = null; FileWriter out = null; String usersFilePath = mcMMO.getUsersFilePath(); - synchronized (fileWritingLock) { try { in = new BufferedReader(new FileReader(usersFilePath)); @@ -842,159 +810,167 @@ public final class FlatfileDatabaseManager implements DatabaseManager { line = line.concat(":"); } String[] character = line.split(":"); + int testIndex = getNameIndexFromLine(character); + + if(testIndex == -1) { + // Prevent the same username from being present multiple times + if (!usernames.add(character[0])) { + continue; + } + + // Prevent the same player from being present multiple times + if (character.length == 42 && (!character[41].isEmpty() && !players.add(character[41]))) { + continue; + } + + if (character.length < 33) { + // Before Version 1.0 - Drop + mcMMO.p.getLogger().warning("Dropping malformed or before version 1.0 line from database - " + line); + continue; + } + + String oldVersion = null; + + if (character.length <= 33) { + // Introduction of HUDType + // Version 1.1.06 + // commit 78f79213cdd7190cd11ae54526f3b4ea42078e8a + line = line.concat(" :"); + character = line.split(":"); + oldVersion = "1.1.06"; + } + + if (!character[33].isEmpty()) { + // Removal of Spout Support + // Version 1.4.07-dev2 + // commit 7bac0e2ca5143bce84dc160617fed97f0b1cb968 + line = line.replace(character[33], ""); + if (oldVersion == null) { + oldVersion = "1.4.07"; + } + } - // Prevent the same username from being present multiple times - if (!usernames.add(character[0])) { - continue; + + StringBuilder newLine = new StringBuilder(line); + String[] newCharacter; + boolean corrupted = false; + + // If they're valid, rewrite them to the file. + if (character.length != 42) { + + if (character.length <= 35) { + // Introduction of Fishing + // Version 1.2.00 + // commit a814b57311bc7734661109f0e77fc8bab3a0bd29 + newLine.append(0).append(":"); + newLine.append(0).append(":"); + if (oldVersion == null) { + oldVersion = "1.2.00"; + } + } + if (character.length <= 36) { + // Introduction of Blast Mining cooldowns + // Version 1.3.00-dev + // commit fadbaf429d6b4764b8f1ad0efaa524a090e82ef5 + newLine.append(0).append(":"); + if (oldVersion == null) { + oldVersion = "1.3.00"; + } + } + if (character.length <= 37) { + // Making old-purge work with flatfile + // Version 1.4.00-dev + // commmit 3f6c07ba6aaf44e388cc3b882cac3d8f51d0ac28 + // XXX Cannot create an OfflinePlayer at startup, use 0 and fix in purge + newLine.append("0").append(":"); + if (oldVersion == null) { + oldVersion = "1.4.00"; + } + } + if (character.length <= 38) { + // Addition of mob healthbars + // Version 1.4.06 + // commit da29185b7dc7e0d992754bba555576d48fa08aa6 + newLine.append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); + if (oldVersion == null) { + oldVersion = "1.4.06"; + } + } + if (character.length <= 39) { + // Addition of Alchemy + // Version 1.4.08 + newLine.append("0").append(":"); + newLine.append("0").append(":"); + if (oldVersion == null) { + oldVersion = "1.4.08"; + } + } + if (character.length <= 41) { + // Addition of UUIDs + // Version 1.5.01 + // Add a value because otherwise it gets removed + newLine.append("NULL:"); + if (oldVersion == null) { + oldVersion = "1.5.01"; + } + } + + + // Remove any blanks that shouldn't be there, and validate the other fields + newCharacter = newLine.toString().split(":"); + for (int i = 0; i < newCharacter.length; i++) { + if (newCharacter[i].isEmpty() && !(i == 2 || i == 3 || i == 23 || i == 33 || i == 41)) { + corrupted = true; + + if (newCharacter.length != 42) { + newCharacter = (String[]) ArrayUtils.remove(newCharacter, i); + } + else { + if (i == 37) { + newCharacter[i] = String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR); + } + else if (i == 38) { + newCharacter[i] = Config.getInstance().getMobHealthbarDefault().toString(); + } + else { + newCharacter[i] = "0"; + } + } + } + + if (StringUtils.isInt(newCharacter[i]) && i == 38) { + corrupted = true; + newCharacter[i] = Config.getInstance().getMobHealthbarDefault().toString(); + } + + if (!StringUtils.isInt(newCharacter[i]) && !(i == 0 || i == 2 || i == 3 || i == 23 || i == 33 || i == 38 || i == 41)) { + corrupted = true; + newCharacter[i] = "0"; + } + } + + if (corrupted) { + mcMMO.p.debug("Updating corrupted database line for player " + newCharacter[0]); + } + + if (oldVersion != null) { + mcMMO.p.debug("Updating database line from before version " + oldVersion + " for player " + character[0]); + } + } + else { + newCharacter = newLine.toString().split(":"); + } + + // Adding index names to make it expandable (ile123ile) + newLine = new StringBuilder(addIndexNames(newCharacter)); + writer.append(newLine); } - - // Prevent the same player from being present multiple times - if (character.length == 42 && (!character[41].isEmpty() && !players.add(character[41]))) { - continue; + else { + writer.append(line); } - - if (character.length < 33) { - // Before Version 1.0 - Drop - mcMMO.p.getLogger().warning("Dropping malformed or before version 1.0 line from database - " + line); - continue; - } - - String oldVersion = null; - - if (character.length <= 33) { - // Introduction of HUDType - // Version 1.1.06 - // commit 78f79213cdd7190cd11ae54526f3b4ea42078e8a - line = line.concat(" :"); - character = line.split(":"); - oldVersion = "1.1.06"; - } - - if (!character[33].isEmpty()) { - // Removal of Spout Support - // Version 1.4.07-dev2 - // commit 7bac0e2ca5143bce84dc160617fed97f0b1cb968 - line = line.replace(character[33], ""); - if (oldVersion == null) { - oldVersion = "1.4.07"; - } - } - - // If they're valid, rewrite them to the file. - if (character.length == 42) { - writer.append(line).append("\r\n"); - continue; - } - - StringBuilder newLine = new StringBuilder(line); - - if (character.length <= 35) { - // Introduction of Fishing - // Version 1.2.00 - // commit a814b57311bc7734661109f0e77fc8bab3a0bd29 - newLine.append(0).append(":"); - newLine.append(0).append(":"); - if (oldVersion == null) { - oldVersion = "1.2.00"; - } - } - if (character.length <= 36) { - // Introduction of Blast Mining cooldowns - // Version 1.3.00-dev - // commit fadbaf429d6b4764b8f1ad0efaa524a090e82ef5 - newLine.append(0).append(":"); - if (oldVersion == null) { - oldVersion = "1.3.00"; - } - } - if (character.length <= 37) { - // Making old-purge work with flatfile - // Version 1.4.00-dev - // commmit 3f6c07ba6aaf44e388cc3b882cac3d8f51d0ac28 - // XXX Cannot create an OfflinePlayer at startup, use 0 and fix in purge - newLine.append("0").append(":"); - if (oldVersion == null) { - oldVersion = "1.4.00"; - } - } - if (character.length <= 38) { - // Addition of mob healthbars - // Version 1.4.06 - // commit da29185b7dc7e0d992754bba555576d48fa08aa6 - newLine.append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); - if (oldVersion == null) { - oldVersion = "1.4.06"; - } - } - if (character.length <= 39) { - // Addition of Alchemy - // Version 1.4.08 - newLine.append("0").append(":"); - newLine.append("0").append(":"); - if (oldVersion == null) { - oldVersion = "1.4.08"; - } - } - if (character.length <= 41) { - // Addition of UUIDs - // Version 1.5.01 - // Add a value because otherwise it gets removed - newLine.append("NULL:"); - if (oldVersion == null) { - oldVersion = "1.5.01"; - } - } - - // Remove any blanks that shouldn't be there, and validate the other fields - String[] newCharacter = newLine.toString().split(":"); - boolean corrupted = false; - - for (int i = 0; i < newCharacter.length; i++) { - if (newCharacter[i].isEmpty() && !(i == 2 || i == 3 || i == 23 || i == 33 || i == 41)) { - corrupted = true; - - if (newCharacter.length != 42) { - newCharacter = (String[]) ArrayUtils.remove(newCharacter, i); - } - else { - if (i == 37) { - newCharacter[i] = String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR); - } - else if (i == 38) { - newCharacter[i] = Config.getInstance().getMobHealthbarDefault().toString(); - } - else { - newCharacter[i] = "0"; - } - } - } - - if (StringUtils.isInt(newCharacter[i]) && i == 38) { - corrupted = true; - newCharacter[i] = Config.getInstance().getMobHealthbarDefault().toString(); - } - - if (!StringUtils.isInt(newCharacter[i]) && !(i == 0 || i == 2 || i == 3 || i == 23 || i == 33 || i == 38 || i == 41)) { - corrupted = true; - newCharacter[i] = "0"; - } - } - - if (corrupted) { - mcMMO.p.debug("Updating corrupted database line for player " + newCharacter[0]); - } - - if (oldVersion != null) { - mcMMO.p.debug("Updating database line from before version " + oldVersion + " for player " + character[0]); - } - - if (corrupted || oldVersion != null) { - newLine = new StringBuilder(org.apache.commons.lang.StringUtils.join(newCharacter, ":")); - newLine = newLine.append(":"); - } - - writer.append(newLine).append("\r\n"); + writer.append("\r\n"); } + // Write the new file out = new FileWriter(usersFilePath); @@ -1030,6 +1006,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SQL_PARTY_NAMES); mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SPOUT); mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_ALCHEMY); + mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_INDEX_NAMES); return; } @@ -1043,7 +1020,49 @@ public final class FlatfileDatabaseManager implements DatabaseManager { e.printStackTrace(); } } - + + private static String addIndexNames(String[] character) { + String toRet = ""; + toRet += "Player," + character[0] + ":"; + toRet += "MININGLVL," + character[1] + ":"; + toRet += "MININGXP," + character[4] + ":"; + toRet += "WOODCUTTINGLVL," + character[5] + ":"; + toRet += "WOODCUTTINGXP," + character[6] + ":"; + toRet += "REPAIRLVL," + character[7] + ":"; + toRet += "UNARMEDLVL," + character[8] + ":"; + toRet += "HERBALISMLVL," + character[9] + ":"; + toRet += "EXCAVATIONLVL," + character[10] + ":"; + toRet += "ARCHERYLVL," + character[11] + ":"; + toRet += "SWORDSLVL," + character[12] + ":"; + toRet += "AXESLVL," + character[13] + ":"; + toRet += "ACROBATICSLVL," + character[14] + ":"; + toRet += "REPAIRXP," + character[15] + ":"; + toRet += "UNARMEDXP," + character[16] + ":"; + toRet += "HERBALISMXP," + character[17] + ":"; + toRet += "EXCAVATIONXP," + character[18] + ":"; + toRet += "ARCHERYXP," + character[19] + ":"; + toRet += "SWORDSXP," + character[20] + ":"; + toRet += "AXESXP," + character[21] + ":"; + toRet += "ACROBATICSXP," + character[22] + ":"; + toRet += "TAMINGLVL," + character[24] + ":"; + toRet += "TAMINGXP," + character[25] + ":"; + toRet += "BERSERK," + character[26] + ":"; + toRet += "GIGA_DRILL_BREAKER," + character[27] + ":"; + toRet += "TREE_FELLER," + character[28] + ":"; + toRet += "GREEN_TERRA," + character[29] + ":"; + toRet += "SERRATED_STRIKES," + character[30] + ":"; + toRet += "SKULL_SPLITTER," + character[31] + ":"; + toRet += "SUPER_BREAKER," + character[32] + ":"; + toRet += "FISHINGLVL," + character[34] + ":"; + toRet += "FISHINGXP," + character[35] + ":"; + toRet += "BLAST_MINING," + character[36] + ":"; + toRet += "LastLogin," + character[37] + ":"; + toRet += "MobHealthBar," + character[38] + ":"; + toRet += "ALCHEMYLVL," + character[39] + ":"; + toRet += "ALCHEMYXP," + character[40] + ":"; + toRet += "UUID," + character[41] + ":"; + return toRet; + } private Integer getPlayerRank(String playerName, List statsList) { if (statsList == null) { return null; @@ -1082,35 +1101,20 @@ public final class FlatfileDatabaseManager implements DatabaseManager { // TODO on updates, put new values in a try{} ? - skillsXp.put(SkillType.taming, (float) Integer.valueOf(character[25])); - skillsXp.put(SkillType.mining, (float) Integer.valueOf(character[4])); - skillsXp.put(SkillType.repair, (float) Integer.valueOf(character[15])); - skillsXp.put(SkillType.woodcutting, (float) Integer.valueOf(character[6])); - skillsXp.put(SkillType.unarmed, (float) Integer.valueOf(character[16])); - skillsXp.put(SkillType.herbalism, (float) Integer.valueOf(character[17])); - skillsXp.put(SkillType.excavation, (float) Integer.valueOf(character[18])); - skillsXp.put(SkillType.archery, (float) Integer.valueOf(character[19])); - skillsXp.put(SkillType.swords, (float) Integer.valueOf(character[20])); - skillsXp.put(SkillType.axes, (float) Integer.valueOf(character[21])); - skillsXp.put(SkillType.acrobatics, (float) Integer.valueOf(character[22])); - skillsXp.put(SkillType.fishing, (float) Integer.valueOf(character[35])); - skillsXp.put(SkillType.alchemy, (float) Integer.valueOf(character[40])); + int skillIndex; + for(SkillType skill : SkillType.getNonChildSkills()) { + skillIndex = getIndexFromLine(skill.getName() + "XP", character); + skillsXp.put(skill, (float) Integer.valueOf(character[skillIndex].split(",")[1])); + } - // Taming - Unused - skillsDATS.put(AbilityType.superBreaker, Integer.valueOf(character[32])); - // Repair - Unused - skillsDATS.put(AbilityType.treeFeller, Integer.valueOf(character[28])); - skillsDATS.put(AbilityType.berserk, Integer.valueOf(character[26])); - skillsDATS.put(AbilityType.greenTerra, Integer.valueOf(character[29])); - skillsDATS.put(AbilityType.gigaDrillBreaker, Integer.valueOf(character[27])); - // Archery - Unused - skillsDATS.put(AbilityType.serratedStrikes, Integer.valueOf(character[30])); - skillsDATS.put(AbilityType.skullSplitter, Integer.valueOf(character[31])); - // Acrobatics - Unused - skillsDATS.put(AbilityType.blastMining, Integer.valueOf(character[36])); + int abilityIndex; + for(AbilityType ability : AbilityType.getAbilities()) { + abilityIndex = getIndexFromLine(ability.getUnprettyName(), character); + skillsDATS.put(ability, Integer.valueOf(character[abilityIndex].split(",")[1])); + } try { - mobHealthbarType = MobHealthbarType.valueOf(character[38]); + mobHealthbarType = MobHealthbarType.valueOf(character[getIndexFromLine("MobHealthBar", character)].split(",")[1]); } catch (Exception e) { mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); @@ -1118,31 +1122,25 @@ public final class FlatfileDatabaseManager implements DatabaseManager { UUID uuid; try { - uuid = UUID.fromString(character[41]); + uuid = UUID.fromString(character[getUUIDIndexFromLine(character)].split(",")[1]); } catch (Exception e) { uuid = null; } - return new PlayerProfile(character[0], uuid, skills, skillsXp, skillsDATS, mobHealthbarType); + return new PlayerProfile(character[getNameIndexFromLine(character)].split(",")[1], uuid, skills, skillsXp, skillsDATS, mobHealthbarType); } private Map getSkillMapFromLine(String[] character) { Map skills = new HashMap(); // Skill & Level - skills.put(SkillType.taming, Integer.valueOf(character[24])); - skills.put(SkillType.mining, Integer.valueOf(character[1])); - skills.put(SkillType.repair, Integer.valueOf(character[7])); - skills.put(SkillType.woodcutting, Integer.valueOf(character[5])); - skills.put(SkillType.unarmed, Integer.valueOf(character[8])); - skills.put(SkillType.herbalism, Integer.valueOf(character[9])); - skills.put(SkillType.excavation, Integer.valueOf(character[10])); - skills.put(SkillType.archery, Integer.valueOf(character[11])); - skills.put(SkillType.swords, Integer.valueOf(character[12])); - skills.put(SkillType.axes, Integer.valueOf(character[13])); - skills.put(SkillType.acrobatics, Integer.valueOf(character[14])); - skills.put(SkillType.fishing, Integer.valueOf(character[34])); - skills.put(SkillType.alchemy, Integer.valueOf(character[39])); + int skillIndex; + for(SkillType skill : SkillType.getNonChildSkills()) { + skillIndex = getIndexFromLine(skill.getName() + "LVL", character); + if(skillIndex != -1) { + skills.put(skill, Integer.valueOf(character[skillIndex].split(",")[1])); + } + } return skills; } @@ -1153,4 +1151,42 @@ public final class FlatfileDatabaseManager implements DatabaseManager { @Override public void onDisable() { } + + private static int getNameIndexFromLine(String[] line) { + return getIndexFromLine("Player", line); + } + + private static int getUUIDIndexFromLine(String[] line) { + int uuidIndex = getIndexFromLine("UUID", line); + return uuidIndex; + } + + private static int getTimeIndexFromLine(String[] line) { + return getIndexFromLine("LastLogin", line); + } + + private static int getIndexFromLine(String string, String[] line) { + for(int i = 0; i < line.length; i++) { + if(line[i].split(",")[0].equalsIgnoreCase(string)) { + return i; + } + } + return -1; + } + + private static boolean isPlayer(String[] character, String uuid, String playerName) { + int nameIndexFromLine = getNameIndexFromLine(character); + if(nameIndexFromLine != -1) { + if (character[nameIndexFromLine].split(",")[1].equalsIgnoreCase(playerName)) { + return true; + } + } + int uuidIndexFromLine = getUUIDIndexFromLine(character); + if(uuidIndexFromLine != -1) { + if(character[uuidIndexFromLine].split(",")[1].equalsIgnoreCase(playerName)) { + return true; + } + } + return false; + } } diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/AbilityType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/AbilityType.java index aab96a33c..28ea2fca5 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/AbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/AbilityType.java @@ -155,6 +155,10 @@ public class AbilityType { public String getName() { return StringUtils.getPrettyAbilityString(this); } + + public String getUnprettyName() { + return this.name; + } @Override public String toString() {