Приветствую всех посетителей сайта Detler'a.Многие,часто задаются вопросом "Как сделать так чтоб противники разлетались от выстрелов и взрывов?"(Маньяки блин) =) Я расскажу как это сделать,примером послужит Zombine.Почему? Да потому-что в его файле уже зарегистрированы все функции которые нам понадобятся.Ну а по примеру это можно будет перенести на любых других npc.Предупреждаю сразу,искать модели придётся вам самим т.к я юзаю тоже скаченные из нета =) В общем приступим.На сервере открываем npc_zombine.cpp Ищем Code void CNPC_Zombine::TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr ) И там нужно воткнуть код Code if ( info.GetDamageType() & ( DMG_BULLET | DMG_CLUB ) ) // DMG_BULLET говорит нам от каких патрон\урона будет работать наш код { if ( ptr->hitgroup == HITGROUP_HEAD ) // HITGROUP_HEAD Будет указывать на часть тела в которую мы стреляем { SetModel( "models/headlessbody/zombie.mdl" ); //Говорит какой моделью должен стать наш NPC CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/gibhead.mdl", 5 ); // Показывает какую модель будет в этом случае спаунить. } Тут показано что если мы стреляем в голову из дробовика,то голова пропадает с основной модели и голова спаунится отдельно. Это мы распределяем по виду Дамага(повреждения) Так же давайте разберём пример,в котором будет происходить тоже самое,только не при виде дамага,а в зависимости от кол-во повреждения. Code if( info.GetDamage() >= ( m_iMaxHealth * 0.75f ) ) // Это и будет наше указание на дамаг.Цифру меняем по вашему усмотрению. { if ( ptr->hitgroup == HITGROUP_HEAD ) { SetModel( "models/headlessbody/zombie.mdl" ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/gibhead.mdl", 5 ); }
И теперь чтоб игра не вылетала,нужно в функции Code void CNPC_Zombine::Precache( void ) Указать наши модели таким образом(естественно заменяя ссыль на модели на свои): Code BaseClass::Precache();
PrecacheModel( "models/zombie/classic_legs.mdl" ); PrecacheModel( "models/zombie/zombie_soldier.mdl" ); PrecacheModel( "models/gibs/pgib_p1.mdl" ); PrecacheModel( "models/gibs/pgib_p2.mdl" ); PrecacheModel( "models/gibs/pgib_p3.mdl" ); PrecacheModel( "models/gibs/pgib_p4.mdl" ); PrecacheModel( "models/gibs/pgib_p5.mdl" );
Теперь,какие бывают Hitgroup'ы это HITGROUP_HEAD голова HITGROUP_CHEST грудь(могу перепутать с животом) HITGROUP_STOMACH живот HITGROUP_LEFTARM Левая рука HITGROUP_RIGHTARM Правая рука HITGROUP_LEFTLEG Левая нога HITGROUP_RIGHTLEG Правая нога
Если хотите чтоб вашего зомби разрывало на куски только от взрыва,тогда ищем фунцию Code void CNPC_Zombine::Event_Killed( const CTakeDamageInfo &info ) Она говорит о том,что будет с нашим зомби,если он умирает. Туда добавим(Меняя модели на свои) Code if( info.GetDamageType() & ( DMG_BLAST ) ) // Говорит о том что разлетается зомби только от взрывов. { SetModel( "models/zombie/classic_legs.mdl" ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p1.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p2.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p3.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p4.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p5.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_jaw.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_scapula.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_scapula.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p1.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p2.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p3.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p4.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p5.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p6.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/gibhead.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/shoe.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/leg.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/niku1.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_spine.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_ribs.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_jaw.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/heart.mdl", 5 ); CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/brain.mdl", 5 );
Вот и готово.Так же не забываем прописывать все модели не только тут но и регистрировать их в Code void CNPC_Zombine::Precache( void ) Всё,радуемся. Будут вопросы,буду отвечать =)
|