Skip to content

Commit

Permalink
Have one MinecraftVarintLengthEncoder, not two
Browse files Browse the repository at this point in the history
Applies more to the margins (such as login phase and server list ping), but every bit does help.
  • Loading branch information
astei committed Sep 3, 2024
1 parent 52ae735 commit f034c02
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import com.velocitypowered.proxy.protocol.netty.MinecraftDecoder;
import com.velocitypowered.proxy.protocol.netty.MinecraftEncoder;
import com.velocitypowered.proxy.protocol.netty.MinecraftVarintFrameDecoder;
import com.velocitypowered.proxy.protocol.netty.MinecraftVarintLengthCompositeEncoder;
import com.velocitypowered.proxy.protocol.netty.MinecraftVarintLengthEncoder;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.handler.timeout.ReadTimeoutHandler;
Expand All @@ -49,13 +49,13 @@ public BackendChannelInitializer(VelocityServer server) {
}

@Override
protected void initChannel(Channel ch) throws Exception {
protected void initChannel(Channel ch) {
ch.pipeline()
.addLast(FRAME_DECODER, new MinecraftVarintFrameDecoder())
.addLast(READ_TIMEOUT,
new ReadTimeoutHandler(server.getConfiguration().getReadTimeout(),
TimeUnit.MILLISECONDS))
.addLast(FRAME_ENCODER, MinecraftVarintLengthCompositeEncoder.INSTANCE)
.addLast(FRAME_ENCODER, MinecraftVarintLengthEncoder.INSTANCE)
.addLast(MINECRAFT_DECODER,
new MinecraftDecoder(ProtocolUtils.Direction.CLIENTBOUND))
.addLast(FLOW_HANDLER, new AutoReadHolderHandler())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,33 +23,34 @@
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import io.netty.handler.codec.MessageToMessageEncoder;
import java.util.List;

/**
* Handler for appending a length for Minecraft packets.
*/
@ChannelHandler.Sharable
public class MinecraftVarintLengthEncoder extends MessageToByteEncoder<ByteBuf> {
public class MinecraftVarintLengthEncoder extends MessageToMessageEncoder<ByteBuf> {

public static final MinecraftVarintLengthEncoder INSTANCE = new MinecraftVarintLengthEncoder();
public static final boolean IS_JAVA_CIPHER = Natives.cipher.get() == JavaVelocityCipher.FACTORY;

static final boolean IS_JAVA_CIPHER = Natives.cipher.get() == JavaVelocityCipher.FACTORY;

private MinecraftVarintLengthEncoder() {
}

@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception {
ProtocolUtils.writeVarInt(out, msg.readableBytes());
out.writeBytes(msg);
}
protected void encode(ChannelHandlerContext ctx, ByteBuf buf,
List<Object> list) throws Exception {
final int length = buf.readableBytes();
final int varintLength = ProtocolUtils.varIntBytes(length);

@Override
protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, ByteBuf msg, boolean preferDirect)
throws Exception {
int anticipatedRequiredCapacity = ProtocolUtils.varIntBytes(msg.readableBytes())
+ msg.readableBytes();
return IS_JAVA_CIPHER
? ctx.alloc().heapBuffer(anticipatedRequiredCapacity)
: ctx.alloc().directBuffer(anticipatedRequiredCapacity);
final ByteBuf lenBuf = IS_JAVA_CIPHER
? ctx.alloc().heapBuffer(varintLength)
: ctx.alloc().directBuffer(varintLength);

ProtocolUtils.writeVarInt(lenBuf, length);
list.add(lenBuf);
list.add(buf.retain());
}
}

0 comments on commit f034c02

Please sign in to comment.