Paper/patches/api/0351-Custom-Potion-Mixes.patch
Jake Potrebic 90fe0d58a5
Updated Upstream (Bukkit/CraftBukkit/Spigot) (#9825)
Upstream has released updates that appear to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
897a0a23 SPIGOT-5753: Back PotionType by a minecraft registry
255b2aa1 SPIGOT-7080: Add World#locateNearestBiome
ff984826 Remove javadoc.io doc links

CraftBukkit Changes:
71b0135cc SPIGOT-5753: Back PotionType by a minecraft registry
a6bcb8489 SPIGOT-7080: Add World#locateNearestBiome
ad0e57434 SPIGOT-7502: CraftMetaItem - cannot deserialize BlockStateTag
b3efca57a SPIGOT-6400: Use Mockito instead of InvocationHandler
38c599f9d PR-1272: Only allow one entity in CraftItem instead of two
f065271ac SPIGOT-7498: ChunkSnapshot.getBlockEmittedLight() gets 64 blocks upper in Overworld

Spigot Changes:
e0e223fe Remove javadoc.io doc links
2023-10-22 20:12:00 +01:00

224 lines
7.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 7 Oct 2021 14:34:59 -0700
Subject: [PATCH] Custom Potion Mixes
diff --git a/src/main/java/io/papermc/paper/potion/PotionMix.java b/src/main/java/io/papermc/paper/potion/PotionMix.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae1f30e88fc5048627295187214aa7a288f4c184
--- /dev/null
+++ b/src/main/java/io/papermc/paper/potion/PotionMix.java
@@ -0,0 +1,105 @@
+package io.papermc.paper.potion;
+
+import java.util.function.Predicate;
+import org.bukkit.Keyed;
+import org.bukkit.NamespacedKey;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.RecipeChoice;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+/**
+ * Represents a potion mix made in a Brewing Stand.
+ */
+@ApiStatus.NonExtendable
+public class PotionMix implements Keyed {
+
+ private final NamespacedKey key;
+ private final ItemStack result;
+ private final RecipeChoice input;
+ private final RecipeChoice ingredient;
+
+ /**
+ * Creates a new potion mix. Add it to the server with {@link org.bukkit.potion.PotionBrewer#addPotionMix(PotionMix)}.
+ *
+ * @param key a unique key for the mix
+ * @param result the resulting itemstack that will appear in the 3 bottom slots
+ * @param input the input placed into the bottom 3 slots
+ * @param ingredient the ingredient placed into the top slot
+ */
+ public PotionMix(@NotNull NamespacedKey key, @NotNull ItemStack result, @NotNull RecipeChoice input, @NotNull RecipeChoice ingredient) {
+ this.key = key;
+ this.result = result;
+ this.input = input;
+ this.ingredient = ingredient;
+ }
+
+ @Override
+ public @NotNull NamespacedKey getKey() {
+ return this.key;
+ }
+
+ /**
+ * Gets the resulting itemstack after the brew has finished.
+ *
+ * @return the result itemstack
+ */
+ public @NotNull ItemStack getResult() {
+ return this.result;
+ }
+
+ /**
+ * Gets the input for the bottom 3 slots in the brewing stand.
+ *
+ * @return the bottom 3 slot ingredients
+ */
+ public @NotNull RecipeChoice getInput() {
+ return this.input;
+ }
+
+ /**
+ * Gets the ingredient in the top slot of the brewing stand.
+ *
+ * @return the top slot input
+ */
+ public @NotNull RecipeChoice getIngredient() {
+ return this.ingredient;
+ }
+
+ /**
+ * Create a {@link RecipeChoice} based on a Predicate. These RecipeChoices are only
+ * valid for {@link PotionMix}, not anywhere else RecipeChoices may be used.
+ *
+ * @param stackPredicate a predicate for an itemstack.
+ * @return a new RecipeChoice
+ */
+ @Contract(value = "_ -> new", pure = true)
+ public static @NotNull RecipeChoice createPredicateChoice(@NotNull Predicate<ItemStack> stackPredicate) {
+ return new PredicateRecipeChoice(stackPredicate);
+ }
+
+ @Override
+ public String toString() {
+ return "PotionMix{" +
+ "result=" + this.result +
+ ", base=" + this.input +
+ ", addition=" + this.ingredient +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ PotionMix potionMix = (PotionMix) o;
+ return this.key.equals(potionMix.key) && this.result.equals(potionMix.result) && this.input.equals(potionMix.input) && this.ingredient.equals(potionMix.ingredient);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.key, this.result, this.input, this.ingredient);
+ }
+}
diff --git a/src/main/java/io/papermc/paper/potion/PredicateRecipeChoice.java b/src/main/java/io/papermc/paper/potion/PredicateRecipeChoice.java
new file mode 100644
index 0000000000000000000000000000000000000000..1bf964605f681469fb364baaa18381c090260a94
--- /dev/null
+++ b/src/main/java/io/papermc/paper/potion/PredicateRecipeChoice.java
@@ -0,0 +1,33 @@
+package io.papermc.paper.potion;
+
+import java.util.function.Predicate;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.RecipeChoice;
+import org.checkerframework.checker.nullness.qual.NonNull;
+import org.checkerframework.framework.qual.DefaultQualifier;
+import org.jetbrains.annotations.ApiStatus;
+
+@ApiStatus.Internal
+@DefaultQualifier(NonNull.class)
+record PredicateRecipeChoice(Predicate<ItemStack> itemStackPredicate) implements RecipeChoice, Cloneable {
+
+ @Override
+ @Deprecated
+ public ItemStack getItemStack() {
+ throw new UnsupportedOperationException("PredicateRecipeChoice does not support this");
+ }
+
+ @Override
+ public RecipeChoice clone() {
+ try {
+ return (PredicateRecipeChoice) super.clone();
+ } catch (CloneNotSupportedException ex) {
+ throw new AssertionError(ex);
+ }
+ }
+
+ @Override
+ public boolean test(final ItemStack itemStack) {
+ return this.itemStackPredicate.test(itemStack);
+ }
+}
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index fcd63ae1130eb2db285392e08053af915279b6e7..209a0c48e092f168744498e1ba7555279318394c 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
@@ -2492,6 +2492,15 @@ public final class Bukkit {
public static io.papermc.paper.datapack.DatapackManager getDatapackManager() {
return server.getDatapackManager();
}
+
+ /**
+ * Gets the potion brewer.
+ *
+ * @return the potion brewer
+ */
+ public static @NotNull org.bukkit.potion.PotionBrewer getPotionBrewer() {
+ return server.getPotionBrewer();
+ }
// Paper end
@NotNull
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index c2a9afee5c57d62bb6d62807eadae513b53849ba..20f95f8911852d86ea938dd73ed0d44c01b27d28 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -2169,5 +2169,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
*/
@NotNull
io.papermc.paper.datapack.DatapackManager getDatapackManager();
+
+ /**
+ * Gets the potion brewer.
+ *
+ * @return the potion brewer
+ */
+ @NotNull org.bukkit.potion.PotionBrewer getPotionBrewer();
// Paper end
}
diff --git a/src/main/java/org/bukkit/potion/PotionBrewer.java b/src/main/java/org/bukkit/potion/PotionBrewer.java
index 2072f048e10eba829cef047d854b5a22c8f055a3..eb189e170bc4975c5378f95f86ecf2cc880bd931 100644
--- a/src/main/java/org/bukkit/potion/PotionBrewer.java
+++ b/src/main/java/org/bukkit/potion/PotionBrewer.java
@@ -45,4 +45,25 @@ public interface PotionBrewer {
@NotNull
@Deprecated
public Collection<PotionEffect> getEffects(@NotNull PotionType type, boolean upgraded, boolean extended);
+
+ // Paper start
+ /**
+ * Adds a new potion mix recipe.
+ *
+ * @param potionMix the potion mix to add
+ */
+ void addPotionMix(@NotNull io.papermc.paper.potion.PotionMix potionMix);
+
+ /**
+ * Removes a potion mix recipe.
+ *
+ * @param key the key of the mix to remove
+ */
+ void removePotionMix(@NotNull org.bukkit.NamespacedKey key);
+
+ /**
+ * Resets potion mixes to their default, removing all custom ones.
+ */
+ void resetPotionMixes();
+ // Paper end
}