--- a/net/minecraft/world/item/FishingRodItem.java
+++ b/net/minecraft/world/item/FishingRodItem.java
@@ -12,53 +12,55 @@
 import net.minecraft.world.level.Level;
 import net.minecraft.world.level.gameevent.GameEvent;
 
+// CraftBukkit start
+import org.bukkit.event.player.PlayerFishEvent;
+import org.bukkit.craftbukkit.CraftEquipmentSlot;
+// CraftBukkit end
+
 public class FishingRodItem extends Item {
+
     public FishingRodItem(Item.Properties settings) {
         super(settings);
     }
 
     @Override
     public InteractionResultHolder<ItemStack> use(Level world, Player user, InteractionHand hand) {
-        ItemStack itemStack = user.getItemInHand(hand);
+        ItemStack itemstack = user.getItemInHand(hand);
+        int i;
+
         if (user.fishing != null) {
             if (!world.isClientSide) {
-                int i = user.fishing.retrieve(itemStack);
-                itemStack.hurtAndBreak(i, user, LivingEntity.getSlotForHand(hand));
+                i = user.fishing.retrieve(hand, itemstack); // Paper - Add hand parameter to PlayerFishEvent
+                itemstack.hurtAndBreak(i, user, LivingEntity.getSlotForHand(hand));
             }
 
-            world.playSound(
-                null,
-                user.getX(),
-                user.getY(),
-                user.getZ(),
-                SoundEvents.FISHING_BOBBER_RETRIEVE,
-                SoundSource.NEUTRAL,
-                1.0F,
-                0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)
-            );
+            world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.FISHING_BOBBER_RETRIEVE, SoundSource.NEUTRAL, 1.0F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
             user.gameEvent(GameEvent.ITEM_INTERACT_FINISH);
         } else {
-            world.playSound(
-                null,
-                user.getX(),
-                user.getY(),
-                user.getZ(),
-                SoundEvents.FISHING_BOBBER_THROW,
-                SoundSource.NEUTRAL,
-                0.5F,
-                0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)
-            );
+            // world.playSound((EntityHuman) null, entityhuman.getX(), entityhuman.getY(), entityhuman.getZ(), SoundEffects.FISHING_BOBBER_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
             if (!world.isClientSide) {
-                int j = EnchantmentHelper.getFishingSpeedBonus(itemStack);
-                int k = EnchantmentHelper.getFishingLuckBonus(itemStack);
-                world.addFreshEntity(new FishingHook(user, world, k, j));
+                i = EnchantmentHelper.getFishingSpeedBonus(itemstack);
+                int j = EnchantmentHelper.getFishingLuckBonus(itemstack);
+
+                // CraftBukkit start
+                FishingHook entityfishinghook = new FishingHook(user, world, j, i);
+                PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) user.getBukkitEntity(), null, (org.bukkit.entity.FishHook) entityfishinghook.getBukkitEntity(), CraftEquipmentSlot.getHand(hand), PlayerFishEvent.State.FISHING);
+                world.getCraftServer().getPluginManager().callEvent(playerFishEvent);
+
+                if (playerFishEvent.isCancelled()) {
+                    user.fishing = null;
+                    return InteractionResultHolder.pass(itemstack);
+                }
+                world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.FISHING_BOBBER_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F));
+                world.addFreshEntity(entityfishinghook);
+                // CraftBukkit end
             }
 
             user.awardStat(Stats.ITEM_USED.get(this));
             user.gameEvent(GameEvent.ITEM_INTERACT_START);
         }
 
-        return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide());
+        return InteractionResultHolder.sidedSuccess(itemstack, world.isClientSide());
     }
 
     @Override
