-
-
Save warriordog/6160a1ed45134265fb30b8d224da0426 to your computer and use it in GitHub Desktop.
A simple and easy to use class that can get and set a player's total experience points in Minecraft. This is based off the Bukkit API. The determines this with a mathematical formula based off the player's current level and their progress towards the next one.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
AUTHOR: Dev_Richard (https://www.spigotmc.org/members/dev_richard.38792/) | |
DESC: A simple and easy to use class that can get and set a player's total experience points. | |
Feel free to use this class in both public and private plugins, however if you release your | |
plugin please link to this gist publicly so that others can contribute and benefit from it. | |
Source available at https://gist.github.com/warriordog/6160a1ed45134265fb30b8d224da0426 | |
*/ | |
import org.bukkit.entity.Player; | |
import java.math.BigDecimal; | |
public class PlayerExp { | |
private Player player; | |
public PlayerExp(Player player) { | |
this.player = player; | |
} | |
public int getTotalExperience() { | |
int level = player.getLevel(); | |
double currentExp = (double) player.getExp(); //works the same, see http://stackoverflow.com/a/916110 | |
int experience; | |
int requiredExperience; | |
if (level >= 0 && level <= 15) { | |
experience = (int) Math.ceil(Math.pow(level, 2) + (6 * level)); | |
requiredExperience = 2 * level + 7; | |
} else if (level > 15 && level <= 30) { | |
experience = (int) Math.ceil(2.5 * Math.pow(level, 2) - 40.5 * level + 360); | |
requiredExperience = 5 * level - 38; | |
} else { | |
experience = (int) Math.ceil(4.5 * Math.pow(level, 2) - 162.5 * level + 2220); | |
requiredExperience = 9 * level - 158; | |
} | |
experience += Math.ceil(currentExp * requiredExperience); | |
return experience; | |
} | |
public void setTotalExperience(int xp) { | |
//Levels 0 through 15 | |
if (xp >= 0 && xp < 351) { | |
//Calculate Everything | |
int a = 1; | |
int b = 6; | |
int c = -xp; | |
int level = (int) (-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a); | |
int xpForLevel = (int) (Math.pow(level, 2) + (6 * level)); | |
int remainder = xp - xpForLevel; | |
int experienceNeeded = (2 * level) + 7; | |
float experience = (float) remainder / (float) experienceNeeded; | |
experience = round(experience, 2); | |
//Set Everything | |
player.setLevel(level); | |
player.setExp(experience); | |
//Levels 16 through 30 | |
} else if (xp >= 352 && xp < 1507) { | |
//Calculate Everything | |
double a = 2.5; | |
double b = -40.5; | |
int c = -xp + 360; | |
double dLevel = (-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a); | |
int level = (int) Math.floor(dLevel); | |
int xpForLevel = (int) (2.5 * Math.pow(level, 2) - (40.5 * level) + 360); | |
int remainder = xp - xpForLevel; | |
int experienceNeeded = (5 * level) - 38; | |
float experience = (float) remainder / (float) experienceNeeded; | |
experience = round(experience, 2); | |
//Set Everything | |
player.setLevel(level); | |
player.setExp(experience); | |
//Level 31 and greater | |
} else { | |
//Calculate Everything | |
double a = 4.5; | |
double b = -162.5; | |
int c = -xp + 2220; | |
double dLevel = (-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a); | |
int level = (int) Math.floor(dLevel); | |
int xpForLevel = (int) (4.5 * Math.pow(level, 2) - (162.5 * level) + 2220); | |
int remainder = xp - xpForLevel; | |
int experienceNeeded = (9 * level) - 158; | |
float experience = (float) remainder / (float) experienceNeeded; | |
experience = round(experience, 2); | |
//Set Everything | |
player.setLevel(level); | |
player.setExp(experience); | |
} | |
} | |
private float round(float d, int decimalPlace) { | |
BigDecimal bd = BigDecimal.valueOf(d); //works the same, see http://stackoverflow.com/a/916110 | |
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_DOWN); | |
return bd.floatValue(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment