-
Постов
332 -
Зарегистрирован
-
Посещение
-
Победитель дней
11
Тип контента
Профили
Новости
Статьи
Мемы
Видео
Форумы
Блоги
Загрузки
Галерея
Весь контент ArtemSH
-
Construction Set Extender - плагин для OBSE
ArtemSH прокомментировал YourBunnyWrote статья в Модостроение Oblivionпопытался вставить препроцессор, вылетел ксе) там дефайнятся переменные только через _ что ли? -
-
)))
-
А кто-нибудь знает как убрать надпись в углу "Вы не можете экипировать этот предмет" при выборе неэкипируемого предмета из инвентаря? Вроде была такая функция.
-
интересно отчего они мигают. как такое чудо сделано
-
Версия 1.2
19 раз скачали
Иммерсивная модификация Check Your Compass вводит в игру механику компаса. Теперь чтобы увидеть компас необходимо найти реальный компас в мире игры, а сами компасы разделены на 5 уровней качества, влияющего на их цену, вес и дальность видимости точек интереса. Check Your Compass позволит вам по своему вкусу настроить механику компасов, вплоть до чисто декоративного режима! Присутствует изначальная поддержка LINK и Nehrim! Уже пару лет как мне хотелось создать такой маленький, но иммерсивный мод, убирающий HUD компаса при отсутствии оного в инвентаре и позволяющий всяячески настраивать дистанцию отображения точек интереса на нем, если он есть. Увидев мод ElderScrollsFan001, я понял, что часть дела уже сделана, осталось написать скрипты. Но на тот момент я не обладал нужными навыками. Но прошло время, и вот мы здесь. Отстутствие компаса отключает HUD компаса (можно отключить эту функцию) Чрезвычайно гибкие настройки HUD компаса: вы можете отключать отображение маркеров квестов, локаций, стрелку игрока и настраивать дальность видимости объектов* Полностью настраиваемые свойства каждого вида компаса: его стоимость, вес и дальность действия Мод автоматически определяет наилучший компас в инвентаре (отключается в настройках) Компасы распределены по уровневым спискам через скрипт, чтобы обеспечить максимальную совместимость с другими модами, так что для мода Check Your Compass не нужен Bashed Patch! Встроенная поддержка до 5 видов UI, от оригинала до NothernUI! Поддерживаемые моды: все виды Darn (Darnified UI, Dark UI, OA_Dark_Transparent), NothernUI, BTMod, MajorJims, оригинал и его вариации (Simple Better Inventory) Отсутствие зависимости от Oblivion.esm, что делает мод универсальным Встроенная поддержка Nehrim! Поддержка LINK++ и настройки через INI * часть настроек работает только в Darn-подобных интерфейсах Гибкие настройки компаса Теперь компас без компаса (ха!) вы не увидете! Или вы всё еще жаждете его видеть?! Что ж... Я отдаю себе отчет, что кому-то хотелось бы оставить HUD компаса, но, например, иметь меньшую дальность отображения локаций. Для таких целей в моде предусмотрен целый ряд параметров, позволяющих настраивать HUD компаса под себя. С модом Check Your Compass вы сможете: Включать\выключать отображение в интерфейсе компаса при отсутствии оного Включать\выключать отображение маркера квеста на компасе Включать\выключать отображение маркеров уже найденых локаций Включать\выключать отображение маркеров еще не найденых локаций (пока только для Darn-подобных интерфейсов) Задать свою дальность появления маркеров на компасе Система уровней компасов Теперь по миру игры распределены аж пять уровней компасов - от деревянных до золотых. Каждый из видов обладает своими весом, ценой и дальностью действия. В свою очередь каждая из этих переменных настраивается через INI и LINK, где вы всегда сможете поменять их свойства по своему вкусу. Не нравится как выставлены вес и цена золотых компасов? Вы всегда сможете поменять свойства именно этого уровня компасов в настройках модификации. В игре представлены пять следующих видов компасов: Деревянный компас 200 Септимов 0. 1 кг 3000\300 метров Оловянный компас 350 Септимов 0.5 кг 5500\700 метров Медный компас 500 Септимов 1 кг 8000\1100 метров Серебрянный компас 800 Септимов 3 кг 12000\1600 метров Золотой компас 1000 Септимов 2 кг 16000\2000 метров При этом вы вольны отключить или настроить систему уровней компасов! То есть настраивать то, как сильно разные виды компасов будут различаться между собой. Так данный мод дает вам в руки мощный и гибкий инструмент настройки своего игрового опыта с компасами под себя! Уровни компасов могут работать в следующих режимах: Различие в цене, дальности и весе Различие в цене и весе при одинаковой дальности Различие в цене и дальности при одинаковом весе Отсутствие различия между видами компасов по всем параметрам При отключении различий мод выставит каждому свойству единое значение. Так, существуют базовые знаения для цены, веса и дальности отрисовки маркеров на компасе. При этом вы всегда вольны не только отключить систему уровней, но даже отказаться от новых значений дальности отображения маркеров. Отдельная переменная, отвечающая за базовую дальность отрисовки, также может быть настроена по своему вкусу. Заметьте, что новые значения дальности немного отличаются от оригинальных игровых значений, но никак их не перезаписывают и не изменяют. Оригинальное значение видимости маркеров: 12000 Оригинальное значение видимости маркеров еще не найденных локаций: 1800 При отключении новых значений дальности и отключении системы уровней компасов все компасы будут показывать оригинальные игровые значения дальности отрисовки маркеров! * В реальности это не метры, а Game Units, абстрактная категория, заменяющая привычную метрическую систему. Но...какая разница! Автоматический поиск наилучшего компаса Вы же не хотите устанавливать найденный компас вручную? Или разбираться с тем, какой там из них наилучший? Мод всё сделает за вас! При подборе и выбросе компаса мод сам поймет, какой из них лучше по качеству, и изменит настройки дальности маркеров в игре. Вы все-таки хотите сами контролировать этот процесс? Не беда! И эта функция отключается в настройках игры, а вы сможете установить активным тот компас, который захотите. Просто кликните по нему в инвентаре и выберите его как основной. Распределение компасов по миру Иммерсивная модификация Check Your Compass стремится к максимальной совместимости с другими модами. Поэтому для лучшего сосуществования она не добавляет в уже существующие списки или контейнеры новые компасы напрямую. Все компасы добавляются в урвоневые списки через скрипт, поэтому модификация Check Your Compass обладает максимальной совместимостью с большей частью модификаций, никак не мешая им добавлять свои предметы в игру, а также не требует Bashed Patch для нормального сосуществования с ними. Встроенная поддержка до 5 видов UI Мы все знаем, как много (нет) вышло модов на новые UI для нашей любимой игры. И всем нужен свой (эх!) особый подход. Данный мод поддерживает следующие пять видов интерфейса: Оригинальный интерфейс (очевидно) DarnifiedUI (а также все подобные ему, включая DarkUI, OA_Dark и т.д.) BTMod NothernUI OA_Dark_Transparent MajorJims Не все эти моды позволяют игроку раскрыть потенциал данного мода. Только у darn-подобных интерфейсов есть возможность отдельной настройки дальности отображения еще не найденных локаций, а NothernUI пока что поддерживается далеко не во всем. Тем не менее, основной функционал должен работать во всех данных интерфейсах. Встроенная поддержка Nehrim Иммерсивная модификация Check Your Compass не привязана к Oblivion.esm, поэтому она может работать и в Nehrim. Более того, модификация изначально поддерживает Nehrim и распределяет компасы по миру этой игры. Теперь путешествующие торговцы, жители городов и владельцы пабов смогут продать игроку всё те же компасы! Поддержка LINK++ и настройки через INI Все опции настраиваются через INI и LINK. Часть гибких настроек, касающихся свойств компасов, доступна только в INI, но включения и выключения системы уровней, системы поиска лучшего компаса, базовые виды дальности, а также базовый функционал отображения элементов на компасе, могут настраиваться и в LINK. Этот мо бы не увидел свет, если бы не помощь Slowpard, прочитавшего код и нашедшего все неверные конструкции и прочие несуразности. Без него вычитка кода заняла бы у меня чрезвычайно долгое количество времени. За обложку большое спасибо ishouldbeplayingquake, который проявил чудеса отзывчивости, снабдив меня подробнейшей инструкцией по созданию стильных обложек. Отдельно спасибо allexa и Takirell, которые терпеливо отвечали на все мои вопросы, помогая, где было возможно. Благодаря allexa вышел версия 1.2, исправившая множество косяков. Низкий поклон ему за фактический допил и рефакторинг большей частью кода. И, конечно же, ElderScrollsFan001, автору самих моделей компассов, без которых этого мода бы не состоялось в принципе. Пожалуйста, скачайте прекрасные моды этих людей и поставьте им досточтимый лайк. Нужны дельные советы на счет доработки скриптов, меняющих дальность в связи с моими узкими познаниями в XML. Особенно это касается NothernUI, в котором функционал мода, судя по всему, несколько ограничен (нет возможности отключать маркеры в компасе). А также нужны знающие и любящие мир Нерима, поскольку я весьма смутно представляю себе, каким торговцам и в какие контейнеры логичнее всего добавить компасы для игрока. Мод совместим со всеми модами, затрагивающими уровневые списки. Мод совместим с модами, меняющими Игровые Настройки (GMST) дальности видимости Точек Интереса (POI), поскольку не меняет их значение и никак не затрагивает эти настройки. Мод может конфликтовать с модами, влияющими на видимость HUD компаса и устанавливающими свои значения видимости маркеров на компасе. -
Если часть XML имеет следующий вид <visible> <!-- Show only in "explore mode." --> <copy src="HUDMainMenu" trait="user3" /><eq>1</eq> </visible> можно ли заменить её значение visible, копирующее значение user3 (числовое), переменной числового типа? Вот в такой форме: SetMenuFloatValue "HUDMainMenu\hudmain_compass\visible" 1004, sCVis ; NUI Или нужно добавить trait в путь XML?
-
если трейт в XML файле хранит не цифру, а значение true\false то сработает ли следующий скрипт SetMenuFloatValue "Imp_UI_Settings\_cv" 1004, sCVis где sCVis - числовое значение
-
вдогонку... такая строка будет работать? код компилируется но в игре не видно изменений AshCompasT3.setgoldvalue fBasePrice + fPrT3 где AshCompasT3 - EditorID базовой формы AshCompasT5.setweight fBaseWeight + fWT5 мне его заменить реф-переменной нужно чтобы заработало? или я неверный синтаксис написал? спасибо тем, кто поможет
-
аааа я вспомнил у них же нету FormID и формид возникает когда кто-то меняет настройку поэтому те GMST не отображаются в есм получается, с одним ГМСТ какая-то ошибка, раз он присутствует и в есм и в есп нового мода?
-
по ходу второе тк мод привязан к есм причем одна из настроек (на скрине она зелено-желтая) в есм есть, а остальные отсутствуют, что навело на мысли об особом интерпретаторе, скрытом в движке игры)
-
благодарю! а почему же они не отображались в моем есм, если они часть игры...еще одна загадка дыры
-
частично решили вопрос оказалось, что приравнивать переменные типа float к GMST - плохая идея, тк GMST выступают в виде строковых переменных set fDT4 to iMapMarkerVisibleDistance == неверно нужно: set fDT4 to GetGameSetting iMapMarkerVisibleDistance также нежелательно писать if GetMenuFloatValue "darnui_settings\_reveal" 1004 != fDis if GetMenuFloatValue "darnui_settings\_cv" 1004 1
-
это довольно муторно делать, если честно)) а так идея отличная, прям будет чувствоваться импакт.
-
очень странная вещь: из скрипта сами по себе работают три строчки, а остальное - нет....причем ничего сложного там нет, лишь система инициализации и обращение к к ИНИ Вот: Просто загадка дыры, не иначе Очень нужен хелп от просвещенных модеров...
-
upd: если закоментировать большую часть кода, то код игра воспринимает, но добавленные новые предметы не видит вообще...я имею в виду, что их нельзя добавить через консоль никак. не понимаю совершенно в чем я ошибся...
-
Внезапно возникла самая странная проблема на моей памяти... Создал мод без привязки к oblivion.esm ...и он никак не отображается в игре! и это притом что он подключен к игре, я перепроверял. Ни ошибки, ни вылета, ничего. Просто НОЛЬ присутствия. будто бы его и не было. специально проверял, могу ли я добавить в инвентарь предметы из него, но...игра их не видит! и в консоли нет дебажных записей, которые я писал. Как такое может быть?
-
Вдогонку: может быть кто вспомнит, был ли на вашей памяти мод, который бы добавлял в левельные листы (неписей и контейнеров) любые предметы, но с помощью скрипта? это повышает совместимость и с помощью такого подхода моддеру не надо под такой мод пересоздавать bashed patch, что очень удобно. если всплывет такой мод в памяти, напишите пожалуйста. актуально
-
Добрый вечер! Возник вопрос, который ввел в ступор. Посмотрел в TESEdit мод UNKNOWNYMOUS Social NPCs, чтобы понять как он меняет глобальные настройки GMST. А он вводит аж три своих собственных, причем никаких скриптов, ничего кроме этих трех дополнительные настроек нет. Я не понимаю...а как игра вообще понимает, что эти настройки обозначают? Их же изначально не было, их добавил моддер. Там в движок встроен интерпретатор EditorID для GMST записей или что? Скрин прилагаю. Спасибо, если кто просветит!
-
Вставлю свои пять копеек. Есть такая практика: выждать две-три недели, и если автор не отвечает, считать, что он дал добро, только указать о ситуации в описании под модом, чтобы была ясна мотивировка. Не то чтобы все следовали этой практике, но определенная степень самозащиты от обвинений в этом есть.
-
смотрите, завидуйте у меня... "Труп пирата" как квестовый предмет! 0_о
-
Всегда смущало, что эти болезни в оригинале никак не обыгрываются. С одной стороны, их лечение - дело одной склянки лекарства. С другой стороны, сами болезни - сущая ерунда. Вполне возможно набрать уйму всяких местных "болезней" и не замечать их наличие посреди миллионов баффов и дебаффов от вещей, модов и прочего. Хоть бы придумали что-нибудь эдакое, тем более здешняя система магии технически всё это позволяет. Просто набросаю первое, что приходит на ум. У них же был корпрус с Вванерфелла? Ну вот вам первый аналог: болезнь делает игрока практически неуязвимым, его кожа как бы каменеет, но взамен он не сможет плавать - его будет утягивать на дно, по которому придется идти пешком. Или вообще сделать воду смертельной для игрока при такой болезни. Еще пример: болезнь, которая заставляет изрыгать игрока пламя изо рта при любой попытке заговорить. То есть, вместо активации диалогов игрок бы сталкивался с тем, что поджигал бы окружающих неписей. Это же можно использовать и в геймплее: вместо того, чтобы сдаться в плен, игрок бы поджигал противника. Заметьте, такие примеры сразу врезаются в память! То есть, вы обращаете на эту часть геймплея свое внимание, что уже отлично. Более того, эти примеры меняют ваш геймплей, активно влияют на ваше поведение и стиль игры. Чего, собственно, и хотелось бы добиться. А не просто дебильная система дебаффов, причем еще довольно незначительных.
-
да, как предмет потом отдает их в диалоге
-
Фрагмент из диалога. По квесту на игрока нападут бандиты, а после необходимо будет собрать их трупы и отдать начальнику местной полиции. Примечательно здесь то, что обьяснение, КАК собрать эти самые трупы, дается в иммерсивной и ненавязчивой манере. Я сам в восторге от такого подхода :))
-
Это перевод статьи мододела GOOGLEPOX, поделившегося прометеевым огнем знания о том, как создавать плагины, опирающиеся на динамическую библиотеку расширителя скриптов, более известную как OBSE. Предисловие После бесчисленных чашек кофе, поздних ночей, глухих ругательств и часов за IDA* я достиг такого статуса, что люди начали задавать мне вопросы "как мне сделать плагин для OBSE?" и "как поживает система ESL для Oblivion?". Будьте спокойны, всё будет. Но сегодня мы создадим свой собственный плагин для OBSE. * IDA - это программа для реверс-инжиниринга игровых движков и программ. Она сканирует все действия, которые выполняет процессор, какие посылает ему программа или движок, и переводит их на язык Ассемблера. После программист сам должен перевести эти команды с ассемблера на С++. Таким образом был "собран обратно" движок для Морровинда только уже как опен-сорсный OpenMW. И к нему не может быть никаких претензий, поскольку код там не выдран из оригинальной игры, а фактически написан заново, ведь можно заставить движок выполнять одни и те же действия, только написав команды по-разному. - Примечание Переводчика. Обзор Это гайд не будет сразу обо всем. Многое придется узнавать самому и лучше всего для этого глубоко погрузиться в то, как работает Oblivion. Я очень рекомендую вам иметь конкретную цель или конкретный проект, когда вы будете всё это учить, поскольку увидеть, как ваша задумка воплотилась в жизнь, это непередаваемо. Когда я начинал делать свой первый плагин OBSE я практически ничего не знал о С++ (портируя Base Object Swapper для New Vegas от powerofthree). Лучший способ обучения - тотальное погружение. Nota Bene: строго рекомендуется иметь хоть какой-то опыт в кодинге или обращении с компьютером, помощь от этого несравнима. Однако же это не требование, а пожелание, поскольку этот опыт невероятно облегчит создание нашего плагина. Начинаем 1. Клонируйте GitHub репозиторий xOBSE. Рекомендую установить GitHub Desktop, чтобы легче было работать с репозиториями и обновлять все репозитории вовремя. Это еще и отличное средство, когда вы что-то перепутали или удалили и вам необходимо восстановить файлы с бекапа. У Гитхаба есть на этот счет отличные гайды. 2. Скачайте Visual Studio и откройте файл obse.sln внутри xOBSE/obse. 3. Взгляните на проект obse_plugin_example. Это база для создания нового плагина. 4. Не устрашитесь. Пример Плагина Погнали! Открываем и смотрим main.cpp. Глубокий вдох. Здесь люди начинают теряться из-за обширного количества самых разных вещей, которые тут видят. Не волнуйтесь, я просматривал этот файл бесчисленное количество раз и столько же раз сдавался пока наконец не получилось. Хорошие новости: main.cpp нам не нужен для нашего плагина и существует только как пример того, как работают разные возможности OBSE. Я разобью этот файл на несколько секций. #include - это буквально import из Python или Java (ну почти, не нужно к этому придираться) Следующий отрывок - глобальные переменные для OBSE Следующие несколько блоков это примеры разных API для OBSE, такие как массивы (Arrays), команды OBScript, сериализация для сохранения данных и система сообщений Messaging API (мы к ней еще вернемся) Если брать ХОТЬ ЧТО-НИБУДЬ из этого main.cpp то это следующее: OBSEPlugin_Query полезна для информации по версиям, совместимостям и тому подобному, действуя перед тем, как загрузится плагин. OBSEPlugin_Load самая важная, поскольку в ней мы определим (define) что сделает OBSE, когда загрузит ваш плагин. Ваш первый плагин Удаляйте все из main.cpp кроме секций load, query и интерфейса сообщений (messaging interface). Я создал голую версию main.cpp, которую ищите здесь. Ну как теперь всё это выглядит? Намного яснее теперь, не так ли? Теперь у нас есть OBSEPlugin_Load, который пока всего лишь инициализирует MessagingInterface, OBSEPlugin_Query, проверяющий и версию OBSE и версию Oblivion, чтобы убедиться, что они не устарели, и сам MessagingInterface. Взглянем на этот самый интерфейс сообщений - начальная точка для создания своего кода. Этот интерфейс всего лишь смотрит, когда то или иное событие (event) случается (сохранение, загрузка, выход и проч.) и отправляет сообщение вашему плагину, давая ему знать, что это событие только что произошло. Так в моем main.cpp есть проверка для типа сообщений (message type) и для конкретного события kMessage_LoadGame. Ну пока это ничего нам не дает. Пока. Добавляем простую возможность. Напишем "Hello, Wordl!" в консоли как только загрузили сохранение. Вот настолько всё просто. А теперь представим, что ваш герой беден, а вы хотите ему помочь. Добавим 1000 септимов игроку, когда игра згружается. Это уже сложнее, поскольку теперь нужно добавить проверку, что игрок инициализирован, например, такую: А для функции AddItem напишем следующее: AddItem включает в себя 3 аргумента, как вы видите. Предмет, который хотим добавить, дополнительный список информации (extra data list) и количество предмета, которое вы хотите добавить. Можно просто прописать nullptr вторым аргументом, посколько он необязателен. Чтобы указатель обьекта (object pointer), TESForm, нашел нужный предмет, мы используем: Большая часть обьектов Обливиона имеет formID, 16-ричное число, выступающее уникальным идентификатором обьекта. Все formID есть на UESP. Мы знаем, что formID одной монеты начинается с префикса 0xF, где 0х - обозначает 16-ричное число. Используем это, чтобы добраться до этой монеты: Теперь эту функцию выше мы вывозем в интерфейсе сообщений во время события kMessage_LoadGame: Теперь скомпилируйте код (Build this) и проверяйте! Поздравляю! Вы создали ваш первый плагин OBSE! Гордитесь собой, поскольку так далеко большая частть модеров не заходит. Хуки События Интерфейса Сообщений серьезно ограничены, поскольку код можно пустить только для пред-установленных событий (pre-defined events), подобных сохранению, загрузке и выходу из игры. Если вам нужно болше контроля, пристегните ремни, сейчас будет ликбез по адресам памяти и указателям (memory addresses and pointers). Oblivion.exe (и любая программа) делится на мелкие части. Каждая часть имеет адрес, чтобы компьютер знал, какая часть кода сейчас работает и как прыгнуть к другим частям кода. Есть программа IDA (Interactive Disassembler), позволяющая смотреть эти части и видеть, что они делают. Я СИЛЬНО рекомендую использовать её, но она довольно-таки дорогая, так что люди находят....креативные способы, чтобы разобраться в вопросе. Собственно, хуки позволяют вам легчайше вставлять код в любой из этих адресов. Некоторые адреса сложнее пропатчить, чем другие. Например, я знаю, что адрес памяти 0xA46CB0 (опять же, 0x - это всего лишь префикс для 16-ричной системы счета или 16 чисел. Все формиды Обливиона записаны в этой системе, как и большая часть компьютерных материй) Но в адресе 0xA71160, как я узнал из просмотра кода в IDA, игра вызывает TESObjectREFR::LinkForm, то есть спрашивает, где референс обьекта инициализируется. Nota Bene: хотя и формиды, и адреса записываются в формате 16-ричной системы счета, formID обозначают информацию (предметы, НИПов, оружие и проч.), а адреса памяти обозначают код. Они НЕ взаимозаменяемы. Так, в моем коде для Base Object Swapper (исходный код лежит здесь) я написал: Этот кусок кода просто перенаправляет (reroutes) код, когда тот отправляется к этому адресу, и вызывает мою функцию LinkFormHookREFRinstead вместо функции TESObjectREFR::LinkForm. После чего моя функция LinkFormHookREFRinstead выглядит так: И вот она руководит логикой мода Base Object Swapper, затем включает в действие ОРИГИНАЛЬНЫЙ код, который должен был там включаться, то есть originalAddressREFR со строкой ThisStdCall, чтобы игра не вылетела, а код просто немножечко отклоняется (does a little detour through) от моей функции. Вот эта логика обходного пути (same basic detour logic) может применяться в большинстве мест в коде, а другие просто требуют чуть больше работы. Можно назвать это кастомными событиями (custom events) для Интерфейса Сообщений, только вы их можете применять вообще где угодно! Очевидно, что рассказывать еще можно МНОГО чего, а кривая обучения находится почти под прямым углом. Однако я не могу описать, насколько ценно выучить эту тему. Я рекомендую присоединиться к нашему сообществу в дискорде New Oblivion Modding Community для поддержки. Я почти всегда там активен (под юзернеймом googlepox) и всегда открыт для вопросов и поддержки. Удачи! Ваш GOOGLEPOX