DefaultPlugin.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package me.shedaniel.rei.plugin;
  2. import com.google.common.collect.Lists;
  3. import me.shedaniel.rei.api.IRecipeCategoryCraftable;
  4. import me.shedaniel.rei.api.IRecipePlugin;
  5. import me.shedaniel.rei.client.ClientHelper;
  6. import me.shedaniel.rei.client.GuiHelper;
  7. import me.shedaniel.rei.client.RecipeHelper;
  8. import me.shedaniel.rei.gui.widget.ButtonWidget;
  9. import me.shedaniel.rei.gui.widget.IWidget;
  10. import me.shedaniel.rei.gui.widget.QueuedTooltip;
  11. import me.shedaniel.rei.listeners.IMixinContainerGui;
  12. import me.shedaniel.rei.listeners.IMixinRecipeBookGui;
  13. import net.minecraft.client.MinecraftClient;
  14. import net.minecraft.client.gui.ContainerGui;
  15. import net.minecraft.client.gui.Gui;
  16. import net.minecraft.client.gui.container.BlastFurnaceGui;
  17. import net.minecraft.client.gui.container.CraftingTableGui;
  18. import net.minecraft.client.gui.container.FurnaceGui;
  19. import net.minecraft.client.gui.container.SmokerGui;
  20. import net.minecraft.client.gui.ingame.PlayerInventoryGui;
  21. import net.minecraft.client.resource.language.I18n;
  22. import net.minecraft.recipe.Recipe;
  23. import net.minecraft.recipe.crafting.ShapedRecipe;
  24. import net.minecraft.recipe.crafting.ShapelessRecipe;
  25. import net.minecraft.recipe.smelting.BlastingRecipe;
  26. import net.minecraft.recipe.smelting.SmeltingRecipe;
  27. import net.minecraft.recipe.smelting.SmokingRecipe;
  28. import net.minecraft.util.Identifier;
  29. import java.awt.*;
  30. import java.util.Arrays;
  31. import java.util.List;
  32. public class DefaultPlugin implements IRecipePlugin {
  33. static final Identifier CRAFTING = new Identifier("roughlyenoughitems", "plugins/crafting");
  34. static final Identifier SMELTING = new Identifier("roughlyenoughitems", "plugins/smelting");
  35. static final Identifier SMOKING = new Identifier("roughlyenoughitems", "plugins/smoking");
  36. static final Identifier BLASTING = new Identifier("roughlyenoughitems", "plugins/blasting");
  37. static final Identifier BREWING = new Identifier("roughlyenoughitems", "plugins/brewing");
  38. static final List<DefaultBrewingDisplay> BREWING_DISPLAYS = Lists.newArrayList();
  39. public static void registerBrewingDisplay(DefaultBrewingDisplay display) {
  40. BREWING_DISPLAYS.add(display);
  41. }
  42. @Override
  43. public void registerPluginCategories() {
  44. RecipeHelper.registerCategory(new DefaultCraftingCategory());
  45. RecipeHelper.registerCategory(new DefaultSmeltingCategory());
  46. RecipeHelper.registerCategory(new DefaultSmokingCategory());
  47. RecipeHelper.registerCategory(new DefaultBlastingCategory());
  48. RecipeHelper.registerCategory(new DefaultBrewingCategory());
  49. }
  50. @Override
  51. public void registerRecipes() {
  52. for(Recipe value : RecipeHelper.getRecipeManager().values())
  53. if (value instanceof ShapelessRecipe)
  54. RecipeHelper.registerRecipe(CRAFTING, new DefaultShapelessDisplay((ShapelessRecipe) value));
  55. else if (value instanceof ShapedRecipe)
  56. RecipeHelper.registerRecipe(CRAFTING, new DefaultShapedDisplay((ShapedRecipe) value));
  57. else if (value instanceof SmeltingRecipe)
  58. RecipeHelper.registerRecipe(SMELTING, new DefaultSmeltingDisplay((SmeltingRecipe) value));
  59. else if (value instanceof SmokingRecipe)
  60. RecipeHelper.registerRecipe(SMOKING, new DefaultSmokingDisplay((SmokingRecipe) value));
  61. else if (value instanceof BlastingRecipe)
  62. RecipeHelper.registerRecipe(BLASTING, new DefaultBlastingDisplay((BlastingRecipe) value));
  63. BREWING_DISPLAYS.forEach(display -> RecipeHelper.registerRecipe(BREWING, display));
  64. }
  65. @Override
  66. public void registerAutoCraftingGui() {
  67. RecipeHelper.registerCategoryCraftable(new Class[]{DefaultShapelessDisplay.class, DefaultShapedDisplay.class}, new IRecipeCategoryCraftable<DefaultCraftingDisplay>() {
  68. @Override
  69. public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultCraftingDisplay recipe) {
  70. return guiClass.isAssignableFrom(CraftingTableGui.class) || (guiClass.isAssignableFrom(PlayerInventoryGui.class) && recipe.getHeight() < 3 && recipe.getWidth() < 3);
  71. }
  72. @Override
  73. public boolean performAutoCraft(Gui gui, DefaultCraftingDisplay recipe) {
  74. if (gui.getClass().isAssignableFrom(CraftingTableGui.class))
  75. ((IMixinRecipeBookGui) (((CraftingTableGui) gui).getRecipeBookGui())).getGhostSlots().reset();
  76. else if (gui.getClass().isAssignableFrom(PlayerInventoryGui.class))
  77. ((IMixinRecipeBookGui) (((PlayerInventoryGui) gui).getRecipeBookGui())).getGhostSlots().reset();
  78. else return false;
  79. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
  80. return true;
  81. }
  82. @Override
  83. public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultCraftingDisplay recipe) {
  84. Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
  85. ButtonWidget widget;
  86. widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
  87. @Override
  88. public void onPressed(int button, double mouseX, double mouseY) {
  89. MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
  90. if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
  91. performAutoCraft(parentGui.getContainerGui(), recipe);
  92. }
  93. @Override
  94. public void draw(int mouseX, int mouseY, float partialTicks) {
  95. super.draw(mouseX, mouseY, partialTicks);
  96. List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
  97. if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
  98. GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
  99. }
  100. });
  101. widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
  102. }
  103. private List<String> getToolTip(ContainerGui parentGui, DefaultCraftingDisplay recipe) {
  104. if (!(parentGui instanceof CraftingTableGui || parentGui instanceof PlayerInventoryGui))
  105. return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
  106. if (parentGui instanceof PlayerInventoryGui && !(recipe.getHeight() < 3 && recipe.getWidth() < 3))
  107. return Arrays.asList(I18n.translate("text.auto_craft.crafting.too_small"));
  108. return Lists.newArrayList();
  109. }
  110. });
  111. RecipeHelper.registerCategoryCraftable(DefaultSmeltingDisplay.class, new IRecipeCategoryCraftable<DefaultSmeltingDisplay>() {
  112. @Override
  113. public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultSmeltingDisplay recipe) {
  114. return guiClass.isAssignableFrom(FurnaceGui.class);
  115. }
  116. @Override
  117. public boolean performAutoCraft(Gui gui, DefaultSmeltingDisplay recipe) {
  118. if (gui.getClass().isAssignableFrom(FurnaceGui.class))
  119. ((IMixinRecipeBookGui) (((FurnaceGui) gui).getRecipeBookGui())).getGhostSlots().reset();
  120. else return false;
  121. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
  122. return true;
  123. }
  124. @Override
  125. public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultSmeltingDisplay recipe) {
  126. Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
  127. ButtonWidget widget;
  128. widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
  129. @Override
  130. public void onPressed(int button, double mouseX, double mouseY) {
  131. MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
  132. if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
  133. performAutoCraft(parentGui.getContainerGui(), recipe);
  134. }
  135. @Override
  136. public void draw(int mouseX, int mouseY, float partialTicks) {
  137. super.draw(mouseX, mouseY, partialTicks);
  138. List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
  139. if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
  140. GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
  141. }
  142. });
  143. widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
  144. }
  145. private List<String> getToolTip(ContainerGui parentGui, DefaultSmeltingDisplay recipe) {
  146. if (!(parentGui instanceof FurnaceGui))
  147. return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
  148. return Lists.newArrayList();
  149. }
  150. });
  151. RecipeHelper.registerCategoryCraftable(DefaultSmokingDisplay.class, new IRecipeCategoryCraftable<DefaultSmokingDisplay>() {
  152. @Override
  153. public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultSmokingDisplay recipe) {
  154. return guiClass.isAssignableFrom(SmokerGui.class);
  155. }
  156. @Override
  157. public boolean performAutoCraft(Gui gui, DefaultSmokingDisplay recipe) {
  158. if (gui.getClass().isAssignableFrom(SmokerGui.class))
  159. ((IMixinRecipeBookGui) (((SmokerGui) gui).getRecipeBookGui())).getGhostSlots().reset();
  160. else return false;
  161. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
  162. return true;
  163. }
  164. @Override
  165. public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultSmokingDisplay recipe) {
  166. Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
  167. ButtonWidget widget;
  168. widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
  169. @Override
  170. public void onPressed(int button, double mouseX, double mouseY) {
  171. MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
  172. if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
  173. performAutoCraft(parentGui.getContainerGui(), recipe);
  174. }
  175. @Override
  176. public void draw(int mouseX, int mouseY, float partialTicks) {
  177. super.draw(mouseX, mouseY, partialTicks);
  178. List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
  179. if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
  180. GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
  181. }
  182. });
  183. widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
  184. }
  185. private List<String> getToolTip(ContainerGui parentGui, DefaultSmokingDisplay recipe) {
  186. if (!(parentGui instanceof SmokerGui))
  187. return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
  188. return Lists.newArrayList();
  189. }
  190. });
  191. RecipeHelper.registerCategoryCraftable(DefaultBlastingDisplay.class, new IRecipeCategoryCraftable<DefaultBlastingDisplay>() {
  192. @Override
  193. public boolean canAutoCraftHere(Class<? extends Gui> guiClass, DefaultBlastingDisplay recipe) {
  194. return guiClass.isAssignableFrom(BlastFurnaceGui.class);
  195. }
  196. @Override
  197. public boolean performAutoCraft(Gui gui, DefaultBlastingDisplay recipe) {
  198. if (gui.getClass().isAssignableFrom(BlastFurnaceGui.class))
  199. ((IMixinRecipeBookGui) (((BlastFurnaceGui) gui).getRecipeBookGui())).getGhostSlots().reset();
  200. else return false;
  201. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, recipe.getRecipe(), Gui.isShiftPressed());
  202. return true;
  203. }
  204. @Override
  205. public void registerAutoCraftButton(List<IWidget> widgets, Rectangle rectangle, IMixinContainerGui parentGui, DefaultBlastingDisplay recipe) {
  206. Point startPoint = new Point((int) rectangle.getCenterX() - 58, (int) rectangle.getCenterY() - 27);
  207. ButtonWidget widget;
  208. widgets.add(widget = new ButtonWidget(rectangle.x + 134, startPoint.y + 45, 10, 10, "+") {
  209. @Override
  210. public void onPressed(int button, double mouseX, double mouseY) {
  211. MinecraftClient.getInstance().openGui(parentGui.getContainerGui());
  212. if (canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe))
  213. performAutoCraft(parentGui.getContainerGui(), recipe);
  214. }
  215. @Override
  216. public void draw(int mouseX, int mouseY, float partialTicks) {
  217. super.draw(mouseX, mouseY, partialTicks);
  218. List<String> tooltips = getToolTip(parentGui.getContainerGui(), recipe);
  219. if (tooltips.size() > 0 && getBounds().contains(mouseX, mouseY))
  220. GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), tooltips));
  221. }
  222. });
  223. widget.enabled = canAutoCraftHere(parentGui.getContainerGui().getClass(), recipe);
  224. }
  225. private List<String> getToolTip(ContainerGui parentGui, DefaultBlastingDisplay recipe) {
  226. if (!(parentGui instanceof BlastFurnaceGui))
  227. return Arrays.asList(I18n.translate("text.auto_craft.wrong_gui"));
  228. return Lists.newArrayList();
  229. }
  230. });
  231. }
  232. }