урок 8
применение триггеров, CLIP и ORIGIN брашей. Как вставить модель.
Применение триггеров
В этой статье мы расскажем о применении такой группы энтити-объектов как триггеры (от англ. «trigger» — инициировать, дать начало).
1. Trigger_auto.
Данный триггер открывает группу триггеров. Этот триггер является точечным объектом. Размещать его можно в любом месте карты. Предназначен он для автоматической активации какого-нибудь объекта при загрузке карты, т.е. как-только карта загрузилась, этот триггер срабатывает и активирует объект, указанный в поле «Target». Вы можете разместить несколько trigger_auto, если это необходимо.
Пример использования: активация посредством trigger_auto объекта game_text, который выводит на экран присоединившегося игрока информацию об авторе карты.
2. Trigger_camera.
Этот триггер также является точечным объектом. По сути, вставив такой объект на карту, Вы получаете камеру, которая будет «смотреть» в указанном направлении. Для того, чтобы игрок смог увидеть, что показывает камера, необходимо создать кнопку (func_button) и в ее параметр «Target» вписать имя камеры. Подобным образом созданы камеры на картах cs_assault, cs_militia и многих других.
Если кнопку не делать, то изображение с данной камеры будет показано при присоединении игрока к серверу. Если камер несколько, то изображения с них будут показываться по очереди в течении некоторого времени. Например, после присоединения к серверу с de_dust, Вы попеременно видите изображения с камер (т.е. объектов trigger_camera), расположенных в разных местах карты.
Существует возможность создавать двигающиеся камеры или камеры, следящие за подвижной мишенью. Подробнее об этом Вы можете прочитать в статьях из раздела «Камеры».
3. Trigger_changetarget.
Это еще один точечный триггер, месторасположение которого, не влияет на его работу (т.е. размещать этот триггер можно в любом месте карты). У этого триггера специфическое действие, которое визуально никак не проявляется. Как Вы уже знаете, у многих объектов есть параметр «Target». Так вот, данный триггер позволяет менять этот параметр любому объекту прямо во время игры.
Для того, чтобы поменялся параметр «Target» у какого-нибудь объекта, необходимо активировать данный триггер. Это можно сделать любым доступным способом. Самый простое — при помощи кнопки (func_button).
4. Trigger_counter.
Данный триггер относится к классу брашевых объектов, т.е. действие этого триггера распространяется на пространство, ограниченное его собственными размерами. Закрашивать trigger_counter следует также как и любой другой брашевый триггер специальной текстурой AAATrigger со всех сторон.
Данный триггер запоминает сколько раз он был активирован (сколько раз через него прошли игроки) и при определенном установленном в его свойствах значении активирует указанный в поле «Target» объект.
На рисунке ниже показано, как обычно размещают брашевые триггеры, которые активируют какие-либо объекты. А размещают их так, чтобы какой-нибудь игрок обязательно прошел через них. Тогда триггер активируется и в свою очередь активирует объект, указанный в поле «Target». Например, раздается звук.
5. Trigger_gravity.
Этот триггер так же, как и предыдущий, относится к классу брашевых. Закрашивать его следует текстурой AAATrigger, которая специально предназначена для триггеров (отсюда и название).
При помощи данного триггера можно изменить гравитацию на карте. Но следует помнить, что гравитация меняется не для всех игроков, а только для игрока, прошедшего через триггер! Все остальные игроки не почуствуют каких-либо изменений. Чтобы вернуть обычную гравитацию необходимо создать еще один trigger_gravity, устанавливающий нормальное значение (800). Также помните, что уровень гравитации не сбрасывается в начале раунда, т.е. если игрок включил пониженную гравитацию, то и в следующем раунде он будет «летать».
6. Trigger_hurt.
Еще один брашевый триггер, который следует закрашивать текстурой AAATrigger. При помощи этого триггера можно наносить повреждения игрокам. Разместите данный триггер в каком-нибудь месте карты, выставьте уровень и тип повреждений (имеется с десяток различных типов, но разница заключается лишь в выводимомой на экран иконке повреждений: огонь, яд, электрошок и т.д.) и тогда, пройдя через этот триггер, игрок потеряет часть здоровья.
Применять этот триггер можно вместе с огнем, электропроводами, трансформаторами, да и много еще с чем. Просто нужно создать вокруг «зоны поражения» данный объект. Как вариант, данный триггер можно использовать за пределами карты, если у Вас есть такие места (где игрок может провалиться). Примеры: de_prodigy и de_vertigo (небоскреб). На этих картах игроки могут упасть за ее пределы, и, чтобы они там не бегали, установлены триггеры trigger_hurt с достаточно большим уровнем повреждений, чтобы убить игрока «наверняка» :)
7. Trigger_multiple и trigger_once.
Данные два брашевых триггера являются чемпионами по применению на картах. Они выполняют очень простую, но в то же время очень полезную функцию — они просто активируют объект, указанный в параметре «Target» (чаще всего это звуки или объект multi_manager). Трудно найти карту, на которой не было бы trigger_multiple.
Различие между объектами заключается в количестве активаций: trigger_multiple может активировать объект бесконечно, а trigger_once только 1 раз. Как и все остальные брашевые триггеры trigger_multiple и trigger_once следует со всех сторон закрашивать специальной текстурой AAATrigger.
8. Trigger_push.
При помощи этого брашевого триггера можно создать невидимую область, при вхождении в которую, игрок будет выталкиваться в определенную сторону. Например, можно разместить данный триггер в воде, чтобы создать иллюзию подводного течения или около мощного вентилятора для создания иллюзии движения потока воздуха. Данный триггер был применен при создании катапульты на небезызвестной карте de_rats3. Закрашивать trigger_push следует текстурой AAATrigger со всех сторон.
9. Trigger_relay.
Данный триггер относится к классу точечных, т.е. место его положения на карте роли не играет. Данный триггер может работать в трех различных режимах: только включает объекты, только выключает объекты, активирует объект в любом случае. Например, можно создать такую цепочку из трех объектов: кнопка + триггер + лампочка. При нажатии на кнопку, активируется триггер, который работает, например, только на включение. Если свет не горит, то он загорится. Если же свет уже горит, то выключен он не будет. В общем вот такая хитрая система :) Однако иногда она бывает полезна.
10. Trigger_teleport.
Как видно из названия триггера — это телепорт. Игрок пробегает через данный триггер и оказывается в каком-то другом месте карты. Это место задается другим объектом — info_teleport_destination.
Использование CLIP-брашей
В этой статье мы расскажем о применении CLIP-брашей, которые в основном используются для ограничения передвижений игрока.
1. Блокирование пути игрокам
В стандартной библиотеке текстур halflife.wad есть текстура под названием CLIP. Это служебная (специальная) текстура. Браш окрашенный со всех сторон данной текстурой обладает интересными свойствами: он абсолютно прозрачен в игре, через него пролетают пули и гранаты, но игрок пройти сквозь него не может. Браш необходимо окрашивать данной текстурой СО ВСЕХ сторон. Это обязательное условие. Не допускается применять текстуру CLIP для обычных объектов. Только для создания CLIP-брашей.
Итак, первое предназначение CLIP-брашей: блокирование пути игрокам. На рисунке ниже показано как необходимо размещать CLIP-браш, чтобы игрок не мог пройти сквозь проход в стене. Слева показан проход, справа — этот же проход, но «заделанный» CLIP-брашем.


Толщина CLIP-браша значения не имеет (хоть 1 юнит, хоть 100 юнитов — игрок не пройдет). CLIP-браши можно размещать, например, в тех, местах, где игроки могут упасть за пределы карты. Создаете в таком месте сплошную стену из CLIP-браш(а)ей и будьте уверены — игроки не упадут.
2. Создание прозрачных простреливаемых решеток
При помощи энтити-объекта func_illusionary и наложенной на него текстуры с маской создается решетка или забор. Затем вплотную или рядом размещается CLIP-браш (см. рис. ниже). Таким образом, мы получаем прозрачную простреливаемую решетку.


Преимуществом такой «комбинированной» решетки перед решеткой из объекта func_wall является ее простреливаемость из любого вида оружия, а вот func_wall не простреливается из пистолетов, троек и шотганов, не смотря на прозрачность. Также в пользу решения func_illusionary + CLIP-браш говорят не остающиеся на решетке следы от пуль. Постреляйте на какой-нибудь карте по решеткам из func_wall, а потом присмотритесь — будут заметны следы от выстрелов, тем самым автор карты показывает свою неосведомленность в данном вопросе :-)
3. Предотвращение застревания игроков
Посмотрите на рисунок ниже. На нем изображена наклонная горка и стоящий около нее ящик.

При попадании игрока между поверхностями с небольшим углом наклона друг к другу, он (игрок) может застрять. Тогда ему поможет только kill :-). В некоторых случаях игрок погибает мгновенно :) За примером ходить далеко не надо: De_Aztec, база контров (левый бомб-плейс). Если прыгнуть между большим ящиком в левом углу бомб-плейса и стенкой и «поёрзать» там, то можно отправиться к праотцам :)
Использование CLIP-браша, как показано на рисунке, предотвращает застревание игрока, т.к. в таком случае он будет сидеть на CLIP-браше.
4. Экономия Clipnode-плоскостей
Clipnodes — это такие плоскости, которые создаются вокруг всех объектов на карте. Эти плоскости не позволяют игроку проваливаться сквозь пол, ходить сквозь стены, однако не путайте clipnodes и CLIP-браши — это не одно и то же. Clipnodes создаются игровым движком, а CLIP-браши это просто возможность для маппера сделать непроходимую прозрачную стенку.
Вспомните читерскую команду noclip, после ее ввода можно «летать» сквозь стены, т.е. попросту отменяются ограничивающие плоскости clipnodes.
Посмотрите на рисунок ниже. На нем изображена бочка, сделанная из цилиндра с 24 боковыми гранями. При компиляции вокруг бочки будут создано множество clipnode-плоскостей (до нескольких сотен). Все бы ничего, если бы не ограничение на эти самые clipnode-плоскости, которые накладывает движок Half-Life. При достижении максимально допустимого количества этих плоскостей, возникнет ошибка при компиляции.

Использование CLIP-браша, как показано на рисунке, помогает, во-первых, облегчить работу компиляторам, а, во-вторых, помогает снизить количество clipnode-плоскостей.
Следует заметить, что данный метод следует применять при возникновении ошибки MAX_MAP_CLIPNODES и на очень больших картах. В остальных же случаях тратить время на подобную «оптимизацию» карты не стОит.
5. Сглаживание выступов на стенах
Этот способ применения CLIP-брашей используется для улучшения играбельности (комфортности игры). На рисунке ниже (часть 1), Вы можете видеть стенку с выступающей частью. В пылу боя, отходя задом, игрок может зацепиться за этот выступ, и его убьют. Рядом с таким уступом можно разместить CLIP-браш (часть 3, вид сбоку-сверху). Это позволит избежать данной ситуации. Игрок «проскользит» по CLIP-брашу и благополучно скроется от врагов :-)

Естественно, что для больших выступов этого делать не стоит, т.к. за ними (уступами) можно спрятаться, а вот с маленькими выступами такой трюк вполне можно проделать. Рекомендуем создавать CLIP-браши для уступов шириной до 8 юнитов.
6. Применение CLIP-браша при создании машины
CLIP-браш можно включать в состав машины (объектов: func_vehicle, func_train, func_tracktrain). Это может пригодиться, если нужно заблокировать передвижения игрока в какой-то части машины. Например, чтобы игрок не застрял между наклонными поверхностями. Прежде чем окончательно превратить браши, составляющие автомобиль, в func_vehicle (или другой объект из перечисленных выше), не забудьте выделить и CLIP-браш. А уж затем можете создавать энтити-объект.

Ну, и последнее, не забывайте создавать CLIP-браши в тех местах, куда игрок не должен попадать во время игры, чтобы не возникло ситуации, когда игроки воспользуются отсутствием CLIP-браша и начнут бегать за пределами карты или где-то еще, где им неположено. А вообще совет: не злоупотребляйте CLIP-брашами, игроки не очень любят, когда они видят какой-то проход, но не могут туда попасть из-за невидимой «стенки».
Использование ORIGIN-брашей
В этой статье мы расскажем Вам о применении ORIGIN-брашей, которые являются неотъемлемой частью любого вращающегося объекта. Прочитав данную статью, Вы сможете правильно создавать такие объекты как: вентиляторы, автомобили, вращающиеся рычаги, двери и пр.
ORIGIN-браш — это браш, окрашенный со всех сторон специальной текстурой по имени ORIGIN (стандартная текстура ORIGIN бело-зеленого цвета). Эта текстура находится в стандартной библиотеке текстур halflife.wad. Браш необходимо окрашивать данной текстурой со всех сторон. Это обязательное требование, иначе возникнет ошибка при компиляции.
ORIGIN-браш своим центром определяет положение оси вращения таких объектов как: вращающиеся двери, рычаги, различные платформы, поезда, машины, управляемые пулеметы, маятники, вентиляторы и других разновидностей вращающихся объектов. В общем ORIGIN-браши используются повсеместно, ничего сложного в них нет и просто нужно 1 раз понять принцип их действия.
Запомните следующее правило: если объект хоть как-то вращается, то он должен иметь ORIGIN-браш, т.е. ORIGIN-браш должен входить в состав этого энтити-объекта. Кстати, ORIGIN-браши применяются только для объектов группы FUNC_. Просто в других группах нет вращающихся объектов.
Если Вы хотите создать, например, вентилятор — постройте лопасти, создайте ORIGIN-браш, выделите все это вместе и превратите в данном случае в объект func_rotating. Также необходимо поступать со всеми другими вращающимися объектами (дверями, платформами, машинами и т.д.), т.е. не забывайте выделять ORIGIN-браш вместе с другими частями будущего объекта.
В игре ORIGIN-браш абсолютно невидим и не создает препятствий для передвижений игрока, его как бы и не существует.
Один вращающийся объект — один ORIGIN-браш
Для любого вращающегося объекта создается только 1 ORIGIN-браш. Также не оставляйте ORIGIN-браш без объекта, например, отдельно дверь и отдельно ORIGIN-браш — это обязательно вызовет компиляционную ошибку.
Как правильно размещать ORIGIN-браш?
Сразу оговоримся, что размер и форма ORIGIN-браша значения не имеют! Самое важное — положение его ЦЕНТРА в пространстве. Вы можете создать ORIGIN-браш в виде небольшого кубика 8х8х8 юнитов, а можете, как браш с размерами 64х4х4 — все равно, следите за положением его центра.
Помните, что ORIGIN-браш не является осью вращения! Он лишь определяет точку в пространстве, через которую проходит эта ось. По умолчанию вращающийся объект будет крутиться вокруг центра ORIGIN-браша по вертикальной оси Z. Однако в случае необходимости мы можем заставить такой объект вращаться вокруг одной из горизонтальных осей X или Y. Пример: вентилятор на стене — вращение происходит вокруг горизонтальной оси.
Когда Вы создаете ORIGIN-браш мысленно представляйте себе, где находится его центр, в какой точке. Затем этот центр помещайте в место, где проходит ось вращения (см. рис. ниже).

На рисунке выше показана обычная вращающаяся дверь func_door_rotating. ORIGIN-браш входит в состав этого объекта. На следующих картинках хорошо видно как размещен по отношению к двери центр ORIGIN-браша.
Вид сверху. Фиолетовый квадратик справа — это и есть ORIGIN-браш. Фиолетовый прямоугольник — дверь. Мысленно воткните иголку в центр ORIGIN-браша и начните вращать дверь по или против часовой стрелки. Когда дверь откроется полностью (повернется на угол 90°), она не будет задевать стенки (входить в них).

Если центр ORIGIN-браша разместить правее (на краю двери), то при открытии, она частично «заедет» в стенку. Это в общем-то не страшно, просто смотрится некрасиво. В реальной жизни двери в стенки не въезжают :). Поэтому размещайте ORIGIN-браш как показано на рисунке.
Ниже показан вид сбоку:

На рисунке ниже Вы можете видеть, что форма ORIGIN-браша, его размеры и размещение вдоль вертикальной оси вращения двери, роли не играют. Сравните форму и размещение ORIGIN-браша на картинке выше и нижней картинке — они разные, но на работоспособности двери это никак не сказывается. Дверь будет точно также открываться.

Выбор оси вращения
С размещением ORIGIN-браша мы разобрались. Теперь подробней остановимся на определении оси вращения. В каких случаях нужно выставлять оси Z, X, Y?
По умолчанию все объекты вращаются вокруг вертикальной оси Z. Эта ось всегда проходит снизу-вверх или сверху-вниз, как хотите. Таким образом, если объект (дверь, вентилятор и пр.) должен вращаться вокруг вертикальной оси Z, то ничего, кроме размещения ORIGIN-браша, делать не нужно. А вот если ось горизонтальная (X или Y), то тут придется залесть в свойства объекта и указать какую ось необходимо использовать для вращения.
Для примера возьмем уже знакомую нам дверь :) Посмотрите как соотносятся оси X и Y на виде сверху и в 3d-виде. Так уж получилось на тестовой карте, что вид сверху как бы перевернут по отношению к 3d-изображению (придется немного поломать голову, чтобы сопоставить эти два вида :).

Итак, если нам необходимо, чтобы дверь вращалась вокруг оси X (представьте, как будет выглядеть это вращение в игре — довольно смешно :) — мысленно воткните иголку в дверь по оси X ЧЕРЕЗ ЦЕНТР ORIGIN-БРАША и начните ее вращать), то для такого вращения в свойствах объекта нужно отметить флажок «X axis» (см. рис. ниже).

Если же «вставить иголку» вдоль оси Y в центр ORIGIN-браша, то дверь будет вращаться вообще интересным образом :), как бы по или против часовой стрелки. В этом случае (если нам необходимо такое вращение) отмечаем флажок «Y Axis». Не надо отмечать 2 флажка одновременно!
Вот так на примере обыкновенной двери мы разобрали соотношение координатных осей в пространстве. Для других вращающихся объектов принцип определения осей точно такой же. Мы советуем, ставить вид сверху и уже на нем определять ось вращения, принимая во внимание, что ось Y смотрит вверх, а ось X — вправо.
Если все же Вы захотите определять направление осей на других видах (сбоку или спереди), то картинка ниже поможет Вам лучше соориентироваться.

Итак, что Вам нужно знать об ORIGIN-брашах:
1. ORIGIN-браш окрашивается специальной текстурой ORIGIN со ВСЕХ сторон!
2. Каждый вращающийся объект должен иметь ORIGIN-браш
3. ORIGIN-браш является неотъемлемой частью вращающихся объектов
4. Центр ORIGIN-браша определяет точку, через которую проходит ось вращения
5. Вращение объекта не зависит от размеров ORIGIN-браша
6. Один объект - один ORIGIN-браш
7. Недопустимо наличие ORIGIN-браша без объекта
8. ORIGIN-браш в игре невидим и не создает помех игрокам
Вот, пожалуй, и вся необходимая информация об ORIGIN-брашах. Вращающиеся объекты — это просто!
Как вставить модель на карту?
В этой небольшой и простой статье мы расскажем, как на карту всталяются модели.
Прежде всего поясним, что такое модель. Модель — это объект определенной формы, имеющий свою текстуру (или даже несколько), некоторые модели имеют еще и анимацию и могут ее менять. Модели для Half-Life хранятся в файлах с расширением *.mdl. Один файл — одна модель. Модели бывают самые разные: деревья, оружие, автомобили — в общем объект с формой любой сложности.
Почему мапперы предпочитают использовать модели вместо брашей? Предположим, на своей карте, в месте закладки бомбы Вы захотели поставить какую-нибудь статую, например, такую :))

Из обычных брашей кролик получился бы довольно неуклюжим и угловатым, если бы вообще Вы смогли бы «построить» такого кролика из брашей. К тому же с большой долей вероятности он будет неправильно откомпилирован (ошибки в поверхностях) и освещен не самым наилучшим образом (артефакты).
В этом случае самым лучшим решением будет использование модели, у которой и полигонов побольше (более плавные очертания), и не будет проблем с компиляцией.
Вставляются модели при помощи точечного энтити-объекта cycler. В нужном месте карты Вы создаете этот объект и в его свойствах в параметре «Model» указываете путь к нужной модели (файлу *.mdl). Стандартная папка для моделей в CS находится в «Cstrike\models» — туда и следует кидать свои модели.
Также модели можно вставлять при помощи объекта cycler_sprite, который вообще-то предназначен для вставки спрайтов. Но на самом деле его тоже можно использовать. Кстати, даже предпочтительней, потому что с ним модель становится невещественной (когда в нее стреляешь из нее не летят всякие черно-белые ошметки, как это происходит с моделью, вставленной через cycler). Однако, если вы будете использовать cycler_sprite, то будет необходимо «огораживать» модель задерживающими игрока CLIP-брашами, потому что модель будет проходимой насквозь.
Чтобы знать, где именно нужно создавать CLIP-браши вокруг модели, рекомендуем использовать редактор Hammer версии 3.5 beta (последняя на момент написания этой статьи). В версии 3.5 beta модели отображаются прямо в окне редактора, что очень удобно и наглядно.
Теперь небольшая хитрость о том, как вставить модель, используя cycler_sprite: когда Вы будете выбирать в параметрах этого объекта саму модель, которую хотите вставить, то Вам дадут выбрать лишь файлы *.SPR, т.е. спрайты, а нам нужны модели *.MDL. Это ограничение легко обходится. Просто введите в строке имени файла (см. рис. ниже) символы *.*, и Вам станут видны все типы файлов. Дальше Вы идете в папку с моделями «cstrike\models» и выбираете нужную модель.

При создании zip-архива с окончательным вариантом Вашей карты, не забудьте включить в него и все нестандартные модели. Без них карта не запустится!