EntryStack.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.api;
  6. import com.google.gson.JsonElement;
  7. import com.google.gson.JsonObject;
  8. import me.shedaniel.math.api.Rectangle;
  9. import me.shedaniel.rei.gui.widget.QueuedTooltip;
  10. import me.shedaniel.rei.impl.EmptyEntryStack;
  11. import me.shedaniel.rei.impl.FluidEntryStack;
  12. import me.shedaniel.rei.impl.ItemEntryStack;
  13. import net.minecraft.client.resource.language.I18n;
  14. import net.minecraft.fluid.Fluid;
  15. import net.minecraft.item.Item;
  16. import net.minecraft.item.ItemConvertible;
  17. import net.minecraft.item.ItemStack;
  18. import net.minecraft.nbt.CompoundTag;
  19. import net.minecraft.nbt.StringNbtReader;
  20. import net.minecraft.util.Identifier;
  21. import net.minecraft.util.registry.Registry;
  22. import org.jetbrains.annotations.ApiStatus;
  23. import org.jetbrains.annotations.Nullable;
  24. import java.util.Collections;
  25. import java.util.List;
  26. import java.util.Optional;
  27. import java.util.function.Function;
  28. import java.util.function.Supplier;
  29. @SuppressWarnings("deprecation")
  30. public interface EntryStack {
  31. static EntryStack empty() {
  32. return EmptyEntryStack.EMPTY;
  33. }
  34. static EntryStack create(Fluid fluid) {
  35. return new FluidEntryStack(fluid);
  36. }
  37. static EntryStack create(Fluid fluid, int amount) {
  38. return new FluidEntryStack(fluid, amount);
  39. }
  40. static EntryStack create(ItemStack stack) {
  41. return new ItemEntryStack(stack);
  42. }
  43. static EntryStack create(ItemConvertible item) {
  44. return new ItemEntryStack(new ItemStack(item));
  45. }
  46. @ApiStatus.Internal
  47. static EntryStack readFromJson(JsonElement jsonElement) {
  48. try {
  49. JsonObject obj = jsonElement.getAsJsonObject();
  50. switch (obj.getAsJsonPrimitive("type").getAsString()) {
  51. case "stack":
  52. return EntryStack.create(ItemStack.fromTag(StringNbtReader.parse(obj.get("nbt").getAsString())));
  53. case "fluid":
  54. return EntryStack.create(Registry.FLUID.get(Identifier.tryParse(obj.get("id").getAsString())));
  55. case "empty":
  56. return EntryStack.empty();
  57. default:
  58. throw new IllegalArgumentException("Invalid Entry Type!");
  59. }
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. return EntryStack.empty();
  63. }
  64. }
  65. @ApiStatus.Internal
  66. @Nullable
  67. default JsonElement toJson() {
  68. try {
  69. switch (getType()) {
  70. case ITEM:
  71. JsonObject obj1 = new JsonObject();
  72. obj1.addProperty("type", "stack");
  73. obj1.addProperty("nbt", getItemStack().toTag(new CompoundTag()).toString());
  74. return obj1;
  75. case FLUID:
  76. Optional<Identifier> optionalIdentifier = getIdentifier();
  77. if (!optionalIdentifier.isPresent())
  78. throw new NullPointerException("Invalid Fluid: " + toString());
  79. JsonObject obj2 = new JsonObject();
  80. obj2.addProperty("type", "fluid");
  81. obj2.addProperty("id", optionalIdentifier.get().toString());
  82. return obj2;
  83. case EMPTY:
  84. JsonObject obj3 = new JsonObject();
  85. obj3.addProperty("type", "empty");
  86. return obj3;
  87. default:
  88. throw new IllegalArgumentException("Invalid Entry Type!");
  89. }
  90. } catch (Exception e) {
  91. e.printStackTrace();
  92. return null;
  93. }
  94. }
  95. Optional<Identifier> getIdentifier();
  96. EntryStack.Type getType();
  97. int getAmount();
  98. void setAmount(int amount);
  99. boolean isEmpty();
  100. EntryStack copy();
  101. Object getObject();
  102. boolean equals(EntryStack stack, boolean ignoreTags, boolean ignoreAmount);
  103. boolean equalsIgnoreTagsAndAmount(EntryStack stack);
  104. boolean equalsIgnoreTags(EntryStack stack);
  105. boolean equalsIgnoreAmount(EntryStack stack);
  106. boolean equalsAll(EntryStack stack);
  107. /**
  108. * {@link #hashCode()} for {@link #equalsAll(EntryStack)}.
  109. */
  110. default int hashOfAll() {
  111. return hashCode();
  112. }
  113. int getZ();
  114. void setZ(int z);
  115. default ItemStack getItemStack() {
  116. if (getType() == Type.ITEM)
  117. return (ItemStack) getObject();
  118. return null;
  119. }
  120. default Item getItem() {
  121. if (getType() == Type.ITEM)
  122. return ((ItemStack) getObject()).getItem();
  123. return null;
  124. }
  125. default Fluid getFluid() {
  126. if (getType() == Type.FLUID)
  127. return (Fluid) getObject();
  128. return null;
  129. }
  130. <T> EntryStack setting(Settings<T> settings, T value);
  131. <T> EntryStack removeSetting(Settings<T> settings);
  132. EntryStack clearSettings();
  133. default <T> EntryStack addSetting(Settings<T> settings, T value) {
  134. return setting(settings, value);
  135. }
  136. @Deprecated
  137. default <T> ObjectHolder<T> getSetting(Settings<T> settings) {
  138. return ObjectHolder.of(get(settings));
  139. }
  140. <T> T get(Settings<T> settings);
  141. @Nullable QueuedTooltip getTooltip(int mouseX, int mouseY);
  142. void render(Rectangle bounds, int mouseX, int mouseY, float delta);
  143. enum Type {
  144. ITEM,
  145. FLUID,
  146. EMPTY,
  147. RENDER
  148. }
  149. class Settings<T> {
  150. public static final Supplier<Boolean> TRUE = () -> true;
  151. public static final Supplier<Boolean> FALSE = () -> false;
  152. public static final Settings<Supplier<Boolean>> RENDER = new Settings<>(TRUE);
  153. public static final Settings<Supplier<Boolean>> CHECK_TAGS = new Settings<>(FALSE);
  154. public static final Settings<Supplier<Boolean>> TOOLTIP_ENABLED = new Settings<>(TRUE);
  155. public static final Settings<Supplier<Boolean>> TOOLTIP_APPEND_MOD = new Settings<>(TRUE);
  156. public static final Settings<Supplier<Boolean>> RENDER_COUNTS = new Settings<>(TRUE);
  157. public static final Settings<Function<EntryStack, List<String>>> TOOLTIP_APPEND_EXTRA = new Settings<>(stack -> Collections.emptyList());
  158. public static final Settings<Function<EntryStack, String>> COUNTS = new Settings<>(stack -> null);
  159. private T defaultValue;
  160. public Settings(T defaultValue) {
  161. this.defaultValue = defaultValue;
  162. }
  163. public T getDefaultValue() {
  164. return defaultValue;
  165. }
  166. public static class Item {
  167. public static final Settings<Supplier<Boolean>> RENDER_ENCHANTMENT_GLINT = new Settings<>(TRUE);
  168. @Deprecated @ApiStatus.ScheduledForRemoval public static final Settings<Supplier<Boolean>> RENDER_OVERLAY = RENDER_ENCHANTMENT_GLINT;
  169. private Item() {
  170. }
  171. }
  172. public static class Fluid {
  173. // Return null to disable
  174. public static final Settings<Function<EntryStack, String>> AMOUNT_TOOLTIP = new Settings<>(stack -> I18n.translate("tooltip.rei.fluid_amount", stack.getAmount()));
  175. private Fluid() {
  176. }
  177. }
  178. }
  179. }