From 7b8e2c641a2d0b729d8419460f18a22c4dfcda6b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 11 Jul 2025 04:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=BB=E5=8F=96=E7=89=A9?= =?UTF-8?q?=E5=93=81id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/CustomFishingProvider.java | 5 +++ .../compatibility/item/MMOItemsProvider.java | 7 ++++- .../item/MythicMobsProvider.java | 8 +++++ .../item/NeigeItemsProvider.java | 5 +++ .../item/factory/BukkitItemFactory.java | 6 ++++ .../item/recipe/CrafterEventListener.java | 6 ++-- .../item/recipe/RecipeEventListener.java | 31 +++++-------------- .../plugin/injector/RecipeInjector.java | 16 +++------- .../bukkit/util/InteractUtils.java | 6 ++-- .../craftengine/core/item/AbstractItem.java | 6 ++++ .../core/item/ExternalItemProvider.java | 2 ++ .../craftengine/core/item/Item.java | 3 ++ .../craftengine/core/item/ItemFactory.java | 3 ++ gradle.properties | 2 +- 14 files changed, 61 insertions(+), 45 deletions(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java index ead100754..6d1300ded 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/CustomFishingProvider.java @@ -28,4 +28,9 @@ public class CustomFishingProvider implements ExternalItemProvider { ); return BukkitCustomFishingPlugin.getInstance().getItemManager().buildInternal(ctx.arg(ContextKeys.ID, id), id); } + + @Override + public String id(ItemStack item) { + return BukkitCustomFishingPlugin.getInstance().getItemManager().getCustomFishingItemID(item); + } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java index c466f82ca..a2a536fdd 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MMOItemsProvider.java @@ -23,7 +23,12 @@ public class MMOItemsProvider implements ExternalItemProvider { @Override public @Nullable ItemStack build(String id, ItemBuildContext context) { String[] split = id.split(":", 2); - MMOItem mmoItem = MMOItems.plugin.getMMOItem(Type.get(split[0]), split[1].toUpperCase(Locale.ENGLISH)); + MMOItem mmoItem = MMOItems.plugin.getMMOItem(Type.get(split[0]), split[1].toUpperCase()); return mmoItem == null ? new ItemStack(Material.AIR) : requireNonNull(mmoItem.newBuilder().build()); } + + @Override + public String id(ItemStack item) { + return MMOItems.getType(item) + ":" + MMOItems.getID(item); + } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java index 8b01bc237..21df07ef8 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/MythicMobsProvider.java @@ -22,4 +22,12 @@ public class MythicMobsProvider implements ExternalItemProvider { } return mythicBukkit.getItemManager().getItemStack(id); } + + @Override + public String id(ItemStack item) { + if (mythicBukkit == null || mythicBukkit.isClosed()) { + this.mythicBukkit = MythicBukkit.inst(); + } + return mythicBukkit.getItemManager().getMythicTypeFromItem(item); + } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java index 9fe7d0f18..d4b79a345 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/item/NeigeItemsProvider.java @@ -19,4 +19,9 @@ public class NeigeItemsProvider implements ExternalItemProvider { public ItemStack build(String id, ItemBuildContext context) { return ItemManager.INSTANCE.getItemStack(id, Optional.ofNullable(context.player()).map(it -> (Player) it.platformPlayer()).orElse(null)); } + + @Override + public String id(ItemStack item) { + return ItemManager.INSTANCE.getItemId(item); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java index aa96343f8..7164d40b0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -13,6 +13,7 @@ import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; @@ -79,6 +80,11 @@ public abstract class BukkitItemFactory> extend return item.getItem(); } + @Override + protected UniqueKey recipeIngredientID(W item) { + return UniqueKey.create(id(item)); + } + @Override protected boolean is(W item, Key itemTag) { Object literalObject = item.getLiteralObject(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java index 4890f744e..8b9725e4d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java @@ -24,7 +24,6 @@ import java.util.ArrayList; import java.util.List; public class CrafterEventListener implements Listener { - private static final OptimizedIDItem EMPTY = new OptimizedIDItem<>(null, null); private final ItemManager itemManager; private final BukkitRecipeManager recipeManager; private final BukkitCraftEngine plugin; @@ -57,11 +56,10 @@ public class CrafterEventListener implements Listener { List> optimizedIDItems = new ArrayList<>(); for (ItemStack itemStack : ingredients) { if (ItemStackUtils.isEmpty(itemStack)) { - optimizedIDItems.add(EMPTY); + optimizedIDItems.add(RecipeEventListener.EMPTY); } else { Item wrappedItem = this.itemManager.wrap(itemStack); - UniqueKey uniqueId = UniqueKey.create(wrappedItem.id()); - optimizedIDItems.add(new OptimizedIDItem<>(uniqueId, itemStack)); + optimizedIDItems.add(new OptimizedIDItem<>(wrappedItem.recipeIngredientId(), itemStack)); } } 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 a21544377..a0b791dcb 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 @@ -49,7 +49,7 @@ import java.util.Optional; @SuppressWarnings("DuplicatedCode") public class RecipeEventListener implements Listener { - private static final OptimizedIDItem EMPTY = new OptimizedIDItem<>(null, null); + public static final OptimizedIDItem EMPTY = new OptimizedIDItem<>(null, null); private final ItemManager itemManager; private final BukkitRecipeManager recipeManager; private final BukkitCraftEngine plugin; @@ -74,10 +74,7 @@ public class RecipeEventListener implements Listener { ItemStack item = event.getCurrentItem(); if (ItemStackUtils.isEmpty(item)) return; if (ItemStackUtils.isEmpty(fuelStack)) { - Item wrappedItem = BukkitItemManager.instance().wrap(item); - UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, item)); + SingleItemInput input = new SingleItemInput<>(getOptimizedIDItem(item)); Key recipeType; if (furnaceInventory.getType() == InventoryType.FURNACE) { recipeType = RecipeTypes.SMELTING; @@ -354,9 +351,7 @@ public class RecipeEventListener implements Listener { if (optionalMCRecipe.isEmpty()) { return; } - Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); + SingleItemInput input = new SingleItemInput<>(getOptimizedIDItem(itemStack)); CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.recipeByInput(RecipeTypes.CAMPFIRE_COOKING, input); if (ceRecipe == null) { event.setCancelled(true); @@ -381,9 +376,7 @@ public class RecipeEventListener implements Listener { } ItemStack itemStack = event.getSource(); - Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - UniqueKey itemId = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(itemId, itemStack)); + SingleItemInput input = new SingleItemInput<>(getOptimizedIDItem(itemStack)); CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.recipeByInput(RecipeTypes.CAMPFIRE_COOKING, input); if (ceRecipe == null) { event.setTotalCookTime(Integer.MAX_VALUE); @@ -411,9 +404,7 @@ public class RecipeEventListener implements Listener { } ItemStack itemStack = event.getSource(); - Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - UniqueKey itemId = UniqueKey.create(wrappedItem.id()); - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(itemId, itemStack)); + SingleItemInput input = new SingleItemInput<>(getOptimizedIDItem(itemStack)); CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.recipeByInput(RecipeTypes.CAMPFIRE_COOKING, input); if (ceRecipe == null) { event.setCancelled(true); @@ -820,7 +811,7 @@ public class RecipeEventListener implements Listener { if (ItemStackUtils.isEmpty(usedItem)) continue; if (usedItem.getAmount() != 1) continue; Item wrapped = BukkitItemManager.instance().wrap(usedItem); - if (wrapped == null) continue; + if (ItemUtils.isEmpty(wrapped)) continue; Optional> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isPresent()) { CustomItem customItem = optionalCustomItem.get(); @@ -871,13 +862,7 @@ public class RecipeEventListener implements Listener { List> optimizedIDItems = new ArrayList<>(); for (ItemStack itemStack : ingredients) { - if (ItemStackUtils.isEmpty(itemStack)) { - optimizedIDItems.add(EMPTY); - } else { - Item wrappedItem = this.itemManager.wrap(itemStack); - UniqueKey itemUniqueId = UniqueKey.create(wrappedItem.id()); - optimizedIDItems.add(new OptimizedIDItem<>(itemUniqueId, itemStack)); - } + optimizedIDItems.add(getOptimizedIDItem(itemStack)); } CraftingInput input; @@ -1016,7 +1001,7 @@ public class RecipeEventListener implements Listener { return EMPTY; } else { Item wrappedItem = this.itemManager.wrap(itemStack); - return new OptimizedIDItem<>(UniqueKey.create(wrappedItem.id()), itemStack); + return new OptimizedIDItem<>(wrappedItem.recipeIngredientId(), itemStack); } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java index f3322b291..54340ca9a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/RecipeInjector.java @@ -134,9 +134,7 @@ public class RecipeInjector { ); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(wrappedItem.recipeIngredientId(), itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); if (ceRecipe == null) { return Optional.empty(); @@ -182,9 +180,7 @@ public class RecipeInjector { } Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(wrappedItem.recipeIngredientId(), itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); if (ceRecipe == null) { return Optional.empty(); @@ -225,9 +221,7 @@ public class RecipeInjector { ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.field$SingleRecipeInput$item(args[0])); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(wrappedItem.recipeIngredientId(), itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); if (ceRecipe == null) { return Optional.empty(); @@ -272,9 +266,7 @@ public class RecipeInjector { // 获取唯一内存地址id ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.field$SingleRecipeInput$item(args[0])); Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); - UniqueKey uniqueKey = UniqueKey.create(wrappedItem.id()); - - SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(uniqueKey, itemStack)); + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(wrappedItem.recipeIngredientId(), itemStack)); CustomCookingRecipe ceRecipe = (CustomCookingRecipe) recipeManager.recipeByInput(injectedCacheCheck.customRecipeType(), input, injectedCacheCheck.lastCustomRecipe()); // 这个ce配方并不存在,那么应该返回空 if (ceRecipe == null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java index 3bfcc6b6d..13a1968a8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -79,16 +79,14 @@ public class InteractUtils { }); registerInteraction(BlockKeys.SOUL_CAMPFIRE, (player, item, blockState, result) -> { if (!Config.enableRecipeSystem()) return false; - UniqueKey uniqueKey = UniqueKey.create(item.id()); return BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( - uniqueKey, item.getItem() + item.recipeIngredientId(), item.getItem() ))) != null; }); registerInteraction(BlockKeys.CAMPFIRE, (player, item, blockState, result) -> { if (!Config.enableRecipeSystem()) return false; - UniqueKey uniqueKey = UniqueKey.create(item.id()); return BukkitRecipeManager.instance().recipeByInput(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( - uniqueKey, item.getItem() + item.recipeIngredientId(), item.getItem() ))) != null; }); registerInteraction(BlockKeys.DECORATED_POT, (player, item, blockState, result) -> true); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java index 063183752..9da9b4d92 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.item.data.JukeboxPlayable; import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.sparrow.nbt.Tag; import java.util.List; @@ -158,6 +159,11 @@ public class AbstractItem, I> implements Item { return this.factory.vanillaId(this.item); } + @Override + public UniqueKey recipeIngredientId() { + return this.factory.recipeIngredientID(this.item); + } + @Override public Optional customId() { return this.factory.customId(this.item); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ExternalItemProvider.java b/core/src/main/java/net/momirealms/craftengine/core/item/ExternalItemProvider.java index f5cea3ada..14dd780d8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ExternalItemProvider.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ExternalItemProvider.java @@ -8,4 +8,6 @@ public interface ExternalItemProvider { @Nullable I build(String id, ItemBuildContext context); + + String id(I item); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java index cced1bc88..1b3393aca 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -10,6 +10,7 @@ import net.momirealms.craftengine.core.item.data.Trim; import net.momirealms.craftengine.core.item.modifier.ItemDataModifier; import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.sparrow.nbt.Tag; import java.util.List; @@ -38,6 +39,8 @@ public interface Item { Key vanillaId(); + UniqueKey recipeIngredientId(); + Optional customId(); Item customId(Key id); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java index 543752c2d..f8d609f7d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java @@ -10,6 +10,7 @@ import net.momirealms.craftengine.core.item.setting.EquipmentData; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.sparrow.nbt.Tag; import java.util.List; @@ -204,4 +205,6 @@ public abstract class ItemFactory, I> { protected abstract W unsafeTransmuteCopy(W item, Object newItem, int count); protected abstract boolean isEmpty(W item); + + protected abstract UniqueKey recipeIngredientID(W item); } diff --git a/gradle.properties b/gradle.properties index abddf08df..8b428d409 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.59.7 +project_version=0.0.59.8 config_version=41 lang_version=22 project_group=net.momirealms