(Possibly?) fixed Tome of Peritia bug of the Negative Speed of Light

This commit is contained in:
WayofTime 2016-06-10 19:36:21 -04:00
parent 5388dbf883
commit d1bdec7113
2 changed files with 50 additions and 19 deletions

View file

@ -5,6 +5,7 @@ Version 2.0.1-43
- Fixed an NPE with the Gathering of the Forsaken Souls - Fixed an NPE with the Gathering of the Forsaken Souls
- Fixed Absorption Hearts remaining after the absorption buff ends for the Steadfast Sentient Sword - Fixed Absorption Hearts remaining after the absorption buff ends for the Steadfast Sentient Sword
- Updated the Guide (Woooooooooooooo........) - Updated the Guide (Woooooooooooooo........)
- (Possibly?) fixed Tome of Peritia bug of the Negative Speed of Light
------------------------------------------------------ ------------------------------------------------------
Version 2.0.1-42 Version 2.0.1-42

View file

@ -80,15 +80,13 @@ public class ItemExperienceBook extends Item implements IVariantProvider
float progress = player.experience; float progress = player.experience;
int expToNext = getExperienceForNextLevel(player.experienceLevel); int expToNext = getExperienceForNextLevel(player.experienceLevel);
float neededExp = (1 - progress) * expToNext; int neededExp = (int) Math.ceil((1 - progress) * expToNext);
float containedExp = (float) getStoredExperience(stack); float containedExp = (float) getStoredExperience(stack);
if (containedExp >= neededExp) if (containedExp >= neededExp)
{ {
setStoredExperience(stack, containedExp - neededExp); setStoredExperience(stack, containedExp - neededExp);
player.experience = 0; addPlayerXP(player, neededExp);
player.experienceTotal = Math.round(player.experienceTotal + neededExp);
player.experienceLevel++;
if (player.experienceLevel % 5 == 0) if (player.experienceLevel % 5 == 0)
{ {
@ -98,32 +96,45 @@ public class ItemExperienceBook extends Item implements IVariantProvider
} else } else
{ {
setStoredExperience(stack, 0); setStoredExperience(stack, 0);
progress += containedExp / expToNext; addPlayerXP(player, (int) containedExp);
player.experience = progress;
player.experienceTotal = Math.round(player.experienceTotal + containedExp);
} }
} }
public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player) public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player)
{ {
float progress = player.experience; float progress = player.experience;
if (progress > 0) if (progress > 0)
{ {
double expDeduction = getExperienceAcquiredToNext(player.experienceLevel, player.experience); int expDeduction = (int) getExperienceAcquiredToNext(player);
player.experience = 0; if (expDeduction > 0)
player.experienceTotal -= (int) (expDeduction); {
addPlayerXP(player, -expDeduction);
addExperience(stack, expDeduction); addExperience(stack, expDeduction);
} else if (player.experienceLevel > 0) }
} else if (progress == 0 && player.experienceLevel > 0)
{ {
player.experienceLevel--; int expDeduction = getExperienceForNextLevel(player.experienceLevel - 1);
int expDeduction = getExperienceForNextLevel(player.experienceLevel); addPlayerXP(player, -expDeduction);
player.experienceTotal -= expDeduction;
addExperience(stack, expDeduction); addExperience(stack, expDeduction);
} }
} }
// Credits to Ender IO for some of the experience code, although now modified slightly for my convenience.
public static int getPlayerXP(EntityPlayer player)
{
return (int) (getExperienceForLevel(player.experienceLevel) + (player.experience * player.xpBarCap()));
}
public static void addPlayerXP(EntityPlayer player, int amount)
{
int experience = Math.max(0, getPlayerXP(player) + amount);
player.experienceTotal = experience;
player.experienceLevel = getLevelForExperience(experience);
int expForLevel = getExperienceForLevel(player.experienceLevel);
player.experience = (float) (experience - expForLevel) / (float) player.xpBarCap();
}
public static void setStoredExperience(ItemStack stack, double exp) public static void setStoredExperience(ItemStack stack, double exp)
{ {
NBTHelper.checkNBT(stack); NBTHelper.checkNBT(stack);
@ -161,9 +172,28 @@ public class ItemExperienceBook extends Item implements IVariantProvider
} }
} }
public static double getExperienceAcquiredToNext(int currentLevel, double progress) //TODO: Change to calculation form.
public static int getExperienceForLevel(int level)
{ {
return progress * getExperienceForNextLevel(currentLevel); if (level >= 21863)
{
return Integer.MAX_VALUE;
}
if (level == 0)
{
return 0;
}
int res = 0;
for (int i = 0; i < level; i++)
{
res += getExperienceForNextLevel(i);
}
return res;
}
public static double getExperienceAcquiredToNext(EntityPlayer player)
{
return player.experience * player.xpBarCap();
} }
public static int getLevelForExperience(double exp) public static int getLevelForExperience(double exp)