Канал в IRC
RusNet: #cmt
Продвинутый унитаз
Итак, надеюсь основы маппинга вы знаете, и мне не придётся объяснять что такое точечная энтити и прочее. В этом туториале я расскажу вам как пользоваться системой I/O(Input Output system)на довольно наглядном примере. Будем делать "продвинутый" унитаз. Вы все наверное видели вот этот унитаз на dm_lockdown'e?



Согласитесь, как-то не очень эффектно он вырывается из стенки, откровенно говоря он никак и не вырывается, а просто берётся... Так давай-те же поможем ему как следует отодраться от стены, с разрушениями, с треском, с пылью %)

1) Для начала давайте создадим стенку для сартира с перегоротками, чтобы другие не пасли, когда вы делаете своё важное "дело" гыгы %).

2) Теперь создаём сам сартир при помощи точечной энтити prop_physics и изменим следующие параметры в свойствах(выберите объект в 3D view и нажмите ALT + ENTER):
"Name"="любое_имя"(я назвал "toilet1")
"World Model"="models/props_wasteland/prison_toilet01.mdl"
"Disable shadows"="yes"
Зайдём в закладку "Flags" и поставим галки напротив "Motion disabled" и "Enable motion on Physcannon grab"


3) Сейчас включите немного фантазии и представьте как бы выглядела стена после того как от неё был оторван Gravity gun'ом унитаз? Правильно, там бы образовалась дырень. Вот её давайте и сделаем. Объяснять как делать дырки думаю не надо, но добавлю что при создании дыры я использовал такие инструменты как: Clipping tool, Vertex tool и Displacement


4) Необходимо дыру заделать так как-будто её нет. Как заделывать дыру думаю рассказывать не нужно, добавлю лишь что в целях экономии времени советую копировать браши прижатой клавишей SHIFT и подгонять их инструментом Vertex tool.


5) Так, теперь необходимо выделить все эти кусочки( прижатой клавишей CTRL в 3D проэкции выделять браши ), которые вы только что заделывали и сделать их браш энтити func_breakable, изменим следующие параметры в свойствах:
"Name"="toilet1_wallbreak1"
"Performance mode"="Limit Gibs"
"Prop data"="Stone.Small"
"Material type"="CinderBlock"
"Gibs Direction"="Use Precise Gib Dir"
"Precise Gib Direction"="0 0 0" (это направления осколков после разбивания, внимательно посмотрите чтобы координаты были перпендикулярны стене)
В закладке "Flags" поставьте галку напротив "Only Break on trigger"


6) Дальше для более реалистичного эффекта добавим пыль. Устанавливаем в func_breakable точечную энтити env_smokestack, изменим следующие параметры в её свойствах:
"Name"="toilet1_smokestack1"
"Pitch Yaw Roll (Y Z X)"="90 0 0"
"Initial state"="off"
"Spread at the base"="5"
"Spread speed"="5"
"Speed"="10"
"Particle start size"="35"
"Particle end size"="45"
"Emission rate"="2"
"Lenght of smoke trail"="80"
"Wind X\Y Angle"="45"
"Wind speed"="1"
"Base color (R G B)"="253 241 196"
"Translucency"="30"


7) Для большей атмосферности давайте добавим немного землетрясения. Используем точечную энтити env_shake. Поставьте её над сартиром, как это показано на скрине: (пункт 9)
далее заходим в настройки точечной энтити env_shake, и вписываем:
"Name"="toilet1_shake1"
"Amplitude(0-16)"="10"
"Effect radius"="232"
"Duration"="0.5"
"Frequency"="3"


8) Так, осталось только связать все эти энтити в единую структуру. Вот тут то нам и понадобится I/O система.
Браш энтити func_breakable, env_smokestack и env_shake будут активироваться через "Outputs" prop_physics.
Заходим сначала в свойства точечной энтити prop_physics, потом в закладку "Outputs"( именно от сюда будут даваться команды энтитям ):
для начала нажимаем на кнопку ADD, появляется строка действия.

В поле My output named вписываем "OnMotionEnabled" (при активации данной энтити сработает посыл для энтити, вписаной в поле Targets entities named)
В поле Targets entities named вписываем "toilet1_wallbreak1"
В поле Via this input вписываем "Break"
теперь, когда вы активируете унитаз Gravity gun'ом( в данном случае ничем другим не получится, потому что в закладке Flags напротив "Enable motion on Physcannon grab" стоит галка )сработает триггер, который мы создали при помощи I/O системы, и стена разрушится.

Дальше добавим активизацию пыли. Опять жмём на кнопку ADD:
В поле My output named вписываем "OnMotionEnabled"
В поле Targets entities named вписываем "toilet1_smokestack1"
В поле Via this input вписываем "TurnOn"

Сделаем так, чтобы пыль начала улетучиваться через 2 секунды. Повторяем аналогичную ситуацию с кнопкой ADD:
В поле My output named вписываем "OnMotionEnabled"
В поле Targets entities named вписываем "toilet1_smokestack1"
В поле Via this input вписываем "TurnOff"
В поле After a delay in seconds of вписываем "2" (через 2 секунды после активации унитаза пыль рассеится)

На последок добавим "землетрясение". Кнопка ADD... :
В поле My output named вписываем "OnMotionEnabled"
В поле Targets entities named вписываем "toilet1_shake1"
В поле Via this input вписываем "StartShake"





Всё ... "продвинутый" унитаз готов. Если вы хотите повторно использовать унитаз( это актуально в HL2:DM ), то нам придётся добавить ещё три энтити.

9) Создадим неподалёку от func_physics три точечных энтити : math_counter, logic_auto и point_template.



Наша задача cделать так, чтобы при разбивании унитаза активировался триггер, который изменяет значение энтити math_counter, которая в своё время активирует точечную энтити point_template, которая в свою очередь респавнит все энтити, учавствующие в "продвинутом" унитазе.
Энтити logic_auto необходима для активации унитаза при заходе на сервер, без logic_auto мы не увидим ни унитаза, ни "заделаной" дыры.
Теорию думаю вы освоили, давайте перейдём к конкретным примерам.

10) Заходим в свойства math_counter и пишем:
"Name"="toilet1_counter"
"Maximum Legal Value"="1"
потом в "Outputs", Кнопка ADD... :
В поле My output named вписываем "OnHitMax"
В поле Targets entities named вписываем "toilet1_counter1"
В поле Via this input вписываем "SetValue"
В поле With a parameter override of вписываем "0"

опять кнопка ADD... :
В поле My output named вписываем "OnHitMax"
В поле Targets entities named вписываем "toilet1_template1" (имя энтити point_template)
В поле Via this input вписываем "ForceSpawn"
В поле After a delay in seconds of вписываем "60" ( Важный момент, это время, через которое произойдёт респавн унитаза после его разбивания. Вы можете поставить другие цифры по вкусу )



11) Заходим в свойства point_template и пишем:
"Name"="toilet1_template1"
"Template 1"="toilet1"
"Template 2"="toilet1_wallbreak1"
"Template 3"="toilet1_smokestack1"


12) И наконец идём в свойства logic_auto, сразу заходим в "Outputs", жмём на кнопку ADD и вписываем:
В поле My output named вписываем "OnMapSpawn"
В поле Targets entities named вписываем "toilet1_template1"
В поле Via this input вписываем "ForceSpawn"



Ах да, добавим в "Outputs" энтити prop_physics ещё один триггер - Break. Иначе как math_counter узнает когда ему добавится параметр?
Идём в свойства prop_physics, далее в "Outputs" опять кнопка ADD...:
В поле My output named вписываем "OnBreak"
В поле Targets entities named вписываем "toilet1_counter1"
В поле Via this input вписываем "Add"
В поле With a parameter override of вписываем "1"



В итоге получаем:




Фухх ... теперь точно всё %) ... По такому принципу можно сделать всё что угодно, только успевай фантазировать.

Автор: f0zZy
Источник: STAV-MaPPinG

CMT (CS Mapping Tutorials) - © 2006-2011. Created by VM
[ Script Execution time: 0.0021 ]