Phase Of Horizon | HollowEngine
373 subscribers
152 photos
94 videos
12 files
61 links
Engine for development story-based maps & modpacks.

Support the project:
https://boosty.to/hollowhorizon/
Download Telegram
Продолжаю дополнять редактор кода 💫 | День 86

Решил всё же взяться за тот страшный класс на 1700 строк кода, в котором намешано всё: интерфейс редактора кода, обработка вводимого текста, попап с подсказками, подсветка кода и ошибок в нём, все хоткеи, автодополнения скобок и отступов. Короче говоря если и дальше плодить техдолг добавляя туда новые фичи вроде: однострочного ввода, переноса строк, read-only режима, то скоро в этом уже никто не сможет разобраться 💀

Так что в связи с этим готовлю мощную штуку, чтобы в будущем легко было добавлять поддержку новых языков (как минимум в будущем могут понадобиться json, toml, markdown, mcfunction), а также кучу разных параметров, поскольку для того же редактора анимаций прописывать условия для анимаций без скриптинга выйдет слишком неудобно 🥲
Вот пока небольшой обзор того, как оно теперь выглядит, раньше все эти настройки и команды были захардкодены:
🔥2❤1
Что такое Грабля и почему все её боятся? 🔱 | День 87

Сегодня опять обзорный пост, пока я вожусь с рефакторингом)
Поговорить я бы хотел насчёт Gradle, инструмента для компиляции и сборки .jar файлов. Если вы делаете моды или хотя бы смотрели исходники других проектов, то часто могли заметить там файлик вроде build.gradle или build.gradle.kts, это - скрипт сборки, который собирает файлы зависимостей и проекта(ов) в один архив .jar. И по сути это всё, конец, всем спасибо за внимание, пока!
Ну, а если серьёзно, то за простой сборкой проекта кроется ещё тонна разных интересных задач, в рамках создания модов, самое простое, что можно вспомнить - это декомпиляция и деобфускация Minecraft для разработки, а также реобфускация вашего кода после компиляции (чтобы он работал с обфусцированным Minecraft). Также с его помощью, можно обрабатывать файлы в вашем проекте, например, часто в mods.toml, название мода напрямую берётся из конфига, а не прописывается вручную (особенно в мультиплатформенных модах).
В HollowEngine я использую несколько кастомных скриптов для Gradle с достаточно уникальным функционалом, который я пока не видел в других модах, так что хочу поделиться)
- Автоматическая генерация mods.toml / neoforge.mods.toml / fabric.mod.json - Заполнять эти шаблоны под каждую версию и загрузчик было бы довольно неудобно, поэтому я создал скрипт, который автоматически создаёт эти файлы на основе параметров проекта!
- Автоматическая генерация констант для всех ресурсов. Однажды я просто з**бался писать очередной раз hollowengine:textures/gui/icons/[texture].png, и тогда я подумал, почему бы мне не генерировать класс со всеми такими ресурсами, тогда IDE всегда сможет мне подсказать все файлы в нужной папке.
Идея получилась очень удобная и имеет куда больше возможностей, о которых я раньше не задумывался - теперь я сразу вижу, какие ассеты в моде не используются. А если я удалю ассет, который уже используется в движке - мод просто не скомпилируется. В особенности это важно, когда допустил опечатку в названии текстуры, потом её переименовал, но заменил не все места, где она использовалась.
- Ну и последняя фича, которую я ввёл буквально на днях, это аналогичный генератор для ключей перевода. По сути логика та же, что и писал выше, но его пока "не обкатал" 🙃
Но думаю аналогично, куда проще будет отслеживать мёртвые ключи, которые когда-то были в моде, а потом были из него удалены)
И благодаря Gradle это всё работает перед компиляцией, тем самым само обновляется при добавлении новых ресурсов и перекомпиляции проекта 🤔
🤯4
Сгенерированные классы для ассетов и ключей перевода выглядят примерно так. Раньше мне приходилось хардкодить это всё вручную 🫠
Кстати говоря, идея для подобной системы была позаимствована из Android, где кодогенерация ссылок на ассеты - обычное дело.
❤3🔥1👀1
Всё ещё работаю над обновлением редактора кода 😵‍💫 | День 88

В целом, уже вырисовывается что-то более-менее рабочее, пока что работаю над бесшовным обновлением подсветки в фоновом режиме, чтобы это дело стабильно работало для любых текстовых файлов. Ну и парочка новых фишек:
- Кейбинд ctrl + '/': Быстро закомментировать или раскомментировать строку
- Кейбинд ctrl + 'd': Дублировать выделенный текст
- Сохранение после 0.5с бездействия
В общем, рефакторинг уже практически закончен, остались только небольшие правки
❤5
Поддержка fbx 🛻 | День 89

Немного поработал сегодня над системой моделей, обновил поддержку форматов .fbx и .geo.json.
Первый часто используется в игровых движках, а также для него существует довольно обширная библиотека с готовыми анимациями на Mixamo.com, так что в будущем может быть даже сделаю адаптер, чтобы импортировать готовые анимации в ваши модели, необходимо будет только ключевые кости настроить
Второй это практически родной формат BlockBench'а, который поддерживает Molang-выражения в отличии от gltf

Пока что система ещё дорабатывается, по крайней мере необходимо добавить оптимальную перезагрузку моделей, поскольку она тут немного сложнее, но думаю мы уже вышли за рамки 90% модов по функционалу 🙃
🔥1
Media is too big
VIEW IN TELEGRAM
Улучшенный редактор кода 🫨 | День 90

Существенно переписал тот старый редактор, чтобы проще его было вписать в контроллер анимаций и добавлять новый функционал, получилось пока нечто подобное. Весь анализ файлов проходит в отдельном потоке через корутины, что делает его довольно быстрым и без каких либо пролагов.
Также, рефакторинг позволил добавить поддержку новых форматов, вроде json, как видите ни единого фриза в файле на 7000+ строк 🤯
Осталось разве что по мелочи доработать каретку, поправить само-открывающиеся подсказки при пустой строке ну и другие мелочи

В общем, с редактором практически закончено, вероятно успею его доделать даже сегодня 🙃
❤5
This media is not supported in your browser
VIEW IN TELEGRAM
Редактор картинок 👨🏻‍🎨 | День 91

Всё ещё занят рефакторингом, но также добавил недавно ещё одну штуку - редактор картинок. Пока что это лишь набросок и над дизайном ещё не работал, но функционал уже вполне рабочий 👀

Ну а тем временем у меня уже развилась проф. деформация - временами уже захожу в ванилу и думаю "Блин, куда пропала шестерёнка, я хотел файлы игры посмотреть" 🙃
❤8
Возвращаюсь к редактору анимаций 🏃🏻 | День 92

Немного доработал прошлый дизайн и внедрил систему подсветки и автодополнения для однострочных выражений. Со вторым ещё есть над чем поработать, попап пока открывается, как ему взбредёт в голову 🥲
В остальном, ещё остаётся сборка этого контроллера в класс и его компиляция с этими выражениями. Но если говорить в целом, это предпоследняя фича до релиза (а последняя это документация)

Так что мы уже у финишной черты, готовьте свои последние: "Жду релиза HollowEngine день ∫(lim[x→∞] (Σ(n! / e^iπ) + √-1)) dx"
❤‍🔥4🤯3❤1
Конфигурация редактора 🏓 | День 93

Сегодня ещё немного поработал над редактором, добавил для него конфиг, выглядит он примерно так (хотя как будто тут половина и не нужна 🫠):
showLineNumbers: true
showBackground: true
showVerticalScrollbar: true
showHorizontalScrollbar: true
showSelectionAndCaret: true
singleLine: false
enableKeyMap: true
enableAutoBrackets: true
fontSize: 16.0
font: 'hollowengine:monocraft'
indentSize: 4

С другой стороны в будущем ведь появится тот же фолдинг кода и всякие пользовательские подсказки/паттерны, так что думаю ещё пригодится. Ну и да, я решил постепенно переносить свою систему с toml на yaml, поскольку второй, как по мне более читаемый для больших файлов и списков 🤔

Над горячими клавишами пока ещё думаю, мне кажется будет слишком громоздко их все пихать в ванильный раздел управления, а в конфиге их редактировать неудобно из-за всяких модификаторов вроде ctrl, shift и т.п. Так что думаю лучше будет для них отдельный редактор сделать? Да и в целом, пожалуй было бы не плохо сделать редактор конфигов в моде, можно было бы вообще не париться и все их через редактор делать, но тогда на сервере подобные штуки редактировать будет не удобно 🙃
Пока ещё дорабатываю компилятор для контроллера анимаций, вероятно он тоже всё же на первое дело будет в виде скрипта, поскольку реализовывать полноценный компилятор довольно долго
❤5👍1
Генерация скрипта для контроллера анимаций 🐸 | День 94

Пока не стал делать сложную логику, да и от умных полей с подсветкой синтаксиса и ошибок временно отказался, чтобы не тянуть со всем этим и дальше. Переписал старый контроллер анимаций с Molang на Kotlin и подтянул для него кодогенератор из графа с настройками. Пока при сохранении контроллера он также сохраняет и файл в виде кода по соседству, думаю пока что это оптимальный вариант, к тому же всегда можно будет часть логики поправить или дополнить в коде, на первое время этого с головой хватит 🤔
Ну а дальше, я уже займусь подключением этих скриптов к нпс и всякими небольшими правками для нового билда 🫣
👍4🥰1
Media is too big
VIEW IN TELEGRAM
Сырой релиз 🫠 | День 95

Ну что, с необходимыми фичами уже всё, я добавил всё что хотел, так что концептуально движок уже дошёл до того самого релиза 🤯
Так что в ближайшие часы я скомпилирую движок под Java 17 (ибо пока он использует зависимости с 21) и выложу в сообществе, сразу говорю, что проблем ещё довольно много, так что будем постепенно их исправлять, но в любом случае, хотя бы запустить и потыкать интерфейс - уже может помочь выявить некоторые проблемы, в особенности касаемо адаптивного интерфейса под разные мониторы 🙃
🔥7❤4
Время фиксить баги 🪡 | День 96

Ну что же, сегодня утром я не без проблем таки сбилдил мод под Java 17 и уже нашлось много разных моментов и проблем, так что вот сегодняшние правки :D
- Исправлен адаптивный интерфейс на мониторах 2к+
- Исправлены вылеты при открытии неподдерживаемых файлов
- Поправлены косяки с блоками кода (можно было изменить блоки на панели предпросмотра, некоторые из блоков некорректно масштабировались)

Ну и также несколько новых фишек:
- Добавлены значения по умолчанию во многих блоках
- Цвета блоков теперь настраиваются индивидуально для каждого блока, а не исключительно по категориям
- Добавлены команды для запуска простых скриптов (просто .kts, без контекста или нпс)
❤3🤝1
🧱🧱🧱🧱🧱🧱🧱 | День 97

Блоков много не бывает, верно? Вот и я так подумал, пока фиксил прошлые, поэтому добавил ещё пару десятков, чтобы потом их фиксить 😁
Ну а также:
- добавил для анимаций режимы запуска (одноразовый, зацикленный, застывающий на последнем кадре)
- добавил блоки для получения предметов и блоков (масло масленное, блин...)
- всякую информацию о предметах и их сравнениях
- работу с nbt (это стандартное хранилище данных Minecraft, которое к слову будет использоваться в пользовательских интерфейсах движка, так что думаю ещё много где пригодится)

В общем, работа идёт полным ходом, билды скоро будут в сообществе и на GitHub!
🔥4❤2🐳2
Разметка интерфейсов в Kool 📐 | День 98

Думаю все уже знают, что в HollowEngine используется движок Kool для интерфейсов. Смысл в том, что большая часть его интерфейсов - имеют динамические размеры, в то время как ванила рассчитывает всё по пикселям и даже для простого выравнивания текста по центру вам нужно вручную высчитывать размеры окна и центр текста, после чего его вручную выравнивать. Не говоря уже о том, когда у вас 20 кнопок, каждой придётся указать координаты и размеры.

В Kool же всё проще, есть дерево виджетов, где каждый имеет свои свойства и можно настроить логику распределения виджетов, внутри, например:
- Cell Layout: Виджеты располагаются вместе, перекрывая друг друга (полезно, когда нужно расположить модальное окно или оверлей)
- Column Layout: Виджеты располагаются последовательно, сверху вниз (например, как кнопки на левой панели в ролике)
- Row Layout: Аналогично прошлому, но по горизонтали.
Этого уже достаточно для большинства задач, но я всё чаще начал сталкиваться, что иногда мне нужно чтобы виджеты сами распределялись последовательно по горизонтали и сверху вниз. Поэтому я сегодня написал вот такой Flow Layout, который сам распределяет виджеты вне зависимости от размера и формы 🤯
И всё это чисто, чтобы форматированный текст с ссылками и картинками внутри умещался под любой размер окна
Короче, Absolute Layout 🤚🫠🤚
❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Выглядит это примерно так 👀
🔥2👍1