aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0711-Custom-Potion-Mixes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0711-Custom-Potion-Mixes.patch')
-rw-r--r--patches/server/0711-Custom-Potion-Mixes.patch247
1 files changed, 247 insertions, 0 deletions
diff --git a/patches/server/0711-Custom-Potion-Mixes.patch b/patches/server/0711-Custom-Potion-Mixes.patch
new file mode 100644
index 0000000000..edb4c6d4f4
--- /dev/null
+++ b/patches/server/0711-Custom-Potion-Mixes.patch
@@ -0,0 +1,247 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Thu, 7 Oct 2021 14:34:55 -0700
+Subject: [PATCH] Custom Potion Mixes
+
+
+diff --git a/src/main/java/io/papermc/paper/potion/PaperPotionMix.java b/src/main/java/io/papermc/paper/potion/PaperPotionMix.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..7ea357ac2f3a93db4ebdf24b5072be7d1cad3e33
+--- /dev/null
++++ b/src/main/java/io/papermc/paper/potion/PaperPotionMix.java
+@@ -0,0 +1,21 @@
++package io.papermc.paper.potion;
++
++import java.util.function.Predicate;
++import net.minecraft.world.item.ItemStack;
++import org.bukkit.craftbukkit.inventory.CraftItemStack;
++import org.bukkit.craftbukkit.inventory.CraftRecipe;
++import org.bukkit.inventory.RecipeChoice;
++
++public record PaperPotionMix(ItemStack result, Predicate<ItemStack> input, Predicate<ItemStack> ingredient) {
++
++ public PaperPotionMix(PotionMix potionMix) {
++ this(CraftItemStack.asNMSCopy(potionMix.getResult()), convert(potionMix.getInput()), convert(potionMix.getIngredient()));
++ }
++
++ static Predicate<ItemStack> convert(final RecipeChoice choice) {
++ if (choice instanceof PredicateRecipeChoice predicateRecipeChoice) {
++ return stack -> predicateRecipeChoice.test(CraftItemStack.asBukkitCopy(stack));
++ }
++ return CraftRecipe.toIngredient(choice, true);
++ }
++}
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index 39735cce3c32d9905130dca2d7e34aff144364ef..8080eee9babe02660724eee756700a4d5e69014f 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -2081,6 +2081,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+
+ this.worldData.setDataConfiguration(worlddataconfiguration);
+ this.resources.managers.updateRegistryTags(this.registryAccess());
++ net.minecraft.world.item.alchemy.PotionBrewing.reload(); // Paper - Custom Potion Mixes
+ this.getPlayerList().saveAll();
+ this.getPlayerList().reloadResources();
+ this.functionManager.replaceLibrary(this.resources.managers.getFunctionLibrary());
+diff --git a/src/main/java/net/minecraft/world/inventory/BrewingStandMenu.java b/src/main/java/net/minecraft/world/inventory/BrewingStandMenu.java
+index ad012400d76c263bf26cfa07e2e24f26dc32276b..054555c6b9c61243b1f14139b5c0eb2579403707 100644
+--- a/src/main/java/net/minecraft/world/inventory/BrewingStandMenu.java
++++ b/src/main/java/net/minecraft/world/inventory/BrewingStandMenu.java
+@@ -169,7 +169,7 @@ public class BrewingStandMenu extends AbstractContainerMenu {
+ }
+
+ public static boolean mayPlaceItem(ItemStack stack) {
+- return stack.is(Items.POTION) || stack.is(Items.SPLASH_POTION) || stack.is(Items.LINGERING_POTION) || stack.is(Items.GLASS_BOTTLE);
++ return stack.is(Items.POTION) || stack.is(Items.SPLASH_POTION) || stack.is(Items.LINGERING_POTION) || stack.is(Items.GLASS_BOTTLE) || PotionBrewing.isCustomInput(stack); // Paper - Custom Potion Mixes
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/world/item/alchemy/PotionBrewing.java b/src/main/java/net/minecraft/world/item/alchemy/PotionBrewing.java
+index 25e909b90293855321b8f05ab3488bad8c064853..0bba74bd22d66881fc6851797d29c1442f509445 100644
+--- a/src/main/java/net/minecraft/world/item/alchemy/PotionBrewing.java
++++ b/src/main/java/net/minecraft/world/item/alchemy/PotionBrewing.java
+@@ -14,6 +14,7 @@ public class PotionBrewing {
+ public static final int BREWING_TIME_SECONDS = 20;
+ private static final List<PotionBrewing.Mix<Potion>> POTION_MIXES = Lists.newArrayList();
+ private static final List<PotionBrewing.Mix<Item>> CONTAINER_MIXES = Lists.newArrayList();
++ private static final it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap<org.bukkit.NamespacedKey, io.papermc.paper.potion.PaperPotionMix> CUSTOM_MIXES = new it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap<>(); // Paper - Custom Potion Mixes
+ private static final List<Ingredient> ALLOWED_CONTAINERS = Lists.newArrayList();
+ private static final Predicate<ItemStack> ALLOWED_CONTAINER = (stack) -> {
+ for(Ingredient ingredient : ALLOWED_CONTAINERS) {
+@@ -26,7 +27,7 @@ public class PotionBrewing {
+ };
+
+ public static boolean isIngredient(ItemStack stack) {
+- return isContainerIngredient(stack) || isPotionIngredient(stack);
++ return isContainerIngredient(stack) || isPotionIngredient(stack) || isCustomIngredient(stack); // Paper - Custom Potion Mixes
+ }
+
+ protected static boolean isContainerIngredient(ItemStack stack) {
+@@ -60,6 +61,11 @@ public class PotionBrewing {
+ }
+
+ public static boolean hasMix(ItemStack input, ItemStack ingredient) {
++ // Paper start - Custom Potion Mixes
++ if (hasCustomMix(input, ingredient)) {
++ return true;
++ }
++ // Paper end - Custom Potion Mixes
+ if (!ALLOWED_CONTAINER.test(input)) {
+ return false;
+ } else {
+@@ -93,6 +99,13 @@ public class PotionBrewing {
+
+ public static ItemStack mix(ItemStack ingredient, ItemStack input) {
+ if (!input.isEmpty()) {
++ // Paper start - Custom Potion Mixes
++ for (var mix : CUSTOM_MIXES.values()) {
++ if (mix.input().test(input) && mix.ingredient().test(ingredient)) {
++ return mix.result().copy();
++ }
++ }
++ // Paper end - Custom Potion Mixes
+ Potion potion = PotionUtils.getPotion(input);
+ Item item = input.getItem();
+
+@@ -112,6 +125,54 @@ public class PotionBrewing {
+ return input;
+ }
+
++ // Paper start - Custom Potion Mixes
++ public static boolean isCustomIngredient(ItemStack stack) {
++ for (var mix : CUSTOM_MIXES.values()) {
++ if (mix.ingredient().test(stack)) {
++ return true;
++ }
++ }
++ return false;
++ }
++
++ public static boolean isCustomInput(ItemStack stack) {
++ for (var mix : CUSTOM_MIXES.values()) {
++ if (mix.input().test(stack)) {
++ return true;
++ }
++ }
++ return false;
++ }
++
++ private static boolean hasCustomMix(ItemStack input, ItemStack ingredient) {
++ for (var mix : CUSTOM_MIXES.values()) {
++ if (mix.input().test(input) && mix.ingredient().test(ingredient)) {
++ return true;
++ }
++ }
++ return false;
++ }
++
++ public static void addPotionMix(io.papermc.paper.potion.PotionMix mix) {
++ if (CUSTOM_MIXES.containsKey(mix.getKey())) {
++ throw new IllegalArgumentException("Duplicate recipe ignored with ID " + mix.getKey());
++ }
++ CUSTOM_MIXES.putAndMoveToFirst(mix.getKey(), new io.papermc.paper.potion.PaperPotionMix(mix));
++ }
++
++ public static boolean removePotionMix(org.bukkit.NamespacedKey key) {
++ return CUSTOM_MIXES.remove(key) != null;
++ }
++
++ public static void reload() {
++ POTION_MIXES.clear();
++ CONTAINER_MIXES.clear();
++ ALLOWED_CONTAINERS.clear();
++ CUSTOM_MIXES.clear();
++ bootStrap();
++ }
++ // Paper end - Custom Potion Mixes
++
+ public static void bootStrap() {
+ addContainer(Items.POTION);
+ addContainer(Items.SPLASH_POTION);
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java
+index b31d7053abf1d2432b4887dab2bd8f8cc5308554..9bb542ce3a8c52e1688bb1f66fc916dd23a5fd10 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java
+@@ -341,7 +341,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements
+
+ @Override
+ public boolean canPlaceItem(int slot, ItemStack stack) {
+- return slot == 3 ? PotionBrewing.isIngredient(stack) : (slot == 4 ? stack.is(Items.BLAZE_POWDER) : (stack.is(Items.POTION) || stack.is(Items.SPLASH_POTION) || stack.is(Items.LINGERING_POTION) || stack.is(Items.GLASS_BOTTLE)) && this.getItem(slot).isEmpty());
++ return slot == 3 ? PotionBrewing.isIngredient(stack) : (slot == 4 ? stack.is(Items.BLAZE_POWDER) : (stack.is(Items.POTION) || stack.is(Items.SPLASH_POTION) || stack.is(Items.LINGERING_POTION) || stack.is(Items.GLASS_BOTTLE) || PotionBrewing.isCustomInput(stack)) && this.getItem(slot).isEmpty()); // Paper - Custom Potion Mixes
+ }
+
+ @Override
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+index f629991fa998d4dab89ed5c3d26b1b7a4f85b5cb..d8bec75e7f5c034051839818f51cdae71863608c 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+@@ -306,6 +306,7 @@ public final class CraftServer implements Server {
+ private final io.papermc.paper.datapack.PaperDatapackManager datapackManager; // Paper
+ public static Exception excessiveVelEx; // Paper - Velocity warnings
+ private final io.papermc.paper.logging.SysoutCatcher sysoutCatcher = new io.papermc.paper.logging.SysoutCatcher(); // Paper
++ private final CraftPotionBrewer potionBrewer = new CraftPotionBrewer(); // Paper - Custom Potion Mixes
+
+ static {
+ ConfigurationSerialization.registerClass(CraftOfflinePlayer.class);
+@@ -332,7 +333,7 @@ public final class CraftServer implements Server {
+
+ CraftRegistry.setMinecraftRegistry(console.registryAccess());
+
+- Potion.setPotionBrewer(new CraftPotionBrewer());
++ Potion.setPotionBrewer(potionBrewer); // Paper - Custom Potion Mixes
+ // Ugly hack :(
+
+ if (!Main.useConsole) {
+@@ -3079,5 +3080,10 @@ public final class CraftServer implements Server {
+ return datapackManager;
+ }
+
++ @Override
++ public CraftPotionBrewer getPotionBrewer() {
++ return this.potionBrewer;
++ }
++
+ // Paper end
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java
+index 139dff90561ac6c51954c6289918a07aeea13a1b..6ba29875d78ede4aa7978ff689e588f7fed11528 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java
+@@ -15,6 +15,11 @@ public interface CraftRecipe extends Recipe {
+ void addToCraftingManager();
+
+ default Ingredient toNMS(RecipeChoice bukkit, boolean requireNotEmpty) {
++ // Paper start
++ return toIngredient(bukkit, requireNotEmpty);
++ }
++ static Ingredient toIngredient(RecipeChoice bukkit, boolean requireNotEmpty) {
++ // Paper end
+ Ingredient stack;
+
+ if (bukkit == null) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionBrewer.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionBrewer.java
+index 09ac71b6b41c757832792d9ea8ac9288f8a7404f..2909a2736a0c9d863c7ab01e0ec259f7952080cc 100644
+--- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionBrewer.java
++++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionBrewer.java
+@@ -28,4 +28,21 @@ public class CraftPotionBrewer implements PotionBrewer {
+ public PotionEffect createEffect(PotionEffectType potion, int duration, int amplifier) {
+ return new PotionEffect(potion, potion.isInstant() ? 1 : (int) (duration * potion.getDurationModifier()), amplifier);
+ }
++
++ // Paper start
++ @Override
++ public void addPotionMix(io.papermc.paper.potion.PotionMix potionMix) {
++ net.minecraft.world.item.alchemy.PotionBrewing.addPotionMix(potionMix);
++ }
++
++ @Override
++ public void removePotionMix(org.bukkit.NamespacedKey key) {
++ net.minecraft.world.item.alchemy.PotionBrewing.removePotionMix(key);
++ }
++
++ @Override
++ public void resetPotionMixes() {
++ net.minecraft.world.item.alchemy.PotionBrewing.reload();
++ }
++ // Paper end
+ }