CSM.Dev

[HL2] Простые и комплексные фильтры

Всем привет! Сегодня я хочу вам рассказать о двух замечательных entity: filter_activator_name и filter_multi. Изучив их работу (а устроены они довольно просто) можно найти в них полезный инструмент, который поможет вам создавать интересные и не очень интересные квесты.
Я думаю что люди которые давно занимаются созданием сингл плеерных модов под ХЛ2 возможно работали с этими entity, но надеюсь что новички в этом не легком деле почерпнут для себя что-то полезное из туториала.


1. Простой фильтр filter_activator_name:
Этот фильтр используется совместно с триггером и дает возможность работать триггеру только в том случае, если его активировала entity, у которой поле name совпадает с полем filter name у filter_activator_name. То есть если вы хотите чтобы ваш триггер активировался только определенным объектом на карте, то вы даёте этому объекту имя, прописываете это имя в поле filter name у filter_activator_name, а у триггера в поле filter name прописываете имя filter_activator_name.
Для того чтобы лучше разобраться во всем, давайте рассмотрим более конкретный пример.

Задание: Игроку мешает дверь, для того чтобы её преодолеть ему потребуется бомба (func_physbox), которую надо установить рядом с дверью.

Реализация:
Собираем бомбу. Создаем маленький браш, который будет имитировать бомбу, и отправляем его в func_physbox (можно также использовать не func_physbox, а prop_physics). Заполняем поля:
Name: dynamite
Далее создаем env_explosion, который будет имитировать взрыв. Размещаем его рядом с бомбой и заполняем поля:
Name: dymanite_explosion
Parent: dynamite
Затем создаем env_sprite, который будет включаться при активации бомбы. Размещаем над бомбой и заполняем поля:
Name: dynamite_glow
Parent: dynamite
(Остальные поля по вкусу)
Бомба готова. Теперь создаем браш и отправляем его в func_breakable, это будет наша дверь. Заполняем её поля:
Name: dynamite_door
Во флагах ставим флажок напротив Only break on trigger.
А теперь займемся главными участниками шоу. Создаем filter_activator_name и заполняем его поля:
Name: filter_for_dynamite
Filter mode: оставляем по умольчанию
Filter name: dynamite
Создаем браш и отправляем его в trigger_once. Триггер должен быть расположен в том месте, куда нужно будет бросить бомбу. Прижимаем его к земле и делаем ему высоту в 1 юнит (почему так, поймете потом). Заполняем поля:
Filter name: filter_for_dynamite
И заполняем output’ы следующим образом:
My output + target entity_____ + target input + delay
OnTrigger | dynamite_________ | DisableMotion | 0.2
OnTrigger | dynamite_glow____ | ShowSprite__ | 0.5
OnTrigger | dynamite_explosion | Explode_____ | 3
OnTrigger | dynamite_door____ | Break_______ | 3.1
OnTrigger | dynamite_________ | Kill_________ | 3.1

Все готово. В исходнике, который прилагается к туториалу я положил в комнату кирпич, для того чтобы вы могли проверить, что от кирпича триггер не активируется.


2. Комплексный фильтр filter_multi:
Используется совместно с filter_activator_name и триггерами для создания сложных фильтров. У данной entity есть пять полей для имен других фильтров (filter_activator_name или filter_activator_class) и поле logic type, которое определяет логику работы filter_multi. Для тех, кто не знаком с дискретной математикой, объясняю. AND значит И, то есть наш главный фильтр (filter_multi) будет активировать триггер только если все подфильтры (filter_activator_name) пройдут тест. OR значит ИЛИ, то есть наш главный фильтр будет активировать триггер, если хотябы один подфильтр пройдет тест.
Рассмотрим пример.

Задание: Для того чтобы открыть дверь игрок должен положить в контейнер, который расположен рядом с дверью, банку или пакет с молоком, другие предметы будут игнорироваться (бред конечно, но это ведь пример).

Реализация:
Разумеется нужно создать контейнер и дверь, напихать различных предметов для теста, ну и конечно создать два prop_physics. Один с моделью банки (его я назвал can). Второй с моделью пакета молока (его я назвал milk).
Теперь создаем два filter_activator_name. Один для банки. Его поля следующие:
Name: filter1
Filter name: can
Второй для пакета молока. Его поля:
Name: filter2
Filter name: milk
Затем создаем filter_multi. Заполняем поля:
Name: filter_for_door
Negate Outcome: No
Logic Type: OR (так как или банка или пакет с молоком)
Filter 1: filter1
Filter 2: filter2
И в завершении создаем в контейнере trigger_once. Поля:
Filter name: filter_for_door
И добавляем оутпут на открытие двери, который будет происходить при активации триггера.

Все готово. Результат описанной работы можно посмотреть разумеется в исходнике, прилагающемся к этому туториалу. Разумеется многое теперь зависит от вашей фантазии. Я лиш приоткрываю дверь :)