diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-06-21 00:01:14 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2023-05-29 21:04:21 +0800 |
| commit | e86c691c13b95834e89fe072b0a30e00e0da3ea8 (patch) | |
| tree | ab4a535a579745bf8dcb43aea74b4008ce6361d2 /api/src/main/java | |
| parent | 5b984916ba16c3b00e5e149661e35702338e325d (diff) | |
| download | RoughlyEnoughItems-e86c691c13b95834e89fe072b0a30e00e0da3ea8.tar.gz RoughlyEnoughItems-e86c691c13b95834e89fe072b0a30e00e0da3ea8.tar.bz2 RoughlyEnoughItems-e86c691c13b95834e89fe072b0a30e00e0da3ea8.zip | |
Add tag helper methods in EntryIngredients
Diffstat (limited to 'api/src/main/java')
| -rw-r--r-- | api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java | 2 | ||||
| -rw-r--r-- | api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java | 45 |
2 files changed, 47 insertions, 0 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java index b3c5616c9..7cf3a3573 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java @@ -36,6 +36,8 @@ import java.util.function.UnaryOperator; /** * An immutable representation of a list of {@link EntryStack}. + * + * @see me.shedaniel.rei.api.common.util.EntryIngredients */ @ApiStatus.NonExtendable public interface EntryIngredient extends List<EntryStack<?>> { diff --git a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java index 41c103a03..9ad64534e 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java @@ -31,8 +31,13 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.Registry; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; @@ -42,6 +47,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.function.Function; public final class EntryIngredients { private EntryIngredients() {} @@ -134,6 +140,45 @@ public final class EntryIngredients { return ImmutableList.copyOf(result); } + public static <S, T> EntryIngredient ofTag(TagKey<S> tagKey, Function<Holder<S>, EntryStack<T>> mapper) { + Registry<S> registry = ((Registry<Registry<S>>) Registry.REGISTRY).get((ResourceKey<Registry<S>>) tagKey.registry()); + HolderSet.Named<S> holders = registry.getTag(tagKey).orElse(null); + if (holders == null) return EntryIngredient.empty(); + EntryIngredient.Builder result = EntryIngredient.builder(holders.size()); + for (Holder<S> holder : holders) { + EntryStack<T> stack = mapper.apply(holder); + if (!stack.isEmpty()) { + result.add(stack); + } + } + return result.build(); + } + + public static <S, T> List<EntryIngredient> ofTags(Iterable<TagKey<S>> tagKeys, Function<Holder<S>, EntryStack<T>> mapper) { + if (tagKeys instanceof Collection collection && collection.isEmpty()) return Collections.emptyList(); + ImmutableList.Builder<EntryIngredient> ingredients = ImmutableList.builder(); + for (TagKey<S> tagKey : tagKeys) { + ingredients.add(ofTag(tagKey, mapper)); + } + return ingredients.build(); + } + + public static <T extends ItemLike> EntryIngredient ofItemTag(TagKey<T> tagKey) { + return ofTag(tagKey, holder -> EntryStacks.of(holder.value())); + } + + public static EntryIngredient ofFluidTag(TagKey<Fluid> tagKey) { + return ofTag(tagKey, holder -> EntryStacks.of(holder.value())); + } + + public static <T extends ItemLike> List<EntryIngredient> ofItemTags(Iterable<TagKey<T>> tagKey) { + return ofTags(tagKey, holder -> EntryStacks.of(holder.value())); + } + + public static List<EntryIngredient> ofFluidTags(Iterable<TagKey<Fluid>> tagKey) { + return ofTags(tagKey, holder -> EntryStacks.of(holder.value())); + } + public static <T> boolean testFuzzy(EntryIngredient ingredient, EntryStack<T> stack) { for (EntryStack<?> ingredientStack : ingredient) { if (EntryStacks.equalsFuzzy(ingredientStack, stack)) { |
