[HL2] Тутор: Капсулы из цитадели
Часть 1
Давно задумал воспроизвести на своей карте момент из оригинала хл2, где в цитадели двигались по особым подвесным рельсам металлические капсулы-камеры, в которых еще можно прокатиться игроку, да все времени не было. И вот, наконец-то дошли руки.
Ниже приведен убогонький рисунок, на нем показано расположение всех важных элементов.
Начнем, как обычно, с простой комнаты. Я свою закрасил такими текстурами, чтобы не отвлекали внимание. В центре комнаты, как у меня на рисунке, проведите под потолком монорельсу, закрасив ее для начала текстурой поярче. Длинный браш монорельсы превратите в энтитю
funk_brush.
Теперь приступим к созданию статичной модели капсулы. Разместите энтитю
prop_vehicle_prisoner_pod на карте, выберите для нее модель
prisoner_pod_inner. Далее установим на карте две
prop_dynamic – в строчках World Model выберите
inner_pod_arm и
inner_pod_rotator из папки
vehicle. Разместите их так, как показано на рисунке. «Ротатор» должен быть присоединен под верхний захват капсулы, хоть особой роли это не играет, но при физической привязке капсула будет качаться реалистичнее.
Создайте в месте соединения «ротатора» и «держателя» объект
funk_door_rotating. Он понадобится, если вы захотите сделать поворот капсулы на месте, к тому же дальнейшая связка объектов будет идти через него.(см. рисунок)
На другом, свободном конце держателя, разместите объект
funk_tracktrain. Он, как уже ясно, будет заставлять двигаться нашу капсулу вперед. Важный момент – капсула будет стыковаться с монорельсом через держатель как раз в том месте, где будет расположен
funk_tracktrain.
В принципе, можно обойтись и более простой конструкцией кронштейнов, но так капсула будет двигаться нереалистично.
Теперь, самый важный элемент конструкции – энтитя
phys_ragdollconstraint. Она будет отвечать за правильное крепление капсулы к кронштейну, а так же за реалистичное раскачивание. Разместите ее в месте стыка капсулы и ротатора.
Теперь самый муторный момент – настройка всех объектов. Одна ошибка – и наша конструкция будет вести себя неадекватно. Ниже буду приводить название объекта, и описывать необходимые настройки.
prop_vehicle_prisoner_pod
name – pod (или укажите любое удобное вам имя)
func_tracktrain
name – train
first stop target – p1 (это имя первой точки отправления, но об этом чуть ниже)
Max speed – 70
Initial speed – 20 (думаю, тут все ясно. начальная скорость, и скорость постоянная)
func_door_rotating
name – rotator
parent - train
prop_dynamic
World model – inner_pod_rotator
name – указывать не нужно
parent – rotator
prop_dynamic
World model – inner_pod_arm
name – указывать не нужно
parent – train
phys_ragdollconstraint
name – phys
Entity 1 – pod
Entity 2 – rotator (таким образом мы скрепили физику двух моделей. Обратите внимание на скриншот – там показано правильное расположение энтити – ровно посередине между капсулой и prop_dynamic )
X axis min limit – 0
X axis max limit – 0
Y axis min limit – - 35
Y axis max limit – 40
Z axis min limit – 0
Z axis min limit – 0
X axis friction – 0.6
Z axis friction – 0.6 (фух, эти параметры отвечают за способность капсулы к раскачиванию относительно нашей физической точки опоры)
Настройка объектов закончена. Теперь аутпуты. Создайте где-нибудь в пределах карты объект
logic_auto, жмем в нем закладку
Outputs и добавляем следующие строчки:
OnMapSpawn => pod => EnterVehicleImmediate (с загрузкой карты игрок будет уже в капсуле)
OnMapSpawn => pod => Lock (капсула с игроком будет закрыта, чтобы не выбрался во время движения)
OnMapSpawn => train => StartForward (прикажет нашей трэйн-энтити двигаться до первой точки)
С аутпутами покончено. Теперь осталось разместить на монорельсе два объекта
path_track – один вначале, чуть дальше нашей капсулы, другой в конце. Назовите первый объект p1 и укажите следующей точкой объект p2. Объект p2 должен быть конечным, поэтому удалите в нем строчку, если таковая появилась, о следующей точке движения.
Осталось разместить в любой точке карты место появления игрока – оно не играет роли, так как с загрузкой карты игрок будет уже в капсуле, и источник света. Сохраняем, компилим – и вуаля – сразу после загрузки игрок находится в качающейся капсуле, которая едет вперед по монорельсе. Можно добавить триггер, открывающий в определенный момент капсулу – но это вы уже додумайте сами. Сразу охватить весь тутор достаточно сложно, поэтому мои исходники и готовая карта прилагаются.
Возможные баги
Текстуры на капсуле даже на высшем качестве весьма размыты и выглядят некрасиво. Постройте освещение так, чтобы капсула была не сильно освещена.
Капсула может двигаться только вперед – при попытке зациклить точки parh_track’a, в одну сторону капсула движется нормально, а на обратном пути неимоверно изворачивается и цепляется за воздух)) Поэтому я и удалил следующую точку движения у объекта р2.
Часть 2
Итак, возник вопрос о добавлении в капсулу npc. Об этом повествует вторая часть туториала.
*Прежде чем приступать в модернизации карты, нужно удалить из аутпутов энтити
Logic_auto строчку
OnMapSpawn => pod => EnterVehicleImmediate
Если вы имеете дело с npc, имеющими продвинутые настройки (например
npc_eli), добавление его в капсулу не составит труда. В строчке
Parent настроек npc нужно указать имя капсулы – внашем случае это
pod. Перед этим «тело» npc следует поместить в капсулу примерно в том положении, в котором оно должно находиться в ней во время игры. Если вы действительно захотите поместить в капсулу Элая, придется ее несколько расширить – для этого следует в пункте
World Model указать модель капсулы как
eli_pod_inner.mdl
Однако чаще при построении уровня приходится сталкиваться с npc с более низким уровнем настроек. Примером таких персонажей могут стать
npc_stalker,
npc_combine_soldier. В меню их настроек отсутствует параметр
Parent, и связать их с капсулой не получится.
Приходится идти на хитрость, которой пользовались и сами Valve. Вместо полноценной энтити npc, мы устанавливаем на карту ентити prop_dynamic. Поля настроек заполняются следующим образом:
Parent: Pod
Pitch Yaw Roll (Y Z X): -1 0 0 (этот параметр определяет вращение модели энтити от «нулевой оси». В данном случае этот параметр чуть отклоняет назад модель, чтобы она более точно подходила под капсулу)
World Model: models/stalker.mdl (в капсулу сажаем сталкера)
Disable Shadows: Yes
Name: Garry (возможно, потребуется разнообразить функциональность энтити. В этом случае пригодится имя)
Default Animations: podconvulse (Выбераем анимацию, которую бует проигрывать модель в процессе игры. Просмотреть и выбрать анимацию можно в разделе Model настроек энтити.)
В настройках капсулы мы ничего не меняем. Разве что можно поэкспериментировать с параметром
Disable Shadows.
Теперь нужно поместить энтитю с настроенной моделью в капсулу. Разумеется, желательно избегать конечностей и частей тела, торчащих сквозь металл. В настройке положения поможет параметр
Pitch Yaw Roll (Y Z X), в нашем случае он настроен таким образом, чтобы анимация модели podconvulse не портила внешний вид.
*на изображении можно видеть сталкера с дефолтной анимацией.
В игре будет отображаться анимация модели, указанная в настройках
Default Animations
Ниже представлены исходники и откомпиллированные карты для туториала.