From 4f0e7467faf4c5bbbf854548ab7f47ffc8146a6f Mon Sep 17 00:00:00 2001 From: Gugle Date: Fri, 14 Feb 2025 23:24:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8D=E7=9F=A5=E9=81=93=E5=86=99=E4=BA=86?= =?UTF-8?q?=E4=BB=80=E4=B9=88=EF=BC=8C=E5=85=88=E5=86=99=E4=B8=80=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anvilcraft/recipe/neo/InWorldRecipe.java | 23 +++++++----- .../recipe/neo/InWorldRecipeContext.java | 16 +++++++++ .../recipe/neo/InWorldRecipeManager.java | 12 +++++++ .../recipe/neo/RecipePredicate.java | 15 ++++++++ .../recipe/neo/predicate/HasItem.java | 28 +++++++++------ .../neo/predicate/HasItemIngredient.java | 36 +++++++++++++++++++ 6 files changed, 112 insertions(+), 18 deletions(-) create mode 100644 src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItemIngredient.java diff --git a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipe.java b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipe.java index 2c84aab25..a3aeffd29 100644 --- a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipe.java +++ b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipe.java @@ -52,21 +52,28 @@ public InWorldRecipe(@Nullable ItemStack icon, @NotNull RecipeTrigger trigger, @ public boolean matches(@NotNull InWorldRecipeContext inWorldRecipeContext, @NotNull Level level) { int count = 0; for (RecipePredicate predicate : predicates) { - if (predicate.test(inWorldRecipeContext)) count++; + if (predicate.getConsumeType() != RecipePredicate.ConsumeType.NON_CONSUMING) continue; + if (predicate.test(inWorldRecipeContext)) { + inWorldRecipeContext.pass(predicate); + count++; + } } - if (count != predicates.size()) return false; - for (RecipeOutcome outcome : outcomes) { - outcome.accept(inWorldRecipeContext); + for (RecipePredicate predicate : predicates) { + if (predicate.getConsumeType() != RecipePredicate.ConsumeType.CONSUMABLE) continue; + if (predicate.test(inWorldRecipeContext)) { + inWorldRecipeContext.pass(predicate); + count++; + } } - return true; + return count == predicates.size(); } @Override public @NotNull ItemStack assemble(@NotNull InWorldRecipeContext inWorldRecipeContext, HolderLookup.@NotNull Provider provider) { if (!this.matches(inWorldRecipeContext, inWorldRecipeContext.getLevel())) return ItemStack.EMPTY; - for (RecipeOutcome outcome : outcomes) { - outcome.accept(inWorldRecipeContext); - } + for (RecipePredicate predicate : inWorldRecipeContext.getPassed()) predicate.accept(inWorldRecipeContext); + for (RecipeOutcome outcome : outcomes) outcome.accept(inWorldRecipeContext); + inWorldRecipeContext.reset(); return this.icon.getFirst().copy(); } diff --git a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeContext.java b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeContext.java index 7003a0584..f2603c0db 100644 --- a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeContext.java +++ b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeContext.java @@ -10,7 +10,9 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class InWorldRecipeContext implements RecipeInput { @@ -23,6 +25,8 @@ public class InWorldRecipeContext implements RecipeInput { @Getter private final Vec3 triggerPos; private final Map data = new HashMap<>(); + @Getter + private final List> passed = new ArrayList<>(); private InWorldRecipeContext(MinecraftServer server, ServerLevel level, Entity triggerEntity, Vec3 triggerPos) { this.server = server; @@ -53,6 +57,15 @@ public T getData(ResourceLocation location, @SuppressWarnings("unused") Clas return ItemStack.EMPTY; } + public void pass(RecipePredicate predicate) { + this.passed.add(predicate); + predicate.push(this); + } + + public void pop() { + this.passed.removeLast().pop(this); + } + @Override public int size() { return 0; @@ -62,4 +75,7 @@ public int size() { public boolean isEmpty() { return true; } + + public void reset() { + } } diff --git a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeManager.java b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeManager.java index 7915dc2b7..468b425d3 100644 --- a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeManager.java +++ b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipeManager.java @@ -27,6 +27,18 @@ public class InWorldRecipeManager { return recipes.getOrDefault(recipeTrigger, Set.of()); } + public void trigger(RecipeTrigger recipeTrigger, InWorldRecipeContext context) { + Set recipes = getRecipes(recipeTrigger); + for (InWorldRecipe recipe : recipes) { + int efficiency = AnvilCraft.config.anvilEfficiency; + while (efficiency > 0 && recipe.matches(context, context.getLevel())) { + efficiency--; + recipe.assemble(context, context.getLevel().registryAccess()); + } + if (efficiency != AnvilCraft.config.anvilEfficiency) break; + } + } + public void addRecipe(@NotNull InWorldRecipe recipe) { recipes.computeIfAbsent(recipe.getTrigger(), k -> new TreeSet<>()).add(recipe); } diff --git a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/RecipePredicate.java b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/RecipePredicate.java index 645cd17bc..fe029cbac 100644 --- a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/RecipePredicate.java +++ b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/RecipePredicate.java @@ -11,4 +11,19 @@ public interface RecipePredicate> extends Predicate @Override default void accept(InWorldRecipeContext inWorldRecipeContext) { } + + default void push(InWorldRecipeContext inWorldRecipeContext) { + } + + default void pop(InWorldRecipeContext inWorldRecipeContext) { + } + + default ConsumeType getConsumeType() { + return ConsumeType.NON_CONSUMING; + } + + enum ConsumeType { + CONSUMABLE, + NON_CONSUMING + } } diff --git a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItem.java b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItem.java index 698f710c4..b58beceff 100644 --- a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItem.java @@ -19,16 +19,24 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; -public record HasItem( - Vec3 pos, - Vec3 range, - Optional> items, - MinMaxBounds.Ints count, - DataComponentPredicate components, - Map, ItemSubPredicate> subPredicates -) implements RecipePredicate { +public class HasItem implements RecipePredicate { + protected final Vec3 pos; + protected final Vec3 range; + protected final HolderSet items; + protected final MinMaxBounds.Ints count; + protected final DataComponentPredicate components; + protected final Map, ItemSubPredicate> subPredicates; + + public HasItem(Vec3 pos, Vec3 range, HolderSet items, MinMaxBounds.Ints count, DataComponentPredicate components, Map, ItemSubPredicate> subPredicates) { + this.pos = pos; + this.range = range; + this.items = items; + this.count = count; + this.components = components; + this.subPredicates = subPredicates; + } + @Override public @NotNull RecipePredicateType getType() { return null; @@ -47,7 +55,7 @@ public boolean test(@NotNull InWorldRecipeContext inWorldRecipeContext) { } public boolean test(@NotNull ItemStack stack) { - if (this.items.isPresent() && !stack.is(this.items.get())) { + if (!stack.is(this.items)) { return false; } else if (!this.components.test(stack)) { return false; diff --git a/src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItemIngredient.java b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItemIngredient.java new file mode 100644 index 000000000..bca182ab6 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/recipe/neo/predicate/HasItemIngredient.java @@ -0,0 +1,36 @@ +package dev.dubhe.anvilcraft.recipe.neo.predicate; + +import dev.dubhe.anvilcraft.recipe.neo.InWorldRecipeContext; +import net.minecraft.advancements.critereon.ItemSubPredicate; +import net.minecraft.advancements.critereon.MinMaxBounds; +import net.minecraft.core.HolderSet; +import net.minecraft.core.component.DataComponentPredicate; +import net.minecraft.world.item.Item; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +public class HasItemIngredient extends HasItem{ + public HasItemIngredient(Vec3 pos, Vec3 range, HolderSet items, MinMaxBounds.Ints count, DataComponentPredicate components, Map, ItemSubPredicate> subPredicates) { + super(pos, range, items, count, components, subPredicates); + } + + @Override + public boolean test(@NotNull InWorldRecipeContext inWorldRecipeContext) { + return super.test(inWorldRecipeContext); + } + + @Override + public void accept(InWorldRecipeContext inWorldRecipeContext) { + super.accept(inWorldRecipeContext); + } + + @Override + public void push(InWorldRecipeContext inWorldRecipeContext) { + } + + @Override + public void pop(InWorldRecipeContext inWorldRecipeContext) { + } +}