McProtoNet Help

Настройка и логинизация бота

В этом разделе мы разберемся с азами подключения бота к серверу Minecraft.

Настройка

Сперва нужно создать и настроить класс MinecraftClient:

MinecraftVersion _version = MinecraftVersion.V1_21_4; _client = new MinecraftClient(new MinecraftClientStartOptions() { ConnectTimeout = TimeSpan.FromSeconds(5), Host = host, Port = 25565, WriteTimeout = TimeSpan.FromSeconds(5), ReadTimeout = TimeSpan.FromSeconds(5), Version = (int)_version, // Можно указать прокси // Proxy = ... });

Запуск

Когда MinecraftClient настроен, можно установить соединение с сервером с помощью метода ConnectAsync:

await _client.ConnectAsync();

После успешного вызова этого метода устанавливается TCP-соединение с сервером.

Авторизация и аутентификация

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

Для удобства сделаем метод расширения под названием Login.

public static async Task Login( this IMinecraftClient client, string nickname, string host, ushort port)

Рукопожатие

Серверу необходимо передать информацию о текущем соединении, включая версию протокола и дальнейшие действия. Эту задачу выполняет пакет рукопожатия, представленный в McProtoNet классом SetProtocolPacket.

await client.SendPacket( new SetProtocolPacket() { NextState = 2, ProtocolVersion = client.ProtocolVersion, ServerHost = host, ServerPort = port });

Режим Login

Когда NextState равен 2, сервер воспринимает текущее соединение как вход игрока в игру. На этом этапе необходимо передать серверу наш никнейм:

await client.SendPacket( new LoginStartPacket { Username = nickname });

Вслед за этим сервер нам отправит некоторые важные пакеты. Давайте их прочитаем и обработаем:

await foreach (var serverPacket in client.OnAllPackets(PacketState.Login)) { // Обработка }

Сжатие

if (serverPacket is CLogin.CompressPacket compressPacket) { client.SwitchCompression(compressPacket.Threshold); }

Шифрование

if (serverPacket is CLogin.EncryptionBeginPacket encryptBegin) { var RSAService = CryptoHandler.DecodeRSAPublicKey(encryptBegin.PublicKey); var secretKey = CryptoHandler.GenerateAESPrivateKey(); var sharedSecret = RSAService.Encrypt(secretKey, false); var verifyToken = RSAService.Encrypt(encryptBegin.VerifyToken, false); var response = new EncryptionBeginPacket // это клиентский пакет { SharedSecret = sharedSecret, VerifyToken = verifyToken }; await client.SendPacket(response); client.SwitchEncryption(secretKey); }

Кик с сервера

if (serverPacket is CLogin.DisconnectPacket disconnectPacket) { Console.WriteLine("Disconnect: " + disconnectPacket.Reason); }

Успешный вход

Если сервер Вас не кикнул и отправил все нужные пакеты, то это означает, что бот успешно прошёл авторизацию.

Режим конфигурации

Шаги выше приводят к успешному заходу бота на сервер, но лишь на версиях ниже 764. Если же Вы запускаете бота на новых версиях майнкрафт, то будьте готовы пройти режим конфигурации.

Для этого перед этим нужно отправить на сервер пакет LoginAcknowledged:

await client.SendPacket(new LoginAcknowledgedPacket());

Теперь текущее соединение находится в режиме конфигурации. Отправим пакет с настройками:

await client.SendPacket(new SConfig.SettingsPacket() { Locale = "ru_ru", ViewDistance = 16, EnableServerListing = false, EnableTextFiltering = false, MainHand = 0, SkinParts = 127, ChatColors = true, ChatFlags = 0 });

Затем запускаем цикл чтения и конфигурируем:

await foreach (var packet in client.OnAllPackets(PacketState.Configuration)) { if (packet is CConfig.FinishConfigurationPacket) { // Succes configuration await client.SendPacket(new SConfig.FinishConfigurationPacket()); break; } if (packet is CConfig.KeepAlivePacket.V764_769 keepAlivePacket) { await client.SendPacket(new SConfig.KeepAlivePacket() { KeepAliveId = keepAlivePacket.KeepAliveId }); } else if (packet is CConfig.PingPacket.V764_769 pingPacket) { await client.SendPacket(new SConfig.PongPacket() { Id = pingPacket.Id }); } else if (packet is CConfig.CustomPayloadPacket.V764_769 payload) { await client.SendPacket(new SConfig.CustomPayloadPacket.V764_769() { Data = payload.Data, Channel = payload.Channel }); } else if (packet is CConfig.SelectKnownPacksPacket) { await client.SendPacket(new SConfig.SelectKnownPacksPacket()); } }

После получения FinishConfigurationPacket бот может полноценно переходить в Play режим.

Last modified: 17 February 2025