aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0351-Custom-Potion-Mixes.patch
blob: ebb1ae34fe16637d1cdb5f0b1d5b510ee4762f17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
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
 }