технический обзор · 6 октября 2026

Один движок.
Любой клиент.

BcSpectra — наш игровой движок для Minecraft: 3D‑модели, текстуры, звуки, анимации, эффекты и защищённый ресурспак — всё, что игрок видит и слышит, — в одном плагине. Что автор видит в Blockbench — то игрок видит в игре, на всех версиях клиента от 1.19.4 до 26.2.

0
новых строк кода за 3 недели
1.19.4–26.2
версии клиента, одна модель на все
0
коммитов за 21 день
0
пунктов в плане развития
эффективность

43 модели теперь стоят серверу как 9

Движок не считает то, чего игрок не видит, а остальное обновляет общими пачками. В лучшем замере нагрузка на сервер от моделей упала на 80% — в худшем на 50%. Значит, при тех же ресурсах на сцене помещается в 2–5 раз больше живых моделей: больше боссов, мебели и мобов в одном месте без просадок.

01 · основа

Что это такое

Это форк CraftEngine со встроенным BetterModel: один плагин вместо связки из трёх. Основа открыта (GPLv3), поэтому, если что-то упирается в чужое решение, оно переписывается в самом движке, а не обходится костылями. Следующим модулем встанет BcHUD — наш форк BetterHud.

🧩

Всё в одном jar

Предметы, блоки, мебель, мобы, анимации, текстуры, звуки и ресурспак — одна конфигурация, одна диагностика, одна команда перезагрузки.

🎯

Что видишь — то и получаешь

Кривые анимаций совпадают с Blockbench 5.1.6, а позы костей сверяются с эталоном автоматически — с точностью до долей пикселя.

🛰

Одна модель — все версии

Клиенты 1.19.4–26.2 через ViaVersion. Автор делает модель один раз, а движок сам подстраивает её под каждого игрока.

02 · возможности

Что движок умеет уже сегодня

Только то, что работает и проверено — тестами и в игре на нескольких версиях клиента.

⚡

Живая правка модели

Стоит сохранить .bbmodel — и модель на сервере обновляется сразу. Правка анимации применяется за 0,1 с. При правке геометрии или текстуры пересобирается только эта модель, за ~1,8 с вместо 8,5–9,5 с полной перезагрузки. Именно это превращает Blockbench в живую студию.

0,1 справка анимации
1,8 справка геометрии
0перезапусков сервера
👁

Умный рендер: окклюзия, куллинг и LOD

Окклюзия. Модель за стеной не рисуется и не отправляется игроку: движок проверяет лучом, видно ли её вообще.

Куллинг. Модель вне поля зрения не просчитывается. Конус обзора учитывает размер модели и даже расширенное поле зрения при беге.

LOD. Чем дальше модель, тем реже она обновляется: на расстоянии заметной разницы нет, а нагрузка падает. Неподвижные модели не пересчитываются вовсе.

20 Гц вместо 40 — без потерь. 20 раз в секунду — это частота самой игры. Исходный BetterModel считал позы вдвое чаще, здесь он приведён в такт с Minecraft: движение боссов и обычная ходьба выглядят так же, а работы на каждую модель вдвое меньше. Чистый выигрыш.

24 · 48блоков: пороги упрощения
20 Гцвместо 40 — без потерь, вдвое меньше работы
до −80%нагрузки на 43 моделях
🎬

Анимация студийного уровня

Микшер со слоями, плавными переходами и аддитивными треками; вторичная динамика (хвосты, волосы, плащи), IK, взгляд на цель, root motion.

🚶

Моб сам знает, как двигаться

Ходьба, бег, прыжок, атака, лук, щит, езда — выбираются сами по таблице из 20 строк. Скорость анимации подстраивается под реальную скорость моба, стопа встаёт в контакт с землёй.

🧮

Molang и логика Bedrock

Анимации, зависящие от состояния сущности; переменные модели с сохранением; render controllers: видимость частей, текстуры, подсветка по правилам.

✨

Эффекты из ключевых кадров

Частицы, звуки и постоянные эмиттеры привязаны к костям. Видят их только те, кто видит модель. Спецэффекты без сущности — модель-эффект в любой точке мира.

⚔️

Навыки MythicMobs из анимации

Ключевой кадр может запустить навык точно из позиции кости. Конфиги ModelEngine работают как написаны — миграция без переписывания.

🔬

Диагностика ловит ошибки до игроков

Команда /spectra doctor находит мерцающие грани, дубликаты моделей, неверные имена анимаций и считает, сколько модель «стоит» клиенту. Отчёт один на всё: и для человека, и для плагина.

💾

Модель помнит всё

После выгрузки чанка, рестарта и перезагрузки модель продолжает с того же места: цвета, скрытые кости, идущие анимации, переменные.

🛡

Модуль не роняет движок

Движок собран из модулей. Если один из них не смог загрузиться, он отключается на эту сессию, а сервер, предметы, блоки и пак продолжают работать.

🧱

Предметы и блоки из .bbmodel

Состояния предмета, запечённая анимация в руке и иконки инвентаря генерируются прямо из модели. Блоки — с отчётом, что Java‑формат не выразит.

🧪

Проверено тестами

Положение 1 844 костей сверяется с эталоном Blockbench с точностью до 0,0001 пикселя, пакетные тесты по каждой версии клиента, снимки на реальных моделях.

03 · версии клиента

Одна модель — на всех клиентах

Игроки сидят на разных версиях Minecraft. Каждая модель проверяется на живых клиентах, а не только в теории. Один файл модели работает и у игрока на 1.19.4, и у игрока на 26.2.

1.19.4поддерживается
1.20.1поддерживается
1.20.4поддерживается
1.21.1поддерживается
1.21.2+ свечение
1.21.3поддерживается
1.21.4точно · родная
1.21.8 · 1.21.11точно
26.2точно · пак грузится
геометрия точно как в Blockbenchверсия поддерживается, модели грузятся и анимируются
📐

Высота и урон

Правильная высота модели и красная вспышка при ударе работают на проверенных версиях, начиная с 1.19.4.

💡

Свечение

Светящиеся грани и подсветка работают начиная с 1.21.2 и на всех новых клиентах, включая нашу основную 1.21.4.

04 · пак и сборка

Пак на 68% легче. Ни один пиксель не тронут

Размер пака — это время, которое игрок ждёт при входе. Размер снижался шаг за шагом, и каждый шаг проверялся пересборкой: все 4 020 текстур после сжатия совпадают с исходными пиксель в пиксель.

📦

23,17 → 7,52 МБ

Минус 15,65 МБ. Сборка детерминирована: два запуска дают один и тот же файл побайтово. В паке около 10 тысяч файлов; почти все шаги без потерь, модели и картинки не меняются.

−68%размер загрузки
1 сперезагрузка без изменений
~20 схолодная сборка пака
Умное сжатие PNG (подбор фильтров)
−3,56 МБ
Общая геометрия моделей — один раз
−1,90 МБ
Облегчённые шрифты интерфейса
−1,59 МБ
Отключены неиспользуемые подсистемы и демо-файлы
−1,41 МБ
Склейка одинаковых файлов
−1,37 МБ
Экономное экранирование JSON
−1,08 МБ
Оптимизация звуков
−1,01 МБ
Короткие имена файлов
−0,55 МБ
Группировка спрайтов по палитре
−0,50 МБ
Остальные мелкие шаги
−2,68 МБ
05 · защита

Семнадцать слоёв защиты пака

Модели, текстуры и звуки — наш актив. Пак защищён независимыми слоями, каждый проверен на живом клиенте 1.21.4 и самопроверяется при сборке. Всё включается в настройках без пересборки движка.

01

Имена и пространства

Каждое имя файла заменено на случайный набор символов, а все разделы пака слиты в один. По названию не понять, что внутри.

имена → хэши
02

Контейнер zip

В архиве намеренно «врут» служебные данные: пустые заголовки, неверные контрольные суммы. Обычные программы не открывают его, а клиент Minecraft читает без проблем.

unzip видит 0 файлов
03

Фальшивый размер файлов

Каждый файл заявляет размер около 4,29 ГБ, поэтому распаковщики показывают десятки терабайт.

~4,29 ГБ на файл
04

Текстуры как папки

Плоские текстуры предметов хранятся как каталоги: клиент их находит по точному имени, а перечисление файлов — нет.

скрыты от распаковщиков
05

Ловушки для распаковщиков

В архив добавлены записи с именами, которые Windows считает запрещёнными. Распаковщики на них спотыкаются, а игре они не мешают.

ловушки в архиве
06

Дедупликация

Файлы с одинаковым содержимым схлопываются в один — для текстур, моделей и всего, что можно переименовать.

5 017 склеек
07

JSON без читаемых строк

Каждый 4‑й символ каждой строки экранирован: непрерывной строки длиннее 3 символов нет, поэтому поиск по тексту ничего не находит. Позиции подобраны так, чтобы пак вышел минимального размера.

2,17 млн литералов
08

PNG: сломанные суммы

В каждой картинке испорчены контрольные числа: популярные программы (Pillow, ffmpeg) отказываются её открывать, а клиент Minecraft читает без проблем.

ломает ffmpeg и Pillow
09

PNG: ловушки

Во вторую линию обороны добавлены поддельные служебные блоки: если кто-то починит контрольные числа, эти блоки всё равно сломают ffmpeg и ImageMagick. Клиент их игнорирует.

1 602 текстуры
10

Зачистка следов

Из PNG вырезаны текстовые блоки и следы редакторов, из ogg — теги: названия треков, ссылки и всё, что выдаёт происхождение файла.

метаданные удалены
11

Звуки ogg

Сломаны контрольные суммы страниц и изменены заголовки тремя приёмами поверх этого. Звук на выходе совпадает с исходным бит в бит.

16/16 бит‑в‑бит
12

Атласы

Одиночные текстуры предметов запечены в листы; каждый лист перечитывается и сверяется попиксельно, при расхождении сборка идёт без атласа.

1 404 спрайта · 207 листов
13

Модели без чертежей

Вырезаны имена групп и кубов и авторская подпись. Украденная модель — безымянные кубы, а не проект.

без имён и credit
14

Общая геометрия — в родителя

Одинаковая форма записана один раз, а модели ссылаются на неё. По набору файлов не понять, как устроена модель.

1 029 форм вместо 6 166
15

Оверлеи и экипировка

Папки с версионными добавками к паку переименованы, а определения брони подменяются прямо при отправке игроку. Таблицы подмен сохраняются при перезапуске.

overlay + equipment
16

Предмет → модель на сетевом уровне

Идентификаторы моделей подменяются при отправке, оригинал известен только серверу и хранится как хэш с ключом. Прочитать из пака, какой предмет какую модель показывает, нельзя.

хэш с ключом
17

Фальшивые записи в таблицах

В таблицы предметов добавлены записи, указывающие на настоящие модели не тех предметов: без сервера таблицу не проверить. Игроку это ничего не стоит.

5 824 записи · 0 с на вход
+

Доставка и сжатие

Одноразовый токен, отказ не‑Minecraft запросам, лимит частоты. Сжатие zopfli на всех ядрах и пропуск пересборки, если ничего не изменилось.

токен · zopfli
Принцип: каждый слой самопроверяется — результат перечитывается, сверяется с исходником и при любом расхождении заменяется исходником. Всё включается и выключается в настройках без пересборки движка.
06 · прогресс

Три недели по дням

Реальные данные из git: сколько строк Java и Kotlin было написано, переделано и убрано. Без чужого кода и без массового переименования. Нажатие на столбик или наведение курсора открывает внизу всё, что сделано в этот день.

нажатие закрепляет день
НовыеИзменённыеУбранные
78 187новых строк написано
5 572строк изменено
14 098строк убрано — рефакторинг и чистка
257коммитов на 15 рабочих днях
07 · что дальше

Куда движется движок

Новый план ENGINE_MAX составлен 5 октября по результатам разбора кода: 80 пунктов в 6 фазах, и из него за два дня уже закрыто 29. Каждый пункт доводится до конца: тесты, проверка в игре на трёх версиях клиента, документация, диагностика для автора.

Закрыто из нового плана за два дня0 из 80
7 из 19 качество моделей9 из 31 функциональность и MythicMobs4 из 11 CraftEngine3 из 8 связка CE ↔ BetterModel6 из 11 инструменты и тесты

Фундамент

Каждое следующее изменение должно быть измеримым, а поломки — не тихими: дамп истины по костям, заморозка поз, тест‑стенд по версиям клиента, цена модели для клиента.

T1Дамп костейT2Заморозка позыT6Тесты по версиямT8Тайминг перезагрузкиQ13Цена модели для клиентаC2Состояния предметов на старых клиентахT3Счётчики нагрузки по моделямT7Автопроверка перед запускомC1Проверка ссылок при сборке пакаL0aОснова для переноса мебели и блоков

Видимое качество

То, что игрок видит на каждой модели: плавность, точность и отсутствие «вспышек» при появлении и смерти.

Q1Параметры анимаций BlockbenchQ2Измеренная ходьбаQ3Полный набор состоянийQ4Проверка z‑fightingQ11Ваниль‑поворот телаQ19Мобы без ИИQ5Вся поза одним пакетомQ8Точная настройка LODQ9Без резких появлений и исчезновенийQ17Отсечение костей на стороне клиентаQ7Свечение на старых клиентахQ18Светящиеся текстуры‑двойникиQ6Плавные повороты на старых клиентахQ10Точные вложенные масштабы и зеркалаQ14Освещение больших моделейQ15Края атласаQ12Сиденья в масштабе

Один движок моделей

Всё, что CraftEngine рисует сущностями — мебель, хитбоксы, коллайдеры, сиденья, снаряды, блоки с анимацией — переходит под наш модуль моделей, с тем же или лучшим качеством. Проект архитектуры готов (L0_DESIGN.md).

L3Единый поиск .bbmodelL0b–gМебель, блоки, сиденья как моделиL8Единые настройки отсеченияF19Твёрдые тела

Возможностиидёт сейчас

VFX и снаряды, попадания по костям (слабые места боссов), косметика и питомцы, броня и оружие из модели, анимированные предметы в руке, смерть в стиле ragdoll, эмоции игроков.

F1Частицы с опциямиF2Эмиттеры на костяхF3Эффект‑моделиF4Навыки из кадровF5Ориентированные точкиF16Сохранение состоянияC3Предметы из .bbmodelC4Анимация в рукеF27Иконки из моделиF22События и API для плагиновF23Косметика без ModelEngineF25СнарядыF12Попадания по частям телаF9Анимация только части телаF10Покадровая анимация костиF11Механики из ModelEngineM1Глубокая связка MythicMobsC5Анимированная мебельC63D‑броняF24Игроки и эмоцииF26RagdollF17Свет от костейF18Транспорт: роли сиденийF20UI на моделиF21ШлейфыM4Остальные механики ModelEngine

Анимация как данные

Авторинг уровня Bedrock: поведение модели описывается в файле, а не в коде.

F6Molang‑состояниеF7Render controllersF8Логика анимаций как данныеF13Модель на кости другой моделиF14IK по цели прямо в игреF15Общие библиотеки анимацийQ16IK ног по рельефу

Плагин для Blockbenchсерверная часть готова

Цикл «рисунок → сохранение → результат в игре». Серверная сторона уже стоит: локальный API, живое обновление, единый формат файла и отчётов. Остаётся сам плагин.

T9API для плагинаT10Живое обновлениеL2Единый контент‑пакетL4Единая диагностикаC7Инкрементальная сборка пакаT4Автотесты со сравнением кадровT5Замеры на стороне клиентаC11Мобы прямо из настроекL7Единые команды и праваC93D‑превью в браузере предметовC10Порт из upstream

BcHUD — следующий модуль в jar

Наш форк BetterHud вливается в BcSpectra отдельным модулем, как это уже сделано с BetterModel. Интерфейс на экране игрока будет жить в том же плагине, с тем же паком, той же защитой и той же диагностикой — без отдельной связки плагинов. Модули подключаются безопасно: упавший модуль отключается, а движок продолжает работать.

итог

Основа готова.
Работа продолжается.

С середины сентября BetterModel встроен в CraftEngine, пак защищён 17 слоями и стал на 68% легче, написано 78 тысяч новых строк. Из 80 пунктов нового плана закрыто 29, ещё 51 впереди: от плавности и мебели до анимации как данных. Отдельно ждут плагин для Blockbench (серверная часть уже есть) и модуль BcHUD.

08 · словарь

Термины простыми словами

Если встретилось незнакомое слово — оно здесь.

Blockbench
Бесплатная программа, в которой художники рисуют 3D‑модели и анимации для Minecraft. Файл проекта называется .bbmodel.
Окклюзияocclusion
Не рисовать то, что закрыто стеной или другим объектом. Игрок всё равно этого не увидит.
Куллингculling
«Отсечение»: не обрабатывать то, что игрок не видит — за спиной или вне экрана.
LODlevel of detail
Уровень детализации. Чем дальше объект, тем грубее и реже он обновляется: вдали разницы не видно, а нагрузка падает.
Molang
Мини‑язык формул из Minecraft Bedrock. Позволяет описать анимацию правилом: «голова следит за игроком», «хромает, если ранен», вместо готового ролика.
Тик
Один такт игры. Сервер Minecraft обновляет мир 20 раз в секунду, это и есть 20 тиков.
Хитбокс
Невидимая коробка вокруг моба или части модели, по которой считаются попадания.
IKобратная кинематика
Конечность сама «дотягивается» до цели: при сдвиге кисти локоть и плечо подстраиваются сами.
Root motion
Анимация сама двигает моба в мире, например рывок вперёд при ударе.
Вторичная динамика
Хвосты, волосы и плащи, которые колышутся сами по физике, а не по записи.
Эмиттер
Источник, который постоянно выпускает частицы — дым, искры — из кости модели.
Render controllers
Правила показа: какую часть модели и какую текстуру показать в какой момент.
Ragdoll
«Тряпичная» физика смерти: тело падает и обвисает по законам физики, а не по заранее записанной анимации.
Z‑fighting
Мерцание, когда две поверхности лежат в одной плоскости и игра не знает, какая из них сверху. Диагностика находит такое до игроков.
Атлас
Одна большая картинка, в которую склеены много маленьких текстур.
Контрольная суммаCRC
Число, по которому проверяют, что файл не повреждён. В защищённом паке он намеренно испорчен, а клиент Minecraft его не проверяет.
Zopfli
Очень сильный алгоритм сжатия: работает дольше обычного, зато файл получается меньше.
Оверлей
Часть пака, которая применяется только на определённых версиях клиента.
ViaVersion
Плагин, который позволяет игрокам разных версий Minecraft заходить на один сервер.
MythicMobs · ModelEngine
Популярные плагины для мобов с навыками и для моделей. Конфиги этих плагинов работают и в BcSpectra.
CraftEngine · BetterModel · BetterHud
Открытые проекты, на основе которых построен наш движок: предметы и блоки, 3D‑модели и интерфейс на экране.
API
«Розетка» для других программ: через неё плагин Blockbench общается с сервером.
jar
Один файл плагина Minecraft. Наш движок — это один такой файл.
Кость
Подвижная часть модели: рука, нога, голова, хвост. Анимация двигает кости, а не всю модель целиком.
Ключевой кадр
Момент анимации, где задано положение или действие. Всё, что между ключевыми кадрами, движок рассчитывает плавно сам.
Микшер анимаций
Смешивает несколько анимаций сразу: например, бег и взмах рукой. Аддитивный слой — анимация, добавленная поверх другой.
Паритет
Полное совпадение с эталоном. Паритет с Blockbench значит, что в игре модель выглядит и движется так же, как в программе.
Коллайдер
Невидимая твёрдая форма, об которую упираются игроки и мобы.
VFX
Визуальные спецэффекты: частицы, вспышки, дым.
Пак, ресурспак
Архив с моделями, текстурами и звуками. Клиент скачивает его при входе, чтобы видеть кастомные предметы и мобов.
HUD · BcHUD
Интерфейс на экране игрока: полоски, подсказки, панели. BcHUD — наш форк BetterHud, который будет делать это внутри движка.
Хэш
Набор символов, вычисленный из содержимого. Его используют как имя файла: по нему не понять, что внутри.
Дедупликация
Если несколько файлов одинаковые, остаётся один, а остальные ссылаются на него. Размер пака падает.
Токен
Одноразовый «пропуск» для скачивания пака. Повторно им воспользоваться нельзя.
Сетевой пакет
Порция данных, которую сервер отправляет игроку. «Вся поза одним пакетом» значит: одно сообщение вместо десятков.
Дамп
Полная выгрузка состояния для проверки. «Дамп костей» — список положений всех костей так, как их получает игрок.
Pillow · ffmpeg · ImageMagick
Популярные программы для открытия картинок и видео. Если они не читают файл, взломщику приходится писать свой инструмент.
Git
Система, где хранится вся история изменений кода. Цифры про строки и коммиты на этой странице взяты из неё.
Upstream
Оригинальный проект, от которого сделан форк.
GPLv3
Открытая лицензия: код можно менять и использовать, если свои изменения тоже оставлять открытыми.
Leaf
Серверное ядро Minecraft, на котором работает сервер.