CloudburstMC / Protocol

A protocol library for Minecraft Bedrock Edition
https://git.io/ProtocolLib
Apache License 2.0
312 stars 94 forks source link

Issue with LevelEventGenericPacket #72

Closed bundabrg closed 2 years ago

bundabrg commented 4 years ago

This packet has "floating" NBT whereas the code expects them in a Compound Tag. I've only seen this packet used so far (for what I'm not sure yet) in MCEE 1.14.31.

[12:48:11 DEBUG]: Error occurred whilst decoding packet
com.nukkitx.protocol.bedrock.exception.PacketSerializeException: Error whilst deserializing LevelEventGenericPacket(eventId=2023, tag=null)
        at com.nukkitx.protocol.bedrock.BedrockPacketCodec.tryDecode(BedrockPacketCodec.java:60) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.wrapper.BedrockWrapperSerializerV9_10.deserialize(BedrockWrapperSerializerV9_10.java:73) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockSession.onWrappedPacket(BedrockSession.java:276) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockRakNetSessionListener.onEncapsulated(BedrockRakNetSessionListener.java:32) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onEncapsulatedInternal(RakNetSession.java:307) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onOrderedReceived(RakNetSession.java:434) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.checkForOrdered(RakNetSession.java:412) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onRakNetDatagram(RakNetSession.java:405) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onDatagram(RakNetSession.java:279) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetClient$ClientDatagramHandler.channelRead(RakNetClient.java:153) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel.read(EpollDatagramChannel.java:688) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel.access$100(EpollDatagramChannel.java:57) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel$EpollDatagramChannelUnsafe.epollInReady(EpollDatagramChannel.java:507) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:502) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:407) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at java.lang.Thread.run(Thread.java:834) ~[?:?]
Caused by: java.lang.ClassCastException: class java.lang.Integer cannot be cast to class com.nukkitx.nbt.NbtMap (java.lang.Integer is in module java.base of loader 'bootstrap'; com.nukkitx.nbt.NbtMap is in unnamed module of loader 'app')
        at com.nukkitx.protocol.bedrock.v361.serializer.LevelEventGenericSerializer_v361.deserialize(LevelEventGenericSerializer_v361.java:24) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.v361.serializer.LevelEventGenericSerializer_v361.deserialize(LevelEventGenericSerializer_v361.java:11) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockPacketCodec.tryDecode(BedrockPacketCodec.java:58) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        ... 24 more
[12:48:20 DEBUG]: Error occurred whilst decoding packet
com.nukkitx.protocol.bedrock.exception.PacketSerializeException: Error whilst deserializing LevelEventGenericPacket(eventId=2023, tag=null)
        at com.nukkitx.protocol.bedrock.BedrockPacketCodec.tryDecode(BedrockPacketCodec.java:60) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.wrapper.BedrockWrapperSerializerV9_10.deserialize(BedrockWrapperSerializerV9_10.java:73) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockSession.onWrappedPacket(BedrockSession.java:276) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockRakNetSessionListener.onEncapsulated(BedrockRakNetSessionListener.java:32) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onEncapsulatedInternal(RakNetSession.java:307) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onOrderedReceived(RakNetSession.java:434) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.checkForOrdered(RakNetSession.java:412) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onRakNetDatagram(RakNetSession.java:405) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onDatagram(RakNetSession.java:279) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetClient$ClientDatagramHandler.channelRead(RakNetClient.java:153) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel.read(EpollDatagramChannel.java:688) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel.access$100(EpollDatagramChannel.java:57) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel$EpollDatagramChannelUnsafe.epollInReady(EpollDatagramChannel.java:507) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:502) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:407) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at java.lang.Thread.run(Thread.java:834) ~[?:?]
Caused by: java.lang.ClassCastException: class java.lang.Integer cannot be cast to class com.nukkitx.nbt.NbtMap (java.lang.Integer is in module java.base of loader 'bootstrap'; com.nukkitx.nbt.NbtMap is in unnamed module of loader 'app')
        at com.nukkitx.protocol.bedrock.v361.serializer.LevelEventGenericSerializer_v361.deserialize(LevelEventGenericSerializer_v361.java:24) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.v361.serializer.LevelEventGenericSerializer_v361.deserialize(LevelEventGenericSerializer_v361.java:11) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockPacketCodec.tryDecode(BedrockPacketCodec.java:58) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        ... 24 more
[12:48:21 DEBUG]: Error occurred whilst decoding packet
com.nukkitx.protocol.bedrock.exception.PacketSerializeException: Error whilst deserializing LevelEventGenericPacket(eventId=2023, tag=null)
        at com.nukkitx.protocol.bedrock.BedrockPacketCodec.tryDecode(BedrockPacketCodec.java:60) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.wrapper.BedrockWrapperSerializerV9_10.deserialize(BedrockWrapperSerializerV9_10.java:73) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockSession.onWrappedPacket(BedrockSession.java:276) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockRakNetSessionListener.onEncapsulated(BedrockRakNetSessionListener.java:32) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onEncapsulatedInternal(RakNetSession.java:307) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onOrderedReceived(RakNetSession.java:434) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.checkForOrdered(RakNetSession.java:412) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onRakNetDatagram(RakNetSession.java:405) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetSession.onDatagram(RakNetSession.java:279) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.network.raknet.RakNetClient$ClientDatagramHandler.channelRead(RakNetClient.java:153) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel.read(EpollDatagramChannel.java:688) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel.access$100(EpollDatagramChannel.java:57) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollDatagramChannel$EpollDatagramChannelUnsafe.epollInReady(EpollDatagramChannel.java:507) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1.run(AbstractEpollChannel.java:394) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:413) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at java.lang.Thread.run(Thread.java:834) ~[?:?]
Caused by: java.lang.ClassCastException: class java.lang.Integer cannot be cast to class com.nukkitx.nbt.NbtMap (java.lang.Integer is in module java.base of loader 'bootstrap'; com.nukkitx.nbt.NbtMap is in unnamed module of loader 'app')
        at com.nukkitx.protocol.bedrock.v361.serializer.LevelEventGenericSerializer_v361.deserialize(LevelEventGenericSerializer_v361.java:24) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.v361.serializer.LevelEventGenericSerializer_v361.deserialize(LevelEventGenericSerializer_v361.java:11) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        at com.nukkitx.protocol.bedrock.BedrockPacketCodec.tryDecode(BedrockPacketCodec.java:58) ~[proxypass-1.0.0-SNAPSHOT.jar:?]
        ... 26 more
SupremeMortal commented 4 years ago

So by floating, do you mean that the tag can be of any type?

KCodeYT commented 2 years ago

This packet requires an CompoundTag so microjang has removed the identification tag and its name and only sends the content of this nbtmap which can be read until EOF, otherwise you have to add the CompoundTag ID byte and a zero byte for the name length and an additional zero byte to end the CompoundTag

KCodeYT commented 2 years ago

This packet is used for boss fights (wither and ender dragon)

SupremeMortal commented 2 years ago

This will probably require some minor changes to the NBT library to fix. Currently, it ignores the root name of the NBT which would be needed in this scenario. The best fix I can think of is adding a wrapper object to BedrockPacketHelper#readTag() that returns NbtRoot<Object> and holds the root name.

bundabrg commented 2 years ago

Thanks Supreme. I had accidentally muted this issue so didn't see your original question.