SlotWidget.java 8.0 KB

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