Skip to content

Commit

Permalink
不知道写了什么,先写一点
Browse files Browse the repository at this point in the history
  • Loading branch information
Gu-ZT committed Feb 14, 2025
1 parent c8a0a29 commit 4f0e746
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 18 deletions.
23 changes: 15 additions & 8 deletions src/main/java/dev/dubhe/anvilcraft/recipe/neo/InWorldRecipe.java
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -23,6 +25,8 @@ public class InWorldRecipeContext implements RecipeInput {
@Getter
private final Vec3 triggerPos;
private final Map<ResourceLocation, Object> data = new HashMap<>();
@Getter
private final List<RecipePredicate<?>> passed = new ArrayList<>();

private InWorldRecipeContext(MinecraftServer server, ServerLevel level, Entity triggerEntity, Vec3 triggerPos) {
this.server = server;
Expand Down Expand Up @@ -53,6 +57,15 @@ public <T> 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;
Expand All @@ -62,4 +75,7 @@ public int size() {
public boolean isEmpty() {
return true;
}

public void reset() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ public class InWorldRecipeManager {
return recipes.getOrDefault(recipeTrigger, Set.of());
}

public void trigger(RecipeTrigger recipeTrigger, InWorldRecipeContext context) {
Set<InWorldRecipe> 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);
}
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/dev/dubhe/anvilcraft/recipe/neo/RecipePredicate.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,19 @@ public interface RecipePredicate<T extends RecipePredicate<T>> 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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<HolderSet<Item>> items,
MinMaxBounds.Ints count,
DataComponentPredicate components,
Map<ItemSubPredicate.Type<?>, ItemSubPredicate> subPredicates
) implements RecipePredicate<HasItem> {
public class HasItem implements RecipePredicate<HasItem> {
protected final Vec3 pos;
protected final Vec3 range;
protected final HolderSet<Item> items;
protected final MinMaxBounds.Ints count;
protected final DataComponentPredicate components;
protected final Map<ItemSubPredicate.Type<?>, ItemSubPredicate> subPredicates;

public HasItem(Vec3 pos, Vec3 range, HolderSet<Item> items, MinMaxBounds.Ints count, DataComponentPredicate components, Map<ItemSubPredicate.Type<?>, ItemSubPredicate> subPredicates) {
this.pos = pos;
this.range = range;
this.items = items;
this.count = count;
this.components = components;
this.subPredicates = subPredicates;
}

@Override
public @NotNull RecipePredicateType<HasItem> getType() {
return null;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Item> items, MinMaxBounds.Ints count, DataComponentPredicate components, Map<ItemSubPredicate.Type<?>, 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) {
}
}

0 comments on commit 4f0e746

Please sign in to comment.