minecraft-src/net/minecraft/client/multiplayer/LegacyServerPinger.java
2025-07-04 01:41:11 +03:00

79 lines
2.6 KiB
Java

package net.minecraft.client.multiplayer;
import com.google.common.base.Splitter;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.List;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.multiplayer.resolver.ServerAddress;
import net.minecraft.server.network.LegacyProtocolUtils;
import net.minecraft.util.Mth;
@Environment(EnvType.CLIENT)
public class LegacyServerPinger extends SimpleChannelInboundHandler<ByteBuf> {
private static final Splitter SPLITTER = Splitter.on('\u0000').limit(6);
private final ServerAddress address;
private final LegacyServerPinger.Output output;
public LegacyServerPinger(ServerAddress address, LegacyServerPinger.Output output) {
this.address = address;
this.output = output;
}
@Override
public void channelActive(ChannelHandlerContext channelHandlerContext) throws Exception {
super.channelActive(channelHandlerContext);
ByteBuf byteBuf = channelHandlerContext.alloc().buffer();
try {
byteBuf.writeByte(254);
byteBuf.writeByte(1);
byteBuf.writeByte(250);
LegacyProtocolUtils.writeLegacyString(byteBuf, "MC|PingHost");
int i = byteBuf.writerIndex();
byteBuf.writeShort(0);
int j = byteBuf.writerIndex();
byteBuf.writeByte(127);
LegacyProtocolUtils.writeLegacyString(byteBuf, this.address.getHost());
byteBuf.writeInt(this.address.getPort());
int k = byteBuf.writerIndex() - j;
byteBuf.setShort(i, k);
channelHandlerContext.channel().writeAndFlush(byteBuf).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
} catch (Exception var6) {
byteBuf.release();
throw var6;
}
}
protected void channelRead0(ChannelHandlerContext context, ByteBuf buffer) {
short s = buffer.readUnsignedByte();
if (s == 255) {
String string = LegacyProtocolUtils.readLegacyString(buffer);
List<String> list = SPLITTER.splitToList(string);
if ("§1".equals(list.get(0))) {
int i = Mth.getInt((String)list.get(1), 0);
String string2 = (String)list.get(2);
String string3 = (String)list.get(3);
int j = Mth.getInt((String)list.get(4), -1);
int k = Mth.getInt((String)list.get(5), -1);
this.output.handleResponse(i, string2, string3, j, k);
}
}
context.close();
}
@Override
public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable throwable) {
channelHandlerContext.close();
}
@FunctionalInterface
@Environment(EnvType.CLIENT)
public interface Output {
void handleResponse(int i, String string, String string2, int j, int k);
}
}