From 2a7ef2a4391d2baadac952cdc0c2f0bd91f6c2cd Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 11 Nov 2025 20:37:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0ingredient=20elements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/items/topaz_armor.yml | 2 + .../configuration/templates/models.yml | 49 ++++++++++--------- .../core/item/AbstractItemManager.java | 7 +++ .../craftengine/core/item/ItemManager.java | 2 + .../item/recipe/AbstractRecipeSerializer.java | 8 ++- .../core/item/recipe/Ingredient.java | 20 +++++--- .../core/item/recipe/IngredientElement.java | 12 +++++ 7 files changed, 67 insertions(+), 33 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/recipe/IngredientElement.java diff --git a/common-files/src/main/resources/resources/default/configuration/items/topaz_armor.yml b/common-files/src/main/resources/resources/default/configuration/items/topaz_armor.yml index 8d624a490..ba9876611 100644 --- a/common-files/src/main/resources/resources/default/configuration/items/topaz_armor.yml +++ b/common-files/src/main/resources/resources/default/configuration/items/topaz_armor.yml @@ -14,6 +14,8 @@ templates: slot: ${slot} model: template: default:model/armor_trim + arguments: + texture: minecraft:item/custom/topaz_${part} items: default:topaz_helmet: template: diff --git a/common-files/src/main/resources/resources/default/configuration/templates/models.yml b/common-files/src/main/resources/resources/default/configuration/templates/models.yml index c63b7d8b1..8c681c2c0 100644 --- a/common-files/src/main/resources/resources/default/configuration/templates/models.yml +++ b/common-files/src/main/resources/resources/default/configuration/templates/models.yml @@ -147,115 +147,116 @@ templates#models#2d: # arguments: # material: armor material type # part: slot type + # texture: the texture path of the armor item default:model/armor_trim: type: minecraft:select property: minecraft:trim_material fallback: type: minecraft:model - path: minecraft:item/custom/${material}_${part} + path: ${__NAMESPACE__}:item/${material}_${part} generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} cases: - when: minecraft:quartz model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_quartz_trim + path: ${__NAMESPACE__}:item/${material}_${part}_quartz_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_quartz - when: minecraft:iron model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_iron_trim + path: ${__NAMESPACE__}:item/${material}_${part}_iron_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_iron - when: minecraft:netherite model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_netherite_trim + path: ${__NAMESPACE__}:item/${material}_${part}_netherite_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_netherite - when: minecraft:redstone model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_redstone_trim + path: ${__NAMESPACE__}:item/${material}_${part}_redstone_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_redstone - when: minecraft:copper model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_copper_trim + path: ${__NAMESPACE__}:item/${material}_${part}_copper_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_copper - when: minecraft:gold model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_gold_trim + path: ${__NAMESPACE__}:item/${material}_${part}_gold_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_gold - when: minecraft:emerald model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_emerald_trim + path: ${__NAMESPACE__}:item/${material}_${part}_emerald_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_emerald - when: minecraft:diamond model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_diamond_trim + path: ${__NAMESPACE__}:item/${material}_${part}_diamond_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_diamond - when: minecraft:lapis model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_lapis_trim + path: ${__NAMESPACE__}:item/${material}_${part}_lapis_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_lapis - when: minecraft:amethyst model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_amethyst_trim + path: ${__NAMESPACE__}:item/${material}_${part}_amethyst_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_amethyst - when: minecraft:resin model: type: minecraft:model - path: minecraft:item/custom/${material}_${part}_resin_trim + path: ${__NAMESPACE__}:item/${material}_${part}_resin_trim generation: parent: minecraft:item/generated textures: - layer0: minecraft:item/custom/${material}_${part} + layer0: ${texture} layer1: minecraft:trims/items/${part}_trim_resin # shield diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java index 21967555f..848bca650 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -232,6 +232,13 @@ public abstract class AbstractItemManager extends AbstractModelGenerator impl return Collections.unmodifiableList(this.customItemTags.getOrDefault(tag, List.of())); } + @Override + public Collection itemTags() { + Set tags = new HashSet<>(VANILLA_ITEM_TAGS.keySet()); + tags.addAll(this.customItemTags.keySet()); + return tags; + } + @Override public Collection cachedCustomItemSuggestions() { return Collections.unmodifiableCollection(this.cachedCustomItemSuggestions); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index f408f7e4c..3b017a27a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -101,6 +101,8 @@ public interface ItemManager extends Manageable, ModelGenerator { int fuelTime(Key id); + Collection itemTags(); + Collection cachedCustomItemSuggestions(); Collection cachedAllItemSuggestions(); 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 1c41c1f38..b98b86b27 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 @@ -143,9 +143,12 @@ public abstract class AbstractRecipeSerializer> implement Set itemIds = new HashSet<>(); Set minecraftItemIds = new HashSet<>(); ItemManager itemManager = CraftEngine.instance().itemManager(); + List elements = new ArrayList<>(); for (String item : items) { if (item.charAt(0) == '#') { - List uniqueKeys = itemManager.itemIdsByTag(Key.of(item.substring(1))); + Key tag = Key.of(item.substring(1)); + elements.add(new IngredientElement.Tag(tag)); + List uniqueKeys = itemManager.itemIdsByTag(tag); itemIds.addAll(uniqueKeys); for (UniqueKey uniqueKey : uniqueKeys) { List ingredientSubstitutes = itemManager.getIngredientSubstitutes(uniqueKey.key()); @@ -155,6 +158,7 @@ public abstract class AbstractRecipeSerializer> implement } } else { Key itemId = Key.of(item); + elements.add(new IngredientElement.Item(itemId)); if (itemManager.getBuildableItem(itemId).isEmpty()) { throw new LocalizedResourceConfigException("warning.config.recipe.invalid_ingredient", item); } @@ -189,6 +193,6 @@ public abstract class AbstractRecipeSerializer> implement } minecraftItemIds.add(vanillaItem); } - return itemIds.isEmpty() ? null : Ingredient.of(itemIds, minecraftItemIds, hasCustomItem); + return itemIds.isEmpty() ? null : Ingredient.of(elements, itemIds, minecraftItemIds, hasCustomItem); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java index 6d2f1ce02..72c0fc3d6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java @@ -6,6 +6,7 @@ import java.util.*; import java.util.function.Predicate; public class Ingredient implements Predicate>, StackedContents.IngredientInfo { + private final List elements; // 自定义物品与原版物品混合的列表 private final List items; // 自定义物品原版材质与原版物品混合的列表 @@ -13,7 +14,8 @@ public class Ingredient implements Predicate>, StackedContent // ingredient里是否含有自定义物品 private final boolean hasCustomItem; - private Ingredient(List items, List vanillaItems, boolean hasCustomItem) { + private Ingredient(List elements, List items, List vanillaItems, boolean hasCustomItem) { + this.elements = List.copyOf(elements); this.items = List.copyOf(items); this.vanillaItems = List.copyOf(vanillaItems); this.hasCustomItem = hasCustomItem; @@ -24,12 +26,8 @@ public class Ingredient implements Predicate>, StackedContent .orElseGet(stack::isEmpty); } - public static Ingredient of(Set items, Set minecraftItems, boolean hasCustomItem) { - return new Ingredient<>(new ArrayList<>(items), new ArrayList<>(minecraftItems), hasCustomItem); - } - - public boolean hasCustomItem() { - return hasCustomItem; + public static Ingredient of(List elements, Set items, Set minecraftItems, boolean hasCustomItem) { + return new Ingredient<>(elements, new ArrayList<>(items), new ArrayList<>(minecraftItems), hasCustomItem); } @Override @@ -42,6 +40,14 @@ public class Ingredient implements Predicate>, StackedContent return false; } + public List elements() { + return this.elements; + } + + public boolean hasCustomItem() { + return this.hasCustomItem; + } + public List items() { return this.items; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/IngredientElement.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/IngredientElement.java new file mode 100644 index 000000000..9512c8181 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/IngredientElement.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.util.Key; + +public sealed interface IngredientElement permits IngredientElement.Item, IngredientElement.Tag { + + record Item(Key id) implements IngredientElement { + } + + record Tag(Key tag) implements IngredientElement { + } +}