📊 Статистика: 40 коммитов, 12 557 добавлений и 4 488 удалений.
С конца февраля в HollowEngine я внёс довольно много существенных изменений во многих направлениях. В первую очередь это существенная переработка блоков кода и того, как они выполняются.
Раньше была лишь возможность целиком запустить файл командой и тогда он начинал отслеживать свои триггеры. Также внутри одного файла все переменные были общими, например, если Вы поставите триггер "При сообщении игрока в чат", то скрипт будет срабатывать каждый раз вне зависимости от игрока или текста и перезаписывать старые переменные, даже если прошлый скрипт ещё не завершился.
Теперь система работает иначе.
⚙️ Каждый файл может быть активен или не активен, это влияет на то, будут ли в нём срабатывать триггеры.
Каждый триггер теперь запускает новую ветку (последовательность блоков кода) и эта ветка напрямую связана с вызвавшим триггер.
Например:
⁃ в случае события чата - это игрок
⁃ в случае запуска игры - это сервер
При необходимости можно настроить, что делать если у вызвавшего триггер ещё не завершилась прошлая ветка:
⁃ отменить старую и начать новую ветку
⁃ отменить новую и продолжить старую ветку
⁃ добавить новую ветку **в очередь**, сразу после старой
Передавать данные между ветками теперь можно только через глобальные переменные или переменные сущностей.
Локальные переменные хранят данные только в рамках текущей ветки.
🧩 Появилась система output'ов.
Если раньше данные можно было только передать в блок, то теперь можно и наоборот - записать данные из блока в переменные.
Например, при выводе в чат можно сразу записать:
⁃ сущность игрока
⁃ его сообщение
⁃ имя
Это позволяет писать свои собственные фильтры и механики, а не только делать набор стандартных фраз, как в Legacy.
В целом, это все глобальные изменения в рамках блоков кода, остальное уже менее значимо:
• Все имена блоков кода вынесены в файлы перевода - теперь они на 700+ строк
• Реализован поиск блоков на их панели
• Улучшено отображение блоков в свёрнутом виде
• Доработана обработка ошибок - при удалении блоков или повреждении их структуры в одном из обновлений поломается лишь один блок, а не весь файл
🛠 Новые инструменты
Я немного поработал над динамическим добавлением предметов.
Без перезапуска игры и сервера, прямо в мире одной командой можно обновить префабы связанные с предметами и они сразу появляются в игре!
Но пока что эта система сильно упрощена в сравнении с тем, какой она должна быть:
• нет динамического удаления таких предметов из всех инвентарей
• нет нормальной синхронизации с клиентом
• нет динамического добавления моделей без полной перезагрузки ресурсов
• нет возможности добавить явный функционал вроде Меча/Кирки
Короче говоря, это пока что минимальный Proof-Of-Concept, что пропатчить регистраторы и динамически добавлять новые предметы, блоки и сущности - возможно.
🧠 В процессе доработки системы блоков кода появилась новая система пространств корутин и переменных, которые можно привязывать к сущностям и серверу.
Сейчас она используется только для блоков кода, но с её помощью куда проще будет реализовать всякий скриптинг, а также различные квестовые и обучающие системы, поскольку там есть всё, чтобы сохранять контекст корутин или данные сущностей.
🧱 После этого была обновлена следующая крупная задача - система компонентов и префабов.
В редакторе префабов модель теперь отображается только если есть соответствующий компонент, без стандартной заглушки.
Сохранение компонентов стало централизованным:
сущности и компоненты теперь могут универсально сохраняться в
• NBT - для сохранения в сущности
• YML - для сохранения префабов
• JSON - для метаданных в редакторе префабов
Также появилась возможность скрывать компоненты из редактора, чтобы Вам не показывался мой мусор, на который вам смотреть нельзя 🙂