Статья: Смена модели NPC
Автор: X-8973
Дата: 29.08.2011

Итак, вот моя первая статья, посвященная маппингу, а точнее - игровому программированию ("кодингу"). В этой статье я расскажу, как разнообразить свой мод разными модельками NPC.

Ни для кого не секрет, что один вид зомби в моде - это хорошо, а три - еще лучше. Причем можно заметить, что в большинстве случаев нет смысла создавать NPC заново - достаточно взять одну модель поведения и "привить" ее разным монстрам.

Мы сделаем наоборот - "привьем" одному модулю поведения несколько разных моделек монстров. Остановимся на вышеупомянутых зомби.

Для осуществления задуманного нам понадобится Half-Life SDK и Microsoft Visual Studio 6. Сразу предвижу вопросы типа "Почему именно 6? Есть же более новые версии!". Поясняю: Half-Life была написана именно в среде Visual Studio 6. По своему опыту знаю, что с Visual Studio 2005 и 2008 SDK уживается плохо, я бы даже сказал, вообще не уживается.

Итак, приступим. Для начала откроем в Visual Studio файл проекта hl.dsp, который находится в <Папка SDK>\Single-Player Source\dlls\. Теперь идем View - WorkSpace (или жмем Alt+0). Появилось окно со списком файлов проекта. В разделе Source Files находим файл zombie.cpp и кликаем по нему два раза.

Открылось окно с кодом монстра. Идем в район 270-й строки и ищем там функцию

void CZombie :: Spawn()

Скорее всего, она выглядит так:

void CZombie :: Spawn()
{
  Precache( );

  SET_MODEL(ENT(pev), "models/zombie.mdl");
  UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX );

  pev->solid = SOLID_SLIDEBOX;
  pev->movetype = MOVETYPE_STEP;
  m_bloodColor = BLOOD_COLOR_GREEN;
  pev->health = gSkillData.zombieHealth;
  pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin.
  m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
  m_MonsterState = MONSTERSTATE_NONE;
  m_afCapability = bits_CAP_DOORS_GROUP;

  MonsterInit();
}

Строка

SET_MODEL(ENT(pev), "models/zombie.mdl");

отвечает за то, какую модель должна загрузить Half-Life при запуске. Меняем эту строку на конструкцию

if (pev->model)
  SET_MODEL(ENT(pev), STRING(pev->model)); //LRC
else
  SET_MODEL(ENT(pev), "models/zombie.mdl");

Здесь мы указали, что при загрузке нужно руководствоваться свойствами энтити-объекта monster_zombie. Если в свойстве model этого объекта что-либо прописано, то следует загрузить это что-то, иначе используем модель по умолчанию.

Теперь спускаемся чуть-чуть ниже и в функции

void CZombie :: Precache()

делаем то же самое: меняем

PRECACHE_MODEL("models/zombie.mdl");

на

if (pev->model)
  PRECACHE_MODEL((char*)STRING(pev->model)); //LRC
else
  PRECACHE_MODEL("models/zombie.mdl");

На этом изменения в SDK закончились (просто, не правда ли?). Жмем F7. Если компиляция прошла успешно, идем в <Папка SDK>\Single-Player Source\dlls\Profilehl\ и ищем там файл hl.dll. Копируем его в папку dlls нашего мода.

Теперь нам нужно изменить fgd-файл нашего Valve Hammer Editor'a так, чтобы у энтити monster_zombie появилось свойство model. Для этого откроем наш fgd-файл в Блокноте (я пользуюсь Notepad++ - намного удобнее) и найдем строку

@PointClass base(Monster,TalkMonster, Sequence) size(-16 -16 0, 16 16 72) studio("models/zombie.mdl") = monster_zombie : "Zombie" []

Это есть описание свойств энтити-объекта для Hammer Editor, а заодно указание, какую модель использовать при отображении в 3Д-режиме. Приводим описание к виду:

@PointClass base(Monster,TalkMonster, Sequence) size(-16 -16 0, 16 16 72) studio() = monster_zombie : "Zombie"
[
  model(studio) : "Model" : "models/zombie.mdl"
]

Все! Теперь у энтити-объекта monster_zombie в Хаммере появилось свойство Model, где по умолчанию прописано models/zombie.mdl. Если значение этого свойства изменить, изменится и моделька в 3Д-режиме.

Теперь можно напихать на карту кучу зомби-ученых, зомби-охранников, зомби-в-HEV-костюме и зомби-солдат (главное, чтобы имена анимаций были одинаковые), дать игроку в руки монтажку и вперед, на мины! Ордена потом...

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