From 542eb5154ebce387312ca3691f743b89e4aef99e Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 27 Feb 2021 17:14:08 +0800 Subject: Remove depending on Cloth API, switching to architectury Signed-off-by: shedaniel --- .../me/shedaniel/rei/REIModMenuEntryPoint.java | 20 +- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 199 ++++--- .../rei/RoughlyEnoughItemsInitializer.java | 15 +- .../shedaniel/rei/RoughlyEnoughItemsNetwork.java | 32 +- .../rei/api/gui/config/entry/FilteringScreen.java | 6 +- .../api/gui/config/entry/ReloadPluginsEntry.java | 7 +- .../me/shedaniel/rei/compat/LBASupportPlugin.java | 5 +- .../shedaniel/rei/gui/ConfigReloadingScreen.java | 4 +- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 66 +-- .../java/me/shedaniel/rei/gui/DelegateScreen.java | 10 +- .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 18 +- .../gui/SearchFilterSyntaxHighlightingScreen.java | 25 +- .../rei/gui/VillagerRecipeViewingScreen.java | 18 +- .../java/me/shedaniel/rei/gui/modules/Menu.java | 2 +- .../entries/EntryStackSubsetsMenuEntry.java | 2 +- .../rei/gui/modules/entries/GameModeMenuEntry.java | 2 +- .../gui/modules/entries/SubSubsetsMenuEntry.java | 2 +- .../rei/gui/plugin/DefaultRuntimePlugin.java | 60 +- .../rei/gui/plugin/entry/FluidEntryDefinition.java | 11 +- .../rei/gui/plugin/entry/ItemEntryDefinition.java | 4 +- .../rei/gui/widget/EntryListEntryWidget.java | 2 +- .../shedaniel/rei/gui/widget/EntryListWidget.java | 85 ++- .../me/shedaniel/rei/gui/widget/EntryWidget.java | 27 +- .../rei/gui/widget/FavoritesListWidget.java | 2 +- .../me/shedaniel/rei/impl/ClientHelperImpl.java | 85 +-- .../me/shedaniel/rei/impl/ConfigManagerImpl.java | 22 +- .../me/shedaniel/rei/impl/EntryRegistryImpl.java | 35 +- .../shedaniel/rei/impl/EntryTypeRegistryImpl.java | 10 +- .../java/me/shedaniel/rei/impl/ErrorDisplayer.java | 11 +- .../me/shedaniel/rei/impl/ExclusionZonesImpl.java | 6 +- .../rei/impl/FavoriteEntryTypeRegistryImpl.java | 10 +- .../rei/impl/FluidSupportProviderImpl.java | 14 +- .../me/shedaniel/rei/impl/InternalWidgets.java | 15 +- .../impl/OverlaySearchFieldSyntaxHighlighter.java | 23 + .../java/me/shedaniel/rei/impl/PluginManager.java | 627 --------------------- .../me/shedaniel/rei/impl/PluginManagerImpl.java | 196 +++++++ .../java/me/shedaniel/rei/impl/ScreenHelper.java | 45 +- .../me/shedaniel/rei/impl/ScreenRegistryImpl.java | 184 ++++-- .../me/shedaniel/rei/impl/SimpleFluidRenderer.java | 13 +- .../rei/impl/entry/EmptyEntryDefinition.java | 32 +- .../rei/impl/entry/EntryIngredientImpl.java | 353 ++++++++++++ .../rei/impl/registry/CategoryRegistryImpl.java | 51 +- .../rei/impl/registry/DisplayRegistryImpl.java | 137 ++++- .../impl/registry/RecipeManagerContextImpl.java | 25 +- .../rei/impl/subsets/SubsetsRegistryImpl.java | 25 +- .../impl/transfer/TransferHandlerRegistryImpl.java | 63 +++ .../java/me/shedaniel/rei/impl/view/ViewsImpl.java | 205 +++++++ .../widgets/FillRectangleDrawableConsumer.java | 2 +- .../rei/impl/widgets/TextFieldWidget.java | 2 +- .../autocrafting/DefaultCategoryHandler.java | 14 +- .../shedaniel/rei/tests/plugin/REITestPlugin.java | 2 +- 51 files changed, 1705 insertions(+), 1126 deletions(-) delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/PluginManager.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/PluginManagerImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/entry/EntryIngredientImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/transfer/TransferHandlerRegistryImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/view/ViewsImpl.java (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java b/runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java index f282a6259..df51d9d03 100644 --- a/runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java +++ b/runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java @@ -23,23 +23,13 @@ package me.shedaniel.rei; -import com.google.common.collect.ImmutableMap; -import io.github.prospector.modmenu.api.ConfigScreenFactory; -import io.github.prospector.modmenu.api.ModMenuApi; +import me.shedaniel.architectury.platform.Platform; import me.shedaniel.rei.api.ConfigManager; +import net.fabricmc.api.ClientModInitializer; -import java.util.Map; - -public class REIModMenuEntryPoint implements ModMenuApi { - @Override - public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> ConfigManager.getInstance().getConfigScreen(parent); - } - +public class REIModMenuEntryPoint implements ClientModInitializer { @Override - public Map> getProvidedConfigScreenFactories() { - return ImmutableMap.of( - "roughlyenoughitems", getModConfigScreenFactory() - ); + public void onInitializeClient() { + Platform.getMod("roughlyenoughitems").registerConfigurationScreen(ConfigManager.getInstance()::getConfigScreen); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index fcc8492f3..052cd903c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -27,44 +27,47 @@ import com.google.common.collect.Iterables; 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.architectury.event.events.GuiEvent; +import me.shedaniel.architectury.event.events.RecipeUpdateEvent; +import me.shedaniel.architectury.event.events.client.ClientScreenInputEvent; +import me.shedaniel.architectury.networking.NetworkManager; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.math.api.Executor; -import me.shedaniel.rei.api.*; -import me.shedaniel.rei.api.ingredient.EntryStack; -import me.shedaniel.rei.api.ingredient.entry.*; +import me.shedaniel.rei.api.ConfigObject; +import me.shedaniel.rei.api.REIHelper; 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.fluid.FluidSupportProvider; -import me.shedaniel.rei.api.ingredient.util.EntryStacks; -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; import me.shedaniel.rei.api.gui.widgets.*; +import me.shedaniel.rei.api.ingredient.EntryStack; +import me.shedaniel.rei.api.ingredient.entry.BuiltinEntryTypes; +import me.shedaniel.rei.api.ingredient.entry.EntryDefinition; +import me.shedaniel.rei.api.ingredient.entry.EntryType; +import me.shedaniel.rei.api.ingredient.util.EntryStacks; +import me.shedaniel.rei.api.plugins.PluginManager; +import me.shedaniel.rei.api.plugins.REIPlugin; +import me.shedaniel.rei.api.registry.screen.ClickArea; +import me.shedaniel.rei.api.registry.screen.OverlayDecider; +import me.shedaniel.rei.api.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.view.Views; import me.shedaniel.rei.gui.ContainerScreenOverlay; import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.QueuedTooltip; -import me.shedaniel.rei.api.gui.widgets.Widget; import me.shedaniel.rei.impl.*; import me.shedaniel.rei.impl.entry.EmptyEntryDefinition; -import me.shedaniel.rei.impl.subsets.SubsetsRegistryImpl; +import me.shedaniel.rei.impl.entry.EntryIngredientImpl; +import me.shedaniel.rei.impl.view.ViewsImpl; import me.shedaniel.rei.impl.widgets.*; import me.shedaniel.rei.tests.plugin.REITestPlugin; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.components.ImageButton; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -87,7 +90,6 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeManager; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; @@ -116,7 +118,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { public static boolean isLeftModePressed = false; static { - attachInstance(EntryTypeRegistryImpl.getInstance(), EntryTypeRegistry.class); Map> typeCache = new ConcurrentHashMap<>(); attachInstance((Function>) id -> { if (id.equals(BuiltinEntryTypes.EMPTY_ID)) { @@ -126,11 +127,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } return typeCache.computeIfAbsent(id, EntryTypeDeferred::new); }, "entryTypeDeferred"); - attachInstance(new PluginManager(), DisplayRegistry.class); - attachInstance(new EntryRegistryImpl(), EntryRegistry.class); - attachInstance(new ScreenRegistryImpl(), ScreenRegistry.class); - attachInstance(new FluidSupportProviderImpl(), FluidSupportProvider.class); - attachInstance(new SubsetsRegistryImpl(), SubsetsRegistry.class); + attachInstance(new PluginManagerImpl(), PluginManager.class); attachInstance(new Internals.EntryStackProvider() { @Override public EntryStack empty() { @@ -149,7 +146,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { public @NotNull ResourceLocation getId() { return id; } - + @SuppressWarnings("rawtypes") @Override public @NotNull EntryDefinition getDefinition() { @@ -165,7 +162,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { public @NotNull ResourceLocation getId() { return id; } - + @SuppressWarnings("rawtypes") @Override public @NotNull EntryDefinition getDefinition() { @@ -225,10 +222,11 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { return new FillRectangleDrawableConsumer(rectangle, color); } }, Internals.WidgetsProvider.class); - attachInstance((Supplier) FavoriteEntryTypeRegistryImpl::getInstance, "favoriteEntryTypeRegistry"); + attachInstance(new ViewsImpl(), Views.class); + attachInstance(EntryIngredientImpl.provide(), Internals.EntryIngredientProvider.class); attachInstance((BiFunction, Supplier, FavoriteEntry>) (supplier, toJson) -> new FavoriteEntry() { FavoriteEntry value = null; - + @Override public FavoriteEntry getUnwrapped() { if (this.value == null) { @@ -313,11 +311,11 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } }, "favoriteEntryFromJson"); attachInstance((BiFunction<@Nullable Point, Collection, Tooltip>) QueuedTooltip::create, "tooltipProvider"); - attachInstance((Function<@Nullable Boolean, ClickAreaHandler.Result>) successful -> new ClickAreaHandler.Result() { + attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { private List categories = Lists.newArrayList(); @Override - public ClickAreaHandler.Result category(ResourceLocation category) { + public ClickArea.Result category(ResourceLocation category) { this.categories.add(category); return this; } @@ -369,7 +367,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } public static boolean canUsePackets() { - return ClientPlayNetworking.canSend(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientPlayNetworking.canSend(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && ClientPlayNetworking.canSend(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); + return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); } @ApiStatus.Internal @@ -381,11 +379,10 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } lastSync[0] = System.currentTimeMillis(); } - RecipeManager recipeManager = Minecraft.getInstance().getConnection().getRecipeManager(); if (ConfigObject.getInstance().doesRegisterRecipesInAnotherThread()) { - CompletableFuture.runAsync(() -> ((PluginManager) DisplayRegistry.getInstance()).tryRecipesLoaded(recipeManager), SYNC_RECIPES); + CompletableFuture.runAsync(() -> ((PluginManagerImpl) PluginManager.getInstance()).tryResetData(), SYNC_RECIPES); } else { - ((PluginManager) DisplayRegistry.getInstance()).tryRecipesLoaded(recipeManager); + ((PluginManagerImpl) PluginManager.getInstance()).tryResetData(); } } @@ -401,8 +398,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { @SuppressWarnings("deprecation") @Override public void onInitializeClient() { - attachInstance(new ConfigManagerImpl(), ConfigManager.class); - IssuesDetector.detect(); registerClothEvents(); discoverPluginEntries(); @@ -411,44 +406,42 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { RoughlyEnoughItemsCore.LOGGER.error("REI plugin from " + modContainer.getMetadata().getId() + " is not loaded because it is too old!"); } - RoughlyEnoughItemsState.checkRequiredFabricModules(); - Executor.run(() -> () -> { - ClientPlayNetworking.registerGlobalReceiver(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (client, handler, buf, responseSender) -> { - ItemStack stack = buf.readItem(); - String player = buf.readUtf(32767); - if (client.player != null) { - client.player.displayClientMessage(new TextComponent(I18n.get("text.rei.cheat_items").replaceAll("\\{item_name}", EntryStacks.of(stack.copy()).asFormattedText().getString()).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false); - } - }); - ClientPlayNetworking.registerGlobalReceiver(RoughlyEnoughItemsNetwork.NOT_ENOUGH_ITEMS_PACKET, (client, handler, buf, responseSender) -> { - Screen currentScreen = Minecraft.getInstance().screen; - if (currentScreen instanceof CraftingScreen) { - RecipeBookComponent recipeBookGui = ((RecipeUpdateListener) currentScreen).getRecipeBookComponent(); - GhostRecipe ghostSlots = recipeBookGui.ghostRecipe; - ghostSlots.clear(); - - List> input = Lists.newArrayList(); - int mapSize = buf.readInt(); - for (int i = 0; i < mapSize; i++) { - List list = Lists.newArrayList(); - int count = buf.readInt(); - for (int j = 0; j < count; j++) { - list.add(buf.readItem()); - } - input.add(list); + Minecraft client = Minecraft.getInstance(); + NetworkManager.registerReceiver(NetworkManager.s2c(), RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (buf, context) -> { + ItemStack stack = buf.readItem(); + String player = buf.readUtf(32767); + if (client.player != null) { + client.player.displayClientMessage(new TextComponent(I18n.get("text.rei.cheat_items").replaceAll("\\{item_name}", EntryStacks.of(stack.copy()).asFormattedText().getString()).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false); + } + }); + NetworkManager.registerReceiver(NetworkManager.s2c(), RoughlyEnoughItemsNetwork.NOT_ENOUGH_ITEMS_PACKET, (buf, context) -> { + Screen currentScreen = Minecraft.getInstance().screen; + if (currentScreen instanceof CraftingScreen) { + RecipeBookComponent recipeBookGui = ((RecipeUpdateListener) currentScreen).getRecipeBookComponent(); + GhostRecipe ghostSlots = recipeBookGui.ghostRecipe; + ghostSlots.clear(); + + List> input = Lists.newArrayList(); + int mapSize = buf.readInt(); + for (int i = 0; i < mapSize; i++) { + List list = Lists.newArrayList(); + int count = buf.readInt(); + for (int j = 0; j < count; j++) { + list.add(buf.readItem()); } - - ghostSlots.addIngredient(Ingredient.of(Items.STONE), 381203812, 12738291); - CraftingMenu container = ((CraftingScreen) currentScreen).getMenu(); - for (int i = 0; i < input.size(); i++) { - List stacks = input.get(i); - if (!stacks.isEmpty()) { - Slot slot = container.getSlot(i + container.getResultSlotIndex() + 1); - ghostSlots.addIngredient(Ingredient.of(stacks.toArray(new ItemStack[0])), slot.x, slot.y); - } + input.add(list); + } + + ghostSlots.addIngredient(Ingredient.of(Items.STONE), 381203812, 12738291); + CraftingMenu container = ((CraftingScreen) currentScreen).getMenu(); + for (int i = 0; i < input.size(); i++) { + List stacks = input.get(i); + if (!stacks.isEmpty()) { + Slot slot = container.getSlot(i + container.getResultSlotIndex() + 1); + ghostSlots.addIngredient(Ingredient.of(stacks.toArray(new ItemStack[0])), slot.x, slot.y); } } - }); + } }); } @@ -483,7 +476,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } if (FabricLoader.getInstance().isModLoaded("libblockattributes-fluids")) { try { - registerPlugin((REIPluginEntry) Class.forName("me.shedaniel.rei.compat.LBASupportPlugin").getConstructor().newInstance()); + registerPlugin((REIPlugin) Class.forName("me.shedaniel.rei.compat.LBASupportPlugin").getConstructor().newInstance()); } catch (Throwable throwable) { throwable.printStackTrace(); } @@ -496,9 +489,9 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { return shouldReturn(screen.getClass()); } - private boolean shouldReturn(Class screen) { + private boolean shouldReturn(Class screen) { try { - for (OverlayDecider decider : ScreenRegistry.getInstance().getAllOverlayDeciders()) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders()) { if (!decider.isHandingScreen(screen)) continue; InteractionResult result = decider.shouldScreenBeOverlaid(screen); @@ -511,88 +504,86 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } private void registerClothEvents() { + Minecraft client = Minecraft.getInstance(); final ResourceLocation recipeButtonTex = new ResourceLocation("textures/gui/recipe_button.png"); long[] lastSync = {-1}; - ClothClientHooks.SYNC_RECIPES.register((minecraftClient, recipeManager, synchronizeRecipesS2CPacket) -> syncRecipes(lastSync)); - ClothClientHooks.SCREEN_ADD_BUTTON.register((minecraftClient, screen, abstractButtonWidget) -> { + RecipeUpdateEvent.EVENT.register(recipeManager -> syncRecipes(lastSync)); + // TODO Make Disable Recipe Book work + /*ClothClientHooks.SCREEN_ADD_BUTTON.register((minecraftClient, screen, abstractButtonWidget) -> { if (ConfigObject.getInstance().doesDisableRecipeBook() && screen instanceof AbstractContainerScreen && abstractButtonWidget instanceof ImageButton) if (((ImageButton) abstractButtonWidget).resourceLocation.equals(recipeButtonTex)) return InteractionResult.FAIL; return InteractionResult.PASS; - }); - ClothClientHooks.SCREEN_INIT_POST.register((minecraftClient, screen, screenHooks) -> { + });*/ + GuiEvent.INIT_POST.register((screen, widgets, children) -> { if (shouldReturn(screen)) return; - if (screen instanceof InventoryScreen && minecraftClient.gameMode.hasInfiniteItems()) + if (screen instanceof InventoryScreen && client.gameMode.hasInfiniteItems()) return; if (screen instanceof AbstractContainerScreen) ScreenHelper.setPreviousContainerScreen((AbstractContainerScreen) screen); boolean alreadyAdded = false; - for (GuiEventListener element : Lists.newArrayList(screenHooks.cloth$getChildren())) + for (GuiEventListener element : Lists.newArrayList(children)) if (ContainerScreenOverlay.class.isAssignableFrom(element.getClass())) if (alreadyAdded) - screenHooks.cloth$getChildren().remove(element); + children.remove(element); else alreadyAdded = true; if (!alreadyAdded) - screenHooks.cloth$getChildren().add(ScreenHelper.getLastOverlay(true, false)); - }); - ClothClientHooks.SCREEN_RENDER_POST.register((matrices, minecraftClient, screen, i, i1, v) -> { - if (shouldReturn(screen)) - return; - ScreenHelper.getLastOverlay().render(matrices, i, i1, v); - }); - ClothClientHooks.SCREEN_MOUSE_DRAGGED.register((minecraftClient, screen, v, v1, i, v2, v3) -> { - if (shouldReturn(screen)) - return InteractionResult.PASS; - if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseDragged(v, v1, i, v2, v3)) - return InteractionResult.SUCCESS; - return InteractionResult.PASS; + children.add(ScreenHelper.getLastOverlay(true, false)); }); - ClothClientHooks.SCREEN_MOUSE_CLICKED.register((minecraftClient, screen, v, v1, i) -> { + ClientScreenInputEvent.MOUSE_CLICKED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { isLeftModePressed = true; if (ScreenHelper.getOptionalOverlay().isPresent()) if (screen instanceof CreativeModeInventoryScreen) - if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseClicked(v, v1, i)) { + if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseClicked(mouseX, mouseY, button)) { screen.setFocused(ScreenHelper.getLastOverlay()); - if (i == 0) + if (button == 0) screen.setDragging(true); return InteractionResult.SUCCESS; } return InteractionResult.PASS; }); - ClothClientHooks.SCREEN_MOUSE_RELEASED.register((minecraftClient, screen, v, v1, i) -> { + ClientScreenInputEvent.KEY_RELEASED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { isLeftModePressed = false; if (shouldReturn(screen)) return InteractionResult.PASS; if (ScreenHelper.getOptionalOverlay().isPresent()) - if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseReleased(v, v1, i)) { + if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseReleased(mouseX, mouseY, button)) { return InteractionResult.SUCCESS; } return InteractionResult.PASS; }); - ClothClientHooks.SCREEN_MOUSE_SCROLLED.register((minecraftClient, screen, v, v1, v2) -> { + ClientScreenInputEvent.MOUSE_SCROLLED_PRE.register((minecraftClient, screen, mouseX, mouseY, amount) -> { if (shouldReturn(screen)) return InteractionResult.PASS; - if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseScrolled(v, v1, v2)) + if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseScrolled(mouseX, mouseY, amount)) return InteractionResult.SUCCESS; return InteractionResult.PASS; }); - ClothClientHooks.SCREEN_CHAR_TYPED.register((minecraftClient, screen, character, keyCode) -> { + ClientScreenInputEvent.CHAR_TYPED_PRE.register((minecraftClient, screen, character, keyCode) -> { if (shouldReturn(screen)) return InteractionResult.PASS; if (ScreenHelper.getLastOverlay().charTyped(character, keyCode)) return InteractionResult.SUCCESS; return InteractionResult.PASS; }); - ClothClientHooks.SCREEN_LATE_RENDER.register((matrices, minecraftClient, screen, i, i1, v) -> { + GuiEvent.RENDER_POST.register((screen, matrices, mouseX, mouseY, delta) -> { if (shouldReturn(screen)) return; + ScreenHelper.getLastOverlay().render(matrices, mouseX, mouseY, delta); if (!ScreenHelper.isOverlayVisible()) return; - ScreenHelper.getLastOverlay().lateRender(matrices, i, i1, v); + ScreenHelper.getLastOverlay().lateRender(matrices, mouseX, mouseY, delta); + }); + ClientScreenInputEvent.MOUSE_DRAGGED_PRE.register((minecraftClient, screen, mouseX1, mouseY1, button, mouseX2, mouseY2) -> { + if (shouldReturn(screen)) + return InteractionResult.PASS; + if (screen instanceof AbstractContainerScreen && ScreenHelper.getLastOverlay().mouseDragged(mouseX1, mouseY1, button, mouseX2, mouseY2)) + return InteractionResult.SUCCESS; + return InteractionResult.PASS; }); - ClothClientHooks.SCREEN_KEY_PRESSED.register((minecraftClient, screen, i, i1, i2) -> { + ClientScreenInputEvent.KEY_PRESSED_PRE.register((minecraftClient, screen, i, i1, i2) -> { if (shouldReturn(screen)) return InteractionResult.PASS; if (screen instanceof AbstractContainerScreen && ConfigObject.getInstance().doesDisableRecipeBook() && ConfigObject.getInstance().doesFixTabCloseContainer()) diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java index 84c9c3c29..4e933ac7a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsInitializer.java @@ -39,7 +39,6 @@ public class RoughlyEnoughItemsInitializer implements ModInitializer, ClientModI checkRequiredFabricModules(); if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { checkClothConfig(); - checkModMenu(); } if (RoughlyEnoughItemsState.getErrors().isEmpty()) { @@ -51,6 +50,7 @@ public class RoughlyEnoughItemsInitializer implements ModInitializer, ClientModI public void onInitializeClient() { if (RoughlyEnoughItemsState.getErrors().isEmpty()) { initializeEntryPoint("me.shedaniel.rei.RoughlyEnoughItemsCore"); + initializeEntryPoint("me.shedaniel.rei.REIModMenuEntryPoint"); initializeEntryPoint("me.shedaniel.rei.impl.ClientHelperImpl"); initializeEntryPoint("me.shedaniel.rei.impl.ScreenHelper"); } @@ -107,17 +107,4 @@ public class RoughlyEnoughItemsInitializer implements ModInitializer, ClientModI 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 e1827b6a8..24310961e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -25,9 +25,9 @@ package me.shedaniel.rei; import com.google.common.collect.Lists; import io.netty.buffer.Unpooled; +import me.shedaniel.architectury.networking.NetworkManager; import me.shedaniel.rei.api.server.InputSlotCrafter; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.ChatFormatting; import net.minecraft.Util; @@ -35,6 +35,7 @@ import net.minecraft.core.NonNullList; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -55,34 +56,38 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { @Override public void onInitialize() { FabricLoader.getInstance().getEntrypoints("rei_containers", Runnable.class).forEach(Runnable::run); - ServerPlayNetworking.registerGlobalReceiver(DELETE_ITEMS_PACKET, (server, player, handler, buf, responseSender) -> { + NetworkManager.registerReceiver(NetworkManager.c2s(), DELETE_ITEMS_PACKET, (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); 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); + if (!player.inventory.getCarried().isEmpty()) { + player.inventory.setCarried(ItemStack.EMPTY); player.broadcastCarriedItem(); } }); - ServerPlayNetworking.registerGlobalReceiver(CREATE_ITEMS_PACKET, (server, player, handler, buf, responseSender) -> { + NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_PACKET, (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); 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 + if (player.inventory.add(stack.copy())) { + NetworkManager.sendToPlayer(player, 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) -> { + NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_GRAB_PACKET, (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); 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(); + Inventory inventory = player.inventory; ItemStack itemStack = buf.readItem(); ItemStack stack = itemStack.copy(); if (!inventory.getCarried().isEmpty() && ItemStack.isSameIgnoreDurability(inventory.getCarried(), stack) && ItemStack.tagMatches(inventory.getCarried(), stack)) { @@ -92,9 +97,10 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { } inventory.setCarried(stack.copy()); player.broadcastCarriedItem(); - responseSender.sendPacket(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); + NetworkManager.sendToPlayer(player, 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) -> { + NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, (packetByteBuf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); ResourceLocation category = packetByteBuf.readResourceLocation(); AbstractContainerMenu container = player.containerMenu; InventoryMenu playerContainer = player.inventoryMenu; @@ -123,7 +129,7 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { buf.writeItem(stack); } } - responseSender.sendPacket(NOT_ENOUGH_ITEMS_PACKET, buf); + NetworkManager.sendToPlayer(player, NOT_ENOUGH_ITEMS_PACKET, buf); } catch (IllegalStateException e) { player.sendMessage(new TranslatableComponent(e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); } catch (Exception e) { 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 8fedbff04..a54845f60 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.registry.EntryRegistry; +import me.shedaniel.rei.api.registry.entry.EntryRegistry; import me.shedaniel.rei.api.ingredient.EntryStack; import me.shedaniel.rei.api.REIHelper; import me.shedaniel.rei.api.gui.widgets.Tooltip; @@ -195,7 +195,7 @@ public class FilteringScreen extends Screen { Matrix4f matrix = matrices.last().pose(); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); float float_1 = 32.0F; - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.begin(7, DefaultVertexFormat.POSITION_TEX_COLOR); buffer.vertex(matrix, 0, y2, 0.0F).uv(0.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y2, 0.0F).uv(this.width / 32.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y1, 0.0F).uv(this.width / 32.0F, y1 / 32.0F).color(tint, tint, tint, alpha1).endVertex(); @@ -247,7 +247,7 @@ public class FilteringScreen extends Screen { RenderSystem.shadeModel(7425); RenderSystem.disableTexture(); Matrix4f matrix = matrices.last().pose(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.begin(7, DefaultVertexFormat.POSITION_TEX_COLOR); buffer.vertex(matrix, 0, bounds.y + 4, 0.0F).uv(0.0F, 1.0F).color(0, 0, 0, 0).endVertex(); buffer.vertex(matrix, width, bounds.y + 4, 0.0F).uv(1.0F, 1.0F).color(0, 0, 0, 0).endVertex(); buffer.vertex(matrix, width, bounds.y, 0.0F).uv(1.0F, 0.0F).color(0, 0, 0, 255).endVertex(); 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 9d130bf36..9f8504650 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.DisplayRegistry; +import me.shedaniel.rei.api.plugins.PluginManager; import me.shedaniel.rei.gui.ConfigReloadingScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; @@ -48,10 +48,11 @@ 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 (DisplayRegistry.getInstance().arePluginsLoading()) { + if (PluginManager.getInstance().arePluginsReloading()) { Minecraft.getInstance().setScreen(new ConfigReloadingScreen(Minecraft.getInstance().screen)); - } else + } else { super.render(matrices, mouseX, mouseY, delta); + } } }; private List children = ImmutableList.of(buttonWidget); 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 53f8bc22a..09d126001 100644 --- a/runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java @@ -27,7 +27,6 @@ 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.DisplayRegistry; import me.shedaniel.rei.api.fluid.FluidSupportProvider; import me.shedaniel.rei.api.ingredient.util.EntryStacks; import me.shedaniel.rei.api.plugins.REIPlugin; @@ -37,8 +36,8 @@ import java.util.stream.Stream; public class LBASupportPlugin implements REIPlugin { @Override - public void registerOthers(DisplayRegistry registry) { - FluidSupportProvider.getInstance().registerProvider(entry -> { + public void registerFluidSupport(FluidSupportProvider support) { + support.register(entry -> { GroupedFluidInvView view = FluidAttributes.GROUPED_INV_VIEW.get(entry.getValue()); if (view.getStoredFluids().size() > 0) return InteractionResultHolder.success(view.getStoredFluids().stream() 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 f4a3e454d..56c124e92 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.DisplayRegistry; +import me.shedaniel.rei.api.plugins.PluginManager; 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 (!DisplayRegistry.getInstance().arePluginsLoading()) + if (!PluginManager.getInstance().arePluginsReloading()) 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 3e37d0861..a63d38459 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -40,10 +40,14 @@ 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.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.registry.display.DisplayRegistry; +import me.shedaniel.rei.api.registry.screen.ClickArea; +import me.shedaniel.rei.api.registry.screen.DisplayBoundsProvider; +import me.shedaniel.rei.api.registry.screen.OverlayDecider; +import me.shedaniel.rei.api.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.util.ImmutableLiteralText; +import me.shedaniel.rei.api.view.ViewSearchBuilder; import me.shedaniel.rei.gui.modules.Menu; import me.shedaniel.rei.gui.modules.entries.GameModeMenuEntry; import me.shedaniel.rei.gui.modules.entries.WeatherMenuEntry; @@ -222,7 +226,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl if (ConfigObject.getInstance().isFavoritesEnabled()) { if (favoritesListWidget == null) favoritesListWidget = new FavoritesListWidget(); -// favoritesListWidget.favoritePanel.resetRows(); + favoritesListWidget.favoritePanel.resetRows(); widgets.add(favoritesListWidget); } ENTRY_LIST_WIDGET.updateArea(ScreenHelper.getSearchField() == null ? "" : ScreenHelper.getSearchField().getText()); @@ -457,9 +461,9 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl return getBottomSideSearchFieldArea(widthRemoved); default: case CENTER: { - for (OverlayDecider decider : ScreenRegistry.getInstance().getSortedOverlayDeciders(Minecraft.getInstance().screen.getClass())) { - if (decider instanceof ScreenRegistry.DisplayBoundsProvider) { - Rectangle containerBounds = ((ScreenRegistry.DisplayBoundsProvider) decider).getScreenBounds(Minecraft.getInstance().screen); + for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen.getClass())) { + if (decider instanceof DisplayBoundsProvider) { + Rectangle containerBounds = ((DisplayBoundsProvider) decider).getScreenBounds(Minecraft.getInstance().screen); return getBottomCenterSearchFieldArea(containerBounds, widthRemoved); } } @@ -513,7 +517,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText(), true); init(); } else { - for (OverlayDecider decider : ScreenRegistry.getInstance().getSortedOverlayDeciders(minecraft.screen.getClass())) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(minecraft.screen.getClass())) { if (decider != null && decider.shouldRecalculateArea(ConfigObject.getInstance().getDisplayPanelLocation(), bounds)) { init(); break; @@ -542,9 +546,8 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); this.renderWidgets(matrices, mouseX, mouseY, delta); if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { - List categories = null; Screen screen = Minecraft.getInstance().screen; - ClickAreaHandler.ClickAreaContext context = new ClickAreaHandler.ClickAreaContext() { + ClickArea.ClickAreaContext context = new ClickArea.ClickAreaContext() { @Override public Screen getScreen() { return screen; @@ -555,16 +558,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl return new Point(mouseX, mouseY); } }; - 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()) { - if (categories == null) { - categories = result.getCategories().collect(Collectors.toList()); - } else categories.addAll(result.getCategories().collect(Collectors.toList())); - } - } - } + Set categories = ScreenRegistry.getInstance().handleClickArea((Class) screen.getClass(), context); if (categories != null && !categories.isEmpty()) { 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(); @@ -682,13 +676,13 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ScreenHelper.toggleOverlayVisible(); return true; } - EntryStack stack = DisplayRegistry.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); + EntryStack stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen); if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) { - return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); + return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); } else if (ConfigObject.getInstance().getUsageKeybind().matchesKey(keyCode, scanCode)) { - return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); + return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) @@ -735,13 +729,13 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ScreenHelper.toggleOverlayVisible(); return true; } - EntryStack stack = DisplayRegistry.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); + EntryStack stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen); if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) { - return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); + return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); } else if (ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) { - return ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); + return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) @@ -768,31 +762,21 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl } } if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { - List categories = null; Screen screen = Minecraft.getInstance().screen; - ClickAreaHandler.ClickAreaContext context = new ClickAreaHandler.ClickAreaContext() { + ClickArea.ClickAreaContext context = new ClickArea.ClickAreaContext() { @Override public Screen getScreen() { return screen; } - + @Override public Point getMousePosition() { return new Point(mouseX, mouseY); } }; - 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()) { - if (categories == null) { - categories = result.getCategories().collect(Collectors.toList()); - } else categories.addAll(result.getCategories().collect(Collectors.toList())); - } - } - } + Set categories = ScreenRegistry.getInstance().handleClickArea((Class) screen.getClass(), context); if (categories != null && !categories.isEmpty()) { - ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addCategories(categories).fillPreferredOpenedCategory()); + ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addCategories(categories).fillPreferredOpenedCategory()); Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); return true; } @@ -828,7 +812,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl } public boolean isNotInExclusionZones(double mouseX, double mouseY) { - for (OverlayDecider decider : ScreenRegistry.getInstance().getSortedOverlayDeciders(Minecraft.getInstance().screen.getClass())) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(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/DelegateScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/DelegateScreen.java index 485c09976..0b50f0f0c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/DelegateScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/DelegateScreen.java @@ -256,17 +256,25 @@ public class DelegateScreen extends Screen { } } + private boolean init = true; + @Override public void init(Minecraft minecraft, int i, int j) { if (parent != null) { parent.init(minecraft, i, j); } + init = false; + super.init(minecraft, i, j); } @Override public void init() { if (parent != null) { - parent.init(); + if (init) { + super.init(); + } else { + init = true; + } } } 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 ef265916a..4fd96d390 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -36,13 +36,15 @@ import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; import me.shedaniel.rei.api.ingredient.EntryIngredient; import me.shedaniel.rei.api.ingredient.EntryStack; -import me.shedaniel.rei.api.registry.CategoryRegistry; +import me.shedaniel.rei.api.registry.category.CategoryRegistry; import me.shedaniel.rei.api.registry.display.Display; import me.shedaniel.rei.api.registry.display.DisplayCategory; +import me.shedaniel.rei.api.registry.display.DisplayRegistry; import me.shedaniel.rei.api.util.ImmutableLiteralText; import me.shedaniel.rei.api.gui.widgets.Button; import me.shedaniel.rei.api.gui.widgets.Panel; import me.shedaniel.rei.api.gui.widgets.Widgets; +import me.shedaniel.rei.api.view.ViewSearchBuilder; import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.RecipeChoosePageWidget; import me.shedaniel.rei.gui.widget.TabWidget; @@ -262,7 +264,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { 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), selectedCategory.getTitle(), clickableLabelWidget -> { - ClientHelper.getInstance().openView(ClientHelper.ViewSearchBuilder.builder().addAllCategories().fillPreferredOpenedCategory()); + ClientHelper.getInstance().openView(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")) .onClick(button -> { @@ -313,7 +315,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { tab.setRenderer(categories.get(j), categories.get(j).getIcon(), categories.get(j).getTitle(), tab.getId() + categoryPages * tabsPerPage == categories.indexOf(selectedCategory)); } } - Optional supplier = DisplayRegistry.getInstance().getAutoCraftButtonArea(selectedCategory); + Optional supplier = CategoryRegistry.getInstance().get(selectedCategory.getIdentifier()).getPlusButtonArea(); int recipeHeight = selectedCategory.getDisplayHeight(); List currentDisplayed = getCurrentDisplayed(); for (int i = 0; i < currentDisplayed.size(); i++) { @@ -335,18 +337,18 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { recipeChoosePageWidget = null; workingStationsBaseWidget = null; - List workingStations = CategoryRegistry.getInstance().getWorkingStations(selectedCategory.getIdentifier()); - if (!workingStations.isEmpty()) { + List workstations = CategoryRegistry.getInstance().get(selectedCategory.getIdentifier()).getWorkstations(); + if (!workstations.isEmpty()) { int hh = Mth.floor((bounds.height - 16) / 18f); - int actualHeight = Math.min(hh, workingStations.size()); - int innerWidth = Mth.ceil(workingStations.size() / ((float) hh)); + int actualHeight = Math.min(hh, workstations.size()); + int innerWidth = Mth.ceil(workstations.size() / ((float) hh)); int xx = bounds.x - (8 + innerWidth * 16) + 6; int yy = bounds.y + 16; preWidgets.add(workingStationsBaseWidget = Widgets.createCategoryBase(new Rectangle(xx - 5, yy - 5, 15 + innerWidth * 16, 10 + actualHeight * 16))); preWidgets.add(Widgets.createSlotBase(new Rectangle(xx - 1, yy - 1, innerWidth * 16 + 2, actualHeight * 16 + 2))); int index = 0; xx += (innerWidth - 1) * 16; - for (EntryIngredient workingStation : workingStations) { + for (EntryIngredient workingStation : workstations) { preWidgets.add(new WorkstationSlotWidget(xx, yy, workingStation)); index++; yy += 16; diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/SearchFilterSyntaxHighlightingScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/SearchFilterSyntaxHighlightingScreen.java index 0ecdbcd6f..9a51d055d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/SearchFilterSyntaxHighlightingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/SearchFilterSyntaxHighlightingScreen.java @@ -1,3 +1,26 @@ +/* + * 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.gui; import com.mojang.blaze3d.systems.RenderSystem; @@ -29,7 +52,7 @@ public class SearchFilterSyntaxHighlightingScreen extends Screen { Matrix4f matrix = matrices.last().pose(); RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); float float_1 = 32.0F; - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); + buffer.begin(7, DefaultVertexFormat.POSITION_TEX_COLOR); buffer.vertex(matrix, 0, y2, 0.0F).uv(0.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y2, 0.0F).uv(this.width / 32.0F, y2 / 32.0F).color(tint, tint, tint, alpha2).endVertex(); buffer.vertex(matrix, this.width, y1, 0.0F).uv(this.width / 32.0F, y1 / 32.0F).color(tint, tint, tint, alpha1).endVertex(); 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 c081fcec4..b0fa98da7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -35,13 +35,15 @@ import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; import me.shedaniel.rei.api.ingredient.EntryIngredient; import me.shedaniel.rei.api.ingredient.EntryStack; -import me.shedaniel.rei.api.registry.CategoryRegistry; +import me.shedaniel.rei.api.registry.category.CategoryRegistry; import me.shedaniel.rei.api.registry.display.Display; import me.shedaniel.rei.api.registry.display.DisplayCategory; import me.shedaniel.rei.api.gui.widgets.Button; import me.shedaniel.rei.api.gui.widgets.Tooltip; import me.shedaniel.rei.api.gui.widgets.Widgets; import me.shedan