Finished the behaviour of the experience book.

This commit is contained in:
WayofTime 2016-04-03 08:54:15 -04:00
parent dbedcf0745
commit fe5a544e9d
2 changed files with 60 additions and 3 deletions

View file

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; 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"));
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 @Override
@ -49,7 +54,8 @@ public class ItemExperienceBook extends Item implements IVariantProvider
{ {
if (player.isSneaking()) if (player.isSneaking())
absorbOneLevelExpFromPlayer(stack, player); absorbOneLevelExpFromPlayer(stack, player);
else
giveOneLevelExpToPlayer(stack, player);
} }
return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack); return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
@ -63,6 +69,35 @@ public class ItemExperienceBook extends Item implements IVariantProvider
return ret; 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) public void absorbOneLevelExpFromPlayer(ItemStack stack, EntityPlayer player)
{ {
float progress = player.experience; float progress = player.experience;
@ -76,7 +111,7 @@ public class ItemExperienceBook extends Item implements IVariantProvider
} else if (player.experienceLevel > 0) } else if (player.experienceLevel > 0)
{ {
player.experienceLevel--; player.experienceLevel--;
int expDeduction = getExperienceForNextLevel(player.experienceLevel - 1); int expDeduction = getExperienceForNextLevel(player.experienceLevel);
player.experienceTotal -= expDeduction; player.experienceTotal -= expDeduction;
addExperience(stack, expDeduction); addExperience(stack, expDeduction);
@ -124,4 +159,23 @@ public class ItemExperienceBook extends Item implements IVariantProvider
{ {
return progress * getExperienceForNextLevel(currentLevel); 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);
}
} }

View file

@ -151,6 +151,8 @@ item.BloodMagic.itemFilter.ignoreNBT.name=NBT Item Filter
item.BloodMagic.itemFilter.modItems.name=Mod Item Filter item.BloodMagic.itemFilter.modItems.name=Mod Item Filter
item.BloodMagic.itemFilter.oreDict.name=Ore Dictionary Item Filter item.BloodMagic.itemFilter.oreDict.name=Ore Dictionary Item Filter
item.BloodMagic.experienceTome.name=Tome of Peritia
# Blocks # Blocks
tile.BloodMagic.fluid.lifeEssence.name=Life Essence 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=A book used to store experience
tooltip.BloodMagic.experienceTome.exp=Exp: %0.3f tooltip.BloodMagic.experienceTome.exp=Exp: %0.3f
tooltip.BloodMagic.experienceTome.expLevel=Level: %d
# Ritual # Ritual
ritual.BloodMagic.testRitual=Test Ritual ritual.BloodMagic.testRitual=Test Ritual