В этом разделе мы разберемся с азами подключения бота к серверу 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: