I'm running into an odd issue when right-clicking a custom tile entity to open its container on a server, and no amount of Googling has brought me to a solution. It all works fine in singleplayer, but on a server, no GUI appears, and instead this is logged in the client's debug.log:
Neither the server nor the client crashes, and nothing is logged on the server. Here's the relevant code:
PackageBlock.Java:
public class PackageBlock extends ContainerBlock {
...
@Override
public ActionResultType onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit) {
...
if (!world.isRemote()) {
...
TileEntity te = world.getTileEntity(pos);
if (te != null && te instanceof PackageTileEntity) {
NetworkHooks.openGui((ServerPlayerEntity) player, (PackageTileEntity) te);
}
return ActionResultType.SUCCESS;
}
}
}
PackageTileEntity.java
public class PackageTileEntity extends TileEntity implements IInventory, INamedContainerProvider {
...
@Override
public Container createMenu(int windowId, PlayerInventory playerInventory, PlayerEntity player) {
return new PackageContainer(windowId, playerInventory, this);
}
...
}
PackageContainer.java
public class PackageContainer extends Container implements INameable {
public PackageContainer(int windowId, PlayerInventory playerInventory) {
this(windowId, playerInventory, new Inventory(PackageBlock.INVENTORY_SIZE));
}
public PackageContainer(int windowId, PlayerInventory playerInventory, IInventory packageInventory) {
super(EnderMailContainers.PACKAGE_CONTAINER, windowId);
this.packageInventory = packageInventory;
packageInventory.openInventory(playerInventory.player);
...<add slots>...
}
...
}
EnderMailContainers.java
@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD)
@ObjectHolder(EnderMail.MODID)
public class EnderMailContainers {
@ObjectHolder(PackageContainer.NAME)
public static final ContainerType<PackageContainer> PACKAGE_CONTAINER = null;
@SubscribeEvent
public static void onContainerTypeRegistry(final RegistryEvent.Register<ContainerType<?>> event) {
event.getRegistry().register(new ContainerType<>(PackageContainer::new).setRegistryName(PackageContainer.NAME));
}
}
EnderMail.java
public void clientInit(FMLClientSetupEvent event) {
...
ScreenManager.registerFactory(EnderMailContainers.PACKAGE_CONTAINER, PackageScreen::new);
}
The entirety of the source code can be found here, if it's needed.
Things I've tried:
Using player.openContainer instead of NetworkHooks.openGui in PackageBlock.java. The result was the same, except that the player was kicked off the server with a similar error message appearing on the screen before returning to the multiplayer menu: "Internal Exception: io.netty.handler.codec.DecoderException:com.google.gson.JsonParseException: Don't know how to turn {} into a Component." The error logged in debug.log was identical, and nothing was logged on the server.
Passing a PacketBuffer argument with the NetworkHooks.openGui call. Same result.
Thanks in advance for the help.