BcSpectra — наш игровой движок для Minecraft: 3D‑модели, текстуры, звуки, анимации, эффекты и защищённый ресурспак — всё, что игрок видит и слышит, — в одном плагине. Что автор видит в Blockbench — то игрок видит в игре, на всех версиях клиента от 1.19.4 до 26.2.
Движок не считает то, чего игрок не видит, а остальное обновляет общими пачками. В лучшем замере нагрузка на сервер от моделей упала на 80% — в худшем на 50%. Значит, при тех же ресурсах на сцене помещается в 2–5 раз больше живых моделей: больше боссов, мебели и мобов в одном месте без просадок.
Это форк CraftEngine со встроенным BetterModel: один плагин вместо связки из трёх. Основа открыта (GPLv3), поэтому, если что-то упирается в чужое решение, оно переписывается в самом движке, а не обходится костылями. Следующим модулем встанет BcHUD — наш форк BetterHud.
Предметы, блоки, мебель, мобы, анимации, текстуры, звуки и ресурспак — одна конфигурация, одна диагностика, одна команда перезагрузки.
Кривые анимаций совпадают с Blockbench 5.1.6, а позы костей сверяются с эталоном автоматически — с точностью до долей пикселя.
Клиенты 1.19.4–26.2 через ViaVersion. Автор делает модель один раз, а движок сам подстраивает её под каждого игрока.
Только то, что работает и проверено — тестами и в игре на нескольких версиях клиента.
Стоит сохранить .bbmodel — и модель на сервере обновляется сразу. Правка анимации применяется за 0,1 с. При правке геометрии или текстуры пересобирается только эта модель, за ~1,8 с вместо 8,5–9,5 с полной перезагрузки. Именно это превращает Blockbench в живую студию.
Окклюзия. Модель за стеной не рисуется и не отправляется игроку: движок проверяет лучом, видно ли её вообще.
Куллинг. Модель вне поля зрения не просчитывается. Конус обзора учитывает размер модели и даже расширенное поле зрения при беге.
LOD. Чем дальше модель, тем реже она обновляется: на расстоянии заметной разницы нет, а нагрузка падает. Неподвижные модели не пересчитываются вовсе.
20 Гц вместо 40 — без потерь. 20 раз в секунду — это частота самой игры. Исходный BetterModel считал позы вдвое чаще, здесь он приведён в такт с Minecraft: движение боссов и обычная ходьба выглядят так же, а работы на каждую модель вдвое меньше. Чистый выигрыш.
Микшер со слоями, плавными переходами и аддитивными треками; вторичная динамика (хвосты, волосы, плащи), IK, взгляд на цель, root motion.
Ходьба, бег, прыжок, атака, лук, щит, езда — выбираются сами по таблице из 20 строк. Скорость анимации подстраивается под реальную скорость моба, стопа встаёт в контакт с землёй.
Анимации, зависящие от состояния сущности; переменные модели с сохранением; render controllers: видимость частей, текстуры, подсветка по правилам.
Частицы, звуки и постоянные эмиттеры привязаны к костям. Видят их только те, кто видит модель. Спецэффекты без сущности — модель-эффект в любой точке мира.
Ключевой кадр может запустить навык точно из позиции кости. Конфиги ModelEngine работают как написаны — миграция без переписывания.
Команда /spectra doctor находит мерцающие грани, дубликаты моделей, неверные имена анимаций и считает, сколько модель «стоит» клиенту. Отчёт один на всё: и для человека, и для плагина.
После выгрузки чанка, рестарта и перезагрузки модель продолжает с того же места: цвета, скрытые кости, идущие анимации, переменные.
Движок собран из модулей. Если один из них не смог загрузиться, он отключается на эту сессию, а сервер, предметы, блоки и пак продолжают работать.
Состояния предмета, запечённая анимация в руке и иконки инвентаря генерируются прямо из модели. Блоки — с отчётом, что Java‑формат не выразит.
Положение 1 844 костей сверяется с эталоном Blockbench с точностью до 0,0001 пикселя, пакетные тесты по каждой версии клиента, снимки на реальных моделях.
Игроки сидят на разных версиях Minecraft. Каждая модель проверяется на живых клиентах, а не только в теории. Один файл модели работает и у игрока на 1.19.4, и у игрока на 26.2.
Правильная высота модели и красная вспышка при ударе работают на проверенных версиях, начиная с 1.19.4.
Светящиеся грани и подсветка работают начиная с 1.21.2 и на всех новых клиентах, включая нашу основную 1.21.4.
Размер пака — это время, которое игрок ждёт при входе. Размер снижался шаг за шагом, и каждый шаг проверялся пересборкой: все 4 020 текстур после сжатия совпадают с исходными пиксель в пиксель.
Минус 15,65 МБ. Сборка детерминирована: два запуска дают один и тот же файл побайтово. В паке около 10 тысяч файлов; почти все шаги без потерь, модели и картинки не меняются.
Модели, текстуры и звуки — наш актив. Пак защищён независимыми слоями, каждый проверен на живом клиенте 1.21.4 и самопроверяется при сборке. Всё включается в настройках без пересборки движка.
Каждое имя файла заменено на случайный набор символов, а все разделы пака слиты в один. По названию не понять, что внутри.
В архиве намеренно «врут» служебные данные: пустые заголовки, неверные контрольные суммы. Обычные программы не открывают его, а клиент Minecraft читает без проблем.
Каждый файл заявляет размер около 4,29 ГБ, поэтому распаковщики показывают десятки терабайт.
Плоские текстуры предметов хранятся как каталоги: клиент их находит по точному имени, а перечисление файлов — нет.
В архив добавлены записи с именами, которые Windows считает запрещёнными. Распаковщики на них спотыкаются, а игре они не мешают.
Файлы с одинаковым содержимым схлопываются в один — для текстур, моделей и всего, что можно переименовать.
Каждый 4‑й символ каждой строки экранирован: непрерывной строки длиннее 3 символов нет, поэтому поиск по тексту ничего не находит. Позиции подобраны так, чтобы пак вышел минимального размера.
В каждой картинке испорчены контрольные числа: популярные программы (Pillow, ffmpeg) отказываются её открывать, а клиент Minecraft читает без проблем.
Во вторую линию обороны добавлены поддельные служебные блоки: если кто-то починит контрольные числа, эти блоки всё равно сломают ffmpeg и ImageMagick. Клиент их игнорирует.
Из PNG вырезаны текстовые блоки и следы редакторов, из ogg — теги: названия треков, ссылки и всё, что выдаёт происхождение файла.
Сломаны контрольные суммы страниц и изменены заголовки тремя приёмами поверх этого. Звук на выходе совпадает с исходным бит в бит.
Одиночные текстуры предметов запечены в листы; каждый лист перечитывается и сверяется попиксельно, при расхождении сборка идёт без атласа.
Вырезаны имена групп и кубов и авторская подпись. Украденная модель — безымянные кубы, а не проект.
Одинаковая форма записана один раз, а модели ссылаются на неё. По набору файлов не понять, как устроена модель.
Папки с версионными добавками к паку переименованы, а определения брони подменяются прямо при отправке игроку. Таблицы подмен сохраняются при перезапуске.
Идентификаторы моделей подменяются при отправке, оригинал известен только серверу и хранится как хэш с ключом. Прочитать из пака, какой предмет какую модель показывает, нельзя.
В таблицы предметов добавлены записи, указывающие на настоящие модели не тех предметов: без сервера таблицу не проверить. Игроку это ничего не стоит.
Одноразовый токен, отказ не‑Minecraft запросам, лимит частоты. Сжатие zopfli на всех ядрах и пропуск пересборки, если ничего не изменилось.
Реальные данные из git: сколько строк Java и Kotlin было написано, переделано и убрано. Без чужого кода и без массового переименования. Нажатие на столбик или наведение курсора открывает внизу всё, что сделано в этот день.
Новый план ENGINE_MAX составлен 5 октября по результатам разбора кода: 80 пунктов в 6 фазах, и из него за два дня уже закрыто 29. Каждый пункт доводится до конца: тесты, проверка в игре на трёх версиях клиента, документация, диагностика для автора.
Каждое следующее изменение должно быть измеримым, а поломки — не тихими: дамп истины по костям, заморозка поз, тест‑стенд по версиям клиента, цена модели для клиента.
То, что игрок видит на каждой модели: плавность, точность и отсутствие «вспышек» при появлении и смерти.
Всё, что CraftEngine рисует сущностями — мебель, хитбоксы, коллайдеры, сиденья, снаряды, блоки с анимацией — переходит под наш модуль моделей, с тем же или лучшим качеством. Проект архитектуры готов (L0_DESIGN.md).
VFX и снаряды, попадания по костям (слабые места боссов), косметика и питомцы, броня и оружие из модели, анимированные предметы в руке, смерть в стиле ragdoll, эмоции игроков.
Авторинг уровня Bedrock: поведение модели описывается в файле, а не в коде.
Цикл «рисунок → сохранение → результат в игре». Серверная сторона уже стоит: локальный API, живое обновление, единый формат файла и отчётов. Остаётся сам плагин.
Наш форк BetterHud вливается в BcSpectra отдельным модулем, как это уже сделано с BetterModel. Интерфейс на экране игрока будет жить в том же плагине, с тем же паком, той же защитой и той же диагностикой — без отдельной связки плагинов. Модули подключаются безопасно: упавший модуль отключается, а движок продолжает работать.
С середины сентября BetterModel встроен в CraftEngine, пак защищён 17 слоями и стал на 68% легче, написано 78 тысяч новых строк. Из 80 пунктов нового плана закрыто 29, ещё 51 впереди: от плавности и мебели до анимации как данных. Отдельно ждут плагин для Blockbench (серверная часть уже есть) и модуль BcHUD.
Если встретилось незнакомое слово — оно здесь.
.bbmodel.