From 8e617f5a6c92a21be270ec190261d979deac965f Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 18 Apr 2020 15:48:19 +0800 Subject: Added FluidSupportProvider Signed-off-by: shedaniel --- src/main/java/me/shedaniel/rei/api/EntryStack.java | 46 +++++++++++++------- .../rei/api/fluid/FluidSupportProvider.java | 34 +++++++++++++++ .../shedaniel/rei/gui/widget/EntryListWidget.java | 2 +- .../rei/gui/widget/FavoritesListWidget.java | 2 +- .../me/shedaniel/rei/impl/EmptyEntryStack.java | 7 +++- .../me/shedaniel/rei/impl/FluidEntryStack.java | 24 ++++++----- .../rei/impl/FluidSupportProviderImpl.java | 49 ++++++++++++++++++++++ .../java/me/shedaniel/rei/impl/ItemEntryStack.java | 19 +++++++-- .../me/shedaniel/rei/impl/RecipeHelperImpl.java | 2 + .../java/me/shedaniel/rei/impl/RenderingEntry.java | 10 +++++ .../me/shedaniel/rei/plugin/DefaultPlugin.java | 20 +++++++++ 11 files changed, 182 insertions(+), 33 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java create mode 100644 src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java (limited to 'src/main/java') diff --git a/src/main/java/me/shedaniel/rei/api/EntryStack.java b/src/main/java/me/shedaniel/rei/api/EntryStack.java index 46c1dd5e0..23c232ee1 100644 --- a/src/main/java/me/shedaniel/rei/api/EntryStack.java +++ b/src/main/java/me/shedaniel/rei/api/EntryStack.java @@ -27,19 +27,20 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.fluid.FluidSupportProvider; import me.shedaniel.rei.api.widgets.Tooltip; import me.shedaniel.rei.impl.EmptyEntryStack; import me.shedaniel.rei.impl.FluidEntryStack; import me.shedaniel.rei.impl.ItemEntryStack; import net.minecraft.client.resource.language.I18n; import net.minecraft.fluid.Fluid; -import net.minecraft.item.BucketItem; import net.minecraft.item.Item; import net.minecraft.item.ItemConvertible; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.StringNbtReader; import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -65,6 +66,10 @@ public interface EntryStack { return new FluidEntryStack(fluid, amount); } + static EntryStack create(Fluid fluid, double amount) { + return new FluidEntryStack(fluid, amount); + } + static EntryStack create(ItemStack stack) { return new ItemEntryStack(stack); } @@ -124,32 +129,41 @@ public interface EntryStack { } } + @Deprecated + @ApiStatus.ScheduledForRemoval static EntryStack copyFluidToBucket(EntryStack stack) { - if (stack.getType() != Type.FLUID) - throw new IllegalArgumentException("EntryStack must be fluid!"); - Fluid fluid = stack.getFluid(); - Item item = fluid.getBucketItem(); - if (item == null) - return EntryStack.empty(); - return EntryStack.create(item); + return copyFluidToItem(stack); + } + + static EntryStack copyFluidToItem(EntryStack stack) { + return FluidSupportProvider.INSTANCE.fluidToItem(stack); } + @Deprecated + @ApiStatus.ScheduledForRemoval static EntryStack copyBucketToFluid(EntryStack stack) { - if (stack.getType() != Type.ITEM) - throw new IllegalArgumentException("EntryStack must be item!"); - Item item = stack.getItem(); - if (item instanceof BucketItem) - return EntryStack.create(((BucketItem) item).fluid, 1000); - return EntryStack.empty(); + return copyItemToFluid(stack); + } + + static EntryStack copyItemToFluid(EntryStack stack) { + return FluidSupportProvider.INSTANCE.itemToFluid(stack); } Optional getIdentifier(); EntryStack.Type getType(); - int getAmount(); + default int getAmount() { + return MathHelper.floor(getFloatingAmount()); + } + + double getFloatingAmount(); + + default void setAmount(int amount) { + setFloatingAmount(amount); + } - void setAmount(int amount); + void setFloatingAmount(double amount); boolean isEmpty(); diff --git a/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java b/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java new file mode 100644 index 000000000..a8636d35e --- /dev/null +++ b/src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java @@ -0,0 +1,34 @@ +package me.shedaniel.rei.api.fluid; + +import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.impl.FluidSupportProviderImpl; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * Experimental library, scheduled to change if needed. + */ +@ApiStatus.Experimental +public interface FluidSupportProvider { + FluidSupportProvider INSTANCE = new FluidSupportProviderImpl(); + + void registerFluidProvider(@NotNull FluidProvider provider); + + @NotNull + EntryStack fluidToItem(@NotNull EntryStack fluidStack); + + @NotNull + EntryStack itemToFluid(@NotNull EntryStack itemStack); + + interface FluidProvider { + @NotNull + default EntryStack fluidToItem(@NotNull EntryStack fluidStack) { + return EntryStack.empty(); + } + + @NotNull + default EntryStack itemToFluid(@NotNull EntryStack itemStack) { + return EntryStack.empty(); + } + } +} diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 444fdc831..1d75bae27 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -725,7 +725,7 @@ public class EntryListWidget extends WidgetWithBounds { EntryStack entry = getCurrentEntry().copy(); if (!entry.isEmpty()) { if (entry.getType() == EntryStack.Type.FLUID) - entry = EntryStack.copyFluidToBucket(entry); + entry = EntryStack.copyFluidToItem(entry); if (entry.getType() == EntryStack.Type.ITEM) entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount()); ClientHelper.getInstance().tryCheatingEntry(entry); diff --git a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java index ffc9c969e..b9693c840 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java @@ -296,7 +296,7 @@ public class FavoritesListWidget extends WidgetWithBounds { EntryStack entry = getCurrentEntry().copy(); if (!entry.isEmpty()) { if (entry.getType() == EntryStack.Type.FLUID) - entry = EntryStack.copyFluidToBucket(entry); + entry = EntryStack.copyFluidToItem(entry); if (entry.getType() == EntryStack.Type.ITEM) entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount()); ClientHelper.getInstance().tryCheatingEntry(entry); diff --git a/src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java b/src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java index d19d2511a..f63be6320 100644 --- a/src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java +++ b/src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java @@ -57,7 +57,12 @@ public class EmptyEntryStack implements EntryStack { } @Override - public void setAmount(int amount) { + public double getFloatingAmount() { + return 0; + } + + @Override + public void setFloatingAmount(double amount) { } diff --git a/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java b/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java index 61b604bd2..02c524b75 100644 --- a/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java +++ b/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java @@ -52,15 +52,19 @@ import java.util.*; @ApiStatus.Internal public class FluidEntryStack extends AbstractEntryStack { private static final Map> FLUID_SPRITE_CACHE = new HashMap<>(); - private static final int EMPTY_AMOUNT = -1319182373; + private static final double EMPTY_AMOUNT = -1319182373; private Fluid fluid; - private int amount; + private double amount; public FluidEntryStack(Fluid fluid) { this(fluid, EMPTY_AMOUNT); } public FluidEntryStack(Fluid fluid, int amount) { + this(fluid, (double) amount); + } + + public FluidEntryStack(Fluid fluid, double amount) { this.fluid = fluid; this.amount = amount; } @@ -93,13 +97,13 @@ public class FluidEntryStack extends AbstractEntryStack { } @Override - public int getAmount() { + public double getFloatingAmount() { return amount; } @Override - public void setAmount(int amount) { - this.amount = amount == EMPTY_AMOUNT ? EMPTY_AMOUNT : Math.max(amount, 0); + public void setFloatingAmount(double amount) { + this.amount = amount <= 0 ? EMPTY_AMOUNT : amount; if (isEmpty()) { fluid = Fluids.EMPTY; } @@ -127,35 +131,35 @@ public class FluidEntryStack extends AbstractEntryStack { @Override public boolean equalsIgnoreTagsAndAmount(EntryStack stack) { if (stack.getType() != Type.FLUID) - return false; + return EntryStack.copyFluidToItem(this).equalsIgnoreTagsAndAmount(stack); return fluid == stack.getFluid(); } @Override public boolean equalsIgnoreTags(EntryStack stack) { if (stack.getType() != Type.FLUID) - return false; + return EntryStack.copyFluidToItem(this).equalsIgnoreTags(stack); return fluid == stack.getFluid() && amount == stack.getAmount(); } @Override public boolean equalsIgnoreAmount(EntryStack stack) { if (stack.getType() != Type.FLUID) - return false; + return EntryStack.copyFluidToItem(this).equalsIgnoreAmount(stack); return fluid == stack.getFluid(); } @Override public boolean equalsAll(EntryStack stack) { if (stack.getType() != Type.FLUID) - return false; + return EntryStack.copyFluidToItem(this).equalsAll(stack); return fluid == stack.getFluid() && amount == stack.getAmount(); } @Override public int hashOfAll() { int result = hashIgnoreAmountAndTags(); - result = 31 * result + amount; + result = 31 * result + Double.hashCode(amount); return result; } diff --git a/src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java b/src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java new file mode 100644 index 000000000..dede539c0 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java @@ -0,0 +1,49 @@ +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 org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Objects; + +@ApiStatus.Experimental +@ApiStatus.Internal +public class FluidSupportProviderImpl implements FluidSupportProvider { + private final List providers = Lists.newArrayList(); + + public void reset() { + providers.clear(); + } + + @Override + public void registerFluidProvider(@NotNull FluidProvider provider) { + providers.add(Objects.requireNonNull(provider, "Registered provider is null!")); + } + + @Override + public @NotNull EntryStack fluidToItem(@NotNull EntryStack fluidStack) { + if (fluidStack.isEmpty()) return EntryStack.empty(); + if (fluidStack.getType() != EntryStack.Type.FLUID) + throw new IllegalArgumentException("EntryStack must be fluid!"); + for (FluidProvider provider : providers) { + EntryStack stack = Objects.requireNonNull(provider.fluidToItem(fluidStack), provider.getClass() + " is creating null objects for fluidToItem!"); + if (!stack.isEmpty()) return stack; + } + return EntryStack.empty(); + } + + @Override + public @NotNull EntryStack itemToFluid(@NotNull EntryStack itemStack) { + if (itemStack.isEmpty()) return EntryStack.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), provider.getClass() + " is creating null objects for itemToFluid!"); + if (!stack.isEmpty()) return stack; + } + return EntryStack.empty(); + } +} diff --git a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java index cb65b0396..cceea85a6 100644 --- a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java +++ b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java @@ -40,6 +40,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.util.Identifier; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -76,11 +77,21 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt return itemStack.getCount(); } + @Override + public double getFloatingAmount() { + return itemStack.getCount(); + } + @Override public void setAmount(int amount) { itemStack.setCount(amount); } + @Override + public void setFloatingAmount(double amount) { + itemStack.setCount(MathHelper.floor(amount)); + } + @Override public boolean isEmpty() { return itemStack.isEmpty(); @@ -103,14 +114,14 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt @Override public boolean equalsIgnoreTagsAndAmount(EntryStack stack) { if (stack.getType() != Type.ITEM) - return false; + return EntryStack.copyItemToFluid(this).equalsIgnoreTagsAndAmount(stack); return itemStack.getItem() == stack.getItem(); } @Override public boolean equalsAll(EntryStack stack) { if (stack.getType() != Type.ITEM) - return false; + return EntryStack.copyItemToFluid(this).equalsAll(stack); if (itemStack.getItem() != stack.getItem() || getAmount() != stack.getAmount()) return false; return ItemStack.areTagsEqual(itemStack, stack.getItemStack()); @@ -119,7 +130,7 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt @Override public boolean equalsIgnoreAmount(EntryStack stack) { if (stack.getType() != Type.ITEM) - return false; + return EntryStack.copyItemToFluid(this).equalsIgnoreAmount(stack); if (itemStack.getItem() != stack.getItem()) return false; ItemStack otherStack = stack.getItemStack(); @@ -173,7 +184,7 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt @Override public boolean equalsIgnoreTags(EntryStack stack) { if (stack.getType() != Type.ITEM) - return false; + return EntryStack.copyItemToFluid(this).equalsIgnoreTags(stack); if (itemStack.getItem() != stack.getItem()) return false; return getAmount() == stack.getAmount(); diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java index af7f5cfdf..1ccd768ce 100644 --- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java @@ -29,6 +29,7 @@ import com.google.common.collect.Sets; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.fluid.FluidSupportProvider; import me.shedaniel.rei.api.plugins.REIPluginV0; import me.shedaniel.rei.api.subsets.SubsetsRegistry; import me.shedaniel.rei.impl.subsets.SubsetsRegistryImpl; @@ -283,6 +284,7 @@ public class RecipeHelperImpl implements RecipeHelper { this.liveRecipeGenerators.clear(); this.autoTransferHandlers.clear(); ((SubsetsRegistryImpl) SubsetsRegistry.INSTANCE).reset(); + ((FluidSupportProviderImpl) FluidSupportProvider.INSTANCE).reset(); ((DisplayHelperImpl) DisplayHelper.getInstance()).resetData(); ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache(); BaseBoundsHandler baseBoundsHandler = new BaseBoundsHandlerImpl(); diff --git a/src/main/java/me/shedaniel/rei/impl/RenderingEntry.java b/src/main/java/me/shedaniel/rei/impl/RenderingEntry.java index c7745a218..e2c02a8e7 100644 --- a/src/main/java/me/shedaniel/rei/impl/RenderingEntry.java +++ b/src/main/java/me/shedaniel/rei/impl/RenderingEntry.java @@ -47,11 +47,21 @@ public abstract class RenderingEntry extends DrawableHelper implements EntryStac return 0; } + @Override + public double getFloatingAmount() { + return 0; + } + @Override public void setAmount(int amount) { } + @Override + public void setFloatingAmount(double amount) { + + } + @Override public boolean isEmpty() { return false; diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index bceaf5b23..b42283d54 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -30,6 +30,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.fluid.FluidSupportProvider; import me.shedaniel.rei.api.plugins.REIPluginV0; import me.shedaniel.rei.api.widgets.Panel; import me.shedaniel.rei.api.widgets.Tooltip; @@ -78,6 +79,7 @@ import net.minecraft.tag.BlockTags; import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; import net.minecraft.util.registry.Registry; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -386,6 +388,24 @@ public class DefaultPlugin implements REIPluginV0 { 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.INSTANCE.registerFluidProvider(new FluidSupportProvider.FluidProvider() { + @Override + public @NotNull EntryStack fluidToItem(@NotNull EntryStack fluidStack) { + Fluid fluid = fluidStack.getFluid(); + Item item = fluid.getBucketItem(); + if (item == null) + return EntryStack.empty(); + return EntryStack.create(item); + } + + @Override + public @NotNull EntryStack itemToFluid(@NotNull EntryStack itemStack) { + Item item = itemStack.getItem(); + if (item instanceof BucketItem) + return EntryStack.create(((BucketItem) item).fluid, 1000); + return EntryStack.empty(); + } + }); // SubsetsRegistry subsetsRegistry = SubsetsRegistry.INSTANCE; // subsetsRegistry.registerPathEntry("roughlyenoughitems:food", EntryStack.create(Items.MILK_BUCKET)); // subsetsRegistry.registerPathEntry("roughlyenoughitems:food/roughlyenoughitems:cookies", EntryStack.create(Items.COOKIE)); -- cgit