diff options
| author | shedaniel <daniel@shedaniel.me> | 2020-12-14 00:10:26 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2020-12-14 00:10:26 +0800 |
| commit | 1f6137d24153b62c42da129ce5d6373bbf78ee34 (patch) | |
| tree | 75ae34e8a1db21e08253a3fc424a8989abd20d9f /RoughlyEnoughItems-api/src/main/java/me/shedaniel/rei/api/EntryStack.java | |
| parent | 90b8a8181eb7e642fb88832f8bd8baa3acdcf804 (diff) | |
| download | RoughlyEnoughItems-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.java | 302 |
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; } } |
