diff --git a/src/main/java/dan200/computercraft/shared/Registry.java b/src/main/java/dan200/computercraft/shared/Registry.java index ed8053cce..d9b3e800d 100644 --- a/src/main/java/dan200/computercraft/shared/Registry.java +++ b/src/main/java/dan200/computercraft/shared/Registry.java @@ -18,6 +18,7 @@ import dan200.computercraft.shared.computer.blocks.BlockComputer; import dan200.computercraft.shared.computer.blocks.TileCommandComputer; import dan200.computercraft.shared.computer.blocks.TileComputer; import dan200.computercraft.shared.computer.core.ComputerFamily; +import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.computer.items.ItemComputer; @@ -312,13 +313,13 @@ public final class Registry static final DeferredRegister> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID ); public static final RegistryObject> COMPUTER = CONTAINERS.register( "computer", - () -> ContainerData.toType( ComputerContainerData::new, ContainerComputerBase::new ) ); + () -> ContainerData.toType( ComputerContainerData::new, ComputerMenuWithoutInventory::new ) ); public static final RegistryObject> POCKET_COMPUTER = CONTAINERS.register( "pocket_computer", - () -> ContainerData.toType( ComputerContainerData::new, ContainerComputerBase::new ) ); + () -> ContainerData.toType( ComputerContainerData::new, ComputerMenuWithoutInventory::new ) ); public static final RegistryObject> POCKET_COMPUTER_NO_TERM = CONTAINERS.register( "pocket_computer_no_term", - () -> ContainerData.toType( ComputerContainerData::new, ContainerComputerBase::new ) ); + () -> ContainerData.toType( ComputerContainerData::new, ComputerMenuWithoutInventory::new ) ); public static final RegistryObject> TURTLE = CONTAINERS.register( "turtle", () -> ContainerData.toType( ComputerContainerData::new, ContainerTurtle::new ) ); diff --git a/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java b/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java index 82e6f8559..f023af24a 100644 --- a/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java +++ b/src/main/java/dan200/computercraft/shared/command/CommandComputerCraft.java @@ -237,7 +237,7 @@ public final class CommandComputerCraft @Override public Container createMenu( int id, @Nonnull PlayerInventory player, @Nonnull PlayerEntity entity ) { - return new ContainerViewComputer( id, computer ); + return new ContainerViewComputer( id, player, computer ); } } ); return 1; diff --git a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java index eb92fdfbe..410b40fde 100644 --- a/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/blocks/TileComputer.java @@ -12,7 +12,7 @@ import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ComputerState; import dan200.computercraft.shared.computer.core.ServerComputer; -import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; +import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; import dan200.computercraft.shared.util.CapabilityUtil; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -86,7 +86,7 @@ public class TileComputer extends TileComputerBase @Override public Container createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity player ) { - return new ContainerComputerBase( Registry.ModContainers.COMPUTER.get(), id, this::isUsableByPlayer, createServerComputer(), getFamily() ); + return new ComputerMenuWithoutInventory( Registry.ModContainers.COMPUTER.get(), id, inventory, this::isUsableByPlayer, createServerComputer(), getFamily() ); } @Nonnull diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ComputerMenuWithoutInventory.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ComputerMenuWithoutInventory.java new file mode 100644 index 000000000..e1304b6e5 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ComputerMenuWithoutInventory.java @@ -0,0 +1,41 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.shared.computer.inventory; + +import dan200.computercraft.shared.computer.core.ComputerFamily; +import dan200.computercraft.shared.computer.core.IComputer; +import dan200.computercraft.shared.network.container.ComputerContainerData; +import dan200.computercraft.shared.util.InvisibleSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.ContainerType; + +import java.util.function.Predicate; + +/** + * A computer menu which does not have any visible inventory. + * + * This adds invisible versions of the player's hotbars slots, to ensure they're synced to the client when changed. + */ +public class ComputerMenuWithoutInventory extends ContainerComputerBase +{ + public ComputerMenuWithoutInventory( ContainerType type, int id, PlayerInventory player, Predicate canUse, IComputer computer, ComputerFamily family ) + { + super( type, id, canUse, computer, family ); + addSlots( player ); + } + + public ComputerMenuWithoutInventory( ContainerType type, int id, PlayerInventory player, ComputerContainerData data ) + { + super( type, id, player, data ); + addSlots( player ); + } + + private void addSlots( PlayerInventory player ) + { + for( int i = 0; i < 9; i++ ) addSlot( new InvisibleSlot( player, i ) ); + } +} diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java index 5dd47c15e..068ba7098 100644 --- a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java +++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerComputerBase.java @@ -34,7 +34,7 @@ import java.util.UUID; import java.util.function.Function; import java.util.function.Predicate; -public class ContainerComputerBase extends Container implements IContainerComputer +public abstract class ContainerComputerBase extends Container implements IContainerComputer { private static final String LIST_PREFIX = "\n \u2022 "; diff --git a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java index 4612b46be..f53a079fb 100644 --- a/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java +++ b/src/main/java/dan200/computercraft/shared/computer/inventory/ContainerViewComputer.java @@ -16,14 +16,14 @@ import net.minecraft.entity.player.PlayerInventory; import javax.annotation.Nonnull; -public class ContainerViewComputer extends ContainerComputerBase +public class ContainerViewComputer extends ComputerMenuWithoutInventory { private final int width; private final int height; - public ContainerViewComputer( int id, ServerComputer computer ) + public ContainerViewComputer( int id, PlayerInventory player, ServerComputer computer ) { - super( Registry.ModContainers.VIEW_COMPUTER.get(), id, player -> canInteractWith( computer, player ), computer, computer.getFamily() ); + super( Registry.ModContainers.VIEW_COMPUTER.get(), id, player, p -> canInteractWith( computer, p ), computer, computer.getFamily() ); width = height = 0; } diff --git a/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java b/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java index 0a08ece1a..04f67312e 100644 --- a/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java +++ b/src/main/java/dan200/computercraft/shared/pocket/inventory/PocketComputerMenuProvider.java @@ -7,7 +7,7 @@ package dan200.computercraft.shared.pocket.inventory; import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.computer.core.ServerComputer; -import dan200.computercraft.shared.computer.inventory.ContainerComputerBase; +import dan200.computercraft.shared.computer.inventory.ComputerMenuWithoutInventory; import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -49,8 +49,8 @@ public class PocketComputerMenuProvider implements INamedContainerProvider @Override public Container createMenu( int id, @Nonnull PlayerInventory inventory, @Nonnull PlayerEntity entity ) { - return new ContainerComputerBase( - isTypingOnly ? Registry.ModContainers.POCKET_COMPUTER_NO_TERM.get() : Registry.ModContainers.POCKET_COMPUTER.get(), id, + return new ComputerMenuWithoutInventory( + isTypingOnly ? Registry.ModContainers.POCKET_COMPUTER_NO_TERM.get() : Registry.ModContainers.POCKET_COMPUTER.get(), id, inventory, p -> { ItemStack stack = p.getItemInHand( hand ); return stack.getItem() == item && ItemPocketComputer.getServerComputer( stack ) == computer; diff --git a/src/main/java/dan200/computercraft/shared/util/InvisibleSlot.java b/src/main/java/dan200/computercraft/shared/util/InvisibleSlot.java new file mode 100644 index 000000000..ad5f81b33 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/util/InvisibleSlot.java @@ -0,0 +1,39 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.shared.util; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nonnull; + +public class InvisibleSlot extends Slot +{ + public InvisibleSlot( IInventory container, int slot ) + { + super( container, slot, 0, 0 ); + } + + @Override + public boolean mayPlace( @Nonnull ItemStack stack ) + { + return false; + } + + @Override + public boolean mayPickup( @Nonnull PlayerEntity player ) + { + return false; + } + + @Override + public boolean isActive() + { + return false; + } +}