Перейти к основному содержимому

Четыре слоя на одном экране

Библиотека разложена на четыре части. Каждая живёт в своём проекте и уезжает в свой пакет NuGet, так что взять можно как весь набор, так и один слой.

Примитивы

McProtoNet.Primitives - нижний этаж. Здесь чтение и запись простых значений: VarInt, строки, позиции, всё то, из чего собраны пакеты. Здесь же владелец памяти MemoryOwner и два типа, на которых сходятся остальные слои: IncomingPacket (номер пакета и его тело) и OutgoingPacket. Снаружи примитивы знают только про NBT.

Транспорт

McProtoNet.Transport превращает байты в пакеты и обратно. Внутри четыре занятия: кадры (Framing), соединения (Connection), сжатие (Compression, libdeflate), шифрование (Cryptography, свой AES/CFB8).

Транспорт отдаёт сырые пакеты: номер и кусок байтов. Что это за пакет и какие у него поля, он не знает и знать не хочет.

Пакетный слой

McProtoNet.Protocol знает пакеты по именам. Он состоит из двух половин. Написанная руками часть (Flow) задаёт правила: как пакет объявляет свой идентификатор, как его разобрать, как разложить обработчики по фазам и направлениям. Сгенерированная часть (Generated) - сами пакеты, вложенные типы, перечисления и реестр, который переводит номер пакета в конкретный тип для нужной версии протокола.

Про транспорт этот слой тоже ничего не знает: ему дают готовый IncomingPacket, он возвращает разобранный пакет.

Клей

Проект McProtoNet соединяет два предыдущих. В нём MinecraftClient: подключение по TCP, опционально через прокси, чтение потока пакетов, отправка, переключатели сжатия и шифра. Тут же типизированная отправка SendAsync<T>, поиск сервера по SRV-записи и детектор серверов в локальной сети.

Клиент намеренно тонкий: фазы ведёт код приложения («Фаза и направление»), там же живёт логика бота.

Что из этого следует

Приложению обычно хватает пакета McProtoNet. Но слои разбираются по одному, и это не случайность - как они друг с другом связаны, разобрано в «Кто кого знает».