Minecraft: получение сжатых пакетов - PullRequest
0 голосов
/ 06 августа 2020

Я начал кодировать клиент Minecraft с помощью Python. Я закодировал рукопожатие, логин и т. Д. c. но я не могу написать код, который получает сжатые пакеты (или я думаю).

Мой клиент получает каждый пакет. Если пакет является пакетом проверки активности, он отвечает. Но есть проблема. Когда он получает пакет подтверждения активности, он всегда большой. Я смотрю на исходный размер пакета, и он говорит, что в моем пакете 60 КБ дополнительных байтов. Сервер кикает из-за лишних байтов.

Я удалил свой код и написал еще один. Это работает, но это неправильно. Потому что он только редактирует пакет и отправляет на сервер. Я смотрю на размер отправленного пакета, и он снова больше 60 КБ.

Я ничего не понял. Я только читаю документацию и преобразовываю ее в код.

Документация: https://wiki.vg/Protocol#With_compression

Мой код (позади много функций, они делают то, что я написал):

# socket and threshold variables are defined before

# getvarint  => receives the first valid varint from given socket
# recvall    => receives as much as given
# encode     => encodes as varint
# decompress => zlib.decompress

while True:

    datalen = getvarint(socket.recv)
    data = recvall(socket.recv, datalen)

    uncompressedlen = getvarint(data)
    data = data[len(encode(uncompressedlen)):]

    if uncompressedlen > 0:
        if uncompressedlen < threshold:
            socket.close()
            print('Closed')
            exit()

        data = decompress(data)
...