# 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/` скачивает и импортирует модпак. Ключи 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` (апгрейд со старой версии мастер не показывает).