Ru/Disc Room: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
m (obsolete language category)
 
(21 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{otherlang2
{{lang|title=Комната с диском (Portal 2)|Disc Room}}
|title=Комната с диском (Portal 2)
 
|en=Disc Room
[[File:Insert disk.jpg|thumb|right|350px|"Иногда испытания должны проходить за пределами лаборатории."<br>- '''ГЛэДОС''']]
}}
[[Image:Insert disk.jpg|thumb|right|350px|"Иногда испытания должны проходить за пределами лаборатории."<br>- '''ГЛэДОС''']]
{{portal2}} '''Комната с диском''' - последнее испытание в конце каждой серии тестов в кооперативном режиме. Она находится в части комплекса, которой ГЛэДОС управлять не может, и которая служила людям последним защитным рубежом от разрастающейся власти ГЛэДОС над комплексом.
{{portal2}} '''Комната с диском''' - последнее испытание в конце каждой серии тестов в кооперативном режиме. Она находится в части комплекса, которой ГЛэДОС управлять не может, и которая служила людям последним защитным рубежом от разрастающейся власти ГЛэДОС над комплексом.
== Источник дисков ==
== Источник дисков ==
'''Источник дисков''' - устройство, создающее диски. Оно восстанавливает копию диска, если он был утерян или растворён. Обычно оно находится рядом с '''получателем диска''' в конце последней камеры серии кооперативного режима. Однако, помещать его там совершенно не обязательно; если поместить источник в начале камеры, могут получиться интересные головоломки, в которых главной задачей станет не потерять диск.  
'''Источник дисков''' - устройство, создающее диски. Оно восстанавливает копию диска, если он был утерян или растворён. Обычно оно находится рядом с '''получателем диска''' в конце последней камеры серии кооперативного режима. Однако, помещать его там совершенно не обязательно; если поместить источник в начале камеры, могут получиться интересные головоломки, главной задачей которых станет не потерять диск.  
=== Шаг 1 - настройка ===
=== Шаг 1 - настройка ===
[[Image:Disk emitter1.jpg|350px|thumb|right|Привязка к [[Basic Construction:ru#Сетка|сетке]]: 2]]
[[File:Disk emitter1.jpg|350px|thumb|right|Привязка к [[Basic Construction#Сетка|сетке]]: 2]]
Создайте [[prop_static]] и выберите для неё модель <code>models/props_gameplay/laser_disc_player.mdl</code> и поместите её где-нибудь в комнате. Отсюда игроки будут брать диск.
Создайте {{L|prop_static}} и выберите для неё модель <code>models/props_gameplay/laser_disc_player.mdl</code> и поместите её где-нибудь в комнате. Отсюда игроки будут брать диск.


Теперь создайте диск, это энтити [[prop_dynamic_override]]. Настройте её [[Hammer Object Properties Dialog|свойства]] так:
Теперь создайте диск, это энтити {{L|prop_dynamic_override}}. Настройте её {{L|Hammer Object Properties Dialog|свойства}} так:
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 25: Line 23:
Поместите диск внутри модели устройства, как показано на иллюстрации справа.
Поместите диск внутри модели устройства, как показано на иллюстрации справа.


Теперь создайте браш размером 8x20x1 с текстурой <code>tools/toolsinvisible</code>. Поместите его сверху модели диска, снова, как на иллюстрации справа. Преобразуйте браш в энтити (нажатием {{key|Ctrl|T}}) и сделайте её [[func_door]]. И задайте её свойства следующим образом:
Теперь создайте браш размером 8x20x1 с текстурой <code>tools/toolsinvisible</code>. Поместите его сверху модели диска, снова, как на иллюстрации справа. Преобразуйте браш в энтити (нажатием {{key|Ctrl|T}}) и сделайте её {{L|func_door}}. И задайте её свойства следующим образом:
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 41: Line 39:
| Move Direction || 0 0 0
| Move Direction || 0 0 0
|}
|}
{{Note:ru|Свойство Move Direction нужно задать на [[QAngle|Pitch Yaw Roll]], указанные в <code>laser_disc_player.mdl</code>.}}  
{{Note|Свойство Move Direction нужно задать на {{L|QAngle|Pitch Yaw Roll}}, указанные в <code>laser_disc_player.mdl</code>.}}  
Создайте ещё одну энтити, [[prop_physics_override]], она будет диском, переносимым игроками. Нажмите {{Key|Shift}} и перетащите ''start_disc'' так, чтобы диск находился вне устройства, и чтобы только его 'край' касался щели устройства. Измените "Class" на prop_physics_override и назовите "disc".
Создайте ещё одну энтити, {{L|prop_physics_override}}, она будет диском, переносимым игроками. Нажмите {{Key|Shift}} и перетащите ''start_disc'' так, чтобы диск находился вне устройства, и чтобы только его 'край' касался щели устройства. Измените "Class" на prop_physics_override и назовите "disc".


=== Шаг 2 - воссоздание диска ===
=== Шаг 2 - воссоздание диска ===
Создадим шаблон, по которому диск будет восстановлен в случае его утери игроками.
Создадим шаблон, по которому диск будет восстановлен в случае его утери игроками.
{{Note:ru|Этот шаг не является обязательным условием работы источника дисков, перейдите к шагу 3, если в вашей карте диск нигде не потеряется.}}
{{Note|Этот шаг не является обязательным условием работы источника дисков, перейдите к шагу 3, если в вашей карте диск нигде не потеряется.}}


Создайте [[point_template]] со следующими свойствами:  
Создайте {{L|point_template}} со следующими свойствами:  
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 69: Line 67:


=== Шаг 3 - система выходов ===
=== Шаг 3 - система выходов ===
[[Image:Disk emitter2.jpg|350px|thumb|right|Теперь включено всё.<br>Привязка к [[Basic Construction:ru#Сетка|сетке]]: 8]]
[[File:Disk emitter2.jpg|350px|thumb|right|Теперь включено всё.<br>Привязка к [[Basic Construction#Сетка|сетке]]: 8]]
After making all the entities needed to get the emitter to work, all that is left is to connect their actions to form a disc; let's make some [[Inputs and Outputs|I/O]] connections!
После создания всех энтитей нужно заставить источник работать, осталось подключить действия энтитей для создания диска; свяжем несколько {{L|Inputs_and_Outputs|входов и выходов}}!
<br>Start by creating a [[logic_auto]] with the following output:
<br>Сначала создайте {{L|logic_auto}} со следующим выходом:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 77: Line 75:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnMapSpawn || template_disk_spawn || ForceSpawn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnMapSpawn || template_disk_spawn || ForceSpawn || &nbsp; || 0.00 || No
|}
|}
{{Tip|We would use this entity again further in the tutorial, don't forget it's here.}}
{{tip|Эта энтити будет использоваться в дальнейшем, не забудьте про неё.}}


Open your '''spawner_door''' '[[Inputs and Outputs#Outputs|Output]]' tab and add the following properties:
В свойствах '''spawner_door''' откройте вкладку '[[Inputs and Outputs#Output'ы|Output]]' и добавьте следующие свойства:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 87: Line 85:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnFullyOpen || start_disc || ClearParent || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnFullyOpen || start_disc || ClearParent || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnFullyOpen || start_disc || TurnOff || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnFullyOpen || start_disc || TurnOff || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnFullyOpen || template_disc || ForceSpawn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnFullyOpen || template_disc || ForceSpawn || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnFullyOpen || start_disc || Kill || &nbsp; || 0.10 || No
| [[File:Io11.png]] || OnFullyOpen || start_disc || Kill || &nbsp; || 0.10 || No
|-
|-
| [[Image:Io11.png]] || OnFullyOpen || spawner_door || Kill || &nbsp; || 0.10 || No
| [[File:Io11.png]] || OnFullyOpen || spawner_door || Kill || &nbsp; || 0.10 || No
|}
|}




Now add the following output to your '''template_disc_spawn''':
Теперь добавьте выход в '''template_disc_spawn''':
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 105: Line 103:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnEntitySpawned || spawner_door || Open || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnEntitySpawned || spawner_door || Open || &nbsp; || 0.00 || No
|}
|}


Make sure that the entity that detects when the disc has been lost or killed has the following output:
Энтити, определяющая, когда диск теряется или уничтожается, должна иметь следующий выход:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 114: Line 112:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnTrigger || template_disk_spawn || ForceSpawn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnTrigger || template_disk_spawn || ForceSpawn || &nbsp; || 0.00 || No
|}
|}


{{Tip|It is usually advised to let the entity which destroyed said disc to fire the output. For example, when the [[Emancipation Grid|fizzler]] dissolves the disc, it will fire the output OnDissolve. Check that there are no other physic objects that can get dissolved by that fizzler.}}
{{tip|Как правило, рекомендуется, чтобы уничтожаемая энтити сообщала диску, чтобы он вызвал выход. Например, когда диск растворяется {{L|Emancipation Grid|полем антиэкспроприации}}, он вызывает выход OnDissolve. Поэтому проверьте, чтобы не было других физических объектов, которые можно растворить полем.}}
Now the emitter should be working, and dispensing new discs when the last one is gone. However, this is only a third of the process of getting the disc room to be functioning.
Теперь источник должен работать и поставлять новые диски при утере имеющегося. Однако, это лишь треть процесса создания работающей комнаты с диском.


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


The '''disc receiver''' (also '''disc player''') is where the disc is placed to fulfill its purpose; placing the disc in the receiver turns on the video showing the information GLaDOS was looking for.
'''Получатель диска''' (или '''проигрыватель диска''') - устройство, для которого предназначается диск; при вставке диска в получатель проигрывается видео с информацией, которую искала ГЛэДОС.


=== Шаг 1 - Инициализация ===
=== Шаг 1 - установка ===
[[Image:Disk loader1.jpg|350px|thumb|right|Snap on the [[Basic Construction#The_grid|grid]]: 2]]
[[File:Disk loader1.jpg|350px|thumb|right|Привязка к [[Basic Construction#Сетка|сетке]]: 2]]
Place a prop_static in your disc room, and set its model to <code>models/props_gameplay/laser_disc_player.mdl</code>. This is where the player will place the disc to end the level.  
Поместите prop_static в комнату и выберите модель <code>models/props_gameplay/laser_disc_player.mdl</code>. Здесь, в конце уровня, игроки вставят диск.  


When the player places the disc near the receiver the disc that was carried would be removed and a hidden disc would load. We will do this to have better control over the way the disc will enter the receiver and to simply overcome a lot of problems. Another '''prop_dynamic_override''' would be required, the one that would load in the device by being attached to a func_door.  
Когда игрок помещает диск возле приёмника, диск, который игрок носил ранее, будет удалён, и загрузится другой, невидимый диск. Мы сделаем именно так, чтобы лучше контролировать, как диск войдет в приёмник, и чтобы просто избежать многих проблем. Потребуется ещё одна '''prop_dynamic_override''', она будет загружена в устройство, будучи прикреплённой к func_door.  
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 140: Line 138:
| Name || hidden_disc
| Name || hidden_disc
|}
|}
The disc needs to be placed as detailed in the picture to the right.
Диск нужно разместить так, как показано на иллюстрации справа.


Now create a func_door brush with the <code>tools/toolsinvisible</code>. Place it on top of the disc model, again, as shown on the picture to the right. Add the following properties:
Теперь создайте браш func_door с текстурой <code>tools/toolsinvisible</code>. Поместите его сверху на модель диска как на иллюстрации справа. Добавьте следующие свойства:
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 158: Line 156:
| Move Direction || 0 180 0
| Move Direction || 0 180 0
|}
|}
{{Note|The Move Direction should be set to the opposite Pitch Yaw Roll you have for your laser_disc_player.mdl.}}
{{Note|Свойство Move Direction нужно задать на Pitch Yaw Roll, противоположные тем, что были заданы для laser_disc_player.mdl.}}
{{Note|The func_door brush length depends on how far you want the disc to go; the disc has a 25 unit radius, so you can judge by that. In the picture above the brush is 26 units long, making the entire disc go in.}}
{{Note|Длина браша func_door зависит от того, насколько вы хотите, чтобы диск ушёл внутрь; радиус диска - 25 единиц, исходите из этого. На иллюстрации выше браш имеет длину 26 единиц, что позволяет всему диску уйти внутрь.}}


=== Шаг 2 - Загрузка ===
=== Шаг 2 - загрузка ===
'''Step 1''' lists the visible entities used for the disc receiver, this step will list the invisible entities.
На первом шаге создавались видимые энтити получателя, в этом шаге - невидимые энтити.
<br>The first is a [[trigger_once]] brush, and the second is a [[filter_activator_name]]. Add now the following properties:
<br>Первая - браш {{L|trigger_once}}, а вторая - {{L|filter_activator_name}}. И добавьте следующие свойства:


1. The '''trigger_once''':  
1. В '''trigger_once''':  
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 173: Line 171:
| Filter Name || disc_filter
| Filter Name || disc_filter
|}
|}
Ensure the '''Physics Objects''' flag is checked.
Установите флаг '''Physics Objects'''.


2. The '''filter_activator_name''':
2. В '''filter_activator_name''':
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 184: Line 182:
|}
|}


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


To get everything interacting, we will use the I/O system. Remember that logic_auto we used? Open its Outputs tab and add the following properties:
Чтобы всё взаимодействовало, используем систему входов/выходов. Помните ту logic_auto, что мы использовали ранее? В её свойствах откройте вкладку "Outputs" и добавьте следующие свойства:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 192: Line 190:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnMapSpawn || hidden_disc || TurnOff || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnMapSpawn || hidden_disc || TurnOff || &nbsp; || 0.00 || No
|}
|}


Add the following output to the trigger_once:
Добавьте следующий вход в trigger_once:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 201: Line 199:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnStartTouch || hidden_disc || TurnOn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnStartTouch || hidden_disc || TurnOn || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io13.png]] || OnStartTouch || !activator || Kill || &nbsp; || 0.00 || No
| [[File:Io13.png]] || OnStartTouch || !activator || Kill || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnStartTouch || loader_door || Open || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnStartTouch || loader_door || Open || &nbsp; || 0.00 || No
|}
|}
{{Note|[[Hammer]] might show the !activator command in red. Just ignore it, in-game it'll work fine.}}
{{Note|{{L|Hammer}} может выделить команду !activator как ошибочную. Игнорируйте ошибку, в игре всё работает нормально.}}


To the loader_door entity add one output:
Добавьте один выход в энтити loader_door:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 215: Line 213:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io12.png]] || OnFullyOpen || disc_loaded_relay || Trigger || &nbsp; || 0.00 || No
| [[File:Io12.png]] || OnFullyOpen || disc_loaded_relay || Trigger || &nbsp; || 0.00 || No
|}
|}
{{Note|At this point we haven't yet made the disc_loaded_relay entity, so it might show that output as broken, at the moment.}}
{{Note|Мы пока ещё не создали энтити disc_loaded_relay, поэтому в данный момент этот выход будет показываться как ошибочный.}}


Now the disc receiver should be operating and accepting the disc when it's placed in it. This is, however, only one more step in the process of completing the disc room.
Теперь получатель должен работать и принимать вставляемый диск. До завершения создания комнаты с диском ещё далеко.


== Проецирование видеоролика ==
== Проецирование видеоролика ==
[[Image:Coop bts blueprints.jpg|thumb|right|300px|This is the part where the magic happens.]]
[[File:Coop bts blueprints.jpg|thumb|right|300px|В этой части начинается магия.]]
The '''projected movie''' is the sequence that happens after loading the disc. Including the bot explosion at the end.
'''Проецируемый ролик''' - это показ фильма, включающий взрыв роботов в конце.


=== Шаг 1 - настройка видеоролика ===
=== Шаг 1 - настройка видеоролика ===
We will start by placing a prop_static and set its model to <code>projector_screen.mdl</code>  (Easily found by typing "projector" in the model filter bar). Now on its lower left corner place a [[vgui_movie_display]] with the following properties:
Создайте prop_static с моделью <code>projector_screen.mdl</code>  (Легче найти, введя "projector" в поле фильтрации моделей). В её нижнем левом углу поместите {{L|vgui_movie_display}} со следующими свойствами:
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 245: Line 243:
|}
|}


Again open the properties of our logic_auto and add these outputs:
Снова откройте свойства logic_auto и добавьте следующие выходы:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 251: Line 249:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnMapSpawn || insert_disc_movie || Enable || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnMapSpawn || insert_disc_movie || Enable || &nbsp; || 0.00 || No
|}
|}


Now make another vgui_movie_display entity at the exact same spot as the last one (simply shift drag the one you have just created one unit, and move it back). The only difference will be the name and the video it will display:
Создайте ещё одну энтити vgui_movie_display в том же самом месте, что и предыдущая (Просто протащите уже созданную с нажатой {{key|shift}} в сторону, а затем верните на место). Единственным отличием будет имя и видео, отображаемое ей:
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 274: Line 272:


=== Шаг 2 - поднимаем железный занавес ===
=== Шаг 2 - поднимаем железный занавес ===
[[Image:Projector Screen.jpg|thumb|right|300px|This is how it should probably look like.]]
[[File:Projector Screen.jpg|thumb|right|300px|Примерно так всё это должно выглядеть.]]
Remember that '''disc_loaded_relay''' entity we used but didn't make? Well, we're using it now. First create a [[logic_relay]] and name it disc_loaded_relay. Open the Outputs flag and add the following properties:
Помните ту энтити '''disc_loaded_relay''', которую мы использовали, ещё не создав? Теперь пришла и её очередь. Сперва создайте {{L|logic_relay}} и назовите её disc_loaded_relay. Откройте вкладку "Outputs" и добавьте следующие свойства:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 281: Line 279:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnTrigger || insert_disc_movie || Disable || &nbsp; || 2.00 || No
| [[File:Io11.png]] || OnTrigger || insert_disc_movie || Disable || &nbsp; || 2.00 || No
|-
|-
| [[Image:Io11.png]] || OnTrigger || aperture_movie || Enable || &nbsp; || 2.00 || No
| [[File:Io11.png]] || OnTrigger || aperture_movie || Enable || &nbsp; || 2.00 || No
|}
|}


Create an [[ambient_generic]] with these properties:
Создайте {{L|ambient_generic}} с этими свойствами:


::{| class=standard-table
::{| class=standard-table
Line 296: Line 294:
|}
|}


And add to the disc_loaded_relay one more output:
И добавьте в disc_loaded_relay ещё один выход:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 302: Line 300:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnTrigger || disc_windup_sound || PlaySound || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnTrigger || disc_windup_sound || PlaySound || &nbsp; || 0.00 || No
|}
|}


And at last everything should be working!
И наконец-таки всё должно работать!
 


== Завершение ==
== Завершение ==
* Add an instance and set its VMF Filename to <code>coop_lighting_ents.vmf</code>. You can choose from here what fog options your map will have (fog density, color, etc). More importantly, however, it has four [[env_global]]s in it, each can enable, disable the bots pinging and taunting ability. You should have a '''logic_relay''' that is triggered when the disc is loaded with four outputs:
* Добавьте экземпляр и в качестве VMF Filename укажите <code>coop_lighting_ents.vmf</code>. Отсюда вы можете выбрать варианты тумана в вашей карте (его плотность, цвет и т.д.). Однако, в этом экземпляре более важны четыре {{L|env_global}}, каждая может разрешать или запрещать использование сигнального и указывающего устройства роботов. При загрузке диска должна активироваться '''logic_relay''' с четыремя выходами:
:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
|- align=left style="background:#DCDCDC; color:black"
|- align=left style="background:#DCDCDC; color:black"
Line 315: Line 312:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnTrigger || @global_no_taunting_blue || TurnOn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnTrigger || @global_no_taunting_blue || TurnOn || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnTrigger || @global_no_pinging_blue || TurnOn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnTrigger || @global_no_pinging_blue || TurnOn || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnTrigger || @global_no_taunting_orange || TurnOn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnTrigger || @global_no_taunting_orange || TurnOn || &nbsp; || 0.00 || No
|-
|-
| [[Image:Io11.png]] || OnTrigger || @global_no_pinging_orange || TurnOn || &nbsp; || 0.00 || No
| [[File:Io11.png]] || OnTrigger || @global_no_pinging_orange || TurnOn || &nbsp; || 0.00 || No
|}
|}


* Place a [[trigger_hurt]] with the Damage keyvalue set to 10000. Make sure it covers the whole disc room and don't forget to disable it. At the appropriate moment, probably when GLaDOS is making her final statement, enable the trigger_hurt brush to make the bots explode.
* Создайте {{L|trigger_hurt}} со значением Damage равным 10000. Эта энтити должна охватывать всю комнату, но не забудьте выключить её. В подходящий момент, например, когда ГЛэДОС говорит последнюю фразу, активируйте браш trigger_hurt, чтобы роботы взорвались.
* Place a [[point_clientcommand]] in your room with the following settings:
* Поместите в комнату {{L|point_clientcommand}} со следующими настройками:
::{| class=standard-table
::{| class=standard-table
!  Свойство || Значение
!  Свойство || Значение
Line 332: Line 329:
|}
|}


To your trigger_hurt add this output:
Добавьте в trigger_hurt этот выход:


:{| border=1 cellpadding="2" cellspacing="1"
:{| border=1 cellpadding="2" cellspacing="1"
Line 339: Line 336:
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
! My Output > !! Target Entity !! Target Input !! Parameter !! Delay !! Only Once
|-
|-
| [[Image:Io11.png]] || OnHurt || levelchange || command || changelevel {hub or next chamber} || 0.00 || No
| [[File:Io11.png]] || OnHurt || levelchange || command || changelevel {распределитель или следующая камера} || 0.00 || No
|}
|}


* Place a static model facing your screen and set its model to <code>models/props_underground/projector.mdl</code>. On the projector place three [[point_spotlight]], you'll know where.
* Поместите статическую модель лицом к экрану с моделью <code>models/props_underground/projector.mdl</code>. В проекторе создайте три {{L|point_spotlight}} в соответствующих местах.
* Somewhere in the disc room there is usually a whiteboard (<code>models/props_office/whiteboard_coop.mdl</code>) claiming not to upload the disc. For consistency with Valve maps, I suggest placing one too. It comes with 6 different skins.
* Обычно в комнатах с диском имеется доска (<code>models/props_office/whiteboard_coop.mdl</code>) с требованием не вставлять диск. Для соответствия картам Valve рекомендуется создать и её. Есть 6 различных вариантов.
 
 


[[Category:Portal 2 Level Design:ru]]
{{ACategory|Portal 2 Level Design}}
[[Category:Portal 2 Tutorials:ru]]
{{ACategory|Portal 2 Tutorials}}

Latest revision as of 03:44, 22 August 2024

English (en)Русский (ru)Translate (Translate)
"Иногда испытания должны проходить за пределами лаборатории."
- ГЛэДОС

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

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

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

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

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

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

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

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

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

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

Свойство Значение
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(en), указанные в laser_disc_player.mdl.

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

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

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

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

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

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

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

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

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

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

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

My Output > Target Entity Target Input Parameter Delay Only Once
Io11.png OnMapSpawn template_disk_spawn ForceSpawn   0.00 No
Tip.pngСовет:Эта энтити будет использоваться в дальнейшем, не забудьте про неё.

В свойствах 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
Tip.pngСовет:Как правило, рекомендуется, чтобы уничтожаемая энтити сообщала диску, чтобы он вызвал выход. Например, когда диск растворяется полем антиэкспроприации(en), он вызывает выход OnDissolve. Поэтому проверьте, чтобы не было других физических объектов, которые можно растворить полем.

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

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

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

Шаг 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(en), а вторая - filter_activator_name(en). И добавьте следующие свойства:

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(en) может выделить команду !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(en) со следующими свойствами:

Свойство Значение
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(en) и назовите её 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(en) с этими свойствами:

Свойство Значение
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(en), каждая может разрешать или запрещать использование сигнального и указывающего устройства роботов. При загрузке диска должна активироваться 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(en) со значением Damage равным 10000. Эта энтити должна охватывать всю комнату, но не забудьте выключить её. В подходящий момент, например, когда ГЛэДОС говорит последнюю фразу, активируйте браш trigger_hurt, чтобы роботы взорвались.
  • Поместите в комнату point_clientcommand(en) со следующими настройками:
Свойство Значение
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(en) в соответствующих местах.
  • Обычно в комнатах с диском имеется доска (models/props_office/whiteboard_coop.mdl) с требованием не вставлять диск. Для соответствия картам Valve рекомендуется создать и её. Есть 6 различных вариантов.