DefaultPlugin.java 18 KB

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