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

Версия → протокол

Minecraft Java Edition различает версии не по имени, а по числу - номеру протокола. От него зависит раскладка полей пакета: библиотека держит по несколько раскладок одного пакета, нужную выбирает номер, пришедший от вызывающего кода. Он передаётся параметром в SendAsync, PacketIo.TryDecode, PacketFlow.Dispatch, PacketRegistry.TryResolve и в первом пакете рукопожатия:

await client.SendAsync(
new HandshakeSb.SetProtocolPacket(Pv, host, port, 2), Pv);

Поддержанный диапазон

Библиотека поддерживает диапазон от 1.16 до 26.2. В коде границы - именованные константы:

public const int StartProtocol = V1_16_Protocol; // 735
public const int LatestProtocol = V26_2_Protocol; // 776

Таблица соответствий

MinecraftVersion.FromProtocol сводит номер к версии; снапшоты и пре-релизы 1.16.2 сведены к строке 1.16.2, 1.16.3-rc1 - к 1.16.3. Полная и постоянно обновляемая таблица версий и номеров протокола - на странице Protocol version на minecraft.wiki.

Версия игрыПротокол
1.16735
1.16.1736
1.16.2751
1.16.3753
1.16.4-1.16.5754
1.17755
1.17.1756
1.18-1.18.1757
1.18.2758
1.19759
1.19.2760
1.19.3761
1.19.4762
1.20-1.20.1763
1.20.2764
1.20.3-1.20.4765
1.20.5-1.20.6766
1.21-1.21.1767
1.21.3768
1.21.4769
1.21.5770
1.21.6771
1.21.7-1.21.8772
1.21.9-1.21.10773
1.21.11774
26.1-26.1.2775
26.2776

Как получить номер программно

MinecraftVersion несёт именованные константы, обратный поиск и полный список - таблицу переписывать в код не нужно:

int pv = MinecraftVersion.V1_21_11; // неявно в int, даёт 774
string name = MinecraftVersion.FromProtocol(772).Name; // "1.21.7–1.21.8"
foreach (var v in MinecraftVersion.AllVersions)
Console.WriteLine($"{v.Name} -> {v.Protocol}");

FromProtocol бросает NotSupportedException на числе вне таблицы, в том числе внутри диапазона 735-776, если оно не отвечает версии.

Номер вне диапазона

Проверки на входе в MinecraftClient нет - она приходит от самих пакетов. У SetProtocolPacket и любого пакета с раскладками по версиям объявлен диапазон:

[ProtocolSupport(MinecraftVersion.StartProtocol, MinecraftVersion.LatestProtocol)]

Номер вне диапазона даёт ProtocolNotSupportException при первой попытке отправить или разобрать пакет, до выхода в сеть. Исключение несёт имя типа, номер и диапазоны, на которых этот тип существует.

Дальше