From 70b8cab05618eb00a3b4156b160508d6a0901ed1 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 13 Aug 2025 21:56:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A9=BA=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/item/BukkitItemManager.java | 2 +- .../craftengine/core/item/AbstractCustomItem.java | 5 +++++ .../craftengine/core/item/BuildableItem.java | 2 ++ .../core/item/CloneableConstantItem.java | 5 +++++ .../core/item/recipe/AbstractRecipeSerializer.java | 13 +++++++------ 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index ecd7cb499..19f69cfc5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -368,7 +368,7 @@ public class BukkitItemManager extends AbstractItemManager { @Nullable private ItemStack createVanillaItemStack(Key id) { Object item = FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(id)); - if (item == MItems.AIR) { + if (item == MItems.AIR && !id.equals(ItemKeys.AIR)) { return null; } return FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.constructor$ItemStack(item, 1)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java index 66e6c4d53..336d4c1a7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractCustomItem.java @@ -101,4 +101,9 @@ public abstract class AbstractCustomItem implements CustomItem { public @NotNull List behaviors() { return this.behaviors; } + + @Override + public boolean isEmpty() { + return false; + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java index 1d3db94da..4e996c007 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java @@ -10,6 +10,8 @@ public interface BuildableItem { Item buildItem(ItemBuildContext context, int count); + boolean isEmpty(); + default Item buildItem(Player player) { return buildItem(ItemBuildContext.of(player)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CloneableConstantItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CloneableConstantItem.java index 639d8d137..5270fbc72 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/CloneableConstantItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CloneableConstantItem.java @@ -27,4 +27,9 @@ public class CloneableConstantItem implements BuildableItem { public I buildItemStack(ItemBuildContext context, int count) { return this.item.copyWithCount(count).getItem(); } + + @Override + public boolean isEmpty() { + return this.item.isEmpty(); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeSerializer.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeSerializer.java index 8e24da2b6..3087306b1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeSerializer.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipeSerializer.java @@ -1,9 +1,6 @@ package net.momirealms.craftengine.core.item.recipe; -import net.momirealms.craftengine.core.item.CloneableConstantItem; -import net.momirealms.craftengine.core.item.CustomItem; -import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.*; import net.momirealms.craftengine.core.item.recipe.reader.VanillaRecipeReader; import net.momirealms.craftengine.core.item.recipe.reader.VanillaRecipeReader1_20; import net.momirealms.craftengine.core.item.recipe.reader.VanillaRecipeReader1_20_5; @@ -72,9 +69,13 @@ public abstract class AbstractRecipeSerializer> implement } String id = ResourceConfigUtils.requireNonEmptyStringOrThrow(resultMap.get("id"), "warning.config.recipe.result.missing_id"); int count = ResourceConfigUtils.getAsInt(resultMap.getOrDefault("count", 1), "count"); + BuildableItem resultItem = (BuildableItem) CraftEngine.instance().itemManager().getBuildableItem(Key.of(id)).orElseThrow(() -> new LocalizedResourceConfigException("warning.config.recipe.invalid_result", id)); + if (resultItem.isEmpty()) { + throw new LocalizedResourceConfigException("warning.config.recipe.invalid_result", id); + } List> processors = ResourceConfigUtils.parseConfigAsList(resultMap.get("post-processors"), PostProcessors::fromMap); - return (CustomRecipeResult) new CustomRecipeResult<>( - CraftEngine.instance().itemManager().getBuildableItem(Key.of(id)).orElseThrow(() -> new LocalizedResourceConfigException("warning.config.recipe.invalid_result", id)), + return new CustomRecipeResult<>( + resultItem, count, processors.isEmpty() ? null : processors.toArray(new PostProcessor[0]) );