b31089a929
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: d264e972 #591: Add option for a consumer before spawning an item 1c537fce #590: Add spawn and transform reasons for piglin zombification. CraftBukkit Changes: ee5006d1 #810: Add option for a consumer before spawning an item f6a39d3c #809: Add spawn and transform reasons for piglin zombification. 0c24068a Organise imports Spigot Changes: bff52619 Organise imports
69 Zeilen
3.1 KiB
Diff
69 Zeilen
3.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Fri, 18 Jan 2019 00:08:15 -0500
|
|
Subject: [PATCH] Fix Custom Shapeless Custom Crafting Recipes
|
|
|
|
Mojang implemented Shapeless different than Shaped
|
|
|
|
This made the Bukkit RecipeChoice API not work for Shapeless.
|
|
|
|
This reimplements vanilla logic using the same test logic as Shaped
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ShapelessRecipes.java b/src/main/java/net/minecraft/server/ShapelessRecipes.java
|
|
index 821e4862429c2cef4144cdad2d7853881f383956..ecd63281912ae0ed93c5eb5ccb4249833cb23ab1 100644
|
|
--- a/src/main/java/net/minecraft/server/ShapelessRecipes.java
|
|
+++ b/src/main/java/net/minecraft/server/ShapelessRecipes.java
|
|
@@ -64,16 +64,49 @@ public class ShapelessRecipes implements RecipeCrafting {
|
|
AutoRecipeStackManager autorecipestackmanager = new AutoRecipeStackManager();
|
|
int i = 0;
|
|
|
|
+ // Paper start
|
|
+ java.util.List<ItemStack> providedItems = new java.util.ArrayList<>();
|
|
+ co.aikar.util.Counter<ItemStack> matchedProvided = new co.aikar.util.Counter<>();
|
|
+ co.aikar.util.Counter<RecipeItemStack> matchedIngredients = new co.aikar.util.Counter<>();
|
|
+ // Paper end
|
|
for (int j = 0; j < inventorycrafting.getSize(); ++j) {
|
|
ItemStack itemstack = inventorycrafting.getItem(j);
|
|
|
|
if (!itemstack.isEmpty()) {
|
|
- ++i;
|
|
- autorecipestackmanager.a(itemstack, 1);
|
|
+ // Paper start
|
|
+ itemstack = itemstack.cloneItemStack();
|
|
+ providedItems.add(itemstack);
|
|
+ for (RecipeItemStack ingredient : ingredients) {
|
|
+ if (ingredient.test(itemstack)) {
|
|
+ matchedProvided.increment(itemstack);
|
|
+ matchedIngredients.increment(ingredient);
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
}
|
|
|
|
- return i == this.ingredients.size() && autorecipestackmanager.a(this, (IntList) null);
|
|
+ // Paper start
|
|
+ if (matchedProvided.isEmpty() || matchedIngredients.isEmpty()) {
|
|
+ return false;
|
|
+ }
|
|
+ java.util.List<RecipeItemStack> ingredients = new java.util.ArrayList<>(this.ingredients);
|
|
+ providedItems.sort(java.util.Comparator.comparingInt((ItemStack c) -> (int) matchedProvided.getCount(c)).reversed());
|
|
+ ingredients.sort(java.util.Comparator.comparingInt((RecipeItemStack c) -> (int) matchedIngredients.getCount(c)));
|
|
+
|
|
+ PROVIDED:
|
|
+ for (ItemStack provided : providedItems) {
|
|
+ for (Iterator<RecipeItemStack> itIngredient = ingredients.iterator(); itIngredient.hasNext(); ) {
|
|
+ RecipeItemStack ingredient = itIngredient.next();
|
|
+ if (ingredient.test(provided)) {
|
|
+ itIngredient.remove();
|
|
+ continue PROVIDED;
|
|
+ }
|
|
+ }
|
|
+ return false;
|
|
+ }
|
|
+ return ingredients.isEmpty();
|
|
+ // Paper end
|
|
}
|
|
|
|
public ItemStack a(InventoryCrafting inventorycrafting) {
|