From 8e8bb348c6a563b728c2d008151ac52da3ec374b Mon Sep 17 00:00:00 2001
From: Tamion <70228790+notTamion@users.noreply.github.com>
Date: Sun, 5 Nov 2023 00:24:06 +0100
Subject: [PATCH] Add more API to LingeringPotionSplashEvent (#9901)

* Add createAreaEffectCloud API

* Add missing NotNull

* Add missing Paper comments

* Better solution

* Better naming

* New patch and rename

* rename patch
---
 patches/api/Expand-LingeringPotion-API.patch  | 45 +++++++++++++++++++
 .../server/Expand-LingeringPotion-API.patch   | 19 ++++++++
 2 files changed, 64 insertions(+)
 create mode 100644 patches/api/Expand-LingeringPotion-API.patch
 create mode 100644 patches/server/Expand-LingeringPotion-API.patch

diff --git a/patches/api/Expand-LingeringPotion-API.patch b/patches/api/Expand-LingeringPotion-API.patch
new file mode 100644
index 0000000000..e026fefe14
--- /dev/null
+++ b/patches/api/Expand-LingeringPotion-API.patch
@@ -0,0 +1,45 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Tamion <70228790+notTamion@users.noreply.github.com>
+Date: Sat, 4 Nov 2023 23:56:23 +0100
+Subject: [PATCH] Expand LingeringPotion API
+
+
+diff --git a/src/main/java/org/bukkit/event/entity/LingeringPotionSplashEvent.java b/src/main/java/org/bukkit/event/entity/LingeringPotionSplashEvent.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/event/entity/LingeringPotionSplashEvent.java
++++ b/src/main/java/org/bukkit/event/entity/LingeringPotionSplashEvent.java
+@@ -0,0 +0,0 @@ public class LingeringPotionSplashEvent extends ProjectileHitEvent implements Ca
+     private static final HandlerList handlers = new HandlerList();
+     private boolean cancelled;
+     private final AreaEffectCloud entity;
++    private boolean allowEmptyAreaEffectCreation; // Paper
+ 
+     @Deprecated
+     public LingeringPotionSplashEvent(@NotNull final ThrownPotion potion, @NotNull final AreaEffectCloud entity) {
+@@ -0,0 +0,0 @@ public class LingeringPotionSplashEvent extends ProjectileHitEvent implements Ca
+         return entity;
+     }
+ 
++    // Paper start
++    /**
++     * Sets if an Empty AreaEffectCloud may be created
++     *
++     * @param allowEmptyAreaEffectCreation If an Empty AreaEffectCloud may be created
++     */
++    public void allowsEmptyCreation(boolean allowEmptyAreaEffectCreation) {
++        this.allowEmptyAreaEffectCreation = allowEmptyAreaEffectCreation;
++    }
++
++    /**
++     * Gets if an empty AreaEffectCloud may be created
++     *
++     * @return if an empty AreaEffectCloud may be created
++     */
++    public boolean allowsEmptyCreation() {
++        return allowEmptyAreaEffectCreation;
++    }
++    // Paper end
++
+     @Override
+     public boolean isCancelled() {
+         return cancelled;
diff --git a/patches/server/Expand-LingeringPotion-API.patch b/patches/server/Expand-LingeringPotion-API.patch
new file mode 100644
index 0000000000..575da86bd0
--- /dev/null
+++ b/patches/server/Expand-LingeringPotion-API.patch
@@ -0,0 +1,19 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Tamion <70228790+notTamion@users.noreply.github.com>
+Date: Sat, 4 Nov 2023 23:57:05 +0100
+Subject: [PATCH] Expand LingeringPotion API
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java
++++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java
+@@ -0,0 +0,0 @@ public class ThrownPotion extends ThrowableItemProjectile implements ItemSupplie
+ 
+         // CraftBukkit start
+         org.bukkit.event.entity.LingeringPotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callLingeringPotionSplashEvent(this, position, entityareaeffectcloud);
+-        if (!(event.isCancelled() || entityareaeffectcloud.isRemoved() || (noEffects && entityareaeffectcloud.effects.isEmpty() && entityareaeffectcloud.getPotion().getEffects().isEmpty()))) { // Paper - don't spawn area effect cloud if the effects were empty and not changed during the event handling
++        if (!(event.isCancelled() || entityareaeffectcloud.isRemoved() || (!event.allowsEmptyCreation() && (noEffects && entityareaeffectcloud.effects.isEmpty() && entityareaeffectcloud.getPotion().getEffects().isEmpty())))) { // Paper - don't spawn area effect cloud if the effects were empty and not changed during the event handling
+             this.level().addFreshEntity(entityareaeffectcloud);
+         } else {
+             entityareaeffectcloud.discard();