Офлайн-лаунчер Minecraft: аккаунты без Microsoft, установка версий и лоадеров (Fabric, Quilt, Forge, NeoForge), каталог модпаков Modrinth, поиск и обновление модов, разбор вылетов, системный трей, автозагрузка, плагины, прокси и зеркала.
216 lines
18 KiB
Markdown
216 lines
18 KiB
Markdown
# PixelLauncher
|
||
|
||
Компактный оффлайн-лаунчер Minecraft в стиле **LiteLauncher**: тёмное минималистичное окно, пиксельный пейзаж-баннер, большая зелёная кнопка «ИГРАТЬ» и пилюля с версией.
|
||
|
||
## Возможности
|
||
|
||
- **Оффлайн-режим** — ник + сгенерированный по правилам Mojang UUID
|
||
- **Менеджер аккаунтов** — несколько ников, клик по нику в шапке для быстрого
|
||
переключения, управление в «Аккаунты…»
|
||
- **Все версии** из официального манифеста Mojang (920+): релизы, снапшоты, старые версии
|
||
- **Лента новостей** — последние версии прямо на главном экране (клик выбирает версию)
|
||
- **Fabric и Quilt** — установка модлоадера одной кнопкой
|
||
(меню → «Установить Fabric/Quilt…»): скачивается JSON профиля, файлы
|
||
лоадера докачиваются при первом запуске
|
||
- **Автодокачка** client jar, библиотек, нативов и ассетов с проверкой SHA-1 (многопоточно)
|
||
- **Отмена загрузки** — кнопка «■ ОТМЕНА» под статусом во время докачки
|
||
- **Зеркала скачивания** — если официальные серверы Mojang плохо грузятся,
|
||
укажите зеркала в настройках (по одному в строке)
|
||
- **Автозагрузка Java** — если подходящей Java нет, лаунчер сам скачает JRE
|
||
с Eclipse Adoptium (~45 МБ) в `.launcher/runtime/` и запустит игру
|
||
- **Детектор вылетов** — при ненулевом коде завершения журнал открывается сам
|
||
и показывает хвост лога с ошибкой
|
||
- **Живой лог игры** — вывод игры течёт в окно «Журнал» в реальном времени
|
||
- **Очистка версий** — меню → «Очистка версий…»: размер каждой установленной
|
||
версии, удаление ненужных и подчистка неиспользуемых ассетов
|
||
- **Моды** — меню → «Моды…»: список установленных модов с включением/выключением
|
||
(переименование в `mods-disabled`), удалением и поиском в **Modrinth**
|
||
(нужен только стандартный HTTP) — установка одной кнопкой под текущую
|
||
версию и загрузчик
|
||
- **Импорт модпаков** `.mrpack` (CurseForge/Modrinth-пакеты): скачивание файлов
|
||
по индексу, раскладка оверрайдов, проверка путей
|
||
- **Обновления модов** — в «Моды…» кнопка «Проверить обновления»: включённые
|
||
моды сверяются с Modrinth по SHA-1 (батчи через `POST /version_files`),
|
||
свежие версии скачиваются, старый jar отключается в `.disabled`
|
||
- **Разбор вылетов** — после аварийного завершения журнал сам называет причину:
|
||
нехватка ОЗУ (с подсказкой `-Xmx`), проблема с Java, исключение (корневое
|
||
`Caused by`) и виновный мод — с вопросом «Отключить его?»
|
||
- **Профили запуска** — меню → «Профили…»: несколько профилей (ник, версия,
|
||
ОЗУ, полный экран и по желанию набор включённых модов), переключение
|
||
одной кнопкой, имя активного профиля в пилюле
|
||
- **Миры и копии** — меню → «Миры и копии…»: список миров с размером и датой,
|
||
ZIP-копия по одному миру с капом последних копий (настраивается),
|
||
удаление копий и миров, быстрый переход в папку копий
|
||
- **Избранные версии** — ★ в диалоге версий закрепляет версию сверху,
|
||
фильтр «только избранные», частые (по статистике запусков) поднимаются
|
||
вверх списка
|
||
- **Трей** — свёртывание в трей (иконка в области уведомлений), плашки о
|
||
статусе запуска/вылета, контекстное меню с командами лаунчера
|
||
- **История и статистика** — меню → «История…»: сколько раз запускалась каждая
|
||
версия, суммарное и последнее время игры, сводка вылетов
|
||
- **Прокси** — настройки → сеть: HTTP и SOCKS5 (с авторизацией), проверка
|
||
соединения кнопкой
|
||
- **Настройки запуска игры** — профиль: пресеты JVM (мало RAM / быстро /
|
||
безопасно / чисто / для Fabric), разрешение и полный экран, окно игры
|
||
- **Архив логов** — окно «Журнал» показывает сеанс и все прошлые
|
||
`game-*.log` с поиском по тексту (Ctrl+F, «только ошибки»)
|
||
- **Скин** — предпросмотр фронтального вида по нику (кэш mc-heads.net) или
|
||
своё фото (PNG 64×64), кнопка рядом с ником
|
||
- **Сцены баннера** — день / ночь / незер / пещера или случайная при каждом
|
||
открытии (меню → «Сцена баннера»)
|
||
- **Масштаб интерфейса** 100/125/150% (настройки), ярлык текущей версии на
|
||
рабочем столе, экспорт/импорт настроек в JSON
|
||
- **Быстрые повторные запуски** — см. раздел «Скорость»
|
||
- **Проверка целостности** — меню → «Проверить файлы игры…» (полный пересчёт SHA-1)
|
||
- **Наследование версий** (`inheritsFrom`), виртуальные ассеты для старых версий
|
||
- **Автоподбор Java** под конкретную версию игры (PATH, JAVA_HOME, Program Files, ~/.jdks, /usr/lib/jvm)
|
||
- **Профиль**: ник, ОЗУ (или «авто» по памяти системы), Java, JVM-аргументы
|
||
- **Резервная копия миров** в ZIP
|
||
- **Выбор версии** в отдельном диалоге: поиск-фильтр, даты релиза, отметка
|
||
снапшотов и локальных (Fabric/Quilt) версий
|
||
- **Язык интерфейса RU/EN** — переключается в настройках
|
||
- **Акцентный цвет** — пять вариантов в настройках
|
||
- **Окно можно менять по размеру** — захват за «◢» в правом нижнем углу
|
||
- **Быстрый доступ к папкам** — игры, миров и скриншотов прямо из меню
|
||
- **Журнал** с цветными сообщениями (успех/ошибка/предупреждение) и Ctrl+C для копирования
|
||
- **Лог запуска игры** — полный вывод пишется в `.launcher/logs/game-*.log`
|
||
- **Автообновление лаунчера** — меню → «Проверить обновление лаунчера…» и
|
||
тихая проверка при старте: манифест `/update.json`, скачивание установщика
|
||
с проверкой SHA-256, запуск обновления в один клик
|
||
- **Своё зеркало API** — запросы к Modrinth и манифесту Mojang идут через
|
||
прокси на VPS; при сбое зеркало отключается до конца сессии и запрос уходит
|
||
напрямую, на официальный путь
|
||
- Без сторонних библиотек — только tkinter
|
||
|
||
## Запуск
|
||
|
||
```
|
||
python main.py
|
||
```
|
||
|
||
Или двойной клик по `run.bat` (Windows).
|
||
|
||
Требуется Python 3.8+ с tkinter. Дополнительные библиотеки ставить **не нужно**.
|
||
|
||
### Сборка установщика
|
||
|
||
```
|
||
python make_installer.py
|
||
```
|
||
|
||
Собирает `PixelLauncherSetup<версия>.exe` прямо в папке проекта. Внутри —
|
||
embeddable Python той же версии + заимствованный tkinter/Tcl, приложение и
|
||
иконка; установка в `%LOCALAPPDATA%\PixelLauncher` без прав администратора
|
||
(скрипт `installer.iss`, нужен Inno Setup 6 с `ISCC.exe`). Версия в
|
||
`installer.iss` должна совпадать с `LAUNCHER_VERSION`; после новой сборки
|
||
обновите файл и `update.json` на сервере.
|
||
|
||
## Плагины и протокол
|
||
|
||
- **Плагины** — файлы Python в папке `plugins` рядом с `main.py`:
|
||
константы `PLUGIN_NAME/VERSION/AUTHOR/DESCRIPTION`, функция `on_load(api)`
|
||
(подписки `api.on(...)`, кнопки `api.add_action(...)`) и необязательный
|
||
`on_unload()`. События: `launcher_ready`, `before_launch`,
|
||
`after_launch`, `game_exit`, `profile_switched`, `account_switched`,
|
||
`launcher_closing`. Своё json-хранилище плагина — `plugins/storage/`.
|
||
Управление: меню ⚙ → «Плагины…» (пересканирование, удаление) и
|
||
«Магазин плагинов…» (каталог с сайта).
|
||
- **Протокол `pixellauncher://`** — ссылки с сайта: `plugin/<файл.py>`
|
||
ставит плагин из магазина, `mrpack/<url>` скачивает и импортирует
|
||
модпак. Ключи HKCU пишет установщик; если лаунчер уже открыт, ссылка
|
||
уходит в очередь и обрабатывается работающей копией.
|
||
- Формат плагинов совпадает с верстаком на сайте (`/constructor`);
|
||
каталог магазина — `/plugins/catalog.json`.
|
||
|
||
## Скорость
|
||
|
||
Повторные запуски не тратят время на лишнюю работу:
|
||
|
||
- **Манифест версий** (около 1.5 МБ) не перекачивается каждый раз: свежий кэш
|
||
(до 1 часа) читается с диска — загрузка списка занимает ~0.1 с вместо ~2 с.
|
||
«Обновить список версий» в диалоге принудительно ходит в сеть.
|
||
- **JSON версии** кэшируется на 6 часов и не качается заново при каждом запуске.
|
||
- **Проверка уже скачанных файлов** — по размеру (один `stat` на файл) вместо
|
||
полного чтения и пересчёта SHA-1. Для версии с 3000+ ассетов это секунды
|
||
на каждом старте. Полная проверка SHA-1 — по запросу:
|
||
меню → «Проверить файлы игры…».
|
||
- **Обнаружение Java** кэшируется (`.launcher/java_cache.json`): `java -version`
|
||
прогоняется по кандидатам один раз, повторные запуски берут версию из кэша.
|
||
- **Нативы** распаковываются один раз: повторная распаковка пропускается, пока
|
||
natives-jar'ы не изменились (сигнатура в `.stamp`).
|
||
- **Загрузка файлов** — до 32 параллельных потоков, прогресс обновляется по
|
||
мере готовности каждого файла.
|
||
|
||
## Интерфейс
|
||
|
||
- **Верхняя панель**: логотип, ник (клик — переключение аккаунтов),
|
||
шестерёнка — меню (профиль, профили запуска, аккаунты, версии, Fabric/Quilt,
|
||
копия, миры и копии, плагины, магазин плагинов, скачивание, очистка, папки,
|
||
журнал, настройки, о программе)
|
||
- **Баннер**: пиксельный пейзаж с заголовком PIXEL LAUNCHER, тянется на всю
|
||
ширину окна; сцена переключается в меню (день/ночь/незер/пещера/random)
|
||
- **ИГРАТЬ** — большая зелёная кнопка с анимацией нажатия
|
||
(цвет = акцентный цвет из настроек)
|
||
- **Пилюля** `Minecraft <версия>` — клик открывает список версий
|
||
- **Лента «Последние версии»** — 3 свежие версии из манифеста, клик выбирает версию
|
||
- Внизу — тонкая полоса прогресса и строка статуса; во время загрузки под
|
||
статусом появляется кнопка отмены
|
||
- Кнопка «—» сворачивает лаунчер в трей (кнопка «×» закрывает)
|
||
- Диалоги со списком версий идут в тёмном оформлении (Windows 10/11)
|
||
|
||
Все файлы игры хранятся в `.minecraft` рядом с лаунчером (меню → Настройки).
|
||
|
||
## Структура
|
||
|
||
```
|
||
main.py точка входа
|
||
launcher/
|
||
ui.py интерфейс: окно, баннер, диалоги
|
||
config.py настройки (settings.json), аккаунты, зеркала
|
||
i18n.py перевод интерфейса (RU/EN)
|
||
manifest.py манифест версий Mojang + кэш, локальные версии
|
||
version.py разбор JSON версии, classpath, аргументы
|
||
downloader.py докачка библиотек/ассетов, зеркала, отмена, нативы
|
||
java.py поиск и выбор Java
|
||
java_fetch.py автозагрузка JRE с Eclipse Adoptium
|
||
mods.py установщик Fabric/Quilt + менеджер модов, обновления
|
||
modrinth.py поиск и установка модов с Modrinth API (+ POST /version_files)
|
||
mrpack.py импорт модпаков .mrpack
|
||
crash.py разбор логов вылетов: причина и виновный мод
|
||
worlds.py список миров, ZIP-копии с капом, удаление
|
||
stats.py история запусков и статистика игры
|
||
tray.py иконка в трей, меню и плашки (Windows)
|
||
launch.py оффлайн-UUID, запуск, живой лог, код завершения
|
||
http.py HTTP-хелперы: повторы, SHA-1, прогресс, отмена, прокси,
|
||
зеркала API (одна попытка через зеркало, затем напрямую)
|
||
selfupdate.py автообновление: манифест /update.json, SHA-256, установщик
|
||
onboarding.py мастер первого запуска: язык, ник, ОЗУ
|
||
plugins.py плагины: загрузка .py, события, API, хранилище, магазин
|
||
protocol.py протокол pixellauncher:// и одна живая копия лаунчера
|
||
```
|
||
|
||
## Примечания
|
||
|
||
- Работает только оффлайн-режим Minecraft (серверы в offline-режиме).
|
||
- Java: 1.20.5+ → Java 21+, 1.16–1.20 → Java 17+, 1.12–1.16 → Java 8/11.
|
||
Лаунчер подберёт подходящую автоматически, а если Java не найдена —
|
||
скачает её с Eclipse Adoptium и положит в `.launcher/runtime/`.
|
||
- Лента новостей собирается из манифеста версий Mojang
|
||
(официальные RSS-эндпоинты minecraft.net закрыты).
|
||
- Зеркала скачивания задаются в настройках (по одному URL в строке);
|
||
SHA-1 у файлов одинаков на любых зеркалах, проверка не меняется.
|
||
- Прокси (HTTP/SOCKS5) применяется ко всем запросам лаунчера, включая
|
||
загрузку файлов игры, поиск модов и установку модпаков.
|
||
- Манифест автообновления и зеркала API живут на VPS и доступны по домену:
|
||
база обновлений — `https://pixellauncher.ru` (`UPDATE_BASE` в
|
||
`selfupdate.py`), зеркала — `https://pixellauncher.ru/proxy/…`. HTTPS
|
||
выпущен Let's Encrypt (certbot), автопродление — snap-таймер certbot.
|
||
- Установленный лаунчер не пишет в системные папки: файлы игры, `settings.json`
|
||
и сам лаунчер лежат в `%LOCALAPPDATA%\PixelLauncher`, деинсталлятор не
|
||
трогает `.minecraft` и журналы.
|
||
- При первом запуске показывается мастер первоначальной настройки (язык,
|
||
ник, ОЗУ) — `launcher/onboarding.py`. Он закрывается кнопкой
|
||
«Пропустить настройку», после чего не появляется снова: флаг
|
||
`onboarding_done` в `settings.json` (апгрейд со старой версии мастер
|
||
не показывает).
|