@@ -0,0 +1,2870 @@
+package com.lothrazar.cyclic.enchant;%0A%0Aimport com.lothrazar.cyclic.base.EnchantBase;%0Aimport com.lothrazar.cyclic.util.UtilEntity;%0Aimport net.minecraft.enchantment.EnchantmentHelper;%0Aimport net.minecraft.enchantment.EnchantmentType;%0Aimport net.minecraft.entity.item.EnderPearlEntity;%0Aimport net.minecraft.entity.player.PlayerEntity;%0Aimport net.minecraft.inventory.EquipmentSlotType;%0Aimport net.minecraft.item.ItemStack;%0Aimport net.minecraft.item.Items;%0Aimport net.minecraft.item.SwordItem;%0Aimport net.minecraft.util.SoundCategory;%0Aimport net.minecraft.util.SoundEvents;%0Aimport net.minecraft.util.math.vector.Vector3d;%0Aimport net.minecraftforge.api.distmarker.Dist;%0Aimport net.minecraftforge.api.distmarker.OnlyIn;%0Aimport net.minecraftforge.common.MinecraftForge;%0Aimport net.minecraftforge.event.entity.player.PlayerInteractEvent;%0Aimport net.minecraftforge.eventbus.api.SubscribeEvent;%0A%0Apublic class EnchantPearl extends EnchantBase %7B%0A%0A  public EnchantPearl(Rarity rarityIn, EnchantmentType typeIn, EquipmentSlotType... slots) %7B%0A    super(rarityIn, typeIn, slots);%0A    MinecraftForge.EVENT_BUS.register(this);%0A  %7D%0A%0A  private static final int COOLDOWN = 6 * 20;%0A  private static final float VELOCITY = 1.5F; //Same as EnderPearlItem%0A  private static final float INNACCURACY = 1F; //Same as EnderPearlItem%0A  private static final int DURABILITY_DAMAGE = 3;%0A%0A  @Override%0A  public int getMaxLevel() %7B return 3; %7D%0A%0A  @Override%0A  public boolean canApply(ItemStack stack) %7B%0A    boolean yes = stack.getItem() == Items.BOOK %7C%7C%0A            stack.getItem() instanceof SwordItem;%0A    return yes;%0A  %7D%0A%0A  @Override%0A  public boolean canApplyAtEnchantingTable(ItemStack stack) %7B%0A    return this.canApply(stack);%0A  %7D%0A%0A  @OnlyIn(Dist.CLIENT)%0A  @SubscribeEvent%0A  public void something(PlayerInteractEvent.RightClickItem event) %7B%0A    if (!event.getWorld().isRemote) %7B%0A      int level = EnchantmentHelper.getEnchantmentLevel(this, event.getItemStack());%0A      if (level %3E 0) %7B%0A        int adjustedCooldown = COOLDOWN / level;%0A        PlayerEntity player = event.getPlayer();%0A        if (player.getCooldownTracker().hasCooldown(event.getItemStack().getItem())) %7B%0A          return;%0A        %7D%0A        EnderPearlEntity pearl = new EnderPearlEntity(event.getWorld(), player);%0A        Vector3d lookVector = player.getLookVec();%0A        pearl.shoot(lookVector.getX(), lookVector.getY(), lookVector.getZ(), VELOCITY, INNACCURACY);%0A        UtilEntity.setCooldownItem(player, event.getItemStack().getItem(), adjustedCooldown);%0A        event.getWorld().playSound((PlayerEntity)null, player.getPosX(), player.getPosY(), player.getPosZ(), SoundEvents.ENTITY_ENDER_PEARL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (event.getWorld().rand.nextFloat() * 0.4F + 0.8F));%0A        event.getWorld().addEntity(pearl);%0A        event.getItemStack().damageItem(DURABILITY_DAMAGE, player, (e) -%3E %7B%7D);%0A      %7D%0A    %7D%0A  %7D%0A%7D%0A

Add Ender enchant, which throws Ender Pearls on right click with a cooldown that decreases as enchantment level increases