В разделе «Туториалы» -CJ- просил русскую версию тутора ( http://articles.thewavelength.net/574/ ). Этот тутор называется Dynamic NPC Stepping Sound. Очень интересная функция. Для тех кто ещё не понял объясню: в хл1 есть эвент (event 1004), который позволяет воспроизводить звук при рисовании анимации модели. Примером являются звуки шагов монстра (учёных, барни и т.д.) Так вот, все знают, что по какой бы поверхности не бежал или не шёл монстр (будь эта поверхность металл, грязь, вентиляция или просто бетон), звуки шагов всегда одинаковые. В данном туторе описывается, как сделать так, чтобы звук шагов соответствовал поверхности, по которой идёт монстр. Если вы хотите, сохранить старый эвент 1004, ведь он нужен в моделях не только для шагов, но и для других звуков, то придётся не только кодить, но и моделить (но это не обязательно). Просто перевести тутор было бы глупо, поскольку он просто не работает. Я его слегка изменил и добился полной работоспособности. Значит так, для начала откроем monsters.cpp и добавим новый заголовочный файл:
Можно сделать, чтобы громкость изменялась в зависимости от активности монстра, ведь при беге топот громче, чем при ходьбе. Для этого вместо fvol=1.0; вставляем вот это:
switch(pMonster->m_Activity) { case ACT_WALK: fvol=0.7;//Ходьба, громкость 0.7 break; case ACT_RUN: fvol=1.0;//Бег, громкость 1.0 break; default: fvol=0.5;//Дефолт, при любых других активностях громкость будет равна 0.5 break; }
Можно в принципе добавить и другие активности, но зачем это надо? Ведь при ACT_IDLE монстр стоит на месте, а при ACT_DIESIMPLE помирает. Ни в одном из случаев он не шагает. Разве что есть некоторые модели где монстр переминается с ноги на ногу или перед смертью заступает вперёд, а потом падает. Но у нас же есть дефолт:-).
Сама функция добавлена, осталось разобраться со звуками шагов. Вот самый простой вариант. Монстры топают все одинаково, точно так же как игрок:
Но есть другой вариант. Можно сделать, чтобы у каждого монстра были свои индивидуальные шаги. Ведь морпех тащит на спине рюкзак весом в 40 кг. и ещё кучу всякой дряни. Его шаги явно будут отличаться от шагов учёного.(Вспомните Day Of Defeat: когда там бежишь, за спиной брякает снаряжение) вот этот вариант:
Теперь нам надо создать новый эвент, во время исполнения которого будут звучать шаги. Спускаемся ниже к функции void CBaseMonster :: HandleAnimEvent( MonsterEvent_t *pEvent ) и куда-нибудь в неё втыкаем новый эвент:
case SCRIPT_EVENT_STEP: NPC_Step(this); break;
Теперь идём в файл scriptevent.h и перед последней сторчкой #endif указываем наш новый эвент:
#define SCRIPT_EVENT_STEP 2000
Цыфра может быть любой, кроме 1000, 1001, 1002, 1003, 1004, 5004, 1, 2, 3, 4, 5, вобщем не должна совпадать с номерами уже существующих эвентов. Рекомендую оставить 2000 потому что такого эвента в обычном хл1 нет. Если же вдруг в вашем моде есть event 2000, то придётся выбрать другой номер.
И ещё. Если вы не хотите или не можете моделить, то можно сделать, чтобы при исполнении старого эвента 1004 звучали шаги монстров.
Вернитесь в monsters.cpp и замените:
case SCRIPT_EVENT_SOUND: // Play a named wave file EMIT_SOUND( edict(), CHAN_BODY, pEvent->options, 1.0, ATTN_IDLE ); break;
На вот это:
case SCRIPT_EVENT_SOUND: // Play a named wave file if(FStrEq(pEvent->options,"common/npc_step1.wav"))//если в опцыях эвента(в модели) стоит звук npc_step1.wav то добавляется ещё и закодированный звук шагов NPC_Step(this); //аналогично пишем || Event->options,"common/npc_step2.wav || pEvent->options,"common/npc_step3.wav и т.д. else EMIT_SOUND( edict(), CHAN_BODY, pEvent->options, 1.0, ATTN_IDLE );//если в опцыях другой звук, то шаги нам не нужны break;
Я лично этого не делал, а просто добавил новый эвент в модели, так что за работоспособность ручаться не могу
Ну вот, наконец и помоделим:
Нам нужно добавить новый эвент 2000 в модель(если вы изменили старый эвент 1004 этого делать не надо, но учтите, что не у всех моделей в шагах и беге есть эвент 1004: У hgrunt.mdl нет, а у barney.mdl есть)
Итак открываем *.qc файл модели, к примеру scientist.qc
Заменяем в действиях ходьбы или бега эвент 1004 меняем на эвент 2000:
И далее аналогично. В других моделяхгде нет эвента 1004, например в hgrunt.mdl, создайте эвент 2000 для нужного кадра. Скомпильте модель и наслаждайтесь.