/* * Roughly Enough Items by Danielshe. * Licensed under the MIT License. */ package me.shedaniel.rei.api; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import me.shedaniel.math.api.Rectangle; import me.shedaniel.rei.gui.widget.QueuedTooltip; 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.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.registry.Registry; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; @SuppressWarnings("deprecation") public interface EntryStack { static EntryStack empty() { return EmptyEntryStack.EMPTY; } static EntryStack create(Fluid fluid) { return new FluidEntryStack(fluid); } static EntryStack create(Fluid fluid, int amount) { return new FluidEntryStack(fluid, amount); } static EntryStack create(ItemStack stack) { return new ItemEntryStack(stack); } static EntryStack create(ItemConvertible item) { return new ItemEntryStack(new ItemStack(item)); } @ApiStatus.Internal static EntryStack readFromJson(JsonElement jsonElement) { try { JsonObject obj = jsonElement.getAsJsonObject(); switch (obj.getAsJsonPrimitive("type").getAsString()) { case "stack": return EntryStack.create(ItemStack.fromTag(StringNbtReader.parse(obj.get("nbt").getAsString()))); case "fluid": return EntryStack.create(Registry.FLUID.get(Identifier.tryParse(obj.get("id").getAsString()))); case "empty": return EntryStack.empty(); default: throw new IllegalArgumentException("Invalid Entry Type!"); } } catch (Exception e) { e.printStackTrace(); return EntryStack.empty(); } } @ApiStatus.Internal @Nullable default JsonElement toJson() { try { switch (getType()) { case ITEM: JsonObject obj1 = new JsonObject(); obj1.addProperty("type", "stack"); obj1.addProperty("nbt", getItemStack().toTag(new CompoundTag()).toString()); return obj1; case FLUID: Optional 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!"); } } catch (Exception e) { e.printStackTrace(); return null; } } Optional getIdentifier(); EntryStack.Type getType(); int getAmount(); void setAmount(int amount); boolean isEmpty(); EntryStack copy(); Object getObject(); boolean equals(EntryStack stack, boolean ignoreTags, boolean ignoreAmount); boolean equalsIgnoreTagsAndAmount(EntryStack stack); boolean equalsIgnoreTags(EntryStack stack); boolean equalsIgnoreAmount(EntryStack stack); boolean equalsAll(EntryStack stack); /** * {@link #hashCode()} for {@link #equalsAll(EntryStack)}. */ default int hashOfAll() { return hashCode(); } 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; } EntryStack setting(Settings settings, T value); EntryStack removeSetting(Settings settings); EntryStack clearSettings(); default EntryStack addSetting(Settings settings, T value) { return setting(settings, value); } @Deprecated default ObjectHolder getSetting(Settings settings) { return ObjectHolder.of(get(settings)); } T get(Settings settings); @Nullable QueuedTooltip getTooltip(int mouseX, int mouseY); void render(Rectangle bounds, int mouseX, int mouseY, float delta); enum Type { ITEM, FLUID, EMPTY, RENDER } class Settings { public static final Supplier TRUE = () -> true; public static final Supplier FALSE = () -> false; public static final Settings> RENDER = new Settings<>(TRUE); public static final Settings> CHECK_TAGS = new Settings<>(FALSE); public static final Settings> TOOLTIP_ENABLED = new Settings<>(TRUE); public static final Settings> TOOLTIP_APPEND_MOD = new Settings<>(TRUE); public static final Settings> RENDER_COUNTS = new Settings<>(TRUE); public static final Settings>> TOOLTIP_APPEND_EXTRA = new Settings<>(stack -> Collections.emptyList()); public static final Settings> COUNTS = new Settings<>(stack -> null); private T defaultValue; public Settings(T defaultValue) { this.defaultValue = defaultValue; } public T getDefaultValue() { return defaultValue; } public static class Item { public static final Settings> RENDER_ENCHANTMENT_GLINT = new Settings<>(TRUE); @Deprecated @ApiStatus.ScheduledForRemoval public static final Settings> RENDER_OVERLAY = RENDER_ENCHANTMENT_GLINT; private Item() { } } public static class Fluid { // Return null to disable public static final Settings> AMOUNT_TOOLTIP = new Settings<>(stack -> I18n.translate("tooltip.rei.fluid_amount", stack.getAmount())); private Fluid() { } } } }