Я немного устал чинить чужие сохраненные игры, поэтому в этой статье расскажу, как самостоятельно исправить некоторые скриптовые баги в Skyrim.

Кроме того, статья будет полезна моддерам, чтобы понять, как работает игра, и избежать популярных ошибок.

Не путать с вылетами на рабочий стол!

Сразу заявляю, что я не буду отвечать на наивные комментарии вида «Я просто делаю чистку с помощью SaveTool, и у меня все прекрасно». Искренне надеюсь, что вы не столкнетесь с ситуацией, когда SaveTool окажется бесполезной. Но если столкнетесь, вспомните про эту статью.

Я понимаю, что единицы на сайте знакомы с такими терминами из программирования, как «указатель», «инструкция» и т.д., поэтому начну с самых основ.

Как чтение статьи, так и исправление сохраненок, требует от пользователя умения и желания ДУМАТЬ. Но я считаю, что с этим проблем нет, так как «нужда заставит». Перспектива потерять 600-часовое сохранение и начать все заново кого угодно заставит пошевелить извилинами.

НЕ РАБОТАЕТ СЕТЬ В ТВ БОКСЕ? НЕ ПОДКЛЮЧАЕТ WI-FI? МАКСИМАЛЬНО РЕШАЕМ ПРОБЛЕМУ

Кроме того, я кажется где-то слышал, что все жалуются, будто паззлы в Skyrim — недостаточно сложные? ) Что ж, вы можете воспринимать свою проблему как достойную головоломку

Чтобы упросить вам задачу, я специально пометил места в статье, где пользователю придется ДУМАТЬ самостоятельно.

Что такое скрипт?

Скрипт в Skyrim — это программа, написанная на интерпретируемом языке, которая расширяет функционал объектов в игре.

Тело скрипта, которое как раз вносит функционал, реагирует на игровые события и содержит всю полезную нагрузку, состоит из инструкций (набор инструкций еще называют байткодом). Тело получается из исходного кода путем компиляции (например, из CreationKit). ВСЕ скрипты, которые поставляются вместе с модами (не важно, в архиве они или нет), идут в форме скомпилированного байткода.

Как и любая другая программа, скрипт должен обладать памятью. Переменные (свойства) скрипта составляют его долгосрочную память. Переменные могут хранить числа, а могут хранить идентификаторы других скриптов для связи с ними (переменные, которые хранят ID других скриптов, называются «указателями»).

Как скрипты пишутся в сохраненную игру?

Упрощенно, игра записывает в сейв нити (как часть Стекфреймов) и сущности.

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

Сущность — это долгосрочная память скрипта. Каждый объект связан со своей скриптовой сущностью.

Например, если у вас два одинаковых манекена в доме, то у вас будет две скриптовых сущности (каждая из которых привязана к своему манекену). Если вы активируете и добавите предмет в инвентарь, скриптовая сущность соответствующего манекена обработает событие и изменит свою память. Она будет помнить, что за объект находится в соответствующем слоте. Каждый раз, когда вы заходите в дом, скрипт надевает данный кусок брони на манекена.

Но класс скрипта — один на все манекены (все манекены обрабатываются одинаково).

Итак, баги скриптов бывают двух типов :

Баг в самой логике скрипта (теле). В этом случае, надо пинать автора мода. Сами вы проблему не решите. После исправления, достаточно обновиться до новой версии мода.

Баг, связанный с неправильной памятью скриптовой сущности (т.е. неправильным значением какой-либо переменной). При этом в оригинальном моде никаких багов нет. В этом случае, пинать автора бесполезно (и даже вредно), т.к. проблема ТОЛЬКО в вашем сохранении.

«Как такое может быть» — спросите вы? Дело в том, что доступ к памяти скриптов ничем не ограничен. Любой скрипт из любого мода может изменить переменные скрипта из другого мода, игра не запрещает этого делать.

Читайте также:  Как установить creation kit для Skyrim пиратка

Обычно, такое возникает, если разные скрипты из разных модов переписывают память одних и тех же ванильных скриптов. Каждый мод тянет одеяло на свою сторону, в результате чего возникает конфликт, и что-то в игре перестает работать.

Также в некоторых ситуациях, игре не удается правильно заполнить значения указателей. Это может, например, возникнуть из-за хаотичной смены версий мода.

Например, вы обновили мод до версии 2. Вам не понравилось — вы откатились до версии 1. Все хорошо, используются скрипты 1-ой версии, но память-то осталась от второй версии! Автор мода мог что-то поменять в структурах данных, сущности в вашем сохранении обновились, и память скриптов изменилась. Значения существующих скриптовых переменных НЕ меняются со сменой версии мода.

Если что-то работает не так, как ожидается — скорее всего сбросились какие-то числовые параметры.

Но чаще что-то просто не работает. Например, предметы не активируются . В чем может быть причина?

Помните, я выше писал про «указатели» ? Указатель — это переменная, которая связывает одну скриптовую сущность с другой (хранит числовой идентификатор этой другой сущности). Зачем это вообще нужно?

В случае с манекенами, всю работу делает один скрипт. Одного скрипта достаточно для отслеживать броню и одевать ее на манекена.

Но в случае каких-то сложных квестов одного скрипта никогда не бывает достаточно. Работает сеть взаимосвязанных скриптов. Каждый из этих скриптов выполняет свою часть работы. Когда ему что-то нужно от другого скрипта, он посылает ему «сообщения» (вызывает функции этого скрипта). Но чтобы послать скрипту сообщения, он должен знать его идентификатор.

Для этого как раз и существуют «указатели». Они связывают скрипты друг с другом, чтобы те могли взаимодейстWowать.

Что произойдет, если указатель потеряет свое значение по причинам, описанным выше? Связь оборвется, скрипты не смогут взаимодейстWowать друг с другом. Одни скрипты не будут отправлять сообщения, а другие не будут их получать, в результате — какая-то часть работы не будет выполнена (что вы, собственно, и наблюдаете в игре).

Итак, мы знаем — чтобы восстановить работоспособность скриптов в этом случае, достаточно восстановить связи между скриптовыми сущностями. Как это сделать?

Если память скрипта не содержит ничего важного, можно попробовать просто удалить сущность. Для этого подойдет как SaveTool, так и Papyrus Data Transfer (Script Scalpel). Вы должны определить имя скрипта и вручную указать его.

Когда игра загружает отредактированный сейв, она видит, что что-то не сходится — сущности больше нет, хотя она должна быть привязана к объекту в игре (согласно информации в файле плагина .esp). После чего, игра восстанавливает скриптовую сущность с памятью по умолчанию (все переменные будут содержать те значения, которые изначально указал моддер). Это как раз и решает нашу проблему в большинстве случаев, т.к. изначально скрипты связаны друг с другом.

Но что если память скрипта хранит важные данные, например, о прохождении квеста? При удалении, игра забудет эти данные, и игрок не сможет завершить квест. Или к примеру, моддер не заполняет значения изначально, и пишет скрипт, который выставит их при определенном событии. В этом случае — удаление скрипта не является решением.

Восстановление связей вручную

SaveTool не умеет редактировать переменные, поэтому потребуется скачать Papyrus Data Transfer.

Рассмотрим реальный случай, когда игрок не может снять печать и освободить Серану из гроба (Жаровни не вообще никак не реагируют, когда их активируют).

В первую очередь, нужно понять, что за скрипт привязан к активатору «Жаровня». Если подумать , то можно понять, что в английской версии активаторы носят название Brazier, поэтому попробуем просто загрузить секцию в PDT и поискать скрипты с таким названием на вкладке «Скриптовые данные» (используйте строку поиска внизу). В случаях, когда название активатора не совпадает с названием скрипта, можно открыть CreationKit, найти активатор и посмотреть, какой конкретно скрипт к нему привязан.

Читайте также:  Кто такой Скайрим милана

Успех! Мы нашли класс DLC1VQ01PuzzleBrazierScript.

Посмотрим на одну из сущностей. Опасения подтвердились, видим два указателя (Pointer), которые содержат значение 0 (то есть не указывают ни на один из скриптов).

Всего в сохранении 5 сущностей DLC1VQ01PuzzleBrazierScript (очевидно, потому что в загадке используется 5 жаровней). Видим, что у каждой из них имеется данная проблема.

Из названий (mainScript — «Главный Скрипт» и puzzleController) можно логически догадаться, что это ненормально, они ДОЛЖНЫ на что-то указывать, чтобы вся схема работала.

Теперь нужно подумать и догадаться, ID каких конкретно скриптов эти переменные должны содержать.

У mainScript стоит тип скрипта DLC1VQ01PuzzleController. Попробуем вбить это название в поиск и посмотреть, что за скрипты есть с таким классом. Видим одну единственную сущность.

Очевидно, у нас просто нет никаких других вариантов. Все переменные mainScript с типом данных DLC1VQ01PuzzleController должны указывать на данную сущность.

Но у нас остается переменная puzzleController, логика подсказывает (да, в этом месте надо подумать), что она также должна указывать на DLC1VQ01PuzzleController (зачем авторы это сделали, непонятно. но скорее всего, переменная с этим именем была добавлена неофициальным патчем). Чтобы окончательно убедиться, давайте попробуем найти такую переменную в другом скрипте.

Из названия класса и переменных DLC1VQ01PuzzleController, следует, что это скрипт, который управляет головоломкой. В нем должны быть ссылки на другие скрипты, которые задейстWowаны в паззле.

Ага, видим скрипт, связанный с кнопкой DLC1VQ01PuzzleButtonScript. Двойной щелчок и мы попадаем на сущность. Граф зависимостей подтверждает нашу гипотезу: puzzleController должен указывать на DLC1VQ01PuzzleController.

Давайте подумаем и посмотрим, какие еще скрипты головоломки лишены связей. Возвращаемся к DLC1VQ01PuzzleController. С кнопкой все нормально. Кроме кнопки и жаровней, у нас есть еще скрипт Гроба. Двойной щелчок на указателе puzzleCoffin и мы попадаем на скрипт DLC1VQ01PuzzleCoffinScript.

Видим, что он страдает той же проблемой, что и Brazier. mainScript ни на что не указывает. Кроме того, видим указатель Serana (очевидно, должен указывать на скрипт Сераны), который тоже пустой!

Итого, у нас есть 6 скриптов с пустыми указателями. 5 жаровней, каждая из которых содержит по два указателя с нулевым значением. И скрипт гроба, который содержит два пустых указателя (один должен быть связан с Сераной, другой — с контроллером головоломки).

Для начала нужно сделать фильтр, который подскажет инструменту, какие именно переменные можно менять.

Идем в DLC1VQ01PuzzleCoffinScript. Правой кнопкой мыши по mainScript — инструмент добавит переменную в фильтр.

Аналогично поступаем DLC1VQ01PuzzleBrazierScript (достаточно сделать для одной жаровни).

Далее, мы должны выбрать скрипт, на которые переменные должны указывать. Идем на DLC1VQ01PuzzleController и встаем на заголовок (который содержит ScriptID).

Далее выбираем опцию «Значение Переменной» (Set Variables).

Видим такое окно:

Инструмент автоматически заполнил ID скрипта и фильтр (оба значения можно теперь поменять вручную). Помните, что мы построили фильтр только для одной жаровни? Если сейчас подумать , то можно понять, что при нажатии на кнопку «Изменить», исправится только 1 жаровня из 5.

Нам нужен фильтр, который охватит ВСЕ 5 сущностей (т.е. весь класс). Для этого достаточно убрать RefID из фильтра. Вот так это будет выглядеть:

Нажимаем «Изменить». Переменные mainScript теперь содержат верное значение. В логе можно увидеть, что операция затронула 6 переменных.

Аналогично действуем с puzzleController

Итак, у нас остается пустой указатель на Серану. Но как узнать ее скрипт? Можно подумать и поискать похожий указатель где-нибудь по соседству. Далеко ходить не пришлось — если выйти обратно в контроллер головоломки, можно увидеть переменную SeranaRef

Двойной щелчок, и инструмент переносит нас на скрипт DLC1SeranaLevelingScript, видим, что скрипты из других модов и ресурсов тоже ссылаются на него как на Серану, а значит — это наш клиент.

Читайте также:  Что такое ректификатор Скайрим

Указатель на Серану в скрипте DLC1VQ01PuzzleCoffinScript выставляется аналогично:

Связи восстановлены, теперь скрипты могут снова взаимодейстWowать между собой.

Загружаем игру — баг исчез, жаровни двигаются!
Серана спасена!

Если загрузить новое сохранение в PDT, можно четко увидеть различия на графе зависимостей

Связи скрипта Жаровни, до и после:

Связи скрипта Гроба, до и после:

Более подробно про редактирование переменных можно посмотреть на видео:

Спасибо за внимание!

—>Всего комментариев : 21

Источник: modgames.net

Невиданнный ранее текстурный баг


Фотография

Всем привет. Друзья, помогите, за все 7 лет игры первый раз такой баг возник. В один прекрасный момент зашел в зал коллегии — от 3-его лица пропал, не видно персонажа, от 1-ого уровень глаз находится на границе между полом и пустотой под ним, персонаж не двигается, не реагирует, тупо исчезает. Если смотреть от 1лица вверх, то можно разговаривать с нпс, которые достаточно близко.

Причем если заходить и выходить в дверь через которую зашел — , эффект остается и гг зависает в полу. Если загрузить сохранение, когда ты завис — ты все еще в полу, не можешь двигаться. Если загружаешь сейф до этого — все в порядке. Причем фаст тревел по открытым территориям работает, спокойно бегаешь, более того, когда заходишь в пещеры — все в порядке.

Этот бак возникает тогда, когда я вхожу в какое-либо помещение через дверь. Заходишь — и ты в полу, не можешь двигаться. TCL не помогает, крики не работают, перс как будто перестаёт функционировать. Причём, насколько я могу судить, весь остальной мир при этом работает совершенно стабильно. Что делать ума не приложу, и проблемы такой нигде ни у кого найти не смог.

Подскажите Пожалуйста) Так же не думаю, что это связано с модами, так как с той сборкой которые есть играл довольно долго, баг произошёл внезапно, никаких модов при этом не устанавливал/удалял. Как только это залипание сработало на первой двери — подобный баг начал возникать при вхождении в любые помещения через дверь со всех сохранений конкретно этого персонажа. В сохранениях других персонажей все работает стабильно.

Не думаю, что характеристики пк важны: играл как всегда, ничего особенного, это не связано с железом.

  • Авторизуйтесь для ответа в теме

Сообщений в теме: 2

#2 Пакость

Отправлено 21 сентября 2018 — 23:44

отрубай моды пока не найдёшь то что загоняет твоего ГГ в пол.
Причём учитывая подозрения на глюк скрипта — если не поможет и выкл. всё — не просто отключай esp-шки в мод-менеджере а физически деинсталируй моды из игры чтоб в корне пресечь работу их скриптов.

#3 Kai_Mercer

Отправлено 22 сентября 2018 — 08:40

отрубай моды пока не найдёшь то что загоняет твоего ГГ в пол.
Причём учитывая подозрения на глюк скрипта — если не поможет и выкл. всё — не просто отключай esp-шки в мод-менеджере а физически деинсталируй моды из игры чтоб в корне пресечь работу их скриптов.

Спасибо друг, но уже справился: неизвестным мне образом и по непонятной причине при проходе в дверь устанавливало размер персонажа на 0, вследствие чего он фактически исчезал в текстурах. Решить смог с помощью консольной команды player.setscale 1, причём проблема ушла — никакие двери снова гг не уменьшают. Творческий успех)

Источник: tesall.ru

В скайриме не работает команда tcl ( может я чё то неправильно делаю ? ) Не робит команда tcl

а у тебя квадратиками пишет? По поводу квадратов — единственный рабочий способ следующий. Открываем текстовый файл SkyrimDataInterfacefontconfig.txt Изменяем строчку шрифта в консоли на map «$ConsoleFont» = «FuturaTCYLigCon» Normal Тогда квадраты исчезают и будут работать коды

Источник: mmo-db.com