2011-12-13 08:38:15 +01:00
|
|
|
package com.earth2me.essentials.craftbukkit;
|
|
|
|
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
|
|
|
|
|
|
|
public class SetExpFix
|
|
|
|
{
|
2012-03-17 03:38:32 +00:00
|
|
|
//This method is used to update both the recorded total experience and displayed total experience.
|
|
|
|
//We reset both types to prevent issues.
|
2011-12-13 08:38:15 +01:00
|
|
|
public static void setTotalExperience(final Player player, final int exp)
|
|
|
|
{
|
|
|
|
if (exp < 0)
|
|
|
|
{
|
|
|
|
throw new IllegalArgumentException("Experience is negative!");
|
|
|
|
}
|
|
|
|
player.setExp(0);
|
|
|
|
player.setLevel(0);
|
|
|
|
player.setTotalExperience(0);
|
2012-08-03 10:21:03 +02:00
|
|
|
|
2012-03-17 03:38:32 +00:00
|
|
|
//This following code is technically redundant now, as bukkit now calulcates levels more or less correctly
|
|
|
|
//At larger numbers however... player.getExp(3000), only seems to give 2999, putting the below calculations off.
|
2011-12-13 08:38:15 +01:00
|
|
|
int amount = exp;
|
|
|
|
while (amount > 0)
|
|
|
|
{
|
2012-08-08 02:06:45 +01:00
|
|
|
final int expToLevel = getExpAtLevel(player);
|
2011-12-13 08:38:15 +01:00
|
|
|
amount -= expToLevel;
|
|
|
|
if (amount >= 0)
|
|
|
|
{
|
|
|
|
// give until next level
|
|
|
|
player.giveExp(expToLevel);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// give the rest
|
|
|
|
amount += expToLevel;
|
|
|
|
player.giveExp(amount);
|
|
|
|
amount = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-08 02:06:45 +01:00
|
|
|
private static int getExpAtLevel(final Player player)
|
2012-08-03 10:21:03 +02:00
|
|
|
{
|
2012-08-08 02:06:45 +01:00
|
|
|
return getExpAtLevel(player.getLevel());
|
2011-12-14 03:41:24 +00:00
|
|
|
}
|
2012-08-03 10:21:03 +02:00
|
|
|
|
2012-08-08 02:06:45 +01:00
|
|
|
public static int getExpAtLevel(final int level)
|
2012-08-03 10:21:03 +02:00
|
|
|
{
|
2012-08-08 02:06:45 +01:00
|
|
|
if (level > 29)
|
2012-08-03 10:21:03 +02:00
|
|
|
{
|
|
|
|
return 62 + (level - 30) * 7;
|
|
|
|
}
|
2012-08-08 02:06:45 +01:00
|
|
|
if (level > 15)
|
2012-08-03 10:21:03 +02:00
|
|
|
{
|
|
|
|
return 17 + (level - 15) * 3;
|
|
|
|
}
|
|
|
|
return 17;
|
2011-12-14 03:41:24 +00:00
|
|
|
}
|
2012-08-08 02:06:45 +01:00
|
|
|
|
|
|
|
public static int getExpToLevel(final int level)
|
|
|
|
{
|
|
|
|
int currentLevel = 0;
|
|
|
|
int exp = 0;
|
|
|
|
|
|
|
|
while (currentLevel < level)
|
|
|
|
{
|
|
|
|
exp += getExpAtLevel(currentLevel);
|
|
|
|
currentLevel++;
|
|
|
|
}
|
2012-10-31 21:06:30 +01:00
|
|
|
if (exp < 0)
|
|
|
|
{
|
|
|
|
exp = Integer.MAX_VALUE;
|
|
|
|
}
|
2012-08-08 02:06:45 +01:00
|
|
|
return exp;
|
|
|
|
}
|
2012-08-03 10:21:03 +02:00
|
|
|
|
2012-03-17 03:38:32 +00:00
|
|
|
//This method is required because the bukkit player.getTotalExperience() method, shows exp that has been 'spent'.
|
|
|
|
//Without this people would be able to use exp and then still sell it.
|
2011-12-14 03:41:24 +00:00
|
|
|
public static int getTotalExperience(final Player player)
|
2011-12-13 08:38:15 +01:00
|
|
|
{
|
2012-08-08 02:06:45 +01:00
|
|
|
int exp = (int)Math.round(getExpAtLevel(player) * player.getExp());
|
2011-12-14 03:41:24 +00:00
|
|
|
int currentLevel = player.getLevel();
|
2012-08-03 10:21:03 +02:00
|
|
|
|
|
|
|
while (currentLevel > 0)
|
|
|
|
{
|
2011-12-14 03:41:24 +00:00
|
|
|
currentLevel--;
|
2012-08-08 02:06:45 +01:00
|
|
|
exp += getExpAtLevel(currentLevel);
|
2011-12-14 03:41:24 +00:00
|
|
|
}
|
2012-10-31 21:06:30 +01:00
|
|
|
if (exp < 0)
|
|
|
|
{
|
|
|
|
exp = Integer.MAX_VALUE;
|
|
|
|
}
|
2011-12-14 03:41:24 +00:00
|
|
|
return exp;
|
2011-12-13 08:38:15 +01:00
|
|
|
}
|
2012-08-03 10:29:22 +02:00
|
|
|
|
|
|
|
public static int getExpUntilNextLevel(final Player player)
|
|
|
|
{
|
2012-08-08 02:06:45 +01:00
|
|
|
int exp = (int)Math.round(getExpAtLevel(player) * player.getExp());
|
|
|
|
int nextLevel = player.getLevel();
|
|
|
|
return getExpAtLevel(nextLevel) - exp;
|
2012-08-03 10:29:22 +02:00
|
|
|
}
|
2011-12-13 08:38:15 +01:00
|
|
|
}
|