Search
Write a publication
Pull to refresh

Свой лаунчер для майнкрафт на python

Level of difficultyEasy

Часть 1. Установка и обход авторизации mojang

Привет, Хабр!

Я начал разработку своего личного лаунчера для майнкрафт, но столкнулся с проблемой, это поиск информации о создании лаунчера. После того как я поискал в интернете, то столкнулся с гайдами на ютуб, где показываю, как создать свой лаунчер для майнкрафт на C#, Python и т. д., но они показывают пример с документации, а нюансы типа как указывать java аргументы или установить там forge или optifine не объясняют, но зато узнал про такую библиотеку, как minecraft launcher lib, так ещё и на питоне, что не может не радовать. Так вот разобравшись во всём этом я хочу поделиться с интернетом о создании своего лаунчера для майнкрафт. Я сделаю серию гайдов по реализации тех или иных фич.

Начинаем!

Установка библиотеки

  1. Сначала нам нужно создать папку, где будет храниться наш лаунчер и открыть её в IDE, я буду использовать vs code.

  2. После мы переходим в неё с помощью cd в терминале или cmd, после выполняем команды:

    # Linux
    python3 -m venv .venv # Создаем venv
    source .venv/bin/activate # Активируем venv
    # Windows
    python -m venv .venv # Создаем venv
    .venv\Scripts\activate # Активируем venv
  3. Устанавливаем библиотеку с помощью команды:

# Linux
pip3 install minecraft_launcher_lib
# Windows
pip install minecraft_launcher_lib

Всё, библиотека установлена, ура!

Теперь создадим в нашей директории файл ` main.py `, после импортируем библиотеку minecraft launcher lib и subprocess для запуска

import minecraft_launcher_lib as mll
import subprocess

Я же ещё сделаю псевдоним mll, для удобства.

Всё, основное мы сделали, теперь переходим к сладкому.

Установка майнкрафта и запуск

Давайте сначала создадим переменные, путь к майнкрафту и версию с ником.

path = "/path/to/minecraft"
version = "1.16.5"
nickname = "Guid"

Если вам нужен путь по умолчанию, то можно указать путь с помощью функции:

path = mll.utils.get_minecraft_directory() # Путь по умолчанию: ~/.minecraft на линуксе или ~\AppData\local\.minecraft на виндовсе

Я вам советую для тестов использовать новую версию, так как мы будем обходить авторизацию через microsoft, а проверить это можем через версию, ну или через логи, которые будут.

После нам надо будет установить саму версию версию майнкрафт, что можем сделать через функцию install_minecraft_version(), которая находится в модуле install:

mll.install.install_minecraft_version(versionid=version, minecraft_directory=path)

В функции указываем параметры
versionid - версия игры, указываем нашу переменную version
minecraft_directory - путь, где храниться наш майнкрафт, указываем переменную path"
Также есть ещё параметр callback, но о нем позже.

После чего создадим options, это словарь, где будут храниться настройки лаунчера и пользователя(никнейм, токен, uuid, jvm arguments и т.д)
Можно создать свой словарь или сгенерировать, удобнее будет свой создать:

options = {
  "username": nickname # Наш ник
}

В словаре указываем элемент username

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

Дальше нам нужно сформировать команды для запуска майнкрафт, это можно сделать с помощью функции get_minecraft_command(), которая находится в модуле command:

command = mll.command.get_minecraft_command(version=version, minecraft_directory=path, options=options)

Эту функцию помещаем в переменную для удобства, после чего указываем параметры:
version - версия игры, указываем нашу переменную version
minecraft_directory - путь, где лежит наш майнкрафт, указываем переменную path
options - настройки лаунчера и запуска игры, тоже указваем наш словарь

Ура! Остался один штрих.

Теперь будем запускать, наш майнкрафт, для этого мы используем библиотеку subprocess, которую импортировали в начале, у него будем использовать функцию run:

subprocess.run(command)

В функцию осталось поместить нашу переменную command, где хранится команда для запуска майнкрафт.

Вот весь код:

import minecraft_launcher_lib as mll
import subprocess

path = "C:\\Users\\<username>\\Documents\\guid_mine"
version = "1.16.5"
nickname = "Guid"

mll.install.install_minecraft_version(versionid=version, minecraft_directory=path)

options = {
    "username": nickname
}

command = mll.command.get_minecraft_command(version=version, minecraft_directory=path, options=options)
subprocess.run(command)

Ура! *Если все получилось
Теперь можно запустить код

Обход авторизации mojang

После запуска вы наверное заметили, что у вас не работает сетевая игра, и мы сейчас это поправим.

Объясняю, при запуске майнкрафта идёт проверка на аккаунт через сервера майкрософт, если вы тестили на старой версии, то там явно работала сетевая игра, а на новых уже нет, так как там сделали проерку на аккаунт, но если сменить сервер авторизации, то мы спокойно сможем играть в сетевую игру, но минус того что играть сможем только на серверах, где не нужна лицензия.

Чтобы провернуть трюк со сменой сервера авторизации, нам нужно установить authlib injector и указать его запуск в jvm-arguments, вот ссылка на гитхаб, где можно его установить: https://github.com/yushijinhun/authlib-injector.

После установки закидываем его в папку с майнкрафтом, ну или в любое другое место, где удобно в общем. После этого мы добавляем ключ-пару в наш словарь options:

options = {
  "username": nickname,
  "jvmArguments": [
    "-javaagent:path/to/authlib-injector.jar=ely.by"
  ]
}

Если у вас authlib injector называется по-другому, то лучше переименовать его в authlib-injector.jar или в пути, где javaagent:path, указать в конце название скачанного файла authlib-injector-1_2_5.jar например, через равно указываем сервер авторизации, я указываю elyby.
После этого сохраняем и запускаем код.

[authlib-injector] [ERROR] Failed to fetch metadata: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Если у вас вышла такая ошибка, то не переживайте, её можно исправить.
Для этого мы устанавливаем java jre с официального сайта. После этого находим путь к запускаемому файлу java и копируем, вот:
Windows: "C:\Program Files\Java\jre<версия>\bin\java.exe"
Linux: "/usr/local/bin/java" (точно не знаю как выглядить запускаемый файл java в линуксе)

После этого добавляем аргумент executablePath в наш словарь options:

options = {
    "username": nickname,
    "jvmArguments": [
        "-javaagent:C:\\Users\\Pasha\\Documents\\mine\\authlib-injector.jar=ely.by"
    ],
    "executablePath": "C:\\Program Files\\Java\\jre1.8.0_451\\bin\\java.exe"
}

Теперь снова запускаем код(не забываем экранировать бекслеш на виндовсе)

Ура! У нас теперь работает сетевая игра, а эта часть создания лаунчера закончена!

Вот весь получившийся код:

import minecraft_launcher_lib as mll
import subprocess

path = "C:\\Users\\<username>\\Documents\\mine"
version = "1.16.5"
nickname = "Guid"

#mll.install.install_minecraft_version(versionid=version, minecraft_directory=path, callback={"setProgress":lambda e: print(e)})

options = {
    "username": nickname,
    "jvmArguments": [
        "-javaagent:C:\\Users\\<username>\\Documents\\mine\\authlib-injector.jar=ely.by"
    ],
    "executablePath": "C:\\Program Files\\Java\\jre1.8.0_451\\bin\\java.exe"
}

command = mll.command.get_minecraft_command(version=version, minecraft_directory=path, options=options)
subprocess.run(command)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.