• Страница 1 из 2
  • 1
  • 2
  • »
Форум » Мастерская » В помощь картоделу » Скрипты » Аномалии (s.t.a.l.k.e.r.-style) (Набор скриптов, позволяющий использовать аномалии в миссиях)
Аномалии (s.t.a.l.k.e.r.-style)
def
Среда, 26.08.2015, 12:21
Пост №: 1
Внутри отряда TF мы начали отыгрывать ролеплей-игры в сеттинге Сталкер.
Вчера закончил первую версию аномалий, делюсь.

Обновлено 2015 09 15 (версия не финальная, as is)

Тестовая миссия в VR:
Версия для редактора.
Pbo для MP (чтобы посмотреть на аномалии вполне хватит, копируем в арму и запускаем миссию Anomaly на карте Виртуальная реальность).
пара диких картинок: http://prntscr.com/891m3http://prntscr.com/891mcr

Перенос на свою карту:
Чтобы перенести аномалии на свою карту:
  • 1. Копируем в папку своей миссии все файлы и папки из моей миссии:
  • - /functions
  • - /sound
  • - initServer.sqf
  • - init.sqf
  • - Description.ext
  • 2. Вставляем в своей миссии объект Игровая логика с именем VAR (служит для обмена переменными)
  • 3. Ставим куда хотим аномалии - аномалии это маркеры, имя которого не важно, а текст маркера должен быть из списка:
  • - Electra
  • - Jarka
  • - Myas
  • - Puh
  • - Gravy
  • 4. Проверяем, что при входе в аномалию она видна и ранит.

Особенности:

Скорость сетевой версии
Возможно, что при сетевой игре аномалии будут вести себя медленней, чем в VR, при большом кол-ве аномалий. В этом случае создатель миссии подкручивает таймер в init.sqf (строка 16) - ставим 0.4, 0.3 или 0.2. Данный таймер отвечает как за проверку "нужно ли отображать аномалии", так и за "нужно ли бить игрока", поэтому если поставить слишком маленькое значение, выбраться из аномалии будет не реально.

Детектор (не входит):

Для подключения детектора следует использовать цикл
Код
{ } forEach allMapMarkers;
в котором проверять является ли маркер маркером аномалии (хотя это лишние такты, если в миссии нет других маркеров кроме аномалий):
Пример:
Код
{
                if (markerPos _x distance Player <) then hint "beep"
} forEach tf_Anomalies;
более сложный пример:
Код
{
                scopeName "AnomalyBeep";
                if (markerPos _x distance Player < 3) then { hint "beep beep"; breakout "AnomalyBeep"; }
                else {                
                  if (markerPos _x distance Player < 7) then { hint "beep"; breakout "AnomalyBeep"; };
                };
} forEach tf_Anomalies;

Урон
Аномалии работают и по машинам тоже (в т.ч. подкидывающая "грави").

Урон и эффекты от действий аномалий можно подправить в файле /functions/Anomaly/fn_Ahit.sqf (ищем setDamage (для техники) и SetHitPointDamage и AGM-переменные (для пехоты) ).

Обнаружение и срабатывание
Дистанцию обнаружения и срабатывания можно подправить в файле /functions/Anomaly/fn_Aview.sqf (сейчас это 7м и 3м).

Сделано:
- переделано на поддержку dedicated,
- механизм обнаружения аномалий весь переведен на клиентскую часть.
- на серверной части только формируется первоначальный массив аномалий (чтобы убрать баг с возможность добавления аномалий на карту любым игроком через маркеры) и отработка скрытия неактивных аномалий.
- рефакторинг кода клиента и сервера (но не функций).
- теперь не поддерживаются боты.
- частично сломал реакцию на технику.
ToDo (в порядке приоритета):
- проверить как работает молния в мультиплеере в новой версии,
- проверить как работает с техникой теперь (будет бить машину тем сильней, чем больше в ней игроков, это не хорошо). Подумать как переделать.
- протестировать на 10 и больше игроков (с замером фпс клиента и сервера),
- Добавить еще несколько типов аномалий - посмотреть что было в сталкере. Примеры эффектов: слепота, навязчивый шум, изменение яркости\цвета экрана, перекос игрока (жестоко), потеря вещей (рандомной вещи?), телепорт (!), яркий луч света сигнализирующий о том, что кто-то вон там за холмом наступил на аномалию, и что все душе угодно.

- Отдельное тестирование на dedicated не проводилось, но должно работать без изменений (одна лишняя проверка ничего не значит. (переделано на поддержку dedicated)
- Тестирование основного цикла: при 1000 аномалий и 100 игроках\ботах. Если будет сильное падение быстродействия - подумать где можно подкрутить - к примеру, брать не allUnits, посмотреть как работают nearest* и пр. Вторая возможность это разделить циклы отображения\хитов и обнаружения -- цикл обнаружения раз в 30 секунд опрашивает все аномалии на предмет "нет ли рядом с ними игроков на определенном расстоянии, если есть, добавляет аномалию в массив потенциально активных аномалий", а цикл отображения\хитов проверяет только массив потенциально активных аномалий, а не все аномалии. Тоже самое можно сделать с игроками (1000 аномалий на 100 игроков дадут 100000 логических проверок за 1 цикл, это довольно много. (сюда же оптимизация детектора - опрашивать детектором нужно только потенциально активные аномалии, причем список этот можно вести не на сервере, а у игрока).
- Модификация размера аномалии (по размеру маркера). Для упрощения математики (и стало быть скорости работы сервера) лучше поступить как Морконтар - сделать аномалии только круговыми, благо движок аномалий позволяет (предположительно) делать их тысячами.
- Сделать зависимость урона от удаления от центра аномалии - в центре сильно, снаружи слабо, но тоже жалит, чтобы не стояли на краю аномалии.
- Сделать механизм озлобления аномалий - к примеру, если игрок стоит на границе с аномалией или даже за границей видимости аномалии, аномалия потихоньку зреет, становится злее (меняется градиент урона от удаления от центра - урон на краях становится все больше и больше). В этом случае для предотвращения случайной смерти от очень озлобленной аномалии следует использовать детектор.
- Добавить аномалии, закрывающие целые площади (поля аномалий) с отображением только в месте контакта игрока с полем, а не по центру аномалии. Таких полей не должно быть много, но это и не требуется (20-50 максимум, при условие что появятся еще большие круговые аномалии).   не буду делать.
- Рефакторинг кода - сейчас код во многих местах повторяется, где-то срабатывают лишние проверки, плохо с переносами, где правил на скорую руку.  выполнить рефакторинг кода функций (aview буду переделывать вместе с добавлением размера аномалий).
- Добавить проверку на сторонние моды, перерабатывающие урон (ваниль против agm, ace3).
- Подумать, есть ли смысл повреждать только конкретную деталь у машины.
- Доработать эффекты - сделать более красочными, в т.ч. реакция на смерть персонажа (?)

p.s. о багах можно писать в этой теме,
с радостью принимаются предложения по балансу урона, изменению звуков аномалий, изменению или добавлению визуальных эффектов (это нужнее всего).

thanx to
- визуальные эффекты частично взяты из мода аномалий за авторством SteelRat
- скрипт грави (в оригинале "карусель") взят из сталкер-миссии вог2 (DAP s.t.a.l.k.e.r.)
- советы и пинки [TF]Morkontar, [RMC]Chief,
- тестирование - отряд TF
- [STELS]Zealot - за миссии, где легко генерировать эффекты (см. ссылки) и его скрипты
Сообщение отредактировал def - Воскресенье, 20.09.2015, 04:46

Автор темы
 
def
Среда, 26.08.2015, 15:46
Пост №: 2
Потестировал на 300 аномалий х 180 игроков - неработоспособно, задержка по пол минуты на реакцию аномалии. 100 х 20 почти нормально. Указание на этот риск есть в todo, доделаю.
Пока пригодно либо для малого кол-ва аномалий, либо для малого кол-ва юнитов (к примеру в серверной проверке изменить foreach allUnits на foreach playableUnits, чтобы игра игнорировала ботов, либо на allPlayers, но тогда необходимо проверять жив ли игрок).
Сообщение отредактировал def - Среда, 26.08.2015, 15:47

Автор темы
 
Chief
Среда, 26.08.2015, 16:02
Пост №: 3
Круто, то что нужно было... кстати смотрел аномалии от SteelRat, но у меня знаний скриптов не хватило визуальные эффекты оттуда выпилить.
 
def
Среда, 26.08.2015, 19:58
Пост №: 4
Цитата Chief ()
то что нужно было
Подожди пару дней - оптимизируем, выложу новую версию.
Точнее как - расставлять аномалии, тестировать и пр. можно без проблем, просто будут затруднения при большом числе аномалий и игроков. Это будет исправлено в ближайшие дни. Дальше будет достаточно заменить initServer и возможно /functions в папке миссии на новые и вуаля.
Сообщение отредактировал def - Четверг, 27.08.2015, 00:44

Автор темы
 
Wiz
Четверг, 27.08.2015, 16:53
Пост №: 5
А мод болта который аномалии выявляет будет?
 
JMax
Четверг, 27.08.2015, 17:01
Пост №: 6
Пользователь
Одиночка
Цитата
А мод болта который аномалии выявляет будет?
Это нужно как гранаты делать, но с другим эффектом, по идее...

 
DrSl1m
Четверг, 27.08.2015, 17:39
Пост №: 7
Цитата JMax ()
Это нужно как гранаты делать, но с другим эффектом, по идее...

Есть класс тренировочных гранат.

 
JMax
Четверг, 27.08.2015, 18:08
Пост №: 8
Пользователь
Одиночка
Цитата
Есть класс тренировочных гранат.
Я имел ввиду, что бы у них звук был и иконка, хотя бы, похожая) и при контакте с аномалией был эффект, т.к. она действует только на юниты.
Т.е. что бы при попадании в триггер или просто зону аномалии, "гранатаболт" создавал какой-нибудь эффект.

 
def
Четверг, 27.08.2015, 19:22
Пост №: 9
Цитата Wiz ()
А мод болта который аномалии выявляет будет?
Все что сейчас планируется указано в todo :)
про болты пока не думаю, т.к. 1) аномалии видно визуально, когда к ним подходишь (к примеру, бьет на 3 метрах от эпицентра, а видно уже на 7 метрах) - это еще позволяет видеть других игроков - где-то мигнула аномалия, значит там игрок
2) мы больше склоняемся над использованием детектора аномалий - купил и ходи себе пищи. 
Сейчас аномалии реагируют только на игроков\ботов и технику в которой есть игрок\бот. (эпично выглядит подбрасывание машины)

Автор темы
 
def
Воскресенье, 30.08.2015, 10:56
Пост №: 10
Обновленная версия серверного скрипта initServer.sqf:
https://yadi.sk/d/HS8FJ8YlikCzP
https://yadi.sk/d/AG3O6PELimZEh (версия "только живые игроки без ботов")
Патч на быстродействие.
Пока лучше не допускать, чтобы произведение кол-ва аномалий и игроков превышало 30000-50000.

p.s. еще влияет - чем меньше машин, тем быстрее работает.
Сообщение отредактировал def - Понедельник, 31.08.2015, 14:10

Автор темы
 
Chief
Понедельник, 31.08.2015, 10:34
Пост №: 11
Каким образом проводились тесты скрипта аномалий?
 
def
Понедельник, 31.08.2015, 10:51
Пост №: 12
Chief, что конкретно интересует?
Первоначально тестировал в редакторе (скрипты расчитаны в т.ч. на ботов).  Сделал карту в VR на 1000 аномалий, расставил 100 ботов и .. офигел от падения быстродействия. Цикл прохода для формирования списка потенциально активных аномалий занимал от 10 до 18 секунд, что очень много.
Эмпирически дошел до значения произведения (30000) выше которого лучше не подниматься, попутно оптимизировав проверки условий, для сокращения кол-ва затрачиваемых тактов.
Вчера отыгрывали ~200 аномалий х 15 игроков + 15 ботов (это примерно 6000), было все ок.
Если не ответил на твой вопрос, уточни, пожалуйста.

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

Можно перейти на детект тольк игроков (не знаю, собирался ли ты использовать ботов), это довольно просто, нужно просто вместо allUnits использовать (allPlayers - allDead). Но это все тот же тупик.

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

upd:
Если триггеры не помогут, попробую перенести детект аномалий на сторону игрока (вроде из клиентской части можно рассылать всем остальным игрокам команды (fn_MP). Это потенциально чревато проблемами только в случае задержек между игрок-сервер-другой игрок в рассинхроне эффектов.
Сообщение отредактировал def - Понедельник, 31.08.2015, 15:20

Автор темы
 
def
Понедельник, 31.08.2015, 13:35
Пост №: 13
чтобы не потерялось
при создании визуальных эффектов аномалий сильно поможет вот эта штука (ссылку дал Chief)
http://www.armaholic.com/page.php?id=21217

Автор темы
 
def
Воскресенье, 13.09.2015, 21:33
Пост №: 14
и эта:
https://forums.bistudio.com/topic/176057-gf-post-process-editor/
(ссылка от Зиалота)

Автор темы
 
def
Вторник, 15.09.2015, 02:36
Пост №: 15
Обновление движка аномалий
https://yadi.sk/d/P3oxi7zmj6Faj
почти все перенесено на клиентскую часть, теперь тормозить не должно даже при 100 игроков на 1000 аномалий и больше.

Подробности в виде обновления в верхнем посте
Сообщение отредактировал def - Вторник, 15.09.2015, 02:48

Автор темы
 
Форум » Мастерская » В помощь картоделу » Скрипты » Аномалии (s.t.a.l.k.e.r.-style) (Набор скриптов, позволяющий использовать аномалии в миссиях)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: