--- a/net/minecraft/world/entity/projectile/ThrownLingeringPotion.java
+++ b/net/minecraft/world/entity/projectile/ThrownLingeringPotion.java
@@ -29,7 +_,7 @@
     }
 
     @Override
-    public void onHitAsPotion(ServerLevel level, ItemStack stack, HitResult hitResult) {
+    public boolean onHitAsPotion(ServerLevel level, ItemStack stack, HitResult hitResult) { // Paper - More projectile API
         AreaEffectCloud areaEffectCloud = new AreaEffectCloud(this.level(), this.getX(), this.getY(), this.getZ());
         if (this.getOwner() instanceof LivingEntity livingEntity) {
             areaEffectCloud.setOwner(livingEntity);
@@ -41,6 +_,15 @@
         areaEffectCloud.setWaitTime(10);
         areaEffectCloud.setRadiusPerTick(-areaEffectCloud.getRadius() / areaEffectCloud.getDuration());
         areaEffectCloud.applyComponentsFromItemStack(stack);
+        boolean noEffects = this.getItem().getOrDefault(net.minecraft.core.component.DataComponents.POTION_CONTENTS, net.minecraft.world.item.alchemy.PotionContents.EMPTY).hasEffects(); // Paper - Fix potions splash events
+        // CraftBukkit start
+        org.bukkit.event.entity.LingeringPotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callLingeringPotionSplashEvent(this, hitResult, areaEffectCloud);
+        if (!(event.isCancelled() || areaEffectCloud.isRemoved() || (!event.allowsEmptyCreation() && (noEffects && !areaEffectCloud.potionContents.hasEffects())))) { // Paper - don't spawn area effect cloud if the effects were empty and not changed during the event handling
         level.addFreshEntity(areaEffectCloud);
+        } else {
+            areaEffectCloud.discard(null);
+        }
+        // CraftBukkit end
+        return !event.isCancelled(); // Paper - Fix potions splash events
     }
 }
