SlotWidget.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.gui.widget;
  6. import com.google.common.collect.Lists;
  7. import com.mojang.blaze3d.platform.GlStateManager;
  8. import me.shedaniel.cloth.api.ClientUtils;
  9. import me.shedaniel.rei.api.ClientHelper;
  10. import me.shedaniel.rei.api.Renderer;
  11. import me.shedaniel.rei.client.ClientHelperImpl;
  12. import me.shedaniel.rei.client.ScreenHelper;
  13. import me.shedaniel.rei.gui.renderers.ItemStackRenderer;
  14. import net.minecraft.client.gui.Element;
  15. import net.minecraft.item.ItemStack;
  16. import net.minecraft.util.Identifier;
  17. import net.minecraft.util.math.MathHelper;
  18. import java.awt.*;
  19. import java.util.List;
  20. import java.util.*;
  21. import java.util.stream.Collectors;
  22. public class SlotWidget extends HighlightableWidget {
  23. public static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
  24. public static final Identifier RECIPE_GUI_DARK = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer_dark.png");
  25. protected int x, y;
  26. private List<Renderer> renderers = new LinkedList<>();
  27. private boolean drawBackground, showToolTips, clickToMoreRecipes, drawHighlightedBackground;
  28. public SlotWidget(int x, int y, ItemStack itemStack, boolean drawBackground, boolean showToolTips) {
  29. this(x, y, Collections.singletonList(itemStack), drawBackground, showToolTips);
  30. }
  31. public SlotWidget(int x, int y, Collection<ItemStack> itemList, boolean drawBackground, boolean showToolTips) {
  32. this(x, y, itemList.stream().map(Renderer::fromItemStack).collect(Collectors.toList()), drawBackground, showToolTips);
  33. }
  34. public SlotWidget(int x, int y, List<Renderer> renderers, boolean drawBackground, boolean showToolTips) {
  35. this.renderers = renderers;
  36. this.drawBackground = drawBackground;
  37. this.showToolTips = showToolTips;
  38. this.x = x;
  39. this.y = y;
  40. this.clickToMoreRecipes = false;
  41. this.drawHighlightedBackground = true;
  42. }
  43. public SlotWidget(int x, int y, List<ItemStack> itemList, boolean drawBackground, boolean showToolTips, boolean clickToMoreRecipes) {
  44. this(x, y, itemList, drawBackground, showToolTips);
  45. this.clickToMoreRecipes = clickToMoreRecipes;
  46. }
  47. public int getX() {
  48. return x;
  49. }
  50. public void setX(int x) {
  51. this.x = x;
  52. }
  53. public int getY() {
  54. return y;
  55. }
  56. public void setY(int y) {
  57. this.y = y;
  58. }
  59. public boolean isShowToolTips() {
  60. return showToolTips;
  61. }
  62. public void setShowToolTips(boolean showToolTips) {
  63. this.showToolTips = showToolTips;
  64. }
  65. public boolean isClickToMoreRecipes() {
  66. return clickToMoreRecipes;
  67. }
  68. public void setClickToMoreRecipes(boolean clickToMoreRecipes) {
  69. this.clickToMoreRecipes = clickToMoreRecipes;
  70. }
  71. public boolean isDrawHighlightedBackground() {
  72. return drawHighlightedBackground;
  73. }
  74. public void setDrawHighlightedBackground(boolean drawHighlightedBackground) {
  75. this.drawHighlightedBackground = drawHighlightedBackground;
  76. }
  77. @Override
  78. public List<? extends Element> children() {
  79. return Collections.emptyList();
  80. }
  81. public boolean isDrawBackground() {
  82. return drawBackground;
  83. }
  84. public void setDrawBackground(boolean drawBackground) {
  85. this.drawBackground = drawBackground;
  86. }
  87. @Override
  88. public void render(int mouseX, int mouseY, float delta) {
  89. Renderer renderer = getCurrentRenderer();
  90. boolean darkTheme = ScreenHelper.isDarkModeEnabled();
  91. if (drawBackground) {
  92. minecraft.getTextureManager().bindTexture(darkTheme ? RECIPE_GUI_DARK : RECIPE_GUI);
  93. blit(this.x - 1, this.y - 1, 0, 222, 18, 18);
  94. }
  95. boolean highlighted = isHighlighted(mouseX, mouseY);
  96. if (drawHighlightedBackground && highlighted) {
  97. GlStateManager.disableLighting();
  98. GlStateManager.disableDepthTest();
  99. GlStateManager.colorMask(true, true, true, false);
  100. int color = darkTheme ? 0xFF5E5E5E : -2130706433;
  101. fillGradient(x, y, x + 16, y + 16, color, color);
  102. GlStateManager.colorMask(true, true, true, true);
  103. GlStateManager.enableLighting();
  104. GlStateManager.enableDepthTest();
  105. }
  106. if (isCurrentRendererItem() && !getCurrentItemStack().isEmpty()) {
  107. renderer.setBlitOffset(200);
  108. renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
  109. if (!getCurrentItemStack().isEmpty() && highlighted && showToolTips)
  110. queueTooltip(getCurrentItemStack(), delta);
  111. } else {
  112. renderer.setBlitOffset(200);
  113. renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
  114. }
  115. }
  116. public int getBlitOffset() {
  117. return this.blitOffset;
  118. }
  119. public void setBlitOffset(int offset) {
  120. this.blitOffset = offset;
  121. }
  122. protected void queueTooltip(ItemStack itemStack, float delta) {
  123. ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(itemStack)));
  124. }
  125. protected List<String> getTooltip(ItemStack itemStack) {
  126. final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem());
  127. List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack, true));
  128. String s1 = ClientHelperImpl.instance.getFormattedModNoItalicFromItem(itemStack.getItem()).toLowerCase(Locale.ROOT);
  129. toolTip.addAll(getExtraToolTips(itemStack));
  130. if (!modString.isEmpty()) {
  131. toolTip.removeIf(s -> s.toLowerCase(Locale.ROOT).contains(s1));
  132. toolTip.add(modString);
  133. }
  134. return toolTip;
  135. }
  136. protected List<String> getExtraToolTips(ItemStack stack) {
  137. return Collections.emptyList();
  138. }
  139. protected String getItemCountOverlay(ItemStack currentStack) {
  140. return "";
  141. }
  142. public ItemStack getCurrentItemStack() {
  143. if (getCurrentRenderer() instanceof ItemStackRenderer)
  144. return ((ItemStackRenderer) getCurrentRenderer()).getItemStack();
  145. return ItemStack.EMPTY;
  146. }
  147. public Renderer getCurrentRenderer() {
  148. if (renderers.size() == 0)
  149. return Renderer.empty();
  150. return renderers.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) renderers.size()) / 1f));
  151. }
  152. public void setItemList(List<ItemStack> itemList) {
  153. this.setRenderers(itemList.stream().map(Renderer::fromItemStack).collect(Collectors.toList()));
  154. }
  155. public void setRenderers(List<Renderer> renderers) {
  156. this.renderers = renderers;
  157. }
  158. @Override
  159. public Rectangle getBounds() {
  160. return new Rectangle(this.x - 1, this.y - 1, 18, 18);
  161. }
  162. @Override
  163. public boolean mouseClicked(double mouseX, double mouseY, int button) {
  164. if (!clickToMoreRecipes)
  165. return false;
  166. if (isCurrentRendererItem() && getBounds().contains(mouseX, mouseY))
  167. if (button == 0)
  168. return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
  169. else if (button == 1)
  170. return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
  171. return false;
  172. }
  173. public boolean isCurrentRendererItem() {
  174. return getCurrentRenderer() instanceof ItemStackRenderer;
  175. }
  176. @Override
  177. public boolean keyPressed(int int_1, int int_2, int int_3) {
  178. if (!clickToMoreRecipes)
  179. return false;
  180. if (isCurrentRendererItem() && getBounds().contains(ClientUtils.getMouseLocation()))
  181. if (ClientHelper.getInstance().getRecipeKeyBinding().matchesKey(int_1, int_2))
  182. return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
  183. else if (ClientHelper.getInstance().getUsageKeyBinding().matchesKey(int_1, int_2))
  184. return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
  185. return false;
  186. }
  187. }