Комната с диском (Portal 2)

From Valve Developer Community
< Ru
Revision as of 03:25, 21 September 2023 by Another OWL (talk | contribs) ({{Note}} instead of {{Note:ru}})
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)
"Иногда испытания должны проходить за пределами лаборатории."
- ГЛэДОС

Portal 2 Комната с диском - последнее испытание в конце каждой серии тестов в кооперативном режиме. Она находится в части комплекса, которой ГЛэДОС управлять не может, и которая служила людям последним защитным рубежом от разрастающейся власти ГЛэДОС над комплексом.

Источник дисков

Источник дисков - устройство, создающее диски. Оно восстанавливает копию диска, если он был утерян или растворён. Обычно оно находится рядом с получателем диска в конце последней камеры серии кооперативного режима. Однако, помещать его там совершенно не обязательно; если поместить источник в начале камеры, могут получиться интересные головоломки, главной задачей которых станет не потерять диск.

Шаг 1 - настройка

Привязка к сетке: 2

Создайте prop_static и выберите для неё модель models/props_gameplay/laser_disc_player.mdl и поместите её где-нибудь в комнате. Отсюда игроки будут брать диск.

Теперь создайте диск, это энтити prop_dynamic_override. Настройте её свойства так:

Свойство Значение
Name start_disc
Parent spawner_door
World Model laser_disc.mdl
Disable Shadows Yes

Поместите диск внутри модели устройства, как показано на иллюстрации справа.

Теперь создайте браш размером 8x20x1 с текстурой tools/toolsinvisible. Поместите его сверху модели диска, снова, как на иллюстрации справа. Преобразуйте браш в энтити (нажатием Ctrl+T) и сделайте её func_door. И задайте её свойства следующим образом:

Свойство Значение
Name spawner_door
Speed 26
Start Sound World.LaserDiskLoad
Delay Before Reset (-1 stay) -1
Loop Moving Sound Yes
Move Direction 0 0 0
Note.pngПримечание:Свойство Move Direction нужно задать на Pitch Yaw Roll, указанные в laser_disc_player.mdl.

Создайте ещё одну энтити, prop_physics_override, она будет диском, переносимым игроками. Нажмите Shift и перетащите start_disc так, чтобы диск находился вне устройства, и чтобы только его 'край' касался щели устройства. Измените "Class" на prop_physics_override и назовите "disc".

Шаг 2 - воссоздание диска

Создадим шаблон, по которому диск будет восстановлен в случае его утери игроками.

Note.pngПримечание:Этот шаг не является обязательным условием работы источника дисков, перейдите к шагу 3, если в вашей карте диск нигде не потеряется.

Создайте point_template со следующими свойствами:

Свойство Значение
Name template_disc_spawn
Template 1 start_disc
Template 2 spawner_door

Создайте ещё одну point_template с этими свойствами:

Свойство Значение
Name template_disc
Template 1 disc

Шаг 3 - система выходов

Теперь включено всё.
Привязка к сетке: 8

После создания всех энтитей нужно заставить источник работать, осталось подключить действия энтитей для создания диска; свяжем несколько входов и выходов!
Сначала создайте logic_auto со следующим выходом:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn template_disk_spawn ForceSpawn   0.00 No

Template:Tip:ru

В свойствах spawner_door откройте вкладку 'Output' и добавьте следующие свойства:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnFullyOpen start_disc ClearParent   0.00 No
Io11.png OnFullyOpen start_disc TurnOff   0.00 No
Io11.png OnFullyOpen template_disc ForceSpawn   0.00 No
Io11.png OnFullyOpen start_disc Kill   0.10 No
Io11.png OnFullyOpen spawner_door Kill   0.10 No


Теперь добавьте выход в template_disc_spawn:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnEntitySpawned spawner_door Open   0.00 No

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

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger template_disk_spawn ForceSpawn   0.00 No

Template:Tip:ru Теперь источник должен работать и поставлять новые диски при утере имеющегося. Однако, это лишь треть процесса создания работающей комнаты с диском.

Получатель диска

Получатель диска (или проигрыватель диска) - устройство, для которого предназначается диск; при вставке диска в получатель проигрывается видео с информацией, которую искала ГЛэДОС.

Шаг 1 - установка

Привязка к сетке: 2

Поместите prop_static в комнату и выберите модель models/props_gameplay/laser_disc_player.mdl. Здесь, в конце уровня, игроки вставят диск.

Когда игрок помещает диск возле приёмника, диск, который игрок носил ранее, будет удалён, и загрузится другой, невидимый диск. Мы сделаем именно так, чтобы лучше контролировать, как диск войдет в приёмник, и чтобы просто избежать многих проблем. Потребуется ещё одна prop_dynamic_override, она будет загружена в устройство, будучи прикреплённой к func_door.

Свойство Значение
Parent loader_door
Disable Shadows Yes
World Model laser_disc.mdl
Name hidden_disc

Диск нужно разместить так, как показано на иллюстрации справа.

Теперь создайте браш func_door с текстурой tools/toolsinvisible. Поместите его сверху на модель диска как на иллюстрации справа. Добавьте следующие свойства:

Свойство Значение
Name loader_door
Speed 8
Start Sound World.LaserDiskLoad
Delay Before Reset (-1 stay) -1
Loop Moving Sound Yes
Move Direction 0 180 0
Note.pngПримечание:Свойство Move Direction нужно задать на Pitch Yaw Roll, противоположные тем, что были заданы для laser_disc_player.mdl.
Note.pngПримечание:Длина браша func_door зависит от того, насколько вы хотите, чтобы диск ушёл внутрь; радиус диска - 25 единиц, исходите из этого. На иллюстрации выше браш имеет длину 26 единиц, что позволяет всему диску уйти внутрь.

Шаг 2 - загрузка

На первом шаге создавались видимые энтити получателя, в этом шаге - невидимые энтити.
Первая - браш trigger_once, а вторая - filter_activator_name. И добавьте следующие свойства:

1. В trigger_once:

Свойство Значение
Name  
Filter Name disc_filter

Установите флаг Physics Objects.

2. В filter_activator_name:

Свойство Значение
Name disc_filter
Filter Name disc

Шаг 3 - система выходов

Чтобы всё взаимодействовало, используем систему входов/выходов. Помните ту logic_auto, что мы использовали ранее? В её свойствах откройте вкладку "Outputs" и добавьте следующие свойства:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn hidden_disc TurnOff   0.00 No

Добавьте следующий вход в trigger_once:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnStartTouch hidden_disc TurnOn   0.00 No
Io13.png OnStartTouch !activator Kill   0.00 No
Io11.png OnStartTouch loader_door Open   0.00 No
Note.pngПримечание:Hammer может выделить команду !activator как ошибочную. Игнорируйте ошибку, в игре всё работает нормально.

Добавьте один выход в энтити loader_door:

My Output > Target Entity Target Input Parameter Delay Only Once
Io12.png OnFullyOpen disc_loaded_relay Trigger   0.00 No
Note.pngПримечание:Мы пока ещё не создали энтити disc_loaded_relay, поэтому в данный момент этот выход будет показываться как ошибочный.

Теперь получатель должен работать и принимать вставляемый диск. До завершения создания комнаты с диском ещё далеко.

Проецирование видеоролика

В этой части начинается магия.

Проецируемый ролик - это показ фильма, включающий взрыв роботов в конце.

Шаг 1 - настройка видеоролика

Создайте prop_static с моделью projector_screen.mdl (Легче найти, введя "projector" в поле фильтрации моделей). В её нижнем левом углу поместите vgui_movie_display со следующими свойствами:

Свойство Значение
Name insert_disc_movie
Movie Filename media/insert_disk.bik
Loop Movie Yes
Stretch to Fill Yes
Force precache Yes
Panel width 156
Panel height 112

Снова откройте свойства logic_auto и добавьте следующие выходы:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn insert_disc_movie Enable   0.00 No

Создайте ещё одну энтити vgui_movie_display в том же самом месте, что и предыдущая (Просто протащите уже созданную с нажатой Shift в сторону, а затем верните на место). Единственным отличием будет имя и видео, отображаемое ей:

Свойство Значение
Name aperture_movie
Movie Filename media/coop_bts_blueprints.bik
Loop Movie Yes
Stretch to Fill Yes
Force precache Yes
Panel width 156
Panel height 112

Шаг 2 - поднимаем железный занавес

Примерно так всё это должно выглядеть.

Помните ту энтити disc_loaded_relay, которую мы использовали, ещё не создав? Теперь пришла и её очередь. Сперва создайте logic_relay и назовите её disc_loaded_relay. Откройте вкладку "Outputs" и добавьте следующие свойства:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger insert_disc_movie Disable   2.00 No
Io11.png OnTrigger aperture_movie Enable   2.00 No

Создайте ambient_generic с этими свойствами:

Свойство Значение
Name disc_windup_sound
Sound Name World.LaserDiskPowerUp

И добавьте в disc_loaded_relay ещё один выход:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger disc_windup_sound PlaySound   0.00 No

И наконец-таки всё должно работать!

Завершение

  • Добавьте экземпляр и в качестве VMF Filename укажите coop_lighting_ents.vmf. Отсюда вы можете выбрать варианты тумана в вашей карте (его плотность, цвет и т.д.). Однако, в этом экземпляре более важны четыре env_global, каждая может разрешать или запрещать использование сигнального и указывающего устройства роботов. При загрузке диска должна активироваться logic_relay с четыремя выходами:
My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnTrigger @global_no_taunting_blue TurnOn   0.00 No
Io11.png OnTrigger @global_no_pinging_blue TurnOn   0.00 No
Io11.png OnTrigger @global_no_taunting_orange TurnOn   0.00 No
Io11.png OnTrigger @global_no_pinging_orange TurnOn   0.00 No
  • Создайте trigger_hurt со значением Damage равным 10000. Эта энтити должна охватывать всю комнату, но не забудьте выключить её. В подходящий момент, например, когда ГЛэДОС говорит последнюю фразу, активируйте браш trigger_hurt, чтобы роботы взорвались.
  • Поместите в комнату point_clientcommand со следующими настройками:
Свойство Значение
Name levelchange

Добавьте в trigger_hurt этот выход:

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnHurt levelchange command changelevel {распределитель или следующая камера} 0.00 No
  • Поместите статическую модель лицом к экрану с моделью models/props_underground/projector.mdl. В проекторе создайте три point_spotlight в соответствующих местах.
  • Обычно в комнатах с диском имеется доска (models/props_office/whiteboard_coop.mdl) с требованием не вставлять диск. Для соответствия картам Valve рекомендуется создать и её. Есть 6 различных вариантов.