diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java index 36ef5a4c..a86f8bd5 100644 --- a/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java +++ b/src/main/java/WayofTime/bloodmagic/item/ItemExperienceBook.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -39,7 +40,11 @@ public class ItemExperienceBook extends Item implements IVariantProvider { tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.experienceTome")); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.experienceTome.exp", (int) getStoredExperience(stack))); + double storedExp = getStoredExperience(stack); + + tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.experienceTome.exp", (int) storedExp)); + + tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.experienceTome.expLevel", (int) getLevelForExperience(storedExp))); } @Override @@ -49,7 +54,8 @@ public class ItemExperienceBook extends Item implements IVariantProvider { if (player.isSneaking()) absorbOneLevelExpFromPlayer(stack, player); - + else + giveOneLevelExpToPlayer(stack, player); } return new ActionResult(EnumActionResult.SUCCESS, stack); @@ -63,6 +69,35 @@ public class ItemExperienceBook extends Item implements IVariantProvider return ret; } + public void giveOneLevelExpToPlayer(ItemStack stack, EntityPlayer player) + { + float progress = player.experience; + int expToNext = getExperienceForNextLevel(player.experienceLevel); + + float neededExp = (1 - progress) * expToNext; + float containedExp = (float) getStoredExperience(stack); + + if (containedExp >= neededExp) + { + setStoredExperience(stack, containedExp - neededExp); + player.experience = 0; + player.experienceTotal = Math.round(player.experienceTotal + neededExp); + player.experienceLevel++; + + if (player.experienceLevel % 5 == 0) + { + float f = player.experienceLevel > 30 ? 1.0F : (float) player.experienceLevel / 30.0F; + player.worldObj.playSound((EntityPlayer) null, player.posX, player.posY, player.posZ, SoundEvents.entity_player_levelup, player.getSoundCategory(), f * 0.75F, 1.0F); + } + } else + { + setStoredExperience(stack, 0); + progress += containedExp / expToNext; + player.experience = progress; + player.experienceTotal = Math.round(player.experienceTotal + containedExp); + } + } + public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player) { float progress = player.experience; @@ -76,7 +111,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider } else if (player.experienceLevel > 0) { player.experienceLevel--; - int expDeduction = getExperienceForNextLevel(player.experienceLevel - 1); + int expDeduction = getExperienceForNextLevel(player.experienceLevel); player.experienceTotal -= expDeduction; addExperience(stack, expDeduction); @@ -124,4 +159,23 @@ public class ItemExperienceBook extends Item implements IVariantProvider { return progress * getExperienceForNextLevel(currentLevel); } + + public static int getLevelForExperience(double exp) + { + if (exp <= 352) + { + return (int) Math.floor(solveParabola(1, 6, -exp)); + } else if (exp <= 1507) + { + return (int) Math.floor(solveParabola(2.5, -40.5, 360 - exp)); + } else + { + return (int) Math.floor(solveParabola(4.5, -162.5, 2220 - exp)); + } + } + + public static double solveParabola(double a, double b, double c) + { + return (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a); + } } diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 8972a7ba..f3ef9eb8 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -151,6 +151,8 @@ item.BloodMagic.itemFilter.ignoreNBT.name=NBT Item Filter item.BloodMagic.itemFilter.modItems.name=Mod Item Filter item.BloodMagic.itemFilter.oreDict.name=Ore Dictionary Item Filter +item.BloodMagic.experienceTome.name=Tome of Peritia + # Blocks tile.BloodMagic.fluid.lifeEssence.name=Life Essence @@ -349,6 +351,7 @@ tooltip.BloodMagic.currentType.steadfast=Contains: Steadfast Will tooltip.BloodMagic.experienceTome=A book used to store experience tooltip.BloodMagic.experienceTome.exp=Exp: %0.3f +tooltip.BloodMagic.experienceTome.expLevel=Level: %d # Ritual ritual.BloodMagic.testRitual=Test Ritual