aboutsummaryrefslogtreecommitdiff
path: root/RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-12-14 00:10:26 +0800
committershedaniel <daniel@shedaniel.me>2020-12-14 00:10:26 +0800
commit1f6137d24153b62c42da129ce5d6373bbf78ee34 (patch)
tree75ae34e8a1db21e08253a3fc424a8989abd20d9f /RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java
parent90b8a8181eb7e642fb88832f8bd8baa3acdcf804 (diff)
downloadRoughlyEnoughItems-1f6137d24153b62c42da129ce5d6373bbf78ee34.tar.gz
RoughlyEnoughItems-1f6137d24153b62c42da129ce5d6373bbf78ee34.tar.bz2
RoughlyEnoughItems-1f6137d24153b62c42da129ce5d6373bbf78ee34.zip
The big refactor
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java')
-rw-r--r--RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java302
1 files changed, 63 insertions, 239 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 fb117d3b8..19204804f 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
@@ -23,145 +23,57 @@
package me.shedaniel.rei.api;
-import com.google.common.collect.ImmutableList;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
-import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.JsonOps;
-import me.shedaniel.math.Point;
-import me.shedaniel.math.Rectangle;
-import me.shedaniel.rei.api.fluid.FluidSupportProvider;
-import me.shedaniel.rei.api.fractions.Fraction;
-import me.shedaniel.rei.api.widgets.Tooltip;
+import me.shedaniel.architectury.utils.Fraction;
+import me.shedaniel.rei.api.entry.ComparisonContext;
+import me.shedaniel.rei.api.entry.EntryDefinition;
+import me.shedaniel.rei.api.entry.EntryRenderer;
+import me.shedaniel.rei.api.entry.EntryType;
import me.shedaniel.rei.impl.Internals;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.resources.language.I18n;
-import net.minecraft.core.Registry;
-import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.TagParser;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
-import net.minecraft.world.item.Item;
-import net.minecraft.world.item.ItemStack;
-import net.minecraft.world.item.crafting.Ingredient;
-import net.minecraft.world.level.ItemLike;
-import net.minecraft.world.level.material.Fluid;
+import net.minecraft.util.Unit;
import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
-import java.util.stream.Stream;
@Environment(EnvType.CLIENT)
-public interface EntryStack extends TextRepresentable {
-
- static EntryStack empty() {
+public interface EntryStack<T> extends TextRepresentable, Renderer {
+ static EntryStack<Unit> empty() {
return Internals.getEntryStackProvider().empty();
}
- static EntryStack create(Fluid fluid) {
- return Internals.getEntryStackProvider().fluid(fluid);
- }
-
- static EntryStack create(Fluid fluid, int amount) {
- return create(fluid, Fraction.ofWhole(amount));
- }
-
- static EntryStack create(Fluid fluid, double amount) {
- return create(fluid, Fraction.from(amount));
- }
-
- static EntryStack create(Fluid fluid, Fraction amount) {
- return Internals.getEntryStackProvider().fluid(fluid, amount);
- }
-
- static EntryStack create(ItemStack stack) {
- return Internals.getEntryStackProvider().item(stack);
- }
-
- static EntryStack create(ItemLike item) {
- return create(new ItemStack(item));
- }
-
- static List<EntryStack> ofItems(Collection<ItemLike> stacks) {
- if (stacks.size() == 0) return Collections.emptyList();
- if (stacks.size() == 1) return Collections.singletonList(create(stacks.iterator().next()));
- EntryStack[] result = new EntryStack[stacks.size()];
- int i = 0;
- for (ItemLike stack : stacks) {
- result[i] = create(stack);
- i++;
- }
- return Arrays.asList(result);
- }
-
- static List<EntryStack> ofItemStacks(Collection<ItemStack> stacks) {
- if (stacks.size() == 0) return Collections.emptyList();
- if (stacks.size() == 1) {
- ItemStack stack = stacks.iterator().next();
- if (stack.isEmpty()) return Collections.emptyList();
- return Collections.singletonList(create(stack));
- }
- List<EntryStack> result = new ArrayList<>(stacks.size());
- for (ItemStack stack : stacks) {
- result.add(create(stack));
- }
- return ImmutableList.copyOf(result);
- }
-
- static List<EntryStack> ofIngredient(Ingredient ingredient) {
- if (ingredient.isEmpty()) return Collections.emptyList();
- ItemStack[] matchingStacks = ingredient.getItems();
- if (matchingStacks.length == 0) return Collections.emptyList();
- if (matchingStacks.length == 1) return Collections.singletonList(create(matchingStacks[0]));
- List<EntryStack> result = new ArrayList<>(matchingStacks.length);
- for (ItemStack matchingStack : matchingStacks) {
- if (!matchingStack.isEmpty())
- result.add(create(matchingStack));
- }
- return ImmutableList.copyOf(result);
+ static <T> EntryStack<T> of(EntryDefinition<T> definition, T value) {
+ return Internals.getEntryStackProvider().of(definition, value);
}
- static List<List<EntryStack>> ofIngredients(List<Ingredient> ingredients) {
- if (ingredients.size() == 0) return Collections.emptyList();
- if (ingredients.size() == 1) {
- Ingredient ingredient = ingredients.get(0);
- if (ingredient.isEmpty()) return Collections.emptyList();
- return Collections.singletonList(ofIngredient(ingredient));
- }
- boolean emptyFlag = true;
- List<List<EntryStack>> result = new ArrayList<>(ingredients.size());
- for (int i = ingredients.size() - 1; i >= 0; i--) {
- Ingredient ingredient = ingredients.get(i);
- if (emptyFlag && ingredient.isEmpty()) continue;
- result.add(0, ofIngredient(ingredient));
- emptyFlag = false;
- }
- return ImmutableList.copyOf(result);
+ static <T> EntryStack<T> of(EntryType<T> type, T value) {
+ return of(type.getDefinition(), value);
}
@ApiStatus.Internal
- static EntryStack readFromJson(JsonElement jsonElement) {
+ static EntryStack<?> readFromJson(JsonElement jsonElement) {
try {
JsonObject obj = jsonElement.getAsJsonObject();
- switch (GsonHelper.getAsString(obj, "type")) {
- case "stack":
- return EntryStack.create(ItemStack.of(TagParser.parseTag(obj.get("nbt").getAsString())));
- case "item":
- return EntryStack.create(ItemStack.of((CompoundTag) Dynamic.convert(JsonOps.INSTANCE, NbtOps.INSTANCE, obj)));
- case "fluid":
- return EntryStack.create(Registry.FLUID.get(ResourceLocation.tryParse(obj.get("id").getAsString())));
- case "empty":
- return EntryStack.empty();
- default:
- throw new IllegalArgumentException("Invalid Entry Type!");
- }
+ EntryType<Object> type = EntryType.deferred(new ResourceLocation(GsonHelper.getAsString(obj, "type")));
+ Object o = type.getDefinition().fromTag(TagParser.parseTag(obj.toString()));
+ return EntryStack.of(type, o);
} catch (Exception e) {
e.printStackTrace();
return EntryStack.empty();
@@ -172,158 +84,69 @@ public interface EntryStack extends TextRepresentable {
@Nullable
default JsonElement toJson() {
try {
- switch (getType()) {
- case ITEM:
- JsonObject obj1 = Dynamic.convert(NbtOps.INSTANCE, JsonOps.INSTANCE, getItemStack().save(new CompoundTag())).getAsJsonObject();
- obj1.addProperty("type", "item");
- return obj1;
- case FLUID:
- Optional<ResourceLocation> optionalIdentifier = getIdentifier();
- if (!optionalIdentifier.isPresent())
- throw new NullPointerException("Invalid Fluid: " + toString());
- JsonObject obj2 = new JsonObject();
- obj2.addProperty("type", "fluid");
- obj2.addProperty("id", optionalIdentifier.get().toString());
- return obj2;
- case EMPTY:
- JsonObject obj3 = new JsonObject();
- obj3.addProperty("type", "empty");
- return obj3;
- default:
- throw new IllegalArgumentException("Invalid Entry Type!");
- }
+ JsonObject object = Dynamic.convert(NbtOps.INSTANCE, JsonOps.INSTANCE, getDefinition().toTag(this, getValue())).getAsJsonObject();
+ object.addProperty("type", getType().getId().toString());
+ return object;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
- static Stream<EntryStack> copyItemToFluids(EntryStack stack) {
- return FluidSupportProvider.getInstance().itemToFluids(stack);
- }
+ @NotNull
+ EntryDefinition<T> getDefinition();
- Optional<ResourceLocation> getIdentifier();
-
- EntryStack.Type getType();
-
- default int getAmount() {
- return getAccurateAmount().intValue();
+ @NotNull
+ default EntryType<T> getType() {
+ return getDefinition().getType();
}
- Fraction getAccurateAmount();
-
- default double getFloatingAmount() {
- return getAccurateAmount().doubleValue();
+ @NotNull
+ default Class<T> getValueType() {
+ return getDefinition().getValueType();
}
- default void setAmount(int amount) {
- setAmount(Fraction.ofWhole(amount));
+ @NotNull
+ default EntryRenderer<T> getRenderer() {
+ return getDefinition().getRenderer();
}
- default void setFloatingAmount(double amount) {
- setAmount(Fraction.from(amount));
- }
+ Optional<ResourceLocation> getIdentifier();
+
+ Fraction getAmount();
void setAmount(Fraction amount);
boolean isEmpty();
- EntryStack copy();
+ EntryStack<T> copy();
@ApiStatus.Internal
- default EntryStack rewrap() {
+ default EntryStack<T> rewrap() {
return copy();
}
- Object getObject();
-
- boolean equals(EntryStack stack, boolean ignoreTags, boolean ignoreAmount);
+ @Deprecated
+ int hashCode();
- boolean equalsIgnoreTagsAndAmount(EntryStack stack);
+ int hash(ComparisonContext context);
- boolean equalsIgnoreTags(EntryStack stack);
+ boolean equals(EntryStack<T> other, ComparisonContext context);
- boolean equalsIgnoreAmount(EntryStack stack);
+ @Deprecated
+ boolean equals(Object o);
- boolean equalsAll(EntryStack stack);
+ T getValue();
- /**
- * {@link #hashCode()} for {@link #equalsAll(EntryStack)}.
- */
- default int hashOfAll() {
- return hashCode();
- }
+ <R> EntryStack<T> setting(Settings<R> settings, R value);
- /**
- * {@link #hashCode()} for {@link #equalsIgnoreAmount(EntryStack)}
- */
- default int hashIgnoreAmount() {
- return hashCode();
- }
+ <R> EntryStack<T> removeSetting(Settings<R> settings);
- /**
- * {@link #hashCode()} for {@link #equalsIgnoreTags(EntryStack)}
- */
- default int hashIgnoreTags() {
- return hashCode();
- }
+ EntryStack<T> clearSettings();
- /**
- * {@link #hashCode()} for {@link #equalsIgnoreTagsAndAmount(EntryStack)}
- */
- default int hashIgnoreAmountAndTags() {
- return hashCode();
- }
+ <R> R get(Settings<R> settings);
- int getZ();
-
- void setZ(int z);
-
- default ItemStack getItemStack() {
- if (getType() == Type.ITEM)
- return (ItemStack) getObject();
- return null;
- }
-
- default Item getItem() {
- if (getType() == Type.ITEM)
- return ((ItemStack) getObject()).getItem();
- return null;
- }
-
- default Fluid getFluid() {
- if (getType() == Type.FLUID)
- return (Fluid) getObject();
- return null;
- }
-
- <T> EntryStack setting(Settings<T> settings, T value);
-
- <T> EntryStack removeSetting(Settings<T> settings);
-
- EntryStack clearSettings();
-
- default <T> EntryStack addSetting(Settings<T> settings, T value) {
- return setting(settings, value);
- }
-
- <T> T get(Settings<T> settings);
-
- @Nullable
- default Tooltip getTooltip(Point mouse) {
- return null;
- }
-
- void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta);
-
- enum Type {
- ITEM,
- FLUID,
- EMPTY,
- RENDER
- }
-
- class Settings<T> {
+ class Settings<R> {
@ApiStatus.Internal
private static final List<Settings<?>> SETTINGS = new ArrayList<>();
@@ -335,26 +158,26 @@ public interface EntryStack extends TextRepresentable {
public static final Settings<Supplier<Boolean>> TOOLTIP_ENABLED = new Settings<>(TRUE);
public static final Settings<Supplier<Boolean>> TOOLTIP_APPEND_MOD = new Settings<>(TRUE);
public static final Settings<Supplier<Boolean>> RENDER_COUNTS = new Settings<>(TRUE);
- public static final Settings<Function<EntryStack, List<Component>>> TOOLTIP_APPEND_EXTRA = new Settings<>(stack -> Collections.emptyList());
- public static final Settings<Function<EntryStack, String>> COUNTS = new Settings<>(stack -> null);
+ public static final Settings<Function<EntryStack<?>, List<Component>>> TOOLTIP_APPEND_EXTRA = new Settings<>(stack -> Collections.emptyList());
+ public static final Settings<Function<EntryStack<?>, String>> COUNTS = new Settings<>(stack -> null);
private static short nextId;
- private T defaultValue;
+ private R defaultValue;
private short id;
@ApiStatus.Internal
- public Settings(T defaultValue) {
+ public Settings(R defaultValue) {
this.defaultValue = defaultValue;
this.id = nextId++;
SETTINGS.add(this);
}
@ApiStatus.Internal
- public static <T> Settings<T> getById(short id) {
- return (Settings<T>) SETTINGS.get(id);
+ public static <R> Settings<R> getById(short id) {
+ return (Settings<R>) SETTINGS.get(id);
}
- public T getDefaultValue() {
+ public R getDefaultValue() {
return defaultValue;
}
@@ -365,15 +188,16 @@ public interface EntryStack extends TextRepresentable {
public static class Fluid {
// Return null to disable
- public static final Settings<Function<EntryStack, String>> AMOUNT_TOOLTIP = new Settings<>(stack -> I18n.get("tooltip.rei.fluid_amount", stack.simplifyAmount().getAccurateAmount()));
+ public static final Settings<Function<EntryStack<?>, String>> AMOUNT_TOOLTIP = new Settings<>(stack -> I18n.get("tooltip.rei.fluid_amount", stack.simplifyAmount().getAmount()));
private Fluid() {
}
}
+
}
- default EntryStack simplifyAmount() {
- setAmount(getAccurateAmount().simplify());
+ default EntryStack<T> simplifyAmount() {
+ setAmount(getAmount().simplify());
return this;
}
}