From 2187362984e322879e551c098e5db29d69bc61c7 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 11 Jun 2025 21:31:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E6=96=B9=E7=89=A9?= =?UTF-8?q?=E5=93=81=E8=BF=94=E8=BF=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/recipe/RecipeEventListener.java | 43 +++++++++++++++++++ .../craftengine/core/item/ItemSettings.java | 7 ++- gradle.properties | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index b1ab779fc..e13f6b558 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -33,6 +33,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Campfire; import org.bukkit.block.Furnace; +import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -790,6 +791,48 @@ public class RecipeEventListener implements Listener { return new Pair<>(first, second); } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onCraft(CraftItemEvent event) { + org.bukkit.inventory.Recipe recipe = event.getRecipe(); + if (!(recipe instanceof ShapelessRecipe) && !(recipe instanceof ShapedRecipe)) return; + HumanEntity humanEntity = event.getWhoClicked(); + if (!(humanEntity instanceof Player player)) return; + CraftingInventory inventory = event.getInventory(); + ItemStack result = inventory.getResult(); + if (result == null) return; + ItemStack[] usedItems = inventory.getMatrix(); + ItemStack[] replacements = new ItemStack[usedItems.length]; + boolean hasReplacement = false; + for (int i = 0; i < usedItems.length; i++) { + ItemStack usedItem = usedItems[i]; + if (ItemUtils.isEmpty(usedItem)) continue; + if (usedItem.getAmount() != 1) continue; + Item wrapped = BukkitItemManager.instance().wrap(usedItem); + if (wrapped == null) continue; + Optional> optionalCustomItem = wrapped.getCustomItem(); + if (optionalCustomItem.isPresent()) { + CustomItem customItem = optionalCustomItem.get(); + Key remainingItem = customItem.settings().craftRemainder(); + if (remainingItem != null) { + replacements[i] = BukkitItemManager.instance().buildItemStack(remainingItem, this.plugin.adapt(player)); + hasReplacement = true; + } + } + } + if (!hasReplacement) return; + Runnable delayedTask = () -> { + for (int i = 0; i < replacements.length; i++) { + if (replacements[i] == null) continue; + inventory.setItem(i + 1, replacements[i]); + } + }; + if (VersionHelper.isFolia()) { + player.getScheduler().run(this.plugin.javaPlugin(), (t) -> delayedTask.run(), () -> {}); + } else { + this.plugin.scheduler().sync().runDelayed(delayedTask); + } + } + @EventHandler(ignoreCancelled = true) public void onCraftingRecipe(PrepareItemCraftEvent event) { if (!Config.enableRecipeSystem()) return; diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java index 3398b7e9f..5208d5576 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -133,6 +133,11 @@ public class ItemSettings { return consumeReplacement; } + @Nullable + public Key craftRemainder() { + return craftRemainder; + } + @Nullable public Helmet helmet() { return helmet; @@ -251,7 +256,7 @@ public class ItemSettings { if (value == null) settings.consumeReplacement(null); else settings.consumeReplacement(Key.of(value.toString())); })); - registerFactory("craft-remainder", (value -> settings -> { + registerFactory("craft-remaining-item", (value -> settings -> { if (value == null) settings.craftRemainder(null); else settings.craftRemainder(Key.of(value.toString())); })); diff --git a/gradle.properties b/gradle.properties index 1395597ac..796031ea2 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.56.6 +project_version=0.0.56.7 config_version=37 lang_version=16 project_group=net.momirealms