diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java b/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java index ba0009ddb..4889f20f2 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java @@ -24,15 +24,13 @@ import dan200.computercraft.shared.computer.metrics.basic.AggregatedMetric; import dan200.computercraft.shared.computer.metrics.basic.BasicComputerMetricsObserver; import dan200.computercraft.shared.computer.metrics.basic.ComputerMetrics; import dan200.computercraft.shared.network.container.ComputerContainerData; +import dan200.computercraft.shared.platform.PlatformHelper; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.RelativeMovement; -import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; @@ -260,18 +258,11 @@ public final class CommandComputerCraft { * @return The constant {@code 1}. */ private static int view(CommandSourceStack source, ServerComputer computer) throws CommandSyntaxException { - var player = source.getPlayerOrException(); - new ComputerContainerData(computer, ItemStack.EMPTY).open(player, new MenuProvider() { - @Override - public Component getDisplayName() { - return Component.translatable("gui.computercraft.view_computer"); - } - - @Override - public AbstractContainerMenu createMenu(int id, Inventory player, Player entity) { - return new ComputerMenuWithoutInventory(ModRegistry.Menus.COMPUTER.get(), id, player, p -> true, computer); - } - }); + PlatformHelper.get().openMenu( + source.getPlayerOrException(), Component.translatable("gui.computercraft.view_computer"), + (id, player, entity) -> new ComputerMenuWithoutInventory(ModRegistry.Menus.COMPUTER.get(), id, player, p -> true, computer), + new ComputerContainerData(computer, ItemStack.EMPTY) + ); return 1; } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java index b9e61a7aa..4e093af11 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlock.java @@ -9,6 +9,7 @@ import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.shared.common.IBundledRedstoneBlock; import dan200.computercraft.shared.computer.items.IComputerItem; import dan200.computercraft.shared.network.container.ComputerContainerData; +import dan200.computercraft.shared.platform.PlatformHelper; import dan200.computercraft.shared.platform.RegistryEntry; import dan200.computercraft.shared.util.BlockEntityHelpers; import net.minecraft.core.BlockPos; @@ -161,7 +162,7 @@ public abstract class AbstractComputerBlock MenuType toType(Function reader, Factory factory) { return PlatformHelper.get().createMenuType(reader, factory); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java b/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java index a0553c6bb..d24eff2ca 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/platform/PlatformHelper.java @@ -20,6 +20,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.resources.ResourceKey; @@ -29,11 +30,15 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayerGameMode; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.tags.TagKey; -import net.minecraft.world.*; +import net.minecraft.world.Container; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.WorldlyContainer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.inventory.MenuConstructor; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.DyeColor; @@ -159,10 +164,11 @@ public interface PlatformHelper extends dan200.computercraft.impl.PlatformHelper * Open a container using a specific {@link ContainerData}. * * @param player The player to open the menu for. - * @param owner The underlying menu provider. - * @param menu The menu data. + * @param title The title for this menu. + * @param menu The underlying menu constructor. + * @param data The menu data. */ - void openMenu(Player player, MenuProvider owner, ContainerData menu); + void openMenu(Player player, Component title, MenuConstructor menu, ContainerData data); /** * Create a new {@link MessageType}. diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java deleted file mode 100644 index 5c091afb1..000000000 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: 2021 The CC: Tweaked Developers -// -// SPDX-License-Identifier: MPL-2.0 - -package dan200.computercraft.shared.pocket.inventory; - -import dan200.computercraft.shared.ModRegistry; -import dan200.computercraft.shared.computer.core.ServerComputer; -import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; -import dan200.computercraft.shared.pocket.items.PocketComputerItem; -import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; - -import javax.annotation.Nullable; - -import static dan200.computercraft.core.util.Nullability.assertNonNull; - -public class PocketComputerMenuProvider implements MenuProvider { - private final ServerComputer computer; - private final Component name; - private final PocketComputerItem item; - private final InteractionHand hand; - private final boolean isTypingOnly; - - public PocketComputerMenuProvider(ServerComputer computer, ItemStack stack, PocketComputerItem item, InteractionHand hand, boolean isTypingOnly) { - this.computer = computer; - name = stack.getHoverName(); - this.item = item; - this.hand = hand; - this.isTypingOnly = isTypingOnly; - } - - - @Override - public Component getDisplayName() { - return name; - } - - @Nullable - @Override - public AbstractContainerMenu createMenu(int id, Inventory inventory, Player entity) { - return new ComputerMenuWithoutInventory( - isTypingOnly ? ModRegistry.Menus.POCKET_COMPUTER_NO_TERM.get() : ModRegistry.Menus.COMPUTER.get(), id, inventory, - p -> { - var stack = p.getItemInHand(hand); - return stack.getItem() == item && PocketComputerItem.getServerComputer(assertNonNull(entity.level().getServer()), stack) == computer; - }, - computer - ); - } -} diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java index 9e54e2b3e..fd557fc58 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java @@ -12,18 +12,20 @@ import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.upgrades.UpgradeData; import dan200.computercraft.core.computer.ComputerSide; import dan200.computercraft.impl.PocketUpgrades; +import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.common.IColouredItem; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.core.ServerComputerRegistry; import dan200.computercraft.shared.computer.core.ServerContext; +import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; import dan200.computercraft.shared.computer.items.IComputerItem; import dan200.computercraft.shared.config.Config; import dan200.computercraft.shared.network.container.ComputerContainerData; +import dan200.computercraft.shared.platform.PlatformHelper; import dan200.computercraft.shared.pocket.core.PocketBrain; import dan200.computercraft.shared.pocket.core.PocketHolder; import dan200.computercraft.shared.pocket.core.PocketServerComputer; -import dan200.computercraft.shared.pocket.inventory.PocketComputerMenuProvider; import dan200.computercraft.shared.util.IDAssigner; import dan200.computercraft.shared.util.InventoryUtil; import dan200.computercraft.shared.util.NBTUtil; @@ -176,8 +178,13 @@ public class PocketComputerItem extends Item implements IComputerItem, IMedia, I } if (!stop) { - var isTypingOnly = hand == InteractionHand.OFF_HAND; - new ComputerContainerData(computer, stack).open(player, new PocketComputerMenuProvider(computer, stack, this, hand, isTypingOnly)); + PlatformHelper.get().openMenu( + player, stack.getHoverName(), + (id, inventory, entity) -> new ComputerMenuWithoutInventory( + hand == InteractionHand.OFF_HAND ? ModRegistry.Menus.POCKET_COMPUTER_NO_TERM.get() : ModRegistry.Menus.COMPUTER.get(), + id, inventory, p -> isServerComputer(computer, p.getItemInHand(hand)), computer + ), + new ComputerContainerData(computer, stack)); } } return new InteractionResultHolder<>(InteractionResult.sidedSuccess(world.isClientSide), stack); diff --git a/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java b/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java index 879e996d0..bd7f412cf 100644 --- a/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java +++ b/projects/common/src/test/java/dan200/computercraft/TestPlatformHelper.java @@ -25,6 +25,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; @@ -35,11 +36,11 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.tags.TagKey; import net.minecraft.world.Container; import net.minecraft.world.InteractionResult; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.inventory.MenuConstructor; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; @@ -140,7 +141,7 @@ public class TestPlatformHelper extends AbstractComputerCraftAPI implements Plat } @Override - public void openMenu(Player player, MenuProvider owner, ContainerData menu) { + public void openMenu(Player player, Component title, MenuConstructor menu, ContainerData data) { throw new UnsupportedOperationException("Cannot open menu inside tests"); } diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java index 72bccefb7..11690ae41 100644 --- a/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java +++ b/projects/fabric/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java @@ -59,12 +59,12 @@ import net.minecraft.util.GsonHelper; import net.minecraft.world.Container; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.inventory.MenuConstructor; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.Ingredient; @@ -170,8 +170,8 @@ public class PlatformHelperImpl implements PlatformHelper { } @Override - public void openMenu(Player player, MenuProvider owner, ContainerData menu) { - player.openMenu(new WrappedMenuProvider(owner, menu)); + public void openMenu(Player player, Component title, MenuConstructor menu, ContainerData data) { + player.openMenu(new WrappedMenuProvider(title, menu, data)); } @Override @@ -408,21 +408,22 @@ public class PlatformHelperImpl implements PlatformHelper { } } - private record WrappedMenuProvider(MenuProvider owner, ContainerData menu) implements ExtendedScreenHandlerFactory { + private record WrappedMenuProvider(Component title, MenuConstructor menu, + ContainerData data) implements ExtendedScreenHandlerFactory { @Nullable @Override public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) { - return owner.createMenu(id, inventory, player); + return menu.createMenu(id, inventory, player); } @Override public Component getDisplayName() { - return owner.getDisplayName(); + return title; } @Override public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { - menu.toBytes(buf); + data.toBytes(buf); } } diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java index 7e84f4ab3..c4c54ea20 100644 --- a/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java +++ b/projects/forge/src/main/java/dan200/computercraft/shared/platform/PlatformHelperImpl.java @@ -28,6 +28,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.resources.ResourceKey; @@ -41,6 +42,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.inventory.MenuConstructor; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; @@ -157,8 +159,8 @@ public class PlatformHelperImpl implements PlatformHelper { } @Override - public void openMenu(Player player, MenuProvider owner, ContainerData menu) { - NetworkHooks.openScreen((ServerPlayer) player, owner, menu::toBytes); + public void openMenu(Player player, Component title, MenuConstructor menu, ContainerData data) { + NetworkHooks.openScreen((ServerPlayer) player, new SimpleMenuProvider(menu, title), data::toBytes); } @Override