DefaultPlugin.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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 com.google.common.collect.Maps;
  8. import me.shedaniel.rei.RoughlyEnoughItemsCore;
  9. import me.shedaniel.rei.api.*;
  10. import me.shedaniel.rei.client.ScreenHelper;
  11. import me.shedaniel.rei.gui.RecipeViewingScreen;
  12. import me.shedaniel.rei.gui.VillagerRecipeViewingScreen;
  13. import me.shedaniel.rei.plugin.blasting.DefaultBlastingCategory;
  14. import me.shedaniel.rei.plugin.blasting.DefaultBlastingDisplay;
  15. import me.shedaniel.rei.plugin.brewing.DefaultBrewingCategory;
  16. import me.shedaniel.rei.plugin.brewing.DefaultBrewingDisplay;
  17. import me.shedaniel.rei.plugin.campfire.DefaultCampfireCategory;
  18. import me.shedaniel.rei.plugin.campfire.DefaultCampfireDisplay;
  19. import me.shedaniel.rei.plugin.composting.DefaultCompostingCategory;
  20. import me.shedaniel.rei.plugin.composting.DefaultCompostingDisplay;
  21. import me.shedaniel.rei.plugin.crafting.DefaultCraftingCategory;
  22. import me.shedaniel.rei.plugin.crafting.DefaultCustomDisplay;
  23. import me.shedaniel.rei.plugin.crafting.DefaultShapedDisplay;
  24. import me.shedaniel.rei.plugin.crafting.DefaultShapelessDisplay;
  25. import me.shedaniel.rei.plugin.smelting.DefaultSmeltingCategory;
  26. import me.shedaniel.rei.plugin.smelting.DefaultSmeltingDisplay;
  27. import me.shedaniel.rei.plugin.smoking.DefaultSmokingCategory;
  28. import me.shedaniel.rei.plugin.smoking.DefaultSmokingDisplay;
  29. import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingCategory;
  30. import me.shedaniel.rei.plugin.stonecutting.DefaultStoneCuttingDisplay;
  31. import net.minecraft.block.ComposterBlock;
  32. import net.minecraft.client.MinecraftClient;
  33. import net.minecraft.client.gui.screen.ingame.*;
  34. import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
  35. import net.minecraft.enchantment.Enchantment;
  36. import net.minecraft.enchantment.EnchantmentHelper;
  37. import net.minecraft.item.ItemConvertible;
  38. import net.minecraft.item.ItemStack;
  39. import net.minecraft.item.Items;
  40. import net.minecraft.potion.PotionUtil;
  41. import net.minecraft.recipe.*;
  42. import net.minecraft.util.Identifier;
  43. import net.minecraft.util.math.MathHelper;
  44. import net.minecraft.util.registry.Registry;
  45. import java.awt.*;
  46. import java.util.List;
  47. import java.util.*;
  48. public class DefaultPlugin implements REIPluginEntry {
  49. public static final Identifier CRAFTING = new Identifier("minecraft", "plugins/crafting");
  50. public static final Identifier SMELTING = new Identifier("minecraft", "plugins/smelting");
  51. public static final Identifier SMOKING = new Identifier("minecraft", "plugins/smoking");
  52. public static final Identifier BLASTING = new Identifier("minecraft", "plugins/blasting");
  53. public static final Identifier CAMPFIRE = new Identifier("minecraft", "plugins/campfire");
  54. public static final Identifier STONE_CUTTING = new Identifier("minecraft", "plugins/stone_cutting");
  55. public static final Identifier BREWING = new Identifier("minecraft", "plugins/brewing");
  56. public static final Identifier PLUGIN = new Identifier("roughlyenoughitems", "default_plugin");
  57. public static final Identifier COMPOSTING = new Identifier("minecraft", "plugins/composting");
  58. private static final Identifier DISPLAY_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/display.png");
  59. private static final Identifier DISPLAY_TEXTURE_DARK = new Identifier("roughlyenoughitems", "textures/gui/display_dark.png");
  60. private static final List<DefaultBrewingDisplay> BREWING_DISPLAYS = Lists.newArrayList();
  61. public static Identifier getDisplayTexture() {
  62. return ScreenHelper.isDarkModeEnabled() ? DISPLAY_TEXTURE_DARK : DISPLAY_TEXTURE;
  63. }
  64. public static void registerBrewingDisplay(DefaultBrewingDisplay display) {
  65. BREWING_DISPLAYS.add(display);
  66. }
  67. @Override
  68. public Identifier getPluginIdentifier() {
  69. return PLUGIN;
  70. }
  71. @Override
  72. public void onFirstLoad(PluginDisabler pluginDisabler) {
  73. if (!RoughlyEnoughItemsCore.getConfigManager().getConfig().loadDefaultPlugin) {
  74. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_ITEMS);
  75. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_CATEGORIES);
  76. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_RECIPE_DISPLAYS);
  77. pluginDisabler.disablePluginFunction(PLUGIN, PluginFunction.REGISTER_OTHERS);
  78. }
  79. }
  80. @Override
  81. public void registerItems(ItemRegistry itemRegistry) {
  82. Registry.ITEM.stream().forEach(item -> {
  83. itemRegistry.registerItemStack(item.getStackForRender());
  84. try {
  85. itemRegistry.registerItemStack(itemRegistry.getAllStacksFromItem(item));
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. }
  89. });
  90. Registry.ENCHANTMENT.forEach(enchantment -> {
  91. for(int i = enchantment.getMinimumLevel(); i <= enchantment.getMaximumLevel(); i++) {
  92. Map<Enchantment, Integer> map = new HashMap<>();
  93. map.put(enchantment, i);
  94. ItemStack itemStack = new ItemStack(Items.ENCHANTED_BOOK);
  95. EnchantmentHelper.set(map, itemStack);
  96. itemRegistry.registerItemStack(Items.ENCHANTED_BOOK, itemStack);
  97. }
  98. });
  99. }
  100. @Override
  101. public void registerPluginCategories(RecipeHelper recipeHelper) {
  102. recipeHelper.registerCategory(new DefaultCraftingCategory());
  103. recipeHelper.registerCategory(new DefaultSmeltingCategory());
  104. recipeHelper.registerCategory(new DefaultSmokingCategory());
  105. recipeHelper.registerCategory(new DefaultBlastingCategory());
  106. recipeHelper.registerCategory(new DefaultCampfireCategory());
  107. recipeHelper.registerCategory(new DefaultStoneCuttingCategory());
  108. recipeHelper.registerCategory(new DefaultBrewingCategory());
  109. recipeHelper.registerCategory(new DefaultCompostingCategory());
  110. }
  111. @Override
  112. public void registerRecipeDisplays(RecipeHelper recipeHelper) {
  113. recipeHelper.registerRecipes(CRAFTING, ShapelessRecipe.class, DefaultShapelessDisplay::new);
  114. recipeHelper.registerRecipes(CRAFTING, ShapedRecipe.class, DefaultShapedDisplay::new);
  115. recipeHelper.registerRecipes(SMELTING, SmeltingRecipe.class, DefaultSmeltingDisplay::new);
  116. recipeHelper.registerRecipes(SMOKING, SmokingRecipe.class, DefaultSmokingDisplay::new);
  117. recipeHelper.registerRecipes(BLASTING, BlastingRecipe.class, DefaultBlastingDisplay::new);
  118. recipeHelper.registerRecipes(CAMPFIRE, CampfireCookingRecipe.class, DefaultCampfireDisplay::new);
  119. recipeHelper.registerRecipes(STONE_CUTTING, StonecuttingRecipe.class, DefaultStoneCuttingDisplay::new);
  120. BREWING_DISPLAYS.stream().forEachOrdered(display -> recipeHelper.registerDisplay(BREWING, display));
  121. List<ItemStack> arrowStack = Collections.singletonList(Items.ARROW.getStackForRender());
  122. RoughlyEnoughItemsCore.getItemRegisterer().getItemList().stream().filter(stack -> stack.getItem().equals(Items.LINGERING_POTION)).forEach(stack -> {
  123. List<List<ItemStack>> input = new ArrayList<>();
  124. for(int i = 0; i < 4; i++)
  125. input.add(arrowStack);
  126. input.add(Collections.singletonList(stack));
  127. for(int i = 0; i < 4; i++)
  128. input.add(arrowStack);
  129. ItemStack outputStack = new ItemStack(Items.TIPPED_ARROW, 8);
  130. PotionUtil.setPotion(outputStack, PotionUtil.getPotion(stack));
  131. PotionUtil.setCustomPotionEffects(outputStack, PotionUtil.getCustomPotionEffects(stack));
  132. List<ItemStack> output = Collections.singletonList(outputStack);
  133. recipeHelper.registerDisplay(CRAFTING, new DefaultCustomDisplay(input, output));
  134. });
  135. Map<ItemConvertible, Float> map = Maps.newLinkedHashMap();
  136. if (ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.isEmpty())
  137. ComposterBlock.registerDefaultCompostableItems();
  138. ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.keySet().forEach(itemConvertible -> {
  139. float chance = ComposterBlock.ITEM_TO_LEVEL_INCREASE_CHANCE.getOrDefault(itemConvertible, 0);
  140. if (chance > 0)
  141. map.put(itemConvertible, chance);
  142. });
  143. List<ItemConvertible> stacks = new LinkedList<>(map.keySet());
  144. stacks.sort((first, second) -> {
  145. return (int) ((map.get(first) - map.get(second)) * 100);
  146. });
  147. for(int i = 0; i < stacks.size(); i += MathHelper.clamp(48, 1, stacks.size() - i)) {
  148. List<ItemConvertible> thisStacks = Lists.newArrayList();
  149. for(int j = i; j < i + 48; j++)
  150. if (j < stacks.size())
  151. thisStacks.add(stacks.get(j));
  152. recipeHelper.registerDisplay(COMPOSTING, new DefaultCompostingDisplay(MathHelper.floor(i / 48f), thisStacks, map, Lists.newArrayList(map.keySet()), new ItemStack[]{new ItemStack(Items.BONE_MEAL)}));
  153. }
  154. }
  155. @Override
  156. public void registerBounds(DisplayHelper displayHelper) {
  157. displayHelper.getBaseBoundsHandler().registerExclusionZones(AbstractInventoryScreen.class, new DefaultPotionEffectExclusionZones());
  158. displayHelper.getBaseBoundsHandler().registerExclusionZones(RecipeBookProvider.class, new DefaultRecipeBookExclusionZones());
  159. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<AbstractContainerScreen<?>>() {
  160. @Override
  161. public Class<?> getBaseSupportedClass() {
  162. return AbstractContainerScreen.class;
  163. }
  164. @Override
  165. public Rectangle getLeftBounds(AbstractContainerScreen<?> screen) {
  166. return new Rectangle(2, 0, ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 4, MinecraftClient.getInstance().window.getScaledHeight());
  167. }
  168. @Override
  169. public Rectangle getRightBounds(AbstractContainerScreen<?> screen) {
  170. int startX = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() + ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth() + 2;
  171. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  172. }
  173. @Override
  174. public float getPriority() {
  175. return -1.0f;
  176. }
  177. });
  178. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<RecipeViewingScreen>() {
  179. @Override
  180. public Class<?> getBaseSupportedClass() {
  181. return RecipeViewingScreen.class;
  182. }
  183. @Override
  184. public Rectangle getLeftBounds(RecipeViewingScreen screen) {
  185. return new Rectangle(2, 0, ((RecipeViewingScreen) screen).getBounds().x - 4, MinecraftClient.getInstance().window.getScaledHeight());
  186. }
  187. @Override
  188. public Rectangle getRightBounds(RecipeViewingScreen screen) {
  189. int startX = ((RecipeViewingScreen) screen).getBounds().x + ((RecipeViewingScreen) screen).getBounds().width + 2;
  190. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  191. }
  192. @Override
  193. public float getPriority() {
  194. return -1.0f;
  195. }
  196. });
  197. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<VillagerRecipeViewingScreen>() {
  198. @Override
  199. public Class<?> getBaseSupportedClass() {
  200. return VillagerRecipeViewingScreen.class;
  201. }
  202. @Override
  203. public Rectangle getLeftBounds(VillagerRecipeViewingScreen screen) {
  204. return new Rectangle(2, 0, ((VillagerRecipeViewingScreen) screen).bounds.x - 4, MinecraftClient.getInstance().window.getScaledHeight());
  205. }
  206. @Override
  207. public Rectangle getRightBounds(VillagerRecipeViewingScreen screen) {
  208. int startX = ((VillagerRecipeViewingScreen) screen).bounds.x + ((VillagerRecipeViewingScreen) screen).bounds.width + 2;
  209. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  210. }
  211. @Override
  212. public float getPriority() {
  213. return -1.0f;
  214. }
  215. });
  216. displayHelper.registerBoundsHandler(new DisplayHelper.DisplayBoundsHandler<CreativeInventoryScreen>() {
  217. @Override
  218. public Class<?> getBaseSupportedClass() {
  219. return CreativeInventoryScreen.class;
  220. }
  221. @Override
  222. public Rectangle getLeftBounds(CreativeInventoryScreen screen) {
  223. return new Rectangle(2, 0, ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() - 2, MinecraftClient.getInstance().window.getScaledHeight());
  224. }
  225. @Override
  226. public Rectangle getRightBounds(CreativeInventoryScreen screen) {
  227. int startX = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft() + ScreenHelper.getLastContainerScreenHooks().rei_getContainerWidth();
  228. return new Rectangle(startX, 0, MinecraftClient.getInstance().window.getScaledWidth() - startX - 2, MinecraftClient.getInstance().window.getScaledHeight());
  229. }
  230. @Override
  231. public Rectangle getItemListArea(Rectangle rectangle) {
  232. return new Rectangle(rectangle.x + 1, rectangle.y + 24, rectangle.width - 2, rectangle.height - (RoughlyEnoughItemsCore.getConfigManager().getConfig().sideSearchField ? 27 + 22 : 27));
  233. }
  234. @Override
  235. public float getPriority() {
  236. return -0.9f;
  237. }
  238. });
  239. }
  240. @Override
  241. public void registerOthers(RecipeHelper recipeHelper) {
  242. recipeHelper.registerWorkingStations(CRAFTING, new ItemStack(Items.CRAFTING_TABLE));
  243. recipeHelper.registerWorkingStations(SMELTING, new ItemStack(Items.FURNACE));
  244. recipeHelper.registerWorkingStations(SMOKING, new ItemStack(Items.SMOKER));
  245. recipeHelper.registerWorkingStations(BLASTING, new ItemStack(Items.BLAST_FURNACE));
  246. recipeHelper.registerWorkingStations(CAMPFIRE, new ItemStack(Items.CAMPFIRE));
  247. recipeHelper.registerWorkingStations(BREWING, new ItemStack(Items.BREWING_STAND));
  248. recipeHelper.registerWorkingStations(STONE_CUTTING, new ItemStack(Items.STONECUTTER));
  249. recipeHelper.registerWorkingStations(COMPOSTING, new ItemStack(Items.COMPOSTER));
  250. recipeHelper.registerSpeedCraftButtonArea(COMPOSTING, bounds -> null);
  251. recipeHelper.registerSpeedCraftButtonArea(DefaultPlugin.CAMPFIRE, bounds -> new Rectangle((int) bounds.getMaxX() - 16, bounds.y + 6, 10, 10));
  252. recipeHelper.registerScreenClickArea(new Rectangle(88, 32, 28, 23), CraftingTableScreen.class, CRAFTING);
  253. recipeHelper.registerScreenClickArea(new Rectangle(137, 29, 10, 13), InventoryScreen.class, CRAFTING);
  254. recipeHelper.registerScreenClickArea(new Rectangle(97, 16, 14, 30), BrewingStandScreen.class, BREWING);
  255. recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING);
  256. recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING);
  257. recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING);
  258. }
  259. @Override
  260. public int getPriority() {
  261. return -1;
  262. }
  263. }