aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-04-18 15:48:19 +0800
committershedaniel <daniel@shedaniel.me>2020-04-18 15:48:19 +0800
commit8e617f5a6c92a21be270ec190261d979deac965f (patch)
treedb564a02bd9a4d60cf5362d0ae239924ccd5d9c6 /src
parent8fc595cace9efb981009b7a9f1a3be1809895164 (diff)
downloadRoughlyEnoughItems-8e617f5a6c92a21be270ec190261d979deac965f.tar.gz
RoughlyEnoughItems-8e617f5a6c92a21be270ec190261d979deac965f.tar.bz2
RoughlyEnoughItems-8e617f5a6c92a21be270ec190261d979deac965f.zip
Added FluidSupportProvider
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'src')
-rw-r--r--src/main/java/me/shedaniel/rei/api/EntryStack.java46
-rw-r--r--src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java34
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java2
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java2
-rw-r--r--src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java7
-rw-r--r--src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java24
-rw-r--r--src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java49
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java19
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java2
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RenderingEntry.java10
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java20
-rw-r--r--src/main/resources/icon.pngbin220223 -> 47308 bytes
12 files changed, 182 insertions, 33 deletions
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<Identifier> 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, Pair<Sprite, Integer>> 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<FluidProvider> 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;
@@ -77,11 +78,21 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt
}
@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
@@ -48,11 +48,21 @@ public abstract class RenderingEntry extends DrawableHelper implements EntryStac
}
@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));
diff --git a/src/main/resources/icon.png b/src/main/resources/icon.png
index b5fcfc407..bf5ad0f2c 100644
--- a/src/main/resources/icon.png
+++ b/src/main/resources/icon.png
Binary files differ