Смена карт

DS XXI

Local Pro
Ну что ж, решил я вам написать статью по смене уровней в Half-Life. Эта проблема довольно актуальна, поэтому читайте внимательно.

Итак смена уровня состоит в основном из двух ентить, наличие которых ОБЯЗАТЕЛЬНО !!! Это trigger_changelevel и info_landmark.

Trigger_changelevel — объёмная браш-энтитя или триггер, при попадании в который или вызова оного происходит смена карты. Смотри иллюстрацию ниже:


  • Name — имя триггера, оно обязательно при флаге Use Only,
  • New map name — имя следущей карты, например если вы находитесь в map1, и надо попасть в map2, то пишите естественно map2, а в тот же trigger_changelevel с теми же функциями только в map2 пишите наоборот map1
  • Landmark Name — имя info_landmark, сведения о которой я приведу дальше, имя ставим, например, map1tomap2_lm
  • Change Target — об этом параметре напишу позже, сейчас она нам не нужна (и в принципе вообще не очень нужна),
  • Delay before change target — время перед вызовом цели, написанной в поле выше
Флаги

  • No Intermission — нам сейчас не нужно,
  • Use Only — при активации данного флага trigger_changelevel может быть вызван только другим объектом (trigger_once например) — для этого нужно вписать имя trigger_changelevel в поле target вызывающего объекта, а при попадании игрока в этот trigger_changelevel он ничего делать не будет.
Info_landmark — точечная энтитя, которая настраивает постоянный пункт появления игрока на новой карте. Её наличие в обеих картах обязательно, так как относительно положения info_landmark игрок появиться в следующей карте. Например, если при смене уровня игрок находиться на расстоянии 1 м и 60° (на виде сверху — х\у), то и в следующей карте он появиться на таком же расстоянии от этой энтити, поэтому info_landmark следует распологать аккуратно, т. к. если в следущей карте на расстоянии 1 м и 60° от info_landmark будет стена, то игрок появиться в этой стене. Я советую копировать и trigger_changelevel и info_landmark, и блоки, которые находятся рядом, в следущую карту, чтобы избежать ошибок.

  • Name — имя энтити, в нашем случае map1tomap2_lm, должно быть одинаково в обоих картах.
Также есть ещё одна брашевая энтитя trigger_transition, которую не часто, но используют:

Trigger_transition — браш-энтитя или триггер, который, так сказать, регулирует действия trigger_changelevel. Чтобы его активировать, поставьте ему то же самое имя, что и у info_landmark (в нашем случае map1tomap2_lm). У trigger_transition две основные функции. Во-первых, trigger_changelevel не будет работать если игрок не находиться в зоне trigger_transition. А во-вторых, в следующую карту попадут ТОЛЬКО ТЕ ЭНТИТИ, КОТОРЫЕ НАХОДЯТСЯ В ЗОНЕ trigger_transition!



Есть 3 основных типа смен карт:

1) Обычный (линейный)
2) Смещение
3) Односторонний и
реже встречающийся Глобальный.

Рассмотрим каждый из них подробно:

1 — Обычный (линейный)

Это самый лёгкий способ смены карты, который был практически уже описан:

Посередине коридора создаём trigger_changelevel (браш, затем на него применяем Tools->tie to entity... и выбираем trigger_changelevel),

  • в поле Name не пишем ничего за ненадобностью,
  • в поле New map name пишем map2 (карта у нас как помните map1),
  • в поле Landmark Name пишем имя ландмарки map1tomap2_lm.
Рядом с триггером создаём точечную энтитьку info_landmark, в которой в поле Name пишем map1tomap2_lm . Затем копируем trigger_changelevel, info_landmark и прилежащие к ним блоки в карту map2 и в поле Name у trigger_changelevel пишем map1, чтобы возможен был обратный переход. А затем продолжаем коридор уже в map2. Вот собсно и всё по первому способу, ничего особо сложного нету.

2 — Смещение

Если в обычном способе при смене карты ничего видимого не меняется, то в способе смещения меняется окружающая среда вокруг игрока:

Этот способ используется в случаях, например, с телепортом. Отличие от предыдущего способа в том, что вы должны убедиться, что при смене уровней игрок не застрянет в какой-нибудь стенке, для этого нужно сделать ясную область вокруг info_landmark, минимум равную той области, где начинается смена уровня в предыдущей карте (от которой игрок напрмер телепортировался). Делаем всё как в предыдущем случае, только по середине корридора ставим спрайт телепорта и вокруг него trigger_changelevel, чтобы вступив в спрайт попасть в map2. Затем копируем ТОЛЬКО trigger_changelevel и info_landmark в map2 и ставим их на место появления игрока на следущей карте. Также меняем с map2 на map1 в поле New Map Name в trigger_changelevel, как в прошлом случае. Единственный совет — место появления игрока должно быть рядом с таким же спрайтом телепорта , чтобы вступив в него уже в map2 можно было вернуться в map1. Реалистика .....

3 — Односторонний

Этот случай очень похож на вариант со смещением, разница лишь в том, что в данном случае игрок не сможет телепортироваться обратно в map1:

Создаём trigger_changelevel с флагом Use Only, Name — map1ch (остальные настройки такие же, как приведённые до) и ландмарку с таким же именем, как и раньше. Также какой-нибудь триггер или мультименеджер, который вызывает trigger_changelevel вместе с какими-нибудь эффектами. Затем копируем ТОЛЬКО trigger_changelevel и info_landmark в карту map2 и ставим их на место появления игрока на карте. В поле New Map Name в trigger_changelevel меняем с map2 на map1, это следует делать в любых случаях, даже если обратный переход невозможен!!! Всё дело в привязанности ландмарка с trigger_changelevel. Тут уже ничего не попишешь...

Вот собственно я и описал 3 основных случая смены уровня. Не очень сложно как казалось раньше, не так ли?

Но есть ещё один более сложный четвёртый способ смены карт —

Глобальный, с использованием Глобального имени:​


Например, вы едете на лифте и хотите сделать смену уровня, но не хотите потерять сам лифт. В этом случае вам как раз надо использовать Глобальное имя. Тогда лифт на карте map2, несмотря на своё изначальное положение, в начале карты будет двигаться так, как будто это тот же самый лифт из предыдущей карты map1. Для этого обоим func_plat в параметре Global Entity Name нужно поставить одинаковое имя, и расположить их в одинаковом расстоянии от info_landmark. В примерах, ссылки на которые будут представлены ниже, вы сможете найти образцы и такой смены карт.

Скачать карты с примером первого способа можно отсюда, с примером второго способа отсюда, с примером третьего метода отсюда и, наконец, четвертого способа отсюда.

Вот так, 90 % всех ошибок по смене уровней происходят по неправильным ссылкам между trigger_changelevel и info_landmark или неаккуратной расстановкой info_landmark в следующих картах.

Однажды я встретил ошибку, где у чувака все ссылки и расположения были правильными, но он появлялся где-то в совсем постороннем месте, долго думали над этим, и что бы вы думали? Он так заострил внимание на этих триггерах и лэндмарках, что забыл поместить info_player_start на карте! Это я рассказал, чтобы показать пример того, как иногда, зациклившись на тригерах и лэндмарках, забывают элементарные вещи...

Однако есть одна ошибка которая стоит особняком — когда вас выбрасывает из игры и пишет CHANGE LEVEL MAP1 LANDMARK. Данная ошибка встречается очень часто и очень трудно сразу понять в чём там дело , появляются мысли с недоработкой самой халфы и т.д. Дело же совсем в другом: эта проблема происходит когда в месте откуда игрок из map1 переходит в следующую карту, в map2 стоит trigger_changelevel, то есть игрок только появившись на новой карте (map2) сразу оказывается в trigger_changelevel и меняется назад в map1, и затем в map1 происходит та же история и так до бесконечности, игра таких поворотов явно не тянет и выбрасывает с ошибкой.

Решение данной проблемы довольно просто — отодвигайте trigger_changelevel дальше от info_landmark во второй карте map2 и всё =)

Возникает иногда также и такая проблема (за предоставление данной информации отдельное спасибо хорошему челу, который именует себя Nicord): после компиляции карты вы запускаете её в игре, и при смене карт Халфа дохнет. Происходит это потому, что включён Хаммер\Кварк\другой редактор карт. Решение просто — закройте редактор и запустите игру заново! :)

Маленький совет:
Так как смена уровней для игрока это всего лишь небольшая загрузка, всегда создавайте иллюзию из map1 (как пример с коридором), что за стеной что-то есть (двери, вентиляция и т.д.) — в общем, что уровень продолжается, а загрузка — просто небольшое недразумение . Поэтому обычные (линейные) смены карт старайтесь делать на поворотах, чтобы во второй карте не воспроизводить карту первую и наоборот. Да и так интересней играть, хотя это моё личное IMHO...