Статья: Смена модели 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-костюме и зомби-солдат (главное, чтобы имена анимаций были одинаковые), дать игроку в руки монтажку и вперед, на мины! Ордена потом...