Статьи о картостроении
Valve Hammer: Делаем entity (или "Помогите сделать дверь")
27.03.2003 г. с дополнениями до 2021 г.
Часть 1
Ну, здрасте всем, типа.
Это опять тов. Руфмен со свеженькой статейкой.
Сегодня я подробно расскажу вам о вальвовском Хаммере
(бывшем раньше "Ворлдкрафтом" :-), а еще, можно вспомнить Кварк или Jackhammer). Последние версии 3.4 и 3.5 для Half-Life 1 редактора Valve Hammer здесь, кстати.
Расскажу, что за фигня такая — ентить и зафик он нужен. Конечно,
все энтити я перебрать не смогу — вон их сколько в оригинальном Полураспаде, но основные и
большую часть особенных разберу.
Итак, начнём.
Сразу скажу, что entity один из самых главных
объектов в Хаммере (для меня, даже важней, чем
браш). Энтить даёт жизнь вашему уровню. Энтити
— это монстры, двери, переключатели, свет. Они
позволяют добиться некой интерактивности происходящего,
экшЫна. Создание энтитя отличается от создания
браша. Чтоб поставить свет, не нужно растягивать
рамку под кубик и жать ВК или Enter, вальвовский Хаммер
сам предоставляет все удобства по созданию entity'ей,
достаточно выбрать из списка нужный энтить, указать
его координаты, передвигая направляющие, и нажать
тот самый Enter. Не нужно, также, самому прописывать
параметры — у Хаммера всё есть готовое (за исключением
некоторых ентитей — о них позже). Впрочем подробно параметры объектам заданы в подключённых к редактору
fgd-файлах (game definition file есть как к Half-Life half-life.fgd, так создаются и к модам, для Red Alert — ra.fgd).
Вначале будет написано название параметра из fgd, после слеша жирным шрифтом будет оригинальное название параметра без fgd, а в скобках будет указан тип поля (целое, символьное или какое ещё).
Всего существует два типа энтитей — точечные (point-based)
и брашевые (brush-based) или по-простому блоковые. Как вы, наверное, догадались —
последний основывается непосредственно на блоке,
допустим, на ящике, чтобы сделать его ломающимся (func_breakable),
на кнопке (func_button), чтобы сделать её нажимающейся, и так далее.
Т. е. брашевые энтити видны в игре, как обыкновенные
браши (стены, ящики, двери, унитазы). А point-entity
интерферируется... э-э-э... не то чего-то
ввернул, выглядят и действуют совсем по-другому.
В редакторе они представляют собой метки (параллелепипедики и кубики) разного цвета и
размера. Некоторые из них после компиляции карт видны в Халфе как монстры,
дым, освещение. Другие точечные энтити отвечают за
работу, за интерактивность. Они "заставляют"
воспроизводится сценарий событий, отвечают за время воспроизведения
этого сценария, за различные его параметры и т. п.
Ну вот, что такое entity я, вроде, оповествовал.
Теперь раскатаю тему об отдельных энтитях движка
Half-Life. А то ведь ещё есть, например, и ОпФорс и They Hunger
— а у них энтити дополнены своими.
1. оружие и патроны: weapon_*, ammo_*, item_*
У этих энтитей похожие параметры. Все они являются
ни чем иным, как оружиями, патронами и различными
вещами в Халве. Параметры:
- Name/targetname имя оружия или вещи. По имени объект можно удалить при наступлении какого-нибудь события, а просто при вызове, например, взрывчатка или граната подорвётся.
- Kill Target/killtarget (string) удаляет цель, имя которой сюда вписано, когда игрок подбирает данную вещь,
- Target (string) имя вызываемой энтити, когда игрок подбирает данный предмет (сработает, если костюм HEV на игроке надет); а параметр
- Delay before trigger/delay отвечает,
через сколько секунд будет вызвана цель,
имя которой обозначено в поле target, после того, как
предмет подобран (по умолчанию сразу, т.е. =0).
- Pitch Yaw Roll (Y Z X)/angles (string) углы наклона, направления и крена, обычно важен угол направления (по умолчанию =0 0 0)
Флаг:
- 2048 = Not in Deathmatch — не появится в многопользовательском режиме Deathmatch.
2. Триггеры (trigger_*)
Триггеры обрабатывают различные параметры и часто что-нибудь вызывают, в зависимости от того,
чем является данный триггер (во как). В игре они невидимы и проходимы насквозь, потому объёмные триггеры затекстурить можно любой текстурой,
но если текстура будет светящейся, то в игре вокруг всё подстветится.
Советую всё же для триггеров служебную текстуру aaatrigger для однообразия:.
Параметры различных триггеров схожи, основной из которых — имя вызываемой цели Target, некоторые имеют новые
поля, которые как раз и определяют "наружность", пардон, функции
триггера. Вот некоторые основные триггеры, которые используются
в Халве:
trigger_auto — этот точечный триггер вместе с началом уровня
автоматически вызывает активацию своих целей под именем, которые указаны
в поле
- Target (string).
- Trigger State/triggerstate задаёт целям конкретный
статус 0=OFF — выкл., 1=ON — вкл. или 2=TOGGLE — переключить.
- Global State to Read/globalstate (string) — если вписать имя глобальной переменной, то её статус
будет разрешать или запрещать запуститься триггеру, а если переменную создать забыли, то запустится.
Например, на самых первых уровнях Халвы вы наверное замечали
титры, появляющиеся на экране. Кстати, на одной карте можно установить больше одного trigger_auto, запустятся все.
trigger_autosave — автоматически сохраняет прогресс
продвижения игрока в раздел autosave
trigger_cdaudio — этот триггер часто можно заметить
на различных картах. Он переключает дорожку на компакт-диске (линцензионная
поставка Халфы имеет ещё около 30 музыкальных
дорожек на CD) в зависимости от сложившейся
в игре ситуации. За номер трека отвечает параметр
- Track #/health — -1 = стоп, с 1 по 30 проиграть с компакта заданную дорожку.
trigger_changelevel — объёмный триггер, который используется,
когда нужно перейти с одной карты на другую (можете посмотреть статью "Смена карт"). Ключевые значения триггера:
- Name/targetname (string) — имя триггера,
- New map name/map (string) — имя карты, которую нужно загрузить
следующей,
- Landmark name/landmark (string) — имя точечной энтити-ориентира info_landmark-а, относительно которой игрок остаётся при переходе между картами, причём на обоих картах должно быть по одному info_landmark с одинаковыми именами.
- Change target/changetarget (string) — перенаправление цели
(target),
- Delay before change target/changedelay (string) —
задержка, перед тем как изменить цель.
trigger_counter — с помощью него можно можно составить
цепочку различных последовательных задач, с помощью
которых вызовется главная цель. Он подсчитывает количество вызовов и срабатывает.
Ключевые параметры:
- Target (string) цель, которая будет вызвана,
- Name/targetname (string) — имя триггера,
- Target Path/netname (string) — путь цели,
- style (integer) — стиль (32),
- Kill target/killtarget (string) — уничтожает цель с заданным именем (любую кроме звукового объекта ambient_generic),
- Master (string) — имя энтити multisourс'а, блокирующего этот триггер (подробнее),
- Sound style/sounds (integer) — тип (стиль) звука,
- Delay before trigger/delay (integer) — задержка перед вызовом цели,
- Message (set sound too)/message (string) — сообщение,
- Count before activation/count (integer) — отсчёт перед вызовом цели (по умолчанию =2).
trigger_gravity: объёмный триггер позволяет изменяеть гравитацию
на уровне. Имеет схожие параметры, что и trigger_counter, но имеет поле
- Gravity значения в диапазоне от 0 до 1 (по умолчанию =1).
trigger_hurt: объёмный триггер, позволяющий делать зоны
непосредственного влияния на физическое состояние игрока или монстров — повредить здоровью или вылечить.
Основные ключевые значения — это
- Damage/dmg — величина здоровья, убиваемого триггером
за полсекунды, если больше 0, или восстанавливаемого, если меньше 0 (по умолчанию =10)и
- Damage Type/damagetype — тип повреждения, и можно складывать несколько типов сразу:
- 0 — GENERIC — демолекуляризация ;) (по умолчанию),
- 1 — CRUSH — сдавливание,
- 2 — BULLET — огнестрельное ранение,
- 4 — SLASH — порезы,
- 8 — BURN — горение,
- 16 — FREEZE — замерзание,
- 32 — FALL — падение с высоты,
- 64 — BLAST — поражение взрывом,
- 128 — CLUB — ушиб, перелом, поражение от удара,
- 256 — SHOCK — поражение током,
- 512 — SONIC — оглушение,
- 1024 — ENERGYBEAM — облучение,
- 16384 — DROWN — недостаток кислорода (тонет или в открытом космосе),
- 32768 — PARALYSE — парализация,
- 65536 — NERVEGAS — поражение нервным газом,
- 131072 — POISON — токсичное отравление (биологическая опасность),
- 262144 — RADIATION — радиационное облучение,
- 524288 — DROWNRECOVER — состояние восстановления после всплытия + может использоваться и как режим восстановления здоровья в мире Ксена,
- 1048576 — CHEMICAL — агрессивное химическое воздействие,
- 2097152 — SLOWBURN — ослабленное горение,
- 4194304 — SLOWFREEZE — ослабленное замерзание.
Флаги:
- 1 = Target Once — если у trigger_hurt в поле target задана цель, то обычно он её вызывает каждый раз, когда начинает срабатывать; а этот флажок только в начале первого срабатывания заставит вызвать цель,
- 2 = Start Off — вначале отключён; чтобы включить, вызываете его из другого объекта,
- 8 = No clients — когда установлен, trigger_hurt не воздействует на игроков (которые считаются в движке клиентами),
- 16 = FireClientOnly — триггер будет воздействовать на любого, кто его коснётся, но вызов цели триггера произойдёт только тогда, когда он действительно повредит игроку (т.е. клиенту в движке),
- 32 = TouchClientOnly — если установлен, то этим триггером может быть покоцан только клиент (игрок).
trigger_monsterjump — достаточно интересный объёмный триггер,
который позволяет монстрам по команде триггера
запрыгивать на различные поверхности. Точнее это выглядит не как запрыгивание, а так, как будто их подталкивает какая-то сила.
Ключевые значения:
- Jump Speed/speed (integer) — скорость прыжка (по умолчанию =40),
- Jump Height/height (integer) — высота прыжка (по умолчанию =128),
- Target (string) — после срабатывания триггера вызовется энтитя с указанным в этом поле именем,
- delay (integer) — задержка,
- Kill Target/killtarget (string) — какой объект удалить до конца игры с заданным именем (кроме звукового объекта ambient_generic),
- Target Path/netname (string) — путь цели,
- style (integer) — стиль
- Master (string) — имя ентити multisourс'а, блокирующего триггер. Подробнее.
- sounds (integer) — стиль звука
- message (string) — сообщение ("Мочи зелёного!...")
- Pitch Yaw Roll (Y Z X)/angles (целое целое целое) — Наклон вперёд, Поворот и Крен в градусах, т. е. направление прыжков (по умолчанию =0 0 0)
trigger_once: основной объёмный триггер, вызывающий активацию цели
(другие триггеры, ентити функций и др.) игроком
или монстром, но только один раз. Параметры те
же самые (читай — такие же). Флаги:
- Monsters — сработает на любом монстре, который входит в зону,
- No clients — не сработает от пересечения игроком (клиенты в движке — это игроки),
- Pushables — сработает, когда его границу пересечёт любой брашевый объект func_pushable,
trigger_multiple то же самое, что и trigger_once,
только может срабатывать бесконечное количество раз, поэтому есть дополнительный параметр
- Delay before reset/wait (integer) — через какое время после срабатывания он снова будет взведён. Принцип сливного бачка,
время наполнения которого вы можете задать (если провести аналогию слива полного бачка со срабатыванием триггера).
trigger_push: "толкает" игрока или монстра,
если он находится, скажем, в аэродинамической
трубе. Как заметил Rumit_Gronovsky, особенности движка первого Half-Life таковы, что
чтобы триггер заработал и появился эффект тяги, на этот триггер подопытный должен упасть хотя бы с единичной высоты. С параметрами у этого объекта такая же лажа, как и с другими
триггерами (читай — такие же), разве что
- Pitch Yaw Roll (Y Z X)/angles (string) чтобы толкало вверх, вбейте угол наклона 90°, т.е. 90 0 0
- Speed of push/speed (integer) — скорость толкания (по умолчанию =40).
Флаги:
- Once only — срабатывает однократно,
- Start off — выключен при первой загрузке карты,
- Pushables — уносит толкабельные func_pushable. Например, под Blast Pit
бочки, плывущие в зелёной отраве, за дальним углом поднимались наверх, чтобы через минуту снова
шлёпнуться с водопада перед нашим взглядом.
trigger_relay: точечный триггер-реле является почти тем же самым, что и multimanager — у него можно задать цель или ликвидацию целевого объекта и задержку,
но возиться с реле придётся больше. Параметр
- Trigger State/triggerstate (integer) — отвечает за состояние, которое он однозначно задаёт вызванной цели в параметре target:
0 = off — выключить, 1 = on — включить, 2 = toggle — переключить.
Вообще можно для редактора исправить отключение по умолчанию на включение. Для этого найдите в вашем .fgd после объявления trigger_relay строчку к нему типа
triggerstate(choices) : "Trigger State" : 0 =
и исправьте этот 0 на 1, чтобы не сталкиваться с проблемой невключающихся объектов, когда забываешь задать состояние.
Но скорее всего вам и без этой настройки будет удобно настраивать триггер-реле.
trigger_teleport: если нужно сделать телепорт,
то ставьте этот триггер. Конечную точку прибытия
(точнее имя ентитя info_teleport_destination)
нужно прописывать в поле target.
trigger_transition: действует вместе с
trigger_changelevel'ом. Ипользуется
для переправки энтитей (монстров там, коробок...)
в другой уровень. Подробнее в статье Смена карт.
3. Монстры (monster_*)
Про них я думаю, всем понятно — это энтити
монстров. Основные поля:
- Name/targetname (string) — имя монстра для обращения к нему других объектов,
- Body — у некоторых моделей можно выбрать номер подмодели (бодигруппы). Несколько альтернативных бодигрупп в игре как разнообразят монстров/персонажей так и показывают, что учёный достал/спрятал шприц, или мёртвый персонаж выпустил оружие из рук. А по умолчанию используется подмодель № 0,
- Skin — у некоторых моделей можно выбрать номер сменной текстурной группы (скингруппы). Иногда они сменяются как для разнообразия, так и для имитации моргания глазами у большеглазых монстров (по умолчанию берётся текстурная группа № 0),
- TriggerTarget (string) — цель, которая будет вызвана, если сработает условие в Trigger Condition,
- Trigger Condition/TriggerCondition (integer) — можно выбрать одно из условий, при которых сработает TriggerTarget:
- 0 — No Trigger — без условий (по умолчанию),
- 1 — See Player, Mad at Player — при встрече с игроком, раздражаясь на него
- 2 — Take Damage — при получении какого-либо урона,
- 3 — 50% Health Remaining — при потере половины здоровья,
- 4 — Death — при гибели,
- 7 — Hear World — услышав что-либо,
- 8 — Hear Player — услышав игрока,
- 9 — Hear Combat — услышав звуки борьбы или боя
- 10 — See Player Unconditional — при встрече с игроком,
- 11 — See Player, Not In Combat — при встрече с игроком вне боя.
- Squad Name/netname (string) — имя группы, в которую войдёт монстр/персонаж, и его действия будут в ней координироваться (не у всех типов монстров),
- Weapons — у солдат и некоторых других монстров можно выбрать вооружение,
- Pitch Yaw Roll (Y Z X)/angles (string) — угловое положение: наклон вперёд-назад, направление и крен (по умолчанию =0 0 0)
- Use Sentence/UseSentence (string) — эту фразу произнесёт персонаж при попытке позвать его за собой. Названия фраз задаются в файле sentences.txt. Пример на тренировочной карте t0a0d.bsp: у учёного, которого ведёшь за собой, задано UseSentence = SC_HAZ_OK
- Un-Use Sentence/UnUseSentence (string) — это он сказанёт, когда игрок откажется вести персонажа за собой.
Например, для охранника можно задать UnUseSentence = BA_HAZ_WAIT (как и в scripted_sentence группа звуков пишется без приставки из восклицательного знака, а конкретная речь должна быть с ним: !BA_HAZ_WAIT0)
- Render FX/renderfx,
- Render Mode/rendermode,
- FX Amount (1 - 255)/renderamt,
- FX Color (R G B)/rendercolor.
Правда встречаются ещё кое-какие параметры:
- Scale (дробное) — масштаб модели, но это в Спирите и у нас в ХЛРА тоже, в Half-Life нет (масштаб по умолчанию =1,0),
- Orientation — ориентация у стационарных стрелюк бывает 0 = половая или 1 = потолковая,
- Pose — можно выбрать позу для трупов monster_*_dead.
Основные флаги монстров:
- 1 = WaitTillSeen — ИИ не работает, пока монстр не попадет в зону видимости игроком (причём видимости движком игры, а не прямой видимости) или
- 1 = Instant On — у monster_tripmine означает, что эта лазерная мина сразу взведена,
- 2 = Gag — монстр говорит только тогда, когда к нему обращается игрок,
- 4 = MonsterClip — для монстра блок func_monsterclip будет непроходим,
- 8 = NoWreckage — у вертолёта monster_apach не будет обломков (установите, если он по сюжету не взлетает),
- 16 = Prisoner — на монстра не обращают внимания ни враги, ни он сам ни на кого,
- 32 = Squad Leader — назначить монстра координатором группы, название которой в поле Squad Name (подробнее здесь) или
- 32 = Autostart — автозапуск техники,
- 64 = IgnorePlayer — очевидно, что монстр игнорирует игрока или
- 64 = Start Inactive — техника выключена, но можно включить,
- 128 = WaitForScript — монстр бездействует и ждёт своего вызова от scripted_sequence, scripted_sentence или т. п.
- 256 = Pre-disaster — режим поведения учёных, охранников и других персонажей перед катастрофой в начале игры, там предложения другие, а если позвать их за собой — откажутся,
- 512 = Fade Corpse — труп монстра после гибели постепенно исчезает; полезно тогда, когда трупы могут что-либо заблокировать.
- 2048 = Not in Deathmatch — не появится в многопользовательском режиме Deathmatch.
Но среди монстров есть исключение — monstermaker — он позволяет
генерировать монстров из ничего (при его вызове или автоматически, если установлен первый флажок).
Параметры monstermaker'а:
- Name/targetname (string) — имечко,
- Childrens' Name/netname (string) — имя дочернего монстра,
- Target On Release/Target (string) — имя цели, вызываемой после "выброса"
монстра (только не вызывайте его непосредственно отсюда с помощью scripted_sequence, он не успеет полностью создасться, и событие пропадёт)
- Monster Type/monstertype (string) — тип монстра (по образцу
monster_*: подставишь monster_cockroach — создашь тараканов, а как заметил Jaturkensirhiv, с помощью monstermaker можно создать rpg_rocket, которая сама полетит),
- Number of Monsters/monstercount (integer) — количество выпускаемых
монстров (-1 = бесконечно),
- Frequency/delay (integer) — задержка перед выпуском монстра (по умолчанию =5),
- Max live children/m_imaxlivechildren (integer) — максимум живуших
монстров, -1 = бесконечно,
Флаги monstermaker'а:
- 1 = Start ON — начать работать вместе с запуском карты,
- 4 = Cyclic — повторять генерацию монстра через время, указанное в поле Frequency,
- 8 = MonsterClip — выставляет созданным монстрам флаги MonsterClip,
чтобы объекты func_monsterclip для монстров были преградой.
4. Info entities (info_*)
Инфо энтити являются точечными и включают в себя различную информацию
о координатах места действия. Обычно они служат, как
направляющие для различных функциональных энтитей.
info_intermission: точечный объект
для многопользовательского режима. Если игрок подох и пройдёт
6 секунд, такие ентити пошлют команду, и камера переместится в место,
где находится один из info_intermission с видом на заданный info_target
в поле цели Target.
info_landmark: обязателен для перехода с одного
уровня на другой. В поле
- Name/targetname (string) указывается его переходное имя, например в HL между картами c1a0a и c1a0b targetname = c1a0atoc1a0b.
info_node: если кто играл в Контру с ботами, то
по-любому он знает, что такое вейпоинты (waypoints) —
это ключевые точки пути, которые пробегает ИИ песронажа. Так вот — info_node,
это почти то же самое. Расставляете эти ентити
по вашему халфовскому уровню, и ваши десантники
забегают с умом. Вообще info_node помогают ориентироваться, обходить препятствия или проходить лестницы и склоны большинству наземных монстров.
Но у нода есть и дополнительные параметры. Если отжать кнопку "SmartEdit" в
свойствах энтитя, то откроется текстовое поле, в которое можно добавить (кнопка "add")
дополнительные параметры,
такие как hinttype и activity:
Параметры:
- hinttype = 0 — впереди ничего - действует на любых персонажей и монстров (обычно вообще не указывается этот параметр, но у info_node для ниндзь этот 0 проставлен в игре "Half-Life 1" принудительно, впрочем это всё равно, что не поставлен),
1 — перед дверью (может чтоб не задумывался, а однозначно открывал дверь, но успешного срабатывания на практике не встречал),
2 — перед окном — подтверждают на странице valvesoftware.com. Пример из Opposing Force:
3 — перед кнопкой,
4 — перед механизмом для монстра monster_houndeye, который делает в этом месте занятное движение заинтересованности лапой, если ничем не занят (подробнее в видео Houndeye Curiosity на youtube.com),
5 — перед краем перепада высот (большого пространства вниз или наоборот идущей вверх стены, а по ней передвигается интересующий нашего персонажа монстр или игрок, в таком случае не помешает выставить Activity = 46),
6 — перед источником света,
7 — перед источником тепла,
8 — перед мигающим светильником для монстра monster_houndeye, который начинает вглядываться в него (подробнее в видео Houndeye Curiosity на youtube.com),
9 — перед яркими цветами,
10 — перед человеческой кровью для монстров monster_bullchiken (он же bullsquid) и monster_houndeye. Например, на карте C2A4D.bsp есть два таких места как с кровью, так и без. Так что есть ли декаль крови или нет — не важно (можно сказать — условность), там houndeye эпизодически подпрыгивает в любом случае:
Может потому houndeye так подскакивает при виде человеческой крови, что изначально был задуман как дружественный или нейтральный к игроку монстр;
11 — перед инопланетной кровью для монстра monster_houndeye (декалью с жёлтой кровью?),
300 — насест на потолке у монстра Stukabat или сокращённо Stuka (требуется дописать код для monster_stukabat),
301 — пятно для приземления монстра Stukabat (требуется дописать код для monster_stukabat),
А эти 4 тысячных значения упомянуты на сайте ValveSoftware, но не встретились в коде SDK игры (может они добавлены в какой-то особенной версии Half-Life?), так что их можно пропустить:
1000 — перед механизмом для монстра monster_houndeye, который воспроизводит в этом месте занятное движение заинтересованности, если ничем не занят — утверждают на странице valvesoftware.com, но на самом деле в версии HL 1.1.1.0 для этого ещё пока используется значение 4, а не 1000,
1001 — перед мигающим светом для монстра monster_houndeye, который воспроизводит в этом месте занятное движение, если ничем не занят — утверждают на valvesoftware.com, но на самом деле в версии HL 1.1.1.0 для этого ещё пока используется значение 8, а не 1001,
1002 — перед кровью — подтверждают на странице valvesoftware.com (и предлагают дописать код),
1003 — перед инопланетной кровью — подтверждают на valvesoftware.com (и предлагают дописать код).
- Activity = 0 — сброс любой активности (и переключение в состояние 1),
1 — холостое поведение (обычный режим персонажа или монстра),
35 — жевать (движение повторяется),
45 — осматривать горизонтальную поверхность (внимание на тех, кто ходит по полу),
46 — осматривать стену (внимание на тех, кто находится выше на стенах или ниже в яме).
59 — для некоторых случаев, вызывающих возбуждение. Например, когда монстр видит кое-что вкусное (bullsquid заметил хедкраба) или что-то такое ещё (учёный или monster_prof_suit встречается с врагом).
Этого для начала достаточно. Есть и много других значений параметра Activity, которые можно посмотреть в файле activity.h из кода SDK игры, например, из начальных:
2 — охранять,
3 — идти,
4 — бежать,
5 — лететь (например, режим полёта у солдат, которые висят на тросе, правда не понятно, как это можно использовать у наземного info_node),
6 — плыть,
7 — подпрыгнуть вверх (для monster_human_assasin, monster_bullchiken или monster_houndeye)
и прочие варианты активности.
info_node_air —
такие же ориентиры для воздушных монстров monster_alien_controller, менее активно их используют monster_flyer_flock, логика подсказывает, что должно быть и monster_nihilanth, но его пока не смотрел.
info_null — цель направленного источника света
light_spot.
info_player_start — место, где игрок начинает игру. Нужно на каждой карте мода в однопользовательской игре, даже не смотря на переход с предыдущих карт.
Единственное стоит настроить направление игрока, т.е. вторая цифра в параметре
Pitch Yaw Roll (Y Z X)/angles (string) — это три угла через пробел: угол наклона вперёд-назад (т.е. дифферент), угол направления (т.е. азимут) и крен.
По умолчанию =0 0 0,
это когда на виде сверху после загрузки смотрим направо, т. е. вдоль оси X.
info_player_deathmatch — место, где игрок начинает игру в многопользовательском режиме deathmatch, случайно выбирается из нескольких info_player_deathmatch.
Существуют ещё точки info_player_coop для кооперативного прохождения игры против компьютерных монстров, но этот режим в Half-Life недоработан, зато под HL есть хорошие кооперативные моды.
info_target — основной целеуказатель для таких
объектов, как func_train и env_beam. Единственный параметр
- Name/targetname (string) — его имя.
info_teleport_destination — место, в которое телепортируется
игрок, когда он войдёт в trigger_teleport.
5. Активные брашевые энтити (func_*)
Пока напишу, как делается обычная дверь:
func_door_rotating — поворачивающаяся дверь,
которую открывают игрок, монстры или вызов от другого объекта. Если обычная дверь 1 метр в ширину и 2 метра в высоту, то в игре она — 40-42 единицы в ширину
и 80-84 в высоту, толщина 1-3 единицы. Зависит от того, считаете ли Вы, что в метре 40 или 42 линейных единицы исходя из роста игрока (42 даже в чём-то реалистичнее).
Последнее время в Half-Life практиковалась ширина двери в 48 единиц, и к тому же там встречается много дерей с двойной шириной.
Дверь способна проходить сквозь браши и не падает, то есть будет висеть даже без дверных проёмов в пустоте,
если её так спроектируешь. К вращающейся двери нужна ось вращения,
которая делается с помощью блока, окрашенного со всех сторон текстурой origin. Вид сверху и общий:
Чтобы быстро найти текстуру, введите в фильтре выбора текстур первые буквы названия orig:
Ось поворота двери будет проходить через центр этого блока, а затекстуренный origin-ом
блок в игре виден не будет. Зажимаешь Ctrl, выделяешь оба блока и потом щёлкаешь в меню Tools->To entity...
Параметры объекта func_door_rotating:
- Name/targetname (string) — имя, с помощью которого вызываешь её открывание или закрывание,
- Global entity name/globalname (string) — чтобы открытое или закрытое положение двери сохранялось на разных картах, впишите общее имя для неё на каждой из карт (подробнее на примере лифта),
- Pitch Yaw Roll (Y Z X)/angles (string) — три угла через пробел: угол наклона, угол направления в горизонтальной плоскости и крен (по умолчанию =0 0 0),
- Kill Target/killtarget (string) — имя энтити, которую удалит открытие или закрытие двери (кроме звукового объекта ambient_generic),
- Speed (integer) — скорость открывания-закрывания (по умолчанию =100),
- Master — имя блокирующего объекта Multisource (подробнее),
- Move sound/movesnd (integer) — № звука при движении двери,
- Stop sound/stopsnd (integer) — № звука при остановке,
- Damage inflicted when blocked/dmg (integer) — будет наносить заданный урон здоровью, если игрок/монстр будет мешать открытию или закрытию (по умолчанию =0),
- Target (string) — имя цели, которую вызовет полное открытие или полное закрытие,
- Delay before close/wait (integer) — сколько секунд дверь открыта, если её не закрыть, если = -1, то она откроется только один раз и больше не закроется. Если при -1 задан и флаг 1 = "Starts open", то наоборот один раз можно закрыть, и больше не откроется. А для многократного срабатывания и фиксации положения двери поставьте здесь любое натуральное значение и установите флаг 32 = Toggle. (по умолчанию wait=4),
- Health (shoot open) (integer) — если >0, то дверь будет открываться, когда в неё пнёшь/выстрелишь и нанесёшь заданное или более сильное повреждение (по умолчанию =0),
- Locked sound/locked_sound (integer) — № звука, издаваемого заблокированной дверью в ответ игроку, если А) в Master задано имя блокирующего объекта до тех пор, пока тот объект не включится/активируется, и Б) задано название двери в поле Name/targetname
- Unlocked sound/unlocked_sound (integer) — № звука разблокировки двери. Такой звук звучит каждый раз (!) при открытии двери после разблокировки её "хозяином", т.е. тем объектом, имя которого прописано в поле master. В сам момент разблокировки он не звучит.
- Locked sentence/locked_sentence (integer) — фраза от заблокированной двери — аналогично параметру Locked sound,
- Unlocked sentence/unlocked_sentence (integer) — фраза при разблокировке двери — аналогично параметру Unlocked sound,
- Distance (deg)/distance (integer) — угловой диапазон поворота двери в градусах (по умолчанию =90),
- Render FX/renderfx,
- Render Mode/rendermode,
- FX Amount (1 - 255)/renderamt,
- FX Color (R G B)/rendercolor.
- Light Origin Target/light_origin (string) — устанавливает объект осью в новое местоположение для переосвещения при использовании ZHLT компиляторов. Типичное использование предполагает размещение объекта info_target в подходящее место, а затем задание имени info_target-а в качестве значения light_origin. Если объект непрозрачный, то в дополнение к освещённости, наведённой так, как если бы он там освещался, это вызовет и отбрасывание теней из того же места,
- Invisible (if not empty)/zhlt_invisible — непустое значение этого параметра сделает дверь невидимой в игре, что означает, что та не будет вносить вклад в скорость прорисовки игры движком (по умолчанию пусто, т.е. прорисуется), и включить отрисовку с помощью env_render не удастся; а столкновения с дверью будут продолжать просчитываться, если не отключены другими флагами,
- Non solid (if not empty)/zhlt_noclip — непустое значение параметра отключит у двери объёмную структуру столкновений на этапе компиляции карты — равнозначно действию флажка 8 = Passable (по умолчанию пусто, т.е. дверь осязаема).
Флаги двери:
- 1 = Starts open — при первой загрузке карты дверь открыта,
- 2 = Reverse direction — поворот в обратную сторону, обычно используется при включённом флаге One way (тогда для вида сверху — открывается по часовой стрелке),
- 4 = Don't link — отключает воздействие на дверь как игроков и монстров, так и её вызов из других объектов. Обычно используется:
- для отладки, чтобы совсем отключить реакцию двери,
- или чтобы сделать сложную повёрнутую фигуру так, чтобы не перекосились вершины на целочисленной сетке: к примеру, из блоков вы нарисовали автомобиль под углом 0°, который вы хотите установить под углом 20° — тогда создаёте ему ось и делаете дверью, ставите угол поворота distance = 20, флажок открытой двери 1 = Starts open и этот флаг 4 = Don't link.
- 8 = Passable — сделает дверь проходимой, как func_illusionary,
- 16 = One-way — открывается только в одну сторону (и закрывается назад в исходное положение), вокруг вертикальной оси по умолчанию против часовой стрелки, если не задан реверс,
- 32 = Toggle — дверь останавливается в открытом положении до следующего воздействия как переключатель, в отличие от параметра Delay before close=-1, её затем можно закрывать/открывать и в дальнейшем.
- 64 = X Axis — вращение двери по горизонтальной оси 0X, а не по вертикальной 0Z,
- 128 = Y Axis — вращение двери по горизонтальной оси 0Y (можно и по оси 0X задать одновременно),
- 256 = Use only — дверь станет открываться-закрываться только при вызове другими объектами (кнопками, триггерами и т. п.), а игрок или монстр не смогут прямо воздействовать на неё,
- 512 = Monsters can't — монстры не откроют дверь,
- 2048 = Not in Deathmatch — не появится в многопользовательском режиме Deathmatch.
func_illusion
— видимый в игре блок, который неосязаем, т.е. проходим насквозь для всех. Параметры:
- Name/targetname (string) — имя, с помощью которого можно изменить параметры отображения, вызвав из объекта env_render,
- Contents/skin (integer) — Включает прорисовку объёмного света, который будет имитировать эффект нахождения под водой:
- -1 — Empty — пусто (по умолчанию),
- -3 — Water — вода без волн,
- -4 — Slime — жижа,
- -5 — Lava — и без перевода ясно, что лава,
- ? — Fog — туман,
- -7 — Volumetric Light — объёмный свет, блок похож на воду, т.к. можно начать задыхаться,
- -16 — make ladder — создаёт лестницу.
- Render FX/renderfx (integer) — можно задать разные пульсации, мерцания и искажения как на неустойчивой голограмме. Режимы:
- 0 — Normal — Нормальный,
- 1 — Slow Pulse — Медленная пульсация,
- 2 — Fast Pulse — Быстрая пульсация,
- 3 — Slow Wide Pulse — Протяжённая медленная пульсация,
- 4 — Fast Wide Pulse — Протяжённая быстрая пульсация,
- 9 — Slow Strobe — Медленный строб (стробирующий импульс),
- 10 — Fast Strobe — Быстрый строб,
- 11 — Faster Strobe — Ускоренный строб,
- 12 — Slow Flicker — Медленное мерцание,
- 13 — Fast Flicker — Быстрое мерцание,
- 5 — Slow Fade Away — Медленное исчезание,
- 6 — Fast Fade Away — Быстрое (хотя и плавное) исчезание,
- 7 — Slow Become Solid — Медленное проявление,
- 8 — Fast Become Solid — Быстрое проявление,
- 14 — Constant Glow — Постоянное свечение,
- 15 — Distort — Периодические небольшие искажения,
- 16 — Hologram (Distort + fade) — Голограмма (с искажениями и затуханиями);
- Render Mode/rendermode (integer) — режим отображения:
- 0) Normal — "Нормально" — выглядит без эффектов как обычно,
- 1) Color — "Цвет" — чтобы окрасить в другой цвет, который задаётся в поле FX Color, правда в этом режиме текстура на брашевых объектах перестаёт просматриваться, все грани блока окрашиваются заданным цветом,
- 2) Texture — чтобы сделать блок частично прозрачным, степень прозрачности задаётся в поле FX Amount (часто используется для стёкол и т.п.),
- 3) Glow — свечение, но для брашевых, т.е. блоковых объектов вместо него включится режим Texture (с предупреждением про "Non-sprite set to glow" в режиме разработчика), а у спрайтов это режим свечения объекта, когда яркость не зависит от освещённости вокруг,
- 4) Solid — чтобы сделать блок прозрачным в областях, где текстура
окрашена в 255 (последний) индекс цвета в палитре (так в HL задаётся альфаканал), задайте полю FX Amount = 255,
чтобы остальные области текстур на блоке выглядели непрозрачными,
- 5) Additive — "Аддитивное отображение" — режим сложения цветов: яркость блока + яркость окружения за блоком — напоминает режим Texture, только своеобразно светящийся, т.е. чем ярче точка исходной текстуры, тем ярче её отображение в игре (в этом режиме, например, делают имитацию конусными блоками лучей прожекторов с текстурами fade...),
- FX Amount (1 - 255)/renderamt (integer) — степень прозрачности в разных режимах поля Render Mode кроме режима Normal,
- FX Color (R G B)/rendercolor (color255) — цвет для режима Render Mode = Glow или Color (по умолчанию = 0 0 0),
- Minimum light level/_minlight (string) — минимальная освещенность объекта вне зависимости от внешнего освещения.
func_monsterclip
— невидимый в игре блок непроходим для всех монстров,
которым выставлен флажок "MonsterClip".
ОЖИДАЕТСЯ ПРОДОЛЖЕНИЕ
Дополнено ObaGlaza с 2012 по декабрь 2021 гг.
<<В раздел "Статьи"
|