История изменений
Заметки о выпусках расширений и плагинов BTC Studio.
Каждая запись указывает расширение, его версию, дату выпуска и перечень изменений. Записи добавляются сюда по мере выхода новых версий.
2026-08-12
OmniGUI Extension v0.12
- Расширенные меню.
extendToPlayerInventoryуopen_guiпревращает 36 собственных ячеек игрока в четыре дополнительные строки меню — холст в 10 строк. Проекция существует только на клиенте: реальный инвентарь никогда не записывается и восстанавливается при закрытии меню. - Корневой макет, идентификатор которого оканчивается на
_extended, включает эту проекцию сам по себе, так что общий каркас может нести обычный и расширенный вариант, не заставляя каждое меню повторять флаг. DynamicMarkersпревращает повторяющиеся маркеры содержимого в индексированные (QUEST_SLOT#0,QUEST_SLOT#1, …) до разбора макета, чтобы расширения перестали держать каждое свою копию этой логики.- Повторение ячеек ограничено и протоколируется: позиции за пределами сетки отбрасываются и записываются в журнал вместе с идентификатором макета и отвергнутыми координатами. Редактор предупреждает, когда
count/gap/repeatYзаданы безdirection, и выдаёт ошибку на неизвестноеdirection. - Задокументировано:
gap— это шаг (1 = вплотную), аrepeatYповторяет по оси, перпендикулярнойdirection. - Исправлено наследование
mainLayoutId: пустое значение у потомка перебивало унаследованное, поэтому страница, наследующая весь свой каркас, разрешала несуществующий макет и отображалась пустой — без единой кнопки, способной принять щелчок. - У перекрытия ячеек теперь один владелец: когда две ячейки претендуют на одну клетку, побеждает та, что несёт поведение, — и при отрисовке, и при щелчке, а коллизия записывается в журнал один раз.
- Проверка при запуске сообщает только о том, что действительно не работает. Проверки, указывавшие на отсутствие необязательных вещей, удалены —
frame.view.unresolved,slot.outOfFrame,layout.unreferenced, — потому что в архитектуре на шаблонах они описывают замысел, а не дефект. Осталось то, что называет несработавшее записанное намерение: view, ссылающийся на отсутствующий макет, ячейка, выходящая за пределы инвентаря, две однородные ячейки, столкнувшиеся в одном макете.
Shop Extension v1.4
- Режим вкладки.
baseMenuIdделает магазин вкладкой общего меню: его пул макетов и его views сливаются под каркасом, вместе сviews,defaultViewIdи прямоугольником содержимого (contentX,contentY,contentColumns,contentRows). Оставленное пустым, поле сохраняет прежнее поведение — магазин открывается ровно как раньше. - Поддержка расширенного каркаса: магазин, открытый внутри расширенного каркаса, получает холст в 10 строк.
- Добавлены
defaultNameFormatиdefaultLoreFormat. Товар без собственного имени или описания наследует формат магазина; товар со своими значениями сохраняет их нетронутыми — формат магазина заполняет пробелы, но никогда не переписывает формулировку автора. - Оба принимают одни и те же токены:
{item},{buy},{sell},{stock},{stock_max},{currency}. Строка описания, запрашивающая недоступную цену, убирается, а не выводится пустой. - Добавлено
ShopTransactionEvent, испускаемое после завершения покупки или продажи. Это шов, к которому подключаются другие расширения — ретранслятор в Discord, журнал аудита, — а Shops о них не знает. Оповещение, никогда не отменяемое. - Добавлено
notificationWebhookId. Shops его не разрешает и не знает, что такое webhook; идентификатор путешествует вместе с событием. Слушатель, упавший с ошибкой, будет отмечен, а транзакция останется в силе — ничто не отменяет оплаченную покупку. - Исправлено: макет, лишённый своих маркеров, выбрасывался из пула, поэтому экран магазина, целиком составленный из маркеров, или ещё пустая вкладка молча исчезали.
QuestCodex Extension v2.9
- Повышение до расширенного каркаса теперь несёт наследование, а не буквальное сравнение идентификаторов. Каркас, корень которого назван иначе, чем
shell_root, терял расширенное обрамление, и всякий элемент управления, закреплённый в нижней полосе, исчезал при отрисовке — а значит, становился недоступен для щелчка. - Расширение собирается против GUI-движка этой волны релизов, а не против замороженного старого jar. Оно было прибито к версии движка v0.11, поэтому всё добавленное позже оставалось для него невидимым.
Discord Extension v0.9 — ранее Community
- Расширение теперь называется Discord, а не Community. Каталог, пакет и имя расширения следуют за ним. Имена записей не меняются: страницы их сериализуют.
DiscordClientServiceпокидает функцию привязки и получает собственный пакет: синхронизация чата, консоль и отчёты об ошибках используют его все, так что к привязке аккаунтов он никогда не относился.- Вебхуки стали записями.
webhook_definitionобъявляет назначение в Discord один раз и ссылается на него везде. Синхронизация чата, привязка аккаунта и отчёты об ошибках несли каждый свою копию URL, имени и аватара — смена канала означала правку каждого манифеста, и ничто не гарантировало, что они указывают в одно место. WebhookService— синглтон, который может внедрить любое расширение. Раньше HTTP-клиент собирался вручную в инициализаторе и передавался каждой службе, поэтому снаружи доставить сообщение было нечем.- Отчёты об ошибках лишились второго выключателя: пустое назначение и есть выключенное состояние.
- Миграция. Страницы, написанные до этой версии, преобразуются при первом запуске: одна запись
webhook_definitionна каждое различное назначение — одинаково настроенные манифесты делят одну — и манифесты перенаправляются на неё. Каждая переписанная страница предварительно сохраняется вbackup/community-webhook-v1/. Преобразование опирается на форму, а не на номер версии: повторный запуск ничего не меняет. Отключённый манифест сохраняет свой URL на отключённом назначении, а не теряет его. - Уведомления магазина.
shop_notification_manifestописывает, как выглядит транзакция магазина, дойдя до Discord. Назначение из этой записи намеренно исключено — оно принадлежит магазину. Одно оформление служит всем магазинам, и каждый публикует в свой канал. Требует расширение Shops, но не зависит от него.
Puzzle Extension v0.1 — первый релиз
- Девять типов головоломок, каждая — цель Typewriter со своей аудиторией, своим прогрессом и своими триггерами: толкание блоков, подношение на пьедестале, последовательности на память, порядок рычагов, повторение узора, поворот рамок, кодовые замки, лазерные сетки и совместные нажимные плиты.
- Всё, что рисует головоломка, клиентское: блоки, призрачные предпросмотры, подсветка и лазерные лучи отправляются тому игроку, который её решает. Двое могут работать на одной установке, не видя прогресса друг друга, а мир никогда не изменяется.
- Общий жизненный цикл:
timeLimit,maxAttempts,cooldownOnFail,resetOnWrong,lifespan, подсказки и триггерыonStart/onComplete/onFail/onTimeout/onLifespanExpire. isSharedпереводит головоломку из индивидуального прогресса в одну установку, которую вся группа продвигает сообща.puzzle_chainвыстраивает несколько головоломок по порядку и срабатывает, когда решена вся цепочка;resetOnFailрешает, отбрасывает ли ошибка игрока к началу.puzzle_artifactсохраняет состояние головоломок: перезапуск посреди попытки больше не стирает прогресс.puzzle_solved_factиpuzzle_active_factоткрывают прогресс остальному вашему контенту;puzzle_menuперечисляет головоломки и их состояние в чате.- Совместимо с Folia: каждое чтение и запись в мир выполняются в регионе, которому принадлежит головоломка.
Corpse Extension v0.1 — первый релиз
-
Трупы отрисовываются отдельно для каждого зрителя, как собственные entity-дисплеи движка, поэтому их видят все, кто рядом; анимация модели и таблички с именами работают на бэкендах BetterModel, BTC Mob NPC и MythicMobs NPC.
-
Работает на Folia: всё планирование идёт через Folia-совместимый планировщик, а выпадение предметов, сферы опыта и частицы выполняются в регионе, которому принадлежит труп.
-
Инвентарь, который хранит труп, переживает перезапуск, падение сервера или релоад. Трупы сохраняются в MySQL, когда она доступна, иначе в папке плагина, и восстанавливаются при запуске.
-
onlyOwnerCanLootдействительно соблюдается, а сбор лута привязан к id сущности самого трупа, а не к любому правому клику в радиусе четырёх блоков. -
Определение трупа выбирается при каждой смерти по миру и приоритету, а его время жизни вычисляется ровно один раз, для этого трупа.
-
События
on_corpse_spawn,on_corpse_lootиon_corpse_expireпроходят через конвейер триггеров движка и публикуют владельца, лут и позицию трупа как контекст. -
displayName,showDisplayName,dropOnInteract,renderArmor,playDeathAnimationиdeathAnimationNameучитываются полностью, а большинство настроек — динамические значения, так что ими можно управлять через плейсхолдеры и факты. -
Светящийся контур, отрисовываемый на клиенте, с настраиваемым цветом, и звуки трупа, отправляемые каждому игроку поблизости, а не на весь мир.
-
Факты
has_corpseиcorpse_count, аудиторияcorpse_owner_audience,corpse_waypointс расстоянием и направлением до собственного трупа,corpse_recovery_objective, а такжеcorpse_admin_commandс подкомандамиlistиclear. -
Окно защиты лута, по истечении которого труп открывается всем.
-
Меню добычи — это меню GUI Extension, а не голый инвентарь с собственным слушателем щелчков: оно наследует маршрутизацию щелчков, историю меню и проекцию расширенного инвентаря движка. Поэтому GUI Extension становится обязательным.
Custom Biome Extension v0.5
- Пользовательские биомы существуют сразу. Определение регистрируется в живом реестре сразу при сохранении, а не только после перезапуска сервера. Сгенерированный датапак становится слоем хранения, а не единственным путём.
- Исправлено: сервер игнорировал сгенерированный датапак, потому что его pack format был жёстко задан старым значением, а сам он записывался в папку, которую сервер никогда не читает.
- Исправлено:
baseBiomeне действовал ни на что, кроме plains. Теперь биомы строятся на основе базового биома, который держит сервер, и кодируются его собственным кодеком, поэтому спавны мобов, фичи и карверы наследуются, а не теряются. - Исправлено: смена биома пробивала дыры в мире. Обновление отправляло пакеты выгрузки чанка, за которыми сервер никогда не присылал повторную отправку. Теперь клиенты получают обновление биома, построенное по реальным данным чанка.
- Исправлено:
leave_biome_eventникогда не срабатывал. Слушатели входа и выхода перезаписывали состояние друг друга, поэтому результат зависел от порядка регистрации. - Исправлено: покраска записывала каждый блок колонны вместо одного на ячейку 4x4x4, и делала это из вызывающего потока. Теперь записи планируются в регионе, которому принадлежит каждый чанк.
- Биом, который сервер отказался бы сериализовать, теперь отклоняется при регистрации с указанием проблемного значения. Раньше он принимался, а затем ломал каждый вход в игру.
- Наложения биома для отдельного игрока (
player_biome_overlay_action): показать одному игроку другой биом, не трогая мир и не затрагивая остальных. - Покраска региона (
paint_biome_region_action) со снимками иrestore_biome_action, чтобы вернуть регион в прежнее состояние. biome_transition_cinematic: менять биом, который видит игрок, по ходу кат-сцены.custom_biome_preset: делить цвета и визуальные атрибуты между биомами с переопределением для каждого определения.explore_biome_objectiveиbiome_discovery_fact: задания, которые выполняются посещением биомов.- Каждая читающая запись получила опцию
source, выбирающую между тем, что показывают игроку, и тем, что содержит мир. - Удалены
/tw biome setcolor, создававший одноразовые биомы, которые никогда не сохранялись, и режим фактаHASH, значение которого не было стабильным между перезапусками. - Jar расширения уменьшился с 2,6 МБ до 230 КБ: он больше не включает библиотеки, которые сервер уже предоставляет.
Enchantment Creator Extension v0.8
levelModeу механики сравниваетrunOnLevelкак точный уровень, как минимум (AT_LEAST) или как максимум (AT_MOST). Раньше было доступно только точное совпадение.eventPhaseвыполняет действия механики внутри текущего события Bukkit, поэтому отмена события или изменение урона действительно срабатывают. Для отложенных взаимодействий Typewriter ставьте false.clientSideEffectsтеперь учитывает клиента и получил действиеclient_particle_effect: кастомный артефакт BTC использует рендерер на PacketEvents, когда тот доступен, а публичный артефакт для Paper — резервный путь через Bukkit, адресованный конкретному игроку.- Ключи реестра теперь строятся на основе
id. Прежнийnameсохраняется как устаревший алиас при загрузке существующих страниц и предметов, так что ничего переделывать не нужно. - Публичный артефакт намеренно не зависит ни от BTC-CORE, ни от BTC Velocity: он работает на Paper 1.21.x с Java 21 и собирается на JDK 25 в байт-код Java 21.
Numerical Storage Extension v0.9
transactionModeв конфигурации транзакции:INTERNALсохраняет путь через PlaceholderAPI и консольные команды,VAULTработает напрямую через Vault Economy API и игнорируетamountPlaceholderи поля команд.addCommandиremoveCommandбыли описаны наоборот.addCommandзавершает внесение в хранилище и проверяется до сохраняемого изменения;removeCommandзавершает снятие.- Сохранение теперь асинхронное, с блокировками изменений на каждый артефакт и коротким кэшем, так что два одновременных пополнения больше не мешают друг другу.
- Файлы хранилища переходят на JSON-схему версии 2 и технический путь артефакта. Старый файл на
основе смыслового
artifactIdсохраняется вbackups/numericalstorage/и мигрируется при первом обращении — перед обновлением сделайте резервную копию каталогаassets/Typewriter. artifactId— это генерируемый технический идентификатор: оставьте поле пустым, Typewriter заполнит его сам.- Плейсхолдеры принимают явный аргумент определения (
%typewriter_ns_balance_bank%), что снимает прежнюю неоднозначность разбиения по подчёркиваниям, когда идентификатор определения сам их содержит. - Опциональные ключи с учётом профиля, когда установлена интеграция Profiles.
2026-08-07
QuestCodex Extension v2.8
- Настоящие достижения Minecraft. Новая запись
advancement_definitionсоздаёт подлинные достижения в наборе данных, которым управляет само расширение: они появляются в ванильном окне достижений со своей вкладкой, деревом, рамками и всплывающими уведомлениями. Полеparentссылается на другое определение, поэтому дерево рисуется в узловом редакторе. grant_advancementвыдаёт достижение или отбирает его и проходит по цепочке родителей, чтобы дочернее достижение никогда не оказалось получено при неполученном родителе.autoGrantвыдаёт достижение на первом тике игрока. Для корневого достижения именно это даёт его вкладке существование до того, как что-либо получено.- Исправлен порядок заданий: вложенное задание берёт порядок из своей подкатегории, задания без явного порядка больше не сливаются друг с другом, а добавление задания больше не стирает уже заданный порядок.
- Маркеры заданий разбиты на страницы, режим сортировки индивидуален для каждого игрока, а множественное отслеживание переживает переподключение в выбранном порядке.
OmniGUI Extension v0.11
- Подсказки предметов и переключатель
hideVanillaItemStatsв записи конфигурации интерфейса. - Постраничная раскладка может содержать индикатор страницы через новую роль
INDICATOR. - Меню проверяются при запуске сервера: слот за границами, отсутствующий шаблон или неизвестный тип кнопки называются в консоли ещё до того, как игрок откроет меню.
<shift:N>работает без CraftEngine, благодаря встроенному шрифту Magic Digit.countиrepeatYописаны как счётчики повторения слотов, а не как размер стопки.
Shop Extension v1.3
- Магазин больше не может увести баланс игрока ниже нуля. Это допускали три независимых пути.
- Нечитаемый баланс больше не принимается за ноль, а форматированные суммы вроде
12.5kразбираются корректно.
2026-08-03
QuestCodex Extension v2.7
- Добавлены режимы отображения путевых точек:
WORLD_DIRECTIONALпроецирует маркеры на сферу вокруг глаз игрока по действительному направлению на цель,TARGET_ANCHOREDразмещает их на самой цели, аADAPTIVEплавно переключается между ними.HUD_LOCKEDостаётся режимом по умолчанию, поэтому существующие страницы не меняются. - Добавлены постоянный видимый размер и угловое разнесение, чтобы несколько маркеров оставались читаемыми, когда их цели находятся на одной линии взгляда.
- Добавлен вывод нескольких целей в одной записи путевой точки, с новыми вариантами выбора
отслеживаемых задач
ALLиONE_PER_QUESTи ограничениемmaxTargets. - Исправлено игнорирование множественного отслеживания путевыми точками: задачи вторичных отслеживаемых квестов никогда не разрешались, поэтому маркер создавал только основной квест.
- Добавлен
quest_codex_locator_bar, который выводит те же разрешённые цели как точки ванильной панели локатора в Minecraft 1.21.6+, не создавая ни одной сущности.
2026-08-02
QuestCodex Extension v2.6
- Добавлено устойчивое восстановление прерванных диалогов и кат-сцен Typewriter, включая последний кадр кат-сцены. Восстановление теперь сохраняет снятый снимок состояния, когда Typewriter отправляет события завершения после отключения игрока.
- Добавлено устойчивое отслеживание нескольких квестов: меню отслеживаемых квестов, отдельные плейсхолдеры и публичный пример путевой точки с двумя квестами.
- Добавлены клиентские путевые точки только из текста: настраиваемый текст значка, центрированные блочные дисплеи, центрированное вращение маяка, выравнивание цели по уровню, плавная интерполяция, размещение вблизи цели и настраиваемый горизонтальный конус видимости.
- Удалены прежние слои путевых точек (item display и направляющая стрелка) до их первого публичного развёртывания.
OmniGUI Extension v0.10
- Добавлены движки компоновки Flex и Composite для адаптивного размещения слотов и составных слоёв меню.
- Добавлены переиспользуемые адресуемые представления с наследуемыми пулами компоновки, представлениями по умолчанию, «хлебными крошками», тегами представлений и необязательной интеграцией с историей.
- Добавлены миграция схемы с учётом представлений и интеграция с QuestCodex, а также метаданные публикации в Maven.
- Исправлено переключение представлений: меню перестраиваются без мигания закрытия и повторного открытия, а закрытие инвентаря стало безопасным для Folia.
Shop Extension v1.2
- Публичное расширение Shop пересобрано и проверено с OmniGUI v0.10.
- Сохранены существующие динамические макеты магазина, история навигации, обработка заполнителей, правила запаса и лимитов, а также пользовательские обработчики кнопок магазина.
- Миграция с Shop Extension v1.1 не требуется.
MythicMobsNPC Extension v0.4.6
- Исправлено игнорирование изменения масштаба у моделей без единой анимации — так же, как в расширении BetterModel.
- Ванильные варианты мобов (кошка, лиса, волк, житель и подобные) теперь один раз сообщаются в консоль вместо молчаливого игнорирования: они принадлежат конфигурации MythicMobs, которая владеет личностью моба и перезаписывала бы их при каждом возрождении.
- Исправлено, что одна сбойная запись данных отменяла все остальные записи того же пакета, из-за чего NPC мог остаться вообще без настроенных данных.
- Эффект свечения и снаряжение теперь применяются к модели, а не только к мобу. Тело моба скрыто за моделью, поэтому применение только к мобу ничего не показывало.
- Снаряжение теперь сообщает в консоль, когда у модели нет кости-держателя предмета, вместо молчаливого бездействия.
- Огонь подтверждается каждую секунду, чтобы не гаснуть сам по себе, и сообщает, когда BetterModel скрывает тело, на котором рисуется пламя.
- Исправлено дёрганье таблички с именем, когда NPC идёт или следует по дорожной сети: текстовый дисплей теперь интерполирует между обновлениями вместо телепортации рывками.
BetterModel Extension v1.3
- Исправлено игнорирование масштаба модели у моделей без единой анимации. BetterModel пересчитывает трансформацию модели только пока идёт анимация, поэтому изменение масштаба во время выполнения никогда не доходило до статичной модели. Теперь расширение принудительно вызывает пересчёт само.
- То же исправление относится к смещению модели, которое шло по тому же пути кода.
- Записи данных сущности теперь действительно доходят до модели вместо того, чтобы отбрасываться. Поддерживаются: эффект свечения, цвет эффекта зелья (выводится как окраска предмета), яркость, ограничение билборда, длительность интерполяции, перенос, трёхмерный масштаб, размер коробки, снаряжение и огонь.
- Добавлен
bettermodel_bone_appearance— вариант настроек свечения, окраски, мерцания и яркости для отдельной кости, с той же системой критериев, что иbettermodel_bone_visibility. - Снаряжение сопоставляется с костями предметов руки и головы в BetterModel. Слоты брони один раз сообщаются в консоль вместо молчаливого игнорирования, поскольку торс и ноги модели несут её собственную геометрию.
- Неравномерный трёхмерный масштаб теперь выдаёт предупреждение вместо молчаливого использования одной оси: BetterModel поддерживает только равномерный масштаб.
- Любая запись данных, не имеющая смысла для трёхмерной модели (позы, варианты мобов, состояние размножения…), теперь один раз сообщается в консоль вместо молчаливого отбрасывания.
- Свечение, окраска, яркость, билборд, перенос и снаряжение переживают перезагрузку набора ресурсов или возрождение и больше не сбрасываются к исходному виду модели.
- Снаряжение сообщает в консоль, когда у модели нет кости с тегом
ri,liилиph, вместо молчаливого бездействия — это обычная причина, по которой предмет не появляется. - Огонь теперь рисуется на сущности взаимодействия NPC, а не на костях модели: клиент масштабирует пламя по ограничивающей коробке сущности, а у display-сущности её нет, поэтому пламя выводилось нулевого размера.
Nexo Extension v1.0
- Добавлены факты для проверки того, что игрок держит, несёт в инвентаре, на что смотрит и на чём стоит.
- Добавлены переменные, дающие идентификатор и свойства выбранного предмета, блока и мебели.
- Добавлены действия выдачи и удаления предмета, оба по идентификатору предмета Nexo.
- Добавлены события подбора, выбрасывания и использования предмета.
- Добавлены события взаимодействия и урона для пользовательских блоков и мебели, а также событие добычи.
- События теперь передают свои данные (идентификатор блока, позицию, предмет в руке) дальше по цепочке, так что диалог или действие могут использовать их напрямую.
CraftEngine Extension v1.0
- Задачи квестов работают. Их можно привязать к квесту, они сохраняют прогресс и могут запускать последовательность при завершении.
- Добавлены факты для перезарядок, для удерживаемых и переносимых предметов, а также для блока или мебели, на которые смотрит игрок.
- Добавлены переменные, дающие идентификаторы, свойства предметов и список загруженного контента.
- Добавлены действия выдачи и удаления предмета, оба по идентификатору предмета CraftEngine.
- Добавлены события подбора, выбрасывания и использования предмета.
- Добавлены события попытки установки и удара по мебели.
- События теперь передают свои данные дальше по цепочке.
ItemsAdder Extension v1.0
- События блоков и мебели теперь читают ItemsAdder напрямую, а не выводятся из ванильных событий. Это делает их надёжными и убирает короткую задержку, из-за которой срабатывание могло теряться или повторяться.
- Добавлены факты для удерживаемых и переносимых предметов, оставшихся использований, пользовательской прочности, видимости HUD и роста посевов.
- Добавлены переменные, дающие идентификаторы, свойства предметов и шрифтовые изображения.
- Добавлены действия выдачи и удаления предмета, оба по идентификатору предмета ItemsAdder.
- Добавлены события подбора, выбрасывания и использования предмета.
- Добавлены события взаимодействия, событие перед установкой мебели и событие смерти пользовательской сущности.
- События теперь передают свои данные дальше по цепочке.
- Исправлены задачи квестов — так же, как в расширении Nexo.
2026-07-26
QuestCodex Extension v2.5
- Добавлено устойчивое отслеживание нескольких квестов через запись
quest_codex_tracking_artifact. - Добавлены режим меню категорий
@trackedи динамические маркерыTRACKED_QUEST_SLOT. - Добавлены
/tw codex trackedи внутренняя команда GUIcodex:tracked. - Добавлены плейсхолдеры PlaceholderAPI для количества отслеживаемых квестов, лимита, основного квеста, индексированных отслеживаемых квестов, статусов, задач и приоритетов.
- Задокументирована структура публичного набора страниц: основной манифест, статический артефакт отслеживания, определения квестов и настройки GUI.
OmniGUI Extension v0.9
- Добавлена автоматическая миграция схемы публичных страниц для встроенного хранения и прежних полей постраничной навигации.
- Задокументирована компактная схема
storagePool/storageIdиnavigationButtons, применяемая для уменьшения зависаний публикации в редакторе Typewriter. - Уточнён рекомендуемый приём меню по ссылке для больших меню QuestCodex.