From a56baa875630ffac06e421a7389854b5301ed7f0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 21 Feb 2021 22:33:45 +0800 Subject: More Signed-off-by: shedaniel --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 39 +- .../rei/RoughlyEnoughItemsInitializer.java | 123 ++++ .../shedaniel/rei/RoughlyEnoughItemsNetwork.java | 149 +++-- .../me/shedaniel/rei/RoughlyEnoughItemsState.java | 24 - .../rei/api/gui/config/entry/FilteringScreen.java | 2 +- .../api/gui/config/entry/ReloadPluginsEntry.java | 4 +- .../me/shedaniel/rei/compat/LBASupportPlugin.java | 8 +- .../shedaniel/rei/gui/ConfigReloadingScreen.java | 4 +- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 26 +- .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 12 +- .../rei/gui/VillagerRecipeViewingScreen.java | 6 +- .../shedaniel/rei/gui/WarningAndErrorScreen.java | 6 +- .../java/me/shedaniel/rei/gui/modules/Menu.java | 2 +- .../entries/EntryStackSubsetsMenuEntry.java | 1 + .../gui/modules/entries/SubSubsetsMenuEntry.java | 1 + .../rei/gui/plugin/DefaultRuntimePlugin.java | 25 +- .../shedaniel/rei/gui/widget/EntryListWidget.java | 13 +- .../rei/gui/widget/FavoritesListWidget.java | 4 +- .../me/shedaniel/rei/gui/widget/TabWidget.java | 9 +- .../me/shedaniel/rei/impl/AbstractEntryStack.java | 2 +- .../me/shedaniel/rei/impl/ClientHelperImpl.java | 2 +- .../me/shedaniel/rei/impl/ConfigManagerImpl.java | 2 +- .../rei/impl/DisplayBoundsRegistryImpl.java | 120 ---- .../rei/impl/DynamicErrorFreeEntryListWidget.java | 588 +++++++++++++++++++ .../me/shedaniel/rei/impl/EntryRegistryImpl.java | 31 +- .../java/me/shedaniel/rei/impl/ErrorDisplayer.java | 58 ++ .../me/shedaniel/rei/impl/ExclusionZonesImpl.java | 6 +- .../me/shedaniel/rei/impl/InternalWidgets.java | 18 +- .../java/me/shedaniel/rei/impl/PluginManager.java | 627 ++++++++++++++++++++ .../me/shedaniel/rei/impl/RecipeRegistryImpl.java | 634 --------------------- .../java/me/shedaniel/rei/impl/ScreenHelper.java | 33 +- .../me/shedaniel/rei/impl/ScreenRegistryImpl.java | 123 ++++ .../rei/impl/registry/CategoryRegistryImpl.java | 68 ++- .../rei/impl/registry/DisplayRegistryImpl.java | 54 ++ .../impl/registry/RecipeManagerContextImpl.java | 35 ++ .../rei/impl/widgets/TexturedDrawableConsumer.java | 2 +- .../autocrafting/DefaultCategoryHandler.java | 4 +- .../shedaniel/rei/tests/plugin/REITestPlugin.java | 6 +- 38 files changed, 1860 insertions(+), 1011 deletions(-) create mode 100644 runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/DisplayBoundsRegistryImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/DynamicErrorFreeEntryListWidget.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/ErrorDisplayer.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/PluginManager.java delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/RecipeRegistryImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/ScreenRegistryImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/registry/DisplayRegistryImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/registry/RecipeManagerContextImpl.java (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index c5baedb59..fcc8492f3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -28,7 +28,6 @@ import com.google.common.collect.Lists; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import me.shedaniel.cloth.api.client.events.v0.ClothClientHooks; -import me.shedaniel.clothconfig2.api.LazyResettable; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.api.Executor; @@ -40,7 +39,10 @@ import me.shedaniel.rei.api.favorites.FavoriteEntryType; import me.shedaniel.rei.api.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.fluid.FluidSupportProvider; import me.shedaniel.rei.api.ingredient.util.EntryStacks; -import me.shedaniel.rei.api.plugins.REIPluginV0; +import me.shedaniel.rei.api.plugins.REIPlugin; +import me.shedaniel.rei.api.registry.EntryRegistry; +import me.shedaniel.rei.api.registry.screens.OverlayDecider; +import me.shedaniel.rei.api.registry.screens.ScreenRegistry; import me.shedaniel.rei.api.subsets.SubsetsRegistry; import me.shedaniel.rei.api.gui.DrawableConsumer; import me.shedaniel.rei.api.gui.Renderer; @@ -124,9 +126,9 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } return typeCache.computeIfAbsent(id, EntryTypeDeferred::new); }, "entryTypeDeferred"); - attachInstance(new RecipeRegistryImpl(), RecipeRegistry.class); + attachInstance(new PluginManager(), DisplayRegistry.class); attachInstance(new EntryRegistryImpl(), EntryRegistry.class); - attachInstance(new DisplayBoundsRegistryImpl(), DisplayBoundsRegistry.class); + attachInstance(new ScreenRegistryImpl(), ScreenRegistry.class); attachInstance(new FluidSupportProviderImpl(), FluidSupportProvider.class); attachInstance(new SubsetsRegistryImpl(), SubsetsRegistry.class); attachInstance(new Internals.EntryStackProvider() { @@ -225,15 +227,14 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { }, Internals.WidgetsProvider.class); attachInstance((Supplier) FavoriteEntryTypeRegistryImpl::getInstance, "favoriteEntryTypeRegistry"); attachInstance((BiFunction, Supplier, FavoriteEntry>) (supplier, toJson) -> new FavoriteEntry() { - LazyResettable value = new LazyResettable<>(supplier); - + FavoriteEntry value = null; + @Override public FavoriteEntry getUnwrapped() { - FavoriteEntry entry = value.get(); - if (entry == null) { - value.reset(); + if (this.value == null) { + this.value = supplier.get(); } - return Objects.requireNonNull(entry).getUnwrapped(); + return Objects.requireNonNull(value).getUnwrapped(); } @Override @@ -382,9 +383,9 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } RecipeManager recipeManager = Minecraft.getInstance().getConnection().getRecipeManager(); if (ConfigObject.getInstance().doesRegisterRecipesInAnotherThread()) { - CompletableFuture.runAsync(() -> ((RecipeRegistryImpl) RecipeRegistry.getInstance()).tryRecipesLoaded(recipeManager), SYNC_RECIPES); + CompletableFuture.runAsync(() -> ((PluginManager) DisplayRegistry.getInstance()).tryRecipesLoaded(recipeManager), SYNC_RECIPES); } else { - ((RecipeRegistryImpl) RecipeRegistry.getInstance()).tryRecipesLoaded(recipeManager); + ((PluginManager) DisplayRegistry.getInstance()).tryRecipesLoaded(recipeManager); } } @@ -452,20 +453,18 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } private void discoverPluginEntries() { - for (REIPlugin reiPlugin : Iterables.concat( + for (REIPlugin plugin : Iterables.concat( FabricLoader.getInstance().getEntrypoints("rei_plugins", REIPlugin.class), FabricLoader.getInstance().getEntrypoints("rei", REIPlugin.class) )) { try { - if (!REIPluginV0.class.isAssignableFrom(reiPlugin.getClass())) - throw new IllegalArgumentException("REI plugin is too old!"); - registerPlugin(reiPlugin); + registerPlugin(plugin); } catch (Exception e) { e.printStackTrace(); - RoughlyEnoughItemsCore.LOGGER.error("Can't load REI plugins from %s: %s", reiPlugin.getClass(), e.getLocalizedMessage()); + RoughlyEnoughItemsCore.LOGGER.error("Can't load REI plugins from %s: %s", plugin.getClass(), e.getLocalizedMessage()); } } - for (REIPluginV0 reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins_v0", REIPluginV0.class)) { + for (REIPlugin reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins_v0", REIPlugin.class)) { try { registerPlugin(reiPlugin); } catch (Exception e) { @@ -484,7 +483,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } if (FabricLoader.getInstance().isModLoaded("libblockattributes-fluids")) { try { - registerPlugin((REIPlugin) Class.forName("me.shedaniel.rei.compat.LBASupportPlugin").getConstructor().newInstance()); + registerPlugin((REIPluginEntry) Class.forName("me.shedaniel.rei.compat.LBASupportPlugin").getConstructor().newInstance()); } catch (Throwable throwable) { throwable.printStackTrace(); } @@ -499,7 +498,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { private boolean shouldReturn(Class screen) { try { - for (OverlayDecider decider : DisplayBoundsRegistry.getInstance().getAllOverlayDeciders()) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getAllOverlayDeciders()) { if (!decider.isHandingScreen(screen)) continue; InteractionResult result = decider.shouldScreenBeOverlaid(screen); diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java new file mode 100644 index 000000000..84c9c3c29 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java @@ -0,0 +1,123 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei; + +import com.google.common.collect.ImmutableSet; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.SemanticVersion; +import net.fabricmc.loader.api.VersionParsingException; + +import java.lang.reflect.InvocationTargetException; + +public class RoughlyEnoughItemsInitializer implements ModInitializer, ClientModInitializer { + @Override + public void onInitialize() { + checkRequiredFabricModules(); + if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { + checkClothConfig(); + checkModMenu(); + } + + if (RoughlyEnoughItemsState.getErrors().isEmpty()) { + initializeEntryPoint("me.shedaniel.rei.RoughlyEnoughItemsNetwork"); + } + } + + @Override + public void onInitializeClient() { + if (RoughlyEnoughItemsState.getErrors().isEmpty()) { + initializeEntryPoint("me.shedaniel.rei.RoughlyEnoughItemsCore"); + initializeEntryPoint("me.shedaniel.rei.impl.ClientHelperImpl"); + initializeEntryPoint("me.shedaniel.rei.impl.ScreenHelper"); + } + + initializeEntryPoint("me.shedaniel.rei.impl.ErrorDisplayer"); + } + + public void initializeEntryPoint(String className) { + try { + Object instance = Class.forName(className).getConstructor().newInstance(); + if (instance instanceof ModInitializer) { + ((ModInitializer) instance).onInitialize(); + } else if (instance instanceof ClientModInitializer) { + ((ClientModInitializer) instance).onInitializeClient(); + } + } catch (InstantiationException | InvocationTargetException | IllegalAccessException | ClassNotFoundException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } + + public static void checkRequiredFabricModules() { + ImmutableSet requiredModules = FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT ? + ImmutableSet.builder() + .add("fabric-api-base") + .add("fabric-resource-loader-v0") + .add("fabric-networking-v0") + .add("fabric-lifecycle-events-v1") + .add("fabric-rendering-fluids-v1") + .build() : + ImmutableSet.builder() + .add("fabric-api-base") + .add("fabric-resource-loader-v0") + .add("fabric-networking-v0") + .add("fabric-lifecycle-events-v1") + .build(); + for (String module : requiredModules) { + boolean moduleLoaded = FabricLoader.getInstance().isModLoaded(module); + if (!moduleLoaded) { + RoughlyEnoughItemsState.error("Fabric API is not installed!", "https://www.curseforge.com/minecraft/mc-mods/fabric-api/files/all"); + break; + } + } + } + + public static void checkClothConfig() { + try { + if (!FabricLoader.getInstance().isModLoaded("cloth-config2")) { + RoughlyEnoughItemsState.error("Cloth Config is not installed!", "https://www.curseforge.com/minecraft/mc-mods/cloth-config/files/all"); + } else if (SemanticVersion.parse(FabricLoader.getInstance().getModContainer("cloth-config2").get().getMetadata().getVersion().getFriendlyString()).compareTo(SemanticVersion.parse("4.10.9")) < 0) { + RoughlyEnoughItemsState.error("Your Cloth Config version is too old!", "https://www.curseforge.com/minecraft/mc-mods/cloth-config/files/all"); + } + } catch (VersionParsingException e) { + RoughlyEnoughItemsState.error("Failed to parse Cloth Config version: " + e.getMessage()); + e.printStackTrace(); + } + } + + public static void checkModMenu() { + try { + if (FabricLoader.getInstance().isModLoaded("modmenu")) { + if (SemanticVersion.parse(FabricLoader.getInstance().getModContainer("modmenu").get().getMetadata().getVersion().getFriendlyString()).compareTo(SemanticVersion.parse("1.16.7")) < 0) { + RoughlyEnoughItemsState.error("Your Mod Menu version is too old!", "https://www.curseforge.com/minecraft/mc-mods/modmenu/files/all"); + } + } + } catch (VersionParsingException e) { + RoughlyEnoughItemsState.error("Failed to parse Mod Menu version: " + e.getMessage()); + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 808116f6a..e1827b6a8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -25,7 +25,6 @@ package me.shedaniel.rei; import com.google.common.collect.Lists; import io.netty.buffer.Unpooled; -import me.shedaniel.math.api.Executor; import me.shedaniel.rei.api.server.InputSlotCrafter; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -55,89 +54,85 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { @Override public void onInitialize() { - RoughlyEnoughItemsState.checkRequiredFabricModules(); - Executor.run(() -> () -> { - FabricLoader.getInstance().getEntrypoints("rei_containers", Runnable.class).forEach(Runnable::run); - ServerPlayNetworking.registerGlobalReceiver(DELETE_ITEMS_PACKET, (server, player, handler, buf, responseSender) -> { - if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { - player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); - return; - } - if (!player.getInventory().getCarried().isEmpty()) { - player.getInventory().setCarried(ItemStack.EMPTY); - player.broadcastCarriedItem(); - } - }); - ServerPlayNetworking.registerGlobalReceiver(CREATE_ITEMS_PACKET, (server, player, handler, buf, responseSender) -> { - if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { - player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); - return; - } - ItemStack stack = buf.readItem(); - if (player.getInventory().add(stack.copy())) { - responseSender.sendPacket(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); - } else - player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); - }); - ServerPlayNetworking.registerGlobalReceiver(CREATE_ITEMS_GRAB_PACKET, (server, player, handler, buf, responseSender) -> { - if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { - player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); - return; - } - - Inventory inventory = player.getInventory(); - ItemStack itemStack = buf.readItem(); - ItemStack stack = itemStack.copy(); - if (!inventory.getCarried().isEmpty() && ItemStack.isSameIgnoreDurability(inventory.getCarried(), stack) && ItemStack.tagMatches(inventory.getCarried(), stack)) { - stack.setCount(Mth.clamp(stack.getCount() + inventory.getCarried().getCount(), 1, stack.getMaxStackSize())); - } else if (!inventory.getCarried().isEmpty()) { - return; - } - inventory.setCarried(stack.copy()); + FabricLoader.getInstance().getEntrypoints("rei_containers", Runnable.class).forEach(Runnable::run); + ServerPlayNetworking.registerGlobalReceiver(DELETE_ITEMS_PACKET, (server, player, handler, buf, responseSender) -> { + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + if (!player.getInventory().getCarried().isEmpty()) { + player.getInventory().setCarried(ItemStack.EMPTY); player.broadcastCarriedItem(); - responseSender.sendPacket(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); - }); - ServerPlayNetworking.registerGlobalReceiver(MOVE_ITEMS_PACKET, (server, player, handler, packetByteBuf, responseSender) -> { - ResourceLocation category = packetByteBuf.readResourceLocation(); - AbstractContainerMenu container = player.containerMenu; - InventoryMenu playerContainer = player.inventoryMenu; - try { - boolean shift = packetByteBuf.readBoolean(); - NonNullList> input = NonNullList.create(); - int mapSize = packetByteBuf.readInt(); - for (int i = 0; i < mapSize; i++) { - List list = Lists.newArrayList(); - int count = packetByteBuf.readInt(); - for (int j = 0; j < count; j++) { - list.add(packetByteBuf.readItem()); - } - input.add(list); + } + }); + ServerPlayNetworking.registerGlobalReceiver(CREATE_ITEMS_PACKET, (server, player, handler, buf, responseSender) -> { + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + ItemStack stack = buf.readItem(); + if (player.getInventory().add(stack.copy())) { + responseSender.sendPacket(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); + } else + player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); + }); + ServerPlayNetworking.registerGlobalReceiver(CREATE_ITEMS_GRAB_PACKET, (server, player, handler, buf, responseSender) -> { + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + + Inventory inventory = player.getInventory(); + ItemStack itemStack = buf.readItem(); + ItemStack stack = itemStack.copy(); + if (!inventory.getCarried().isEmpty() && ItemStack.isSameIgnoreDurability(inventory.getCarried(), stack) && ItemStack.tagMatches(inventory.getCarried(), stack)) { + stack.setCount(Mth.clamp(stack.getCount() + inventory.getCarried().getCount(), 1, stack.getMaxStackSize())); + } else if (!inventory.getCarried().isEmpty()) { + return; + } + inventory.setCarried(stack.copy()); + player.broadcastCarriedItem(); + responseSender.sendPacket(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); + }); + ServerPlayNetworking.registerGlobalReceiver(MOVE_ITEMS_PACKET, (server, player, handler, packetByteBuf, responseSender) -> { + ResourceLocation category = packetByteBuf.readResourceLocation(); + AbstractContainerMenu container = player.containerMenu; + InventoryMenu playerContainer = player.inventoryMenu; + try { + boolean shift = packetByteBuf.readBoolean(); + NonNullList> input = NonNullList.create(); + int mapSize = packetByteBuf.readInt(); + for (int i = 0; i < mapSize; i++) { + List list = Lists.newArrayList(); + int count = packetByteBuf.readInt(); + for (int j = 0; j < count; j++) { + list.add(packetByteBuf.readItem()); } - try { - InputSlotCrafter.start(category, container, player, input, shift); - } catch (InputSlotCrafter.NotEnoughMaterialsException e) { - if (!(container instanceof RecipeBookMenu)) - return; - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); - buf.writeInt(input.size()); - for (List stacks : input) { - buf.writeInt(stacks.size()); - for (ItemStack stack : stacks) { - buf.writeItem(stack); - } + input.add(list); + } + try { + InputSlotCrafter.start(category, container, player, input, shift); + } catch (InputSlotCrafter.NotEnoughMaterialsException e) { + if (!(container instanceof RecipeBookMenu)) + return; + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeInt(input.size()); + for (List stacks : input) { + buf.writeInt(stacks.size()); + for (ItemStack stack : stacks) { + buf.writeItem(stack); } - responseSender.sendPacket(NOT_ENOUGH_ITEMS_PACKET, buf); - } catch (IllegalStateException e) { - player.sendMessage(new TranslatableComponent(e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); - } catch (Exception e) { - player.sendMessage(new TranslatableComponent("error.rei.internal.error", e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); - e.printStackTrace(); } + responseSender.sendPacket(NOT_ENOUGH_ITEMS_PACKET, buf); + } catch (IllegalStateException e) { + player.sendMessage(new TranslatableComponent(e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); } catch (Exception e) { + player.sendMessage(new TranslatableComponent("error.rei.internal.error", e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); e.printStackTrace(); } - }); + } catch (Exception e) { + e.printStackTrace(); + } }); } - } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java index 9378fafaf..cd5b8c1e2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java @@ -57,30 +57,6 @@ public class RoughlyEnoughItemsState { } } - public static void checkRequiredFabricModules() { - ImmutableSet requiredModules = FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT ? - ImmutableSet.builder() - .add("fabric-api-base") - .add("fabric-resource-loader-v0") - .add("fabric-networking-api-v1") - .add("fabric-lifecycle-events-v1") - .add("fabric-rendering-fluids-v1") - .build() : - ImmutableSet.builder() - .add("fabric-api-base") - .add("fabric-resource-loader-v0") - .add("fabric-networking-api-v1") - .add("fabric-lifecycle-events-v1") - .build(); - for (String module : requiredModules) { - boolean moduleLoaded = FabricLoader.getInstance().isModLoaded(module); - if (!moduleLoaded) { - RoughlyEnoughItemsState.error("Fabric API is not installed!", "https://www.curseforge.com/minecraft/mc-mods/fabric-api/files/all"); - return; - } - } - } - public static void error(String reason, String link) { if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER || FabricLoader.getInstance().isDevelopmentEnvironment()) throw new RuntimeException(reason + " " + link); diff --git a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java index 59f96faed..8fedbff04 100644 --- a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/FilteringScreen.java @@ -36,7 +36,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.ConfigObject; -import me.shedaniel.rei.api.EntryRegistry; +import me.shedaniel.rei.api.registry.EntryRegistry; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.api.gui.widgets.Tooltip; diff --git a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/ReloadPluginsEntry.java b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/ReloadPluginsEntry.java index fa88aed37..9d130bf36 100644 --- a/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/ReloadPluginsEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/api/gui/config/entry/ReloadPluginsEntry.java @@ -28,7 +28,7 @@ import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.RecipeRegistry; +import me.shedaniel.rei.api.DisplayRegistry; import me.shedaniel.rei.gui.ConfigReloadingScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; @@ -48,7 +48,7 @@ public class ReloadPluginsEntry extends AbstractConfigListEntry { private AbstractWidget buttonWidget = new Button(0, 0, 0, 20, NarratorChatListener.NO_TITLE, button -> RoughlyEnoughItemsCore.syncRecipes(null)) { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (RecipeRegistry.getInstance().arePluginsLoading()) { + if (DisplayRegistry.getInstance().arePluginsLoading()) { Minecraft.getInstance().setScreen(new ConfigReloadingScreen(Minecraft.getInstance().screen)); } else super.render(matrices, mouseX, mouseY, delta); diff --git a/runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java b/runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java index 6b8f629bb..53f8bc22a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java @@ -27,17 +27,17 @@ import alexiil.mc.lib.attributes.fluid.FluidAttributes; import alexiil.mc.lib.attributes.fluid.GroupedFluidInvView; import alexiil.mc.lib.attributes.fluid.amount.FluidAmount; import me.shedaniel.architectury.utils.Fraction; -import me.shedaniel.rei.api.RecipeRegistry; +import me.shedaniel.rei.api.DisplayRegistry; import me.shedaniel.rei.api.fluid.FluidSupportProvider; import me.shedaniel.rei.api.ingredient.util.EntryStacks; -import me.shedaniel.rei.api.plugins.REIPluginV0; +import me.shedaniel.rei.api.plugins.REIPlugin; import net.minecraft.world.InteractionResultHolder; import java.util.stream.Stream; -public class LBASupportPlugin implements REIPluginV0 { +public class LBASupportPlugin implements REIPlugin { @Override - public void registerOthers(RecipeRegistry registry) { + public void registerOthers(DisplayRegistry registry) { FluidSupportProvider.getInstance().registerProvider(entry -> { GroupedFluidInvView view = FluidAttributes.GROUPED_INV_VIEW.get(entry.getValue()); if (view.getStoredFluids().size() > 0) diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java index 4b1f1cf63..f4a3e454d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.gui; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.api.RecipeRegistry; +import me.shedaniel.rei.api.DisplayRegistry; import net.minecraft.Util; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.screens.Screen; @@ -49,7 +49,7 @@ public class ConfigReloadingScreen extends Screen { @Override public void render(PoseStack matrices, int int_1, int int_2, float float_1) { this.renderDirtBackground(0); - if (!RecipeRegistry.getInstance().arePluginsLoading()) + if (!DisplayRegistry.getInstance().arePluginsLoading()) minecraft.setScreen(parent); drawCenteredString(matrices, this.font, I18n.get("text.rei.config.is.reloading"), this.width / 2, this.height / 2 - 50, 16777215); String string_3; diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index f576a55fe..3e37d0861 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -40,6 +40,10 @@ import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.util.EntryStacks; import me.shedaniel.rei.api.favorites.FavoriteEntry; import me.shedaniel.rei.api.gui.config.SearchFieldLocation; +import me.shedaniel.rei.api.registry.CategoryRegistry; +import me.shedaniel.rei.api.registry.screens.OverlayDecider; +import me.shedaniel.rei.api.registry.screens.ScreenRegistry; +import me.shedaniel.rei.api.util.ImmutableLiteralText; import me.shedaniel.rei.gui.modules.Menu; import me.shedaniel.rei.gui.modules.entries.GameModeMenuEntry; import me.shedaniel.rei.gui.modules.entries.WeatherMenuEntry; @@ -213,7 +217,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl this.children().clear(); this.removeOverlayMenu(); this.window = Minecraft.getInstance().getWindow(); - this.bounds = DisplayBoundsRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation(), Minecraft.getInstance().screen); + this.bounds = ScreenRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation(), Minecraft.getInstance().screen); widgets.add(ENTRY_LIST_WIDGET); if (ConfigObject.getInstance().isFavoritesEnabled()) { if (favoritesListWidget == null) @@ -453,9 +457,9 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl return getBottomSideSearchFieldArea(widthRemoved); default: case CENTER: { - for (OverlayDecider decider : DisplayBoundsRegistry.getInstance().getSortedOverlayDeciders(Minecraft.getInstance().screen.getClass())) { - if (decider instanceof DisplayBoundsRegistry.DisplayBoundsProvider) { - Rectangle containerBounds = ((DisplayBoundsRegistry.DisplayBoundsProvider) decider).getScreenBounds(Minecraft.getInstance().screen); + for (OverlayDecider decider : ScreenRegistry.getInstance().getSortedOverlayDeciders(Minecraft.getInstance().screen.getClass())) { + if (decider instanceof ScreenRegistry.DisplayBoundsProvider) { + Rectangle containerBounds = ((ScreenRegistry.DisplayBoundsProvider) decider).getScreenBounds(Minecraft.getInstance().screen); return getBottomCenterSearchFieldArea(containerBounds, widthRemoved); } } @@ -509,7 +513,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText(), true); init(); } else { - for (OverlayDecider decider : DisplayBoundsRegistry.getInstance().getSortedOverlayDeciders(minecraft.screen.getClass())) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getSortedOverlayDeciders(minecraft.screen.getClass())) { if (decider != null && decider.shouldRecalculateArea(ConfigObject.getInstance().getDisplayPanelLocation(), bounds)) { init(); break; @@ -551,7 +555,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl return new Point(mouseX, mouseY); } }; - for (Map.Entry, ClickAreaHandler> area : ((RecipeRegistryImpl) RecipeRegistry.getInstance()).getClickAreas().entries()) { + for (Map.Entry, ClickAreaHandler> area : ((PluginManager) DisplayRegistry.getInstance()).getClickAreas().entries()) { if (area.getKey().equals(screen.getClass())) { ClickAreaHandler.Result result = area.getValue().handle(context); if (result.isSuccessful()) { @@ -562,7 +566,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl } } if (categories != null && !categories.isEmpty()) { - String collect = CollectionUtils.mapAndJoinToString(categories, identifier -> RecipeRegistry.getInstance().getCategory(identifier).getCategoryName(), ", "); + Component collect = CollectionUtils.mapAndJoinToComponent(categories, identifier -> CategoryRegistry.getInstance().get(identifier).getCategory().getTitle(), new ImmutableLiteralText(", ")); Tooltip.create(new TranslatableComponent("text.rei.view_recipes_for", collect)).queue(); } } @@ -678,7 +682,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ScreenHelper.toggleOverlayVisible(); return true; } - EntryStack stack = RecipeRegistry.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); + EntryStack stack = DisplayRegistry.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) { @@ -731,7 +735,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ScreenHelper.toggleOverlayVisible(); return true; } - EntryStack stack = RecipeRegistry.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); + EntryStack stack = DisplayRegistry.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) { @@ -777,7 +781,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl return new Point(mouseX, mouseY); } }; - for (Map.Entry, ClickAreaHandler> area : ((RecipeRegistryImpl) RecipeRegistry.getInstance()).getClickAreas().entries()) { + for (Map.Entry, ClickAreaHandler> area : ((PluginManager) DisplayRegistry.getInstance()).getClickAreas().entries()) { if (area.getKey().equals(screen.getClass())) { ClickAreaHandler.Result result = area.getValue().handle(context); if (result.isSuccessful()) { @@ -824,7 +828,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl } public boolean isNotInExclusionZones(double mouseX, double mouseY) { - for (OverlayDecider decider : DisplayBoundsRegistry.getInstance().getSortedOverlayDeciders(Minecraft.getInstance().screen.getClass())) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getSortedOverlayDeciders(Minecraft.getInstance().screen.getClass())) { InteractionResult in = decider.isInZone(mouseX, mouseY); if (in != InteractionResult.PASS) return in == InteractionResult.SUCCESS; diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index b230b023e..ef265916a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -261,7 +261,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { currentCategoryIndex = categories.size() - 1; ClientHelperImpl.getInstance().openRecipeViewingScreen(categoriesMap, categories.get(currentCategoryIndex).getIdentifier(), ingredientStackToNotice, resultStackToNotice); }).tooltipLine(I18n.get("text.rei.previous_category"))); - widgets.add(Widgets.createClickableLabel(new Point(bounds.getCenterX(), bounds.getY() + 7), new TextComponent(selectedCategory.getCategoryName()), clickableLabelWidget -> { + widgets.add(Widgets.createClickableLabel(new Point(bounds.getCenterX(), bounds.getY() + 7), selectedCategory.getTitle(), clickableLabelWidget -> { ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addAllCategories().fillPreferredOpenedCategory()); }).tooltipLine(I18n.get("text.rei.view_all_categories"))); widgets.add(categoryNext = Widgets.createButton(new Rectangle(bounds.getMaxX() - 17, bounds.getY() + 5, 12, 12), new TranslatableComponent("text.rei.right_arrow")) @@ -310,10 +310,10 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { ClientHelperImpl.getInstance().openRecipeViewingScreen(categoriesMap, categories.get(widget.getId() + categoryPages * tabsPerPage).getIdentifier(), ingredientStackToNotice, resultStackToNotice); return true; })); - tab.setRenderer(categories.get(j), categories.get(j).getLogo(), categories.get(j).getCategoryName(), tab.getId() + categoryPages * tabsPerPage == categories.indexOf(selectedCategory)); + tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getTitle(), tab.getId() + categoryPages * tabsPerPage == categories.indexOf(selectedCategory)); } } - Optional supplier = RecipeRegistry.getInstance().getAutoCraftButtonArea(selectedCategory); + Optional supplier = DisplayRegistry.getInstance().getAutoCraftButtonArea(selectedCategory); int recipeHeight = selectedCategory.getDisplayHeight(); List currentDisplayed = getCurrentDisplayed(); for (int i = 0; i < currentDisplayed.size(); i++) { @@ -389,10 +389,10 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { } private int getRecipesPerPage() { - if (selectedCategory.getFixedRecipesPerPage() > 0) - return selectedCategory.getFixedRecipesPerPage() - 1; + if (selectedCategory.getFixedDisplaysPerPage() > 0) + return selectedCategory.getFixedDisplaysPerPage() - 1; int height = selectedCategory.getDisplayHeight(); - return Mth.clamp(Mth.floor(((double) this.bounds.getHeight() - 36) / ((double) height + 4)) - 1, 0, Math.min(ConfigObject.getInstance().getMaxRecipePerPage() - 1, selectedCategory.getMaximumRecipePerPage() - 1)); + return Mth.clamp(Mth.floor(((double) this.bounds.getHeight() - 36) / ((double) height + 4)) - 1, 0, Math.min(ConfigObject.getInstance().getMaxRecipePerPage() - 1, selectedCategory.getMaximumDisplaysPerPage() - 1)); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index fd282ae55..c081fcec4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -192,7 +192,7 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen RecipeViewingScreen.transformIngredientNotice(setupDisplay, ingredientStackToNotice); RecipeViewingScreen.transformResultNotice(setupDisplay, resultStackToNotice); this.widgets.addAll(setupDisplay); - Optional supplier = RecipeRegistry.getInstance().getAutoCraftButtonArea(category); + Optional supplier = DisplayRegistry.getInstance().getAutoCraftButtonArea(category); if (supplier.isPresent() && supplier.get().get(recipeBounds) != null) this.widgets.add(InternalWidgets.createAutoCraftingButtonWidget(recipeBounds, supplier.get().get(recipeBounds), new TextComponent(supplier.get().getButtonText()), () -> display, setupDisplay, category)); @@ -225,7 +225,7 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen ClientHelperImpl.getInstance().openRecipeViewingScreen(categoryMap, tabCategory.getIdentifier(), ingredientStackToNotice, resultStackToNotice); return true; })); - tab.setRenderer(tabCategory, tabCategory.getLogo(), tabCategory.getCategoryName(), j == selectedCategoryIndex); + tab.setRenderer(tabCategory, tabCategory.getIcon(), tabCategory.getTitle(), j == selectedCategoryIndex); } } this.widgets.add(Widgets.createButton(new Rectangle(bounds.x + 2, bounds.y - 16, 10, 10), new TranslatableComponent("text.rei.left_arrow")) @@ -245,7 +245,7 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen }) .enabled(categories.size() > tabsPerPage)); - this.widgets.add(Widgets.createClickableLabel(new Point(bounds.x + 4 + scrollListBounds.width / 2, bounds.y + 6), new TextComponent(categories.get(selectedCategoryIndex).getCategoryName()), label -> { + this.widgets.add(Widgets.createClickableLabel(new Point(bounds.x + 4 + scrollListBounds.width / 2, bounds.y + 6), categories.get(selectedCategoryIndex).getTitle(), label -> { ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addAllCategories().fillPreferredOpenedCategory()); }).tooltipLine(I18n.get("text.rei.view_all_categories")).noShadow().color(0xFF404040, 0xFFBBBBBB).hoveredColor(0xFF0041FF, 0xFFFFBD4D)); diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/WarningAndErrorScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/WarningAndErrorScreen.java index 83e99a8f8..c7ea239d5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/WarningAndErrorScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/WarningAndErrorScreen.java @@ -24,8 +24,8 @@ package me.shedaniel.rei.gui; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.clothconfig2.gui.widget.DynamicNewSmoothScrollingEntryListWidget; import me.shedaniel.rei.RoughlyEnoughItemsState; +import me.shedaniel.rei.impl.DynamicErrorFreeEntryListWidget; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; @@ -141,7 +141,7 @@ public class WarningAndErrorScreen extends Screen { this.buttonExit.render(matrices, int_1, int_2, float_1); } - private static class StringEntryListWidget extends DynamicNewSmoothScrollingEntryListWidget { + private static class StringEntryListWidget extends DynamicErrorFreeEntryListWidget { private boolean inFocus; private int max = 80; @@ -188,7 +188,7 @@ public class WarningAndErrorScreen extends Screen { } } - private abstract static class StringItem extends DynamicNewSmoothScrollingEntryListWidget.Entry { + private abstract static class StringItem extends DynamicErrorFreeEntryListWidget.Entry { public abstract int getWidth(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/modules/Menu.java b/runtime/src/main/java/me/shedaniel/rei/gui/modules/Menu.java index c6b4b3015..75114ff64 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/modules/Menu.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/modules/Menu.java @@ -33,7 +33,7 @@ import me.shedaniel.clothconfig2.api.ScrollingContainer; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.api.EntryRegistry; +import me.shedaniel.rei.api.registry.EntryRegistry; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.api.ingredient.util.EntryStacks; diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java index bfddf6c5f..5863b9f8f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/EntryStackSubsetsMenuEntry.java @@ -30,6 +30,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.util.EntryStacks; +import me.shedaniel.rei.api.registry.EntryRegistry; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.modules.Menu; import me.shedaniel.rei.gui.modules.MenuEntry; diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java index 41e111af5..c71bf99e7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/modules/entries/SubSubsetsMenuEntry.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.*; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.util.EntryStacks; import me.shedaniel.rei.api.gui.widgets.Tooltip; +import me.shedaniel.rei.api.registry.EntryRegistry; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.modules.Menu; import me.shedaniel.rei.gui.modules.MenuEntry; diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java index 1f49349cb..b1970341d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/plugin/DefaultRuntimePlugin.java @@ -37,12 +37,16 @@ import me.shedaniel.rei.api.gui.Renderer; import me.shedaniel.rei.api.gui.widgets.Panel; import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.api.ingredient.EntryStack; -import me.shedaniel.rei.api.ingredient.entry.AbstractRenderer; +import me.shedaniel.rei.api.gui.AbstractRenderer; import me.shedaniel.rei.api.ingredient.entry.ComparisonContext; import me.shedaniel.rei.api.ingredient.entry.EntryTypeRegistry; import me.shedaniel.rei.api.ingredient.entry.VanillaEntryTypes; import me.shedaniel.rei.api.ingredient.util.EntryStacks; -import me.shedaniel.rei.api.plugins.REIPluginV0; +import me.shedaniel.rei.api.plugins.REIPlugin; +import me.shedaniel.rei.api.registry.EntryRegistry; +import me.shedaniel.rei.api.registry.screens.DisplayBoundsProvider; +import me.shedaniel.rei.api.registry.screens.ExclusionZones; +import me.shedaniel.rei.api.registry.screens.ScreenRegistry; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.RecipeViewingScreen; import me.shedaniel.rei.gui.VillagerRecipeViewingScreen; @@ -72,7 +76,7 @@ import java.util.stream.Stream; @ApiStatus.Internal @Environment(EnvType.CLIENT) -public class DefaultRuntimePlugin implements REIPluginV0 { +public class DefaultRuntimePlugin implements REIPlugin { public static final ResourceLocation PLUGIN = new ResourceLocation("roughlyenoughitems", "default_runtime_plugin"); @Override @@ -107,15 +111,16 @@ public class DefaultRuntimePlugin implements REIPluginV0 { } @Override - public void registerBounds(DisplayBoundsRegistry registry) { - ExclusionZones exclusionZones = ExclusionZones.getInstance(); - exclusionZones.register(RecipeViewingScreen.class, () -> { + public void registerScreens(ScreenRegistry registry) { + ExclusionZones zones = registry.exclusionZones(); + zones.register(); + zones.register(RecipeViewingScreen.class, () -> { Panel widget = ((RecipeViewingScreen) Minecraft.getInstance().screen).getWorkingStationsBaseWidget(); if (widget == null) return Collections.emptyList(); return Collections.singletonList(widget.getBounds().clone()); }); - exclusionZones.register(Screen.class, () -> { + zones.register(Screen.class, () -> { FavoritesListWidget widget = ContainerScreenOverlay.getFavoritesListWidget(); if (widget != null) { if (widget.favoritePanelButton.isVisible()) @@ -123,7 +128,7 @@ public class DefaultRuntimePlugin implements REIPluginV0 { } return Collections.emptyList(); }); - registry.registerProvider(new DisplayBoundsRegistry.DisplayBoundsProvider() { + registry.registerHandler(new DisplayBoundsProvider() { @Override public Rectangle getScreenBounds(RecipeViewingScreen screen) { return screen.getBounds(); @@ -139,7 +144,7 @@ public class DefaultRuntimePlugin implements REIPluginV0 { return InteractionResult.SUCCESS; } }); - registry.registerProvider(new DisplayBoundsRegistry.DisplayBoundsProvider() { + registry.registerHandler(new DisplayBoundsProvider() { @Override public Rectangle getScreenBounds(VillagerRecipeViewingScreen screen) { return screen.bounds; @@ -158,7 +163,7 @@ public class DefaultRuntimePlugin implements REIPluginV0 { } @Override - public void registerOthers(RecipeRegistry registry) { + public void registerOthers(DisplayRegistry registry) { registry.registerAutoCraftingHandler(new DefaultCategoryHandler()); FavoriteEntryType.registry().register(EntryStackFavoriteType.INSTANCE.id, EntryStackFavoriteType.INSTANCE); } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 0777806da..6fb9b44d9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -47,6 +47,9 @@ import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.ingredient.entry.*; import me.shedaniel.rei.api.ingredient.util.EntryStacks; import me.shedaniel.rei.api.gui.widgets.Tooltip; +import me.shedaniel.rei.api.registry.EntryRegistry; +import me.shedaniel.rei.api.registry.screens.OverlayDecider; +import me.shedaniel.rei.api.registry.screens.ScreenRegistry; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.api.gui.config.EntryPanelOrdering; import me.shedaniel.rei.impl.*; @@ -122,7 +125,7 @@ public class EntryListWidget extends WidgetWithBounds { static boolean notSteppingOnExclusionZones(int left, int top, int width, int height, Rectangle listArea) { Minecraft instance = Minecraft.getInstance(); - for (OverlayDecider decider : DisplayBoundsRegistry.getInstance().getSortedOverlayDeciders(instance.screen.getClass())) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getSortedOverlayDeciders(instance.screen.getClass())) { InteractionResult fit = canItemSlotWidgetFit(left, top, width, height, decider); if (fit != InteractionResult.PASS) return fit == InteractionResult.SUCCESS; @@ -351,8 +354,8 @@ public class EntryListWidget extends WidgetWithBounds { matrices.popPose(); } - if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.getInventory().getCarried().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) { - EntryStack stack = EntryStacks.of(minecraft.player.getInventory().getCarried().copy()); + if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCarried().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) { + EntryStack stack = EntryStacks.of(minecraft.player.inventory.getCarried().copy()); if (stack.getValueType() == FluidStack.class) { Item bucketItem = ((FluidStack) stack.getValue()).getFluid().getBucket(); if (bucketItem != null) { @@ -486,7 +489,7 @@ public class EntryListWidget extends WidgetWithBounds { boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ScreenHelper.inventoryStacks.isEmpty(); IntSet workingItems = checkCraftable ? new IntOpenHashSet() : null; if (checkCraftable) - workingItems.addAll(CollectionUtils.map(RecipeRegistry.getInstance().findCraftableEntriesByItems(ScreenHelper.inventoryStacks), EntryStacks::hashIgnoreCount)); + workingItems.addAll(CollectionUtils.map(DisplayRegistry.getInstance().findCraftableEntriesByItems(ScreenHelper.inventoryStacks), EntryStacks::hashIgnoreCount)); List> stacks = EntryRegistry.getInstance().getPreFilteredList(); if (stacks instanceof CopyOnWriteArrayList && !stacks.isEmpty()) { if (ConfigObject.getInstance().shouldAsyncSearch()) { @@ -567,7 +570,7 @@ public class EntryListWidget extends WidgetWithBounds { public boolean mouseReleased(double mouseX, double mouseY, int button) { if (containsMouse(mouseX, mouseY)) { LocalPlayer player = minecraft.player; - if (ClientHelper.getInstance().isCheating() && player != null && player.getInventory() != null && !player.getInventory().getCarried().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) { + if (ClientHelper.getInstance().isCheating() && player != null && player.inventory != null && !player.inventory.getCarried().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) { ClientHelper.getInstance().sendDeletePacket(); return true; } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java index 134e2fea2..8782a5098 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java @@ -46,6 +46,7 @@ import me.shedaniel.rei.api.favorites.FavoriteEntry; import me.shedaniel.rei.api.favorites.FavoriteEntryType; import me.shedaniel.rei.api.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.ingredient.util.EntryStacks; +import me.shedaniel.rei.api.registry.screens.ScreenRegistry; import me.shedaniel.rei.api.util.ImmutableLiteralText; import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.gui.ContainerScreenOverlay; @@ -53,7 +54,6 @@ import me.shedaniel.rei.gui.modules.Menu; import me.shedaniel.rei.gui.modules.MenuEntry; import me.shedaniel.rei.impl.*; import me.shedaniel.rei.api.util.CollectionUtils; -import me.shedaniel.rei.api.util.ImmutableLiteralText; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -244,7 +244,7 @@ public class FavoritesListWidget extends WidgetWithBounds { } public void updateFavoritesBounds(@Nullable String searchTerm) { - this.fullBounds = ScreenHelper.getFavoritesListArea(DisplayBoundsRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation().mirror(), Minecraft.getInstance().screen)); + this.fullBounds = ScreenHelper.getFavoritesListArea(ScreenRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation().mirror(), Minecraft.getInstance().screen)); } public void updateSearch(EntryListWidget listWidget, String searchTerm) { diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java index ec11e6551..e0b74eedf 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/TabWidget.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.registry.display.DisplayCategory; import me.shedaniel.rei.api.gui.Renderer; import me.shedaniel.rei.api.gui.widgets.Tooltip; import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; @@ -51,7 +52,7 @@ public class TabWidget extends WidgetWithBounds { public boolean shown = false, selected = false; public Renderer renderer; public int id; - public String categoryName; + public Component categoryName; public Rectangle bounds; public DisplayCategory category; public int u, v; @@ -76,7 +77,7 @@ public class TabWidget extends WidgetWithBounds { return button == 0 && containsMouse(mouseX, mouseY) && onClick.test(this); } - public void setRenderer(DisplayCategory category, Renderer renderer, String categoryName, boolean selected) { + public void setRenderer(DisplayCategory category, Renderer renderer, Component categoryName, boolean selected) { if (renderer == null) { shown = false; this.renderer = null; @@ -121,9 +122,9 @@ public class TabWidget extends WidgetWithBounds { private void drawTooltip() { if (this.minecraft.options.advancedItemTooltips) - Tooltip.create(new TextComponent(categoryName), new TextComponent(category.getIdentifi