diff options
8 files changed, 92 insertions, 44 deletions
diff --git a/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java b/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java index 0b1431a35..e1ff44c24 100644 --- a/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java +++ b/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java @@ -51,6 +51,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Function; import java.util.function.Supplier; +import java.util.stream.Stream; @Environment(EnvType.CLIENT) public interface EntryStack extends TextRepresentable { @@ -207,10 +208,16 @@ public interface EntryStack extends TextRepresentable { return copyItemToFluid(stack); } + @Deprecated + @ApiStatus.ScheduledForRemoval static EntryStack copyItemToFluid(EntryStack stack) { return FluidSupportProvider.getInstance().itemToFluid(stack); } + static Stream<EntryStack> copyItemToFluids(EntryStack stack) { + return FluidSupportProvider.getInstance().itemToFluids(stack); + } + Optional<ResourceLocation> getIdentifier(); EntryStack.Type getType(); diff --git a/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java b/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java index 414b80171..76d964965 100644 --- a/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java +++ b/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java @@ -27,8 +27,13 @@ import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.impl.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.world.InteractionResultHolder; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; +import java.util.stream.Stream; /** * Experimental library, scheduled to change if needed. @@ -40,13 +45,13 @@ public interface FluidSupportProvider { @ApiStatus.ScheduledForRemoval FluidSupportProvider INSTANCE = new FluidSupportProvider() { @Override - public void registerFluidProvider(@NotNull FluidProvider provider) { - getInstance().registerFluidProvider(provider); + public void registerProvider(@NotNull Provider provider) { + getInstance().registerProvider(provider); } @Override - public @NotNull EntryStack itemToFluid(@NotNull EntryStack itemStack) { - return getInstance().itemToFluid(itemStack); + public @NotNull Stream<EntryStack> itemToFluids(@NotNull EntryStack itemStack) { + return getInstance().itemToFluids(itemStack); } }; @@ -54,7 +59,21 @@ public interface FluidSupportProvider { return Internals.getFluidSupportProvider(); } - void registerFluidProvider(@NotNull FluidProvider provider); + /** + * @deprecated Please switch to {@link FluidSupportProvider#registerProvider(Provider)} + */ + @Deprecated + @ApiStatus.ScheduledForRemoval + default void registerFluidProvider(@NotNull FluidProvider provider) { + registerProvider(itemStack -> { + EntryStack stack = Objects.requireNonNull(provider.itemToFluid(itemStack)); + if (!stack.isEmpty()) + return InteractionResultHolder.success(Stream.of(stack)); + return InteractionResultHolder.pass(null); + }); + } + + void registerProvider(@NotNull Provider provider); @Deprecated @ApiStatus.ScheduledForRemoval @@ -64,8 +83,15 @@ public interface FluidSupportProvider { } @NotNull - EntryStack itemToFluid(@NotNull EntryStack itemStack); + default EntryStack itemToFluid(@NotNull EntryStack itemStack) { + return itemToFluids(itemStack).findFirst().orElse(EntryStack.empty()); + } + + @NotNull + Stream<EntryStack> itemToFluids(@NotNull EntryStack itemStack); + @Deprecated + @ApiStatus.ScheduledForRemoval interface FluidProvider { @Deprecated @ApiStatus.ScheduledForRemoval @@ -74,9 +100,17 @@ public interface FluidSupportProvider { return EntryStack.empty(); } + @Deprecated + @ApiStatus.ScheduledForRemoval @NotNull default EntryStack itemToFluid(@NotNull EntryStack itemStack) { return EntryStack.empty(); } } + + @FunctionalInterface + interface Provider { + @NotNull + InteractionResultHolder<@Nullable Stream<@NotNull EntryStack>> itemToFluid(@NotNull EntryStack itemStack); + } } diff --git a/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/utils/FormattingUtils.java b/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/utils/FormattingUtils.java index 411518b37..5d1b3f5c8 100644 --- a/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/utils/FormattingUtils.java +++ b/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/utils/FormattingUtils.java @@ -30,7 +30,7 @@ public final class FormattingUtils { for (char c : string.toCharArray()) { if (lastSpecial) { lastSpecial = false; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || c == 'r' || (c >= 'A' && c <= 'F') || c == 'R')) { + if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'k' && c <= 'o') || c == 'r' || (c >= 'A' && c <= 'F') || (c >= 'K' && c <= 'O') || c == 'R')) { builder.append('ยง'); builder.append(c); } diff --git a/RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index 0da32a6cc..3c1ef8c46 100644 --- a/RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/RoughlyEnoughItems-default-plugin/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -81,6 +81,7 @@ import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; import net.minecraft.util.LazyLoadedValue; import net.minecraft.util.Mth; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.item.*; import net.minecraft.world.item.alchemy.PotionUtils; import net.minecraft.world.item.crafting.*; @@ -93,10 +94,10 @@ import net.minecraft.world.level.material.Fluid; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import java.util.*; import java.util.function.UnaryOperator; +import java.util.stream.Stream; import static me.shedaniel.rei.impl.Internals.attachInstance; @@ -370,14 +371,11 @@ public class DefaultPlugin implements REIPluginV0, BuiltinPlugin { recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING); recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING); recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING); - FluidSupportProvider.getInstance().registerFluidProvider(new FluidSupportProvider.FluidProvider() { - @Override - public @NotNull EntryStack itemToFluid(@NotNull EntryStack itemStack) { - Item item = itemStack.getItem(); - if (item instanceof BucketItem) - return EntryStack.create(((BucketItem) item).content, 1000); - return EntryStack.empty(); - } + FluidSupportProvider.getInstance().registerProvider(itemStack -> { + Item item = itemStack.getItem(); + if (item instanceof BucketItem) + return InteractionResultHolder.success(Stream.of(EntryStack.create(((BucketItem) item).content, 1000))); + return InteractionResultHolder.pass(null); }); // SubsetsRegistry subsetsRegistry = SubsetsRegistry.INSTANCE; // subsetsRegistry.registerPathEntry("roughlyenoughitems:food", EntryStack.create(Items.MILK_BUCKET)); diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java index e1dda377f..65019ba8b 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java @@ -138,7 +138,7 @@ public class FluidEntryStack extends AbstractEntryStack { @Override public boolean equalsIgnoreTagsAndAmount(EntryStack stack) { if (stack.getType() == Type.ITEM) - return equalsIgnoreTagsAndAmount(EntryStack.copyItemToFluid(stack)); + return EntryStack.copyItemToFluids(stack).anyMatch(this::equalsIgnoreTagsAndAmount); if (stack.getType() != Type.FLUID) return false; return fluid == stack.getFluid(); @@ -147,7 +147,7 @@ public class FluidEntryStack extends AbstractEntryStack { @Override public boolean equalsIgnoreTags(EntryStack stack) { if (stack.getType() == Type.ITEM) - return equalsIgnoreTags(EntryStack.copyItemToFluid(stack)); + return EntryStack.copyItemToFluids(stack).anyMatch(this::equalsIgnoreTags); if (stack.getType() != Type.FLUID) return false; return fluid == stack.getFluid() && (amount.equals(IGNORE_AMOUNT) || stack.getAccurateAmount().equals(IGNORE_AMOUNT) || amount.equals(stack.getAccurateAmount())); @@ -156,7 +156,7 @@ public class FluidEntryStack extends AbstractEntryStack { @Override public boolean equalsIgnoreAmount(EntryStack stack) { if (stack.getType() == Type.ITEM) - return equalsIgnoreAmount(EntryStack.copyItemToFluid(stack)); + return EntryStack.copyItemToFluids(stack).anyMatch(this::equalsIgnoreAmount); if (stack.getType() != Type.FLUID) return false; return fluid == stack.getFluid(); diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java index a26ee663f..724cf39f3 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java @@ -26,35 +26,46 @@ package me.shedaniel.rei.impl; import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.fluid.FluidSupportProvider; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Objects; +import java.util.stream.Stream; @ApiStatus.Experimental @ApiStatus.Internal public class FluidSupportProviderImpl implements FluidSupportProvider { - private final List<FluidProvider> providers = Lists.newCopyOnWriteArrayList(); + private final List<Provider> providers = Lists.newCopyOnWriteArrayList(); public void reset() { providers.clear(); } @Override - public void registerFluidProvider(@NotNull FluidProvider provider) { + public void registerProvider(@NotNull Provider provider) { providers.add(Objects.requireNonNull(provider, "Registered provider is null!")); } @Override - public @NotNull EntryStack itemToFluid(@NotNull EntryStack itemStack) { - if (itemStack.isEmpty()) return EntryStack.empty(); + public @NotNull Stream<EntryStack> itemToFluids(@NotNull EntryStack itemStack) { + if (itemStack.isEmpty()) return Stream.empty(); if (itemStack.getType() != EntryStack.Type.ITEM) throw new IllegalArgumentException("EntryStack must be item!"); - for (FluidProvider provider : providers) { - EntryStack stack = Objects.requireNonNull(provider.itemToFluid(itemStack)); - if (!stack.isEmpty()) return stack; + for (Provider provider : providers) { + InteractionResultHolder<@Nullable Stream<@NotNull EntryStack>> resultHolder = Objects.requireNonNull(provider.itemToFluid(itemStack)); + Stream<@NotNull EntryStack> stream = resultHolder.getObject(); + if (stream != null) { + if (resultHolder.getResult().consumesAction()) { + return stream; + } else if (resultHolder.getResult() == InteractionResult.FAIL) { + return Stream.empty(); + } + } } - return EntryStack.empty(); + return Stream.empty(); } } diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java index 267f72e1e..0e3e17d89 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java @@ -63,6 +63,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Stream; @ApiStatus.Internal public class ItemEntryStack extends AbstractEntryStack implements OptimalEntryStack { @@ -128,29 +129,28 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt * 2: ignore amount * 3: all */ - private Boolean compareIfFluid(EntryStack stack, int type) { - EntryStack fluid = EntryStack.copyItemToFluid(this); - if (fluid.isEmpty()) return null; + private boolean compareIfFluid(EntryStack stack, int type) { + Stream<EntryStack> fluids = EntryStack.copyItemToFluids(this); + Stream<EntryStack> stacks = Stream.empty(); if (stack.getType() == Type.ITEM) - stack = EntryStack.copyItemToFluid(stack); - if (stack.isEmpty()) return null; + stacks = EntryStack.copyItemToFluids(stack); switch (type) { case 0: - return fluid.equalsIgnoreTagsAndAmount(stack); + return stacks.anyMatch(entryStack -> fluids.anyMatch(entryStack::equalsIgnoreTagsAndAmount)); case 1: - return fluid.equalsIgnoreTags(stack); + return stacks.anyMatch(entryStack -> fluids.anyMatch(entryStack::equalsIgnoreTags)); case 2: - return fluid.equalsIgnoreAmount(stack); + return stacks.anyMatch(entryStack -> fluids.anyMatch(entryStack::equalsIgnoreAmount)); case 3: - return fluid.equalsAll(stack); + return stacks.anyMatch(entryStack -> fluids.anyMatch(entryStack::equalsAll)); } - return null; + + return false; } @Override public boolean equalsIgnoreTagsAndAmount(EntryStack stack) { - Boolean ifFluid = compareIfFluid(stack, 0); - if (ifFluid != null) return ifFluid; + if (compareIfFluid(stack, 0)) return true; if (stack.getType() != Type.ITEM) return false; return itemStack.getItem() == stack.getItem(); @@ -165,8 +165,7 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt @Override public boolean equalsIgnoreAmount(EntryStack stack) { - Boolean ifFluid = compareIfFluid(stack, 2); - if (ifFluid != null) return ifFluid; + if (compareIfFluid(stack, 2)) return true; if (stack.getType() != Type.ITEM) return false; if (itemStack.getItem() != stack.getItem()) @@ -234,8 +233,7 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt @Override public boolean equalsIgnoreTags(EntryStack stack) { - Boolean ifFluid = compareIfFluid(stack, 1); - if (ifFluid != null) return ifFluid; + if (compareIfFluid(stack, 1)) return true; if (stack.getType() != Type.ITEM) return false; if (itemStack.getItem() != stack.getItem()) diff --git a/gradle.properties b/gradle.properties index b9ff923bc..38930efad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx3G -mod_version=5.2.11 +mod_version=5.3.0 supported_version=1.16.2 minecraft_version=1.16.2-rc1 yarn_version=1.16.2-rc1+build.4+legacy.20w09a+build.8 |
