소스 검색

Made FluidSupportProvider capable in returning more than 1 fluid and fix hwyla double modid tooltip

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel 4 년 전
부모
커밋
10061ecdd2

+ 7 - 0
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();

+ 40 - 6
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);
+    }
 }

+ 1 - 1
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);
                 }

+ 7 - 9
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));

+ 3 - 3
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();

+ 19 - 8
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();
     }
 }

+ 14 - 16
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())

+ 1 - 1
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