Главная и запуск
Выбор активной сборки и ника игрока, быстрый запуск Minecraft, виджеты главной страницы, игровые показатели и элементы быстрого доступа.
Большая практическая вики проекта
Не короткая памятка, а подробный путеводитель по Cryndel Launcher: каждый основной экран, сценарии использования, игровые профили, моды, все разделы настроек и создание расширения с примерами. Про формат .mpcryn здесь описан только импорт.
Возможности
Cryndel Launcher объединяет управление игровыми профилями и настройку самого лаунчера. Доступные разделы собраны здесь, чтобы быстро понять, куда идти за нужной функцией.
Выбор активной сборки и ника игрока, быстрый запуск Minecraft, виджеты главной страницы, игровые показатели и элементы быстрого доступа.
Создание, выбор, редактирование и удаление игровых профилей. В профиле видны версия Minecraft, загрузчик, выделенная память, заметки и Quick Play.
Поиск контента с фильтрами по типу, версии и загрузчику. Можно устанавливать совместимые проекты в выбранную сборку; модпаки доступны как сборки.
Просмотр модов конкретной сборки, поиск, включение или отключение модов, удаление, проверка целостности, эвристическое сканирование и метаданные Lockfile.
Сводка о состоянии сборки, анализ доступных логов запуска, история событий, рекомендации, отключение подозрительных модов, создание снимка и откат.
Установка плагинов из ZIP, включение и отключение, перезагрузка, просмотр предупреждений и настройка полей или JSON-конфига.
Галерея снимков с фильтром по сборке. Снимок можно открыть или скопировать; F2 в игре сохраняет кадр в привычное место Minecraft.
Встроенная страница My Cryndel с настройкой масштаба и опцией не выгружать страницу в фоне. Есть отдельный встроенный браузер лаунчера.
Темы, акцентный цвет, CSS, фон, шрифты, позиция навигации, музыка и интерфейсные звуки. Есть русская и английская локализации.
Некоторые действия зависят от выбранной сборки, сетевого доступа и текущих версий Minecraft/модов. Функции сервера, магазина или стороннего сервиса не следует считать гарантированными возможностями лаунчера.
Игровые профили
Сборка — отдельный игровой профиль со своей папкой, модами и настройками. Профили можно держать раздельно, например для чистой игры, модов и тестов.
Обычная игра без модового загрузчика.
Популярная платформа для модов; в мастере сборки доступны дополнительные Fabric-моды.
Загрузчик для совместимых Forge-модов.
Отдельный загрузчик семейства Forge, используемый современными модами.
Загрузчик на базе экосистемы Fabric; проверяй требования конкретного мода.
После создания в списке сборок можно переименовать профиль, изменить версию, загрузчик и объём RAM, открыть его папку или удалить запись профиля.
Начальные значения мастера — название «Моя сборка», Fabric, автоматический подбор памяти, Quick Play включён и адрес cryndel.ru:25565. Дополнительная версия Minecraft подгружается из доступного списка релизов; если список не загрузился, форма сохраняет рекомендуемую начальную версию.
В расширенных настройках можно изменить адрес/порт сервера и Discord RPC. При создании мастер также записывает выбранную версию языка интерфейса игры (сейчас стартовое значение ru), guiScale 3 и toggle-sprint/sneak keybinds как расширенные параметры. Добавление записи сервера включено по умолчанию.
Для Fabric форма предлагает дополнительные пункты: Sodium + Fabric API, настройку Sodium, Fadeless, Simple Voice Chat, Emotecraft, Xaero's Minimap, Xaero's World Map, Iris, Mod Menu, Litematica, Replay Mod и Cryem. В текущем мастере большинство пунктов отмечено изначально; Litematica и Replay Mod — выключены. Список модов применяется после создания профиля, а установка отдельных рекомендованных элементов может не удаться при сетевой ошибке.
Профиль способен содержать больше параметров, чем форма создания показывает как элементы управления. Например, это не означает, что любой параметр профиля можно поменять именно в мастере.
Перед установкой проверь версию Minecraft и загрузчик, которые требует мод. Один и тот же мод не обязан работать одновременно на Fabric и Forge.
Если в каталоге доступны готовые сборки Cryndel, выбери нужную и нажми «Создать из пака».
.mrpackКнопка импорта в разделе сборок предназначена для совместимых Modrinth-паков. Это отдельный формат и отдельный сценарий, не MPCRYN.
Перенос сборки
.mpcrynНиже описан только импорт. MPCRYN — контейнер сборки Cryndel: внутри находится описание профиля и файлы игры, например моды, конфиги, миры, ресурспаки и игровые настройки.
Для импорта нужен полученный от автора файл .mpcryn (также принимаются .cryn и .mcpack). Двойной щелчок по файлу открывает Cryndel, если лаунчер назначен приложением по умолчанию. Импорт создаёт отдельный новый профиль и не требует вручную раскладывать содержимое архива.
.mpcryn..mpcryn. Файлы .plcryn ставят пакет Plugin API, а не сборку.build.mpcryn.json с типом mpcryn, и показывает краткую информацию.Из файлов сборки переносятся содержимое игрового каталога и папки, в которых находятся моды, конфиги, миры, ресурспаки и options.txt. Параметры профиля берутся из манифеста.
Появится отдельная сборка в группе «Импорт». Она станет выбранной, а лаунчер откроет её страницу. Сам запуск игры выполняется отдельно кнопкой «Играть».
Импортируй контейнер только от человека или источника, которому доверяешь. Внутри могут быть игровые файлы и моды от сторонних авторов; перед запуском незнакомой сборки разумно проверить её состав.
Проверь расширение файла, повторно получи его от отправителя и убедись, что файл не повреждён. Формат должен содержать манифест build.mpcryn.json с поддерживаемым типом контейнера.
Это руководство намеренно ограничено импортом MPCRYN: создание/публикация контейнера и внутреннее устройство его полной логики здесь не разбираются.
Расширения
Плагин — папка с manifest.json и JavaScript-файлом. Лаунчер запускает точку входа при активации плагина и передаёт ей ограниченный объект api.
cryndel-greeting/
├── manifest.json
└── index.js
Если плагину нужны собственные файлы данных, можно добавить их отдельно. Настройки из интерфейса хранятся в конфигурации плагина; API storage читает и записывает данные в папке именно этого плагина.
manifest.json{
"id": "cryndel-greeting",
"name": "Приветствие",
"version": "1.0.0",
"description": "Пример плагина",
"author": "Ваше имя",
"main": "index.js",
"api": 4,
"permissions": [],
"settings": [
{
"key": "message",
"label": "Текст приветствия",
"type": "text",
"default": "Привет!"
}
]
}
1.0.0.index.js.api: 4; плагины API v2 сохраняют совместимость со старыми методами.index.jsmodule.exports = {
async activate(api) {
const message = await api.config.get('message', 'Привет!');
api.log('Плагин активирован');
api.ui.toast(message, 'ok');
},
async deactivate(api) {
api.log('Плагин выключен');
}
};
Точка входа должна экспортировать функцию или объект с функцией activate(api). Для аккуратного выключения можно экспортировать deactivate(api). Ошибки плагина выводятся как предупреждения и не должны ломать загрузку остальных расширений.
Поле схемы описывает ключ, подпись, тип и начальное значение. Пользователь меняет значения прямо на странице «Плагины»; после изменения они сохраняются в конфиге этого плагина.
| Тип | Поля схемы | Как отображается |
|---|---|---|
text (по умолчанию) | key, label, default, placeholder | Текстовое поле. |
bool, toggle, checkbox | key, label, default | Переключатель. |
number | key, label, default, min, max | Поле числа. |
range | key, label, default, min, max | Ползунок. |
select | key, label, default, options | Список вариантов-строк или объектов { value, label }. |
Для пользовательских параметров используй api.config/api.settings. Для собственных файлов плагина предназначен api.storage. Не записывай их в произвольные системные пути.
manifest.json и файлы плагина в корень. Обычная папка-обёртка тоже поддерживается: лаунчер распаковывает содержимое каталога с манифестом.Интерфейс расширений
Лаунчер передаёт API в activate(api). Пользуйся только документированными точками входа и не рассчитывай на доступ к внутренним модулям приложения.
api.apiVersionТекущая версия Plugin API — 4. Новые пространства имён включаются, когда манифест указывает "api": 4.
api.manifestДанные манифеста плагина, переданные лаунчеру.
api.log(...args)Записывает информационное сообщение в журнал лаунчера.
api.warn(...args)Показывает предупреждение плагина в интерфейсе управления.
api.config.get(key, fallback)Читает параметр из JSON-конфига; поддерживаются вложенные ключи через точку.
api.config.set(key, value)Сохраняет конфигурацию самого плагина. В API v4 api.settings — отдельная поверхность настроек лаунчера с разрешениями settings.read и settings.write.
api.storage.read/writeЧитает или записывает текстовый файл в каталоге своего плагина.
api.storage.json/writeJsonЧитает и сохраняет JSON в каталоге плагина.
api.ui.toast(text, kind)Показывает уведомление в интерфейсе лаунчера и одновременно передаёт событие зарегистрированным обработчикам плагинов. Поддерживаемые типы: ok, bad, info.
api.ui.registerSettings(fields)Регистрирует схему настроек для отображения в карточке расширения.
api.ui.registerPage({ id, title, icon, html, css })Создаёт отдельную страницу плагина и пункт навигации. HTML и JavaScript страницы работают в sandboxed iframe без доступа к DOM лаунчера и Node.js.
homeButton, iconSvgСтраница может запросить кнопку на главной через homeButton: true и передать SVG-иконку в iconSvg. SVG проходит геометрический allowlist, а неподдерживаемая иконка заменяется стандартной.
wallpaper.set(file)HTML-мост принимает относительный путь на SVG внутри папки плагина. Требуется разрешение wallpaper и подтверждение действия; файл копируется в пользовательские данные лаунчера, а активный фон переключается на него.
providedModsМанифест может объявить локальные JAR-файлы для общего каталога плагинных модов. Установка требует разрешение install и подтверждение; JAR копируется в mods выбранной сборки и добавляется в lockfile.
api.ui.setTheme(css)Применяет CSS ко всему интерфейсу. Требует отдельное разрешение ui.theme; внешние URL, @import и выражения запрещены.
api.ui.openModal({ title, html, css })Открывает модальное HTML-окно; доступно расширению с разрешением ui.
api.instances.list/getПолучает список сборок или конкретную сборку. Доступ к этой поверхности запрашивается разрешением instances.read.
api.events.on/off/once/emitСовременный интерфейс для hooks. once снимает только собственный одноразовый обработчик; совместимые короткие методы api.on/off/emit сохранены.
api.permissions.list()Возвращает список разрешений, объявленных самим плагином в манифесте. Метод не выдаёт новых разрешений.
api.launcherПредоставляет версию Plugin API, ID и версию текущего плагина.
api.modrinth.search/project/versions/versionОграниченные методы чтения каталога Modrinth. Требуют разрешение net; поиск ограничен 50 результатами за запрос. Установка проектов через этот API не выполняется.
api.extensionsДополнительные именованные псевдонимы API из активного .PLcryn-пакета. Встроенные функции доступны и без пакета.
api.fs, api.archiveAPI v4 ограничивает файловые операции папкой плагина, ограничивает размер файлов и не следует внешним симлинкам. Распаковка ZIP также проверяет пути и общий размер.
api.instances.files, api.mcДоступ к файлам выбранной сборки отдельно разрешается через instances.files; пути проверяются на выход за каталог сборки. API Minecraft читает и меняет только options.txt и servers.dat.
api.game, api.mods, api.backupsОперации с игрой, модами и резервными копиями требуют разрешений и подтверждения пользователя для изменений или запуска/остановки. api.game.sessions читает список сессий, api.mods.installFile копирует JAR из папки плагина в mods сборки.
api.instances.current / selectЧтение выбранной сборки требует instances.read. Переключение через select требует instances.write и подтверждение пользователя.
api.pack, api.versionsКлассификация и импорт файлов из папки плагина требуют pack.import. Список локальных версий Minecraft — versions.read. Абсолютные пути с диска пользователя недоступны.
api.time, api.json, api.pathВспомогательные методы без разрешений: текущее время, пауза до 30 с, разбор JSON и относительные posix-пути без ...
api.clipboard.writeЗапись текста в буфер обмена (до 4000 символов) требует clipboard.write и подтверждение. Чтение буфера недоступно.
api.ui.go / promptПереход по внутреннему маршруту лаунчера и запрос подтверждения. Оба метода требуют разрешение ui; произвольные URL запрещены.
api.crypto, api.scheduler, api.telemetryКриптографические примитивы, ограниченные задания по расписанию и счётчики в памяти плагина. Они не дают доступ к системным секретам.
api.introspect, api.logsДиагностика ограничена метаданными сетевых вызовов API, действиями и данными самого плагина, а журналы маскируют распространённые токены и cookie.
api.fetch(url, opts)API v4 разрешает только HTTP(S), GET/POST, публичные адреса и ограниченный размер ответа; локальные адреса блокируются, перенаправления не выполняются, каждый запрос подтверждается.
window.cryndel.call(method, ...args)Мост HTML-страницы к разрешённым методам лаунчера: settings.get/set, instances.list/get, modrinth.search/project/versions, net.fetch, downloads.save, install.modrinth, install.localMod и wallpaper.set.
Плагин не получает объект require, DOM-объект окна или произвольные методы IPC как стандартные глобальные объекты своей точки входа. Пользуйся переданным api. При этом VM-контекст не следует считать надёжной границей безопасности для запуска кода из неизвестного источника.
ZIP-плагин содержит исполняемый JavaScript. Установка плагина означает доверие его автору. Ограниченный контекст API не заменяет аудит стороннего кода: проверяй источник и содержимое файлов.
При установке можно выдать все запрошенные возможности или поставить плагин без них. На странице «Плагины» разрешения можно снова выдать или отозвать. Изменение настроек, загрузка файлов, применение обоев и установка модов дополнительно подтверждаются пользователем.
Чтобы добавить локальный JAR в общий экран «Моды от плагинов», объяви его в манифесте. Имя файла задаётся относительным путём, а каталог показывает только метаданные — сам файл остаётся в каталоге плагина до явного нажатия «Установить».
{
"permissions": ["ui", "install"],
"providedMods": [{
"id": "example_mod",
"name": "Example Mod",
"version": "1.0.0",
"description": "Описание, загрузчик и поддерживаемая версия игры",
"file": "mods/example.jar",
"iconSvg": "<svg viewBox=\"0 0 24 24\">...безопасная геометрия...</svg>"
}]
}
providedMods не доказывает совместимость или безопасность JAR. При установке проверяется путь внутри папки плагина, ограничивается размер, вычисляется SHA-512 и создаётся запись lockfile. Это не автоматическая проверка того, что файл действительно запускается на указанном загрузчике.
Разрешение wallpaper открывает HTML-мост window.cryndel.call('wallpaper.set', 'wallpapers/name.svg'). Файл должен лежать в папке плагина, быть SVG не больше 256 КБ и содержать только простую геометрию, базовые фигуры и градиенты. Скрипты, ссылки, стили, фильтры и внешние ресурсы запрещены. Для изменения глобальной цветовой темы дополнительно запрашивается ui.theme. Атрибут homeButton: true добавляет страницу плагина в ряд действий главного экрана; SVG в iconSvg проходит фильтрацию перед показом.
В разделе «Плагины» есть кнопка «Примеры плагинов». Она устанавливает три демонстрационных ZIP: «Обои и стили», «Каталог плагинных модов» и «Локальный test.jar». Тестовый JAR содержит корректные Fabric-метаданные для проверки каталога и копирования, но намеренно не содержит игровой код и не добавляет функций в Minecraft.
Файл .PLcryn — ZIP-контейнер с двумя JSON-файлами в корне. Он не принимает и не исполняет JavaScript, исполняемые файлы или команды. Реализации API входят в лаунчер; пакет API v4 задаёт совместимую версию, описание поддерживаемых возможностей и именованные псевдонимы. Он не может добавить исполняемый код или выдать плагину новое разрешение.
{
"type": "cryndel-plugin-api",
"version": "4.0.0",
"apiVersion": 4,
"name": "Cryndel Plugin API v4"
}
{
"aliases": {
"quickSearch": "modrinth.search",
"notifyUser": "toast",
"readPluginConfig": "config.get"
}
}
Допустимые цели включают существующие API v2, безопасные методы API v4 (например, fs.read, settings.get, crypto.hash, net.fetch и mc.servers.read) и только перечисленные в реализации функции. Максимум — 100 псевдонимов и 1 МБ распакованных данных. Плагин обращается к псевдониму через api.extensions.quickSearch(...); разрешения всё равно проверяются самим методом.
Перед заменой текущая версия переносится в резервную. Кнопка отката меняет активную и предыдущую версии местами. Сброс сначала восстанавливает предыдущую версию; повторный сброс удаляет обе пользовательские версии и возвращает встроенный каталог. Настройки плагинов при этом не удаляются.
Для авторов расширений
Разберём путь расширения по шагам: от идеи и папки на диске до загрузки, конфигурации, выключения и диагностики. Ниже отдельно отмечены ограничения, которые легко принять за готовые возможности API.
Небольшое действие с одной понятной целью: хранить пользовательский список, читать конфиг, проверять доступность собственного сервиса по кнопке разработчика, выводить диагностическую запись, либо демонстрировать настройки. Такой плагин позволяет проверить манифест и жизненный цикл без сложной логики.
Плагин может добавить собственные HTML-страницы, меню, модальные окна, опросы и оформление. Действия с настройками, сетью, файлами и установкой выполняются только через API-мост и выданные пользователем разрешения. Прямой доступ к DOM и системным командам не предоставляется.
Выбери уникальное постоянное имя, например my-weather-tool. Именно из поля id формируется имя каталога установленного плагина и идентификатор его конфигурации. Не используй один и тот же ID для разных расширений и не меняй его между обновлениями без причины: иначе лаунчер увидит другое расширение с отдельными настройками.
my-weather-tool/
├── manifest.json # обязательные сведения о плагине
├── index.js # основной JavaScript-модуль
└── data/ # необязательно: собственные данные
└── state.json
Папка data/ в примере — обычная подпапка в каталоге расширения; создавай или читай её через api.storage. Не путай эту папку с автоматически создаваемым config.json, предназначенным для пользовательских параметров.
| Поле | Обязательность и назначение | Практический совет |
|---|---|---|
id | Фактически обязательно: без непустого ID ZIP отклоняется. | Используй стабильный lowercase ID: author-feature. |
name | Название карточки; если не указано, вместо него будет использовано имя папки. | Пиши понятное пользователю название, не версию API. |
version | Информационная версия плагина, отображается в списке. | Увеличивай при изменениях, чтобы пользователь мог сверить релиз. |
description | Короткое описание назначения. | Укажи, что именно делает расширение и когда оно обращается в сеть. |
author | Имя автора, показывается рядом с версией. | Не маскируй автора под администрацию проекта. |
main | Путь до скрипта от корня каталога плагина; по умолчанию index.js. | Имя и регистр файла должны совпадать на Linux. |
api | Текущая реализация отказывает в загрузке, если указанная версия больше API лаунчера (сейчас 4). | Указывай версию API, под которую действительно написан код; меньшее число не доказывает совместимость. |
permissions | API v4 поддерживает явные права для UI, настроек, сборок, файлов, сети, загрузок, игры, модов, резервных копий, архивов, событий и диагностики. Неизвестные и опасные системные права отклоняются. | При установке ZIP пользователь выбирает, какие из запрошенных разрешений выдать. Плагин, добавленный вручную, по умолчанию не получает эти права — их нужно выдать в карточке. |
settings | Массив полей настроек для UI. | Делай уникальные ключи и осмысленные значения по умолчанию. |
Настройки в манифесте создают элементы управления на карточке расширения. Рабочие алиасы полей: ключ берётся из key, затем id, затем name; подпись — из label, затем title, затем ключа. Поэтому предпочтительны явные key и label.
"settings": [
{
"key": "message",
"label": "Текст приветствия",
"type": "text",
"default": "Привет!",
"placeholder": "Напиши свой текст"
},
{
"key": "enabled",
"label": "Включить функцию",
"type": "toggle",
"default": true
},
{
"key": "refreshSeconds",
"label": "Интервал обновления",
"type": "number",
"min": 10,
"max": 300,
"default": 60
},
{
"key": "mode",
"label": "Режим",
"type": "select",
"options": [
{ "value": "quiet", "label": "Тихий" },
{ "value": "normal", "label": "Обычный" }
],
"default": "normal"
}
]
Для ключа appearance.color компонент интерфейса читает вложенное значение config.appearance.color, а config.set обновляет этот путь и сохраняет JSON. Для простого плагина используй плоские ключи и избегай конфликтов вроде одного ключа одновременно как строки и объекта.
Схема подставляет default, если соответствующего значения ещё нет. Не рассчитывай, что default уже записан в файле до первого изменения: при чтении используй fallback, как в примере api.config.get('message', 'Привет!').
Поддерживаемые типы формы: строка по умолчанию, булевы bool/toggle/checkbox, number, range и select с массивом options. Для number/range интерфейс передаёт числовое значение. Не полагайся на сложные поля, описанные только в интернете: массивы, многострочный текст, вложенные объекты и валидация схемой как отдельные контроли здесь не реализованы.
module.exports = {
async activate(api) {
const config = await api.config.get('message', 'Добро пожаловать!');
api.log('Активирован:', api.pluginId, 'API', api.apiVersion);
// storage.json читает JSON-файл из каталога этого плагина.
let state = await api.storage.json('data/state.json');
if (!state) {
state = { activations: 0 };
}
state.activations += 1;
await api.storage.writeJson('data/state.json', state);
api.ui.registerSettings([
{
key: 'message',
label: 'Текст сообщения',
type: 'text',
default: 'Добро пожаловать!'
}
]);
api.log(config, 'Запусков плагина:', state.activations);
},
async deactivate(api) {
// Очисти таймеры/ресурсы, которые создал сам плагин.
api.log('Деактивирован');
}
};
В этом примере показаны только безопасные локальные операции с настройкой и JSON. Если добавишь таймер через доступный setInterval, сохрани его ID и останови в deactivate; исключение в фоне может попасть в журнал не так очевидно, как ошибка при старте.
Скрипт исполняется в VM-контексте с переданными глобалами module, exports, console, api, setTimeout/clearTimeout и setInterval/clearInterval. Поддерживаются два варианта экспорта: module.exports = { activate(api) {} } и module.exports = function (api) {}. Если экспорт не содержит activate-функцию, плагин может быть помечен загруженным, но предупреждение сообщит, что он фактически ничего не активировал. Если в манифесте указано API выше 2, загрузка отклоняется; более низкое значение само по себе не гарантирует совместимость.
Начальное выполнение скрипта ограничено таймаутом VM. Асинхронный activate ожидается менеджером, но таймаут выполнения исходного скрипта не является общим таймаутом для любой дальнейшей работы плагина. Не создавай бесконечные циклы, не блокируй event loop и не оставляй бесконечные таймеры.
| Вызов | Результат | Применение |
|---|---|---|
await api.config.get() | Весь объект пользовательского конфига. | Прочитать несколько настроек одним запросом. |
await api.config.get('a.b', fallback) | Вложенное значение либо fallback. | Читать необязательную настройку без ошибки при первом старте. |
await api.config.set('a.b', value) | Запись обновлённого JSON. | Сохранить значение настройки. UI тоже пишет настройки туда. |
await api.storage.read(file) | Строка UTF-8 или null, если файла нет. | Текстовые собственные данные. |
await api.storage.write(file, text) | { ok: true }. | Создать/перезаписать текстовый файл в папке своего плагина. |
await api.storage.json(file) | Разобранный JSON или null. | Загрузить структурированные собственные данные. |
await api.storage.writeJson(file, object) | { ok: true }. | Сохранить объект как форматированный JSON. |
Пути хранилища вычисляются относительно папки текущего плагина. Путь, который после разрешения выходит за пределы каталога плагина, отклоняется. Сохраняй в JSON только сериализуемые значения; хранилище не предназначено для больших бинарных файлов или сетевых секретов.
module.exports = {
activate(api) {
api.on('my-plugin-event', (payload) => {
api.log('Получено событие:', payload);
return { received: true };
});
// Вызывает обработчики с этим именем, зарегистрированные в менеджере.
const results = api.emit('my-plugin-event', { source: 'self' });
api.log('Результаты:', results);
},
deactivate(api) {
api.off('my-plugin-event');
}
};
Hooks — именованные функции в менеджере плагинов. on регистрирует обработчик; off(hook) удаляет все подписки данного плагина на это имя; emit синхронно вызывает зарегистрированные обработчики и собирает возвращённые ими значения. Ошибка одного синхронного обработчика записывается как предупреждение, остальные обработчики продолжают выполняться. Если обработчик асинхронный, emit не ожидает его Promise: результатом будет Promise-объект внутри массива результатов.
В текущем коде основной программы не найдено вызовов plugin manager для игровых событий. Поэтому api.on('game:launch', ...) не означает, что лаунчер автоматически вызовет такой handler. Используй hooks для согласованного взаимодействия с другим кодом, который сам вызывает соответствующий emit; считай встроенные события неподдержанными, пока проект не опубликует их контракт.
netПри выданном разрешении net методы api.fetch(url, opts) (совместимость) и api.net.fetch(url, opts) (API v4) отправляют только HTTP(S)-запросы на публичные адреса, без перенаправлений, с ограничением метода, размера тела и ответа. Локальные адреса и нестандартные порты отклоняются; перед каждым запросом показывается подтверждение, а метаданные записываются в аудит. Для совместимого api.fetch отказ возвращается как { ok: false, error }; API v4 сообщает об отказе исключением. Успешный ответ имеет форму { ok, status, data }; тип data зависит от сервера.
module.exports = {
async activate(api) {
const result = await api.fetch('https://example.org/status', {
method: 'GET'
});
if (!result.ok) {
api.warn('Не удалось получить статус:', result.error);
return;
}
api.log('HTTP:', result.status);
api.log('Ответ:', JSON.stringify(result.data));
}
};
Не помещай токены и пароли в URL, публичные логи или сообщение об ошибке. Не делай запросы циклически и без необходимости. Указывай сетевое разрешение только если функциональность действительно требует запросов.
Запроси разрешения ui и при необходимости ui.theme. Страница регистрируется из activate(api). Вставляемый HTML — фрагмент для body; собственный JavaScript страницы использует window.cryndel. Каждый экран плагина работает в отдельном iframe с sandbox: у него нет прямого доступа к интерфейсу приложения, Electron, Node.js или IPC. При выключении плагина его страницы и оформление удаляются.
module.exports = {
activate(api) {
api.ui.registerPage({
id: 'tools',
title: 'Мои инструменты',
icon: 'page',
html: \`<h1>Инструменты</h1>
<button id="open">Опрос</button>
<button id="mods">Найти моды</button>
<script>
document.querySelector('#open').onclick = () =>
window.cryndel.modal({
title: 'Опрос',
html: '<h2>Какую функцию добавить?</h2><button id="vote">Голосовать</button><script>document.querySelector("#vote").onclick=async()=>{await window.cryndel.call("net.fetch","https://example.org/vote",{method:"POST",data:{answer:"new-feature"}});window.cryndel.closeModal()}</script>'
});
document.querySelector('#mods').onclick = async () => {
const result = await window.cryndel.call('modrinth.search', { query: 'sodium', type: 'mod' });
document.body.insertAdjacentText('beforeend', ' Найдено: ' + result.hits.length);
};
</script>\`,
css: 'button { padding: 10px 14px; border-radius: 10px; }'
});
api.ui.setTheme(':root { --accent: #62d6bf; --radius: 20px; }');
},
deactivate(api) {
api.ui.clearTheme();
}
};
Для небольшой страницы достаточно api.ui.addNav({ id, label, icon, html, css }); для оформления всего лаунчера передай CSS через api.ui.setTheme(css). Глобальный стиль применяется только если выдано ui.theme. HTML-страница может открыть modal через window.cryndel.modal({ title, html, css }), закрыть через window.cryndel.closeModal() и отправить POST через window.cryndel.call('net.fetch', url, { method: 'POST', data }).
Модальные страницы, кнопки опросов и формы — это обычный HTML/JavaScript внутри sandboxed iframe. Для отправки голосов нужен ваш сервер опросов и разрешение net; сам лаунчер не хранит и не подсчитывает голоса. Не включай пользовательский HTML в общую страницу лаунчера: держи его внутри plugin iframe.
| Разрешение | Методы страницы | Защита |
|---|---|---|
settings.read | settings.get('ui.theme'), settings.get('ui') | Чтение ограничено разделами UI и параметрами лаунчера. |
settings.write | settings.set('ui.theme', 'ocean') | Пользователь подтверждает каждую запись; менять можно только настройки лаунчера, не пути и не ядро. |
downloads | downloads.save(url, filename) | Только HTTP/HTTPS; размер файла ограничен 50 МБ, перед сохранением показывается подтверждение. |
install + net | install.modrinth(instanceId, projectId, versionId?) | Только проекты-моды, версия проверяется на совместимость; перед установкой требуется подтверждение. |
install | providedMods и install.localMod(instanceId, modId) | Файл должен быть объявлен в манифесте и находиться внутри плагина; размер JAR — до 50 МБ, проверяется совместимость, SHA-512 записывается в lockfile, перед копированием показывается подтверждение. |
wallpaper | wallpaper.set(relativeSvgPath) | Только SVG из папки плагина, максимум 256 КБ; фильтруются элементы/атрибуты, затем фон сохраняется в пользовательских данных. |
net | net.fetch(url, { method: 'GET'|'POST', data }) | Таймаут, размер запроса и ответа ограничены; подходит, например, для отправки ответа на внешний опрос. |
Методы HTML-моста вызываются как await window.cryndel.call('settings.set', 'ui.theme', 'ocean'). Ответ или ошибка возвращаются Promise. Конфигурация самого плагина доступна через plugin.config.get(key, fallback) и plugin.config.set(key, value) без доступа к чужим файлам. Попытка вызвать метод без разрешения завершится понятной ошибкой. Для установки используй ID сборки и проекта Modrinth; API не даёт плагину запускать произвольные файлы или команды.
Параметры самого расширения по-прежнему описываются через manifest.settings или хранятся в api.config. HTML-страницы могут рисовать любые формы, но сохранение конфигурации плагина из UI должно проходить через зарегистрированный API плагина, а не писать в файлы напрямую. Для публичного опроса используй собственный HTTPS endpoint: iframe не имеет прямого сетевого доступа, запрос отправляется через ограниченный net.fetch.
Кнопка «Настройки плагина» на карточке раскрывает поля из manifest.settings либо запасной редактор JSON-конфига. Значения сохраняются отдельно для каждого расширения.
api.ui.registerPage создаёт работающий экран и пункт меню; у каждой страницы собственные HTML, CSS и JavaScript.
api.ui.toast показывает уведомление; api.ui.openModal и window.cryndel.modal создают модальные HTML-окна.
HTML-мост предоставляет разрешённые методы чтения настроек, записи с подтверждением, загрузки файлов, поиска и установки модов Modrinth.
manifest.json в корень архива. Также поддерживается обычная папка-обёртка вида my-plugin/manifest.json: лаунчер использует содержимое каталога, где лежит манифест..disabled.json.deactivate перед очисткой — свои таймеры и ресурсы проектируй с явным жизненным циклом.Переключатель «Включить плагины» немедленно вызывает выгрузку всех загруженных расширений, удаляет их UI-вкладки и hooks и не позволяет загрузить их снова до включения настройки. Индивидуальные переключатели карточек остаются независимыми: выключение конкретного плагина сохраняется и после повторного включения глобального переключателя.
| Симптом | Проверь | Исправление |
|---|---|---|
| Плагина нет в списке | Есть ли папка и корректный manifest.json непосредственно внутри неё? | Исправь структуру папки; для ZIP перенеси файлы плагина в корень архива. |
| «Нет манифеста» | Совпадает ли имя ровно с manifest.json, не повреждён ли JSON? | Проверь кавычки, запятые и кодировку; JSON не принимает комментарии. |
| «Нет main-файла» | Указан ли верный путь в main, существует ли файл? | Исправь main либо назови точку входа index.js. |
| API слишком новый | Число в api больше текущего API 2? | Найди совместимый релиз или обнови лаунчер; не занижай номер без проверки API-вызовов. |
| Загружен, но не работает | Экспортируется ли функция activate или сама функция? | Проверь module.exports, журнал и предупреждения карточки. |
| Схема не показывает форму | Это массив в settings? Есть у полей key/label? | Используй поддерживаемый тип поля. Если схемы нет, редактируй JSON в карточке. |
| Сеть возвращает отказ | Есть ли net в манифесте и выдано ли это разрешение в карточке плагина? | Добавь net в манифест, затем открой «Разрешения» и выдай доступ; после установки ZIP выбор разрешений делается в системном диалоге. |
| Изменения не видны | Был ли плагин перезагружен после изменения исходников? | Используй кнопку «Перезагрузить» и проверь новую запись предупреждения. |
id, заполнены имя, версия, описание и автор.main действительно существует.manifest.json лежит на верхнем уровне, нет внешней папки-обёртки.Игровое содержимое
Каталог Modrinth помогает найти проекты, а экран модов показывает то, что установлено в выбранной сборке.
Страница «Моды» относится к выбранному профилю: можно найти мод по имени, посмотреть состав, включить или отключить отдельный элемент и удалить мод. Отдельные кнопки проверяют целостность и запускают эвристический сканер.
Проверь три вещи: версия Minecraft, загрузчик, требования самого проекта. Если мод требует библиотеку или API, установи соответствующую зависимость для этой же сборки.
Внешний вид
В разделе настроек есть отдельные блоки для оформления, звука, главной страницы и поведения игры. Большинство интерфейсных параметров можно поменять без редактирования файлов вручную.
Предустановленные темы: «Ночь», «День», «Фурри», «Роза», «Сталь», «Лёд», «Эмбер», «Лес», «Океан», «Лаванда», «Мята», «Закат», «Сакура» и «Песок». Шесть последних тем отличаются не только цветом: у них свои контрастные поверхности, акцентная подача карточек, скругления и подсветка навигации. Можно задать собственный акцент, радиус и положение навигации; для точечной стилизации есть редактор CSS.
В настройках производительности отдельно включаются реакции интерфейса, уведомления, фоновые эффекты и короткие SVG-анимации иконок. Анимация иконок срабатывает только при наведении и подчиняется системному режиму уменьшения движения.
Настраиваются визуальные параметры главной страницы, фон и представление интерфейса. Размер и расположение элементов лаунчер подстраивает под окно.
Можно управлять интерфейсными звуками и фоновой музыкой, громкостью и воспроизведением. Музыкальные файлы проекта размещены в каталоге muzick/fon; стандартные звуки — в muzick/_defaults.
Настройки включают управление памятью и параметрами отображения, определение Java и параметры рендеринга. Рекомендацию по RAM используй как отправную точку и учитывай объём памяти компьютера.
Ник игрока доступен в нижней панели. Интерфейс локализован на русский и английский языки.
Встроенная страница My Cryndel запоминает масштаб. Для неё можно включить сохранение в фоне; не очищай хранилище сайта, если хочешь сохранить авторизацию.
3D-скины и Discord RPC предусмотрены в коде, но намеренно выключены по умолчанию. Не включай их без осознанного изменения настройки.
Большой CSS-практикум
Этот раздел не про абстрактную страницу: здесь используются реальные переменные, классы и состояния интерфейса Cryndel. Изменения делаются через «Настройки → Свой CSS» и сохраняются отдельно от файлов проекта.
Стилями можно менять цвета, размеры, отступы, рамки, шрифты, тени и расположение элементов. CSS не добавляет действия кнопкам, не меняет настройки Minecraft и не создаёт новые страницы. Не скрывай важные кнопки запуска, закрытия модальных окон, удаления и подтверждения: это может сделать интерфейс непригодным.
<style>, HTML и JavaScript.Файл хранится в пользовательском каталоге данных лаунчера, в подпапке themes/custom.css. Он переживает перезапуск и обновление приложения, потому что это пользовательские данные, а не исходный CSS-файл в каталоге проекта. Размер ограничен примерно 400 000 символами. Загрузчик сохраняет текст CSS; это не проверка дизайна и не гарантия, что каждое свойство поддерживается Chromium.
Изменяй по одной группе правил и проверяй результат после каждого применения. Если интерфейс стал нечитаемым, вернись в настройки и очисти пользовательский CSS. Если изменились лишь отдельные элементы, вероятнее всего, правило не совпало с селектором, проиграло более специфичному правилу или содержит неподдерживаемое свойство.
селектор {
свойство: значение;
другое-свойство: другое-значение;
}
Селектор находит элементы, которым адресовано правило. Свойство обозначает часть оформления, а значение задаёт результат. Фигурные скобки и точка с запятой обязательны для привычного надёжного форматирования. Несколько элементов можно перечислить через запятую.
| Синтаксис | Значение | Пример применения |
|---|---|---|
.card | Элемент с классом card. | .card { border-radius: 20px; } |
.stage .card | Карточка внутри центральной области экрана. | Меняет карточки контента, не затрагивая все элементы с таким классом вне основной области. |
#stage | Элемент с уникальным ID stage. | #stage { padding: 20px; } — применять только если нужно изменить весь stage. |
.btn:hover | Кнопка, пока курсор находится над ней. | Добавляет подсветку при наведении. |
.field:focus-visible | Поле ввода, выбранное клавиатурой или с видимым фокусом. | Позволяет сохранять понятную клавиатурную навигацию. |
[data-anim="off"] | Элемент или потомок с указанным атрибутом и значением. | Можно учитывать состояние, выставляемое самим интерфейсом. |
Точка перед именем означает класс; решётка — ID. Два селектора подряд, например .nav-item.active, означают, что один элемент должен одновременно иметь оба класса. Пробел в .nav-item .label означает вложенность: элемент .label внутри .nav-item. Не добавляй пробел, если хочешь выбрать именно один элемент с двумя классами.
У элемента могут быть правила из базового оформления, темы, CSS конкретного экрана и пользовательского CSS. Браузер сначала учитывает важность и специфичность, а при равенстве обычно выигрывает правило, объявленное позже. Пользовательский файл подключается как слой пользовательского оформления, поэтому часто может переопределить стандарт, если выбран сопоставимый или более точный селектор.
.btn точнее, чем просто button: класс обычно выигрывает у селектора по тегу..stage .btn точнее, чем .btn, потому что дополнительно ограничивает область.#stage .btn обычно уже слишком точен для общего переоформления кнопок и усложняет дальнейшие изменения.!important принудительно поднимает объявление в приоритете. Не добавляй его «на всякий случай»: он затрудняет отладку и может сломать состояния наведения, фокуса или отключённой кнопки./* Начинай с простого правила. */
.stage .card {
border-color: var(--line);
border-radius: var(--card-radius);
}
/* Если стиль нужен только на наведении, добавь состояние,
а не отдельное правило с !important. */
.stage .card:hover {
border-color: var(--accent);
}
Основные переменные заданы в таблице дизайн-токенов и используются повторно по всем экранам. Переопределяя токен, ты меняешь много компонентов сразу — кнопки, карточки, рамки, текст или прозрачность. Это предпочтительнее десятков разрозненных правил с одинаковыми цветами.
| Переменная | Для чего используется | Типичное значение |
|---|---|---|
--bg, --bg-2 | Основной фон и дополнительный/контрастный фон темы. | Цвет, например #10131b. |
--panel-raw, --panel-2-raw | Исходные цвета поверхностей; из них вычисляются панели и вторичные панели с заданной прозрачностью. | rgba(24, 29, 42, .92). |
--panel, --panel-2 | Готовые цвета основных и вторичных карточек/панелей. | Подставляй через var(--panel), а исходные значения для темы меняй через --panel-raw. |
--panel-pct | Процент прозрачности панелей, связанный с настройкой «Прозрачность панелей». | Процент, например 92%. |
--text, --muted, --fog | Основной текст и менее заметные пояснения/подписи. | Контрастные цвета с достаточной разницей от панели. |
--accent, --accent-2 | Главный цвет темы и второй оттенок градиента. С акцентом связаны выделения, обводки, прогресс и основные кнопки. | HEX-цвет вроде #77a7ff. |
--play, --play-2 | Цвета игрового действия и связанной с запуском графики. | Два близких или контрастных цвета градиента. |
--ok, --bad, --gold | Семантические цвета статусов: успех, ошибка и отдельные акценты/награды. | Не меняй их на похожие цвета, если пользователю важно мгновенно различать статус. |
--line | Цвет рамок, разделителей и границ. | Сдержанный цвет, заметный на панелях. |
--radius, --card-radius | Общие и карточные радиусы скругления. | CSS-длина: 14px, 20px. |
--shadow | Тень карточек, всплывающих панелей и модальных окон. | 0 12px 32px rgba(0, 0, 0, .28). |
--font, --mono, --home-font | Основная типографика, моноширинный текст и заголовок главной страницы. | Список с резервными шрифтами, например "Segoe UI", sans-serif. |
--nav-user, --nav, --nav-icon | Заданная пользователем ширина навигации, итоговая адаптивная ширина и размер значка. | CSS-длины. Для корректной адаптивности предпочтительнее --nav-user, а не фиксировать --nav. |
--foot, --pad, --gap | Высота нижней панели, внутренние отступы и базовые расстояния компоновки. | CSS-длины, например 64px и 16px. |
--glass-blur, --glass, --bg-blur, --veil-op | Размытие стеклянных поверхностей, готовый эффект стекла, размытие обоев и непрозрачность вуали фона. | Размытие — длина с px; --veil-op — число от 0 до 1. |
--anim-dur | Продолжительность анимации появления, используемая несколькими экранами. | 450ms, то есть единица времени обязательна. |
Значение переменной должно соответствовать её типу. Например, цвет нельзя присвоить переменной размытия, а 16 для свойства border-radius не задаёт длину — нужно 16px. Некоторые токены являются вычисляемыми: для полупрозрачной темы меняй исходные --panel-raw/--panel-2-raw и процент, а не пытайся превратить конечную переменную в неподходящий формат.
:root {
--bg: #10131b;
--bg-2: #171c28;
--panel-raw: rgba(25, 31, 45, .94);
--panel-2-raw: rgba(31, 39, 56, .97);
--text: #edf2ff;
--muted: #a8b2c8;
--line: rgba(183, 199, 232, .18);
--accent: #8caeff;
--accent-2: #6f8ff0;
--radius: 16px;
--card-radius: 20px;
--shadow: 0 14px 36px rgba(0, 0, 0, .32);
}
У темы есть атрибут data-theme на корневом элементе. Если нужен общий дизайн, используй :root. Если конкретная корректировка нужна только одной теме — ограничь правило атрибутом. Так, например, светлая тема может сохранить собственный текст, даже если ты меняешь фон остальных тем.
/* Общее правило для всех тем. */
:root {
--accent: #8d7bff;
}
/* Только для темы forest. */
:root[data-theme="forest"] {
--accent: #78c98c;
--accent-2: #4e9c69;
}
/* Взаимодействие мышью и клавиатурой. */
.btn:hover {
filter: brightness(1.08);
}
.btn:focus-visible,
.field:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
.btn:disabled {
opacity: .55;
cursor: not-allowed;
}
Имена атрибутов и состояний должны совпадать буквально. Cryndel использует, в частности, data-anim, data-background-animation, data-compact, data-density, data-dock, data-glow, data-header, data-homebuttons, data-interaction-animation, data-motion-reduced, data-nav-labels, data-notification-animation, data-statusbar и data-toast. Это динамические состояния: для общей кастомизации сначала проверь селектор на экране и не считай каждый атрибут отдельной пользовательской настройкой.
В проекте есть .btn, .btn-sky, .btn-ghost, .btn-danger, .field, .row, .hint, .card, .grid-cards и .progress. Это наиболее стабильная отправная точка для общего переоформления.
Внешнюю компоновку образуют .shell, .titlebar, .nav, .nav-item, .stage и .foot. Кнопка игрового действия использует .play-btn, панель инструментов — .page-tools.
Для отдельных областей главной применяются .hero, .hero-card, .home-title, .home-sub, .home-actions, .home-carousel, .home-slide и .music-card.
Основные классы: .modal-veil, .modal, .toast-host, .toast, .dl-dock, .inbox-panel и .ui-menu. Помни, что изменение position, z-index или overflow может перекрыть кнопки и лишить панель прокрутки.
/* Оформить кнопки и поля в общем стиле. */
.btn {
border-radius: 12px;
font-size: 13px;
transition: filter .18s ease, transform .18s ease;
}
.btn:hover {
transform: translateY(-1px);
}
.field {
border-radius: 12px;
color: var(--text);
}
.field:focus {
border-color: var(--accent);
}
/* Карточки экранов остаются гибкими и получают мягкую рамку. */
.stage .card {
border-color: color-mix(in srgb, var(--accent) 22%, var(--line));
border-radius: var(--card-radius, 18px);
box-shadow: var(--shadow);
}
Для цвета используй HEX, RGB/RGBA, HSL или поддерживаемый Chromium color-mix(). Для размеров — px, rem, проценты, vw/vh и ограничители вроде min()/clamp(). Не убирай min-width: 0 у элементов в flex/grid без проверки: оно помогает длинному тексту не раздвигать весь экран.
.home-title {
color: var(--text);
font-size: clamp(30px, 4.6vw, 56px);
line-height: 1;
letter-spacing: -.035em;
}
.stage .card {
padding: clamp(12px, 2vw, 20px);
background:
linear-gradient(145deg,
color-mix(in srgb, var(--panel) 94%, var(--accent)),
var(--panel-2));
border: 1px solid var(--line);
}
Для фонового изображения лучше сначала выбрать его штатной кнопкой в настройках. Тогда лаунчер сам управляет хранением, подложкой и применением. CSS-фильтры filter на всём контейнере способны размыть текст и кнопки вместе с обоями; если надо изменить только задний план, меняй фон штатно или применяй эффект к конкретному фоновому слою после проверки структуры.
Сетка окна и CSS экранов содержат media queries на нескольких ширинах: около 1240, 1100, 900, 860, 820, 640, 620 и 560 px, а для компактной высоты — около 620 и 560 px. Внутреннее окно также может изменяться по размеру. Не создавай дизайн, который работает только на одной ширине, и не заменяй адаптивную навигацию фиксированным абсолютным блоком.
/* Сетка из двух колонок на широком окне,
одна колонка на узком. */
.stage .custom-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
@media (max-width: 700px) {
.stage .custom-grid {
grid-template-columns: minmax(0, 1fr);
}
.stage .custom-grid .card {
padding: 12px;
}
}
@media (max-height: 620px) {
.stage .hero {
padding-top: 16px;
}
}
Важно: .custom-grid в этом примере — пример собственного класса, а не обязательный класс приложения. Его можно применять к элементам плагина или к собственному классу существующего элемента, если DOM действительно позволяет это сделать; для уже существующих областей используй подтверждённый класс вроде .hero или .grid-cards.
Проверяй минимум четыре ситуации: обычную ширину окна, узкую ширину, короткую высоту и длинный текст/переводы. Для сеток используй minmax(0, 1fr); для размеров — min() и clamp(); для строк — overflow-wrap: anywhere, если длинное имя может выходить за границу. Мобильная адаптация не сводится к уменьшению шрифта: иногда колонку надо перестроить в одну, а горизонтальную панель — разрешить прокручивать.
В приложении есть пользовательское выключение анимаций и правило для системного предпочтения уменьшенного движения. Не добавляй бесконечные вращения, вспышки и принудительные переходы поверх этого поведения. Используй умеренную длительность, сохраняй чёткую рамку фокуса и контраст текста относительно фона.
.custom-indicator {
transition: opacity .18s ease, transform .18s ease;
}
@media (prefers-reduced-motion: reduce) {
.custom-indicator {
transition: none;
}
}
.btn:focus-visible,
.nav-item:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 3px;
}
Встроенные анимации завязаны на --anim-dur и выключаются глобальным состоянием. CSS-переопределение с animation: ... !important может намеренно или случайно отменить это поведение, поэтому не используй его без веской причины.
:root {
--radius: 8px;
--card-radius: 10px;
}
.card,
.modal,
.music-card {
border-radius: var(--card-radius);
}:root {
--panel-raw: rgba(20, 25, 37, .88);
--panel-2-raw: rgba(25, 31, 46, .94);
--glass-blur: 12px;
--panel-pct: 92%;
}
.card,
.modal,
.dl-dock {
backdrop-filter: var(--glass);
}Сильная прозрачность и blur ухудшают читаемость, увеличивают графическую нагрузку и могут давать разный результат на разных GPU. Если текст теряется, сначала увеличь непрозрачность панели, а не blur.
.play-btn {
border-radius: 16px;
box-shadow: 0 10px 28px
color-mix(in srgb, var(--play) 28%, transparent);
}
.play-btn:hover {
filter: brightness(1.07);
}:root {
--nav-user: 84px;
}
.nav-item {
border-radius: 12px;
}Не фиксируй --nav большим постоянным числом: итоговая ширина ограничивается адаптивной компоновкой. В настройках также доступен ползунок ширины навигации, который сохраняет исходное пользовательское значение.
:root {
--muted: #c1cbe0;
--line: rgba(195, 210, 240, .28);
}
.hint {
line-height: 1.6;
}После изменения цветов проверь и светлую, и тёмную темы, если правило глобальное.
| Симптом | Вероятная причина | Что попробовать |
|---|---|---|
| Ничего не изменилось | CSS не применён, селектор не существует на текущем экране или в имени класса пропущена точка. | Нажми «Применить CSS», проверь класс по исходному CSS проекта и временно задай заметный тестовый цвет. |
| Изменился не тот элемент | Слишком общий селектор вроде button или div. | Ограничь селектор, например .stage .btn или .home-carousel. |
| Панель перекрыла интерфейс | Изменены position, z-index, размеры или overflow. | Удали эти свойства и меняй только фон, рамку, тень и отступы. |
| На узком окне элементы выпадают | Задана фиксированная ширина или одна колонка не адаптируется. | Добавь media query, min-width: 0 и гибкую ширину через min()/clamp(). |
| Цвета стали неправильными в светлой теме | Глобальные значения не учитывают семантику темы. | Используй токены, затем добавь ограниченное правило :root[data-theme="..."] только для нужной темы. |
| Переходы больше не выключаются | Пользовательское правило перебивает data-anim или media query reduce-motion. | Удали принудительную анимацию/transition и проверь через настройку отключения анимаций. |
| После правок интерфейс нечитаем | Низкий контраст, чрезмерное стекло или скрытый функциональный элемент. | Используй кнопку «Очистить», затем верни изменения небольшими шагами. |
Файлы проекта служат источником правды для классов и адаптивности, а пользовательское оформление предназначено для переопределений. Ручное изменение штатных файлов может пропасть при обновлении и затруднить диагностику. Не очищай пользовательское хранилище веб-сессии ради исправления CSS: там находятся логины и cookies кабинета.
Диагностика
Если игра не запускается или сборка ведёт себя нестабильно, сначала проверь выбранный профиль и используй встроенную страницу «Починка».
main с именем файла.activate и ZIP не содержит внешнюю папку-обёртку.Сначала сохрани важные миры и конфиги, затем создавай бэкап и только после этого пробуй отключать моды или выполнять откат.
Анализ читает хвост текущего logs/latest.log и самый новый текстовый crash-report, если они существуют, и ищет известные сигнатуры: отсутствующий класс, отсутствующую зависимость, сообщение о несовместимых модах, нехватку памяти и некоторые ошибки загрузки мода. Это поиск по шаблонам, а не универсальный разбор причин.
Кнопка «Исправить» может попытаться поставить Fabric API при некоторых совпадениях, отключить до пяти включённых локальных модов (не загруженных из Modrinth) при отдельных типах ошибок либо сообщить, что RAM надо увеличить вручную. Если лог не соответствует правилам распознавания, экран посоветует изучить latest.log самостоятельно.
Полный снимок включает доступные папки mods, config, resourcepacks, shaderpacks, saves, screenshots, defaultconfigs, kubejs, scripts, cryndel-skins, а также файлы вроде options.txt, servers.dat и заметок Cryndel. К снимку прилагаются запись профиля и Lockfile. Менеджер поддерживает быстрый режим, который включает прежде всего mods и config; видимая кнопка «Бэкап сейчас» использует полный режим.
Кэш и скачанные Java runtime не включаются. Восстановление сначала пытается создать защитный снимок текущего состояния, затем распаковывает выбранный архив в папку сборки. Кнопка «Откат» на экране починки применяет самый поздний снимок; убедись, что нужный мир находится в выбранной резервной копии.
Путеводитель по приложению
Короткая карта интерфейса: что находится в каждом разделе, что на него влияет и в каком порядке выполнять частые задачи.
В приветственном сценарии лаунчер просит задать игровой ник. Проверка принимает от 3 до 20 символов: латинские буквы, цифры и подчёркивание. После сохранения ник можно изменить позднее кнопкой в нижней панели. Это профиль лаунчера; не вводи сюда пароль от Microsoft или другого аккаунта.
Если список сборок пуст, создай новый профиль мастером, выбери готовый доступный пак или импортируй поддерживаемый формат. Для первого запуска проверь, что профиль действительно выбран в нижней панели.
Кнопка отмены останавливает подготовку/загрузку. Управление уже запущенным процессом — отдельное состояние; не считай отмену скачивания командой закрытия игры.
Название приложения и системные кнопки управления окном.
Переход к главной, Modrinth, модам, скриншотам, My Cryndel, сборкам, плагинам, настройкам и починке. На узких экранах адаптация меняет компоновку.
Кнопка ника открывает его изменение; селектор сборки переключает профиль; кнопка модов ведёт к списку активной сборки; «ИГРАТЬ» начинает запуск выбранной сборки.
Во время подготовки игры/файлов показывает этап и прогресс. Подготовку можно отменить через интерфейс загрузки.
Кнопка загрузок открывает список файлов, скачанных через браузерные сессии лаунчера. Для файлов доступны действия по типу: мод — перенести в выбранную сборку; архив — попробовать импортировать как сборку или разместить как ресурспак.
Главная показывает выбранный профиль. При отсутствии сборки создай её через мастер. Если уже есть несколько профилей, переключайся через селектор внизу. Проверяй название и версию перед нажатием «Играть».
При посещении главной лаунчер запрашивает состояние cryndel.ru:25565: может показать онлайн, доступный онлайн-статус игроков/пинг или техническое обслуживание. Проверка выполняется при открытии экрана, а не непрерывно в фоне.
Ник игрока отображается в нижней части окна. Главная может показывать приветствие и игровое время из локальной статистики профиля; отображение приветствия и карточек статистики настраивается.
Карусель показывает несколько подсказок и меняет слайды по таймеру; её можно скрыть. Музыкальная карточка, если найдены аудиофайлы, управляет воспроизведением, громкостью, предыдущим/следующим треком и открытием музыкальной папки.
Можно выбрать собственный фон, видео заставки и связанные параметры затемнения/размытия. В разделе «Производительность» отдельно включаются видеофон, движущиеся свечения, размытие и тени, частицы, а также четыре категории анимации: появление экранов, лёгкие реакции элементов, уведомления и декор фона. Появление экранов и движущийся декор выключены по умолчанию; лёгкие короткие реакции кнопок и уведомлений остаются включены. Настройки применяются сразу и сохраняются независимо: можно убрать только те эффекты, которые мешают, не сбрасывая дизайн. Для тематического оформления доступны также пользовательская картинка и три собственных звука фурри-темы.
Есть ветка отображения 3D-модели скина. Функция управляется отдельным параметром showSkin3d и намеренно выключена по умолчанию; при выключенной 3D-модели может показываться карусель обучения.
Пункт «Версии Minecraft» в списке сборок сейчас перенаправляет обратно к управлению сборками: версия имеет смысл как часть конкретного профиля. Список доступных release-версий используется мастером при создании новой сборки.
Если выбрана категория модпаков, действие означает создание отдельной сборки, а не добавление набора JAR в уже существующую папку модов. Если проект уже найден в сборке, страница может показать это и предложить переустановку.
В подстраницах Modrinth есть настройка количества результатов на странице (в пределах 8–50), полноэкранного режима страницы проекта, отображения текстовых кнопок вместо одних SVG-иконок, цвета акцента и скругления. Основные фильтры каталога сохраняют контекст выбранной сборки.
| Действие | Что делает | На что обратить внимание |
|---|---|---|
| Поиск и фильтр | Фильтруют локальный список по имени/ID/имени файла и состоянию: все, включённые или отключённые. | Сначала проверь, что активна нужная сборка. |
| Переключатель мода | Переименовывает JAR в состояние с суффиксом .disabled или обратно, затем обновляет список. | Отключение не удаляет сам файл; изменения проявятся при следующем запуске игры. |
| Удаление | Убирает файл мода из каталога и связанную запись Lockfile. | Перед удалением модпака или важного мода сделай резервную копию. |
| Добавление из файла | Позволяет выбрать JAR-файл(ы), копирует их в папку mods и индексирует метаданные/хеш. | Локально выбранный JAR может получить предупреждение сканера; предупреждение не является карантином. |
| Проверка целостности | Сверяет зарегистрированные хеши установленных файлов и сообщает, есть ли проблемы. | Для локальных файлов без ожидаемого эталонного хеша результат может быть ограничен. |
| Сканирование | Проверяет признаки вроде запуска процессов, загрузки кода из сети и обфускации. | Это эвристическое предупреждение, не полноценный антивирус и не автоматическая блокировка. |
| Рекомендуемые проекты | Показывает подходящие подсказки каталога под загрузчик; установка ведёт в активный профиль. | Совместимость всё равно проверяй по требованиям проекта. |
| Экспорт Modrinth-пака | Действие «Экспорт» на экране модов строит .mrpack из включённых записей Lockfile. | Это формат Modrinth, а не MPCRYN. Он описывает список модов и ссылки/хеши, а не обещает копию каждого локального файла. |
Экран показывает снимки из игровых папок (до 200 элементов в текущем запросе), фильтрует по сборке, открывает крупный просмотр, оригинал и папку либо копирует изображение в буфер обмена.
Встроенный просмотрщик поддерживает вкладки, заголовок страницы, создание вкладки Google, ввод HTTP/HTTPS-адреса, закрытие вкладок и масштаб. Неактивная вкладка, простаивающая достаточно долго, может быть выгружена и перезагружена при возврате.
Загруженные файлы показываются во входящих загрузках. Для ZIP интерфейс предлагает импорт модпака либо установку как ресурспака в активный профиль; для JAR — действие переноса как мода.
Кабинет открывается внутри лаунчера с отдельным постоянным разделом Chromium-сессии. Его масштаб настраивается; есть опция не выгружать страницу из памяти при переходе.
Браузер и каталог получают содержимое из интернета. При проблеме соединения пустой результат Modrinth или отсутствие пинга не обязательно означают поломку локальных файлов.
Экран «О лаунчере» показывает версию установленного приложения, краткую информацию о проекте, лицензию и переходы в кабинет/настройки.
Не очищай постоянное хранилище persist:cryndel ради косметической настройки: там могут находиться авторизации и cookies My Cryndel и встроенного браузера.
Полный справочник
Настройки разделены на тематические блоки. Часть параметров сохраняется сразу и применяется на лету, часть используется при создании профиля или следующем запуске игры.
| Настройка | Что меняет | Когда полезно |
|---|---|---|
| Готовая тема | 14 тем: «Ночь», «День», «Фурри», «Роза», «Сталь», «Лёд», «Эмбер», «Лес», «Океан», «Лаванда», «Мята», «Закат», «Сакура», «Песок». | Выбрать готовую палитру и её характер поверхностей, карточек, акцентов и форм элементов. |
| Акцентный цвет | Переопределяет основной акцент темы. | Подобрать цвет кнопок/выделения к фону. |
| Скругление рамок / карточек | Меняет радиус элементов интерфейса. | Сделать оформление более строгим или мягким. |
| Положение навигации | Перемещает навигацию влево, вправо, вверх или вниз. | Подстроить интерфейс под ориентацию окна. |
| Шрифт главной | Выбирает один из предусмотренных стилей главного заголовка. | Настроить визуальный характер главной страницы. |
| Масштаб интерфейса | Меняет общий масштаб окна лаунчера. | Удобство чтения и экран высокой плотности. |
| Ширина панели и размер иконок | Меняет ширину навигации и размеры её значков. | Подписанные или более компактные пункты меню. |
| Иконки действий | Можно выбрать значки настроек, удаления, Modrinth, модов и плагинов из встроенного набора или загрузить собственный SVG. | Настройка применяется сразу и сохраняется. Импорт ограничен безопасными геометрическими SVG-элементами; внешние ресурсы и скрипты не разрешены. |
| Прозрачность панелей, стекло, размытие | Настраивает прозрачность панелей, размытие стекла и фона. | Видимость текста на сложных обоях; отключение blur снижает эффекты. |
| Плотность и компактность | Меняет расстояния/размер компоновки; отдельно есть режим компактного интерфейса. | Уместить больше контента в небольшом окне. |
| Положение панели действий и уведомлений | Выбирает расположение панели инструментов и уведомлений. | Чтобы системные подсказки не перекрывали нужные кнопки. |
| Длительность уведомления | Определяет, сколько времени toast остаётся видимым. | Увеличить время чтения сообщений. |
| Свой CSS | Применяет пользовательский CSS, который можно вставить, загрузить из файла, применить или очистить. | Тонкая настройка цвета/отступов. Ошибочный CSS способен ухудшить читаемость. |
Фоновое видео может зацикливаться. Можно выбрать свой фон и затемнение; сброс возвращает штатную конфигурацию фона.
Можно выбрать видео заставки, управлять её длительностью и включить повтор показа анимации первого открытия.
Общий переключатель анимаций и длительность перехода (ползунок в миллисекундах).
Можно включить/скрыть подсказки и настроить интервал смены слайдов.
Переключатели статистики, действий на главной, приветствия, виджетов и музыкальной карточки.
Можно включить плавное свечение акцентного цвета.
Отдельно управляются декоративные частицы.
Отображение индикатора состояния сервера/пинга на главной.
Можно убрать эффект подъёма карточек при наведении.
Включает/выключает текстовые подписи под значками бокового меню.
Для звуков интерфейса есть общий переключатель, общая громкость, возможность отдельно выключить звуки клика и набора текста, а также индивидуальная громкость и mute для каждого события. Для каждой строки можно прослушать текущий звук, выбрать файл или вернуть встроенный вариант.
Пользовательские звуковые файлы выбираются через диалог. Поддерживаются MP3/OGG/WAV/M4A. Если для события нет собственного файла, лаунчер использует штатный звук или генерирует WAV-запасной вариант. Доступно восстановление одного звука или всех встроенных звуков.
Файлы MP3/OGG/WAV/M4A из muzick/fon попадают в музыкальный список. В установленной версии добавляй пользовательские треки через кнопку «Открыть папку» в настройках: откроется доступная для записи папка данных лаунчера, а не каталог установки. Настройки позволяют задать громкость, режим плейлиста: повтор списка, повтор одного трека, однократное воспроизведение или выключено; автозапуск и видимость карточки на главной управляются отдельно.
Список пуст? Проверь расширение аудиофайла и каталог. Карточка на главной содержит кнопки предыдущего/следующего трека, play/pause и ползунок громкости.
| Параметр | Подробно | Подсказка |
|---|---|---|
| Режим RAM | Автоматически под систему или ручной выбор; глобальное значение памяти при сохранении также обновляет выбранную сборку. | Оставляй память ОС и другим приложениям; выделение всей RAM не ускоряет игру. |
| Окно игры | Задаются ширина, высота и режим полного экрана по умолчанию. | Для устранения проблем запуска попробуй стандартное разрешение окна. |
| Java | Можно задать полный путь команды Java или оставить автоматический выбор. Менеджер находит Java в bundled runtime, JAVA_HOME, PATH и стандартных каталогах ОС. | Требуемая версия зависит от Minecraft; менеджер автоматически выбирает требуемый major или предлагает/скачивает Temurin. |
| Java на диске | Настройки показывают обнаруженные установки и позволяют загрузить Java 21. | Если игра не находит Java, проверь путь и перезапусти подготовку. |
| Дополнительные JVM аргументы | Текст дополнительных параметров виртуальной машины Java. | Меняй только если знаешь назначение каждого флага. |
| Видеокарта | Можно выбрать авто или одну из обнаруженных системой видеокарт. | Если дискретная карта не используется, проверь профиль приложения в ОС/драйвере. |
| Режим графики | Default, Fabulous, Fancy или Fast. | Fast снижает часть визуальных эффектов; Fabulous может быть тяжелее. |
| 3D-предпросмотр скина | Главная может отобразить 3D-модель, если для профиля доступен скин и включён соответствующий флаг интерфейса. | Флаг showSkin3d по умолчанию выключен; он не является отдельной кнопкой мастера сборки. |
Переключатель языка меняет язык интерфейса и сохраняет глобальное игровое языковое предпочтение. У вновь создаваемой сборки также есть собственные параметры языка.
Настройка включает/отключает rich presence и показывает статус подключения. Она намеренно выключена по умолчанию; без настроенного App ID функция может быть недоступна.
Доступны параметры сворачивания лаунчера в трей/из панели задач, закрытия при запуске и возврата окна после закрытия игры. Их взаимодействие определяет, где останется окно во время игры.
«Сброс настроек» сбрасывает настройки лаунчера к значениям по умолчанию. Не считай его сбросом Java, файлов игры или авторизации; важные данные профилей всё равно лучше заранее сохранить.
Приветствие на главной можно отключить независимо от локали. Если для ника нет специальной фразы, используется обычное приветствие.
В настройках доступен повтор onboarding-подсказок для новых пользователей.
В таблицах ниже приведены реальные поля формы настроек и соответствующие ключи. Диапазон у ползунка — это границы контролла в интерфейсе. Если для сохранённого значения не показан ползунок, это не означает, что лаунчер автоматически проверит или исправит его при ручном редактировании файла настроек.
| Что нажать / изменить | Ключ | Варианты или пределы | Что происходит |
|---|---|---|---|
| Тема | ui.theme | dark, light, furry, girly, professional, glass, ember, forest. | Выбор готовой палитры; при выборе темы поле ui.accent очищается, чтобы вернуть её собственный акцент. |
| Цвет интерфейса | ui.accent | Цветовое поле; пустое значение использует акцент темы. | Сразу меняет базовый --accent. Это главный акцент, не отдельный фон каждого элемента. |
| Скругление рамок | ui.radius | 4–28 px. | Задаёт общее скругление. Для карточек ниже существует отдельный параметр. |
| Положение навигации | ui.navPos | Слева, справа, сверху, снизу. | Перестраивает раскладку оболочки лаунчера; узкие окна дополнительно используют адаптивные правила. |
| Шрифт главной | ui.homeFont | default — обычный; minecraft — пиксельный; title — выразительный; classic — с засечками. | Меняет типографику главного заголовка, а не весь текст приложения. |
| Язык лаунчера и Minecraft | ui.language, game.language | ru или en. | Переключает локаль интерфейса и синхронно сохраняет глобальное языковое предпочтение Minecraft. |
| Масштаб интерфейса | ui.uiScale | 80–130%, шаг 5. | Меняет zoom окна лаунчера. Если слишком мал, используй штатный ползунок, а не компенсируй всё CSS-размерами. |
| Ширина и высота окна | ui.windowWidth, ui.windowHeight | По умолчанию 900×600; минимум 700×460, размеры также ограничиваются доступной рабочей областью экрана. | В разделе «Настройки → Лаунчер» выбери ширину и высоту, затем нажми «Применить размер окна». Настройка сохраняется для следующего запуска. |
| Ширина панели навигации | ui.navWidth | 64–132 px, шаг 4. | Это желаемая ширина; CSS дополнительно ограничивает её на адаптивных ширинах. |
| Скругление карточек | ui.cardRadius | 0–30 px. | Задаёт --card-radius; карточки используют его как отдельный радиус. |
| Прозрачность панелей | ui.panelOpacity | 30–100%, шаг 5. | Определяет непрозрачность поверхностей. На 100% текст обычно наиболее читаем. |
| Размытие стекла | ui.glassBlur | 0–40 px, шаг 2; ноль — оставить оформление темы. | Размывает фон за стеклянными панелями. Не путай с размытием обоев. |
| Размер иконок навигации | ui.navIconSize | 14–28 px, шаг 1. | Меняет размеры значков навигационных пунктов. |
| Переопределения SVG | ui.iconOverrides | Объект с вариантами значков для gear, trash, mr, mods, plug. | Настраивается в разделе «Иконки». Можно выбрать встроенный вариант, импортировать безопасный SVG или сбросить значок к стандартному. |
| Плотность интерфейса | ui.density | cozy, normal, dense. | Меняет предусмотренные проектом отступы отдельных элементов; это не равно масштабу zoom. |
| Компактный интерфейс | ui.compact | Вкл. / выкл. | Включает отдельный режим compact наряду с настройкой плотности. |
| Позиция уведомлений | ui.toastPos | Сверху справа или снизу справа. | Перемещает toast-уведомления по вертикали. |
| Длительность уведомления | ui.toastDuration | 1200–12000 мс, шаг 200. | Время показа всплывающего уведомления. |
| Позиция панели загрузок | ui.dockPos | Снизу справа или снизу слева. | Перемещает dock загрузок и соответствующую область уведомлений по горизонтали. |
| Позиция панели действий | ui.toolsPos | auto — как в теме; сверху; снизу. | Меняет размещение строки быстрых действий, а не основную навигацию. |
| Подписи навигации | ui.navLabels | Показывать / скрыть. | Переключает подписи рядом/под значками в зависимости от текущего расположения навигации. |
| Строка состояния | ui.showStatusBar | Показывать / скрыть. | Управляет строкой состояния с пингом и онлайн-информацией. |
| Подъём карточек при наведении | ui.hoverLift | Вкл. / выкл. | Отключает/включает эффект при наведении на карточку. |
| Свечение акцента | ui.accentGlow | Вкл. / выкл. | Выключает некоторые акцентные тени и свечение, не убирая сам цвет выделения. |
| Что нажать / изменить | Ключ | Варианты или пределы | Что происходит |
|---|---|---|---|
| Видео-обои зациклить | ui.bgLoop | Вкл. / выкл. | Управляет циклическим воспроизведением видеофона. |
| Яркость обоев / затемнение фона | ui.bgDim | 20–90%; значение по умолчанию 0.72 (72% яркости). | Меньшее число сильнее затемняет обои. Тема «Ночь» теперь показывает фон светлее; персональное значение ползунка сохраняется. |
| Загрузить / сбросить фон | ui.backgroundFile, ui.backgroundKind | Выбор файла или возврат штатного видеофона. | Выбранный фон применяется сразу; сброс очищает выбранный файл и устанавливает тип фона video. |
| Размытие обоев | ui.bgBlur | 0–24 px, шаг 1. | Размывает фон отдельно от стекла панелей. |
| Видео заставки | ui.splashFile | Выбирается через диалог файла. | Заменяет видеоматериал заставки; выбор сохраняется отдельно от фоновых обоев. |
| Длительность заставки | ui.splashDuration | Числовое поле от 0 до 30000 мс; 0 — длительность как в видео. | Определяет время заставки, когда задано ненулевое значение. |
| Всегда показывать анимацию первого открытия | ui.alwaysSplash | Вкл. / выкл. | Повторно показывает начальную анимацию при последующих открытиях. |
| Лёгкая анимация открытия страниц | ui.animations | Вкл. / выкл.; по умолчанию вкл. | Однократное короткое появление содержимого страницы только по прозрачности; применяется к экрану целиком, не анимирует отдельно заголовки, карточки и каждую строку. |
| Лёгкие реакции кнопок и карточек | ui.animationInteractions | Вкл. / выкл.; по умолчанию вкл. | Короткие переходы элементов управления и небольшие реакции карточек при наведении. |
| Плавное появление уведомлений | ui.animationNotifications | Вкл. / выкл.; по умолчанию вкл. | Короткое появление toast-уведомлений и панели загрузки. |
| Движение декоративного фона и курсора заставки | ui.animationBackground | Вкл. / выкл.; по умолчанию выкл. | Разрешает медленное движение фоновых свечений и мигающий курсор заставки. |
| Видео на фоне | ui.backgroundVideo | Вкл. / выкл. | Останавливает тяжёлое видео и показывает статичный фон, когда он доступен. Не меняет выбранные фоновые файлы. |
| Движущиеся фоновые свечения | ui.ambientEffects | Вкл. / выкл. | Включает или скрывает декоративные размытые световые пятна вокруг окна. |
| Размытие и тени стеклянных панелей | ui.blurEffects | Вкл. / выкл. | Отключает backdrop blur, тени панелей и размытие обоев. Значения ползунков размытия сохраняются. |
| Длительность появления страниц | ui.animationDuration | 100–300 мс, шаг 20; по умолчанию 140 мс. | Меняет длительность лёгкого появления страницы, если оно включено. Небольшое значение делает переход быстрым и сохраняет отзывчивость. |
| Смена слайда обучения | ui.carouselSeconds | 3–30 секунд. | Интервал показа слайдов/подсказок карусели. |
| Карусель обучения | ui.hideCarousel | Показать / скрыть. | В настройке переключатель положительный; внутренний ключ обратный: true означает скрыть. |
| Статистика главной | ui.statCards | Показывать / скрыть. | Скрывает или возвращает статистические карточки. |
| Кнопки действий на главной | ui.homeActions | Показывать / скрыть. | Управляет главной группой быстрых действий. |
| Приветствие по нику на главной | ui.homeGreeting | Показывать / скрыть. | Отдельная настройка строки приветствия возле ника. |
| Приветствие в секции «Приветствие» | ui.greetingEnabled | Показывать / скрыть. | Это ещё один переключатель приветствия, отдельный от homeGreeting; если поведение кажется похожим, проверяй оба состояния. |
| Виджеты | ui.showWidgets | Вкл. / выкл. | Разрешает плавающие виджеты на поддерживаемых экранах. Сами виджеты не показываются поверх главной страницы. |
| Частицы на фоне | ui.particles | Вкл. / выкл. | Включает декоративные частицы на отдельном canvas-слое; при выключении анимация canvas останавливается. |
| Количество частиц | ui.particleCount | 8–60, шаг 4; по умолчанию 28. | Меняет число частиц и перезапускает только canvas-анимацию. Ползунок доступен при включённом переключателе частиц. |
| Картинка фурри и три своих звука | ui.furryImage, ui.furrySounds | Файлы выбираются диалогом. | Настраивают материалы соответствующей темы/виджета, но не включают виджет на главной. |
| Что нажать / изменить | Ключ | Варианты | Что происходит |
|---|---|---|---|
| Звуки интерфейса и заставки | ui.sounds | Вкл. / выкл. | Общий переключатель интерфейсных звуков. |
| Громкость звуков | ui.soundVolume | 0–100%; в хранилище от 0 до 1. | Общий коэффициент громкости звуков. |
| Клики со звуком / звук набора текста | ui.clickSounds, ui.typingSounds | Каждый параметр отдельно вкл. / выкл. | Отключают соответствующие категории взаимодействий. |
| Громкость для каждого события | ui.soundVolumes.<event> | 0–100%, отдельно по строке. | Независимый уровень для klick, knopka, sew, posluzunok, zvukprinapisanii, interfeyse, ura, eror, warn и zastavka. |
| Выключить отдельный звук | ui.soundMuted.<event> | Отдельный mute для каждой строки. | Отключает одно событие, не выключая остальные звуки интерфейса. |
| Свой файл звука | ui.soundFiles.<event> | Файл выбирается отдельно для события. | Можно прослушать, заменить или вернуть встроенный звук; есть восстановление всех звуков. |
| Громкость музыки | ui.musicVolume | 0–100%; в хранилище от 0 до 1. | Меняет уровень фоновой музыки и доступна также на карточке проигрывателя. |
| Режим музыки | ui.musicMode | playlist, single, once, off. | Цикл всего списка, повтор одного трека, проиграть один раз или выключить. |
| Автозапуск музыки | ui.musicAutoplay | Выкл. по умолчанию; включается вручную. | Если выключено, музыка сама не начинает играть при запуске приложения или первом клике. Запустить её всё ещё можно кнопкой play; это предпочтение сохраняется. |
| Музыкальная карточка главной | ui.showMusicCard | Показывать / скрыть. | Меняет видимость плеера на главной; не удаляет файлы и не отключает сам каталог музыки. |
В исходниках файлы музыки кладутся в muzick/fon. В установленном лаунчере используй кнопку «Открыть папку» в настройках: папка находится в доступном для записи каталоге данных пользователя. Не путай индивидуальную громкость события с общей громкостью звука и громкостью музыки: это три самостоятельных слоя управления.
| Что нажать / изменить | Ключ | Варианты или пределы | Что происходит |
|---|---|---|---|
| Режим RAM | game.memoryMode | auto или manual. | Автоматический расчёт под систему или ручной объём. При сохранении выбранный профиль тоже обновляется. |
| RAM для игры | game.defaultMemoryMb | От 2048 МБ с шагом 256; динамический максимум обычно не ниже 4096 и рассчитывается как минимум 1024 МБ меньше системной RAM. | Глобальная стартовая рекомендация/значение. Оставляй ОС и другим программам достаточную память. |
| Разрешение окна | game.defaultResolution.width, game.defaultResolution.height | Числовые значения, при пустом/нулевом вводе применяется запасное значение 1280×720. | Сохраняет ширину и высоту окна игры. |
| Полный экран | game.defaultFullscreen | Вкл. / выкл. | Настройка режима запуска Minecraft по умолчанию. |
| Своя команда Java | game.javaCommand | Пусто — автоматический подбор; иначе полный путь к Java. | Учитывай требуемую версией Minecraft версию Java. Некорректный путь может остановить запуск. |
| Дополнительные аргументы JVM | game.customJvmArgs | Строка аргументов. | Передаётся виртуальной машине Java; добавляй только знакомые параметры. |
| Видеокарта | game.gpu | auto или идентификатор обнаруженного GPU. | Список формируется по оборудованию, доступному системе. |
| Рендер игры | game.graphics | default, fabulous, fancy, fast. | Выбор уровня графики, применяемого к игре. |
| Java на диске | Не отдельный текстовый ключ мастера | Кнопка «Скачать Java 21». | Показывает найденные Java и позволяет скачать Java 21; в зависимости от версии Minecraft лаунчер может выбрать другой нужный major. |
| Что нажать / изменить | Ключ | Варианты / значение по умолчанию | Комментарий |
|---|---|---|---|
| Discord RPC | launcher.discordRpc | Вкл. / выкл.; текущая схема хранения задаёт true. | Показывает статус; без настроенного App ID или работающего Discord подключение может быть недоступно. В проектных правилах функция обозначена как выключенная по умолчанию, но значение схемы и форма сейчас расходятся с этим намерением. Не считай текущее сохранённое значение подтверждением подключения. |
| Сворачивать в трей при запуске игры | launcher.minimizeToTray | Вкл. по умолчанию. | Выбирает поведение окна при запуске игры. |
| Закрывать лаунчер при запуске игры | launcher.closeOnLaunch | Выкл. по умолчанию. | Не включай одновременно с ожиданием, что окно останется открытым; учитывай взаимодействие настроек окна. |
| Возвращать лаунчер после закрытия игры | launcher.showOnGameExit | Вкл. по умолчанию. | Управляет показом лаунчера после завершения Minecraft. |
| Пройти обучение заново | Действие onboarding | Кнопка запускает обучение повторно. | Это действие, а не постоянный параметр внешнего вида. |
| Сброс настроек | Все настройки | Возврат к default settings. | Меняет именно настройки лаунчера; это не кнопка удаления игровых каталогов. После сброса не очищай webview storage ради проверки. |
| Масштаб My Cryndel | cabinet.zoom | Числовое поле, в форме 50–150%, исходное значение 100%. | Открой страницу кабинета, вызови её контекстную команду «Настройки страницы», измени размер. Значение влияет на отображение сайта. |
| Страница в фоне (не выгружать) | cabinet.keepAlive | Вкл. по умолчанию. | Находится в настройках страницы My Cryndel и отвечает за сохранение активности веб-страницы. |
Секция «Настройки» также содержит кнопки перехода в «Плагины» и «О лаунчере». Это навигация, а не переключатели конфигурации.
Ниже перечислены дополнительные ключи, существующие в текущих значениях по умолчанию проекта. Их присутствие в schemas.js означает, что хранилище знает такое поле, но не означает, что в обычном экране настроек есть для него переключатель. Не редактируй JSON напрямую без резервной копии: структура может меняться при миграции версии лаунчера.
| Группа и ключи | Значение по умолчанию схемы | Оговорка |
|---|---|---|
ui.backgroundVideo, ui.backgroundKind | true, video | Базовые признаки фонового видео; выбор фона в форме использует также backgroundFile. |
ui.reducedMotion, ui.bgVeil | false, 0.8 | Состояние уменьшенного движения учитывается рендерингом; bgVeil задаёт прозрачность слоя затемнения, и по умолчанию он стал легче. Отдельного контролла в этой форме для них нет. |
ui.showSkin3d, ui.skinSpin | false, true | 3D-скин намеренно выключен по умолчанию. Не следует считать эти поля доступным переключателем в секции настроек. |
ui.furryWidget, ui.furryScale, ui.shotsWidget | true, 1, true | Управляют частью виджетов/их размером. Размер меняется через событие виджета «Размер виджета» в диапазоне 50–180%; общего переключателя этих полей в показанной форме нет. |
ui.musicCardPos | bottom-left | Сохранённое позиционное поле; пользовательский экран переключает видимость карточки, а не это поле. |
ui.splash, ui.uiSounds | true, true | Дополнительные/унаследованные флаги в схеме. На форме есть актуальные переключатели заставки/звуков по другим ключам; эти поля не следует считать отдельными контроллами. |
ui.headerAutoHide, ui.homeButtons, ui.homeActions | true, true, true | Заголовок автоматически адаптируется; homeButtons — отдельное состояние от отображения homeActions. В форме есть отдельный видимый переключатель только для действий главной. |
ui.greetingEnabled, ui.homeGreeting | true, true | Это два ключа, не один: экран показывает контролы для обоих, поэтому проверяй оба, если персонализация приветствия ведёт себя неожиданно. |
ui.pluginsEnabled, ui.homeButtons | true, true | pluginsEnabled — рабочий глобальный переключатель расширений на экране плагинов; homeButtons относится к главному экрану. |
launcher.hideToTrayOnLaunch, launcher.showConsoleOnLaunch, launcher.hideOnLaunch, launcher.confirmExit, launcher.restoreWindowAfterGame | false, false, false, true, true | Поля жизненного цикла окна из схемы; все они не представлены отдельными контролами в текущей форме настроек. |
versions.showReleases, showSnapshots, showBetas, showOld | true, false, false, false | Фильтры типов версий; не путай их с селектором версии при установке Minecraft. |
modrinth.enabled, autoCheckUpdates, checkIntervalHours, autoInstallDependencies, scanMalware, skipDuplicates, listLimit, fullscreen, svgOnly | true, true, 24, true, true, true, 20, true, true | Внутренние предпочтения экрана Modrinth/загрузчика; не все имеют отдельный переключатель в общей форме. Проверяй актуальные настройки конкретного экрана. |
browser.zoom, browser.openLinksInside | 100, true | Настройки встроенного браузера; не представлены в общей форме настроек. |
advanced.apiUrl, advanced.devMode, advanced.verboseLogging, advanced.liveNick, advanced.discordAppId | https://api.cryndel.ru, false, false, { enabled: true, wsPort: 21999 }, пустая строка | Служебные и расширенные значения. Не меняй API URL или порт без понимания последствий; RPC также требует корректной конфигурации приложения Discord. |
extras.customCss, extras.splash | true, true | Флаги доступности дополнительных возможностей; текст CSS фактически хранится отдельно в themes/custom.css. |
У игровой схемы есть и другие значения Minecraft — например лимит FPS, дальность прорисовки и симуляции, FOV, VSync, чувствительность мыши, громкость, сложность, чат и параметры HUD. Это не контролы глобального раздела «Память и картинка» в текущем settings.js. Настройки, относящиеся к отдельной сборке, следует искать в настройках/конфигурации выбранного профиля и самой игры, а не предполагать наличие скрытого переключателя в этом экране.
Остальные поля game | Значение по умолчанию схемы | Важно |
|---|---|---|
defaultGameDir, javaPath, jvmPreset, envVars | Пустой каталог; auto; cryndel-recommended; пустая строка. | Путь к каталогу игры, режим выбора Java, пресет JVM и переменные среды. Не являются контролами общей формы «Память и картинка». |
toggleSprint, toggleSneak, rawMouseInput, vsync | true, false, true, true. | Игровые предпочтения управления и синхронизации кадров. |
maxFps, renderDistance, simulationDistance, guiScale, fov | 0, 12, 12, 0, 70. | Игровые графические параметры; 0 имеет специальный смысл, заданный Minecraft/лаунчером, и не означает автоматически «выключить». |
autoJump, particlesSetting | false, all. | Автопрыжок и качество частиц. |
masterVolume, musicVolume, difficulty, chatVisibility | 1, 1, normal, full. | Громкость Minecraft и игровые правила/предпочтения. Не смешивай их с громкостью музыки самого лаунчера. |
showFps, fullscreenOnLaunch | false, false. | Дополнительные параметры отображения/запуска Minecraft; в форме присутствует только defaultFullscreen. |
capeFile, capeEnabled, skinModel | Пустой файл; false; default. | Данные плаща и модели скина; наличие ключа не гарантирует активный отдельный контрол в общей форме. |
serverHost, serverPort, autoAddServer | cryndel.ru, 25565, true. | Значения сервера и автоматического добавления сервера; не редактируй без понимания назначения выбранной сборки. |
smoothLighting, clouds, entityShadows, bobView, viewBobbing | true, default, true, true, true. | Игровые настройки графики и камеры. |
pauseOnLostFocus, invertYMouse, mouseSensitivityPct | true, false, 100. | Фокус окна и параметры мыши. |
gammaPct, chatOpacityPct, hudHidden, narrator | 50, 100, false, 0. | Яркость, прозрачность чата, HUD и диктор; поля схемы, а не элементы текущей общей формы. |
В ключах Minecraft есть похожие по смыслу поля — например defaultFullscreen и fullscreenOnLaunch, а также два ключа showOnGameExit в группах game и launcher. Это разные пространства настроек, и не следует подменять одно другим без проверки места, где значение читается.
Короткие ответы
Основные понятия, которые встречаются в интерфейсе и инструкциях.
Отдельный профиль Minecraft со своими файлами, настройками, модами и выбранным загрузчиком.
Это разные форматы. MPCRYN — контейнер сборки Cryndel; MRPACK используется Modrinth. Для каждого есть свой пункт импорта.
Нет. Импорт создаёт профиль и распаковывает его файлы; запуск выполняется отдельно кнопкой «Играть».
В нём объявляются ID, имя, версия, точка входа, версия Plugin API, разрешения и схема настроек.
На странице «Плагины», внутри карточки установленного расширения. Если схема настроек отсутствует, доступен JSON-конфиг.
Установленная версия лаунчера не поддерживает заявленную версию плагина. Найди совместимую версию расширения; не меняй значение API только для обхода предупреждения.
Нет. Плагин содержит исполняемый код; устанавливай только проверенные архивы от доверенных авторов.
У каждой сборки свой игровой каталог. Внутри страницы сборок можно открыть папку нужного профиля.