diff options
author | Jake Potrebic <[email protected]> | 2024-11-09 16:26:05 -0800 |
---|---|---|
committer | GitHub <[email protected]> | 2024-11-10 01:26:05 +0100 |
commit | 1ef4c0e7ff4cdbce7939804918c8d492f1e8ce1c (patch) | |
tree | 1de6235f630165dc862d924d9193f8bf9ad57076 | |
parent | 6da7b9e888a7a4b1f6d5806202e08d1be8d239e6 (diff) | |
download | Paper-1ef4c0e7ff4cdbce7939804918c8d492f1e8ce1c.tar.gz Paper-1ef4c0e7ff4cdbce7939804918c8d492f1e8ce1c.zip |
Improve performance of RecipeMap#removeRecipe (#11547)
-rw-r--r-- | patches/server/1063-Improve-performance-of-RecipeMap-removeRecipe.patch | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/patches/server/1063-Improve-performance-of-RecipeMap-removeRecipe.patch b/patches/server/1063-Improve-performance-of-RecipeMap-removeRecipe.patch new file mode 100644 index 0000000000..08bbad66b6 --- /dev/null +++ b/patches/server/1063-Improve-performance-of-RecipeMap-removeRecipe.patch @@ -0,0 +1,89 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic <[email protected]> +Date: Thu, 31 Oct 2024 20:36:41 -0700 +Subject: [PATCH] Improve performance of RecipeMap#removeRecipe + + +diff --git a/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java b/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java +index d376d89b479a4d5cc9ac568d23c7603a9355d580..f6dd363ececf967d282f5ba713013085da1ddf37 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java ++++ b/src/main/java/net/minecraft/world/item/crafting/RecipeManager.java +@@ -258,7 +258,7 @@ public class RecipeManager extends SimplePreparableReloadListener<RecipeMap> imp + + // CraftBukkit start + public boolean removeRecipe(ResourceKey<Recipe<?>> mcKey) { +- boolean removed = this.recipes.removeRecipe(mcKey); ++ boolean removed = this.recipes.removeRecipe((ResourceKey<Recipe<RecipeInput>>) (ResourceKey) mcKey); // Paper - generic fix + if (removed) { + this.finalizeRecipeLoading(); + } +diff --git a/src/main/java/net/minecraft/world/item/crafting/RecipeMap.java b/src/main/java/net/minecraft/world/item/crafting/RecipeMap.java +index 5d842d7e774564143f9f3be6c2628d54595a235b..c4067fbf827fed882772962a0e4b3ead0d642e62 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/RecipeMap.java ++++ b/src/main/java/net/minecraft/world/item/crafting/RecipeMap.java +@@ -54,21 +54,38 @@ public class RecipeMap { + } + } + +- public boolean removeRecipe(ResourceKey<Recipe<?>> mcKey) { +- boolean removed = false; +- Iterator<RecipeHolder<?>> iter = this.byType.values().iterator(); +- while (iter.hasNext()) { +- RecipeHolder<?> recipe = iter.next(); +- if (recipe.id().equals(mcKey)) { +- iter.remove(); +- removed = true; +- } +- } +- removed |= this.byKey.remove(mcKey) != null; ++ // public boolean removeRecipe(ResourceKey<Recipe<?>> mcKey) { ++ // boolean removed = false; ++ // Iterator<RecipeHolder<?>> iter = this.byType.values().iterator(); ++ // while (iter.hasNext()) { ++ // RecipeHolder<?> recipe = iter.next(); ++ // if (recipe.id().equals(mcKey)) { ++ // iter.remove(); ++ // removed = true; ++ // } ++ // } ++ // removed |= this.byKey.remove(mcKey) != null; ++ // ++ // return removed; ++ // } ++ // CraftBukkit end ++ + +- return removed; ++ // Paper start - replace removeRecipe implementation ++ public <T extends RecipeInput> boolean removeRecipe(ResourceKey<Recipe<T>> mcKey) { ++ //noinspection unchecked ++ final RecipeHolder<Recipe<T>> remove = (RecipeHolder<Recipe<T>>) this.byKey.remove(mcKey); ++ if (remove == null) { ++ return false; ++ } ++ final Collection<? extends RecipeHolder<? extends Recipe<T>>> recipes = this.byType(remove.value().getType()); ++ if (recipes.remove(remove)) { ++ return true; ++ } ++ return false; ++ // Paper end - why are you using a loop??? + } +- // CraftBukkit end ++ // Paper end - replace removeRecipe implementation + + public <I extends RecipeInput, T extends Recipe<I>> Collection<RecipeHolder<T>> byType(RecipeType<T> type) { + return (Collection) this.byType.get(type); // CraftBukkit - decompile error +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java +index c0433e054e64c329dff670c8f7ca21c4a4133c6f..a20b471389474244ef20bf42d4085dcf9dd122a5 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java +@@ -32,5 +32,9 @@ public class RecipeIterator implements Iterator<Recipe> { + public void remove() { + MinecraftServer.getServer().getRecipeManager().recipes.byKey.remove(this.currentRecipe.id()); // Paper - fix removing recipes from RecipeIterator + this.recipes.remove(); ++ // Paper start - correctly reload recipes ++ MinecraftServer.getServer().getRecipeManager().finalizeRecipeLoading(); ++ MinecraftServer.getServer().getPlayerList().reloadRecipes(); ++ // Paper end - correctly reload recipes + } + } |