SlotWidget.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package me.shedaniel.rei.gui.widget;
  2. import com.google.common.collect.Lists;
  3. import com.mojang.blaze3d.platform.GlStateManager;
  4. import me.shedaniel.cloth.api.ClientUtils;
  5. import me.shedaniel.rei.RoughlyEnoughItemsCore;
  6. import me.shedaniel.rei.api.ClientHelper;
  7. import me.shedaniel.rei.api.Renderable;
  8. import me.shedaniel.rei.api.Renderer;
  9. import me.shedaniel.rei.client.ScreenHelper;
  10. import me.shedaniel.rei.gui.renderables.ItemStackRenderer;
  11. import net.minecraft.client.gui.Element;
  12. import net.minecraft.item.ItemStack;
  13. import net.minecraft.item.Items;
  14. import net.minecraft.util.Identifier;
  15. import net.minecraft.util.math.MathHelper;
  16. import java.awt.*;
  17. import java.util.Collection;
  18. import java.util.Collections;
  19. import java.util.LinkedList;
  20. import java.util.List;
  21. import java.util.stream.Collectors;
  22. public class SlotWidget extends HighlightableWidget {
  23. private static final Identifier RECIPE_GUI = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
  24. private List<Renderer> renderers = new LinkedList<>();
  25. private boolean drawBackground, showToolTips, clickToMoreRecipes, drawHighlightedBackground;
  26. private int x, y;
  27. private static final ItemStackRenderer TROPICAL_FISH_RENDERABLE = Renderable.fromItemStack(Items.TROPICAL_FISH.getDefaultStack());
  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(Renderable::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 boolean isShowToolTips() {
  48. return showToolTips;
  49. }
  50. public void setShowToolTips(boolean showToolTips) {
  51. this.showToolTips = showToolTips;
  52. }
  53. public boolean isClickToMoreRecipes() {
  54. return clickToMoreRecipes;
  55. }
  56. public void setClickToMoreRecipes(boolean clickToMoreRecipes) {
  57. this.clickToMoreRecipes = clickToMoreRecipes;
  58. }
  59. public boolean isDrawHighlightedBackground() {
  60. return drawHighlightedBackground;
  61. }
  62. public void setDrawHighlightedBackground(boolean drawHighlightedBackground) {
  63. this.drawHighlightedBackground = drawHighlightedBackground;
  64. }
  65. @Override
  66. public List<? extends Element> children() {
  67. return Collections.emptyList();
  68. }
  69. public boolean isDrawBackground() {
  70. return drawBackground;
  71. }
  72. public void setDrawBackground(boolean drawBackground) {
  73. this.drawBackground = drawBackground;
  74. }
  75. @Override
  76. public void render(int mouseX, int mouseY, float delta) {
  77. Renderer renderer = getCurrentRenderer();
  78. if (drawBackground) {
  79. minecraft.getTextureManager().bindTexture(RECIPE_GUI);
  80. blit(this.x - 1, this.y - 1, 0, 222, 18, 18);
  81. }
  82. boolean highlighted = isHighlighted(mouseX, mouseY);
  83. if (drawHighlightedBackground && highlighted) {
  84. GlStateManager.disableLighting();
  85. GlStateManager.disableDepthTest();
  86. GlStateManager.colorMask(true, true, true, false);
  87. fillGradient(x, y, x + 16, y + 16, -2130706433, -2130706433);
  88. GlStateManager.colorMask(true, true, true, true);
  89. GlStateManager.enableLighting();
  90. GlStateManager.enableDepthTest();
  91. }
  92. if (isCurrentRendererItem() && !getCurrentItemStack().isEmpty()) {
  93. if (RoughlyEnoughItemsCore.getConfigManager().getConfig().aprilFoolsFish2019 && !highlighted)
  94. renderer = TROPICAL_FISH_RENDERABLE;
  95. renderer.setBlitOffset(200);
  96. renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
  97. if (!getCurrentItemStack().isEmpty() && highlighted && showToolTips)
  98. queueTooltip(getCurrentItemStack(), delta);
  99. } else {
  100. renderer.setBlitOffset(200);
  101. renderer.render(x + 8, y + 6, mouseX, mouseY, delta);
  102. }
  103. }
  104. protected void queueTooltip(ItemStack itemStack, float delta) {
  105. ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltip(itemStack)));
  106. }
  107. protected List<String> getTooltip(ItemStack itemStack) {
  108. final String modString = ClientHelper.getInstance().getFormattedModFromItem(itemStack.getItem());
  109. List<String> toolTip = Lists.newArrayList(ItemListOverlay.tryGetItemStackToolTip(itemStack, true));
  110. toolTip.addAll(getExtraToolTips(itemStack));
  111. boolean alreadyHasMod = false;
  112. for(String s : toolTip)
  113. if (s.equalsIgnoreCase(modString)) {
  114. alreadyHasMod = true;
  115. break;
  116. }
  117. if (!alreadyHasMod)
  118. toolTip.add(modString);
  119. return toolTip;
  120. }
  121. protected List<String> getExtraToolTips(ItemStack stack) {
  122. return Collections.emptyList();
  123. }
  124. protected String getItemCountOverlay(ItemStack currentStack) {
  125. return "";
  126. }
  127. public ItemStack getCurrentItemStack() {
  128. if (getCurrentRenderer() instanceof ItemStackRenderer)
  129. return ((ItemStackRenderer) getCurrentRenderer()).getItemStack();
  130. return ItemStack.EMPTY;
  131. }
  132. public Renderer getCurrentRenderer() {
  133. if (renderers.size() == 0)
  134. return Renderable.empty();
  135. return renderers.get(MathHelper.floor((System.currentTimeMillis() / 500 % (double) renderers.size()) / 1f));
  136. }
  137. public void setItemList(List<ItemStack> itemList) {
  138. this.setRenderers(itemList.stream().map(Renderable::fromItemStack).collect(Collectors.toList()));
  139. }
  140. public void setRenderers(List<Renderer> renderers) {
  141. this.renderers = renderers;
  142. }
  143. @Override
  144. public Rectangle getBounds() {
  145. return new Rectangle(this.x - 1, this.y - 1, 18, 18);
  146. }
  147. @Override
  148. public boolean mouseClicked(double mouseX, double mouseY, int button) {
  149. if (!clickToMoreRecipes)
  150. return false;
  151. if (isCurrentRendererItem() && getBounds().contains(mouseX, mouseY))
  152. if (button == 0)
  153. return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
  154. else if (button == 1)
  155. return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
  156. return false;
  157. }
  158. public boolean isCurrentRendererItem() {
  159. return getCurrentRenderer() instanceof ItemStackRenderer;
  160. }
  161. @Override
  162. public boolean keyPressed(int int_1, int int_2, int int_3) {
  163. if (!clickToMoreRecipes)
  164. return false;
  165. if (isCurrentRendererItem() && getBounds().contains(ClientUtils.getMouseLocation()))
  166. if (ClientHelper.getInstance().getRecipeKeyBinding().matchesKey(int_1, int_2))
  167. return ClientHelper.getInstance().executeRecipeKeyBind(getCurrentItemStack());
  168. else if (ClientHelper.getInstance().getUsageKeyBinding().matchesKey(int_1, int_2))
  169. return ClientHelper.getInstance().executeUsageKeyBind(getCurrentItemStack());
  170. return false;
  171. }
  172. }