diff options
5 files changed, 81 insertions, 7 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/fluid/FluidSupportProvider.java b/api/src/main/java/me/shedaniel/rei/api/common/fluid/FluidSupportProvider.java index f6260a4fc..84ea91b84 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/fluid/FluidSupportProvider.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/fluid/FluidSupportProvider.java @@ -46,10 +46,10 @@ public interface FluidSupportProvider extends Reloadable<REIPlugin<?>>, List<Flu void register(Provider provider); - Optional<Stream<EntryStack<FluidStack>>> itemToFluids(EntryStack<? extends ItemStack> itemStack); + Optional<Stream<EntryStack<FluidStack>>> itemToFluids(EntryStack<? extends ItemStack> stack); @FunctionalInterface interface Provider { - InteractionResultHolder<@Nullable Stream<EntryStack<FluidStack>>> itemToFluid(EntryStack<? extends ItemStack> itemStack); + InteractionResultHolder<@Nullable Stream<EntryStack<FluidStack>>> itemToFluid(EntryStack<? extends ItemStack> stack); } } diff --git a/build.gradle b/build.gradle index 4cbfbd082..2440b9ab2 100755 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id("architectury-plugin") version("3.0-SNAPSHOT") + id("architectury-plugin") version("3.1-SNAPSHOT") id("forgified-fabric-loom") version("0.6-SNAPSHOT") apply false id("org.cadixdev.licenser") version("0.5.0") id("com.matthewprenger.cursegradle") version("1.4.0") diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java index 136ab6a61..94593cb64 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java @@ -23,7 +23,10 @@ package me.shedaniel.rei.plugin.common; +import me.shedaniel.architectury.annotations.ExpectPlatform; +import me.shedaniel.architectury.annotations.PlatformOnly; import me.shedaniel.architectury.hooks.FluidStackHooks; +import me.shedaniel.architectury.platform.Platform; import me.shedaniel.architectury.utils.NbtType; import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; import me.shedaniel.rei.api.common.entry.comparison.ItemComparator; @@ -52,6 +55,7 @@ import net.minecraft.world.inventory.*; import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.material.Fluid; import java.util.List; import java.util.function.Function; @@ -80,10 +84,22 @@ public class DefaultPlugin implements BuiltinPlugin, REIServerPlugin { support.register(entry -> { ItemStack stack = entry.getValue(); if (stack.getItem() instanceof BucketItem) { - return InteractionResultHolder.success(Stream.of(EntryStacks.of(((BucketItem) stack.getItem()).content, FluidStackHooks.bucketAmount()))); + Fluid fluid = ((BucketItem) stack.getItem()).content; + if (fluid != null) { + return InteractionResultHolder.success(Stream.of(EntryStacks.of(fluid, FluidStackHooks.bucketAmount()))); + } } return InteractionResultHolder.pass(null); }); + if (Platform.isForge()) { + registerForgeFluidSupport(support); + } + } + + @ExpectPlatform + @PlatformOnly(PlatformOnly.FORGE) + private static void registerForgeFluidSupport(FluidSupportProvider support) { + } @Override diff --git a/forge/src/main/java/me/shedaniel/rei/plugin/common/forge/DefaultPluginImpl.java b/forge/src/main/java/me/shedaniel/rei/plugin/common/forge/DefaultPluginImpl.java new file mode 100644 index 000000000..7d44dd528 --- /dev/null +++ b/forge/src/main/java/me/shedaniel/rei/plugin/common/forge/DefaultPluginImpl.java @@ -0,0 +1,58 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.plugin.common.forge; + +import com.google.common.base.Predicates; +import me.shedaniel.architectury.hooks.forge.FluidStackHooksForge; +import me.shedaniel.rei.api.common.fluid.FluidSupportProvider; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; + +import java.util.stream.IntStream; + +public class DefaultPluginImpl { + public static void registerForgeFluidSupport(FluidSupportProvider support) { + support.register(stack -> { + ItemStack itemStack = stack.getValue(); + LazyOptional<IFluidHandlerItem> handlerOptional = FluidUtil.getFluidHandler(itemStack); + if (handlerOptional.isPresent()) { + IFluidHandlerItem handler = handlerOptional.orElse(null); + if (handler.getTanks() > 0) { + return InteractionResultHolder.success(IntStream.range(0, handler.getTanks()) + .mapToObj(handler::getFluidInTank) + .filter(Predicates.not(FluidStack::isEmpty)) + .map(FluidStackHooksForge::fromForge) + .map(EntryStacks::of)); + } + } + + return InteractionResultHolder.pass(null); + }); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java index 736b38e3e..d9d7295f0 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java @@ -62,10 +62,10 @@ public class FluidSupportProviderImpl extends ForwardingList<FluidSupportProvide } @Override - public Optional<Stream<EntryStack<FluidStack>>> itemToFluids(EntryStack<? extends ItemStack> itemStack) { - if (itemStack.isEmpty()) return Optional.empty(); + public Optional<Stream<EntryStack<FluidStack>>> itemToFluids(EntryStack<? extends ItemStack> stack) { + if (stack.isEmpty()) return Optional.empty(); for (Provider provider : providers) { - InteractionResultHolder<@Nullable Stream<EntryStack<FluidStack>>> resultHolder = Objects.requireNonNull(provider.itemToFluid(itemStack)); + InteractionResultHolder<@Nullable Stream<EntryStack<FluidStack>>> resultHolder = Objects.requireNonNull(provider.itemToFluid(stack)); Stream<EntryStack<FluidStack>> stream = resultHolder.getObject(); if (stream != null) { if (resultHolder.getResult().consumesAction()) { |
