Делаем мод на спавн врагов скриптами в Fallout 4 - часть 6 - работаем через скрипты со сном
Сказано - сделано, буквально присела и минут за 10 реализовала спавн противников на локации после сна персонажа игрока. В этот раз кратко покажу, как регистрировать события сна в скрипте и как переводить внутриигровой таймер в игровые часы.
Предыдущая статья:
Регистрируем сон, получаем часы
Добавим переменную SleepTime типа Float (нецелое число), в которой будем хранить внутриигровой счетчик времени в начале сна. Отмечу, что запись регистрации событий сна нетипична, она регистрирует сразу два события (начало и конец сна) одной строчкой.
В событии OnPlayerSleepStart (начало сна) запоминаем встроенную переменную afSleepStartTime (время начала сна) в нашу переменную SleepTime.
Другая встроенная переменная afDesiredSleepEndTime для наших целей не подходит. Она содержит желаемое время сна, что указывает игрок, но оно может отличаться от фактического, ведь сон на спальниках ограничен в режиме выживания.
В событии конца сна OnPlayerSleepStop нет встроенной переменной времени, поэтому извлекаем его напрямую обращаясь к игре командой Utility.GetCurrentGameTime(). Вычитаем из него сохраненное время начала сна в переменной SleepTime и умножаем полученное число на 25 (его я вывела экспериментально). Так мы получим время сна персонажа во внутриигровых часах.
Такие вычисления нужны, потому что игровое время движется быстрее реального.
1 игровой час примерно равен 3 минутам реального времени.
Добавляем спавн после сна
Задумка такая: мы можем отдельной настройкой в меню МСМ включать и отключать спавн враждебных существ на зачищенной локации после сна игрока на ней в кроватях. Отдельной настройкой указываем шанс спавна от 0 до 100%. И еще одной настройкой добавляем переключатель рассчета вероятности спавна от количества проспанных часов.
Например, спим 3 часа, а вероятность стоит 10%, тогда итоговый шанс спавна будет равен 3 * 10 = 30%.
Добавим переменные для настройки спавна:
- setAfterSleepSpawn (ВКЛ/ВЫКЛ) - разрешать спавн после сна
- setAfterSleepHourSpawn (ВКЛ/ВЫКЛ) - рассчитывать спавн по времени сна
- setAfterSleepChanceToSpawn (от 0 до 100) - вероятность спавна после сна
Расписываем событие окончания сна, внося в него проверки, аналогичные обычному спавну из первых уроков сери. Проверяем, что включена настройка setAfterSleepSpawn, что локация подходит под спавн SpawnerEligibleLoc и что локация зачищена CurrentLocation.IsCleared().
Внутри проверяем, включена ли настройка учета длительности setAfterSleepHourSpawn и, исходя из нее, решаем как будет рассчитываться шанс спавна (из двух вариантов). Если они прокают, то вызываем доработанную функцию SpawnActors() из предыдущего урока.
В почасовом режиме при проверке шанса умножаем время сна на вероятность сна вычислением SleepTime*setAfterSleepChanceToSpawn и сравниваем с рандомным числом в переменной chance (напоминаю, что команда Utility.RandomInt() возвращает число от 0 до 100).
Вот и весь алгоритм. Я уже проверила, все работает. Дальше, наверное, можно сделать систему параллельного спавна нескольких групп существ и смены их поведения после приближения к маркеру цели.
На данный момент у нас только один Alias Collection, а потому при каждом повторном спавне предыдущая группа перестает двигаться. Это нужно доработать и добавить систему из нескольких сторонних квестов спавна, которые будут запускаться из основного.