--- a/net/minecraft/item/BowItem.java
+++ b/net/minecraft/item/BowItem.java
@@ -24,18 +24,23 @@
          PlayerEntity playerentity = (PlayerEntity)p_77615_3_;
          boolean flag = playerentity.field_71075_bZ.field_75098_d || EnchantmentHelper.func_77506_a(Enchantments.field_185312_x, p_77615_1_) > 0;
          ItemStack itemstack = playerentity.func_213356_f(p_77615_1_);
+
+         int i = this.func_77626_a(p_77615_1_) - p_77615_4_;
+         i = net.minecraftforge.event.ForgeEventFactory.onArrowLoose(p_77615_1_, p_77615_2_, playerentity, i, !itemstack.func_190926_b() || flag);
+         if (i < 0) return;
+
          if (!itemstack.func_190926_b() || flag) {
             if (itemstack.func_190926_b()) {
                itemstack = new ItemStack(Items.field_151032_g);
             }
 
-            int i = this.func_77626_a(p_77615_1_) - p_77615_4_;
             float f = func_185059_b(i);
             if (!((double)f < 0.1D)) {
-               boolean flag1 = flag && itemstack.func_77973_b() == Items.field_151032_g;
+               boolean flag1 = playerentity.field_71075_bZ.field_75098_d || (itemstack.func_77973_b() instanceof ArrowItem && ((ArrowItem)itemstack.func_77973_b()).isInfinite(itemstack, p_77615_1_, playerentity));
                if (!p_77615_2_.field_72995_K) {
                   ArrowItem arrowitem = (ArrowItem)(itemstack.func_77973_b() instanceof ArrowItem ? itemstack.func_77973_b() : Items.field_151032_g);
                   AbstractArrowEntity abstractarrowentity = arrowitem.func_200887_a(p_77615_2_, itemstack, playerentity);
+                  abstractarrowentity = customArrow(abstractarrowentity);
                   abstractarrowentity.func_234612_a_(playerentity, playerentity.field_70125_A, playerentity.field_70177_z, 0.0F, f * 3.0F, 1.0F);
                   if (f == 1.0F) {
                      abstractarrowentity.func_70243_d(true);
@@ -100,6 +105,10 @@
    public ActionResult<ItemStack> func_77659_a(World p_77659_1_, PlayerEntity p_77659_2_, Hand p_77659_3_) {
       ItemStack itemstack = p_77659_2_.func_184586_b(p_77659_3_);
       boolean flag = !p_77659_2_.func_213356_f(itemstack).func_190926_b();
+
+      ActionResult<ItemStack> ret = net.minecraftforge.event.ForgeEventFactory.onArrowNock(itemstack, p_77659_1_, p_77659_2_, p_77659_3_, flag);
+      if (ret != null) return ret;
+
       if (!p_77659_2_.field_71075_bZ.field_75098_d && !flag) {
          return ActionResult.func_226251_d_(itemstack);
       } else {
@@ -112,6 +121,10 @@
       return field_220007_a;
    }
 
+   public AbstractArrowEntity customArrow(AbstractArrowEntity arrow) {
+      return arrow;
+   }
+
    public int func_230305_d_() {
       return 15;
    }
