mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 13:42:59 +00:00 
			
		
		
		
	Clean up container data interface
- Remove ContainerData.open. - Change PlatformHelper.openMenu to take a separate display name and MenuConstructor, rather than a MenuProvider. This makes the interface slightly easier to use in the common case, where we want to use lambdas instead.
This commit is contained in:
		| @@ -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; | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -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<T extends AbstractComputerBlockEntit | ||||
|                 var serverComputer = computer.createServerComputer(); | ||||
|                 serverComputer.turnOn(); | ||||
| 
 | ||||
|                 new ComputerContainerData(serverComputer, getItem(computer)).open(player, computer); | ||||
|                 PlatformHelper.get().openMenu(player, computer.getName(), computer, new ComputerContainerData(serverComputer, getItem(computer))); | ||||
|             } | ||||
|             return InteractionResult.sidedSuccess(level.isClientSide); | ||||
|         } | ||||
|   | ||||
| @@ -26,9 +26,9 @@ import net.minecraft.network.chat.Component; | ||||
| import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; | ||||
| import net.minecraft.world.Container; | ||||
| import net.minecraft.world.LockCode; | ||||
| import net.minecraft.world.MenuProvider; | ||||
| import net.minecraft.world.Nameable; | ||||
| import net.minecraft.world.entity.player.Player; | ||||
| import net.minecraft.world.inventory.MenuConstructor; | ||||
| import net.minecraft.world.level.block.GameMasterBlock; | ||||
| import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; | ||||
| import net.minecraft.world.level.block.entity.BlockEntity; | ||||
| @@ -39,7 +39,7 @@ import javax.annotation.Nullable; | ||||
| import java.util.Objects; | ||||
| import java.util.UUID; | ||||
| 
 | ||||
| public abstract class AbstractComputerBlockEntity extends BlockEntity implements Nameable, MenuProvider { | ||||
| public abstract class AbstractComputerBlockEntity extends BlockEntity implements Nameable, MenuConstructor { | ||||
|     private static final String NBT_ID = "ComputerId"; | ||||
|     private static final String NBT_LABEL = "Label"; | ||||
|     private static final String NBT_ON = "On"; | ||||
|   | ||||
| @@ -7,9 +7,7 @@ package dan200.computercraft.shared.network.container; | ||||
| import dan200.computercraft.shared.network.NetworkMessage; | ||||
| import dan200.computercraft.shared.platform.PlatformHelper; | ||||
| import net.minecraft.network.FriendlyByteBuf; | ||||
| 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.inventory.MenuType; | ||||
| 
 | ||||
| @@ -21,16 +19,6 @@ import java.util.function.Function; | ||||
| public interface ContainerData { | ||||
|     void toBytes(FriendlyByteBuf buf); | ||||
| 
 | ||||
|     /** | ||||
|      * Open a menu for a specific player using this data. | ||||
|      * | ||||
|      * @param player The player to open the menu for. | ||||
|      * @param menu   The underlying menu provider. | ||||
|      */ | ||||
|     default void open(Player player, MenuProvider menu) { | ||||
|         PlatformHelper.get().openMenu(player, menu, this); | ||||
|     } | ||||
| 
 | ||||
|     static <C extends AbstractContainerMenu, T extends ContainerData> MenuType<C> toType(Function<FriendlyByteBuf, T> reader, Factory<C, T> factory) { | ||||
|         return PlatformHelper.get().createMenuType(reader, factory); | ||||
|     } | ||||
|   | ||||
| @@ -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}. | ||||
|   | ||||
| @@ -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 | ||||
|         ); | ||||
|     } | ||||
| } | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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"); | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -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); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jonathan Coates
					Jonathan Coates