Actually fix byte array behaviour for openGui.

Signed-off-by: cpw <cpw+github@weeksfamily.ca>
This commit is contained in:
cpw 2019-02-14 14:34:39 -05:00
parent d6c3df32d6
commit 9a1688599a
No known key found for this signature in database
GPG Key ID: 8EB3DF749553B1B7
1 changed files with 12 additions and 5 deletions

View File

@ -94,6 +94,7 @@ public class NetworkHooks
* The {@link IInteractionObject#getGuiID()} is treated as a {@link ResourceLocation}. * The {@link IInteractionObject#getGuiID()} is treated as a {@link ResourceLocation}.
* It should refer to a valid modId namespace, to trigger opening on the client. * It should refer to a valid modId namespace, to trigger opening on the client.
* The namespace is directly used to lookup the modId in the client side. * The namespace is directly used to lookup the modId in the client side.
* The maximum size for #extraData is 32600 bytes.
* *
* @param player The player to open the GUI for * @param player The player to open the GUI for
* @param containerSupplier The Container Supplier * @param containerSupplier The Container Supplier
@ -106,18 +107,24 @@ public class NetworkHooks
Container c = containerSupplier.createContainer(player.inventory, player); Container c = containerSupplier.createContainer(player.inventory, player);
player.closeScreen(); player.closeScreen();
player.getNextWindowId(); player.getNextWindowId();
int openContainer = player.currentWindowId;
player.openContainer = c; player.openContainer = c;
player.openContainer.windowId = player.currentWindowId; player.openContainer.windowId = openContainer;
player.openContainer.addListener(player); player.openContainer.addListener(player);
MinecraftForge.EVENT_BUS.post(new PlayerContainerEvent.Open(player, c)); MinecraftForge.EVENT_BUS.post(new PlayerContainerEvent.Open(player, c));
PacketBuffer output = new PacketBuffer(Unpooled.buffer());
if (extraData == null) { if (extraData == null) {
extraData = new PacketBuffer(Unpooled.buffer()); output.writeVarInt(0);
} else {
output.writeVarInt(extraData.readableBytes());
output.writeBytes(extraData);
} }
if (extraData.readableBytes() > 32600) {
throw new IllegalArgumentException("GUI Open packet too large : "+ extraData.readableBytes()); if (output.readableBytes() > 32600 || output.readableBytes() < 1) {
throw new IllegalArgumentException("Invalid PacketBuffer for openGui, found "+ output.readableBytes()+ " bytes");
} }
FMLPlayMessages.OpenContainer msg = new FMLPlayMessages.OpenContainer(id, player.currentWindowId, extraData); FMLPlayMessages.OpenContainer msg = new FMLPlayMessages.OpenContainer(id, openContainer, output);
FMLPlayHandler.channel.sendTo(msg, player.connection.getNetworkManager(), NetworkDirection.PLAY_TO_CLIENT); FMLPlayHandler.channel.sendTo(msg, player.connection.getNetworkManager(), NetworkDirection.PLAY_TO_CLIENT);
} }
} }