From 1f6137d24153b62c42da129ce5d6373bbf78ee34 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 14 Dec 2020 00:10:26 +0800 Subject: The big refactor Signed-off-by: shedaniel --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 123 ++++--- .../shedaniel/rei/RoughlyEnoughItemsNetwork.java | 28 +- .../me/shedaniel/rei/RoughlyEnoughItemsState.java | 4 +- .../me/shedaniel/rei/compat/LBASupportPlugin.java | 10 +- .../shedaniel/rei/gui/ConfigReloadingScreen.java | 4 +- .../shedaniel/rei/gui/ContainerScreenOverlay.java | 9 +- .../java/me/shedaniel/rei/gui/RecipeScreen.java | 4 +- .../me/shedaniel/rei/gui/RecipeViewingScreen.java | 27 +- .../me/shedaniel/rei/gui/TransformingScreen.java | 8 + .../rei/gui/VillagerRecipeViewingScreen.java | 22 +- .../rei/gui/config/entry/FilteringEntry.java | 3 +- .../rei/gui/config/entry/FilteringScreen.java | 6 +- .../java/me/shedaniel/rei/gui/modules/Menu.java | 19 +- .../entries/EntryStackSubsetsMenuEntry.java | 9 +- .../gui/modules/entries/SubSubsetsMenuEntry.java | 9 +- .../rei/gui/plugin/DefaultRuntimePlugin.java | 65 ++-- .../rei/gui/plugin/entry/FluidEntryDefinition.java | 172 +++++++++ .../rei/gui/plugin/entry/ItemEntryDefinition.java | 273 ++++++++++++++ .../rei/gui/widget/EntryListEntryWidget.java | 31 +- .../shedaniel/rei/gui/widget/EntryListWidget.java | 75 ++-- .../me/shedaniel/rei/gui/widget/EntryWidget.java | 17 +- .../rei/gui/widget/FavoritesListWidget.java | 20 +- .../me/shedaniel/rei/gui/widget/TabWidget.java | 19 +- .../me/shedaniel/rei/impl/AbstractEntryStack.java | 60 ++- .../rei/impl/AmountIgnoredEntryStackWrapper.java | 9 +- .../me/shedaniel/rei/impl/ClientHelperImpl.java | 83 +++-- .../me/shedaniel/rei/impl/ConfigManagerImpl.java | 3 +- .../me/shedaniel/rei/impl/ConfigObjectImpl.java | 4 +- .../me/shedaniel/rei/impl/EmptyEntryStack.java | 159 -------- .../me/shedaniel/rei/impl/EntryRegistryImpl.java | 32 +- .../me/shedaniel/rei/impl/EntryTypeDeferred.java | 43 +++ .../shedaniel/rei/impl/EntryTypeRegistryImpl.java | 60 +++ .../me/shedaniel/rei/impl/FluidEntryStack.java | 237 ------------ .../rei/impl/FluidSupportProviderImpl.java | 19 +- .../java/me/shedaniel/rei/impl/IssuesDetector.java | 72 ++++ .../java/me/shedaniel/rei/impl/ItemEntryStack.java | 407 --------------------- .../me/shedaniel/rei/impl/OptimalEntryStack.java | 54 --- .../me/shedaniel/rei/impl/RecipeHelperImpl.java | 119 +++--- .../java/me/shedaniel/rei/impl/ScreenHelper.java | 2 +- .../me/shedaniel/rei/impl/TypedEntryStack.java | 97 +++++ .../rei/impl/entry/EmptyEntryDefinition.java | 112 ++++++ .../rei/impl/filtering/FilteringContext.java | 8 +- .../rei/impl/filtering/FilteringContextImpl.java | 6 +- .../rei/impl/filtering/FilteringResult.java | 10 +- .../rei/impl/filtering/FilteringResultImpl.java | 2 +- .../impl/filtering/rules/ManualFilteringRule.java | 8 +- .../impl/filtering/rules/SearchFilteringRule.java | 14 +- .../rei/impl/search/AlwaysMatchingArgument.java | 2 +- .../me/shedaniel/rei/impl/search/Argument.java | 2 +- .../me/shedaniel/rei/impl/search/ModArgument.java | 2 +- .../shedaniel/rei/impl/search/RegexArgument.java | 2 +- .../me/shedaniel/rei/impl/search/TagArgument.java | 12 +- .../me/shedaniel/rei/impl/search/TextArgument.java | 2 +- .../shedaniel/rei/impl/search/TooltipArgument.java | 2 +- .../rei/impl/subsets/SubsetsRegistryImpl.java | 20 +- .../autocrafting/DefaultCategoryHandler.java | 28 +- .../shedaniel/rei/tests/plugin/REITestPlugin.java | 9 +- 57 files changed, 1328 insertions(+), 1330 deletions(-) create mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/FluidEntryDefinition.java create mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/plugin/entry/ItemEntryDefinition.java delete mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java create mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/EntryTypeDeferred.java create mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/EntryTypeRegistryImpl.java delete mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java create mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/IssuesDetector.java delete mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java delete mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/OptimalEntryStack.java create mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/TypedEntryStack.java create mode 100644 RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/impl/entry/EmptyEntryDefinition.java (limited to 'RoughlyEnoughItems-runtime/src/main/java') diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index fb2728932..93055513f 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -34,11 +34,11 @@ 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.entry.*; 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.fractions.Fraction; import me.shedaniel.rei.api.plugins.REIPluginV0; import me.shedaniel.rei.api.subsets.SubsetsRegistry; import me.shedaniel.rei.api.widgets.*; @@ -47,13 +47,14 @@ import me.shedaniel.rei.gui.widget.EntryWidget; import me.shedaniel.rei.gui.widget.QueuedTooltip; import me.shedaniel.rei.gui.widget.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.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.network.ClientSidePacketRegistry; +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; @@ -74,6 +75,7 @@ import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.GsonHelper; +import net.minecraft.util.Unit; import net.minecraft.world.InteractionResult; import net.minecraft.world.inventory.CraftingMenu; import net.minecraft.world.inventory.Slot; @@ -81,18 +83,15 @@ 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 net.minecraft.world.level.material.Fluid; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.BiFunction; @@ -112,6 +111,16 @@ 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)) { + return BuiltinEntryTypes.EMPTY; + } else if (id.equals(BuiltinEntryTypes.RENDERING_ID)) { + return BuiltinEntryTypes.RENDERING; + } + return typeCache.computeIfAbsent(id, EntryTypeDeferred::new); + }, "entryTypeDeferred"); attachInstance(new RecipeHelperImpl(), RecipeHelper.class); attachInstance(new EntryRegistryImpl(), EntryRegistry.class); attachInstance(new DisplayHelperImpl(), DisplayHelper.class); @@ -119,23 +128,43 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { attachInstance(new SubsetsRegistryImpl(), SubsetsRegistry.class); attachInstance(new Internals.EntryStackProvider() { @Override - public EntryStack empty() { - return EmptyEntryStack.EMPTY; + public EntryStack empty() { + return TypedEntryStack.EMPTY; } @Override - public EntryStack fluid(Fluid fluid) { - return new FluidEntryStack(fluid); + public EntryStack of(EntryDefinition definition, T value) { + return new TypedEntryStack<>(definition, value); } @Override - public EntryStack fluid(Fluid fluid, Fraction amount) { - return new FluidEntryStack(fluid, amount); + public EntryType emptyType(ResourceLocation id) { + return new EntryType() { + @Override + public @NotNull ResourceLocation getId() { + return id; + } + + @Override + public @NotNull EntryDefinition getDefinition() { + return EmptyEntryDefinition.EMPTY; + } + }; } @Override - public EntryStack item(ItemStack stack) { - return new ItemEntryStack(stack); + public EntryType renderingType(ResourceLocation id) { + return new EntryType() { + @Override + public @NotNull ResourceLocation getId() { + return id; + } + + @Override + public @NotNull EntryDefinition getDefinition() { + return EmptyEntryDefinition.RENDERING; + } + }; } }, Internals.EntryStackProvider.class); attachInstance(new Internals.WidgetsProvider() { @@ -201,12 +230,12 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } return Objects.requireNonNull(entry).getUnwrapped(); } - + @Override public UUID getUuid() { return getUnwrapped().getUuid(); } - + @Override public boolean isInvalid() { try { @@ -217,20 +246,20 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } @Override - public EntryStack getWidget(boolean showcase) { - return getUnwrapped().getWidget(showcase); + public Renderer getRenderer(boolean showcase) { + return getUnwrapped().getRenderer(showcase); } @Override public boolean doAction(int button) { return getUnwrapped().doAction(button); } - + @Override public @NotNull Optional>> getMenuEntries() { return getUnwrapped().getMenuEntries(); } - + @Override public int hashIgnoreAmount() { return getUnwrapped().hashIgnoreAmount(); @@ -338,7 +367,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { } public static boolean canUsePackets() { - return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); + return ClientPlayNetworking.canSend(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientPlayNetworking.canSend(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && ClientPlayNetworking.canSend(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); } @ApiStatus.Internal @@ -372,7 +401,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { public void onInitializeClient() { attachInstance(new ConfigManagerImpl(), ConfigManager.class); - detectFabricLoader(); + IssuesDetector.detect(); registerClothEvents(); discoverPluginEntries(); for (ModContainer modContainer : FabricLoader.getInstance().getAllMods()) { @@ -382,12 +411,14 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { RoughlyEnoughItemsState.checkRequiredFabricModules(); Executor.run(() -> () -> { - ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (packetContext, packetByteBuf) -> { - ItemStack stack = packetByteBuf.readItem(); - String player = packetByteBuf.readUtf(32767); - packetContext.getPlayer().displayClientMessage(new TextComponent(I18n.get("text.rei.cheat_items").replaceAll("\\{item_name}", EntryStack.create(stack.copy()).asFormattedText().getString()).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false); + 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); + } }); - ClientSidePacketRegistry.INSTANCE.register(RoughlyEnoughItemsNetwork.NOT_ENOUGH_ITEMS_PACKET, (packetContext, packetByteBuf) -> { + 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(); @@ -395,12 +426,12 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { ghostSlots.clear(); List> input = Lists.newArrayList(); - int mapSize = packetByteBuf.readInt(); + int mapSize = buf.readInt(); for (int i = 0; i < mapSize; i++) { List list = Lists.newArrayList(); - int count = packetByteBuf.readInt(); + int count = buf.readInt(); for (int j = 0; j < count; j++) { - list.add(packetByteBuf.readItem()); + list.add(buf.readItem()); } input.add(list); } @@ -419,36 +450,6 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { }); } - private void detectFabricLoader() { - Executor.run(() -> () -> { - try { - FabricLoader instance = FabricLoader.getInstance(); - for (Field field : instance.getClass().getDeclaredFields()) { - if (Logger.class.isAssignableFrom(field.getType())) { - field.setAccessible(true); - Logger logger = (Logger) field.get(instance); - if (logger.getName().toLowerCase(Locale.ROOT).contains("subsystem")) { - File reiConfigFolder = new File(instance.getConfigDirectory(), "roughlyenoughitems"); - File ignoreFile = new File(reiConfigFolder, ".ignoresubsystem"); - if (!ignoreFile.exists()) { - RoughlyEnoughItemsState.warn("Subsystem is detected (probably though Aristois), please contact support from them if anything happens."); - RoughlyEnoughItemsState.onContinue(() -> { - try { - reiConfigFolder.mkdirs(); - ignoreFile.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - }); - } - } - } - } - } catch (Throwable ignored) { - } - }); - } - private void discoverPluginEntries() { for (REIPluginEntry reiPlugin : FabricLoader.getInstance().getEntrypoints("rei_plugins", REIPluginEntry.class)) { try { @@ -497,7 +498,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer { for (OverlayDecider decider : DisplayHelper.getInstance().getAllOverlayDeciders()) { if (!decider.isHandingScreen(screen)) continue; - InteractionResult result = decider.shouldScreenBeOverlayed(screen); + InteractionResult result = decider.shouldScreenBeOverlaid(screen); if (result != InteractionResult.PASS) return result == InteractionResult.FAIL || REIHelper.getInstance().getPreviousContainerScreen() == null; } diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 145795eda..7d73ac6c3 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -28,7 +28,7 @@ import io.netty.buffer.Unpooled; import me.shedaniel.math.api.Executor; import me.shedaniel.rei.server.InputSlotCrafter; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.network.ServerSidePacketRegistry; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.ChatFormatting; import net.minecraft.Util; @@ -36,7 +36,6 @@ 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; @@ -47,7 +46,6 @@ import net.minecraft.world.item.ItemStack; import java.util.List; public class RoughlyEnoughItemsNetwork implements ModInitializer { - public static final ResourceLocation DELETE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "delete_item"); public static final ResourceLocation CREATE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "create_item"); public static final ResourceLocation CREATE_ITEMS_GRAB_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_grab"); @@ -60,8 +58,7 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { RoughlyEnoughItemsState.checkRequiredFabricModules(); Executor.run(() -> () -> { FabricLoader.getInstance().getEntrypoints("rei_containers", Runnable.class).forEach(Runnable::run); - ServerSidePacketRegistry.INSTANCE.register(DELETE_ITEMS_PACKET, (packetContext, packetByteBuf) -> { - ServerPlayer player = (ServerPlayer) packetContext.getPlayer(); + 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; @@ -71,27 +68,25 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { player.broadcastCarriedItem(); } }); - ServerSidePacketRegistry.INSTANCE.register(CREATE_ITEMS_PACKET, (packetContext, packetByteBuf) -> { - ServerPlayer player = (ServerPlayer) packetContext.getPlayer(); + 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 = packetByteBuf.readItem(); + ItemStack stack = buf.readItem(); if (player.getInventory().add(stack.copy())) { - ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); + 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); }); - ServerSidePacketRegistry.INSTANCE.register(CREATE_ITEMS_GRAB_PACKET, (packetContext, packetByteBuf) -> { - ServerPlayer player = (ServerPlayer) packetContext.getPlayer(); + 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 = packetByteBuf.readItem(); + 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())); @@ -100,11 +95,10 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { } inventory.setCarried(stack.copy()); player.broadcastCarriedItem(); - ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); + responseSender.sendPacket(RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); }); - ServerSidePacketRegistry.INSTANCE.register(MOVE_ITEMS_PACKET, (packetContext, packetByteBuf) -> { + ServerPlayNetworking.registerGlobalReceiver(MOVE_ITEMS_PACKET, (server, player, handler, packetByteBuf, responseSender) -> { ResourceLocation category = packetByteBuf.readResourceLocation(); - ServerPlayer player = (ServerPlayer) packetContext.getPlayer(); AbstractContainerMenu container = player.containerMenu; InventoryMenu playerContainer = player.inventoryMenu; try { @@ -132,9 +126,7 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer { buf.writeItem(stack); } } - if (ServerSidePacketRegistry.INSTANCE.canPlayerReceive(player, NOT_ENOUGH_ITEMS_PACKET)) { - ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, NOT_ENOUGH_ITEMS_PACKET, buf); - } + 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) { diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java index 15430e858..9378fafaf 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsState.java @@ -62,14 +62,14 @@ public class RoughlyEnoughItemsState { ImmutableSet.builder() .add("fabric-api-base") .add("fabric-resource-loader-v0") - .add("fabric-networking-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-v0") + .add("fabric-networking-api-v1") .add("fabric-lifecycle-events-v1") .build(); for (String module : requiredModules) { diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java index d2e31a6f7..5e227d603 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/compat/LBASupportPlugin.java @@ -26,10 +26,10 @@ package me.shedaniel.rei.compat; 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.rei.api.EntryStack; +import me.shedaniel.architectury.utils.Fraction; import me.shedaniel.rei.api.RecipeHelper; +import me.shedaniel.rei.api.entry.EntryStacks; import me.shedaniel.rei.api.fluid.FluidSupportProvider; -import me.shedaniel.rei.api.fractions.Fraction; import me.shedaniel.rei.api.plugins.REIPluginV0; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResultHolder; @@ -44,14 +44,14 @@ public class LBASupportPlugin implements REIPluginV0 { @Override public void registerOthers(RecipeHelper recipeHelper) { - FluidSupportProvider.getInstance().registerProvider(itemStack -> { - GroupedFluidInvView view = FluidAttributes.GROUPED_INV_VIEW.get(itemStack.getItemStack()); + FluidSupportProvider.getInstance().registerProvider(entry -> { + GroupedFluidInvView view = FluidAttributes.GROUPED_INV_VIEW.get(entry.getValue()); if (view.getStoredFluids().size() > 0) return InteractionResultHolder.success(view.getStoredFluids().stream() .filter(fluidKey -> !fluidKey.isEmpty() && fluidKey.getRawFluid() != null) .map(fluidKey -> { FluidAmount amount = view.getAmount_F(fluidKey); - return EntryStack.create(fluidKey.getRawFluid(), Fraction.of(amount.whole, amount.numerator, amount.denominator)); + return EntryStacks.of(fluidKey.getRawFluid(), Fraction.of(amount.whole, amount.numerator, amount.denominator)); })); return InteractionResultHolder.pass(Stream.empty()); }); diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java index 813494c26..68479589b 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ConfigReloadingScreen.java @@ -51,7 +51,7 @@ public class ConfigReloadingScreen extends Screen { this.renderDirtBackground(0); if (!RecipeHelper.getInstance().arePluginsLoading()) minecraft.setScreen(parent); - this.drawCenteredString(matrices, this.font, I18n.get("text.rei.config.is.reloading"), this.width / 2, this.height / 2 - 50, 16777215); + drawCenteredString(matrices, this.font, I18n.get("text.rei.config.is.reloading"), this.width / 2, this.height / 2 - 50, 16777215); String string_3; switch ((int) (Util.getMillis() / 300L % 4L)) { case 0: @@ -65,7 +65,7 @@ public class ConfigReloadingScreen extends Screen { case 2: string_3 = "o o O"; } - this.drawCenteredString(matrices, this.font, string_3, this.width / 2, this.height / 2 - 41, 8421504); + drawCenteredString(matrices, this.font, string_3, this.width / 2, this.height / 2 - 41, 8421504); super.render(matrices, int_1, int_2, float_1); } } diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java index 55c702c71..3dbaf62c6 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java @@ -35,6 +35,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.*; +import me.shedaniel.rei.api.entry.EntryStacks; import me.shedaniel.rei.api.favorites.FavoriteEntry; import me.shedaniel.rei.api.widgets.Button; import me.shedaniel.rei.api.widgets.Tooltip; @@ -517,7 +518,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl } } if (ConfigManager.getInstance().isCraftableOnlyEnabled()) { - Set currentStacks = ClientHelperImpl.getInstance()._getInventoryItemsTypes(); + Set> currentStacks = ClientHelperImpl.getInstance()._getInventoryItemsTypes(); if (!currentStacks.equals(ScreenHelper.inventoryStacks)) { ScreenHelper.inventoryStacks = currentStacks; ENTRY_LIST_WIDGET.updateSearch(ScreenHelper.getSearchField().getText(), true); @@ -530,7 +531,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl AbstractContainerScreen containerScreen = (AbstractContainerScreen) Minecraft.getInstance().screen; int x = containerScreen.leftPos, y = containerScreen.topPos; for (Slot slot : containerScreen.getMenu().slots) - if (!slot.hasItem() || !ENTRY_LIST_WIDGET.canLastSearchTermsBeAppliedTo(EntryStack.create(slot.getItem()))) + if (!slot.hasItem() || !ENTRY_LIST_WIDGET.canLastSearchTermsBeAppliedTo(EntryStacks.of(slot.getItem()))) fillGradient(matrices, x + slot.x, y + slot.y, x + slot.x + 16, y + slot.y + 16, -601874400, -601874400); } matrices.popPose(); @@ -678,7 +679,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ScreenHelper.toggleOverlayVisible(); return true; } - EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); + EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) { @@ -731,7 +732,7 @@ public class ContainerScreenOverlay extends WidgetWithBounds implements REIOverl ScreenHelper.toggleOverlayVisible(); return true; } - EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); + EntryStack stack = RecipeHelper.getInstance().getScreenFocusedStack(Minecraft.getInstance().screen); if (stack != null && !stack.isEmpty()) { stack = stack.copy(); if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) { diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeScreen.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeScreen.java index 7e8239df4..034f7a6e5 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeScreen.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeScreen.java @@ -30,10 +30,10 @@ import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal public interface RecipeScreen { @ApiStatus.Internal - void addIngredientStackToNotice(EntryStack stack); + void addIngredientStackToNotice(EntryStack stack); @ApiStatus.Internal - void addResultStackToNotice(EntryStack stack); + void addResultStackToNotice(EntryStack stack); @ApiStatus.Internal ResourceLocation getCurrentCategory(); diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index c24164451..094815ffb 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -88,8 +88,8 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { @Nullable private Panel workingStationsBaseWidget; private Button recipeBack, recipeNext, categoryBack, categoryNext; - private EntryStack ingredientStackToNotice = EntryStack.empty(); - private EntryStack resultStackToNotice = EntryStack.empty(); + private EntryStack ingredientStackToNotice = EntryStack.empty(); + private EntryStack resultStackToNotice = EntryStack.empty(); public RecipeViewingScreen(Map, List> categoriesMap, @Nullable ResourceLocation category) { super(NarratorChatListener.NO_TITLE); @@ -109,23 +109,23 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { } @ApiStatus.Internal - static void transformIngredientNotice(List setupDisplay, EntryStack noticeStack) { + static void transformIngredientNotice(List setupDisplay, EntryStack noticeStack) { transformNotice(1, setupDisplay, noticeStack); } @ApiStatus.Internal - static void transformResultNotice(List setupDisplay, EntryStack noticeStack) { + static void transformResultNotice(List setupDisplay, EntryStack noticeStack) { transformNotice(2, setupDisplay, noticeStack); } - private static void transformNotice(int marker, List setupDisplay, EntryStack noticeStack) { + private static void transformNotice(int marker, List setupDisplay, EntryStack noticeStack) { if (noticeStack.isEmpty()) return; for (Widget widget : setupDisplay) { if (widget instanceof EntryWidget) { EntryWidget entry = (EntryWidget) widget; - if (entry.getNoticeMark() == marker && entry.entries().size() > 1) { - EntryStack stack = CollectionUtils.findFirstOrNullEqualsEntryIgnoreAmount(entry.entries(), noticeStack); + if (entry.getNoticeMark() == marker && entry.getEntries().size() > 1) { + EntryStack stack = CollectionUtils.findFirstOrNullEqualsEntryIgnoreAmount(entry.getEntries(), noticeStack); if (stack != null) { entry.clearStacks(); entry.entry(stack); @@ -137,13 +137,13 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { @ApiStatus.Internal @Override - public void addIngredientStackToNotice(EntryStack stack) { + public void addIngredientStackToNotice(EntryStack stack) { this.ingredientStackToNotice = stack; } @ApiStatus.Internal @Override - public void addResultStackToNotice(EntryStack stack) { + public void addResultStackToNotice(EntryStack stack) { this.resultStackToNotice = stack; } @@ -222,12 +222,11 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { int largestHeight = Math.max(height - 34 - 30, 100); int maxWidthDisplay = CollectionUtils.mapAndMax(getCurrentDisplayed(), selectedCategory::getDisplayWidth, Comparator.naturalOrder()).orElse(150); int guiWidth = Math.max(maxWidthDisplay + 40, 190); - int guiHeight = largestHeight; this.tabsPerPage = Math.max(5, Mth.floor((guiWidth - 20d) / tabSize)); if (this.categoryPages == -1) { this.categoryPages = Math.max(0, categories.indexOf(selectedCategory) / tabsPerPage); } - this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - guiHeight / 2, guiWidth, guiHeight); + this.bounds = new Rectangle(width / 2 - guiWidth / 2, height / 2 - largestHeight / 2, guiWidth, largestHeight); if (ConfigObject.getInstance().isSubsetsEnabled()) { this.bounds.setLocation(this.bounds.getX(), this.bounds.getY() + 15); this.bounds.setSize(this.bounds.getWidth(), this.bounds.getHeight() - 10); @@ -331,7 +330,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { recipeChoosePageWidget = null; workingStationsBaseWidget = null; - List> workingStations = RecipeHelper.getInstance().getWorkingStations(selectedCategory.getIdentifier()); + List>> workingStations = RecipeHelper.getInstance().getWorkingStations(selectedCategory.getIdentifier()); if (!workingStations.isEmpty()) { int hh = Mth.floor((bounds.height - 16) / 18f); int actualHeight = Math.min(hh, workingStations.size()); @@ -342,7 +341,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { preWidgets.add(Widgets.createSlotBase(new Rectangle(xx - 1, yy - 1, innerWidth * 16 + 2, actualHeight * 16 + 2))); int index = 0; xx += (innerWidth - 1) * 16; - for (List workingStation : workingStations) { + for (List> workingStation : workingStations) { preWidgets.add(new WorkstationSlotWidget(xx, yy, workingStation)); index++; yy += 16; @@ -571,7 +570,7 @@ public class RecipeViewingScreen extends Screen implements RecipeScreen { } public static class WorkstationSlotWidget extends EntryWidget { - public WorkstationSlotWidget(int x, int y, List widgets) { + public WorkstationSlotWidget(int x, int y, List> widgets) { super(new Point(x, y)); entries(widgets); noBackground(); diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/TransformingScreen.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/TransformingScreen.java index e72c921e1..d73b8e579 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/TransformingScreen.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/TransformingScreen.java @@ -44,6 +44,7 @@ public class TransformingScreen extends DelegateScreen implements ScissorsScreen private Runnable init; private boolean renderingLastScreen = false; private boolean translatingLast; + private boolean initAfter = false; public TransformingScreen(boolean translatingLast, Screen parent, Screen lastScreen, Runnable init, DoubleSupplier xTransformer, DoubleSupplier yTransformer, BooleanSupplier finished) { super(Minecraft.getInstance().level == null && parent == null ? new TitleScreen() : parent); @@ -55,6 +56,10 @@ public class TransformingScreen extends DelegateScreen implements ScissorsScreen this.finished = finished; } + public void setInitAfter(boolean initAfter) { + this.initAfter = initAfter; + } + public void setParentScreen(Screen parent) { this.parent = parent; } @@ -127,6 +132,9 @@ public class TransformingScreen extends DelegateScreen implements ScissorsScreen Minecraft.getInstance().screen = parent; if (parent != null) { Minecraft.getInstance().noRender = false; + if (initAfter) { + parent.init(Minecraft.getInstance(), Minecraft.getInstance().getWindow().getGuiScaledWidth(), Minecraft.getInstance().getWindow().getGuiScaledHeight()); + } } } else { super.tick(); diff --git a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java index 9eecc4616..aca21fd38 100644 --- a/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java +++ b/RoughlyEnoughItems-runtime/src/main/java/me/shedaniel/rei/gui/VillagerRecipeViewingScreen.java @@ -36,7 +36,7 @@ import me.shedaniel.rei.api.*; import me.shedaniel.rei.api.widgets.Button; import me.shedaniel.rei.api.widgets.Tooltip; import me.shedaniel.rei.api.widgets.Widgets; -import me.shedaniel.rei.gui.entries.RecipeEntry; +import me.shedaniel.rei.gui.entries.RecipeRenderer; import me.shedaniel.rei.gui.widget.TabWidget; import me.shedaniel.rei.gui.widget.Widget; import me.shedaniel.rei.impl.ClientHelperImpl; @@ -66,7 +66,7 @@ public class VillagerRecipeViewingScreen extends Screen implements RecipeScreen private final List> categories; private final List widgets = Lists.newArrayList(); private final List