DefaultPlugin.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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.mixin.GhostSlotsHook;
  6. import net.minecraft.client.MinecraftClient;
  7. import net.minecraft.client.gui.Screen;
  8. import net.minecraft.client.gui.container.BlastFurnaceScreen;
  9. import net.minecraft.client.gui.container.CraftingTableScreen;
  10. import net.minecraft.client.gui.container.FurnaceScreen;
  11. import net.minecraft.client.gui.container.SmokerScreen;
  12. import net.minecraft.client.gui.ingame.PlayerInventoryScreen;
  13. import net.minecraft.enchantment.Enchantment;
  14. import net.minecraft.enchantment.EnchantmentHelper;
  15. import net.minecraft.item.ItemStack;
  16. import net.minecraft.item.Items;
  17. import net.minecraft.potion.PotionUtil;
  18. import net.minecraft.recipe.Recipe;
  19. import net.minecraft.recipe.StonecuttingRecipe;
  20. import net.minecraft.recipe.cooking.BlastingRecipe;
  21. import net.minecraft.recipe.cooking.CampfireCookingRecipe;
  22. import net.minecraft.recipe.cooking.SmeltingRecipe;
  23. import net.minecraft.recipe.cooking.SmokingRecipe;
  24. import net.minecraft.recipe.crafting.ShapedRecipe;
  25. import net.minecraft.recipe.crafting.ShapelessRecipe;
  26. import net.minecraft.util.Identifier;
  27. import net.minecraft.util.registry.Registry;
  28. import java.util.*;
  29. public class DefaultPlugin implements REIPlugin {
  30. public static final Identifier CRAFTING = new Identifier("roughlyenoughitems", "plugins/crafting");
  31. public static final Identifier SMELTING = new Identifier("roughlyenoughitems", "plugins/smelting");
  32. public static final Identifier SMOKING = new Identifier("roughlyenoughitems", "plugins/smoking");
  33. public static final Identifier BLASTING = new Identifier("roughlyenoughitems", "plugins/blasting");
  34. public static final Identifier CAMPFIRE = new Identifier("roughlyenoughitems", "plugins/campfire");
  35. public static final Identifier STONE_CUTTING = new Identifier("roughlyenoughitems", "plugins/stone_cutting");
  36. public static final Identifier BREWING = new Identifier("roughlyenoughitems", "plugins/brewing");
  37. public static final Identifier PLUGIN = new Identifier("roughlyenoughitems", "default_plugin");
  38. private 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 onFirstLoad(PluginDisabler pluginDisabler) {
  44. if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
  45. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_ITEMS);
  46. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_CATEGORIES);
  47. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_RECIPE_DISPLAYS);
  48. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_SPEED_CRAFT);
  49. }
  50. }
  51. @Override
  52. public void registerItems(ItemRegistry itemRegistry) {
  53. Registry.ITEM.stream().forEach(item -> {
  54. itemRegistry.registerItemStack(item.getDefaultStack());
  55. try {
  56. itemRegistry.registerItemStack(itemRegistry.getAllStacksFromItem(item));
  57. } catch (Exception e) {
  58. }
  59. });
  60. Registry.ENCHANTMENT.forEach(enchantment -> {
  61. for(int i = enchantment.getMinimumLevel(); i < enchantment.getMaximumLevel(); i++) {
  62. Map<Enchantment, Integer> map = new HashMap<>();
  63. map.put(enchantment, i);
  64. ItemStack itemStack = new ItemStack(Items.ENCHANTED_BOOK);
  65. EnchantmentHelper.set(map, itemStack);
  66. itemRegistry.registerItemStack(Items.ENCHANTED_BOOK, itemStack);
  67. }
  68. });
  69. }
  70. @Override
  71. public void registerPluginCategories(RecipeHelper recipeHelper) {
  72. recipeHelper.registerCategory(new DefaultCraftingCategory());
  73. recipeHelper.registerCategory(new DefaultSmeltingCategory());
  74. recipeHelper.registerCategory(new DefaultSmokingCategory());
  75. recipeHelper.registerCategory(new DefaultBlastingCategory());
  76. recipeHelper.registerCategory(new DefaultCampfireCategory());
  77. recipeHelper.registerCategory(new DefaultStoneCuttingCategory());
  78. recipeHelper.registerCategory(new DefaultBrewingCategory());
  79. }
  80. @Override
  81. public void registerRecipeDisplays(RecipeHelper recipeHelper) {
  82. for(Recipe recipe : recipeHelper.getRecipeManager().values())
  83. if (recipe instanceof ShapelessRecipe)
  84. recipeHelper.registerDisplay(CRAFTING, new DefaultShapelessDisplay((ShapelessRecipe) recipe));
  85. else if (recipe instanceof ShapedRecipe)
  86. recipeHelper.registerDisplay(CRAFTING, new DefaultShapedDisplay((ShapedRecipe) recipe));
  87. else if (recipe instanceof SmeltingRecipe)
  88. recipeHelper.registerDisplay(SMELTING, new DefaultSmeltingDisplay((SmeltingRecipe) recipe));
  89. else if (recipe instanceof SmokingRecipe)
  90. recipeHelper.registerDisplay(SMOKING, new DefaultSmokingDisplay((SmokingRecipe) recipe));
  91. else if (recipe instanceof BlastingRecipe)
  92. recipeHelper.registerDisplay(BLASTING, new DefaultBlastingDisplay((BlastingRecipe) recipe));
  93. else if (recipe instanceof CampfireCookingRecipe)
  94. recipeHelper.registerDisplay(CAMPFIRE, new DefaultCampfireDisplay((CampfireCookingRecipe) recipe));
  95. else if (recipe instanceof StonecuttingRecipe)
  96. recipeHelper.registerDisplay(STONE_CUTTING, new DefaultStoneCuttingDisplay((StonecuttingRecipe) recipe));
  97. BREWING_DISPLAYS.stream().forEachOrdered(display -> recipeHelper.registerDisplay(BREWING, display));
  98. List<ItemStack> arrowStack = Arrays.asList(Items.ARROW.getDefaultStack());
  99. RoughlyEnoughItemsCore.getItemRegisterer().getItemList().stream().filter(stack -> stack.getItem().equals(Items.LINGERING_POTION)).forEach(stack -> {
  100. List<List<ItemStack>> input = new ArrayList<>();
  101. for(int i = 0; i < 4; i++)
  102. input.add(arrowStack);
  103. input.add(Arrays.asList(stack));
  104. for(int i = 0; i < 4; i++)
  105. input.add(arrowStack);
  106. ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8);
  107. PotionUtil.setPotion(outputStack, PotionUtil.getPotion(stack));
  108. PotionUtil.setCustomPotionEffects(outputStack, PotionUtil.getCustomPotionEffects(stack));
  109. List<ItemStack> output = Lists.newArrayList(outputStack);
  110. recipeHelper.registerDisplay(CRAFTING, new DefaultCustomDisplay(input, output));
  111. });
  112. }
  113. @Override
  114. public void registerSpeedCraft(RecipeHelper recipeHelper) {
  115. recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.CAMPFIRE, null);
  116. recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.STONE_CUTTING, null);
  117. recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.BREWING, null);
  118. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.CRAFTING, new SpeedCraftFunctional<DefaultCraftingDisplay>() {
  119. @Override
  120. public Class[] getFunctioningFor() {
  121. return new Class[]{PlayerInventoryScreen.class, CraftingTableScreen.class};
  122. }
  123. @Override
  124. public boolean performAutoCraft(Screen screen, DefaultCraftingDisplay recipe) {
  125. if (!recipe.getRecipe().isPresent())
  126. return false;
  127. if (screen.getClass().isAssignableFrom(CraftingTableScreen.class))
  128. ((GhostSlotsHook) (((CraftingTableScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  129. else if (screen.getClass().isAssignableFrom(PlayerInventoryScreen.class))
  130. ((GhostSlotsHook) (((PlayerInventoryScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  131. else
  132. return false;
  133. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());
  134. return true;
  135. }
  136. @Override
  137. public boolean acceptRecipe(Screen screen, DefaultCraftingDisplay recipe) {
  138. return screen instanceof CraftingTableScreen || (screen instanceof PlayerInventoryScreen && recipe.getHeight() < 3 && recipe.getWidth() < 3);
  139. }
  140. });
  141. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.SMELTING, new SpeedCraftFunctional<DefaultSmeltingDisplay>() {
  142. @Override
  143. public Class[] getFunctioningFor() {
  144. return new Class[]{FurnaceScreen.class};
  145. }
  146. @Override
  147. public boolean performAutoCraft(Screen screen, DefaultSmeltingDisplay recipe) {
  148. if (!recipe.getRecipe().isPresent())
  149. return false;
  150. if (screen instanceof FurnaceScreen)
  151. ((GhostSlotsHook) (((FurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  152. else
  153. return false;
  154. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());
  155. return true;
  156. }
  157. @Override
  158. public boolean acceptRecipe(Screen screen, DefaultSmeltingDisplay recipe) {
  159. return screen instanceof FurnaceScreen;
  160. }
  161. });
  162. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.SMOKING, new SpeedCraftFunctional<DefaultSmokingDisplay>() {
  163. @Override
  164. public Class[] getFunctioningFor() {
  165. return new Class[]{SmokerScreen.class};
  166. }
  167. @Override
  168. public boolean performAutoCraft(Screen screen, DefaultSmokingDisplay recipe) {
  169. if (!recipe.getRecipe().isPresent())
  170. return false;
  171. if (screen instanceof SmokerScreen)
  172. ((GhostSlotsHook) (((SmokerScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  173. else
  174. return false;
  175. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());
  176. return true;
  177. }
  178. @Override
  179. public boolean acceptRecipe(Screen screen, DefaultSmokingDisplay recipe) {
  180. return screen instanceof SmokerScreen;
  181. }
  182. });
  183. recipeHelper.registerSpeedCraftFunctional(DefaultPlugin.BLASTING, new SpeedCraftFunctional<DefaultBlastingDisplay>() {
  184. @Override
  185. public Class[] getFunctioningFor() {
  186. return new Class[]{BlastFurnaceScreen.class};
  187. }
  188. @Override
  189. public boolean acceptRecipe(Screen screen, DefaultBlastingDisplay recipe) {
  190. return screen instanceof BlastFurnaceScreen;
  191. }
  192. @Override
  193. public boolean performAutoCraft(Screen screen, DefaultBlastingDisplay recipe) {
  194. if (!recipe.getRecipe().isPresent())
  195. return false;
  196. if (screen instanceof BlastFurnaceScreen)
  197. ((GhostSlotsHook) (((BlastFurnaceScreen) screen).getRecipeBookGui())).rei_getGhostSlots().reset();
  198. else
  199. return false;
  200. MinecraftClient.getInstance().interactionManager.clickRecipe(MinecraftClient.getInstance().player.container.syncId, (Recipe) recipe.getRecipe().get(), Screen.isShiftPressed());
  201. return true;
  202. }
  203. });
  204. }
  205. @Override
  206. public int getPriority() {
  207. return -1;
  208. }
  209. }