Гайд от Arthmoor, посвященный работе с постоянными референсами при создании патча.

Этот гайд – продолжение гайда Создание Патча Совместимости. Если не прочли, то прочтите, чтобы знать базу.

В какой-то момент при создании патча совместимости вырастает проблема того, что делать с постоянными референсами (persistent objects).  Обычно все проблемы – из-за перемещения дверей из изначальной позиции в другую, чтобы встроить их в сделанные изменения. В рамках гайда мы будем работать именно с дверями. Но держите в уме, что всё, что мы сделаем, актуально для всех постоянных референсов (persistent references), видимых игроку.

Первое правило: НИКОГДА не сдвигать двери в новое место! Постоянные рефернсы навсегда вписываются в файл сохранения, едва игрок посетил область, где они расположены.

Второй правило: НИКОГДА не использовать скрипт, делающий ЛЮБЫЕ изменения с постоянными обьектами. Даже с целью их отключить (to disable). Каждый раз, когда скрипт вносит изменения, эти изменения навсегда записываются в файл сохранения. Включая и включение обьектов через включение родителя (enable parenting). Важно это запомнить, поскольку эти вещи не самоочевидны. Любые изменения с состоянием обьекта (to an enable state), сделанные скриптом, становятся постоянными.

Поскольку два наиболее удобных метода – вне списка, то остается изобретать велосипед.

Сперва отключите телепорт у двери. Главное, не забудьте куда именно она вела, какой был formID той двери прежде, чем вы её отсоедините от нашей.

Первый и наименее опасный метод: просто установить малюсенькие размеры двери. Наименьший размер в CS – 0,01. В основном этого хватит, чтобы рендерить её незаметно для наблюдателя, если двери не большие, как городские врата, к примеру.  Если после уменьшения двери не видно, то всё готово. Велик шанс, что её скроют другие обьекты вокруг, например, обьекты из мода, конфликтовавшего с модом двери. Это идеальная ситуация,поскольку вместо старой двери мы просто поставим новую, и дело с концом.

Второй метод: поставить флажок "initially disabled" оригинальной двери. В целом это рабочий вариант, но с нюансом. Если игрок перезагрузится, а не выйдет из игры, дверь может отрендериться, несмотря на опцию, из-за бага движка, возвращающего референсы к базовому, до-модовскому состоянию. Это особенно опасно, когда дело идет о дверях из оригинальной игры. Хотя в остальном этот метод гарантирует, что двери мы не увидим. Так что, если уменьшение размеров в пролете, можно попробовать этот метод.

Последний фокус изворотлив, но полезен в некоторых ситуациях, когда размеры не помогут, а отключение по каким-то причинам не работает. Поэтому если первые два – в пролете, попробуйте этот метод, как последнее прибежище.  Отключите флажок persistence у двери. Поставьте флажок "initially disabled". Установите координату Z на -30000. Как только игра загрузится, и игрок войдет в ячейку обьекта, игра поймет, что дверь больше не постоянный референс и его координата Z уберет обьект из поля зрения. Но у этого подхода есть недостаток. Если игрок перезагрузит игру без выхода из неё, то со сто процентной вероятностью дверь сбросит все изменения и вернется к первоначальному состоянию. Действие всё того же бага движка. Без применения OBSE обойти эту проблему нельзя.

Если ничего из вышеизложенного не помогает, то есть железный способ убрать дверь с глаз долой: удалить её. Надо быть ТОЧНО уверенным, что у двери отключен телепорт перед тем как делать это, иначе CS крашнется. Сохранитесь перед этим. Хоть метод поможет, но у него есть другая опасность в виде удаленного референса (deleted reference), запись о котором сохранится в файле нашего патча. Это может крашнуть игру, даже если другие моды не пытаются воздействовать на удаленный обьект. Обливион очень плохо воспринимает удаление постоянных обьектов, любых обьектов такого рода. Особенно дверей с телепортом. Риск краша довольно низок для дверей из модов, но НИКОГДА не нужно удалять двери из оригинальной игры – это приведет к ошибкам, вылетам и нестабильности при любом раскладе. Если дверь помечена как цель в квесте, если к ней привязан пакет ИИ, если скрипт на неё ссылается, то при попытке удалить эту дверь вылезет предупреждение. Если оно выскачило, остановитесь, выключите CS и НЕ сохраняйтесь, поскольку у CS есть баг: если отменить предупрждения любого рода, у двери, вызвавшей предупреждение, отключится телепорт. Мда-а-а, Бесезда.

Как только с дверью покончено, теперь самое легкое. Нужно поставить новую в отпатченной локации, и эта дверь будет вести к той же двери, к которой вела старая. Расположите новую дверь на нужном месте, убедитесь, что подключили её к правильной двери с правильным formID. Поправьте маркер телепорта, и затем проследуйте через телепорт к той двери, чтобы сделать то же самое с её маркером.

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

А теперь самое веселое. Сохраните патч, загрузите игру, убедитесь, что всё работает, как надо. Если всё хорошо, то релоцированная дверь покажется на локальной карте игрока и впишется в новое, отпатченное окружение.

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

Материал подготовлен ArtemSH специально для TGM — Tesall Game Magazine.
Переводчик: ArtSH
Автор: Arthmoor
Источник: Перейти
0

Комментарии

Авторизуйтесь, чтобы оставить новый комментарий. Или зарегистрируйтесь.