
| | все о Valve Hammer Editor |
|  | |  |
|
 |
|
В этой статье пойдет речь о продвинутом использовании объектов (entities) при создании карт именно для КС и о проблемах, возникающих в связи с этим.
Причем тут КС? В Контрстрайке, в отличие от самой Half-life и других модификаций, реализована система раундов, когда обе команды имеют возможность
сражаться несколько раз на одной и той же карте. То есть, с точки зрения игрока КС, каждый отдельный раунд не связан с предыдущим, так как сценарий
повторяется, и раунды – это дополнительные попытки для команд одержать верх над противником. Теоретически, можно было бы реализовать по одному раунду на
карту. Однако это потребовало бы очень много карт (а иначе частое повторение карт привело бы к такой же системе раундов). Кроме того, загрузка новой
карты через каждые 4-5 минут, по окончании раунда, сделала бы динамичный игровой процесс невозможным.
Для самой Half-life система раундов, к сожалению, не совсем понятна. Проблемы, в основном, возникают с использованием различных объектов, позволяющих
«автоматизировать» уровень. То есть, объекты, определяющие местоположение, например, террористов и заложников, а также стекла и двери, работают
нормально. А вот объекты, имеющие сложные изменяющиеся свойства, иногда не срабатывают, как должны с точки зрения левел-дизайнера и даже самих
создателей КС.
Поясню на примере: вы делаете выключаемый свет. Для этого создаете два объекта – light и func_button, которые настраиваете таким образом, чтобы кнопка
работала как обычный выключатель: первое нажатие включает свет, второе выключает. Устанавливаете флаг Initially dark объекта light, чтобы свет был
изначально выключен. В игре, свет и будет выключенным, пока кто-нибудь не нажмет кнопку. В последующих раундах, свет будет уже включенным, пока
опять-таки кто-нибудь его не погасит. Получается, что раунды не независимы, и изменяемые свойства некоторых объектов сохраняются (не обнуляются) со
сменой раунда. В нашем примере, несмотря на то, что флаг Initially dark (изначально темный) подразумевает выключенный свет в начале раунда, он
срабатывает только один раз при загрузке карты и в дальнейшем не влияет на состояние источника света. То есть, с точки зрения движка Half-life, смена
раунда «прозрачна» для объекта light. В нашем примере это не так страшно, однако, как мы увидим в дальнейшем, это свойство КС создает немало хлопот для
маппера, значительно ограничивая его возможности и заставляя его решать скорее технические, нежели дизайнерские задачи.
Кроме объекта light не сбрасывают своих свойств следующие объекты:
func_pushable – передвигаемые предметы сохраняют свое положение из
раунда в раунд (пример – столик на карте cs_estate). Если установлен флаг
breakable (разрушаемый), однажды разрушив такой объект, вы больше не увидите его до конца карты.
trigger_auto – должен срабатывать в начале каждого раунда,
срабатывает только один раз сразу после загрузки карты.
trigger_once – должен срабатывать один раз за раунд, срабатывает
только один раз за карту.
env_global – даже если флаг Set initial state установлен, состояние
глобальной переменной устанавливается в заданное только в начале карты, а не в
начале каждого раунда. Объект этот сложный и, на первый взгляд, малополезный, однако без него невозможно сделать реалистичный лифт.
env_render – изменяет параметры отображения объекта и не сбрасывает их на
начальные в каждом раунде. Приходится делать это «вручную» (см. статью
про модели в КС).
В каждом объекте, имеющем параметр Wait before reset/trigger (задержка перед сбросом/активацией), отсчет времени ведется в рамках всей карты, а не
конкретного раунда. Например, метод, используемый создателями cs_italy для «воскрешения» убитой курицы и описанный в статье про модели, может привести к
тому, что в одном из раундов курицы вообще не появятся. Попробуйте запустить cs_italy, зайти за спецназ, убить курицу, набрать команду kill в консоли и
снова прибежать на базарчик. Только проделать это все нужно быстрее трех минут. Так вот, курицы вы там не увидите! Почему? Потому что у объекта
trigger_multiple, отвечающего за «воскрешение» цыплят, установлена
задержка в 180 секунд (средняя продолжительность раунда), и считается она вне
зависимости от раундов (не сбрасывается с началом нового раунда). А если раунд длится более 3 минут? Тогда, пробежав через места респауна
контр-террористов (именно там расположен trigger_multiple, который воскрешает курицу), можно оживить цыплят, но они будут «неубиваемыми» до конца
раунда!
Есть, наверное, другие объекты и свойства, которые не сбрасываются с началом раунда. Я назвал только те, с которыми я чаще всего сталкиваюсь, и из-за
которых мне приходится выдумывать обходные пути для достижения своих целей. Далее я хочу поделиться с вами тем, чего я добился.
Func_pushable
Используйте передвигаемые объекты как можно меньше в вашем уровне и только в замкнутых пространствах, откуда они не могут быть вытолкнуты. Особенно
остерегайтесь использовать передвигаемые предметы и вертикальные вентиляционные или другие шахты. Столкнув такой объект в шахту, вы перекроете доступ
через нее на все раунды, таким образом, выключив альтернативный или даже основной маршрут из игры. Тем более не делайте передвигаемый объект
разбиваемым – используйте func_breakable вместо этого.
Trigger_once
Это, на мой взгляд, основной объект, с помощью которого можно будет реализовать почти все остальные неработающие объекты. Так как сам объект
trigger_once не работает (точнее работает только один раз за карту), я использую комбинацию из двух объектов func_door и trigger_multiple. Да, именно
обычную дверь. Как вы знаете, у объекта func_door есть параметр target (цель) – имя объекта, активируемого при открытии/закрытии двери. Именно это
свойство я и использую.
Итак, создайте маленький браш (например, 8 на 8 юнитов) где-нибудь внутри стены, чтобы его никто не мог увидеть. Обратите его в func_door, присвойте имя
(name), а также установите значение Wait before reset = -1 (Stay open). Теперь ваша дверь может быть открыта только один раз за раунд – соответственно,
объект-мишень может быть активирована только один раз за раунд, а не за карту, в отличии от trigger_once. Теперь разместите объект trigger_multiple в
том месте, где вы хотели разместить trigger_once, а в качестве мишени укажите имя не того объекта, который нужно активировать, а имя func_door. Когда
игрок попадает в поле действия триггера, дверь «открывается» (она в стене – никто не видит этого), и объект-мишень активируется. А так как дверь
«одноразовая», активация объекта возможна только однажды.
Trigger_auto
Имея рабочий вариант trigger_once, реализовать trigger_auto так, чтобы он автоматически запускал указанный объект в начале раунда совсем несложно.
Делаем все так же, как и в случае с trigger_once, только размещаем два объекта trigger_multiple с указанием имени двери в качестве мишени. Один триггер
размещаем на базе террористов, покрывая все точки появления террористов, другой – на базе спецназа. Таким образом, даже если карту запустит один игрок,
где бы он ни появился, он активирует триггер, затем дверь, затем нужный объект!
Env_global
Это довольно-таки сложный объект, с помощью которого создается глобальная переменная и задается ее значение. При активации данного объекта состояние
переменной изменяется. В КС данный объект чаще всего применяется в режиме Toggle (переключатель), соответственно, значения переменной могут быть On/Off.
Далее эту переменную, совместно с объектом multisource, можно
использовать в других объектах для реализации логической цепочки «Если <переменная
включена>, то <активировать объект>. Более подробная информация об использовании этой группы объектов потребует отдельного туториала.
Сбрасывание изменяемых параметров с началом нового раунда практически у всех объектов, которые не делают это самостоятельно, возможно с помощью
указанных выше аналогов trigger_once и trigger_auto. Например, изменение параметров отображения модели с помощью env_render, как это сделано в статье о
курицах, и восстановление исходных значений. Использование аналога trigger_auto, позволяет избежать неприятных недоразумений в виде неубиваемой курицы
(по прошествии 3-х минут раунда) или невидимой курицы (если раунд наоборот закончился быстрее трех минут).
Напоследок давайте рассмотрим пример разбиваемой лампочки. Реализуется это довольно просто. Создаем разбиваемый браш (func_breakable), который будет
фонарем. Источником света может служить как light, так и light_spot.
Главное указать имя (name), например, light1, выбрать цвет и яркость света. Если
источник света находится внутри разбиваемого браша, необходимо изменить параметры
отображения последнего, сделав его проницаемым для света, например
Render Mode = Texture, Render Amount = 255. Также не забудьте указать, что это стекло, и прочность его невелика. В качестве мишени для func_breakable
(Target on break) укажите имя источника света (в нашем случае – это light1). При разрушении браша, он будет активировать объект-свет, и, если последний
был включен, выключать его. Остается только следить за тем, чтобы свет загорался с началом раунда.
Чтобы свет загорался с началом раунда, необходимо сделать аналог trigger_auto, который срабатывает с началом раунда (как описано выше). Если в качестве
мишени мы установим имя источника света, он будет переключать свет с началом раунда. А вдруг никто не разобьет фонарь? Тогда в новом раунде свет
появится выключенным! Чтобы свет только включался и не выключался, вставим дополнительный объект trigger_relay. Установим имя (Name) = light1_on, мишень
(Target) = light1 и тип реле (Trigger state) = On (только включать). Имя этого реле нужно указать в нашем trigger_auto. Таким образом, с началом раунда
будет запускаться реле, которое может только включать свет, но никак не выключать его. Это как раз то, к чему мы и стремились! Вне зависимости от того,
включен свет или нет к концу раунда, в следующем раунде он появится включенным.
Используемые объекты:
light
light_spot
trigger_auto
trigger_once
trigger_multiple
trigger_relay
func_button
func_pushable
func_breakable
func_door
env_global
env_render
multisource
Скачать карту с примером (zip, 2.5 КБ)
|
|
 |

|