DefaultPlugin.java 18 KB

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