Дружественный API, вдохновлённый IMGUI, для создания меню настроек в модах REF для MHRise.
УРАААЭто был непростой проект, спору нет.
У этого красавца внутри столько чёрной магии. *Шлёпает Репозиторий GitHub*В любом случае:
~Что это делает?~
Ну, само по себе это не так уж и много.
Но в руках авторов модов меню настроек можно напрямую добавить в игровое меню параметров через простой API.
Функции API очень похожи на imgui, с некоторыми оговорками*~Что мне нужно сделать?~
Просто установите мод, как любой другой мод для REFramework.
Если ты не знаешь, как это сделать, то, вероятно, это не твой первый опыт.
Как только вы окажетесь в нужном месте, в меню параметров автоматически добавится категория «Моды».
Затем, при использовании других поддерживаемых REF-модов, настройки появятся там.
Для авторов модов:Скачайте пример реализации мода из файлов, и это поможет вам быстро начать.
Для получения дополнительной информации об API вы можете обратиться к Страница GitHub.
Обещаю, это почти так же просто в использовании, как и встроенные функции imgui, и будет очень круто увидеть, как сообщество добавляет меню!
Требуется только подключить пакет и использовать API, как в ImGui.
Вы можете по желанию проверить, установлен ли у пользователя пакет, и опционально поддержать меню, чтобы не заставлять людей устанавливать его. Но было бы хорошо, если бы вы всё равно могли пометить этот файл как обязательный.Я прошу не распространять этот мод вместе с вашими модами, как бы удобно это ни было.
Я много работал над этим, но возможно, мне придётся что-то здесь обновить, и вы же не хотите конфликтующих версий в разных модах.
Обязательно сообщите мне, если выпустите мод с использованием этого меню — я добавлю его в список поддерживаемых модов!Ограничения*
К сожалению, поскольку используются собственные меню игры, наши возможности ограничены тем, что поддерживается игрой на уровне кода.
Очевидно, тут нет продвинутой функции рисования.
Только это **Мимики** imgui, на самом деле "draw"-функции — это колбэки для получения данных из UI игры. Можно делать динамические меню, но старайся не переусердствовать.
Это подойдёт не для каждого мода, но если вам нужны лишь простые настройки — просим рассмотреть такой вариант!~Титры~Спасибо Stracker за (создание крутых модов, но также [без разрешения]) разрешение сослаться на один из их модов для корутин и системных сообщений. А также за то, что фактически добавил корутины в REF.
И, конечно, спасибо praydog за всю работу над REFramework и за предоставленные рекомендации.
Вклад:
raffRun - Автоперенос подсказок
Стрекер — поиск способа чтения данных GUID по указателям внутри LuaHookedBehemoth - Внедрены находки Stracker'аDiscord: Bolt#6265GitHub: Извините, но предоставленный текст является URL-ссылкой, а не игровым текстом (UI, диалоги, задания, системные сообщения). Пожалуйста, отправьте непосредственно текст для локализации.Моды, использующие это меню:Болтовня и забавные факты:
У меня полно глупостей на языке, потому что этот проект вымотал меня.
Это была одна из самых сложных задач за последнее время, если не считать разработку ритм-игры за 48 часов на игровом джеме?
Игра категорически не рекомендует этого делать и будет вылетать при любой возможности, если вы не будете действовать безупречно.
Забыл добавить ref для этого массива? Вылет. Строки? Вылет. Данные опций? Вылет.
Вызвать функцию обновления из любого места в функциях игрового интерфейса? Вылет.
Нет данных для опций, которые не требуют заполнения? Вылет.
Я отвлёкся, но, должно быть, я вылетал из игры раз сто.
Но, думаю, это и делало задачу особенно увлекательной — я давно не был так поглощён проектом. Всё время казалось, что до работающей версии рукой подать, но всегда возникала какая-то серьёзная проблема, которую нужно было преодолеть.Некоторые интересные заметки:Вкладка модов в списке категорий на самом деле является копией вкладки сохранений, так как нет возможности добавлять новые типы, поэтому я заменяю данные в зависимости от индекса прокручиваемого списка.
Долгое время я использовал расширенное меню графических настроек как способ заставить работать подменю, и это почти сработало, пока я не обнаружил, что они, по какой-то причине, просто жёстко закодировали это меню только на пять элементов в списке... и, конечно, игра вылетает, если выставить другое значение, кроме 5.
Плюс, по какой-то неведомой причине ползунки в этом меню не реагируют на мышь, так что в итоге я просто подобрал правильную комбинацию вызовов, чтобы превратить опции в подобие кнопок, подменить данные и перерисовать элемент, тем самым переключая подменю без фактической смены меню.
И вся эта логика неизбежно была сложной..
Из-за ограничений REF мне пришлось написать небольшой плагин на C++, единственная задача которого — принимать указатель на GUID и разыменовывать его, чтобы извлечь данные. Без этого всё бы не работало, так как не было бы способа корректно переопределить локализованные строки игры.
Было не так уж плохо, но настройка C++ проекта с lua и sol2 оказалась сущим кошмаром. Гайды почти не помогали.
Аналогично, по какой-то причине я не мог задать значения GUID объектам в REF, но обошёл это, напрямую записав данные с помощью write_dword по нужным смещениям.
В конце концов, результат, по-моему, получился очень крутым.
Мне почти всё равно, пользуется ли этим кто-то — сама мысль, что оно работает, уже была наградой. Но, думаю, людям это понравится.
Ну, можете предлагать функции, если хотите, но после всего этого я точно буду лениться.
Это, пожалуй, пока всё. Надеюсь, вам понравится!