XaiJu
DogmaMods
DogmaMods

patreon


Отчет 6

Я закончил наконец с Виндхельмом. Внес еще несколько незапланированных улучшений. Из важного, переработал структуру связанную с тренировками. Там раньше было не очень удобно, если выбирали что-то до того, как была назначена цена, надо было вручную переходить в цены, договариваться, потом снова говорить о тренировке и выбирать нужную. Теперь, во-первых, в диалогах сразу будет отображаться цена, и будет понятно, о каких мы уже договорились, во-вторых, если все же выбрать не оговоренный пункт, диалог сразу перейдет в предложение цены, а по завершении, если согласимся, или выберем торг и договоримся, сразу запустится сцена с выбранной изначально тренировкой. Плюс, теперь можно будет договориться сразу о единой цене на все тренировки. Это потребовало полной перестройки всей структуры, но оно того стоило, диалоги стали гораздо удобнее. Еще убрал блок тренировки, если мы не забрали золото за последнюю, теперь монеты там будут просто суммироваться в мешочке, и можно будет их в любой момент забрать.

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

Я также сделал начало для квеста на редкие страницы, пока только диалог вступительный, но уже будет приблизительно понятно, о чем этот квест. Он начнет развиваться ближе к событиям Солитьюда, тогда и займусь им. Этот квест затриггерит страница друида, она единственная не использовалась в тренировках, по понятным причинам. Так что я решил, будет логично убрать ее из базовых страниц и добавить в редкие.

Сейчас занимаюсь "горячими источниками". Много пока не успел сделать, потому что на этой неделе несколько дней потратил на решение давней проблемы с вылетами во время сцен Лиорела.

Можете пропустить текст ниже и перейти к последнему абзацу, если вам не интересно читать об этой проблеме, или же вы играете не на LE версии игры, там это неактуально.

Думаю, многие из вас сталкивались с тем, что во время окончания сцены, в момент, когда игрок должен быть откреплен от координат, обычно после затемнения, происходит вылет на рабочий стол. Иногда просто игра закрывается, а иногда с ошибкой вызова чистой виртуальной функции. Скажу оговорюсь, это проблема только LE версии игры, и на SE вроде как это исправлено на уровне движка. Если у вас были вылеты и на SE - дайте знать.

Основная проблема была в том, что эта ошибка проявлялась не всегда и, как правило, вылет происходил при первом запуске сцены, а после загрузки сцена проходила всегда нормально. Что не давало мне возможности найти причину. К тому же, это случалось не во всех сценах, а только в некоторых, чаще всего на кресле. Такая же ситуация была и на складе, в Тихолесье. Учитывая, что обе комнаты небольшого размера, я связывал это с какими-то особенностями ячеек, или объектами в них, и искал проблему в этом ключе.

И вот, уже заканчивая с тестированием Виндхельма, мне наконец удалось получить сохранение со 100% вылетом по завершении сцены. Так что я оставил сразу все дела и начал расследование. Тем более, что вылеты участились, и эту проблему оставлять нельзя было. Спустя время обнаружил, что виной всему стандартная игровая функция setscale(), которая устанавливает рост персонажа. Потом я загуглил и оказалось, что это не только моя проблема, а достаточно распространенная, и у sexlab она была, правда не знаю решили ли ее там, и если да, то каким образом. Об этом и на вики пишется, что при повторных вызовах в короткий промежуток времени, может случиться вылет, там вроде происходит состояние гонки. Припоминаю, что когда-то я уже об этом читал, и для проверки запускал цикл на тысячи повторений, но никаких вылетов не последовало, подумал, что уже исправил в новых версиях игры. Сейчас тоже проверил, и тоже ничего. Проблема явно в вызове функции, но есть еще что-то, какой-то дополнительный фактор, к тому же, проблемы есть только в нескольких местах мода, а во всех остальных работает без нареканий.

Сперва я обрадовался, когда нашел проблему. Но, проковырявшись с ней пару дней, оказалось, что по сути, проблема не имеет решения, и сейчас объясню почему. Я перепробовал буквально все, что знал. Вылет происходит в любом случае, когда скрипт доходит до вызова этой функции. При чем, если я сам ее применю, через консоль, или же из другого скрипта, то никакого вылета не последует. Я специально в момент, когда должна запуститься эта функция, добавил большую задержку, чтобы успеть провести различные проверки. Любые мои манипуляци со scale в этот момент не приводят к вылету, но как только скрипт просыпается и доходит до этой строки то игра сразу же вылетает, даже если вызов будет не напрямую в скрипте, а по ссылке из другого. Более того, я создал вообще несвязанный никаким образом скрипт в отдельном объекте, и ловил там вызов через событийную систему. И тоже вылет. При чем, если я посылаю событие в этот скрипт вручную, или из другого скрипта, то все норм. В общем, это какая-то особая магия Скайрима, которую мне вряд ли удастся разгадать.

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

Изначально, зачем вообще применять этот setscale? Ну очевидно, для выравнивания персонажей во время анимации. И тут три больших проблемы:

1) Собственно, сами функции getscale, setscale. Они оперируют разными значениями. Первая возвращает размер с учетом модификатора расы (реальный рост в игре), вторая принимает значение без. Если, к примеру, я хочу выровнять персонажей во время сцены до значения 1.0, и пропишу на норде и на темном эльфе setscale(1.0), то норд будет ростом 1.03, а эльф 1.0 так как у второго отсутствует модификатор расы, вернее равен исходному.

2) Модификатор роста рас нельзя узнать в скриптах, кроме как путем применения setscale с разными значениями и вычислению коэффициента, с помощью которого можно будет найти значение для подстановки в setscale. Из-за этого, в начале работы скрипта получается тройное применение setscale. Я, конечно, запоминаю этот коэффициент для каждой отдельной расы для дальнейших вызовов, но при первом запуске незнакомой расы, все равно его надо вычислять (можно было бы заранее объявить переменные с заранее вычисленными значениями, игнорируя тот факт, что кто-то может установить мод с измененными модификаторами или кастомной расой, что потом грозит сломать рост персонажей, но все равно ничего это не даст, я проверял с уже заранее кешированным коофициентом, вылет все равно случился).

3) Функция, которая закрепляет персонажа на координаты, не давая коллизиям их расталкивать. Она ломает getscale и сбрасывает скейл персонажа до его базового. Я фактически из-за этого не могу узнать правильно ли выровнен персонаж, пока не применю setscale чтобы восстановить работу этой функции.

То-есть, применять setscale по любому надо, и до (если еще не вычислен модификатор расы) и во время, и после, чтобы вернуть персонажа к исходному росту. Вылет происходит на последнем этапе, и в отдельных случаях, можно было бы не применять setscale, если бы рост персонажа уже был исходным, но я не могу этого знать, ведь getscale в этот момент сломана, ее как раз и должен починить этот последний вызов setscale. То-есть, тут обложили со всех сторон.

Скейл для меня всегда был большой головной болью, кто помнит ранние версии мода, то я долгое время не мог избавиться от постепенного роста или уменьшения персонажей, или они вообще пропадали. И когда я думал, что наконец победил его, вот он наносит ответный удар :)

По сути, есть только два варианта чтобы избежать вылета:

1) Банально - отключить выравнивание персонажей. Но тогда части тела персонажей в большинстве анимаций не будут совпадать. Не думаю, что это адекватно, учитывая, что вылет только в нескольких местах.

2) Более предпочтительный, и тот, что я уже реализовал для выбора в MCM меню, но подойдет не всем. Отключить выравнивание только на игроке. Опытным путем я установил, что вылет из-за применения на нпц не происходит, но я еще недостаточно много тестов провел, так что наверняка сказать пока не могу. И тут можно даже сохранить выравнивание в сценах, но с оговоркой. Во-первых, рост по умолчанию должен быть 1.0, по этому я и сказал, что не всем подойдет. Ведь если он будет отличаться, функция его сломает и придется через консоль постоянно менять после сцен. Во-вторых, вы должны будете установить в MCM меню пункт, отвечающий за рост персонажей во время сцен, равным росту вашего персонажа с учетом модификатора расы. Например, если вы играете нордом, то это 1.03 (это значение стоит там по умолчанию). Как узнать: можно просто прописать в консоли player.getscale, вы получите что-то вроде getscale >> 1.0 (with base 1.03), это будет означать, что рост вашего персонажа по умолчанию 1.0 и с модификатором роста 1.03 - реальный рост в игре. Таким образом, скейлить вашего персонажа просто нет надобности.

Решения для скейла отличного от 1.0 пока что нет. Разве что отключить выравнивание на игроке во время сцен с Лиорелом, и затем его снова включить исправив scale через консоль, если сломается, введя setscale на вашем персонаже и установить нужный. Ну либо ничего не делать и смириться с этими вылетами. Или играть на SE\AE, где этой проблемы вроде как нет.

Пока что других решений я не вижу, буду искать новые идеи.

Что касается горячих источников: я хочу закончить их за следующую неделю. К прошлым планам добавилась только пара альтернативных вариантов прохождения, которые позволят пройти без сцен. Я забыл, что там этого нет, кроме как выиграть с первого же раза. И хотя мини-игра лишена случайности, но все равно, за полноценный вариант считать это не правильно. И у меня есть пара идей для простеньких альтернатив, в основном это завязано на диалогах.

И как всегда, огромное спасибо за вашу поддержку!

Comments

Спасибо, исправлю к будущему обновлению.

Dogma

Привет! Спасибо, я рад что тебе нравится моя работа. Там есть сцена между героиней и Толганом, если отослать Толгана на "Сладкую горку" спустя час, после того как Риси придет на место встречи, то-есть, она уже должна оттуда уйти. Но это не та же самая сцена, что между Толганом и Риси. Насчет твоего предложения - я подумаю.

Dogma

Привет! Спасибо за предложение. Я подумаю над этим.

Dogma

Author, can you design some plotlines? For example, the protagonist returns to Jinglin Village to continue serving as the village head. A challenger emerges to contest the protagonist's position. The protagonist resorts to certain tactics to maintain their role. Or perhaps the protagonist leads a peaceful, retirement-like life in Jinglin Village.

管理员

Здравствуйте! Этот текст переведен DeepL Спасибо, что позволили мне насладиться этим модом! У меня есть очень любимая сцена в Silentwood: после сцены, где Толган и Ризи встречаются в Sweet Hill, когда они возвращаются спустя больше времени, чем планировалось, это сцена жесткого секса в стиле догги-стайл. Можно ли увидеть эту сцену в Dragonborn? Может быть, ее уже можно увидеть где-то еще? Если этой сцены не существует, и вы чувствуете вдохновение добавить новые сцены в Silentwood, как насчет сюжетной линии, где, например, Драконорожденные становятся свидетелями того, как РИСИ так сильно трахает толгана, что она ошеломлена и думает, что это завидно? Простите, если мое мнение вас обидело. Я играю в этот мод уже несколько месяцев и до сих пор не смог пройти все сцены. Для меня это не стресс, а умопомрачительное приключение. В это время года слишком холодно, так что, пожалуйста, держи тепло, Догма.

Karmaslave

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

Makson1


More Creators