package com.comphenix.xp.expressions; import java.util.ArrayList; import java.util.Collection; import org.bukkit.entity.Player; import com.comphenix.xp.Action; import com.comphenix.xp.Debugger; import com.comphenix.xp.lookup.LevelingRate; import com.comphenix.xp.parser.Utility; import com.comphenix.xp.rewards.RewardTypes; import com.comphenix.xp.rewards.xp.ExperienceManager; import com.comphenix.xp.rewards.xp.RewardEconomy; import com.comphenix.xp.rewards.xp.RewardVirtual; public class StandardPlayerService implements ParameterService<Player> { public static String NAME = "STANDARD_PLAYER_PARAMETERS"; /** * List of every standard player parameter. * * @author Kristian */ public enum PlayerParameters { TOTAL_EXPERIENCE, LEVEL_EXPERIENCE, EXPERIENCE, CURRENCY } // The name of every player parameter private static String[] PARAM_NAMES = Utility.toStringArray(PlayerParameters.values()); // Used to support the currency parameter protected RewardEconomy economy = null; // For debug logging private Debugger debugger; public StandardPlayerService(Debugger debugger) { this.debugger = debugger; } public void setEconomy(RewardEconomy economy) { this.economy = economy; } @Override public String getServiceName() { return NAME; } @Override public String[] getParameterNames() { return PARAM_NAMES; } @Override public Collection<NamedParameter> getParameters(final Action action, final Player player) { final Collection<NamedParameter> standard = new ArrayList<NamedParameter>(PARAM_NAMES.length); final ExperienceManager manager = new ExperienceManager(player); // Retrieve th final LevelingRate rate = getRate(action); // Create short-lived named parameters for (PlayerParameters parameter : PlayerParameters.values()) { final PlayerParameters current = parameter; standard.add(new NamedParameter(parameter.toString()) { @Override public Double call() throws Exception { // This is an approximation. We can't "undo" the leveling amount correctly. double rateFactor = rate != null ? RewardVirtual.getLevelingFactor(rate, player, manager) : 1; if (debugger.isDebugEnabled()) debugger.printDebug(this, "Rate factor: %s for parameter %s", rateFactor, current); // Use a good ol' switch to execute the different functions switch (current) { case EXPERIENCE: case TOTAL_EXPERIENCE: return (double) manager.getCurrentExp() / rateFactor; case LEVEL_EXPERIENCE: return (double) (player.getExp() * manager.getXpNeededToLevelUp(player.getLevel()) / rateFactor); case CURRENCY: if (economy != null) return economy.getBalance(player); else return 0.0; // Default default: throw new IllegalArgumentException("Unknown player parameter attribute detected."); } } }); } return standard; } /** * Retrieve the leveling rate from a given action. * @param action - action containing a leveling rate in its virtual reward. * @return The current leveling rate, or NULL if none were found. */ private LevelingRate getRate(Action action) { RewardVirtual virtual = (RewardVirtual) action.getReward(RewardTypes.VIRTUAL); if (virtual != null) { return virtual.getLevelingRate(); } else { return null; } } }