--- a/net/minecraft/world/entity/projectile/ThrownSplashPotion.java
+++ b/net/minecraft/world/entity/projectile/ThrownSplashPotion.java
@@ -31,17 +_,18 @@
     }
 
     @Override
-    protected Item getDefaultItem() {
+    public Item getDefaultItem() {
         return Items.SPLASH_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 - Add HitResult parameter // Paper - More projectile API
         PotionContents potionContents = stack.getOrDefault(DataComponents.POTION_CONTENTS, PotionContents.EMPTY);
         float orDefault = stack.getOrDefault(DataComponents.POTION_DURATION_SCALE, 1.0F);
         Iterable<MobEffectInstance> allEffects = potionContents.getAllEffects();
         AABB aabb = this.getBoundingBox().inflate(4.0, 2.0, 4.0);
         List<LivingEntity> entitiesOfClass = this.level().getEntitiesOfClass(LivingEntity.class, aabb);
+        java.util.Map<org.bukkit.entity.LivingEntity, Double> affected = new java.util.HashMap<>(); // CraftBukkit
         if (!entitiesOfClass.isEmpty()) {
             Entity effectSource = this.getEffectSource();
 
@@ -50,12 +_,31 @@
                     double d = this.distanceToSqr(livingEntity);
                     if (d < 16.0) {
                         double d1;
+                        // Paper - diff on change, used when calling the splash event for water splash potions
                         if (livingEntity == entity) {
                             d1 = 1.0;
                         } else {
                             d1 = 1.0 - Math.sqrt(d) / 4.0;
                         }
 
+                        // CraftBukkit start
+                        affected.put(livingEntity.getBukkitLivingEntity(), d1);
+                    }
+                }
+            }
+        }
+        org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, hitResult, affected);
+        if (!event.isCancelled() && !entitiesOfClass.isEmpty()) { // do not process effects if there are no effects to process
+            Entity effectSource = this.getEffectSource();
+            for (org.bukkit.entity.LivingEntity victim : event.getAffectedEntities()) {
+                if (!(victim instanceof org.bukkit.craftbukkit.entity.CraftLivingEntity craftLivingEntity)) {
+                    continue;
+                }
+                LivingEntity livingEntity = craftLivingEntity.getHandle();
+                double d1 = event.getIntensity(victim);
+                {
+                    {
+                        // CraftBukkit end
                         for (MobEffectInstance mobEffectInstance : allEffects) {
                             Holder<MobEffect> effect = mobEffectInstance.getEffect();
                             if (effect.value().isInstantenous()) {
@@ -66,7 +_,7 @@
                                     effect, i, mobEffectInstance.getAmplifier(), mobEffectInstance.isAmbient(), mobEffectInstance.isVisible()
                                 );
                                 if (!mobEffectInstance1.endsWithin(20)) {
-                                    livingEntity.addEffect(mobEffectInstance1, effectSource);
+                                    livingEntity.addEffect(mobEffectInstance1, effectSource, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.POTION_SPLASH); // CraftBukkit
                                 }
                             }
                         }
@@ -74,5 +_,6 @@
                 }
             }
         }
+        return !event.isCancelled(); // Paper - Fix potions splash events
     }
 }
