Sidebar

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

  • Рекомендуется задавать вопросы только относительно темы с уроком. Для остальных вопросов существует раздел [url=/forums/pomosch.12/]«Помощь»[/url].

    Темы с просьбами помощи будут удаляться без предупреждения и без объяснения причины.

    Запрещается поднятие старой темы оффтопом. Ваше сообщение будет удалено, а в профиль будет выписано замечание.

KiteCrimson

New member
Jun 25, 2008
64
35
[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
И добавляем оутпут на открытие двери, который будет происходить при активации триггера.

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

Attachments

KiteCrimson

New member
Jun 25, 2008
64
35
Я с тобой полностью солидарен :) разобраться с filter_activator_name и filter_multi довольно просто. Но все же есть и люди начинающие, которые ниразу не пользовались ими, а может даже и не подозревали о их существовании. А тут раз и тутор с примером, может кого-то из них на идеи новые подтолкнет.
Плюс в туторе я показал свою идею (хочу подчеркнуть что только идею схематично, а не её красивую реализацию) создания переносной бомбы из func_physbox'а.
 

PoD-Stas

Lolwhat? 0.o
VIP
Apr 29, 2007
3,497
33
Тутор отличный. Я имею в виду что можно все это сделать и без этих энтить. Я например в 1хл на спирите. делал перенос коробок как в хл2 при нажатии кнопки, при этом я в код даже не заглядывал!!!
 

KiteCrimson

New member
Jun 25, 2008
64
35
Способов сделать бомбу и подобные ей квесты огромное множество, темболее на сорсе. Но разве можно заставить триггер реагировать только на определенный объект с уникальным именем и при этом не использовать filter_activator_name?
 

PoD-Stas

Lolwhat? 0.o
VIP
Apr 29, 2007
3,497
33
Я даже сделал только посредством мэппинга ношение ящиков как в хл2 при чем при нажатии кнопки!!!!
 

KiteCrimson

New member
Jun 25, 2008
64
35
Круть!!! :rock: Я конечно под гс маппить синглы наверное больше не буду, но если не трудно, расскажи секрет %)
 

PoD-Stas

Lolwhat? 0.o
VIP
Apr 29, 2007
3,497
33
Ну я со временем тутор напишу. А вообще у меня с этой фигней есть проблема, т.к. спирит немного паленый. Коробка носится, но если к стенке подходишь, то она через нее проходит))