Как стать автором
Обновить

Создание простого лаунчера для Minecraft на языке программирования Python. | Урок от GOGA20

Уровень сложностиПростой

Всем привет, я Гога. Я начинаю свой путь в развитии программиста. Да, мой код не идеален, но довольно хорош, как по мне.

В данной теме я хочу рассмотреть создание лаунчера для игры Minecraft. Лаунчер будет в консоли. В будущем обязательно выпущу тему о создании лаунчер с GUI. Приступаем!

Для начала нам понадобятся библиотеки: 1) Minecraft-launcher-lib, 2) subprocess.

#команда для установки библиотеки Minecraft-launcher-lib
pip install minecraft-launcher-lib

После установки библиотек приступим к основному коду. Первое что мы должны сделать так это импортировать наши библиотеки.

import minecraft_launcher_lib
import subprocess

После данного действия мы зададим переменную для директории майнкрафт.

Пример 1 (с изменением директории):

minecraft_directory = minecraft_launcher_lib.utils.get_minecraft_directory().replace('minecraft', 'MCLAUNCHER')
#на месте "MCLAUNCHER" можете поставить любое название

Пример 2 (оригинальная директория майнкрафт):

minecraft_directory = minecraft_launcher_lib.utils.get_minecraft_directory()
#оригинальная директория майнкрафт

Далее приступаем к оформлению нашего лаунчера. Ниже я сделал маленькую картинку выходящая в консоль. Ведь как по мне консольное приложение без картинки не интересно.(не обязательный шаг).

print('███╗░░░███╗░█████╗░██╗░░░░░░█████╗░██╗░░░██╗███╗░░██╗░█████╗░██╗░░██╗███████╗██████╗░')
print('████╗░████║██╔══██╗██║░░░░░██╔══██╗██║░░░██║████╗░██║██╔══██╗██║░░██║██╔════╝██╔══██╗')
print('██╔████╔██║██║░░╚═╝██║░░░░░███████║██║░░░██║██╔██╗██║██║░░╚═╝███████║█████╗░░██████╔╝')
print('██║╚██╔╝██║██║░░██╗██║░░░░░██╔══██║██║░░░██║██║╚████║██║░░██╗██╔══██║██╔══╝░░██╔══██╗')
print('██║░╚═╝░██║╚█████╔╝███████╗██║░░██║╚██████╔╝██║░╚███║╚█████╔╝██║░░██║███████╗██║░░██║')
print('╚═╝░░░░░╚═╝░╚════╝░╚══════╝╚═╝░░╚═╝░╚═════╝░╚═╝░░╚══╝░╚════╝░╚═╝░░╚═╝╚══════╝╚═╝░░╚═╝')
print('made by: GOGA20')

Далее давайте добавим прогресс-бар для отображения загрузки.

def printProgressBar(iteration, total, prefix='', suffix='', decimals=1, length=100, fill='█', printEnd="\r"):
    percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filledLength = int(length * iteration // total)
    bar = fill * filledLength + '-' * (length - filledLength)
    print('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end=printEnd)
    if iteration == total:
        print()

def maximum(max_value, value):
    max_value[0] = value

Два данных блока нужны для его отображения. В дальнейшем у нас будут добавлены условия для их работы.

Давайте приступим к выбору версии игры а так же нашего никнейма.

version = input('Select version: ')
username = input('username: ')
print('=======================================================================================')

теперь давайте реализуем обращение для нашего прогресс бара.

max_value = [0]
callback = {
        "setStatus": lambda text: print(text, end='r'),
        "setProgress": lambda value: printProgressBar(value, max_value[0]),
        "setMax": lambda value: maximum(max_value, value)
}

Далее мы начнем нашу установку майнкрафта

minecraft_launcher_lib.install.install_minecraft_version(versionid=version, minecraft_directory=minecraft_directory, callback=callback)
#в дальнейшем если мы будем запускать одну и ту же версию игры эта строчка будет игнорироваться.

ну и последний шаг это запуск игры

options = {
    'username': username,
}

subprocess.call(minecraft_launcher_lib.command.get_minecraft_command(version=version, minecraft_directory=minecraft_directory, options=options))

В итоге если мы сейчас соберем все это в один файл, то получим полноценно работающий лаунчер майнкрафт.

Полный код:

import minecraft_launcher_lib
import subprocess

minecraft_directory = minecraft_launcher_lib.utils.get_minecraft_directory().replace('minecraft', 'chto_za_zalupa')

print('███╗░░░███╗░█████╗░██╗░░░░░░█████╗░██╗░░░██╗███╗░░██╗░█████╗░██╗░░██╗███████╗██████╗░')
print('████╗░████║██╔══██╗██║░░░░░██╔══██╗██║░░░██║████╗░██║██╔══██╗██║░░██║██╔════╝██╔══██╗')
print('██╔████╔██║██║░░╚═╝██║░░░░░███████║██║░░░██║██╔██╗██║██║░░╚═╝███████║█████╗░░██████╔╝')
print('██║╚██╔╝██║██║░░██╗██║░░░░░██╔══██║██║░░░██║██║╚████║██║░░██╗██╔══██║██╔══╝░░██╔══██╗')
print('██║░╚═╝░██║╚█████╔╝███████╗██║░░██║╚██████╔╝██║░╚███║╚█████╔╝██║░░██║███████╗██║░░██║')
print('╚═╝░░░░░╚═╝░╚════╝░╚══════╝╚═╝░░╚═╝░╚═════╝░╚═╝░░╚══╝░╚════╝░╚═╝░░╚═╝╚══════╝╚═╝░░╚═╝')
print('made by: GOGA20')

def printProgressBar(iteration, total, prefix='', suffix='', decimals=1, length=100, fill='█', printEnd="\r"):
    percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filledLength = int(length * iteration // total)
    bar = fill * filledLength + '-' * (length - filledLength)
    print('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end=printEnd)
    if iteration == total:
        print()

def maximum(max_value, value):
    max_value[0] = value

version = input('Select version: ')
username = input('username: ')

print('=======================================================================================')

max_value = [0]

callback = {
        "setStatus": lambda text: print(text, end='r'),
        "setProgress": lambda value: printProgressBar(value, max_value[0]),
        "setMax": lambda value: maximum(max_value, value)
}

minecraft_launcher_lib.install.install_minecraft_version(versionid=version, minecraft_directory=minecraft_directory, callback=callback)

options = {
    'username': username,
}

subprocess.call(minecraft_launcher_lib.command.get_minecraft_command(version=version, minecraft_directory=minecraft_directory, options=options))

Надеюсь, данная статья кому-то помогла. Оставляйте свои комментарии, готов ответить на любые вопросы.

С уважением GOGA20♥

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.