--- a/net/minecraft/world/entity/projectile/ThrownExperienceBottle.java
+++ b/net/minecraft/world/entity/projectile/ThrownExperienceBottle.java
@@ -12,6 +12,7 @@
 import net.minecraft.world.phys.HitResult;
 
 public class ThrownExperienceBottle extends ThrowableItemProjectile {
+
     public ThrownExperienceBottle(EntityType<? extends ThrownExperienceBottle> type, Level world) {
         super(type, world);
     }
@@ -38,9 +39,19 @@
     protected void onHit(HitResult hitResult) {
         super.onHit(hitResult);
         if (this.level() instanceof ServerLevel) {
-            this.level().levelEvent(2002, this.blockPosition(), PotionUtils.getColor(Potions.WATER));
+            // CraftBukkit - moved to after event
+            // this.level().levelEvent(2002, this.blockPosition(), PotionUtil.getColor(Potions.WATER));
             int i = 3 + this.level().random.nextInt(5) + this.level().random.nextInt(5);
-            ExperienceOrb.award((ServerLevel)this.level(), this.position(), i);
+
+            // CraftBukkit start
+            org.bukkit.event.entity.ExpBottleEvent event = org.bukkit.craftbukkit.v1_20_R2.event.CraftEventFactory.callExpBottleEvent(this, i);
+            i = event.getExperience();
+            if (event.getShowEffect()) {
+                this.level().levelEvent(2002, this.blockPosition(), PotionUtils.getColor(Potions.WATER));
+            }
+            // CraftBukkit end
+
+            ExperienceOrb.award((ServerLevel) this.level(), this.position(), i, org.bukkit.entity.ExperienceOrb.SpawnReason.EXP_BOTTLE, this.getOwner(), this); // Paper
             this.discard();
         }
 
