ContainerScreenOverlay.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. package me.shedaniel.rei.gui;
  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.DisplayHelper;
  7. import me.shedaniel.rei.client.ClientHelper;
  8. import me.shedaniel.rei.client.ScreenHelper;
  9. import me.shedaniel.rei.client.Weather;
  10. import me.shedaniel.rei.gui.widget.*;
  11. import net.minecraft.client.MinecraftClient;
  12. import net.minecraft.client.audio.PositionedSoundInstance;
  13. import net.minecraft.client.font.TextRenderer;
  14. import net.minecraft.client.gui.*;
  15. import net.minecraft.client.render.GuiLighting;
  16. import net.minecraft.client.resource.language.I18n;
  17. import net.minecraft.client.util.Window;
  18. import net.minecraft.client.world.ClientWorld;
  19. import net.minecraft.item.ItemStack;
  20. import net.minecraft.sound.SoundEvents;
  21. import net.minecraft.text.TranslatableTextComponent;
  22. import net.minecraft.util.Identifier;
  23. import net.minecraft.util.math.MathHelper;
  24. import net.minecraft.world.GameMode;
  25. import java.awt.*;
  26. import java.util.*;
  27. import java.util.List;
  28. import java.util.stream.Collectors;
  29. public class ContainerScreenOverlay extends AbstractParentElement implements Drawable {
  30. private static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png");
  31. private static final List<QueuedTooltip> QUEUED_TOOLTIPS = Lists.newArrayList();
  32. public static String searchTerm = "";
  33. private static int page = 0;
  34. private static ItemListOverlay itemListOverlay;
  35. private final List<Widget> widgets = Lists.newLinkedList();
  36. private Rectangle rectangle;
  37. private Window window;
  38. private ButtonWidget buttonLeft, buttonRight;
  39. private int lastLeft;
  40. public static ItemListOverlay getItemListOverlay() {
  41. return itemListOverlay;
  42. }
  43. public void init() {
  44. init(false);
  45. }
  46. public void init(boolean setPage) {
  47. //Update Variables
  48. this.children().clear();
  49. this.window = MinecraftClient.getInstance().window;
  50. DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
  51. this.rectangle = RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? boundsHandler.getLeftBounds(MinecraftClient.getInstance().currentScreen) : boundsHandler.getRightBounds(MinecraftClient.getInstance().currentScreen);
  52. this.lastLeft = getLeft();
  53. widgets.add(this.itemListOverlay = new ItemListOverlay(page));
  54. itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  55. widgets.add(buttonLeft = new ButtonWidget(rectangle.x, rectangle.y + 5, 16, 16, new TranslatableTextComponent("text.rei.left_arrow")) {
  56. @Override
  57. public void onPressed() {
  58. page--;
  59. if (page < 0)
  60. page = getTotalPage();
  61. itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  62. }
  63. @Override
  64. public Optional<String> getTooltips() {
  65. return Optional.ofNullable(I18n.translate("text.rei.previous_page"));
  66. }
  67. @Override
  68. public boolean changeFocus(boolean boolean_1) {
  69. return false;
  70. }
  71. });
  72. widgets.add(buttonRight = new ButtonWidget(rectangle.x + rectangle.width - 18, rectangle.y + 5, 16, 16, new TranslatableTextComponent("text.rei.right_arrow")) {
  73. @Override
  74. public void onPressed() {
  75. page++;
  76. if (page > getTotalPage())
  77. page = 0;
  78. itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  79. }
  80. @Override
  81. public Optional<String> getTooltips() {
  82. return Optional.ofNullable(I18n.translate("text.rei.next_page"));
  83. }
  84. @Override
  85. public boolean changeFocus(boolean boolean_1) {
  86. return false;
  87. }
  88. });
  89. if (setPage)
  90. page = MathHelper.clamp(page, 0, getTotalPage());
  91. widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? window.getScaledWidth() - 30 : 10, 10, 20, 20, "") {
  92. @Override
  93. public void onPressed() {
  94. if (Screen.hasShiftDown()) {
  95. ClientHelper.setCheating(!ClientHelper.isCheating());
  96. return;
  97. }
  98. RoughlyEnoughItemsCore.getConfigManager().openConfigScreen(ScreenHelper.getLastContainerScreen());
  99. }
  100. @Override
  101. public void render(int mouseX, int mouseY, float delta) {
  102. super.render(mouseX, mouseY, delta);
  103. GuiLighting.disable();
  104. if (ClientHelper.isCheating())
  105. fill(getBounds().x, getBounds().y, getBounds().x + 20, getBounds().y + 20, new Color(255, 0, 0, 42).getRGB());
  106. MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
  107. GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
  108. blit(getBounds().x + 3, getBounds().y + 3, 0, 0, 14, 14);
  109. }
  110. @Override
  111. public Optional<String> getTooltips() {
  112. String tooltips = I18n.translate("text.rei.config_tooltip");
  113. tooltips += "\n ";
  114. if (!ClientHelper.isCheating())
  115. tooltips += "\n§c§m" + I18n.translate("text.rei.cheating");
  116. else
  117. tooltips += "\n§a" + I18n.translate("text.rei.cheating");
  118. return Optional.ofNullable(tooltips);
  119. }
  120. @Override
  121. public boolean changeFocus(boolean boolean_1) {
  122. return false;
  123. }
  124. });
  125. if (RoughlyEnoughItemsCore.getConfigManager().getConfig().showUtilsButtons) {
  126. widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? window.getScaledWidth() - 55 : 35, 10, 20, 20, "") {
  127. @Override
  128. public void onPressed() {
  129. MinecraftClient.getInstance().player.sendChatMessage(RoughlyEnoughItemsCore.getConfigManager().getConfig().gamemodeCommand.replaceAll("\\{gamemode}", getNextGameMode().getName()));
  130. }
  131. @Override
  132. public void render(int mouseX, int mouseY, float delta) {
  133. text = getGameModeShortText(getCurrentGameMode());
  134. super.render(mouseX, mouseY, delta);
  135. }
  136. @Override
  137. public Optional<String> getTooltips() {
  138. return Optional.ofNullable(I18n.translate("text.rei.gamemode_button.tooltip", getGameModeText(getNextGameMode())));
  139. }
  140. @Override
  141. public boolean changeFocus(boolean boolean_1) {
  142. return false;
  143. }
  144. });
  145. widgets.add(new ButtonWidget(RoughlyEnoughItemsCore.getConfigManager().getConfig().mirrorItemPanel ? window.getScaledWidth() - 80 : 60, 10, 20, 20, "") {
  146. @Override
  147. public void onPressed() {
  148. MinecraftClient.getInstance().player.sendChatMessage(RoughlyEnoughItemsCore.getConfigManager().getConfig().weatherCommand.replaceAll("\\{weather}", getNextWeather().name().toLowerCase()));
  149. }
  150. @Override
  151. public void render(int mouseX, int mouseY, float delta) {
  152. super.render(mouseX, mouseY, delta);
  153. GuiLighting.disable();
  154. MinecraftClient.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE);
  155. GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
  156. blit(getBounds().x + 3, getBounds().y + 3, getCurrentWeather().getId() * 14, 14, 14, 14);
  157. }
  158. @Override
  159. public Optional<String> getTooltips() {
  160. return Optional.ofNullable(I18n.translate("text.rei.weather_button.tooltip", I18n.translate(getNextWeather().getTranslateKey())));
  161. }
  162. @Override
  163. public boolean changeFocus(boolean boolean_1) {
  164. return false;
  165. }
  166. });
  167. }
  168. widgets.add(new ClickableLabelWidget(rectangle.x + (rectangle.width / 2), rectangle.y + 10, "") {
  169. @Override
  170. public void render(int mouseX, int mouseY, float delta) {
  171. page = MathHelper.clamp(page, 0, getTotalPage());
  172. this.text = String.format("%s/%s", page + 1, getTotalPage() + 1);
  173. super.render(mouseX, mouseY, delta);
  174. }
  175. @Override
  176. public Optional<String> getTooltips() {
  177. return Optional.ofNullable(I18n.translate("text.rei.go_back_first_page"));
  178. }
  179. @Override
  180. public void onLabelClicked() {
  181. MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
  182. page = 0;
  183. itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  184. }
  185. @Override
  186. public boolean changeFocus(boolean boolean_1) {
  187. return false;
  188. }
  189. });
  190. if (ScreenHelper.searchField == null)
  191. ScreenHelper.searchField = new SearchFieldWidget(0, 0, 0, 0);
  192. ScreenHelper.searchField.setChangedListener(s -> {
  193. searchTerm = s;
  194. itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  195. });
  196. ScreenHelper.searchField.getBounds().setBounds(getTextFieldArea());
  197. this.widgets.add(ScreenHelper.searchField);
  198. ScreenHelper.searchField.setText(searchTerm);
  199. if (RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton)
  200. this.widgets.add(new CraftableToggleButtonWidget(getCraftableToggleArea()) {
  201. @Override
  202. public void onPressed() {
  203. RoughlyEnoughItemsCore.getConfigManager().toggleCraftableOnly();
  204. itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  205. }
  206. @Override
  207. public void render(int mouseX, int mouseY, float delta) {
  208. blitOffset = 600;
  209. super.render(mouseX, mouseY, delta);
  210. }
  211. });
  212. this.itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  213. }
  214. private Weather getNextWeather() {
  215. try {
  216. Weather current = getCurrentWeather();
  217. int next = current.getId() + 1;
  218. if (next >= 3)
  219. next = 0;
  220. return Weather.byId(next);
  221. } catch (Exception e) {
  222. return Weather.CLEAR;
  223. }
  224. }
  225. private Weather getCurrentWeather() {
  226. ClientWorld world = MinecraftClient.getInstance().world;
  227. if (world.isThundering())
  228. return Weather.THUNDER;
  229. if (world.getLevelProperties().isRaining())
  230. return Weather.RAIN;
  231. return Weather.CLEAR;
  232. }
  233. private String getGameModeShortText(GameMode gameMode) {
  234. return I18n.translate("text.rei.short_gamemode." + gameMode.getName());
  235. }
  236. private String getGameModeText(GameMode gameMode) {
  237. return I18n.translate("selectWorld.gameMode." + gameMode.getName());
  238. }
  239. private GameMode getNextGameMode() {
  240. try {
  241. GameMode current = getCurrentGameMode();
  242. int next = current.getId() + 1;
  243. if (next > 3)
  244. next = 0;
  245. return GameMode.byId(next);
  246. } catch (Exception e) {
  247. return GameMode.INVALID;
  248. }
  249. }
  250. private GameMode getCurrentGameMode() {
  251. return MinecraftClient.getInstance().getNetworkHandler().getScoreboardEntry(MinecraftClient.getInstance().player.getGameProfile().getId()).getGameMode();
  252. }
  253. private Rectangle getTextFieldArea() {
  254. int widthRemoved = RoughlyEnoughItemsCore.getConfigManager().getConfig().enableCraftableOnlyButton ? 22 : 2;
  255. if (RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField)
  256. return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6 - widthRemoved, 18);
  257. if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingScreen) {
  258. RecipeViewingScreen widget = (RecipeViewingScreen) MinecraftClient.getInstance().currentScreen;
  259. return new Rectangle(widget.getBounds().x, window.getScaledHeight() - 22, widget.getBounds().width - widthRemoved, 18);
  260. }
  261. return new Rectangle(ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft(), window.getScaledHeight() - 22, ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth() - widthRemoved, 18);
  262. }
  263. private Rectangle getCraftableToggleArea() {
  264. Rectangle searchBoxArea = getTextFieldArea();
  265. searchBoxArea.setLocation(searchBoxArea.x + searchBoxArea.width + 4, searchBoxArea.y - 1);
  266. searchBoxArea.setSize(20, 20);
  267. return searchBoxArea;
  268. }
  269. private String getCheatModeText() {
  270. return I18n.translate(String.format("%s%s", "text.rei.", ClientHelper.isCheating() ? "cheat" : "nocheat"));
  271. }
  272. public Rectangle getRectangle() {
  273. return rectangle;
  274. }
  275. @Override
  276. public void render(int mouseX, int mouseY, float delta) {
  277. List<ItemStack> currentStacks = ClientHelper.getInventoryItemsTypes();
  278. if (getLeft() != lastLeft)
  279. init(true);
  280. else if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && (!hasSameListContent(new LinkedList<>(ScreenHelper.inventoryStacks), currentStacks) || (currentStacks.size() != ScreenHelper.inventoryStacks.size()))) {
  281. ScreenHelper.inventoryStacks = ClientHelper.getInventoryItemsTypes();
  282. DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
  283. itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm);
  284. }
  285. GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
  286. GuiLighting.disable();
  287. this.renderWidgets(mouseX, mouseY, delta);
  288. }
  289. public void lateRender(int mouseX, int mouseY, float delta) {
  290. ScreenHelper.searchField.laterRender(mouseX, mouseY, delta);
  291. Screen currentScreen = MinecraftClient.getInstance().currentScreen;
  292. if (!(currentScreen instanceof RecipeViewingScreen) || !((RecipeViewingScreen) currentScreen).choosePageActivated)
  293. QUEUED_TOOLTIPS.stream().filter(queuedTooltip -> queuedTooltip != null).forEach(queuedTooltip -> renderTooltip(queuedTooltip.getText(), queuedTooltip.getLocation().x, queuedTooltip.getLocation().y));
  294. QUEUED_TOOLTIPS.clear();
  295. }
  296. public void renderTooltip(List<String> list_1, int int_1, int int_2) {
  297. TextRenderer font = MinecraftClient.getInstance().textRenderer;
  298. Window window = MinecraftClient.getInstance().window;
  299. if (!list_1.isEmpty()) {
  300. GlStateManager.disableRescaleNormal();
  301. GuiLighting.disable();
  302. GlStateManager.disableLighting();
  303. int int_3 = 0;
  304. Iterator var5 = list_1.iterator();
  305. while (var5.hasNext()) {
  306. String string_1 = (String) var5.next();
  307. int int_4 = font.getStringWidth(string_1);
  308. if (int_4 > int_3)
  309. int_3 = int_4;
  310. }
  311. int int_5 = int_1 + 12;
  312. int int_6 = int_2 - 12;
  313. int int_8 = 8;
  314. if (list_1.size() > 1)
  315. int_8 += 2 + (list_1.size() - 1) * 10;
  316. if (int_5 + int_3 > window.getScaledWidth())
  317. int_5 -= 28 + int_3;
  318. if (int_6 + int_8 + 6 > window.getScaledHeight())
  319. int_6 = window.getScaledHeight() - int_8 - 6;
  320. this.blitOffset = 1000;
  321. this.fillGradient(int_5 - 3, int_6 - 4, int_5 + int_3 + 3, int_6 - 3, -267386864, -267386864);
  322. this.fillGradient(int_5 - 3, int_6 + int_8 + 3, int_5 + int_3 + 3, int_6 + int_8 + 4, -267386864, -267386864);
  323. this.fillGradient(int_5 - 3, int_6 - 3, int_5 + int_3 + 3, int_6 + int_8 + 3, -267386864, -267386864);
  324. this.fillGradient(int_5 - 4, int_6 - 3, int_5 - 3, int_6 + int_8 + 3, -267386864, -267386864);
  325. this.fillGradient(int_5 + int_3 + 3, int_6 - 3, int_5 + int_3 + 4, int_6 + int_8 + 3, -267386864, -267386864);
  326. this.fillGradient(int_5 - 3, int_6 - 3 + 1, int_5 - 3 + 1, int_6 + int_8 + 3 - 1, 1347420415, 1344798847);
  327. this.fillGradient(int_5 + int_3 + 2, int_6 - 3 + 1, int_5 + int_3 + 3, int_6 + int_8 + 3 - 1, 1347420415, 1344798847);
  328. this.fillGradient(int_5 - 3, int_6 - 3, int_5 + int_3 + 3, int_6 - 3 + 1, 1347420415, 1347420415);
  329. this.fillGradient(int_5 - 3, int_6 + int_8 + 2, int_5 + int_3 + 3, int_6 + int_8 + 3, 1344798847, 1344798847);
  330. for(int int_12 = 0; int_12 < list_1.size(); ++int_12) {
  331. GlStateManager.disableDepthTest();
  332. font.drawWithShadow(list_1.get(int_12), (float) int_5, (float) int_6, -1);
  333. GlStateManager.enableDepthTest();
  334. if (int_12 == 0)
  335. int_6 += 2;
  336. int_6 += 10;
  337. }
  338. this.blitOffset = 0;
  339. GlStateManager.enableLighting();
  340. GuiLighting.enable();
  341. GlStateManager.enableRescaleNormal();
  342. }
  343. }
  344. private boolean hasSameListContent(List<ItemStack> list1, List<ItemStack> list2) {
  345. Collections.sort(list1, (itemStack, t1) -> {
  346. return ItemListOverlay.tryGetItemStackName(itemStack).compareToIgnoreCase(ItemListOverlay.tryGetItemStackName(t1));
  347. });
  348. Collections.sort(list2, (itemStack, t1) -> {
  349. return ItemListOverlay.tryGetItemStackName(itemStack).compareToIgnoreCase(ItemListOverlay.tryGetItemStackName(t1));
  350. });
  351. String lastString = String.join("", list1.stream().map(itemStack -> {
  352. return ItemListOverlay.tryGetItemStackName(itemStack);
  353. }).collect(Collectors.toList())), currentString = String.join("", list2.stream().map(itemStack -> {
  354. return ItemListOverlay.tryGetItemStackName(itemStack);
  355. }).collect(Collectors.toList()));
  356. return lastString.equals(currentString);
  357. }
  358. public void addTooltip(QueuedTooltip queuedTooltip) {
  359. QUEUED_TOOLTIPS.add(queuedTooltip);
  360. }
  361. public void renderWidgets(int int_1, int int_2, float float_1) {
  362. if (!ScreenHelper.isOverlayVisible())
  363. return;
  364. buttonLeft.enabled = itemListOverlay.children().size() > 0;
  365. buttonRight.enabled = itemListOverlay.children().size() > 0;
  366. widgets.forEach(widget -> {
  367. GuiLighting.disable();
  368. widget.render(int_1, int_2, float_1);
  369. });
  370. GuiLighting.disable();
  371. }
  372. private int getLeft() {
  373. if (MinecraftClient.getInstance().currentScreen instanceof RecipeViewingScreen) {
  374. RecipeViewingScreen widget = (RecipeViewingScreen) MinecraftClient.getInstance().currentScreen;
  375. return widget.getBounds().x;
  376. }
  377. if (MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen())
  378. return ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 147 - 30;
  379. return ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft();
  380. }
  381. private int getTotalPage() {
  382. if (itemListOverlay.getTotalSlotsPerPage() > 0)
  383. return MathHelper.ceil(itemListOverlay.getCurrentDisplayed().size() / itemListOverlay.getTotalSlotsPerPage());
  384. return 0;
  385. }
  386. @Override
  387. public boolean mouseScrolled(double i, double j, double amount) {
  388. if (!ScreenHelper.isOverlayVisible())
  389. return false;
  390. if (rectangle.contains(ClientUtils.getMouseLocation())) {
  391. if (amount > 0 && buttonLeft.enabled)
  392. buttonLeft.onPressed();
  393. else if (amount < 0 && buttonRight.enabled)
  394. buttonRight.onPressed();
  395. else
  396. return false;
  397. return true;
  398. }
  399. for(Widget widget : widgets)
  400. if (widget.mouseScrolled(i, j, amount))
  401. return true;
  402. return false;
  403. }
  404. @Override
  405. public boolean keyPressed(int int_1, int int_2, int int_3) {
  406. if (ScreenHelper.isOverlayVisible())
  407. for(Element listener : widgets)
  408. if (listener.keyPressed(int_1, int_2, int_3))
  409. return true;
  410. if (ClientHelper.HIDE.matchesKey(int_1, int_2)) {
  411. ScreenHelper.toggleOverlayVisible();
  412. return true;
  413. }
  414. if (!ScreenHelper.isOverlayVisible())
  415. return false;
  416. Point point = ClientUtils.getMouseLocation();
  417. ItemStack itemStack = null;
  418. if (MinecraftClient.getInstance().currentScreen instanceof ContainerScreen)
  419. if (ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot() != null && !ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack().isEmpty())
  420. itemStack = ScreenHelper.getLastContainerScreenHooks().rei_getHoveredSlot().getStack();
  421. if (itemStack != null && !itemStack.isEmpty()) {
  422. if (ClientHelper.RECIPE.matchesKey(int_1, int_2))
  423. return ClientHelper.executeRecipeKeyBind(itemStack);
  424. else if (ClientHelper.USAGE.matchesKey(int_1, int_2))
  425. return ClientHelper.executeUsageKeyBind(itemStack);
  426. }
  427. return false;
  428. }
  429. @Override
  430. public boolean charTyped(char char_1, int int_1) {
  431. if (!ScreenHelper.isOverlayVisible())
  432. return false;
  433. for(Element listener : widgets)
  434. if (listener.charTyped(char_1, int_1))
  435. return true;
  436. return false;
  437. }
  438. @Override
  439. public List<? extends Element> children() {
  440. return widgets;
  441. }
  442. @Override
  443. public boolean mouseClicked(double double_1, double double_2, int int_1) {
  444. if (!ScreenHelper.isOverlayVisible())
  445. return false;
  446. for(Element element : widgets) {
  447. if (element.mouseClicked(double_1, double_2, int_1)) {
  448. this.setFocused(element);
  449. if (int_1 == 0)
  450. this.setDragging(true);
  451. return true;
  452. }
  453. }
  454. return false;
  455. }
  456. public static class SearchFieldWidget extends TextFieldWidget {
  457. public SearchFieldWidget(int x, int y, int width, int height) {
  458. super(x, y, width, height);
  459. }
  460. public void laterRender(int int_1, int int_2, float float_1) {
  461. GuiLighting.disable();
  462. GlStateManager.disableDepthTest();
  463. super.render(int_1, int_2, float_1);
  464. GlStateManager.enableDepthTest();
  465. }
  466. @Override
  467. public boolean mouseClicked(double double_1, double double_2, int int_1) {
  468. if (isVisible() && getBounds().contains(double_1, double_2) && int_1 == 1) {
  469. setText("");
  470. return true;
  471. }
  472. return super.mouseClicked(double_1, double_2, int_1);
  473. }
  474. @Override
  475. public void render(int int_1, int int_2, float float_1) {
  476. }
  477. }
  478. }