From 6f6bb4c9da081c1ad252e5b6bf21084e20cc8784 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 22 Aug 2025 19:36:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=85=8D=E6=96=B9=E4=B9=A6?= =?UTF-8?q?=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/build.gradle.kts | 2 +- bukkit/paper-loader/build.gradle.kts | 2 +- .../item/recipe/BukkitRecipeManager.java | 21 ++------------ .../item/recipe/CustomIngredientList.java | 29 +++++++++++++++++++ .../item/recipe/CustomIngredientSet.java | 28 ++++++++++++++++++ gradle.properties | 4 +-- 6 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientList.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientSet.java diff --git a/bukkit/loader/build.gradle.kts b/bukkit/loader/build.gradle.kts index 29d893949..03b971562 100644 --- a/bukkit/loader/build.gradle.kts +++ b/bukkit/loader/build.gradle.kts @@ -47,7 +47,7 @@ bukkit { name = "CraftEngine" apiVersion = "1.20" authors = listOf("XiaoMoMi") - contributors = listOf("jhqwqmc", "iqtesterrr", "WhiteProject1", "Catnies", "xiaozhangup", "TamashiiMon") + contributors = listOf("jhqwqmc", "iqtesterrr", "WhiteProject1", "Catnies", "xiaozhangup", "TamashiiMon", "Halogly", "ArubikU", "Maxsh001", "Sasha2294", "MrPanda8") softDepend = listOf("PlaceholderAPI", "WorldEdit", "FastAsyncWorldEdit", "Skript") foliaSupported = true } diff --git a/bukkit/paper-loader/build.gradle.kts b/bukkit/paper-loader/build.gradle.kts index 1d5ce6703..a5a269d3b 100644 --- a/bukkit/paper-loader/build.gradle.kts +++ b/bukkit/paper-loader/build.gradle.kts @@ -50,7 +50,7 @@ paper { name = "CraftEngine" apiVersion = "1.20" authors = listOf("XiaoMoMi") - contributors = listOf("jhqwqmc", "iqtesterrr", "WhiteProject1", "Catnies", "xiaozhangup", "TamashiiMon") + contributors = listOf("jhqwqmc", "iqtesterrr", "WhiteProject1", "Catnies", "xiaozhangup", "TamashiiMon", "Halogly", "ArubikU", "Maxsh001", "Sasha2294", "MrPanda8") foliaSupported = true serverDependencies { register("PlaceholderAPI") { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java index 519734e35..7cba8d1bc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java @@ -3,7 +3,6 @@ package net.momirealms.craftengine.bukkit.item.recipe; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import io.papermc.paper.potion.PotionMix; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; @@ -85,7 +84,6 @@ public class BukkitRecipeManager extends AbstractRecipeManager { } } - private static final List MODIFIED_INGREDIENTS = new ArrayList<>(); private static final Map, Object>> ADD_RECIPE_FOR_MINECRAFT_RECIPE_HOLDER = Map.of( RecipeSerializers.SHAPED, recipe -> { CustomShapedRecipe shapedRecipe = (CustomShapedRecipe) recipe; @@ -245,9 +243,9 @@ public class BukkitRecipeManager extends AbstractRecipeManager { Ingredient actualIngredient = actualIngredients.get(i); List items = getIngredientLooks(actualIngredient.items()); if (VersionHelper.isOrAbove1_21_4()) { - CoreReflections.methodHandle$Ingredient$itemStacksSetter.invokeExact(ingredient, (Set) new ObjectOpenHashSet<>(items)); + CoreReflections.methodHandle$Ingredient$itemStacksSetter.invokeExact(ingredient, (Set) new CustomIngredientSet(items, actualIngredient)); } else if (VersionHelper.isOrAbove1_21_2()) { - CoreReflections.methodHandle$Ingredient$itemStacksSetter.invokeExact(ingredient, (List) items); + CoreReflections.methodHandle$Ingredient$itemStacksSetter.invokeExact(ingredient, (List) new CustomIngredientList(items, actualIngredient)); } else { Object itemStackArray = Array.newInstance(CoreReflections.clazz$ItemStack, items.size()); for (int j = 0; j < items.size(); j++) { @@ -255,7 +253,6 @@ public class BukkitRecipeManager extends AbstractRecipeManager { } CoreReflections.methodHandle$Ingredient$itemStacksSetter.invokeExact(ingredient, (Object) itemStackArray); } - MODIFIED_INGREDIENTS.add(ingredient); } } @@ -498,20 +495,6 @@ public class BukkitRecipeManager extends AbstractRecipeManager { // send to players CoreReflections.methodHandle$DedicatedPlayerList$reloadRecipes.invokeExact(CraftBukkitReflections.methodHandle$CraftServer$playerListGetter.invokeExact(Bukkit.getServer())); - - // now we need to remove the fake `exact` choices - if (VersionHelper.isOrAbove1_21_4()) { - for (Object ingredient : MODIFIED_INGREDIENTS) { - CoreReflections.methodHandle$Ingredient$itemStacksSetter.invokeExact(ingredient, (Set) null); - } - } else if (VersionHelper.isOrAbove1_21_2()) { - for (Object ingredient : MODIFIED_INGREDIENTS) { - CoreReflections.methodHandle$Ingredient$itemStacksSetter.invokeExact(ingredient, (List) null); - } - } - - // clear cache - MODIFIED_INGREDIENTS.clear(); } catch (Throwable e) { this.plugin.logger().warn("Failed to run delayed recipe tasks", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientList.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientList.java new file mode 100644 index 000000000..b5c977d3b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientList.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.bukkit.item.recipe; + +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.core.item.recipe.Ingredient; +import net.momirealms.craftengine.core.item.recipe.UniqueIdItem; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; + +public class CustomIngredientList extends ArrayList { + private final Ingredient ingredient; + + public CustomIngredientList(@NotNull Collection c, Ingredient ingredient) { + super(c); + this.ingredient = ingredient; + } + + @Override + public boolean contains(Object o) { + if (o == null || FastNMS.INSTANCE.method$ItemStack$isEmpty(o)) { + return false; + } + return this.ingredient.test(UniqueIdItem.of(BukkitItemManager.instance().wrap(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(o)))); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientSet.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientSet.java new file mode 100644 index 000000000..c7201607a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CustomIngredientSet.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.bukkit.item.recipe; + +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.core.item.recipe.Ingredient; +import net.momirealms.craftengine.core.item.recipe.UniqueIdItem; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.HashSet; + +public class CustomIngredientSet extends HashSet { + private final Ingredient ingredient; + + public CustomIngredientSet(@NotNull Collection c, Ingredient ingredient) { + super(c); + this.ingredient = ingredient; + } + + @Override + public boolean contains(Object o) { + if (o == null || FastNMS.INSTANCE.method$ItemStack$isEmpty(o)) { + return false; + } + return this.ingredient.test(UniqueIdItem.of(BukkitItemManager.instance().wrap(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(o)))); + } +} diff --git a/gradle.properties b/gradle.properties index 3ce89d0df..ac5eb779a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.62 +project_version=0.0.62.1 config_version=44 lang_version=24 project_group=net.momirealms @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.19 -nms_helper_version=1.0.57 +nms_helper_version=1.0.58 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23