REIRenderHelper.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package me.shedaniel.gui;
  2. import com.mojang.blaze3d.platform.GlStateManager;
  3. import me.shedaniel.gui.widget.Control;
  4. import me.shedaniel.gui.widget.IFocusable;
  5. import me.shedaniel.gui.widget.REISlot;
  6. import me.shedaniel.impl.REIRecipeManager;
  7. import me.shedaniel.library.KeyBindManager;
  8. import me.shedaniel.listenerdefinitions.IMixinContainerGui;
  9. import net.fabricmc.loader.FabricLoader;
  10. import net.minecraft.client.MinecraftClient;
  11. import net.minecraft.client.font.FontRenderer;
  12. import net.minecraft.client.gui.ContainerGui;
  13. import net.minecraft.client.render.item.ItemRenderer;
  14. import net.minecraft.client.util.Window;
  15. import net.minecraft.item.ItemStack;
  16. import java.awt.*;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.Optional;
  20. /**
  21. * Created by James on 7/28/2018.
  22. */
  23. public class REIRenderHelper {
  24. static Point mouseLoc;
  25. static public GuiItemList reiGui;
  26. static ContainerGui overlayedGui;
  27. static List<TooltipData> tooltipsToRender = new ArrayList<>();
  28. public static void setMouseLoc(int x, int y) {
  29. mouseLoc = new Point(x, y);
  30. }
  31. static public IFocusable focusedControl;
  32. public static Point getMouseLoc() {
  33. return mouseLoc;
  34. }
  35. public static Window getResolution() {
  36. return MinecraftClient.getInstance().window;
  37. }
  38. public static String tryGettingModName(String modid) {
  39. if (modid.equalsIgnoreCase("minecraft"))
  40. return "Minecraft";
  41. return FabricLoader.INSTANCE.getModContainers().stream()
  42. .map(modContainer -> {
  43. return modContainer.getInfo();
  44. })
  45. .filter(modInfo -> modInfo.getId().equals(modid) || (modInfo.getName() != null && modInfo.getName().equals(modid)))
  46. .findFirst().map(modInfo -> {
  47. if (modInfo.getName() != null)
  48. return modInfo.getName();
  49. return modid;
  50. }).orElse(modid);
  51. }
  52. public static void drawREI(ContainerGui overlayedGui) {
  53. REIRenderHelper.overlayedGui = overlayedGui;
  54. if (reiGui == null) {
  55. reiGui = new GuiItemList(overlayedGui);
  56. }
  57. reiGui.draw();
  58. renderTooltips();
  59. }
  60. public static void resize(int scaledWidth, int scaledHeight) {
  61. if (reiGui != null) {
  62. reiGui.resize();
  63. }
  64. if (overlayedGui instanceof RecipeGui) {
  65. overlayedGui.onScaleChanged(MinecraftClient.getInstance(), scaledWidth, scaledHeight);
  66. }
  67. }
  68. public static ItemRenderer getItemRender() {
  69. return MinecraftClient.getInstance().getItemRenderer();
  70. }
  71. public static FontRenderer getFontRenderer() {
  72. return MinecraftClient.getInstance().fontRenderer;
  73. }
  74. public static ContainerGui getOverlayedGui() {
  75. if (overlayedGui instanceof ContainerGui)
  76. return overlayedGui;
  77. return null;
  78. }
  79. public static void addToolTip(List<String> text, int x, int y) {
  80. tooltipsToRender.add(new TooltipData(text, x, y));
  81. }
  82. private static void renderTooltips() {
  83. GlStateManager.pushMatrix();
  84. GlStateManager.enableLighting();
  85. for(TooltipData tooltipData : tooltipsToRender) {
  86. getOverlayedGui().drawTooltip(tooltipData.text, tooltipData.x, tooltipData.y);
  87. }
  88. GlStateManager.disableLighting();
  89. tooltipsToRender.clear();
  90. GlStateManager.popMatrix();
  91. }
  92. public static boolean mouseClick(int x, int y, int button) {
  93. if (reiGui.visible) {
  94. for(Control control : reiGui.controls) {
  95. if (control.isHighlighted() && control.isEnabled() && control.onClick != null) {
  96. if (focusedControl != null)
  97. focusedControl.setFocused(false);
  98. if (control instanceof IFocusable) {
  99. focusedControl = (IFocusable) control;
  100. ((IFocusable) control).setFocused(true);
  101. }
  102. return control.onClick.apply(button);
  103. }
  104. }
  105. if (focusedControl != null) {
  106. focusedControl.setFocused(false);
  107. focusedControl = null;
  108. }
  109. }
  110. if (overlayedGui instanceof RecipeGui) {
  111. List<Control> controls = ((RecipeGui) overlayedGui).controls;
  112. Optional<Control> ctrl = controls.stream().filter(Control::isHighlighted).filter(Control::isEnabled).findFirst();
  113. if (ctrl.isPresent()) {
  114. try {
  115. return ctrl.get().onClick.apply(button);
  116. } catch (Exception e) {
  117. }
  118. }
  119. }
  120. return false;
  121. }
  122. public static boolean keyDown(int typedChar, int keyCode, int unknown) {
  123. boolean handled = false;
  124. if (focusedControl != null && focusedControl instanceof Control) {
  125. Control control = (Control) focusedControl;
  126. if (control.onKeyDown != null) {
  127. handled = control.onKeyDown.accept(typedChar, keyCode, unknown);
  128. }
  129. if (control.charPressed != null)
  130. if (typedChar == 256) {
  131. ((IFocusable) control).setFocused(false);
  132. focusedControl = null;
  133. }
  134. handled = true;
  135. }
  136. if (!handled) {
  137. return KeyBindManager.processGuiKeybinds(typedChar);
  138. }
  139. return handled;
  140. }
  141. public static boolean charInput(long num, int keyCode, int unknown) {
  142. if (focusedControl != null && focusedControl instanceof Control) {
  143. Control control = (Control) focusedControl;
  144. if (control.charPressed != null) {
  145. int numChars = Character.charCount(keyCode);
  146. if (num == numChars)
  147. control.charPressed.accept((char) keyCode, unknown);
  148. else {
  149. char[] chars = Character.toChars(keyCode);
  150. for(int x = 0; x < chars.length; x++) {
  151. control.charPressed.accept(chars[x], unknown);
  152. }
  153. }
  154. return true;
  155. }
  156. }
  157. return false;
  158. }
  159. public static boolean mouseScrolled(double direction) {
  160. if (!reiGui.visible)
  161. return false;
  162. if (direction > 0 && reiGui.buttonLeft.isEnabled())
  163. reiGui.buttonLeft.onClick.apply(0);
  164. else if (direction < 0 && reiGui.buttonRight.isEnabled())
  165. reiGui.buttonRight.onClick.apply(0);
  166. return true;
  167. }
  168. private static class TooltipData {
  169. private final List<String> text;
  170. private final int x;
  171. private final int y;
  172. public TooltipData(List<String> text, int x, int y) {
  173. this.text = text;
  174. this.x = x;
  175. this.y = y;
  176. }
  177. }
  178. public static void updateSearch() {
  179. reiGui.updateView();
  180. }
  181. public static void tick() {
  182. if (reiGui != null && MinecraftClient.getInstance().currentGui == overlayedGui)
  183. reiGui.tick();
  184. }
  185. public static void recipeKeybind() {
  186. if (!(MinecraftClient.getInstance().currentGui instanceof ContainerGui))
  187. return;
  188. Control control = reiGui.getLastHovered();
  189. if (control != null && control.isHighlighted() && control instanceof REISlot) {
  190. REISlot slot = (REISlot) control;
  191. REIRecipeManager.instance().displayRecipesFor(slot.getStack());
  192. return;
  193. }
  194. if (((IMixinContainerGui) overlayedGui).getHoveredSlot() != null) {
  195. ItemStack stack = ((IMixinContainerGui) overlayedGui).getHoveredSlot().getStack();
  196. REIRecipeManager.instance().displayRecipesFor(stack);
  197. }
  198. }
  199. public static void useKeybind() {
  200. if (!(MinecraftClient.getInstance().currentGui instanceof ContainerGui))
  201. return;
  202. Control control = reiGui.getLastHovered();
  203. if (control != null && control.isHighlighted() && control instanceof REISlot) {
  204. REISlot slot = (REISlot) control;
  205. REIRecipeManager.instance().displayUsesFor(slot.getStack());
  206. return;
  207. }
  208. if (((IMixinContainerGui) overlayedGui).getHoveredSlot() != null) {
  209. ItemStack stack = ((IMixinContainerGui) overlayedGui).getHoveredSlot().getStack();
  210. REIRecipeManager.instance().displayUsesFor(stack);
  211. }
  212. }
  213. public static void hideKeybind() {
  214. if (MinecraftClient.getInstance().currentGui == overlayedGui && reiGui != null) {
  215. reiGui.visible = !reiGui.visible;
  216. }
  217. }
  218. }