Added Tome of Peritia

Final push before the build.
This commit is contained in:
WayofTime 2020-11-21 10:54:40 -05:00
parent 9b79acaad6
commit 952b6aeeb0
11 changed files with 348 additions and 1 deletions

View file

@ -94,6 +94,7 @@ public class GeneratorBaseRecipes extends BaseRecipeProvider
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.RITUAL_READER.get()).key('s', BloodMagicItems.DEMONIC_SLATE.get()).key('g', Tags.Items.GLASS).key('i', Tags.Items.INGOTS_GOLD).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MASTER.get())).patternLine("gog").patternLine("isi").patternLine(" s ").addCriterion("has_master_orb", hasItem(BloodMagicItems.MASTER_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("ritual_reader"));
ShapedRecipeBuilder.shapedRecipe(BloodMagicItems.EXPERIENCE_TOME.get()).key('b', Items.ENCHANTED_BOOK).key('s', Tags.Items.STRING).key('e', Tags.Items.STORAGE_BLOCKS_LAPIS).key('g', Tags.Items.INGOTS_GOLD).key('l', BloodMagicItems.IMBUED_SLATE.get()).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_MAGICIAN.get())).patternLine("ses").patternLine("lbl").patternLine("gog").addCriterion("has_magician_orb", hasItem(BloodMagicItems.MAGICIAN_BLOOD_ORB.get())).build(consumer, BloodMagic.rl("experience_tome"));
// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.MIMIC.get()).key('b', itemIn)
// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', Ingredient.fromItems(Items.DIAMOND)).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_standard"));
// ShapedRecipeBuilder.shapedRecipe(BloodMagicBlocks.SPEED_RUNE.get()).key('s', Items.GLASS).key('o', IngredientBloodOrb.fromOrb(BloodMagicItems.ORB_WEAK.get())).patternLine("sss").patternLine("sos").patternLine("sss").addCriterion("has_diamond", hasItem(Items.DIAMOND)).build(consumer, new ResourceLocation(BloodMagic.MODID, "speed_rune_from_orb"));

View file

@ -109,6 +109,10 @@ public class GeneratorLanguage extends LanguageProvider
add("itemGroup.bloodmagictab", "Blood Magic");
add("tooltip.bloodmagic.experienceTome", "A book used to store experience");
add("tooltip.bloodmagic.experienceTome.exp", "Exp: %0.3f");
add("tooltip.bloodmagic.experienceTome.expLevel", "Level: %d");
// Ritual info
add("tooltip.bloodmagic.diviner.currentRitual", "Current Ritual: %s");
add("tooltip.bloodmagic.diviner.blankRune", "Blank Runes: %d");
@ -454,6 +458,8 @@ public class GeneratorLanguage extends LanguageProvider
addItem(BloodMagicItems.BASIC_CUTTING_FLUID, "Basic Cutting Fluid");
addItem(BloodMagicItems.EXPERIENCE_TOME, "Tome of Peritia");
// Alchemy Items
addItem(BloodMagicItems.PLANT_OIL, "Plant Oil");

View file

@ -128,6 +128,7 @@ public class BloodMagicItems
public static final RegistryObject<Item> DAGGER_OF_SACRIFICE = BASICITEMS.register("daggerofsacrifice", () -> new ItemDaggerOfSacrifice());
public static final RegistryObject<Item> LAVA_CRYSTAL = BASICITEMS.register("lavacrystal", () -> new ItemLavaCrystal());
public static final RegistryObject<Item> WEAK_BLOOD_SHARD = BASICITEMS.register("weakbloodshard", () -> new ItemBase());
public static final RegistryObject<Item> EXPERIENCE_TOME = BASICITEMS.register("experiencebook", () -> new ItemExperienceBook());
// Ritual stuffs
public static final RegistryObject<Item> WEAK_ACTIVATION_CRYSTAL = BASICITEMS.register("activationcrystalweak", () -> new ItemActivationCrystal(ItemActivationCrystal.CrystalType.WEAK));

View file

@ -0,0 +1,209 @@
package wayoftime.bloodmagic.common.item;
import java.util.List;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.SoundEvents;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.util.BMLog;
import wayoftime.bloodmagic.util.helper.NBTHelper;
public class ItemExperienceBook extends Item
{
public ItemExperienceBook()
{
super(new Item.Properties().maxStackSize(1).group(BloodMagic.TAB));
}
@Override
@OnlyIn(Dist.CLIENT)
public boolean hasEffect(ItemStack stack)
{
return true;
}
@Override
@OnlyIn(Dist.CLIENT)
public void addInformation(ItemStack stack, World world, List<ITextComponent> tooltip, ITooltipFlag flag)
{
tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.experienceTome"));
if (!stack.hasTag())
return;
double storedExp = getStoredExperience(stack);
tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.experienceTome.exp", (int) storedExp));
tooltip.add(new TranslationTextComponent("tooltip.bloodmagic.experienceTome.expLevel", (int) getLevelForExperience(storedExp)));
}
@Override
public ActionResult<ItemStack> onItemRightClick(World world, PlayerEntity player, Hand hand)
{
ItemStack stack = player.getHeldItem(hand);
if (!world.isRemote)
{
if (player.isSneaking())
absorbOneLevelExpFromPlayer(stack, player);
else
giveOneLevelExpToPlayer(stack, player);
}
return new ActionResult<>(ActionResultType.SUCCESS, stack);
}
public void giveOneLevelExpToPlayer(ItemStack stack, PlayerEntity player)
{
float progress = player.experience;
int expToNext = getExperienceForNextLevel(player.experienceLevel);
int neededExp = (int) Math.ceil((1 - progress) * expToNext);
float containedExp = (float) getStoredExperience(stack);
BMLog.DEBUG.info("Needed: " + neededExp + ", contained: " + containedExp + ", exp to next: " + expToNext);
if (containedExp >= neededExp)
{
setStoredExperience(stack, containedExp - neededExp);
addPlayerXP(player, neededExp);
if (player.experienceLevel % 5 == 0)
{
float f = player.experienceLevel > 30 ? 1.0F : (float) player.experienceLevel / 30.0F;
player.getEntityWorld().playSound(null, player.getPosX(), player.getPosY(), player.getPosZ(), SoundEvents.ENTITY_PLAYER_LEVELUP, player.getSoundCategory(), f * 0.75F, 1.0F);
}
} else
{
setStoredExperience(stack, 0);
addPlayerXP(player, (int) containedExp);
}
}
public void absorbOneLevelExpFromPlayer(ItemStack stack, PlayerEntity player)
{
float progress = player.experience;
if (progress > 0)
{
int expDeduction = (int) getExperienceAcquiredToNext(player);
if (expDeduction > 0)
{
addPlayerXP(player, -expDeduction);
addExperience(stack, expDeduction);
}
} else if (progress == 0 && player.experienceLevel > 0)
{
int expDeduction = getExperienceForNextLevel(player.experienceLevel - 1);
addPlayerXP(player, -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(PlayerEntity player)
{
return (int) (getExperienceForLevel(player.experienceLevel) + (player.experience * player.xpBarCap()));
}
public static void addPlayerXP(PlayerEntity 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)
{
NBTHelper.checkNBT(stack);
CompoundNBT tag = stack.getTag();
tag.putDouble("experience", exp);
}
public static double getStoredExperience(ItemStack stack)
{
NBTHelper.checkNBT(stack);
CompoundNBT tag = stack.getTag();
return tag.getDouble("experience");
}
public static void addExperience(ItemStack stack, double exp)
{
setStoredExperience(stack, getStoredExperience(stack) + exp);
}
public static int getExperienceForNextLevel(int currentLevel)
{
if (currentLevel < 16)
{
return 2 * currentLevel + 7;
} else if (currentLevel < 31)
{
return 5 * currentLevel - 38;
} else
{
return 9 * currentLevel - 158;
}
}
// TODO: Change to calculation form.
public static int getExperienceForLevel(int level)
{
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(PlayerEntity player)
{
return player.experience * player.xpBarCap();
}
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

@ -1,19 +1,27 @@
package wayoftime.bloodmagic.util.handler.event;
import java.util.Map.Entry;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.Tags;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerXpEvent;
import net.minecraftforge.event.world.BlockEvent.BlockToolInteractEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.api.item.IBindable;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.common.item.ItemExperienceBook;
import wayoftime.bloodmagic.core.data.Binding;
import wayoftime.bloodmagic.core.data.SoulNetwork;
import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler;
@ -88,6 +96,48 @@ public class GenericHandler
}
}
// Experience Tome
@SubscribeEvent(priority = EventPriority.LOWEST)
public void onExperiencePickup(PlayerXpEvent.PickupXp event)
{
PlayerEntity player = event.getPlayer();
Entry<EquipmentSlotType, ItemStack> entry = EnchantmentHelper.getRandomItemWithEnchantment(Enchantments.MENDING, player);
if (entry != null)
{
ItemStack itemStack = entry.getValue();
if (!itemStack.isEmpty() && itemStack.isDamaged())
{
int i = Math.min(xpToDurability(event.getOrb().xpValue), itemStack.getDamage());
event.getOrb().xpValue -= durabilityToXp(i);
itemStack.setDamage(itemStack.getDamage() - i);
}
}
if (!player.getEntityWorld().isRemote)
{
for (ItemStack stack : player.inventory.mainInventory)
{
if (stack.getItem() instanceof ItemExperienceBook)
{
ItemExperienceBook.addExperience(stack, event.getOrb().xpValue);
event.getOrb().xpValue = 0;
break;
}
}
}
}
private static int xpToDurability(int xp)
{
return xp * 2;
}
private static int durabilityToXp(int durability)
{
return durability / 2;
}
public static void sendPlayerDemonWillAura(PlayerEntity player)
{
if (player instanceof ServerPlayerEntity)