--- a/net/minecraft/world/item/component/Consumable.java
+++ b/net/minecraft/world/item/component/Consumable.java
@@ -84,13 +_,35 @@
 
         stack.getAllOfType(ConsumableListener.class).forEach(consumableListener -> consumableListener.onConsume(level, entity, stack, this));
         if (!level.isClientSide) {
-            this.onConsumeEffects.forEach(consumeEffect -> consumeEffect.apply(level, stack, entity));
+            // CraftBukkit start
+            org.bukkit.event.entity.EntityPotionEffectEvent.Cause cause;
+            if (stack.is(net.minecraft.world.item.Items.MILK_BUCKET)) {
+                cause = org.bukkit.event.entity.EntityPotionEffectEvent.Cause.MILK;
+            } else if (stack.is(net.minecraft.world.item.Items.POTION)) {
+                cause = org.bukkit.event.entity.EntityPotionEffectEvent.Cause.POTION_DRINK;
+            } else {
+                cause = org.bukkit.event.entity.EntityPotionEffectEvent.Cause.FOOD;
+            }
+
+            this.onConsumeEffects.forEach(consumeEffect -> consumeEffect.apply(level, stack, entity, cause));
+            // CraftBukkit end
         }
 
         entity.gameEvent(this.animation == ItemUseAnimation.DRINK ? GameEvent.DRINK : GameEvent.EAT);
         stack.consume(1, entity);
         return stack;
     }
+
+    // CraftBukkit start
+    public void cancelUsingItem(ServerPlayer player, ItemStack stack) {
+        final java.util.List<net.minecraft.network.protocol.Packet<? super net.minecraft.network.protocol.game.ClientGamePacketListener>> packets = new it.unimi.dsi.fastutil.objects.ObjectArrayList<>(); // Paper - properly resend entities - collect packets for bundle
+        stack.getAllOfType(ConsumableListener.class).forEach(listener -> {
+            listener.cancelUsingItem(player, stack, packets); // Paper - properly resend entities - collect packets for bundle
+        });
+        player.server.getPlayerList().sendActiveEffects(player, packets::add); // Paper - properly resend entities - collect packets for bundle
+        player.connection.send(new net.minecraft.network.protocol.game.ClientboundBundlePacket(packets));
+    }
+    // CraftBukkit end
 
     public boolean canConsume(LivingEntity entity, ItemStack stack) {
         FoodProperties foodProperties = stack.get(DataComponents.FOOD);
