Статья: Два цвета крови у зомби
Автор: X-8973
Дата: 06.11.2011

Наверняка все, кто когда-либо играл в Half-Life 2, замечали, что у тамошних зомби два типа крови — при попадании пули в голову (т.е. хедкраба) брызгала зеленая/желтая кровь, а при попадании в тело, то есть в труп человека — красная. По-моему, это гораздо реалистичнее и логичнее, нежели в Half-Life 1, где кровь у зомби одного цвета — желтая (как и у любого другого монстра). Разумеется, хотелось бы, чтоб в нашей модификации (или хотя бы в оригинальной игре) все было так же красиво и логично.

Сегодня мы попытаемся это реализовать.

Для осуществления задуманного нам вновь понадобится Half-Life SDK и Microsoft Visual Studio 6. Все изменения снова будут проходить только в файле zombie.cpp.

Итак, начнем. Откроем в Visual Studio файл проекта hl.dsp, который находится в <Папка SDK>\Single-Player Source\dlls\. В окне со списком файлов проекта, в разделе Source Files находим файл zombie.cpp и кликаем по нему два раза.

Открылось окно с кодом монстра. Ищем раздел подключения заголовочных файлов (он в самом начале), и добавляем туда строку

#include "weapons.h"

Поясняю: с оружием в когтистых руках наш зомби бегать не будет. Просто в файле weapons.h описана функция, отвечающая за отрисовку крови.

Теперь спускаемся чуть ниже и в конце описания класса class CZombie : public CBaseMonster добавляем

void TraceAttack (entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType);

Именно здесь и будет отрисовываться кровь.

Теперь ищем функцию void CZombie :: HandleAnimEvent (MonsterEvent_t *pEvent) и после нее вставляем в код следующее:

void CZombie::TraceAttack (entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType)
{
  switch(ptr->iHitgroup)
  {
   case HITGROUP_CHEST://Попадание в грудь
   case HITGROUP_STOMACH://Живот
   case HITGROUP_LEFTLEG://Левая нога
   case HITGROUP_RIGHTLEG://Правая нога
   case HITGROUP_LEFTARM://Левая рука
   case HITGROUP_RIGHTARM://Правая рука
   case HITGROUP_GENERIC://Прочие группы
    SpawnBlood(ptr->vecEndPos, BLOOD_COLOR_RED, flDamage * 5.0); //Брызгает красная кровь
    break;
   case HITGROUP_HEAD://Голова
    SpawnBlood(ptr->vecEndPos, BLOOD_COLOR_YELLOW, flDamage * 5.0); //Брызгает желтая кровь
    break;
  }
  CBaseMonster::TraceAttack( pevAttacker, flDamage, vecDir, ptr, bitsDamageType );
}

И наконец идем в функцию void CZombie::Spawn() и меняем там значение параметра m_bloodColor с BLOOD_COLOR_GREEN на DONT_BLEED, чтобы желтая кровь не создавалась по умолчанию.

Все! Можно компилировать проект, копировать полученную клентскую DLL в Ваш мод или в оригинальную Half-Life, запускать и наслаждаться двумя видами крови у зомби :)

Хочу поблагодарить сайт hl-lab.ru и товарища Ku2zoff'а в частности за оригинал статьи, который можно посмотреть здесь.

Сайт создан в системе uCoz