AutoCraftingButtonWidget.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.gui.widget;
  6. import com.mojang.blaze3d.platform.GlStateManager;
  7. import it.unimi.dsi.fastutil.ints.IntList;
  8. import me.shedaniel.math.api.Point;
  9. import me.shedaniel.math.api.Rectangle;
  10. import me.shedaniel.rei.api.*;
  11. import me.shedaniel.rei.impl.ScreenHelper;
  12. import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen;
  13. import net.minecraft.client.resource.language.I18n;
  14. import net.minecraft.util.Formatting;
  15. import net.minecraft.util.Identifier;
  16. import net.minecraft.util.math.MathHelper;
  17. import java.util.List;
  18. import java.util.Optional;
  19. import java.util.function.Supplier;
  20. public class AutoCraftingButtonWidget extends ButtonWidget {
  21. private final Supplier<RecipeDisplay> displaySupplier;
  22. private String extraTooltip;
  23. private String errorTooltip;
  24. private List<Widget> setupDisplay;
  25. private AbstractContainerScreen<?> containerScreen;
  26. private boolean visible = false;
  27. private RecipeCategory<?> category;
  28. private Rectangle displayBounds;
  29. public AutoCraftingButtonWidget(Rectangle displayBounds, Rectangle rectangle, String text, Supplier<RecipeDisplay> displaySupplier, List<Widget> setupDisplay, RecipeCategory<?> recipeCategory) {
  30. super(rectangle, text);
  31. this.displayBounds = displayBounds;
  32. this.displaySupplier = () -> displaySupplier.get();
  33. Optional<Identifier> recipe = displaySupplier.get().getRecipeLocation();
  34. extraTooltip = recipe.isPresent() ? I18n.translate("text.rei.recipe_id", Formatting.GRAY.toString(), recipe.get().toString()) : "";
  35. this.containerScreen = ScreenHelper.getLastContainerScreen();
  36. this.setupDisplay = setupDisplay;
  37. this.category = recipeCategory;
  38. }
  39. @Override
  40. public void onPressed() {
  41. AutoTransferHandler.Context context = AutoTransferHandler.Context.create(true, containerScreen, displaySupplier.get());
  42. for (AutoTransferHandler autoTransferHandler : RecipeHelper.getInstance().getSortedAutoCraftingHandler())
  43. try {
  44. AutoTransferHandler.Result result = autoTransferHandler.handle(context);
  45. if (result.isSuccessful())
  46. return;
  47. } catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. minecraft.openScreen(containerScreen);
  51. ScreenHelper.getLastOverlay().init();
  52. }
  53. @Override
  54. public void render(int mouseX, int mouseY, float delta) {
  55. this.enabled = false;
  56. String error = null;
  57. int color = 0;
  58. visible = false;
  59. IntList redSlots = null;
  60. AutoTransferHandler.Context context = AutoTransferHandler.Context.create(false, containerScreen, displaySupplier.get());
  61. for (AutoTransferHandler autoTransferHandler : RecipeHelper.getInstance().getSortedAutoCraftingHandler()) {
  62. try {
  63. AutoTransferHandler.Result result = autoTransferHandler.handle(context);
  64. if (result.isApplicable())
  65. visible = true;
  66. if (result.isSuccessful()) {
  67. enabled = true;
  68. error = null;
  69. break;
  70. } else if (error == null) {
  71. error = result.getErrorKey();
  72. color = result.getColor();
  73. redSlots = result.getIntegers();
  74. }
  75. } catch (Exception e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. if (!visible) {
  80. enabled = false;
  81. error = "error.rei.no.handlers.applicable";
  82. }
  83. if (isHovered(mouseX, mouseY) && category instanceof TransferRecipeCategory && redSlots != null) {
  84. ((TransferRecipeCategory<RecipeDisplay>) category).renderRedSlots(setupDisplay, displayBounds, displaySupplier.get(), redSlots);
  85. }
  86. errorTooltip = error;
  87. int x = getBounds().x, y = getBounds().y, width = getBounds().width, height = getBounds().height;
  88. minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? BUTTON_LOCATION_DARK : BUTTON_LOCATION);
  89. GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
  90. int textureOffset = this.getTextureId(isHovered(mouseX, mouseY));
  91. GlStateManager.enableBlend();
  92. GlStateManager.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
  93. GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
  94. //Four Corners
  95. blit(x, y, 0, textureOffset * 80, 4, 4);
  96. blit(x + width - 4, y, 252, textureOffset * 80, 4, 4);
  97. blit(x, y + height - 4, 0, textureOffset * 80 + 76, 4, 4);
  98. blit(x + width - 4, y + height - 4, 252, textureOffset * 80 + 76, 4, 4);
  99. //Sides
  100. blit(x + 4, y, 4, textureOffset * 80, MathHelper.ceil((width - 8) / 2f), 4);
  101. blit(x + 4, y + height - 4, 4, textureOffset * 80 + 76, MathHelper.ceil((width - 8) / 2f), 4);
  102. blit(x + 4 + MathHelper.ceil((width - 8) / 2f), y + height - 4, 252 - MathHelper.floor((width - 8) / 2f), textureOffset * 80 + 76, MathHelper.floor((width - 8) / 2f), 4);
  103. blit(x + 4 + MathHelper.ceil((width - 8) / 2f), y, 252 - MathHelper.floor((width - 8) / 2f), textureOffset * 80, MathHelper.floor((width - 8) / 2f), 4);
  104. for (int i = y + 4; i < y + height - 4; i += 76) {
  105. blit(x, i, 0, 4 + textureOffset * 80, MathHelper.ceil(width / 2f), MathHelper.clamp(y + height - 4 - i, 0, 76));
  106. blit(x + MathHelper.ceil(width / 2f), i, 256 - MathHelper.floor(width / 2f), 4 + textureOffset * 80, MathHelper.floor(width / 2f), MathHelper.clamp(y + height - 4 - i, 0, 76));
  107. }
  108. int colour = 14737632;
  109. if (!this.visible) {
  110. colour = 10526880;
  111. } else if (enabled && isHovered(mouseX, mouseY)) {
  112. colour = 16777120;
  113. }
  114. fillGradient(x, y, x + width, y + height, color, color);
  115. this.drawCenteredString(font, text, x + width / 2, y + (height - 8) / 2, colour);
  116. if (getTooltips().isPresent())
  117. if (!focused && containsMouse(mouseX, mouseY))
  118. ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(getTooltips().get().split("\n")));
  119. else if (focused)
  120. ScreenHelper.getLastOverlay().addTooltip(QueuedTooltip.create(new Point(x + width / 2, y + height / 2), getTooltips().get().split("\n")));
  121. }
  122. @Override
  123. protected int getTextureId(boolean boolean_1) {
  124. return !visible ? 0 : boolean_1 && enabled ? 2 : 1;
  125. }
  126. @Override
  127. public Optional<String> getTooltips() {
  128. if (this.minecraft.options.advancedItemTooltips)
  129. if (errorTooltip == null)
  130. return Optional.ofNullable(I18n.translate("text.auto_craft.move_items") + extraTooltip);
  131. else
  132. return Optional.ofNullable(Formatting.RED.toString() + I18n.translate(errorTooltip) + extraTooltip);
  133. if (errorTooltip == null)
  134. return Optional.ofNullable(I18n.translate("text.auto_craft.move_items"));
  135. else
  136. return Optional.ofNullable(Formatting.RED.toString() + I18n.translate(errorTooltip));
  137. }
  138. }