Сервер Minecraft возвращает ошибку после отправки пакета LoginStartJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Сервер Minecraft возвращает ошибку после отправки пакета LoginStart

Сообщение Anonymous »

Я пытаюсь отправить пакет LoginStart, но сервер отвечает ошибкой.
Весь ответ сервера:

Код: Выделить всё

�{"translate":"disconnect.genericReason","with":["Internal Exception: io.netty.handler.codec.DecoderException: java.lang.IndexOutOfBoundsException: readerIndex(27) + length(8) exceeds writerIndex(34): PooledUnsafeDirectByteBuf(ridx: 27, widx: 34, cap: 34)"]}
MinecraftPlayer класс, запускающий соединение:

Код: Выделить всё

public class MinecraftPlayer {
public Socket sock;

public DataOutputStream output;
public DataInputStream input;

public MinecraftServer server;

public UUID uuid;
public String name;

public MinecraftPlayer(MinecraftServer server, UUID uuid, String name) {
this.server = server;
this.uuid = uuid;
this.name = name;
}

public void startConnection() {
new Thread(() -> {
try {
this.sock = new Socket();

sock.connect(server.host);

this.output = new DataOutputStream(sock.getOutputStream());
this.input = new DataInputStream(sock.getInputStream());

// Отправляем handshake
sendHandshake();

// Отправляем пакет login start
sendLoginStartPacket();

// Читаем ответ от сервера
if (readLoginSuccessPacket()) {
System.out.println("Login Successful!");
} else {
System.out.println("Login Failed!");
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}

private void sendHandshake() throws IOException {
//        System.out.println("send handshake");

OutputPacketContainer packet = new OutputPacketContainer((byte) 0x00);

packet.writeVarInt(server.protocol_version); // Protocol version
packet.writeString(server.host.getHostString()); // Server address
packet.writeShort((short) server.host.getPort()); // Server port as// unsigned short
packet.writeVarInt(2); // Next state (2 for login)

packet.sendPacket(this);
}

private void sendLoginStartPacket() throws IOException {
//        System.out.println("send login start");

OutputPacketContainer packet = new OutputPacketContainer((byte) 0x00);

packet.writeString(name);
packet.writeUUID(uuid);

packet.sendPacket(this);
}

private boolean readLoginSuccessPacket() throws IOException {
int length = readVarInt(input);
int packetId = readVarInt(input);

if (packetId == 0x02) { // Packet ID for login success
UUID uuid = new UUID(input.readLong(), input.readLong()); // UUID is received
String username = readString(input); // Username is received as String
System.out.println("UUID: " + uuid + ", Username: " + username);
return true;
} else if (packetId == 0x00) {
Main.logInputPacket(length, packetId, input.readAllBytes());
//            System.out.println((String)((List)((Map)JSON.load(readString(input))).get("with")).get(0));
}
return false;
}

private int readVarInt(DataInputStream in) throws IOException {
int value = 0;
int bitOffset = 0;
byte b;
do {
b = in.readByte();
value |= (b & 127) >> means that the sign bit is shifted with the rest of the number rather than being left alone
v >>>= 7;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private static void writeVarLong(DataOutputStream output, long v) {
try {
while (true) {
if ((v & ~((long) SEGMENT_BITS)) == 0) {
output.writeByte((int) v);
return;
}

output.writeByte((int) ((v & SEGMENT_BITS) | CONTINUE_BIT));

// Note: >>> means that the sign bit is shifted with the rest of the number rather than being left alone
v >>>= 7;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Думаю, проблема в OutputPacketContainer#writeUUID, но решения не нашел.
Написал код на основе wiki.vg


Подробнее здесь: https://stackoverflow.com/questions/777 ... art-packet
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»