Итак, надеюсь основы маппинга вы знаете, и мне не придётся объяснять что такое точечная энтити и прочее. В этом туториале я расскажу вам как пользоваться системой 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