geforkt von Mirrors/Paper
8657cd91d7
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: 63c208dd Remove no longer used import 70be76c7 PR-958: Further clarify deprecation of TAG_CONTAINER_ARRAY ae21f4ac PR-955: Add methods to place structures with block/entity transformers e3d960f2 SPIGOT-7547: Remark that Damageable#setAbsorptionAmount() is capped to a specific value b125516c Fix typo in RecipeChoice.ExactChoice docs 309497c1 Add EntityMountEvent and EntityDismount Event 2fd45ae3 Improve ItemFactory#enchantItem consistency 2b198268 PR-933: Define native persistent data types for lists CraftBukkit Changes: 771182f70 PR-1327: Add methods to place structures with block/entity transformers e41ad4c82 SPIGOT-7567: SpawnReason for SNOWMAN is reported as BUILD_IRONGOLEM 76931e8bd Add EntityMountEvent and EntityDismount Event 9b29b21c7 PR-1183: Better handle lambda expression and renaming of classes in Commodore 1462ebe85 Reformat Commodore.java 9fde4c037 PR-1324: Improve ItemFactory#enchantItem consistency 4e419c774 PR-1295: Define native persistent data types for lists dd8cca388 SPIGOT-7562: Fix Score#getScore and Score#isScoreSet 690278200 Only fetch an online UUID in online mode 1da8d9a53 Fire PreLogin events even in offline mode 2e88514ad PR-1325: Use CraftBlockType and CraftItemType instead of CraftMagicNumbers to convert between minecraft and bukkit block / item representation Spigot Changes: 864e4acc Restore accidentally removed package-info.java f91a10d5 Remove obsolete EntityMountEvent and EntityDismountEvent 828f0593 SPIGOT-7558: Deprecate silenceable lightning API as sound is now client-side and cannot be removed cdc4e035 Remove obsolete patch fetching correct mode UUIDs 49e36b8e Merge related BungeeCord patches 6e87b9ab Remove obsolete firing of PreLogin events in offline mode 5c76b183 Remove redundant patch dealing with exceptions in the crash reporter 3a2219d1 Remove redundant patch logging cause of unexpected exception
248 Zeilen
12 KiB
Diff
248 Zeilen
12 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: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 4f43e306d70bc733ceba2b375c8732f330abc0e4..d8eb1dbc1601c1f76183ddd78b88d0ee6df68bed 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -2213,6 +2213,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
|
|
// Paper start
|
|
if (Thread.currentThread() != this.serverThread) {
|
|
return;
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/BrewingStandMenu.java b/src/main/java/net/minecraft/world/inventory/BrewingStandMenu.java
|
|
index ad012400d76c263bf26cfa07e2e24f26dc32276b..82311188348d673d83b70bf4d5357ecee562b6d6 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
|
|
}
|
|
}
|
|
|
|
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..ef798adc296ae1595cfcd33fed5aa71b9ad00037 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
|
|
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
|
|
}
|
|
|
|
protected static boolean isContainerIngredient(ItemStack stack) {
|
|
@@ -60,6 +61,11 @@ public class PotionBrewing {
|
|
}
|
|
|
|
public static boolean hasMix(ItemStack input, ItemStack ingredient) {
|
|
+ // Paper start
|
|
+ if (hasCustomMix(input, ingredient)) {
|
|
+ return true;
|
|
+ }
|
|
+ // Paper end
|
|
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
|
|
+ for (var mix : CUSTOM_MIXES.values()) {
|
|
+ if (mix.input().test(input) && mix.ingredient().test(ingredient)) {
|
|
+ return mix.result().copy();
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
Potion potion = PotionUtils.getPotion(input);
|
|
Item item = input.getItem();
|
|
|
|
@@ -112,6 +125,54 @@ public class PotionBrewing {
|
|
return input;
|
|
}
|
|
|
|
+ // Paper start
|
|
+ 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
|
|
+
|
|
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..c57efcb9a79337ec791e4e8f6671612f0a82b441 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
|
|
}
|
|
|
|
@Override
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
|
index 4ffb0a342a553b714a0807591a3d21d7a6b08959..4af7f37e12104f6a493c08aff2968762bbdc4811 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
|
|
|
|
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
|
|
// 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
|
|
}
|