Вопрос по Minecraft Protocol

112
02 сентября 2019, 18:50

Тут почитал wiki.vg/Protocol и попробовал составить простенький сервер. Попробовал отправить пакет, содержащий Packet ID, версию протокола, название сервера и его MOTD. Но что-то Minecraft отказывается отображать MOTD, присланный сервером. Что я сделал не так? Server.java:

import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    private static final int PORT = 25565;
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(PORT);
            while (true) {
                Socket client = ss.accept();
                System.out.println("client connected!");
                DataOutputStream dos = new DataOutputStream(client.getOutputStream());
                byte[] a = PacketManager.createHandshakeMessage();
                PacketManager.writeVarInt(dos, a.length);
                dos.write(a);
            }
        } catch (Exception e) {
        }
    }
}

PacketManager.java:

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class PacketManager {
    public static byte [] createHandshakeMessage() throws Exception {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        DataOutputStream handshake = new DataOutputStream(buffer);
        handshake.writeByte(0x00);
        writeVarInt(handshake, 0x07);
        writeString(handshake, "FrikaWorld", StandardCharsets.UTF_8);
        writeString(handshake, "FrikaWorld", StandardCharsets.UTF_8);
        writeVarInt(handshake, 0x64);
        return buffer.toByteArray();
    }
    public static int readVarInt(DataInputStream dis) throws Exception {
        int numRead = 0;
        int result = 0;
        byte read;
        do {
            read = dis.readByte();
            int value = (read & 0b01111111);
            result |= (value << (7 * numRead));
            numRead++;
            if (numRead > 5) {
                throw new RuntimeException("VarInt is too big");
            }
        } while ((read & 0b10000000) != 0);
        return result;
    }
    public static long readVarLong(DataInputStream dos) throws Exception {
        int numRead = 0;
        long result = 0;
        byte read;
        do {
            read = dos.readByte();
            int value = (read & 0b01111111);
            result |= (value << (7 * numRead));
            numRead++;
            if (numRead > 10) {
                throw new RuntimeException("VarLong is too big");
            }
        } while ((read & 0b10000000) != 0);
        return result;
    }
    public static void writeVarInt(DataOutputStream dos, int value) throws Exception {
        do {
            byte temp = (byte)(value & 0b01111111);
            value >>>= 7;
            if (value != 0) {
                temp |= 0b10000000;
            }
            dos.writeByte(temp);
        } while (value != 0);
    }
    public static void writeVarLong(DataOutputStream dos, long value) throws Exception {
        do {
            byte temp = (byte)(value & 0b01111111);
            value >>>= 7;
            if (value != 0) {
                temp |= 0b10000000;
            }
            dos.writeByte(temp);
        } while (value != 0);
    }
    public static void writeString(DataOutputStream out, String string, Charset charset) throws Exception {
        byte [] bytes = string.getBytes(charset);
        writeVarInt(out, bytes.length);
        out.write(bytes);
    }
}
READ ALSO
rdf4j как преобразовать tuples в json

rdf4j как преобразовать tuples в json

Проблема следующая: При парсинге sparql запроса я получаю упрощённое ast и мне нужно его передать в стороннюю библиотеку для дальнейшей обработки,...

131
Проблема в авторизации яндекс диск с помощью retrofit2

Проблема в авторизации яндекс диск с помощью retrofit2

Изучаю Retrofit2, пытаюсь получить токен Yandex disk, в документации яндекса написано, чтобы получить токен необходимо для начала подтвердить разрешения...

117
Адаптивные ImageView в Android

Адаптивные ImageView в Android

В разметке активити есть область, в которой должны поместиться изображения(от 1 до 10)Соответственно они должны заполнять всю эту область...

118
Размеры элементов для разных экранов

Размеры элементов для разных экранов

Заметил что с размерами экрана на телефонах творится что-то непонятноеРешил проверить - создал 3 блока шириной 1080px, 967px(подобрал для своего...

114