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