--- a/net/minecraft/world/entity/animal/Cow.java
+++ b/net/minecraft/world/entity/animal/Cow.java
@@ -29,8 +29,13 @@
 import net.minecraft.world.item.crafting.Ingredient;
 import net.minecraft.world.level.Level;
 import net.minecraft.world.level.block.state.BlockState;
+// CraftBukkit start
+import org.bukkit.craftbukkit.v1_19_R1.event.CraftEventFactory;
+import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack;
+// CraftBukkit end
 
 public class Cow extends Animal {
+
     public Cow(EntityType<? extends Cow> type, Level world) {
         super(type, world);
     }
@@ -48,7 +53,7 @@
     }
 
     public static AttributeSupplier.Builder createAttributes() {
-        return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.MOVEMENT_SPEED, (double)0.2F);
+        return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.MOVEMENT_SPEED, 0.20000000298023224D);
     }
 
     @Override
@@ -78,11 +83,21 @@
 
     @Override
     public InteractionResult mobInteract(Player player, InteractionHand hand) {
-        ItemStack itemStack = player.getItemInHand(hand);
-        if (itemStack.is(Items.BUCKET) && !this.isBaby()) {
+        ItemStack itemstack = player.getItemInHand(hand);
+
+        if (itemstack.is(Items.BUCKET) && !this.isBaby()) {
+            // CraftBukkit start - Got milk?
+            org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) player.level, player, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, hand); // Paper - add enumHand
+
+            if (event.isCancelled()) {
+                return InteractionResult.PASS;
+            }
+            // CraftBukkit end
+
             player.playSound(SoundEvents.COW_MILK, 1.0F, 1.0F);
-            ItemStack itemStack2 = ItemUtils.createFilledResult(itemStack, player, Items.MILK_BUCKET.getDefaultInstance());
-            player.setItemInHand(hand, itemStack2);
+            ItemStack itemstack1 = ItemUtils.createFilledResult(itemstack, player, CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit
+
+            player.setItemInHand(hand, itemstack1);
             return InteractionResult.sidedSuccess(this.level.isClientSide);
         } else {
             return super.mobInteract(player, hand);
@@ -90,8 +105,8 @@
     }
 
     @Override
-    public Cow getBreedOffspring(ServerLevel serverLevel, AgeableMob ageableMob) {
-        return EntityType.COW.create(serverLevel);
+    public Cow getBreedOffspring(ServerLevel world, AgeableMob entity) {
+        return (Cow) EntityType.COW.create(world);
     }
 
     @Override
