diff --git a/src/main/java/com/gmail/nossr50/commands/database/McconvertCommand.java b/src/main/java/com/gmail/nossr50/commands/database/McconvertCommand.java index d6f27257c..559b5492d 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McconvertCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McconvertCommand.java @@ -1,11 +1,14 @@ package com.gmail.nossr50.commands.database; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.datatypes.experience.FormulaType; @@ -15,6 +18,18 @@ import com.gmail.nossr50.util.player.UserManager; import com.google.common.collect.ImmutableList; public class McconvertCommand implements TabExecutor { + private static final List FORMULA_TYPES; + + static { + ArrayList types = new ArrayList(); + + for (FormulaType type : FormulaType.values()) { + types.add(type.toString()); + } + + Collections.sort(types); + FORMULA_TYPES = ImmutableList.copyOf(types); + } /* * Do this later; Use mcconvert instead of mmoupdate: @@ -28,16 +43,12 @@ public class McconvertCommand implements TabExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { switch (args.length) { - case 0: - sender.sendMessage("Usage is /mcconvert "); - return true; - case 1: FormulaType previousType = mcMMO.getFormulaManager().getPreviousFormulaType(); FormulaType newType = FormulaType.getFormulaType(args[0].toUpperCase()); if (newType == FormulaType.UNKNOWN) { - sender.sendMessage("Unknown formula type! Valid types are: LINEAR and EXPONENTIAL"); + sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Invalid")); return true; } @@ -47,23 +58,30 @@ public class McconvertCommand implements TabExecutor { } sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Start", previousType.toString(), newType.toString())); + UserManager.saveAll(); UserManager.clearAll(); + new FormulaConversionTask(sender, newType).runTaskLater(mcMMO.p, 1); for (Player player : mcMMO.p.getServer().getOnlinePlayers()) { UserManager.addUser(player); } + return true; default: - break; + return false; } - return false; } @Override public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { - return ImmutableList.of(); + switch (args.length) { + case 1: + return StringUtil.copyPartialMatches(args[0], FORMULA_TYPES, new ArrayList(FORMULA_TYPES.size())); + default: + return ImmutableList.of(); + } } } diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java index 63cce3aab..0a7a1ac87 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManagerFactory.java @@ -61,6 +61,6 @@ public class DatabaseManagerFactory { } public static DatabaseManager createCustomDatabaseManager(Class clazz) throws Throwable { - return customManager.getConstructor((Class) null).newInstance((Object[]) null); + return customManager.getConstructor((Class) clazz).newInstance((Object[]) null); } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 59b4228b7..4cfda8537 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -127,7 +127,7 @@ public class mcMMO extends JavaPlugin { PartyManager.loadParties(); - formulaManager = new FormulaManager(this); + formulaManager = new FormulaManager(); for (Player player : getServer().getOnlinePlayers()) { UserManager.addUser(player); // In case of reload add all users back into UserManager diff --git a/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java index c5d6ca4aa..62ac4d041 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/FormulaConversionTask.java @@ -25,7 +25,7 @@ public class FormulaConversionTask extends BukkitRunnable { @Override public void run() { for (String playerName : mcMMO.getDatabaseManager().getStoredUsers()) { - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(playerName); + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(playerName, true); PlayerProfile profile; // If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process. @@ -53,21 +53,18 @@ public class FormulaConversionTask extends BukkitRunnable { private void editValues(PlayerProfile profile) { mcMMO.p.debug("========================================================================"); mcMMO.p.debug("Conversion report for " + profile.getPlayerName() + ":"); - for (SkillType skillType : SkillType.values()) { - if (skillType.isChildSkill()) { - continue; - } + for (SkillType skillType : SkillType.nonChildSkills()) { + int oldLevel = profile.getSkillLevel(skillType); + int oldXPLevel = profile.getSkillXpLevel(skillType); + int totalOldXP = mcMMO.getFormulaManager().calculateTotalExperience(oldLevel, oldXPLevel); - int[] oldExperienceValues = new int[2]; - oldExperienceValues[0] = profile.getSkillLevel(skillType); - oldExperienceValues[1] = profile.getSkillXpLevel(skillType); - - int totalOldXP = mcMMO.getFormulaManager().calculateTotalExperience(oldExperienceValues); if (totalOldXP == 0) { continue; } double modifier = ExperienceConfig.getInstance().getExpModifier(); + + //TODO: Why not validate like the other configs? if (modifier <= 0) { modifier = 1; mcMMO.p.getLogger().warning("Invalid value found for Conversion.Exp_Modifier! Skipping using the modifier..."); @@ -80,8 +77,8 @@ public class FormulaConversionTask extends BukkitRunnable { mcMMO.p.debug(" Skill: " + skillType.toString()); mcMMO.p.debug(" OLD:"); - mcMMO.p.debug(" Level: " + oldExperienceValues[0]); - mcMMO.p.debug(" XP " + oldExperienceValues[1]); + mcMMO.p.debug(" Level: " + oldLevel); + mcMMO.p.debug(" XP " + oldXPLevel); mcMMO.p.debug(" Total XP " + totalOldXP); mcMMO.p.debug(" NEW:"); diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index 5e0d89b2f..58810c33a 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -297,7 +297,7 @@ public final class CommandRegistrationManager { command.setDescription(LocaleLoader.getString("Commands.Description.mcconvert")); command.setPermission("mcmmo.commands.mcconvert"); command.setPermissionMessage(permissionsMessage); - command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcconvert")); + command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mcconvert", "")); command.setExecutor(new McconvertCommand()); } diff --git a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java index b3a241845..9174d3829 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/FormulaManager.java @@ -13,7 +13,6 @@ import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.mcMMO; public class FormulaManager { - private final mcMMO plugin; private static String formulaFilePath = mcMMO.getFlatFileDirectory() + "formula.yml"; private static File formulaFile = new File(formulaFilePath); @@ -23,9 +22,7 @@ public class FormulaManager { private FormulaType previousFormula; - public FormulaManager(final mcMMO plugin) { - this.plugin = plugin; - + public FormulaManager() { loadFormula(); } @@ -52,18 +49,17 @@ public class FormulaManager { * the amount of levels and experience, using the previously * used formula type. * - * @param oldExperienceValues level and experience amount + * @param skillLevel Amount of levels + * @param skillXPLevel Amount of experience * @return The total amount of experience */ - public int calculateTotalExperience(int[] oldExperienceValues) { + public int calculateTotalExperience(int skillLevel, int skillXPLevel) { int totalXP = 0; - int skillLevel = oldExperienceValues[0]; - int skillXPLevel = oldExperienceValues[1]; - for (int level = 0; level < skillLevel; level++) { totalXP += getCachedXpToLevel(level, previousFormula); } + totalXP += skillXPLevel; return totalXP; @@ -79,25 +75,23 @@ public class FormulaManager { * @return the amount of levels and experience */ public int[] calculateNewLevel(SkillType skillType, int experience, FormulaType formulaType) { - int[] newExperienceValues = new int[2]; int newLevel = 0; int remainder = 0; int maxLevel = Config.getInstance().getLevelCap(skillType); while (experience > 0 && newLevel < maxLevel) { int experienceToNextLevel = getCachedXpToLevel(newLevel, formulaType); - if (experience - experienceToNextLevel >= 0) { - newLevel++; - experience -= experienceToNextLevel; - } - else { + + if (experience - experienceToNextLevel < 0) { remainder = experience; break; } + + newLevel++; + experience -= experienceToNextLevel; } - newExperienceValues[0] = newLevel; - newExperienceValues[1] = remainder; - return newExperienceValues; + + return new int[]{newLevel, remainder}; } /** @@ -111,45 +105,46 @@ public class FormulaManager { */ public int getCachedXpToLevel(int level, FormulaType formulaType) { int experience; + double multiplier; switch (formulaType) { case UNKNOWN: case LINEAR: - if (experienceNeededLinear.containsKey(level)) { - experience = experienceNeededLinear.get(level); - return experience; + if (!experienceNeededLinear.containsKey(level)) { + multiplier = ExperienceConfig.getInstance().getLinearMultiplier(); + + //TODO: Validate at load? + if (multiplier <= 0) { + multiplier = 20; + } + + experience = (int) Math.floor(ExperienceConfig.getInstance().getLinearBase() + level * multiplier); + experienceNeededLinear.put(level, experience); } - double multiplier = ExperienceConfig.getInstance().getLinearMultiplier(); - if (multiplier <= 0) { - multiplier = 20; - } - - experience = (int) Math.floor(ExperienceConfig.getInstance().getLinearBase() + level * multiplier); - experienceNeededLinear.put(level, experience); - return experience; + return experienceNeededLinear.get(level); case EXPONENTIAL: - if (experienceNeededExponential.containsKey(level)) { - experience = experienceNeededExponential.get(level); - return experience; + if (!experienceNeededExponential.containsKey(level)) { + multiplier = ExperienceConfig.getInstance().getExponentialMultiplier(); + double exponent = ExperienceConfig.getInstance().getExponentialExponent(); + int base = ExperienceConfig.getInstance().getExponentialBase(); + + //TODO: Validate at load? + if (multiplier <= 0) { + multiplier = 0.1; + } + + //TODO: Validate at load? + if (exponent <= 0) { + exponent = 1.80; + } + + experience = (int) Math.floor(multiplier * Math.pow(level, exponent) + base); + experienceNeededExponential.put(level, experience); } - multiplier = ExperienceConfig.getInstance().getExponentialMultiplier(); - double exponent = ExperienceConfig.getInstance().getExponentialExponent(); - int base = ExperienceConfig.getInstance().getExponentialBase(); - - if (multiplier <= 0) { - multiplier = 0.1; - } - - if (exponent <= 0) { - exponent = 1.80; - } - - experience = (int) Math.floor(multiplier * Math.pow(level, exponent) + base); - experienceNeededExponential.put(level, experience); - return experience; + return experienceNeededExponential.get(level); default: return 0; diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 941ed6a0f..af47adef1 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -447,6 +447,7 @@ Commands.mmoupdate.InvalidType=[[RED]]{0} is not a valid database type. Commands.mmoupdate.Start=[[GRAY]]Starting conversion from {0} to {1}... Commands.mmoupdate.Finish=[[GRAY]]Database migration complete; the {1} database now has all data from the {0} database. Commands.mmoshowdb=[[YELLOW]]The currently used database is [[GREEN]]{0} +Commands.mcconvert.Invalid=[[RED]]Unknown formula type! Valid types are: [[GREEN]]LINEAR [[RED]]and [[GREEN]]EXPONENTIAL. Commands.mcconvert.Same=[[RED]]Already using formula type {0} Commands.mcconvert.Start=[[GRAY]]Starting conversion from {0} to {1} curve Commands.mcconvert.Finish=[[GRAY]]Formula conversion complete; now using an {0} XP curve.