47 lines
1.4 KiB
Java
47 lines
1.4 KiB
Java
package net.minecraft.network;
|
|
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.handler.codec.DecoderException;
|
|
import io.netty.handler.codec.MessageToMessageDecoder;
|
|
import java.util.List;
|
|
import net.minecraft.network.protocol.BundlerInfo;
|
|
import net.minecraft.network.protocol.Packet;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
public class PacketBundlePacker extends MessageToMessageDecoder<Packet<?>> {
|
|
private final BundlerInfo bundlerInfo;
|
|
@Nullable
|
|
private BundlerInfo.Bundler currentBundler;
|
|
|
|
public PacketBundlePacker(BundlerInfo bundlerInfo) {
|
|
this.bundlerInfo = bundlerInfo;
|
|
}
|
|
|
|
protected void decode(ChannelHandlerContext context, Packet<?> packet, List<Object> list) throws Exception {
|
|
if (this.currentBundler != null) {
|
|
verifyNonTerminalPacket(packet);
|
|
Packet<?> packet2 = this.currentBundler.addPacket(packet);
|
|
if (packet2 != null) {
|
|
this.currentBundler = null;
|
|
list.add(packet2);
|
|
}
|
|
} else {
|
|
BundlerInfo.Bundler bundler = this.bundlerInfo.startPacketBundling(packet);
|
|
if (bundler != null) {
|
|
verifyNonTerminalPacket(packet);
|
|
this.currentBundler = bundler;
|
|
} else {
|
|
list.add(packet);
|
|
if (packet.isTerminal()) {
|
|
context.pipeline().remove(context.name());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void verifyNonTerminalPacket(Packet<?> packet) {
|
|
if (packet.isTerminal()) {
|
|
throw new DecoderException("Terminal message received in bundle");
|
|
}
|
|
}
|
|
}
|