diff options
author | Nassim Jahnke <[email protected]> | 2024-01-23 18:01:39 +0100 |
---|---|---|
committer | Nassim Jahnke <[email protected]> | 2024-01-23 18:06:51 +0100 |
commit | c57d1aa24560ec71331e685e9fd27aa3d9274f69 (patch) | |
tree | b585b2246be85ecc5047b02b704c0a5f59c96dd9 /patches/server/0715-Custom-Potion-Mixes.patch | |
parent | e66037960b02c7b22bbed75318904c55a4177977 (diff) | |
download | Paper-c57d1aa24560ec71331e685e9fd27aa3d9274f69.tar.gz Paper-c57d1aa24560ec71331e685e9fd27aa3d9274f69.zip |
Move diffs around to compile without later ones applied
Diffstat (limited to 'patches/server/0715-Custom-Potion-Mixes.patch')
-rw-r--r-- | patches/server/0715-Custom-Potion-Mixes.patch | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/patches/server/0715-Custom-Potion-Mixes.patch b/patches/server/0715-Custom-Potion-Mixes.patch new file mode 100644 index 0000000000..e2a88e9c70 --- /dev/null +++ b/patches/server/0715-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 5a1c19f7964f282217097d94c0a9e3cc376f70fd..35053ad6cdb071d3f256a23d532d1abb77f14858 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -2087,6 +2087,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 424406d2692856cfd82b6f3b7b6228fa3bd20c2f..bc01481ac5990ad1cfd1def5a16dd0ed2f9de8c9 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 2ef62cc94b8884b4e7e70f9ca926a0c6cd82e321..3651cdff8b5a489d57ffd39470510e0f2e413f71 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -304,6 +304,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); +@@ -330,7 +331,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) { +@@ -3076,5 +3077,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 + } |