📓 Еженедельный девлог №4 | Интеграция ECS с блоками кода и начало скриптинга
📊 Статистика: ~10 коммитов, ~3000 строчек кода
На этой неделе я по большей части доводил до ума систему сборки HollowEngine Loom и к сожалению пришёл к выводу, что идея оказалась провальная из-за сложности изменениями generic-функций и классов в JVM. В подробности вдаваться не буду, всё равно кроме 1.5 калеки тут никто этого не поймёт 🥲 Но суть в том, что я откатился обратно до Stonecutter.
Так что теперь я вернулся к прошлым задачам.
🎡 Компоненты и блоки кода
📜 Скрипты
Пока я вижу, что дизайн и удобство использования нуждаются в доработке, так что приоритет пока меняю на них. В связи с этим на следующей неделе будет дополнительно 3 поста на эту тему с демонстрациями и небольшой документацией. Пока что полноценную документацию вводить в игру не буду, поскольку на это нужно больше времени, но, пожалуй, хватит и простых
📊 Статистика: ~10 коммитов, ~3000 строчек кода
На этой неделе я по большей части доводил до ума систему сборки HollowEngine Loom и к сожалению пришёл к выводу, что идея оказалась провальная из-за сложности изменениями generic-функций и классов в JVM. В подробности вдаваться не буду, всё равно кроме 1.5 калеки тут никто этого не поймёт 🥲 Но суть в том, что я откатился обратно до Stonecutter.
Так что теперь я вернулся к прошлым задачам.
🎡 Компоненты и блоки кода
Я добавил новые блоки для добавления, удаления, получения и проверки компонентов для сущностей. Это значит, что теперь внутри блоков кода на сущности можно вешать или убирать компоненты с некоторой логикой, например:
- Следовать за другой сущностью или смотреть на неё
- Патрулировать некоторые точки
- Добавлять разную логику взаимодействия или атаки
Пока самого функционала ещё нет, но для начала я хочу довести до ума текущие системы, а не вводить новые.
📜 Скрипты
Я начал постепенно реализовывать функционал связанный с скриптингом и пока-что это `.reload.kts` скрипты. Это самый базовый вид скрипта, который будет использоваться во многих системах и возможностях. Как следует из названия он будет автоматически запускаться при перезагрузке серверных ресурсов при запуске сервера или команде `/reload`. На текущий момент он уже позволяет добавлять / удалять рецепты для верстака и печек, но в будущем тут будет и логика связанная с обработкой событий, создание собственных компонентов, пользовательские системы и другая логика.
Пока я вижу, что дизайн и удобство использования нуждаются в доработке, так что приоритет пока меняю на них. В связи с этим на следующей неделе будет дополнительно 3 поста на эту тему с демонстрациями и небольшой документацией. Пока что полноценную документацию вводить в игру не буду, поскольку на это нужно больше времени, но, пожалуй, хватит и простых
.md файлов на GitHub 🫠Вот пока что пара скриншотов с тестовой версии. Блоки для компонентов генерируются автоматически, так что пока что выглядит так себе, тут нужно будет ещё полировать генератор 🙃
P.S. новый логотип откладывается на некоторый срок, когда появится время и возможности
🐳2👀2🔥1
На этой неделе я закрыл очень объёмную и болезненную задачу - полностью вынес и изолировал HollowEngine со всеми его зависимостями в отдельный ClassLoader. А это целых 56 миксинов и ещё около 10 ASM-трансформеров в Kool
Основная причина - совместимость с другими модами. Движок использует несколько десятков различных библиотек, причём сложность в том, что если 2 мода используют одинаковые библиотеки разных версий, то Forge крашнется даже без каких либо логов. Из-за этого мод долгое время был не совместим с популярным модом Kotlin For Forge и для его работы нужно было ставить специальный патчер, который к тому же запускался не на всех JVM. Теперь же такой проблемы чисто технически не будет, поскольку ни Forge, ни другие моды просто не смогут найти классы движка
Ну и у такого подхода есть свои плюсы и минусы, если коротко:
- Нет и не может быть конфликтов библиотек.
- Хорошая основа для обновления движка без перезапуска игры (что важно мне для разработки). То есть в будущем мне не придётся перезапускать игру при добавлении нового интерфейса / фичи.
- Возможность запускать мод из одного jar на любом загрузчике, и Forge, и Fabric в одном jar. (Пока не доступно, но теперь это вполне возможно без ущерба производительности и размеру файла)
- Нет возможности создать внешние патчи или миксины, чтобы изменить код движка.
- Сложно писать аддоны, пока не появится официальная их поддержка, поскольку обычный мод просто не увидит классы движка.
- Больше мороки с передачей данных между игрой и движком. Нужно создавать мосты для передачи данных между ClassLoader'ами
В общем, задачка не из лёгких, и сложностей она явно добавит, но думаю ради дальней совместимости и надёжности шаг необходимый, тем более для поддержки нескольких версий и модлоадеров
На текущий момент я проверял, мод запускается на Fabric и Forge, но безусловно, среди тех изменённых 8к строчек кода могли появиться новые баги
Ну а пока, я готовлю ещё одну мощную систему, которая вероятно выйдет на следующей неделе
А вместе с ней будет и выпуск мода на CurseForge
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5 4🐳2
This media is not supported in the widget
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🌚2🗿2
Получается ещё один небольшой юбилей ✨
Для тех кто не знает, я 5 месяцев назад на скорую руку сделал аддон для FTB Quests добавляющий всякие мелочи, с тех пор в нём появилось ещё несколько фич:
В общем, шутка, которая зашла слишком далеко💻
Для тех кто не знает, я 5 месяцев назад на скорую руку сделал аддон для FTB Quests добавляющий всякие мелочи, с тех пор в нём появилось ещё несколько фич:
🏎 Поддержка анимированных картинок APNG со стримингом. (т.е. это своего рода декодер в реальном времени, который не загружает всё сразу в память, а обрабатывает 1-2 кадра в реальном времени)✨ Шейдерные фоны для разных вкладок в квестах.🌐 Интеграция с модом EMI. (как JEI, но более гибкий и удобный)💡 Ну и по мелочи, всякие анимации иконок и форм.
В общем, шутка, которая зашла слишком далеко
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Сегодня только пятница, но я думаю изменений уже достаточно для этой недели
А всё потому, что эти изменения продвинули его на две головы выше, чем ранее. По крайней мере в моём представлении о том, как движок должен выглядеть и использоваться.
Начал я с доработки компонентов и сущностей. Если раньше для каждой ванильной сущности создавалась своя ECS-сущность (далее буду называть её объектом, чтобы не путать с ванильными), то сейчас логика немного другая, ECS-сущности это по сути независимые объекты
И эти объекты могут привязываться с помощью специальных "якорей", пока их 2 вида:
EntityAnchor и WorldAnchor, первый привязывает объект к ванильной сущности, а второй к мировым координатам. А для смещения используется компонент Transform. Он меняет объект относительно "якоря", т.е. относительно сущности, либо мира. Это позволяет настраивать перемещение, размеры, повороты. Очевидно, настраивать всё это командами или скриптами/конфигами неудобно, поэтому я добавил в мод такую штуку как - gizmo
Это виджет, который вы могли видеть во многих 3D редакторах, с помощью которого можно менять положение объекта. Думаю с его помощью работать куда удобнее.
Ну и чтобы эти объекты не были просто пустышками, я добавил пока 2 компонента влияющих на визуал, это модели и свет.
Модели пока скорее просто как декорации, без взаимодействий и коллизий, но думаю уже очень удобно, если в условной локации вам нужно добавить листы бумаги, или какие-нибудь настенные часы.
А вот свет это уже задачка в разы сложнее, чем я думал, инстансинг моделей, которым я занимался недавно, на фоне этого теперь кажется мелкой фичей, которая делается за пол часа
Если коротко, в Январе я уже пробовал что-то такое сделать, но там это была прям упрощённая версия. Сейчас уже можно добавлять точечные и направленные источники света с разным цветом и яркостью. Кроме этого, я даже добавил тени от них, хотя пока что они довольно требовательные, один такой источник по сути вынужден 6 раз рендерить мир, чтобы тень исходила в любом направлении в зависимости от положения источника. Так что вполне вероятно в будущем я добавлю "запекание" цвета, чтобы не пересчитывать его каждый кадр, правда тогда он уже будет работать только на блоки и декорации
Пока что освещение поддерживает только кастомный шейдерпак Complementary, поскольку разные шейдерпаки используют разные подходы и я чисто технически не могу сделать универсальную систему. В будущем скорее всего добавлю поддержку и других шейдерпаков, если на то будет спрос
В открытый доступ я это пока выкладывать не буду, но бустерам уже доступна экспериментальная версия. Я думаю сделать ещё упрощённую поддержку этих источников света и теней без активных шейдерпаков в более ванильном стиле, тогда уже возможно выложу в открытый доступ (но с большой вероятностью это уже будет летом, поскольку пока я уже устал от всего этого рендеринга
Небольшая демка
https://www.youtube.com/watch?v=QSXHrsZ15VY
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤3👍2
В этот раз изменения не менее глобальные, но пожалуй начну с самых важных и неприятных новостей.
Теперь насчёт причин, в первую очередь, я устал:
Я долго сидел на Stonecutter (система сборки модов) в надежде, что это упростит мне разработку мультиверсионных модов и планировал после стабильных версий добавить дополнительную ветку для 1.21.1, но в этом и проблема, сам Stonecutter существенно тормозит компиляцию и сборку проектов. У меня есть 4 основных подпроекта для работы движка и для каждого из них ещё подпроекты под версии игры, для которых, в свою очередь ещё и подпроекты Forge/Fabric. Сейчас я вернулся на чистый Architectury и время компиляции уменьшилось с 2-3 минут до 15 секунд, да и сама IDE стала подхватывать контекст проекта куда быстрее и мне не нужно каждые пару часов сбрасывать индексы и ждать, пока IDEA их починит. На первый взгляд было бы разумнее сначала доделать 1.20.1, а потом уже переходить на 1.21.1, чтобы для тех, кто ещё там работает был бы хоть какой-то рабочий билд, но увы, в тех условиях продолжать дальше допиливать движок почти нереально, а тратить потом ещё 1-2 недели на ручной порт я не хочу, так что думаю 1.21.1 сейчас наиболее актуальный вариант, да и в случае чего с неё будет проще портировать мод на 26.2+, если большинство модов начнут переносить туда.
Теперь по поводу блоков кода, пока я хочу перенаправить основные силы на новую систему скриптинга, а после него посмотреть на подход к блокам кода со стороны. Есть у меня мысль, как их совместить и не делать 2 разные системы с разной документацией)
Но есть и довольно много плюсов за эту неделю:
➕ Источники света теперь потребляют на ~20% меньше производительности➕ Я уже целиком перенёс движок на Fabric 1.21.1 (для NeoForge там ещё нужно пара небольших правок, но они будут готовы уже завтра)➕ Скриптинг теперь будет на моём языке Katari, который основан на Kotlite (упрощённый Kotlin). Суть в том, что вместо компиляции теперь используется кастомный сериализуемый интерпретатор с приостанавливаемыми функциями. Это нужно, чтобы сделать более простой и удобный синтаксис, вместо того, чтобы городить стейтмашины, корутины, плагины для компилятора, неудобный DSL и т.п. теперь просто большая часть языка и стандартной библиотеки ограничена, но в замен весь его функционал стал стабильнее, плюс это позволяет мне добавлять новые операторы, которых нет в оригинальном языке. Подробнее можете почитать тут, по сути это мой аналог нарративным языкам, вроде Ink или Yarn Spinner, которые используются во всяких Unity / Godot, но с более гибким функционалом.
Кроме того, новый скриптовой движок весит всего 2МБ, вместо 80МБ в случае оригинального компилятора. Возиться с аддонами тоже теперь нет необходимости.
В общем, очередные глобальные изменения, ради будущего движка. Как считаете, хорошее это решение, или Холлоу опять за старое?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍1👎1😭1
Держу в курсе, я уже завершил порт на 1.21.1, теперь он работает на Fabric и NeoForge ✨
Ну и постепенно наращиваю скриптинг, сейчас уже можно делать простенькие текстовые приключения, вроде того, что в ролике. Если кому-то интересно уже посмотреть на синтаксис или начать себе писать документацию, вот вам файл, если ChatGPT разобрался, значит Вы - тем более сможете💻
Ну и в целом, 500+ строк обрабатывает без проблем и запускает моментально 🙃
Ну и постепенно наращиваю скриптинг, сейчас уже можно делать простенькие текстовые приключения, вроде того, что в ролике. Если кому-то интересно уже посмотреть на синтаксис или начать себе писать документацию, вот вам файл, если ChatGPT разобрался, значит Вы - тем более сможете
Ну и в целом, 500+ строк обрабатывает без проблем и запускает моментально 🙃
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤4🗿1
На этой неделе я уже практически завершил систему скриптинга и нпс, думаю мы уже очень близко к функционалу Legacy, на текущий момент остались некоторые правки в скриптовом движке и всякие функции по работе с нпс.
Ну а тем временем было сделано довольно много:
✔️ Доведён до ума порт на NeoForge, теперь мод там стабильно запускается и весь функционал присутствует (Включая правки в Iris+Sodium)✔️ Внедрён скриптовой движок Katari, о котором я писал ранее и показывал пару небольших примеров.✔️ Добавлена поддержка объёмного тумана и Flare (свечения, если смотреть на источник света)✔️ Удалён Geary ECS, движок теперь работает на своей кастомной системе компонентов. Основная причина - не релевантность в рамках JVM, плюс низкая производительность в рамках игры. Geary предназначен скорее для симуляций десятков тысяч однотипных сущностей, а тут они скорее все разные, да и сам движок игры больше 300 сущностей уже не выдерживает.✔️ Доработана система анимаций - теперь можно создавать несколько управляемых контроллеров с независимыми переходами, запускать и отключать обычные анимации, динамически менять их скорость и даже добавлять небольшие скрипты с процедурными вычислениями.
Ну и вот небольшой пример с анимациями, тут и базовые переходы между ожиданием, ходьбой, бегом, прыжками и приседанием. Также добавление поверх этого дополнительных анимаций, вроде эмоций или жестов. А также процедурные анимации для головы, зрачков, тела и рук в зависимости от поворота головы. Короче говоря так не долго и до Figura функционал расширить
Думаю на днях уже тут и новый билд выпущу, как добавлю под всё это удобные методы для настройки в скрипты и всё перепроверю
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤14🔥3👏3
На этой неделе скриптинг, наконец, вышел в открытый доступ, а также появилась система катсцен, на текущий момент возможностей довольно много:
✔️ Создание, настройка и удаление НИПов.✔️ Анимации нипов по триггеру или постоянные с условиями переходов.✔️ Воспроизведение аудио, запуск катсцен, изменение смещения, поворотов и масштаба для нпс.✔️ Триггеры по времени, взаимодействию, зонам / радиусу, клавишам и кликам.✔️ Получение всяких параметров и атрибутов для сущностей.✔️ Импорты скриптов внутри других скриптов.✔️ Практически полная библиотека Kotlin StdLib в Katari (Collections, Ranges, Random, лямбды и другие удобные модули)✔️ Продвинутый редактор пролётов камеры с возможностью детально настраивать каждый кадр.
Ну и по мелочи, удобные инструменты для добавления новых функций, переменных и классов в скриптовой движок из Kotlin в Katari.
В общем, тут осталось только добавить удобную обработку событий и кастомные гуишки, после чего движок на мой взгляд сможет закрыть 90% потребностей
Система катсцен пока доступна только на моём Boosty, ну а для простых пользователей, шейдерпак с поддержкой кастомных источников света выходит в открытый доступ
Производительность на мой взгляд всё ещё нуждается в доработках, но увы, пока это лучшее чего я смог добиться не ломая совместимость с другими модами, вмешательством в рендеринг чанков и перенос игры на Vulkan
Ну а на этом у меня пока всё, пробуйте новую версию мода, пишите о найденных багах или новых идеях в сообщество, а я пойду доделывать линтер и автодополнение для Katari в встроенной IDE
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥9🐳5🍾4
Продолжаю расширять функционал движка:
✔️ Полностью переделана внутренняя система событий, теперь она практически никак не влияет на производительность в сравнении с прошлой.✔️ В скриптинг добавлены 2 новых оператора: async и race. Первый запускает задачу отдельно от основной ветке, не ожидая, пока выполнятся функции внутри неё (удобно для работы с несколькими нпс или параллельными диалогами и действиями), а второй позволяет определить, какая из нескольких задач выполнилась первой (удобно для таймаутов или сложных условий)✔️ Добавлена базовая поддержка IDE: подсветка синтаксиса и подсказки ко всем доступным функциям и переменным.✔️ Добавлено множество новых функций: привязка предметов к модели, замена скинов игрока и материалов нпс, работа с мирами (время, погода, взаимодействия с блоками), рейкастинг и многое другое✔️ Создана документация для движка
Сейчас работаю над кастомными интерфейсами и обработкой событий. Ну а после этого я пожалуй возьму перерыв на пару недель, а то чёт я смотрю никому оно сейчас и не надо, за последний месяц движок едва ли 10 человек запускали)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4😭2 2😢1
А, упс, а пост рановато вышел)
Ладно, ближе к вечеру документацию покажу 🫠
Ладно, ближе к вечеру документацию покажу 🫠
🔥6❤2👍2
Ну что, как и обещал, новая документация по HollowEngine ⚡️
С сайтом по документации помогали:
Без них я бы тут ещё недельку возился бы с этим React, TypeScript и другими непонятными словами :)
Пока ещё есть над чем работать, но уже лучше, чем копаться в
С сайтом по документации помогали:
@urliveyn - сам сайт, документация;
@axelswamp - макет и дизайн;
@algorithmlx_today - деплой и домен.
Без них я бы тут ещё недельку возился бы с этим React, TypeScript и другими непонятными словами :)
Пока ещё есть над чем работать, но уже лучше, чем копаться в
.md файле на пару тысяч строк)Please open Telegram to view this post
VIEW IN TELEGRAM
1❤🔥9👍7🥰5❤2🐳2🔥1👀1
This media is not supported in your browser
VIEW IN TELEGRAM
У вас тоже такое бывает, сидишь, делаешь систему для диалоговых окон и всяких менюшек, а получается браузер? 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤15😨6🔥3