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

Время "жизни" трупа NPC


Рекомендуемые сообщения

Суть задачи:

Сделать так, чтоб после некоторого разговора игрока с неким неписем А другого непися В кагбэ "ликвидировали". Но так, чтобы игрок впоследствии мог обнаружить труп непися В и тем самым продолжить квестовую ветку.

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

 

Как реализовано технически:

Есть A и B - некие NPC, изначально существующие в оригинале игры. Плагином добавлен непись В_dead - точная внешная копия В, но с нулевым уровнем здоровья. Изначально этот В_dead из игрового мира отключен командой Disable в стартовом скрипте плагина, чтоб не повстречаться игроку преждевременно.

В нужный момент, при разговоре игрока с неписем А на определенный топик, тут же, в поле Result этого диалога:

"B"->Disable

"B_dead"->Enable

..и соответствующая запись в журнале.

 

В чем проблема:

На первый взгляд, все, вроде бы, работает нормально - NPC В "пропадает", а "труп" его появляется в нужном месте. Но, если игрок бросится на поиски В не сразу, или не сразу это тело найдет... Короче, если с момента этого енейбла-дисейбла пройдет достаточно большое количество времени (несколько игровых суток, например), то найти мертвое тело непися В уже невозможно - В_dead просто не появляется в игровом мире...

А может так же происходит и просто при выходе из игры и повторной загрузке - не знаю, этого не тестировал еще...

 

Подозреваю, что трабл связан с тем, что сама игра, по проишествии некоторого времени "вычищает" из локаций тушки погибших неписей и существ, а В_dead со здоровьем 0 для нее как раз таким и является. Так ли это? Знающие, подскажите.

 

И главное - как исправить? Как с этим бороться?

Ссылка на комментарий
Поделиться на другие сайты

Убивай нпк при вхождении в локацию и не нужен будет никакой В_дед, просто локальный скрипт с условием журнальной записи о гибели нпк и cellchanged==1

if cellchanged == 0

return

endif

if journal "ID" == X

sethealth 0

Journal "X" 100

endif

end

Ссылка на комментарий
Поделиться на другие сайты

Убивай нпк при вхождении в локацию и не нужен будет никакой В_дед, просто локальный скрипт с условием журнальной записи о гибели нпк и cellchanged==1

 

не решает проблему с нежелательным преждевременным исчезновением тела мертвого NPC из игрового мира.

Если бы требуемый NPC при последующих загрузках локации каждый раз изначально грузился как живой (со здоровьем, установленным ему в редакторе) а убивался sethealth 0 в локальном скрипте на нем при каждом вхождении игрока в данную локацию, тогда да, согласен, это решение.

Но хотя бы единожды лишенный жизни NPC запоминается игрой как мертвый. Также фиксируется время когда был убит этот NPC. При последующих загрузках локации будет генериться уже мертвая тушка такого непися. И тело такого, "ненужного" с точки зрения игрового движка, NPC будет вычищено из игрового мира "за сроком давности" на общих основаниях. А именно - по прошествии fCorpseClearDelay (по умолчанию 72 игровых часа), если только игрок хотя бы раз за это время покинет локацию где расположен этот труп.

 

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

 

Первый способ - свойство Corpses Persist такого NPC. (Раньше видел в этой теме пост пользователя Муурн Шепард об этом - подсказка была дельная, удалили ее, по-моему, зря..)

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

Если впоследствии такое "неубираемое" тело все же нужно убрать с глаз долой, можно прибегнуть к ухищрениям. Например, скрипт, который проверяет некоторые условия - выполнил ли уже этот труп свою роль (в моем конкретном случае я проверял активировал ли хоть раз игрок тело этого В_dead, а раз активировал - значит и нашел). И, если да, если труп уже не нужен, то при выходе игрока из данной локации (тот же cellchanged==1) - скриптом же перемещаем это неубираемое тело в любое недосягаемое для игрока место. Как вариант - "похоронить" тело убиенного в буквальном смысле слова - запрятать его под текстуры...

 

Второй способ - применить SkipAnim в локальном скрипте на NPC.

На решение натолкнули примеры с использованием манекенов. Они, как известно, те же неписи, но с нулевым уровнем здоровья и отключенной анимацией.

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

Работает несколько странно, не совсем понятно для меня...

Так, например, если SkipAnim срабатывает сразу же, при старте локального скрипта на NPC, и крутится постоянно - все работает как нужно, тело NPC грузится каждый раз при загрузке локации. Но если SkipAnim в скрипте включен не сразу, если, например, отсрочить это действие на несколько секунд чтоб дать NPC естественным образом упасть - это уже обычный труп, со временем он вычистится игрой на общих правилах.

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

Но, как вариант, это тоже решение.

Учитываем также, что при таком способе решения, поскольку вся анимация для NPC будет отключена, нужное положение его тела в пространстве следует задавать заранее, в редакторе при создании этого NPC.

Ссылка на комментарий
Поделиться на другие сайты

Ну оживляйте тогда его при смене локации resurect вроде команда. Т.е. вошли в локацию - убиваем его, вышли - воскрешаем и так до того момента, пока не будет журнальной записи. Или как вам Шепард подсказал, только с disable и setdelete, когда он вам более не нужен. Изменено пользователем mortuus
Ссылка на комментарий
Поделиться на другие сайты

Ну оживляйте тогда его при смене локации resurect вроде команда. Т.е. вошли в локацию - убиваем его, вышли - воскрешаем

Тоже вариант, не спорю. Пробовал так.

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

Но, в общем случае, с таким решением задачи согласен. Это тоже один из способов продлить "время жизни трупа" NPC в игре.

Ссылка на комментарий
Поделиться на другие сайты

Но хотя бы единожды лишенный жизни NPC запоминается игрой как мертвый. Также фиксируется время когда был убит этот NPC. При последующих загрузках локации будет генериться уже мертвая тушка такого непися. И тело такого, "ненужного" с точки зрения игрового движка, NPC будет вычищено из игрового мира "за сроком давности" на общих основаниях. А именно - по прошествии fCorpseClearDelay (по умолчанию 72 игровых часа), если только игрок хотя бы раз за это время покинет локацию где расположен этот труп.
То есть проблема в том, что игрок может зайти в локацию, сразу же из нее выйти, и прийти потом только через несколько дней, когда искомый труп уже исчезнет?

 

А по логике квеста, труп должен быть уже остывший, или допустим, может испустить дух прямо на глазах у игрока? Тогда можно сделать, например, так - установить ему в ноль не здоровье, а усталось - тогда непись будет просто валяться в отлключке на полу, а когда игрок его увидит и подойдет поближе, (GetDistance сколько-то там), установить SetHealth 0.

 

И, если да, если труп уже не нужен, то при выходе игрока из данной локации (тот же cellchanged==1) - скриптом же перемещаем это неубираемое тело в любое недосягаемое для игрока место. Как вариант - "похоронить" тело убиенного в буквальном смысле слова - запрятать его под текстуры...
Disable\SetDelete на неписей с Corpses Persist не работают разве? Изменено пользователем Dun Dram
Ссылка на комментарий
Поделиться на другие сайты

То есть проблема в том, что игрок может зайти в локацию, сразу же из нее выйти, и прийти потом только через несколько дней, когда искомый труп уже исчезнет?

Именно так.

А по логике квеста, труп должен быть уже остывший, или допустим, может испустить дух прямо на глазах у игрока?

Игрок не должен видеть как умирает этот непись. Он убран со своего привычного маршрута шатания по локации и убийцы даже постарались замести следы - спрятать тело. Хотя место куда он "спрятан" все равно наблюдается при выходе из некоторых интерьеров, потому и отказался я от resurect.

Disable\SetDelete на неписей с Corpses Persist не работают разве?

Работают. И именно так и нужно. Поскольку проще и без извращений. Спасибо за подсказку. С запрятыванием за текстуры это я уже перемудрил :scratch:

Изменено пользователем xeLmen
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...