Создание скриптов
Для создания скриптов в Half-Life существуют две энтити:
scripted_sequence и scripted_sentence. Первая отвечает за движения,
выполняемые монстром, будь то ходьба, бег, нажатие кнопки, тряска
атомата с кока-колой, или почесывание подбородка. Вторая служит для
того, чтобы монстр произнес какую-то фразу. При этом его голова
повернется в сторону слушателя, и рот будет открываться в соответствии с
частотой звука.
scripted_sequence
Эта энтитя размещается там, куда пойдет или побежит объект, на которого
она настроена. Её можно подставить вплотную к полу, но следите, чтобы
никакие посторонние браши не пересекали ее, пускай даже краешком.
Основные параметры настраиваются следующим образом:
Name - имя, используемое для активации скрипта. Активатором, как и везде, может быть любая энтитя, включая самого монстра.
Angle - сторона, куда повернется лицом монстр, когда доберется до нужной точки.
Target - энтитя, которая активируется после завершения этого
скрипта, т.е., после того, как монстр доберется до точки и проделает
необходимую анимацию. Обычно этой энтитей бывает другой
scripted_sequence для этого же монстра, или кнопка, на которую он нажал.
Delay before trigger - задержка между завершением анимации и срабатыванием target-энтити.
Kill Target - энтитя, которая будет удалена с карты после
завершения скрипта (часто сюда ставят имя этого-же монстра, если нужно
сделать так, чтобы тот зашел за угол и исчез)
Target Monster - имя того самого монстра, который выполняет
скрипт. Это может быть также имя класса (например, moster_scientist) - в
таком случае scripted_sequence выберет любого монстра этого класса в
пределах радиуса, задаваемого в поле Search Radius
Action Animation - имя анимации, которую монстр проделает, когда
доберется до расположения этого scripted_sequence. Если вам нужно, чтобы
монстр просто подошел куда-то без дополнительной анимации, то оставьте
это поле пустым.
Idle Animation - имя зацикленной анимации, которую монстр будет
выполнять до тех пор, пока scripted_sequence не активируется. Например,
падение ученого в шахте лифта - пока вы не добрались до верху, он будет
дергаться, а при прохождении игроком триггера, он выполнит анимацию
падения. Или поедающий труп зомби, подскакивающий при виде игрока. Если
вам нужно, чтобы монстр всегда выполнял Idlе-анимацию (как сидящий с
кружкой кофе профессор в самом начале), то оставьте поля Name и Action animation пустыми.
Search Raduis - если в поле Target Monster задан класс
монстра, то монстр будет выбираться внутри радиуса, задаваемом в этом
поле. Также это применяется для создания ученых и барней, который надо
подвести к кнопке или сканнеру, чтобы они их активировали - поле Name оставляется пустым, в поле Target Monster указывается класс монстра (ученый или барни), здесь указывается радиус, и устанавливается некое значение поля Repeat Rate ms (например, 10).
Repeat Rate ms - поиск монстра в радиусе, задаваемом выше, производится с указываемой в этом поле частотой в милисекундах.
Move to position - опередляет способ передвижения монстра на пути к позиции.
- No - монстр не пойдет к scripted_sequence, а выполнит анимацию там, где стоит.
- Walk - подойдет, и затем выполнит анимацию.
- Run - подбежит, и выполнит анимацию.
- Instantaneous - он телепортируется в место scripted_sequence и
выполнит анимацию (это хорошая альтернатива монстермейкеру, если монстры
должны иметь какие-то настройки, типа имени и т.д.).
- No, Turn o Face - то же, что и No, правда перед анимацией он повернется в направлении, указываемом в angle.
Теперь её флаги:
Repeatable - поставьте, если скрипт нужно активировать много раз (например, ходящие ученые между компами в начале игры)
Leave corpse - если в конце анимации монстр умирает (например, падение), то с этим флагом труп не исчезнет.
No interruptions - если в момент проигрывания скрипта игрок попытается повести монстра за собой или выстрелить в него, то скрипт не прервется.
Override AI - обычно скрипты игнорируются, если монстр в
состоянии боя. Но этот флаг заставляет монстра выполнить скрипт
независимо от того, чем тот занимается.
No script move - после проигрывания анимации монстр сместится обратно туда, где он был в ее начале.
Чтобы задать анимацию, вам необходимо знать ее имя. Для этого возьмите
PakExplorer и из pak0.pak/models извлеките нужную вам модель.
Просматривается она с помощью Model Viewer. Внимание - некоторые модели,
например, ученые или барни, состоят из нескольких mdl-файлов
(barney.mdl, barney01.mdl, barneyt.mdl), если вы не извлекете их все, то
при открытии главного файла Model Viewer'ом возникнет ошибка.
Примечание: с определенных пор Model Viewer научился открывать модели прямо из pak-файлов.
Есть одна небольшая хитрость - если есть две scripted_sequence с
одинаковыми именами, и действующие на разных монстров, то поведение
монстров будет синхронизировано следующим образом - тот из монстров, кто
раньше подошел к своей scripted_sequence, не будет сразу выполнять
анимацию, а подождет, пока другой тоже не достигнет своей точки, и потом
они вместе выполнят свои анимации. Пример этого можно увидеть прямо
перед реактором, когда ученые одновременно включают сканнеры. Если один
из монстров прервал выполнение скрипта, то и другой прервет тоже.
Отдельный вопрос, имеющий косвенное отношение к скриптам - сидящие в креслах ученые. Для этого используется энтитя monster_sitting_scientist.
Теоретически, располагать ее можно на любой высоте от сиденья
(желательно где-то на высоте около ста пикселей), она все-равно
опустится до нужного уровня, главное проследите, чтобы под ней и на
некотором расстоянии от нее (~4 пикс.) было только седалище, а не ручки
или спинка, иначе игра неправильно определит высоту и ученый окажется
либо слишком высоко, либо слишком низко.
При передвижении монстра в нужную точку он всегда пытается использовать
сетку из нодов, даже если движение вызвано скриптом. Ноды - это
своеобразные вейпоинты, наподобие тех, по которым бегают боты в
мультиплеере. Ставить их довольно просто - выбираете энтитю info_node и кидаете.
Высота над полом может быть любая, игра их все-равно опустит их до его
уровня самостоятельно. Параметров никаких не нужно, игра, опять же, сама
просчитает, какой нод из какого виден (появится надпись при загрузке
карты - "Node graph is out of date. Rebuilding...") и сохранит в папочку
nodes. Ставьте их в основном на перекрестках и углах. Не делайте
расстояние между ними слишком большим и не наваливайте их в кучу. Около
дверей ставьте под два нода - с одной стороны, и с другой. Если будет
проблема с лестницами, то сделйте ступеньки пониже (8-12 пикс.) и на
каждой поставьте по ноду, хотя это не всегда обязательно.
scripted_sentence
Местоположение энтити не имеет значения. Настраивается схожим образом с предыдущей.
Name - имя для активации.
Target - имя энтити, которая сработает после завершения фразы. Это часто используют для активации ответной реплики другого монстра.
Sentence Name - имя звукового события, т.е., описание звукового
файла для фразы. Важно - в начале надо поставить восклицательный знак и
писать имя события заглавными буквами.
Speaker Type - имя монстра, который произносит фразу
Sentence Time - время звучания. Скорее всего, служит показателем, как долго объект будет смотреть на слушающего.
Lishtener Type - имя слушающего монстра, к которому этот,
обращаясь с репликой, повернет голову. Как правило, тот тоже повернется,
слушая реплику. Если реплика обращена к игроку, то напишите здесь
player.
Если слушатель будет слишком далеко, то реплика не прозвучит.
Как и в случае со scripted_sequence, нам надо знать специальное имя
звукового события. Это не совсем то же, что и имя wav-файла, а, скорее,
их группа. Опять лезем в pak0.pak и в папке sound находим файл sentences.txt, внутренности которого имеют примерно такой вид:
SC_IDLE0 scientist/ipredictedthis
SC_IDLE1 scientist/containfail
SC_IDLE2 scientist/chaostheory
Сначала заглавными буквами идет имя самого звукового события, которое мы
подставим в scripted_sentence, а потом, через пробел, список wav-ок без
расширения, которые по очереди програются в этом событии. В данном
примере их только по одному, но в звуковых событиях десантников вы
увидите их массовое использование. Учтите, что для каждого монстра
существует своя группа событий - для ученых их имена начинаются на SC,
для барни - на BA, для десов - HG, и так далее.
Если вы будете добавлять свои речи, не забудте их также прописать по аналогии в этом файле, который приложите к своему моду.
Вот вроде и все, удачных и интересных вам скриптов!
|