Четыре слоя на одном экране
Библиотека разложена на четыре части. Каждая живёт в своём проекте и уезжает в свой пакет 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. Но слои разбираются по одному, и
это не случайность - как они друг с другом связаны, разобрано в
«Кто кого знает».