Перейти к содержанию

ArtemSH

Модмейкер
  • Постов

    275
  • Зарегистрирован

  • Посещение

  • Победитель дней

    12

Весь контент ArtemSH

  1. Если часть 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?
  2. если трейт в XML файле хранит не цифру, а значение true\false то сработает ли следующий скрипт SetMenuFloatValue "Imp_UI_Settings\_cv" 1004, sCVis где sCVis - числовое значение 
  3. вдогонку...   такая строка будет работать? код компилируется но в игре не видно изменений AshCompasT3.setgoldvalue fBasePrice + fPrT3 где AshCompasT3 - EditorID базовой формы AshCompasT5.setweight fBaseWeight + fWT5 мне его заменить реф-переменной нужно чтобы заработало? или я неверный синтаксис написал?   спасибо тем, кто поможет
  4. аааа я вспомнил у них же нету FormID и формид возникает когда кто-то меняет настройку поэтому те GMST не отображаются в есм получается, с одним ГМСТ какая-то ошибка, раз он присутствует и в есм и в есп нового мода?
  5. по ходу второе тк мод привязан к есм причем одна из настроек (на скрине она зелено-желтая) в есм есть, а остальные отсутствуют, что навело на мысли об особом интерпретаторе, скрытом в движке игры)
  6. благодарю! а почему же они не отображались в моем есм, если они часть игры...еще одна загадка дыры
  7. частично решили вопрос оказалось, что приравнивать переменные типа 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
  8. ArtemSH

    Об игровых болезнях

    это довольно муторно делать, если честно)) а так идея отличная, прям будет чувствоваться импакт. 
  9. очень странная вещь: из скрипта сами по себе работают три строчки, а остальное - нет....причем ничего сложного там нет, лишь система инициализации и обращение к к ИНИ Вот: Просто загадка дыры, не иначе Очень нужен хелп от просвещенных модеров...
  10. upd: если закоментировать большую часть кода, то код игра воспринимает, но добавленные новые предметы не видит вообще...я имею в виду, что их нельзя добавить через консоль никак. не понимаю совершенно в чем я ошибся...
  11. Внезапно возникла самая странная проблема на моей памяти... Создал мод без привязки к oblivion.esm ...и он никак не отображается в игре! и это притом что он подключен к игре, я перепроверял. Ни ошибки, ни вылета, ничего. Просто НОЛЬ присутствия. будто бы его и не было. специально проверял, могу ли я добавить в инвентарь предметы из него, но...игра их не видит! и в консоли нет дебажных записей, которые я писал. Как такое может быть?
  12. Вдогонку: может быть кто вспомнит, был ли на вашей памяти мод, который бы добавлял в левельные листы (неписей и контейнеров) любые предметы, но с помощью скрипта?   это повышает совместимость и с помощью такого подхода моддеру не надо под такой мод пересоздавать bashed patch, что очень удобно.    если всплывет такой мод в памяти, напишите пожалуйста. актуально
  13. Добрый вечер! Возник вопрос, который ввел в ступор. Посмотрел в TESEdit мод UNKNOWNYMOUS Social NPCs, чтобы понять как он меняет глобальные настройки GMST. А он вводит аж три своих собственных, причем никаких скриптов, ничего кроме этих трех дополнительные настроек нет. Я не понимаю...а как игра вообще понимает, что эти настройки обозначают? Их же изначально не было, их добавил моддер. Там в движок встроен интерпретатор EditorID для GMST записей или что? Скрин прилагаю.  Спасибо, если кто просветит!
  14. Вставлю свои пять копеек. Есть такая практика: выждать две-три недели, и если автор не отвечает, считать, что он дал добро, только указать о ситуации в описании под модом, чтобы была ясна мотивировка. Не то чтобы все следовали этой практике, но определенная степень самозащиты от обвинений в этом есть.
  15. ArtemSH

    Рабочее I

    смотрите, завидуйте у меня... "Труп пирата" как квестовый предмет! 0_о
  16. ArtemSH

    Об игровых болезнях

    Всегда смущало, что эти болезни в оригинале никак не обыгрываются. С одной стороны, их лечение - дело одной склянки лекарства. С другой стороны, сами болезни - сущая ерунда. Вполне возможно набрать уйму всяких местных "болезней" и не замечать их наличие посреди миллионов баффов и дебаффов от вещей, модов и прочего. Хоть бы придумали что-нибудь эдакое, тем более здешняя система магии технически всё это позволяет. Просто набросаю первое, что приходит на ум. У них же был корпрус с Вванерфелла? Ну вот вам первый аналог: болезнь делает игрока практически неуязвимым, его кожа как бы каменеет, но взамен он не сможет плавать - его будет утягивать на дно, по которому придется идти пешком. Или вообще сделать воду смертельной для игрока при такой болезни. Еще пример: болезнь, которая заставляет изрыгать игрока пламя изо рта при любой попытке заговорить. То есть, вместо активации диалогов игрок бы сталкивался с тем, что поджигал бы окружающих неписей. Это же можно использовать и в геймплее: вместо того, чтобы сдаться в плен, игрок бы поджигал противника. Заметьте, такие примеры сразу врезаются в память! То есть, вы обращаете на эту часть геймплея свое внимание, что уже отлично. Более того, эти примеры меняют ваш геймплей, активно влияют на ваше поведение и стиль игры. Чего, собственно, и хотелось бы добиться. А не просто дебильная система дебаффов, причем еще довольно незначительных.
  17. ArtemSH

    Рабочее I

    да, как предмет потом отдает их в диалоге
  18. ArtemSH

    Рабочее I

    Фрагмент из диалога. По квесту на игрока нападут бандиты, а после необходимо будет собрать их трупы и отдать начальнику местной полиции. Примечательно здесь то, что обьяснение, КАК собрать эти самые трупы, дается в иммерсивной и ненавязчивой манере. Я сам в восторге от такого подхода :))
  19. Это перевод статьи мододела 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
  20. Доброй ночи   прошу одобрить статью   https://tesall.club/tutorials/the-elder-scrolls-modding/modostroenie-oblivion/1769199520355-sozdaem-plagin-obse
  21. ArtemSH

    Мелочи здешнего ИИ

    вы о нем высокого мнения! :)) я сразу подумал, что он присматривается к новому месту работы на всякий случай :))
  22. ArtemSH

    Мелочи здешнего ИИ

    Из внезапного. Пока делал свой мод, недоумевал, почему у меня пропадала со стола рекламка Черного Леса. Дело в том, что перед одной из таверн находится пункт рекрутирования в наёмники Черного Леса, и на столике лежит соответствующий буклетик. И однажды я заметил, что как я не приду, его на месте нет. Я предположил, что он забаговался, и долго шаманил с его положением на столике. Может быть, он застрял в столе? - думал я. Так длилось...год! А в итоге я случайно обнаруживаю этот самый буклетик у главы местной полиции... Зачем и почему он вообще взял эту бумажку, мне неясно, но факт, конечно, примечательный :)))
  23. Что-то я перестал понимать один момент.... когда мы используем пакет ИИ и в нем в условиях видим свойство run on target - это к кому относится?   допустим, мой пакет ии содержит в себе условие "быть в интерьере", если условие не соблюдается - пакет сбрасывается. галочку на run on target для такого условия мы ставим или нет? это же касается НИПа, он в данном случае target? или эта настройка только на игрока действует?   я пытаюсь тут понять, почему мой добавленный через result script пакет ии тут же сбрасывается неписями, будто его и не было. ни evp, ни даже прописывание его прямо в момент игровой сессии никакого результата не дают, будто у такого пакета приоритет кратно ниже, чем у уже существующих пакетов неписей
  24.   вообще не понял, хде?
×
×
  • Создать...