--- a/net/minecraft/world/entity/projectile/ThrownLingeringPotion.java
+++ b/net/minecraft/world/entity/projectile/ThrownLingeringPotion.java
@@ -25,12 +_,12 @@
     }
 
     @Override
-    protected Item getDefaultItem() {
+    public Item getDefaultItem() {
         return Items.LINGERING_POTION;
     }
 
     @Override
-    public void onHitAsPotion(ServerLevel level, ItemStack stack, @Nullable Entity entity) {
+    public boolean onHitAsPotion(ServerLevel level, ItemStack stack, @Nullable Entity entity, @Nullable net.minecraft.world.phys.HitResult hitResult) { // Paper - Pass 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);
@@ -42,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
     }
 }
