Made flatfile expandable

This commit is contained in:
ile123ile 2014-08-25 17:39:00 -07:00
parent edd764d5e6
commit 21fcc83f56
2 changed files with 392 additions and 352 deletions

View File

@ -9,7 +9,6 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -138,11 +137,12 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
while ((line = in.readLine()) != null) { while ((line = in.readLine()) != null) {
String[] character = line.split(":"); String[] character = line.split(":");
String name = character[0]; String name = character[getNameIndexFromLine(character)].split(",")[1];
long lastPlayed = 0; long lastPlayed = 0;
boolean rewrite = false; boolean rewrite = false;
int lastPlayedIndex = getTimeIndexFromLine(character);
try { try {
lastPlayed = Long.parseLong(character[37]) * Misc.TIME_CONVERSION_FACTOR; lastPlayed = Long.parseLong(character[lastPlayedIndex].split(",")[1]) * Misc.TIME_CONVERSION_FACTOR;
} }
catch (NumberFormatException e) { catch (NumberFormatException e) {
} }
@ -158,7 +158,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
else { else {
if (rewrite) { if (rewrite) {
// Rewrite their data with a valid time // 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, ":"); String newLine = org.apache.commons.lang.StringUtils.join(character, ":");
writer.append(newLine).append("\r\n"); writer.append(newLine).append("\r\n");
} }
@ -213,7 +213,8 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
while ((line = in.readLine()) != null) { 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. // 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..."); mcMMO.p.getLogger().info("User found, removing...");
worked = true; worked = true;
continue; // Skip the player continue; // Skip the player
@ -272,54 +273,24 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
while ((line = in.readLine()) != null) { 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 // Read the line in and copy it to the output if it's not the player we want to edit
String[] character = line.split(":"); 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"); writer.append(line).append("\r\n");
} }
else { else {
// Otherwise write the new player information // Otherwise write the new player information
writer.append(playerName).append(":"); writer.append("Player,").append(playerName).append(":");
writer.append(profile.getSkillLevel(SkillType.mining)).append(":"); for(SkillType skill : SkillType.getNonChildSkills()) {
writer.append(":"); writer.append(skill.getName()).append("LVL,").append(profile.getSkillLevel(skill)).append(":");
writer.append(":"); writer.append(skill.getName()).append("XP,").append(profile.getSkillXpLevel(skill)).append(":");
writer.append(profile.getSkillXpLevel(SkillType.mining)).append(":"); }
writer.append(profile.getSkillLevel(SkillType.woodcutting)).append(":"); for(AbilityType ability : AbilityType.getAbilities()) {
writer.append(profile.getSkillXpLevel(SkillType.woodcutting)).append(":"); writer.append(ability.getUnprettyName()).append(",").append((int) profile.getAbilityDATS(ability)).append(":");
writer.append(profile.getSkillLevel(SkillType.repair)).append(":"); }
writer.append(profile.getSkillLevel(SkillType.unarmed)).append(":"); writer.append("LastLogin,").append(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR).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(":");
MobHealthbarType mobHealthbarType = profile.getMobHealthbarType(); MobHealthbarType mobHealthbarType = profile.getMobHealthbarType();
writer.append(mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString()).append(":"); writer.append("MobHealthBar,").append(mobHealthbarType == null ? Config.getInstance().getMobHealthbarDefault().toString() : mobHealthbarType.toString()).append(":");
writer.append(profile.getSkillLevel(SkillType.alchemy)).append(":"); writer.append("UUID,").append(uuid != null ? uuid.toString() : "NULL").append(":");
writer.append(profile.getSkillXpLevel(SkillType.alchemy)).append(":");
writer.append(uuid.toString()).append(":");
writer.append("\r\n"); writer.append("\r\n");
} }
} }
@ -384,50 +355,17 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
out = new BufferedWriter(new FileWriter(mcMMO.getUsersFilePath(), true)); out = new BufferedWriter(new FileWriter(mcMMO.getUsersFilePath(), true));
// Add the player to the end // Add the player to the end
out.append(playerName).append(":"); out.append("Player,").append(playerName).append(":");
out.append("0:"); // Mining for(String skill : SkillType.getSkillNames()) {
out.append(":"); out.append(skill).append("LVL,0:"); //Skill Levels
out.append(":"); out.append(skill).append("XP,0:"); //Skill XP
out.append("0:"); // Xp }
out.append("0:"); // Woodcutting for(AbilityType ability : AbilityType.getAbilities()) {
out.append("0:"); // WoodCuttingXp out.append(ability.getUnprettyName()).append(",0:"); //DATS
out.append("0:"); // Repair }
out.append("0:"); // Unarmed out.append("LastLogin,").append(String.valueOf(System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR)).append(":"); // LastLogin
out.append("0:"); // Herbalism out.append("MobHealthBar,").append(Config.getInstance().getMobHealthbarDefault().toString()).append(":"); // Mob Healthbar HUD
out.append("0:"); // Excavation out.append("UUID,").append(uuid != null ? uuid.toString() : "NULL").append(":"); // UUID
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.newLine(); out.newLine();
} }
@ -469,15 +407,26 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
while ((line = in.readLine()) != null) { while ((line = in.readLine()) != null) {
// Find if the line contains the player we want. // Find if the line contains the player we want.
String[] character = line.split(":"); String[] character = line.split(":");
int uuidIndex = getUUIDIndexFromLine(character);
if ((uuid != null && (!character[41].equalsIgnoreCase(uuid.toString()) && !character[41].equalsIgnoreCase("NULL"))) || (uuid == null && !character[0].equalsIgnoreCase(playerName))) { int nameIndex = getNameIndexFromLine(character);
continue; 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 // Update playerName in database after name change
if (!character[0].equalsIgnoreCase(playerName)) { if (!character[nameIndex].split(",")[1].equalsIgnoreCase(playerName)) {
mcMMO.p.debug("Name change detected: " + character[0] + " => " + playerName); mcMMO.p.debug("Name change detected: " + character[nameIndex].split(",")[1] + " => " + playerName);
character[0] = playerName; character[nameIndex] = "Player," + playerName;
} }
return loadFromLine(character); return loadFromLine(character);
@ -518,6 +467,61 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
return new PlayerProfile(playerName, uuid); 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) { public void convertUsers(DatabaseManager destination) {
BufferedReader in = null; BufferedReader in = null;
@ -575,14 +579,15 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
while ((line = in.readLine()) != null) { while ((line = in.readLine()) != null) {
String[] character = line.split(":"); String[] character = line.split(":");
if (!worked && character[0].equalsIgnoreCase(userName)) { if (!worked && character[getNameIndexFromLine(character)].split(",")[1].equalsIgnoreCase(userName)) {
if (character.length < 42) { int uuidIndex = getUUIDIndexFromLine(character);
if (uuidIndex == -1) {
mcMMO.p.getLogger().severe("Could not update UUID for " + userName + "!"); mcMMO.p.getLogger().severe("Could not update UUID for " + userName + "!");
mcMMO.p.getLogger().severe("Database entry is invalid."); mcMMO.p.getLogger().severe("Database entry is invalid.");
break; break;
} }
line = line.replace(character[41], uuid.toString()); line = line.replace(character[uuidIndex], "UUID," + uuid.toString());
worked = true; worked = true;
} }
@ -631,14 +636,16 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
while (((line = in.readLine()) != null) && !fetchedUUIDs.isEmpty()) { while (((line = in.readLine()) != null) && !fetchedUUIDs.isEmpty()) {
String[] character = line.split(":"); String[] character = line.split(":");
if (fetchedUUIDs.containsKey(character[0])) { int nameIndex = getNameIndexFromLine(character);
if (character.length < 42) { if (fetchedUUIDs.containsKey(character[nameIndex].split(",")[1])) {
mcMMO.p.getLogger().severe("Could not update UUID for " + character[0] + "!"); 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."); mcMMO.p.getLogger().severe("Database entry is invalid.");
continue; 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(); 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) { while ((line = in.readLine()) != null) {
String[] character = line.split(":"); String[] character = line.split(":");
users.add(character[0]); int nameIndexFromLine = getNameIndexFromLine(character);
if(nameIndexFromLine != -1) {
users.add(character[nameIndexFromLine].split(",")[1]);
}
} }
} }
catch (Exception e) { catch (Exception e) {
@ -721,19 +731,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
powerLevels.clear(); // Clear old values from the power levels powerLevels.clear(); // Clear old values from the power levels
// Initialize lists // Initialize lists
List<PlayerStat> mining = new ArrayList<PlayerStat>(); Map<SkillType, List<PlayerStat>> stats = new HashMap<SkillType, List<PlayerStat>>();
List<PlayerStat> woodcutting = new ArrayList<PlayerStat>();
List<PlayerStat> herbalism = new ArrayList<PlayerStat>();
List<PlayerStat> excavation = new ArrayList<PlayerStat>();
List<PlayerStat> acrobatics = new ArrayList<PlayerStat>();
List<PlayerStat> repair = new ArrayList<PlayerStat>();
List<PlayerStat> swords = new ArrayList<PlayerStat>();
List<PlayerStat> axes = new ArrayList<PlayerStat>();
List<PlayerStat> archery = new ArrayList<PlayerStat>();
List<PlayerStat> unarmed = new ArrayList<PlayerStat>();
List<PlayerStat> taming = new ArrayList<PlayerStat>();
List<PlayerStat> fishing = new ArrayList<PlayerStat>();
List<PlayerStat> alchemy = new ArrayList<PlayerStat>();
BufferedReader in = null; BufferedReader in = null;
String playerName = null; String playerName = null;
@ -745,24 +743,18 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
while ((line = in.readLine()) != null) { while ((line = in.readLine()) != null) {
String[] data = line.split(":"); String[] data = line.split(":");
playerName = data[0]; int nameIndex = getNameIndexFromLine(data);
playerName = data[nameIndex].split(",")[1];
int powerLevel = 0; int powerLevel = 0;
Map<SkillType, Integer> skills = getSkillMapFromLine(data); Map<SkillType, Integer> skills = getSkillMapFromLine(data);
powerLevel += putStat(acrobatics, playerName, skills.get(SkillType.acrobatics)); List<PlayerStat> stat;
powerLevel += putStat(alchemy, playerName, skills.get(SkillType.alchemy)); for(SkillType skill : SkillType.getNonChildSkills()) {
powerLevel += putStat(archery, playerName, skills.get(SkillType.archery)); stat = new ArrayList<PlayerStat>();
powerLevel += putStat(axes, playerName, skills.get(SkillType.axes)); powerLevel += putStat(stat, playerName, skills.containsKey(skill) ? skills.get(skill) : 0);
powerLevel += putStat(excavation, playerName, skills.get(SkillType.excavation)); stats.put(skill, stat);
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));
putStat(powerLevels, playerName, powerLevel); putStat(powerLevels, playerName, powerLevel);
} }
@ -784,34 +776,11 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
SkillComparator c = new SkillComparator(); SkillComparator c = new SkillComparator();
Collections.sort(mining, c); for(Map.Entry<SkillType, List<PlayerStat>> pair : stats.entrySet()) {
Collections.sort(woodcutting, c); Collections.sort(pair.getValue(), c);
Collections.sort(repair, c); playerStatHash.put(pair.getKey(), pair.getValue());
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);
Collections.sort(powerLevels, 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);
playerStatHash.put(SkillType.alchemy, alchemy);
} }
/** /**
@ -822,7 +791,6 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
BufferedReader in = null; BufferedReader in = null;
FileWriter out = null; FileWriter out = null;
String usersFilePath = mcMMO.getUsersFilePath(); String usersFilePath = mcMMO.getUsersFilePath();
synchronized (fileWritingLock) { synchronized (fileWritingLock) {
try { try {
in = new BufferedReader(new FileReader(usersFilePath)); in = new BufferedReader(new FileReader(usersFilePath));
@ -842,159 +810,167 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
line = line.concat(":"); line = line.concat(":");
} }
String[] character = line.split(":"); 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])) { StringBuilder newLine = new StringBuilder(line);
continue; 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);
} }
else {
// Prevent the same player from being present multiple times writer.append(line);
if (character.length == 42 && (!character[41].isEmpty() && !players.add(character[41]))) {
continue;
} }
writer.append("\r\n");
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");
} }
// Write the new file // Write the new file
out = new FileWriter(usersFilePath); 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_SQL_PARTY_NAMES);
mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SPOUT); mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.DROP_SPOUT);
mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_ALCHEMY); mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_ALCHEMY);
mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_INDEX_NAMES);
return; return;
} }
@ -1043,7 +1020,49 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
e.printStackTrace(); 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<PlayerStat> statsList) { private Integer getPlayerRank(String playerName, List<PlayerStat> statsList) {
if (statsList == null) { if (statsList == null) {
return null; return null;
@ -1082,35 +1101,20 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
// TODO on updates, put new values in a try{} ? // TODO on updates, put new values in a try{} ?
skillsXp.put(SkillType.taming, (float) Integer.valueOf(character[25])); int skillIndex;
skillsXp.put(SkillType.mining, (float) Integer.valueOf(character[4])); for(SkillType skill : SkillType.getNonChildSkills()) {
skillsXp.put(SkillType.repair, (float) Integer.valueOf(character[15])); skillIndex = getIndexFromLine(skill.getName() + "XP", character);
skillsXp.put(SkillType.woodcutting, (float) Integer.valueOf(character[6])); skillsXp.put(skill, (float) Integer.valueOf(character[skillIndex].split(",")[1]));
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]));
// Taming - Unused int abilityIndex;
skillsDATS.put(AbilityType.superBreaker, Integer.valueOf(character[32])); for(AbilityType ability : AbilityType.getAbilities()) {
// Repair - Unused abilityIndex = getIndexFromLine(ability.getUnprettyName(), character);
skillsDATS.put(AbilityType.treeFeller, Integer.valueOf(character[28])); skillsDATS.put(ability, Integer.valueOf(character[abilityIndex].split(",")[1]));
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]));
try { try {
mobHealthbarType = MobHealthbarType.valueOf(character[38]); mobHealthbarType = MobHealthbarType.valueOf(character[getIndexFromLine("MobHealthBar", character)].split(",")[1]);
} }
catch (Exception e) { catch (Exception e) {
mobHealthbarType = Config.getInstance().getMobHealthbarDefault(); mobHealthbarType = Config.getInstance().getMobHealthbarDefault();
@ -1118,31 +1122,25 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
UUID uuid; UUID uuid;
try { try {
uuid = UUID.fromString(character[41]); uuid = UUID.fromString(character[getUUIDIndexFromLine(character)].split(",")[1]);
} }
catch (Exception e) { catch (Exception e) {
uuid = null; 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<SkillType, Integer> getSkillMapFromLine(String[] character) { private Map<SkillType, Integer> getSkillMapFromLine(String[] character) {
Map<SkillType, Integer> skills = new HashMap<SkillType, Integer>(); // Skill & Level Map<SkillType, Integer> skills = new HashMap<SkillType, Integer>(); // Skill & Level
skills.put(SkillType.taming, Integer.valueOf(character[24])); int skillIndex;
skills.put(SkillType.mining, Integer.valueOf(character[1])); for(SkillType skill : SkillType.getNonChildSkills()) {
skills.put(SkillType.repair, Integer.valueOf(character[7])); skillIndex = getIndexFromLine(skill.getName() + "LVL", character);
skills.put(SkillType.woodcutting, Integer.valueOf(character[5])); if(skillIndex != -1) {
skills.put(SkillType.unarmed, Integer.valueOf(character[8])); skills.put(skill, Integer.valueOf(character[skillIndex].split(",")[1]));
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]));
return skills; return skills;
} }
@ -1153,4 +1151,42 @@ public final class FlatfileDatabaseManager implements DatabaseManager {
@Override @Override
public void onDisable() { } 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;
}
} }

View File

@ -155,6 +155,10 @@ public class AbilityType {
public String getName() { public String getName() {
return StringUtils.getPrettyAbilityString(this); return StringUtils.getPrettyAbilityString(this);
} }
public String getUnprettyName() {
return this.name;
}
@Override @Override
public String toString() { public String toString() {