blob: b041908e7a235ab00c05391dcae615cbe333eab2 [file] [log] [blame] [raw]
package protocolsupport.protocol.pipeline.common;
import java.io.IOException;
import java.util.List;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import io.netty.handler.codec.DecoderException;
import net.minecraft.server.v1_10_R1.EnumProtocol;
import net.minecraft.server.v1_10_R1.EnumProtocolDirection;
import net.minecraft.server.v1_10_R1.NetworkManager;
import net.minecraft.server.v1_10_R1.Packet;
import net.minecraft.server.v1_10_R1.PacketDataSerializer;
import protocolsupport.utils.netty.ChannelUtils;
import protocolsupport.utils.netty.WrappingBuffer;
public class PacketDecoder extends ByteToMessageDecoder {
private final WrappingBuffer wrapper = new WrappingBuffer();
private final PacketDataSerializer nativeSerializer = new PacketDataSerializer(wrapper);
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf input, List<Object> list) throws IllegalAccessException, InstantiationException {
if (!input.isReadable()) {
return;
}
EnumProtocol protocol = ctx.channel().attr(NetworkManager.c).get();
wrapper.setBuf(input);
int packetId = ChannelUtils.readVarInt(wrapper);
Packet<?> packet = protocol.a(EnumProtocolDirection.SERVERBOUND, packetId);
if (packet == null) {
throw new DecoderException("Bad packet id " + packetId);
}
try {
packet.a(nativeSerializer);
} catch (IOException e) {
throw new DecoderException(e);
}
if (nativeSerializer.isReadable()) {
throw new DecoderException("Did not read all data from packet " + packet.getClass().getName() + ", bytes left: " + nativeSerializer.readableBytes());
}
list.add(packet);
}
}