Статистика ( по комментариям ), шт.
Для создания сценариев (aka скриптов) в Half-Life существуют две энтити: scripted_sequence и scripted_sentence. Первая отвечает за движения, выполняемые монстром/персонажем, будь то ходьба, бег, нажатие кнопки, тряска автомата с газировкой или почёсывание подбородка. Вторая служит для того, чтобы персонаж произнес какую-то фразу. При этом его голова повернётся в сторону слушателя, и рот будет открываться в соответствии с амплитудой звука.
Создание сценариев
Для создания сценариев (aka скриптов) в Half-Life существуют две энтити: scripted_sequence и scripted_sentence. Первая отвечает за движения, выполняемые монстром/персонажем, будь то ходьба, бег, нажатие кнопки, тряска автомата с газировкой или почёсывание подбородка. Вторая служит для того, чтобы персонаж произнес какую-то фразу. При этом его голова повернётся в сторону слушателя, и рот будет открываться в соответствии с амплитудой звука.
Автор / ы урока : BUzer , ObaGlaza Просмотров : 4349 ( +1 ) Скачиваний : 0 Прислал / (а) : SlaY_61 Дата создания : 15.10.2011 10:44:00 Рейтинг : ( 0 ) Поделиться :
Имеются следующие переводы : |
русский |
Создание сценариев
Для создания сценариев (aka скриптов) в Half-Life существуют две энтити: scripted_sequence и scripted_sentence. Первая отвечает за движения, выполняемые монстром/персонажем, будь то ходьба, бег, нажатие кнопки, тряска автомата с газировкой или почёсывание подбородка. Вторая служит для того, чтобы персонаж произнес какую-то фразу. При этом его голова повернётся в сторону слушателя, и рот будет открываться в соответствии с амплитудой звука.
Scripted_sequence — проигрывание движения
Эта (точечная) объект-энтитя размещается там, куда пойдёт или побежит объект, на которого она настроена. Её можно подставить вплотную к полу, но следите, чтобы никакие посторонние блоки не пересекали её пускай даже краешком.
Основные параметры настраиваются следующим образом:
Name(targetname) — имя, используемое для активации сценария. Активатором, как и везде, может быть любая энтитя, включая самого монстра.
Angle — сторона, куда повернется лицом монстр, когда доберется до нужной точки.
Target — энтитя, которая активируется после завершения этого сценария, т.е., после того, как монстр доберется до точки и проделает необходимую анимацию. Обычно этой энтитей бывает другой scripted_sequence для этого же монстра, или кнопка, на которую он нажал.
Delay before trigger(delay) — задержка между завершением анимации и срабатыванием target-энтити.
Kill Target — энтитя, которая будет удалена с карты после завершения сценария (часто сюда ставят имя этого же монстра, если нужно сделать так, чтобы тот зашел за угол и исчез)
Target Monster(m_iszEntity) — имя того самого монстра, который выполняет сценарий. Это может быть также имя класса (например, monster_scientist) — в таком случае scripted_sequence выберет любого монстра этого класса в пределах радиуса, задаваемого в поле Search Radius
Action Animation(m_iszPlay) — имя анимации, которую монстр проделает, когда доберётся до расположения этого scripted_sequence. Если вам нужно, чтобы монстр просто подошёл куда-то без дополнительной анимации, то оставьте это поле пустым.
Idle Animation(m_iszIdle) — имя анимации, которую монстр будет выполнять до тех пор, пока не будет вызван scripted_sequence. Например, на карте c1a2b.bsp падение учёного в шахте лифта — пока вы не добрались до верху, он будет дёргаться, а при прохождении игроком триггера, он выполнит анимацию падения (к тому же у scripted_sequence параметр "Move to Position" = Instantaneous и установлены флаги "Leave Corpse" и "No interruptions", о чём сейчас пойдёт речь).
Или поедающий труп зомби, подскакивающий при виде игрока. Если вам нужно, чтобы монстр постоянно выполнял Idlе-анимацию (как сидящий с кружкой кофе профессор в самом начале), то оставьте поля Name и Action animation пустыми.
Search Raduis(m_flRadius) — если в поле Target Monster задан класс монстра, то монстр будет выбираться внутри радиуса, задаваемого в этом поле. Также это применяется для создания учёных и охранников, которых надо подвести к кнопке или сканеру, чтобы они их активировали — поле Name оставляется пустым, в поле Target Monster указывается класс монстра (учёный monster_scientist, Барни — monster_barney или др.), здесь указывается радиус, и устанавливается некое значение поля Repeat Rate ms (например, 10) в миллисекундах до повторной попытки вызвать объект для движения, если он окажется занят.
Repeat Rate ms(m_flRepeat) — поиск монстра в радиусе, задаваемом выше, производится с указываемой в этом поле частотой в милисекундах.
Move to position(m_fMoveTo) — опередляет способ передвижения монстра на пути к позиции.
No — монстр не пойдёт к scripted_sequence, а выполнит анимацию там, где стоит.
Walk — подойдёт, и затем выполнит анимацию.
Run — подбежит, и выполнит анимацию.
Instantaneous — он телепортируется в место scripted_sequence и выполнит анимацию (это хорошая альтернатива monstermaker'у, если монстры должны иметь какие-то настройки типа имени и т.д.).
No, Turn to Face — то же, что и No, правда перед анимацией он повернётся в направлении, указываемом в поле Angle.
Теперь флаги у scripted_sequence:
4 = Repeatable — поставьте, если сценарий нужно активировать много раз (например, ходящие учёные между компами в начале игры),
8 =Leave corpse — если в конце анимации монстр умирает (например при падении), то с этим флагом труп не исчезнет.
32 = No interruptions — если в момент проигрывания сценария игрок попытается повести монстра за собой или выстрелить в него, то сценарий не прервётся.
64 = Override AI — обычно сценарии игнорируются, если монстр в состоянии боя. Но этот флаг заставляет монстра выполнить сценарий независимо от того, чем тот занимается.
128 = No script move — после проигрывания движения монстр сместится обратно туда, где он был в её начале.
256 = 9-й недокументированный флаг (без названия, № флажка 29-1=256) — заставляет монстра после Action-анимации повторять движение заданное в Idle_animation — анимацию холостого хода — непрерывно до сброса или следующего вызова другим scripted_sequence. Такой же флаг в Half-Life 2 носит название Loop in Post Idle.
Сейчас мы этот флажок задокументируем. Открывайте ваш файл half-life.fgd, ищите scripted_sequence, под ним строчку:
128 : "No Script Movement" : 0
56 : "Loop in Post Idle" : 0
а т.к. Hammer легко воспроизводит кириллицу из кодировки Win-1251, то можно немного перевести:
256 : "Цикл пост-Idle" : 0
Чтобы задать анимацию, вам необходимо знать её название. Для этого модели можно просмотреть с помощью Jed’s Half-Life Model Viewer или Half-Life Model Viewer.
Внимание, некоторые модели, например, учёные или охранники состоят из нескольких mdl-файлов (barney.mdl, barney01.mdl, barneyt.mdl), если вы недоизвлечёте из архива их все, то при открытии просмотрщиком моделей главного файла (который без доп. оканчаний) возникнет ошибка.
Раньше нужную вам модель из подпапки Pak-архива pak0.pak/Models нужно было извлекать с помощью редакторов PakScape или PakExplorer, но с определенных пор Model Viewer научился открывать модели прямо из pak-файлов. Ну а если модели у вас и так находятся вне архива, тогда нет никаких вопросов.
Есть одна небольшая хитрость — если есть две scripted_sequence с одинаковыми именами действующие на разных монстров, то поведение монстров будет синхронизировано следующим образом: тот из монстров, кто раньше подошёл к своему объекту scripted_sequence, не будет сразу выполнять анимацию, а подождёт, пока другой тоже не достигнет своей точки, и потом они вместе выполнят свои движения. Пример этого можно увидеть прямо перед реактором, когда учёные одновременно включают сканеры. Если один из монстров прервал выполнение сценария, то и другой прервёт тоже.
Отдельный вопрос, имеющий косвенное отношение к сценариям — сидящие в креслах учёные. Для этого используется энтитя monster_sitting_scientist. Теоретически располагать её можно на любой высоте от сиденья (желательно где-то на высоте около ста единиц), она всё равно опустится до нужного уровня, главное проследите, чтобы под ней и на некотором расстоянии от неё (≈4 единиц) было только седалище, а не твёрдотельные ручки или спинка, иначе игра неправильно определит высоту и учёный окажется либо слишком высоко либо слишком низко.
При передвижении монстра в нужную точку он всегда пытается использовать сетку из объектов info_node, даже если движение вызвано сценарием. Ноды — это своеобразные узловые точки путей, наподобие тех, по которым бегают боты в многопользовательском режиме. Ставить их довольно просто — выбираете энтитю info_node и кидаете.
Высота над полом может быть любая, игра их всё равно опустит их до его уровня самостоятельно. Параметров никаких не нужно, игра, опять же, сама просчитает, какой узел из какого виден (появится надпись при самой первой загрузке карты — "Node graph is out of date. Rebuilding…") и сохранит в папочку maps\graphs. Ставьте их в основном на перекрестках и углах. Не делайте расстояние между ними слишком большими и не наваливайте их в кучу. Около дверей ставьте по два инфо_нода — с одной стороны и с другой. У лестниц тоже нужно вверху и внизу по штуке. Если будет проблема с лестницами, то сделайте ступеньки пониже (8-12 или даже 16 единиц каждая) и подлиннее (чтобы поставить ногу, людям с запасом хватит длины ступени в 32 единицы, можно и немного короче)
и вдоль одной лестницы на одной-двух средних ступенях поставьте по такому узлу. Иногда нужно ставить чаще, т.к. монстры могут пройти только по тем info_node, которые они видят, а лестницы бывают слишком высокими.
Scripted_sentence — произнесение речи
Местоположение этого объекта не имеет значения. Настраивается схожим образом с предыдущей.
Name — имя для активации.
Target — имя энтити, которая сработает после завершения фразы. Это часто используют для вызова ответной реплики другого персонажа.
Sentence Name — имя звукового события, т.е., описание звукового файла для фразы. Важно, что в начале надо поставить восклицательный знак и писать имя события заглавными буквами. Например, одна из реплик учёного: !SC_IDLE0.
Speaker Type — имя монстра, который произносит фразу
Sentence Time — время звучания. Скорее всего, служит показателем, как долго объект будет смотреть на слушающего.
Search Radius — радиус поиска говорящего монстра (по умолчанию =512)
Lishtener Type — имя слушающего монстра, к которому этот, обращаясь с репликой, повернёт голову. Как правило, тот тоже повернётся, слушая реплику. Если фраза обращена к игроку, то напишите здесь player. Если слушатель будет слишком далеко, то реплика не прозвучит.
Volume 0-10 — громкость (по умолчанию максимальная =10)
Sound Radius — дальность слышимости
0 — Small Radius — малый радиус (по умолчанию),
1 — Medium Radius — средний,
2 — Large Radius — широкий радиус,
3 — Play Everywhere — проигрывается везде, например, когда кто-нибудь в мегафон говорит.
Fire Once — запустится однократно,
Followers only — воздействовать только на тех персонажей, которые сопровождают игрока,
Interrupt Speech — прервать предыдущие разговоры, а текущая фраза не будет прерываться (впрочем не забывайте задать время звучания в поле Sentence Time), а то персонаж мог бы на середине фразы прерваться и начать говорить что-нибудь стандартное соседнему персонажу/игроку или комментировать неожиданно начавшуюся пальбу,
Concurrent — если монстр что-то говорил во время запуска scripted_sentence, то речь не прервёться, а будут звучать обе фразы параллельно.
Как и в случае со scripted_sequence, нам надо знать специальное имя звукового события. Это не то же самое, что и имя wav-файла, а, скорее, их группа. Опять зайдём в архив pak0.pak и в папке sound находим файл sentences.txt, внутренности которого устроены так:
SC_IDLE0 scientist/ipredictedthis
SC_IDLE1 scientist/containfail
SC_IDLE2 scientist/chaostheory
SC_IDLE3 scientist/howinteresting
Сначала заглавными буквами идёт имя самого звукового события, которое мы подставим в scripted_sentence (например, в поле Sentence Name=!SC_IDLE0), а потом, через пробел, список wav-ок без расширения, которые по очереди програются в этом событии. В данном примере их только по одному, но в звуковых событиях десантников вы увидите их массовое использование:
HG_ANSWER1 hgrunt/clik yessir clik
Движок проиграет Sound/hgrunt/clik.wav, затем Sound/hgrunt/yessir.wav и снова первый звук. А если не указать подкаталог, написав
HG_ANSWER1 clik yessir clik
то по умолчанию файлы clik.wav и yessir.wav движок будет искать в каталоге Sound/vox/ .
Для каждого монстра существует своя группа событий — для учёных их имена начинаются на SC_, для охранников (aka Barney) — на BA_, для десантников (aka Human Grunts) — HG_ и так далее. Правда ничто не мешает использовать речь от одного класса для персонажа другого.
Если вы будете добавлять свои речи, не забудте их также прописать по аналогии в этом файле, который приложите к своему моду. Звуковые .wav файлы должны быть 8 битными, чтобы говорящие персонажи открывали рты. В противном случае, если, например, это солдаты в противогазах, тогда можно использовать и 16-ти битный звуковой файл, и ртами никто шевелить не станет во время произнесения.
Есть ещё несколько обозначений в файле sentences.txt: запятые, точки и восклицательные знаки между названиями звуковых файлов. Точка означает короткую паузу, запятая — чуть более продолжительную, а восклицательный знак — повышение тона и громкости. Примеры:
HG_TAUNT1 hgrunt/clik roger, hold. position clik
HG_ANSWER0 hgrunt/clik uhh roger that, clik(p120) clik
HG_CHARGE1 hgrunt/clik move!. in! clik
FAR_WAR5 ambience/(v10 p120) jetflyby1
В скобках буква с числом означает преобразование звука. Если используете больше одного эффекта подряд, то разделяйте их пробелами:
P Изменение тона (транспонирование, смещение — Pitch) — в диапазоне 50-150.
100 без изменения, 50 очень низко (на октаву, т.е. в 2 раза ниже), 150 очень высоко.
Поставил 130, и народ заговорил высокими мультяшными голосами в изменённых фразах.
V Громкость (от Volume) — % от стандартной громкости.
100 без изменения, 50 половина стандартной громкости.
S Старт — начало проигрывания звука в % от начала файла.
0 проигрывает с самого начала wav-файла, 25 пропускает 25%.
E Конец (от End) — Конечное положение проигрывания в % от конца звука.
100 заканчивает проигрывание в самом конце (как обычно). А 80 заканчивает на 80% от wav файла.
T Сжатие (от Time compress) — Временное сжатие звучания в % (без смещения тона).
100 проигрывает без изменений, 50 проигрывает в 2 раза быстрее — проигрывается только каждый 2 байт wav, 30 — проигрывает на 30% короче.
Штука редко пригождается, даже спецназ переозвучивать мешает, хотя в Half-Life у спецназа использовался для имитации потерь звука в рации.
Похожие 1. Изменяем классы монстров злой барн - Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров. 2. И снова наследование классов :) - Казалось бы тема наследования классов давно избита, ан нет всё ещё существуют вопросы, правда про чуть боле сложное наследование. 3. Фикс: func_healthcharger - Фикс: func_healthcharger и func_recharger 4. Динамическое освещение - этой статье будет описан способ добавления динамических вспышек света, которые можно использовать для еффекта молнии 5. Quake strafing & DoD bobing styles - Вот от нечего делать я решил немножко изменить стиль игры в оригинальной хл. 6. Тряска игрока от наносимого урона - Вы хотите cделать чтобы игроков трясло от урона? 7. Увеличение количества мяса от взрыв - Увеличение количества мяса от взрывов людей или инопланетян. 8. Как пофиксить моргание монстров - Как пофиксить моргание монстров на движущихся платформах
JPEG 02.02.2015, 13:15:11 пишет :
#1 Это не кодинг, а маппинг
Вы не можете комментировать, т.к. вы не зарегистрированы.