DefaultPlugin.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /*
  2. * Roughly Enough Items by Danielshe.
  3. * Licensed under the MIT License.
  4. */
  5. package me.shedaniel.rei.plugin;
  6. import com.google.common.collect.Lists;
  7. import me.shedaniel.rei.RoughlyEnoughItemsCore;
  8. import me.shedaniel.rei.api.*;
  9. import me.shedaniel.rei.client.ScreenHelper;
  10. import me.shedaniel.rei.gui.RecipeViewingScreen;
  11. import me.shedaniel.rei.gui.VillagerRecipeViewingScreen;
  12. import me.shedaniel.rei.listeners.ContainerScreenHooks;
  13. import me.shedaniel.rei.listeners.RecipeBookGuiHooks;
  14. import net.minecraft.client.MinecraftClient;
  15. import net.minecraft.client.gui.screen.Screen;
  16. import net.minecraft.client.gui.screen.ingame.*;
  17. import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
  18. import net.minecraft.client.recipe.book.ClientRecipeBook;
  19. import net.minecraft.container.CraftingContainer;
  20. import net.minecraft.enchantment.Enchantment;
  21. import net.minecraft.enchantment.EnchantmentHelper;
  22. import net.minecraft.item.ItemStack;
  23. import net.minecraft.item.Items;
  24. import net.minecraft.potion.PotionUtil;
  25. import net.minecraft.recipe.*;
  26. import net.minecraft.util.Identifier;
  27. import net.minecraft.util.registry.Registry;
  28. import java.awt.*;
  29. import java.util.List;
  30. import java.util.*;
  31. public class DefaultPlugin implements REIPluginEntry {
  32. public static final Identifier CRAFTING = new Identifier("minecraft", "plugins/crafting");
  33. public static final Identifier SMELTING = new Identifier("minecraft", "plugins/smelting");
  34. public static final Identifier SMOKING = new Identifier("minecraft", "plugins/smoking");
  35. public static final Identifier BLASTING = new Identifier("minecraft", "plugins/blasting");
  36. public static final Identifier CAMPFIRE = new Identifier("minecraft", "plugins/campfire");
  37. public static final Identifier STONE_CUTTING = new Identifier("minecraft", "plugins/stone_cutting");
  38. public static final Identifier BREWING = new Identifier("minecraft", "plugins/brewing");
  39. public static final Identifier PLUGIN = new Identifier("roughlyenoughitems", "default_plugin");
  40. private static final Identifier DISPLAY_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/display.png");
  41. private static final Identifier DISPLAY_TEXTURE_DARK = new Identifier("roughlyenoughitems", "textures/gui/display_dark.png");
  42. public static Identifier getDisplayTexture() {
  43. return RoughlyEnoughItemsCore.getConfigManager().getConfig().darkTheme ? DISPLAY_TEXTURE_DARK : DISPLAY_TEXTURE;
  44. }
  45. private static final List<DefaultBrewingDisplay> BREWING_DISPLAYS = Lists.newArrayList();
  46. public static void registerBrewingDisplay(DefaultBrewingDisplay display) {
  47. BREWING_DISPLAYS.add(display);
  48. }
  49. @Override
  50. public Identifier getPluginIdentifier() {
  51. return PLUGIN;
  52. }
  53. @Override
  54. public void onFirstLoad(PluginDisabler pluginDisabler) {
  55. if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
  56. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_ITEMS);
  57. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_CATEGORIES);
  58. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_RECIPE_DISPLAYS);
  59. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_OTHERS);
  60. }
  61. }
  62. @Override
  63. public void registerItems(ItemRegistry itemRegistry) {
  64. Registry.ITEM.stream().forEach(item -> {
  65. itemRegistry.registerItemStack(item.getDefaultStack());
  66. try {
  67. itemRegistry.registerItemStack(itemRegistry.getAllStacksFromItem(item));
  68. } catch (Exception e) {
  69. }
  70. });
  71. Registry.ENCHANTMENT.forEach(enchantment -> {
  72. for(int i = enchantment.getMinimumLevel(); i <= enchantment.getMaximumLevel(); i++) {
  73. Map<Enchantment, Integer> map = new HashMap<>();
  74. map.put(enchantment, i);
  75. ItemStack itemStack = new ItemStack(Items.ENCHANTED_BOOK);
  76. EnchantmentHelper.set(map, itemStack);
  77. itemRegistry.registerItemStack(Items.ENCHANTED_BOOK, itemStack);
  78. }
  79. });
  80. }
  81. @Override
  82. public void registerPluginCategories(RecipeHelper recipeHelper) {
  83. recipeHelper.registerCategory(new DefaultCraftingCategory());
  84. recipeHelper.registerCategory(new DefaultSmeltingCategory());
  85. recipeHelper.registerCategory(new DefaultSmokingCategory());
  86. recipeHelper.registerCategory(new DefaultBlastingCategory());
  87. recipeHelper.registerCategory(new DefaultCampfireCategory());
  88. recipeHelper.registerCategory(new DefaultStoneCuttingCategory());
  89. recipeHelper.registerCategory(new DefaultBrewingCategory());
  90. }
  91. @Override
  92. public void registerRecipeDisplays(RecipeHelper recipeHelper) {
  93. for(Recipe recipe : recipeHelper.getAllSortedRecipes())
  94. if (recipe instanceof ShapelessRecipe)
  95. recipeHelper.registerDisplay(CRAFTING, new DefaultShapelessDisplay((ShapelessRecipe) recipe));
  96. else if (recipe instanceof ShapedRecipe)
  97. recipeHelper.registerDisplay(CRAFTING, new DefaultShapedDisplay((ShapedRecipe) recipe));
  98. else if (recipe instanceof SmeltingRecipe)
  99. recipeHelper.registerDisplay(SMELTING, new DefaultSmeltingDisplay((SmeltingRecipe) recipe));
  100. else if (recipe instanceof SmokingRecipe)
  101. recipeHelper.registerDisplay(SMOKING, new DefaultSmokingDisplay((SmokingRecipe) recipe));
  102. else if (recipe instanceof BlastingRecipe)
  103. recipeHelper.registerDisplay(BLASTING, new DefaultBlastingDisplay((BlastingRecipe) recipe));
  104. else if (recipe instanceof CampfireCookingRecipe)
  105. recipeHelper.registerDisplay(CAMPFIRE, new DefaultCampfireDisplay((CampfireCookingRecipe) recipe));
  106. else if (recipe instanceof StonecuttingRecipe)
  107. recipeHelper.registerDisplay(STONE_CUTTING, new DefaultStoneCuttingDisplay((StonecuttingRecipe) recipe));
  108. BREWING_DISPLAYS.stream().forEachOrdered(display -> recipeHelper.registerDisplay(BREWING, display));
  109. List<ItemStack> arrowStack = Collections.singletonList(Items.ARROW.getDefaultStack());
  110. RoughlyEnoughItemsCore.getItemRegisterer().getItemList().stream().filter(stack -> stack.getItem().equals(Items.LINGERING_POTION)).forEach(stack -> {
  111. List<List<ItemStack>> input = new ArrayList<>();
  112. for(int i = 0; i < 4; i++)
  113. input.add(arrowStack);
  114. input.add(Collections.singletonList(stack));
  115. for(int i = 0; i < 4; i++)
  116. input.add(arrowStack);
  117. ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8);
  118. PotionUtil.setPotion(outputStack, PotionUtil.getPotion(stack));
  119. PotionUtil.setCustomPotionEffects(outputStack, PotionUtil.getCustomPotionEffects(stack));
  120. List<ItemStack> output = Collections.singletonList(outputStack);
  121. recipeHelper.registerDisplay(CRAFTING, new DefaultCustomDisplay(input, output));
  122. });
  123. }
  124. @Override
  125. public void registerBounds(DisplayHelper displayHelper) {
  126. displayHelper.getBaseBoundsHandler().registerExclusionZones(AbstractContainerScreen.class, isOnRightSide -> {
  127. if (isOnRightSide || !MinecraftClient.getInstance().player.getRecipeBook().isGuiOpen() || !(MinecraftClient.getInstance().currentScreen instanceof RecipeBookProvider) || !(ScreenHelper.getLastContainerScreen().getContainer() instanceof CraftingContainer))
  128. return Collections.emptyList();
  129. ContainerScreenHooks screenHooks = ScreenHelper.getLastContainerScreenHooks();
  130. List l = Lists.newArrayList(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145, screenHooks.rei_getContainerTop(), 4 + 145 + 30, screenHooks.rei_getContainerHeight()));
  131. int size = ClientRecipeBook.getGroupsForContainer((CraftingContainer) ScreenHelper.getLastContainerScreen().getContainer()).size();
  132. if (size > 0)
  133. l.add(new Rectangle(screenHooks.rei_getContainerLeft() - 4 - 145 - 30, screenHooks.rei_getContainerTop(), 30, (size - 1) * 27));
  134. return l;
  135. });
  136. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<AbstractContainerScreen>() {
  137. @Override
  138. public Class getBaseSupportedClass() {
  139. return AbstractContainerScreen.class;
  140. }
  141. @Override
  142. public Rectangle getLeftBounds(AbstractContainerScreen screen) {
  143. return new Rectangle(2, 0, ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 4, MinecraftClient.getInstance().window.getScaledHeight());
  144. }
  145. @Override
  146. public Rectangle getRightBounds(AbstractContainerScreen screen) {
  147. int startX = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() + ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth() + 2;
  148. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  149. }
  150. @Override
  151. public float getPriority() {
  152. return -1.0f;
  153. }
  154. });
  155. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<RecipeViewingScreen>() {
  156. @Override
  157. public Class getBaseSupportedClass() {
  158. return RecipeViewingScreen.class;
  159. }
  160. @Override
  161. public Rectangle getLeftBounds(RecipeViewingScreen screen) {
  162. return new Rectangle(2, 0, ((RecipeViewingScreen) screen).getBounds().x - 4, MinecraftClient.getInstance().window.getScaledHeight());
  163. }
  164. @Override
  165. public Rectangle getRightBounds(RecipeViewingScreen screen) {
  166. int startX = ((RecipeViewingScreen) screen).getBounds().x + ((RecipeViewingScreen) screen).getBounds().width + 2;
  167. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  168. }
  169. @Override
  170. public float getPriority() {
  171. return -1.0f;
  172. }
  173. });
  174. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<VillagerRecipeViewingScreen>() {
  175. @Override
  176. public Class getBaseSupportedClass() {
  177. return VillagerRecipeViewingScreen.class;
  178. }
  179. @Override
  180. public Rectangle getLeftBounds(VillagerRecipeViewingScreen screen) {
  181. return new Rectangle(2, 0, ((VillagerRecipeViewingScreen) screen).bounds.x - 4, MinecraftClient.getInstance().window.getScaledHeight());
  182. }
  183. @Override
  184. public Rectangle getRightBounds(VillagerRecipeViewingScreen screen) {
  185. int startX = ((VillagerRecipeViewingScreen) screen).bounds.x + ((VillagerRecipeViewingScreen) screen).bounds.width + 2;
  186. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  187. }
  188. @Override
  189. public float getPriority() {
  190. return -1.0f;
  191. }
  192. });
  193. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<CreativeInventoryScreen>() {
  194. @Override
  195. public Class getBaseSupportedClass() {
  196. return CreativeInventoryScreen.class;
  197. }
  198. @Override
  199. public Rectangle getLeftBounds(CreativeInventoryScreen screen) {
  200. return new Rectangle(2, 0, ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 2, MinecraftClient.getInstance().window.getScaledHeight());
  201. }
  202. @Override
  203. public Rectangle getRightBounds(CreativeInventoryScreen screen) {
  204. int startX = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() + ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth();
  205. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  206. }
  207. @Override
  208. public Rectangle getItemListArea(Rectangle rectangle) {
  209. return new Rectangle(rectangle.x + 1, rectangle.y + 24, rectangle.width - 2, rectangle.height - (RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField ? 27 + 22 : 27));
  210. }
  211. @Override
  212. public float getPriority() {
  213. return -0.9f;
  214. }
  215. });
  216. }
  217. @Override
  218. public void registerOthers(RecipeHelper recipeHelper) {
  219. recipeHelper.registerRecipeVisibilityHandler(new DisplayVisibilityHandler() {
  220. @Override
  221. public DisplayVisibility handleDisplay(RecipeCategory category, RecipeDisplay display) {
  222. return DisplayVisibility.ALWAYS_VISIBLE;
  223. }
  224. @Override
  225. public float getPriority() {
  226. return -1f;
  227. }
  228. });
  229. recipeHelper.registerDefaultSpeedCraftButtonArea(DefaultPlugin.CRAFTING);
  230. recipeHelper.registerDefaultSpeedCraftButtonArea(DefaultPlugin.SMELTING);
  231. recipeHelper.registerDefaultSpeedCraftButtonArea(DefaultPlugin.SMOKING);
  232. recipeHelper.registerDefaultSpeedCraftButtonArea(DefaultPlugin.BLASTING);
  233. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.CRAFTING, new SpeedCraftFunctional<DefaultCraftingDisplay>() {
  234. @Override
  235. public Class[] getFunctioningFor() {
  236. return new Class[]{InventoryScreen.class, CraftingTableScreen.class};
  237. }
  238. @Override
  239. public boolean performAutoCraft(Screen screen, DefaultCraftingDisplay recipe) {
  240. if (!recipe.getRecipe().isPresent())
  241. return false;
  242. if (screen.getClass().isAssignableFrom(CraftingTableScreen.class))
  243. ((RecipeBookGuiHooks) (((CraftingTableScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  244. else if (screen.getClass().isAssignableFrom(InventoryScreen.class))
  245. ((RecipeBookGuiHooks) (((InventoryScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  246. else
  247. return false;
  248. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.hasShiftDown());
  249. return true;
  250. }
  251. @Override
  252. public boolean acceptRecipe(Screen screen, DefaultCraftingDisplay recipe) {
  253. return screen instanceof CraftingTableScreen || (screen instanceof InventoryScreen && recipe.getHeight() < 3 && recipe.getWidth() < 3);
  254. }
  255. });
  256. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.SMELTING, new SpeedCraftFunctional<DefaultSmeltingDisplay>() {
  257. @Override
  258. public Class[] getFunctioningFor() {
  259. return new Class[]{FurnaceScreen.class};
  260. }
  261. @Override
  262. public boolean performAutoCraft(Screen screen, DefaultSmeltingDisplay recipe) {
  263. if (!recipe.getRecipe().isPresent())
  264. return false;
  265. if (screen instanceof FurnaceScreen)
  266. ((RecipeBookGuiHooks) (((FurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  267. else
  268. return false;
  269. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.hasShiftDown());
  270. return true;
  271. }
  272. @Override
  273. public boolean acceptRecipe(Screen screen, DefaultSmeltingDisplay recipe) {
  274. return screen instanceof FurnaceScreen;
  275. }
  276. });
  277. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.SMOKING, new SpeedCraftFunctional<DefaultSmokingDisplay>() {
  278. @Override
  279. public Class[] getFunctioningFor() {
  280. return new Class[]{SmokerScreen.class};
  281. }
  282. @Override
  283. public boolean performAutoCraft(Screen screen, DefaultSmokingDisplay recipe) {
  284. if (!recipe.getRecipe().isPresent())
  285. return false;
  286. if (screen instanceof SmokerScreen)
  287. ((RecipeBookGuiHooks) (((SmokerScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  288. else
  289. return false;
  290. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.hasShiftDown());
  291. return true;
  292. }
  293. @Override
  294. public boolean acceptRecipe(Screen screen, DefaultSmokingDisplay recipe) {
  295. return screen instanceof SmokerScreen;
  296. }
  297. });
  298. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.BLASTING, new SpeedCraftFunctional<DefaultBlastingDisplay>() {
  299. @Override
  300. public Class[] getFunctioningFor() {
  301. return new Class[]{BlastFurnaceScreen.class};
  302. }
  303. @Override
  304. public boolean acceptRecipe(Screen screen, DefaultBlastingDisplay recipe) {
  305. return screen instanceof BlastFurnaceScreen;
  306. }
  307. @Override
  308. public boolean performAutoCraft(Screen screen, DefaultBlastingDisplay recipe) {
  309. if (!recipe.getRecipe().isPresent())
  310. return false;
  311. if (screen instanceof BlastFurnaceScreen)
  312. ((RecipeBookGuiHooks) (((BlastFurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  313. else
  314. return false;
  315. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.hasShiftDown());
  316. return true;
  317. }
  318. });
  319. }
  320. @Override
  321. public int getPriority() {
  322. return -1;
  323. }
  324. }