ItemEntryStack.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.impl;
  6. import com.google.common.collect.Lists;
  7. import com.mojang.blaze3d.platform.GlStateManager;
  8. import me.shedaniel.math.api.Rectangle;
  9. import me.shedaniel.rei.api.*;
  10. import me.shedaniel.rei.gui.widget.QueuedTooltip;
  11. import net.minecraft.client.MinecraftClient;
  12. import net.minecraft.client.render.OverlayTexture;
  13. import net.minecraft.client.render.VertexConsumerProvider;
  14. import net.minecraft.client.render.item.ItemRenderer;
  15. import net.minecraft.client.render.model.BakedModel;
  16. import net.minecraft.client.render.model.json.ModelTransformation;
  17. import net.minecraft.client.texture.SpriteAtlasTexture;
  18. import net.minecraft.client.util.math.MatrixStack;
  19. import net.minecraft.item.ItemStack;
  20. import net.minecraft.util.Identifier;
  21. import net.minecraft.util.registry.Registry;
  22. import javax.annotation.Nullable;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.Optional;
  26. @Deprecated
  27. public class ItemEntryStack extends AbstractEntryStack implements OptimalEntryStack {
  28. private ItemStack itemStack;
  29. private int hash = -1;
  30. public ItemEntryStack(ItemStack itemStack) {
  31. this.itemStack = itemStack;
  32. }
  33. @Override
  34. public Optional<Identifier> getIdentifier() {
  35. return Optional.ofNullable(Registry.ITEM.getId(getItem()));
  36. }
  37. @Override
  38. public Type getType() {
  39. return Type.ITEM;
  40. }
  41. @Override
  42. public int getAmount() {
  43. return itemStack.getCount();
  44. }
  45. @Override
  46. public void setAmount(int amount) {
  47. itemStack.setCount(amount);
  48. hash = -1;
  49. }
  50. @Override
  51. public boolean isEmpty() {
  52. return itemStack.isEmpty();
  53. }
  54. @SuppressWarnings("rawtypes")
  55. @Override
  56. public EntryStack copy() {
  57. EntryStack stack = EntryStack.create(getItemStack().copy());
  58. for (Map.Entry<Settings, Object> entry : getSettings().entrySet()) {
  59. stack.setting(entry.getKey(), entry.getValue());
  60. }
  61. return stack;
  62. }
  63. @Override
  64. public Object getObject() {
  65. return itemStack;
  66. }
  67. @Override
  68. public boolean equalsIgnoreTagsAndAmount(EntryStack stack) {
  69. if (stack.getType() != Type.ITEM)
  70. return false;
  71. return itemStack.getItem() == stack.getItem();
  72. }
  73. @Override
  74. public boolean equalsAll(EntryStack stack) {
  75. if (stack.getType() != Type.ITEM)
  76. return false;
  77. if (itemStack.getItem() != stack.getItem() || getAmount() != stack.getAmount())
  78. return false;
  79. return ItemStack.areTagsEqual(itemStack, stack.getItemStack());
  80. }
  81. @Override
  82. public boolean equalsIgnoreAmount(EntryStack stack) {
  83. if (stack.getType() != Type.ITEM)
  84. return false;
  85. if (itemStack.getItem() != stack.getItem())
  86. return false;
  87. return ItemStack.areTagsEqual(itemStack, stack.getItemStack());
  88. }
  89. @Override
  90. public boolean equalsIgnoreTags(EntryStack stack) {
  91. if (stack.getType() != Type.ITEM)
  92. return false;
  93. if (itemStack.getItem() != stack.getItem())
  94. return false;
  95. return getAmount() == stack.getAmount();
  96. }
  97. @Override
  98. public int hashCode() {
  99. // if (hash == -1) {
  100. int result = 1;
  101. result = 31 * result + getType().hashCode();
  102. result = 31 * result + itemStack.getItem().hashCode();
  103. result = 31 * result + itemStack.getCount();
  104. result = 31 * result + (itemStack.hasTag() ? itemStack.getTag().hashCode() : 0);
  105. hash = result;
  106. // if (hash == -1) {
  107. // hash = -2;
  108. // }
  109. // }
  110. return hash;
  111. }
  112. @Nullable
  113. @Override
  114. public QueuedTooltip getTooltip(int mouseX, int mouseY) {
  115. if (isEmpty() || !get(Settings.TOOLTIP_ENABLED).get())
  116. return null;
  117. List<String> toolTip = Lists.newArrayList(SearchArgument.tryGetItemStackToolTip(getItemStack(), true));
  118. toolTip.addAll(get(Settings.TOOLTIP_APPEND_EXTRA).apply(this));
  119. if (get(Settings.TOOLTIP_APPEND_MOD).get() && ConfigObject.getInstance().shouldAppendModNames()) {
  120. final String modString = ClientHelper.getInstance().getFormattedModFromItem(getItem());
  121. boolean alreadyHasMod = false;
  122. for (String s : toolTip)
  123. if (s.equalsIgnoreCase(modString)) {
  124. alreadyHasMod = true;
  125. break;
  126. }
  127. if (!alreadyHasMod)
  128. toolTip.add(modString);
  129. }
  130. return QueuedTooltip.create(toolTip);
  131. }
  132. private static final MatrixStack matrices = new MatrixStack();
  133. private final ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer();
  134. @Override
  135. public void render(Rectangle bounds, int mouseX, int mouseY, float delta) {
  136. optimisedRenderStart(delta);
  137. optimisedRenderBase(bounds, mouseX, mouseY, delta);
  138. optimisedRenderOverlay(bounds, mouseX, mouseY, delta);
  139. optimisedRenderEnd(delta);
  140. }
  141. @Override
  142. public void optimisedRenderStart(float delta) {
  143. MinecraftClient.getInstance().getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX);
  144. GlStateManager.enableRescaleNormal();
  145. }
  146. @Override
  147. public void optimisedRenderEnd(float delta) {
  148. GlStateManager.disableRescaleNormal();
  149. }
  150. private BakedModel getModelFromStack(ItemStack stack) {
  151. BakedModel model = itemRenderer.getModels().getModel(stack);
  152. if (stack.getItem().hasPropertyGetters())
  153. model = model.getItemPropertyOverrides().apply(model, stack, null, null);
  154. if (model != null)
  155. return model;
  156. return itemRenderer.getModels().getModelManager().getMissingModel();
  157. }
  158. @Override
  159. public void optimisedRenderBase(Rectangle bounds, int mouseX, int mouseY, float delta) {
  160. if (!isEmpty() && get(Settings.RENDER).get()) {
  161. ItemStack stack = getItemStack();
  162. ((ItemStackHook) (Object) stack).rei_setRenderEnchantmentGlint(get(Settings.Item.RENDER_ENCHANTMENT_GLINT).get());
  163. itemRenderer.zOffset = getZ();
  164. matrices.push();
  165. matrices.translate(bounds.getCenterX(), bounds.getCenterY(), 100.0F + getZ());
  166. matrices.scale(bounds.getWidth(), (bounds.getWidth() + bounds.getHeight()) / -2f, bounds.getHeight());
  167. VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers();
  168. BakedModel model = getModelFromStack(stack);
  169. boolean bl = !model.hasDepthInGui();
  170. if (bl)
  171. GlStateManager.method_24221();
  172. itemRenderer.renderItem(stack, ModelTransformation.Type.GUI, false, matrices, immediate, 15728880, OverlayTexture.DEFAULT_UV, model);
  173. immediate.draw();
  174. if (bl)
  175. GlStateManager.method_24222();
  176. itemRenderer.zOffset = 0.0F;
  177. matrices.pop();
  178. ((ItemStackHook) (Object) stack).rei_setRenderEnchantmentGlint(false);
  179. }
  180. }
  181. @Override
  182. public void optimisedRenderOverlay(Rectangle bounds, int mouseX, int mouseY, float delta) {
  183. if (!isEmpty() && get(Settings.RENDER).get()) {
  184. itemRenderer.zOffset = getZ();
  185. itemRenderer.renderGuiItemOverlay(MinecraftClient.getInstance().textRenderer, getItemStack(), bounds.x, bounds.y, get(Settings.RENDER_COUNTS).get() ? get(Settings.COUNTS).apply(this) : "");
  186. itemRenderer.zOffset = 0.0F;
  187. }
  188. }
  189. }