Статистика ( по goldsrc патчам ), шт.
Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров.
Изменяем классы монстров злой барн
Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров.
Автор / ы урока : Тренсфер Просмотров : 1519 ( +1 ) Скачиваний : 0 Прислал / (а) : Streit Дата создания : 07.04.2011 20:51:41 Источник : http://www.trensfer.narod.ru Рейтинг : ( 0 ) Поделиться :
Имеются следующие переводы : |
русский |
Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров. Прежде всего хочется не писать новых монстров, а изменить старых, например сделать злого барни и поменять ему модель (разумеется на подобную и с такой же последовательностью анимаций.
Мне на настоящий момент известно 3 способа, как это сделать:
1: Скопировать весь код старого монстра и на его коде сделать нового заменяя его модель, отношение и название. Подробнее смотрите в туторе Новый монстр
Такой способ хорош тем, что можно отказаться от использования кода исходного монстра т.е. создать злого барни а доброго удалить. Но если вы хотите оставить обычного барни в вашем моде, то это способ окажется лишь пустым копированием всего одинакового кода, да и ошибиться в таком способе очень легко: забыть поменять всего лишь одну строчку. Тем кто хоть немного знает С++ не составит особого труда найти и справить эту ошибку, а вот на первых порах программирования это может составить "серьёзную проблему"
2: Наследование классов. Этот способ основан на стандартной возможности С++ -наследовании классов. Этот способ заключается в создании нового монстра, создав его на основе класса старого. Подробнее в Наследование классов. Этот способ в 4 раза короче предыдущего, но зависит от класса самого барни т.е если мы изменим код старого барни то изменения затронут и код нового. (к отношениям и моделям это не относиться). Приведу пример кода злого барни. Для этого в конец barney.cpp добавьте.
class CBarneyMad : public CBarney//Наследуем класс из строго барни
{
public:
void Spawn( void );
void Precache( void );
int Classify ( void );
};
LINK_ENTITY_TO_CLASS( monster_barney_mad, CBarneyMad );
int CBarneyMad :: Classify ( void )
{
return CLASS_HUMAN_MILITARY;//Здесь пишем классификацию
}
void CBarneyMad :: Spawn()
{
Precache( );
if (pev->model)
SET_MODEL(ENT(pev), STRING(pev->model));
else
SET_MODEL(ENT(pev), "models/barney.mdl");
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX);
pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_RED;
pev->health = gSkillData.barneyHealth;
pev->view_ofs = Vector ( 0, 0, 50 );
m_flFieldOfView = VIEW_FIELD_WIDE;
m_MonsterState = MONSTERSTATE_NONE;
pev->body = 0;
m_fGunDrawn = FALSE;
m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_DOORS_GROUP;
MonsterInit();
SetUse( FollowerUse );
}
void CBarneyMad :: Precache()
{
if (pev->model)
PRECACHE_MODEL((char*)STRING(pev->model));
else
PRECACHE_MODEL("models/barney.mdl");
PRECACHE_SOUND("barney/ba_attack1.wav" );
PRECACHE_SOUND("barney/ba_attack2.wav" );
PRECACHE_SOUND("barney/ba_pain1.wav");
PRECACHE_SOUND("barney/ba_pain2.wav");
PRECACHE_SOUND("barney/ba_pain3.wav");
PRECACHE_SOUND("barney/ba_die1.wav");
PRECACHE_SOUND("barney/ba_die2.wav");
PRECACHE_SOUND("barney/ba_die3.wav");
TalkInit();
CTalkMonster::Precache();
}
Откроем Half-Life.fgd он находится где-то в папке с Хаммером. И в конце файла добавим :
@PointClass base(Monster,TalkMonster) size(-16 -16 0, 16 16 72) studio () = monster_barney_mad : "Barney" [
model(studio) : "Custom Model"
]
monster_barney_mad - это энтити злого барни.
3: В предыдущих способах для изменения отношения монстра создавался новый новый монстр с другим отношением и другой моделью. Теперь пришла пора рассказать про возможность изменять отношение монстра прямо в редакторе карт. Данный способ используется в спирите. Давайте создадим солдат которые на нас не нападают.
В файле hgrunt.cpp замените
int CHGrunt :: Classify ( void )
{
return CLASS_HUMAN_MILITARY;
}
int CHGrunt :: Classify ( void )
{
return m_iClass?m_iClass:CLASS_HUMAN_MILITARY;
}
В basemonster.h объявим переменную для хранения класса нашего монстра, а так же виртуальную функцию классификации.
float m_flDistTooFar; // if enemy farther away than this, bits_COND_ENEMY_TOOFAR set in CheckEnemy
float m_flDistLook; // distance monster sees (Default 2048)
int m_iClass;// наша переменная
virtual int Classify( void ) { return m_iClass?m_iClass:CLASS_NONE; }
В monsters.cpp добавим в сейв нашу переменную, это нужно для того что бы значение класса монстра сохранялось при смене уровня.
DEFINE_FIELD( CBaseMonster, m_hEnemy, FIELD_EHANDLE ),
DEFINE_FIELD( CBaseMonster, m_iClass, FIELD_INTEGER ),//наш сейв
Спустимся ниже там в void CBaseMonster
KeyValue( KeyValueData *pkvd ) добавим новые строки, именно здесь мы будем считывать значение параметра m_iClass в хаммере и присваивать его одноимённой переменной.
else if (FStrEq(pkvd->szKeyName, "TriggerCondition") )
{
m_iTriggerCondition = atoi( pkvd->szValue );
pkvd->fHandled = TRUE;
}
else if (FStrEq(pkvd->szKeyName, "m_iClass") ) //считываем значение параметра
{
m_iClass = atoi( pkvd->szValue ); //присваиваем переменной значение параметра
pkvd->fHandled = TRUE;
}
else
{
CBaseToggle::KeyValue( pkvd );
}
Компилируем диллки. Теперь в Fgd найдём и изменим описание энтити monster_human_grunt добавив в его описание:
m_iClass(choices) : "Class" : 0 =
[
0 : "CLASS_NONE"
1 : "CLASS_MACHINE "
2 : "CLASS_PLAYER"
3 : "CLASS_HUMAN_PASSIVE"
4 : "CLASS_HUMAN_MILITARY"
5 : "CLASS_ALIEN_MILITARY "
6 : "CLASS_ALIEN_PASSIVE"
7 : "CLASS_ALIEN_MONSTER"
8 : "CLASS_ALIEN_PREY"
9 : "CLASS_ALIEN_PREDATOR"
10 : "CLASS_INSECT"
11 : "CLASS_PLAYER_ALLY"
12 : "CLASS_PLAYER_BIOWEAPON"
13 : "CLASS_ALIEN_BIOWEAPON"
99 : "CLASS_BARNACLE "
]
Теперь можно изменять класс монстра прямо в редакторе уровней.
Похожие 1. Добавление ножа из Op4 - Добавление ножа из Op4 2. Как адаптировать код к модели - Допустим, вы сделали новую модель для автомата MP5, но порядок и кол-во анимаций не сходятся. 3. Новый монстр - В общем-то это самый лёгкий тутор который можно придумать. 4. Переключение оружия a la HL2 - Мне не нравится, как переключается оружие в ХЛ. Может, кому-то и интересно тыкать по менюшкам худа, но мне больше нравится реализация переключения в Unreal RTN, Quake Mission Packs и HL2 5. Звук попадания как в HL2 - Работа на клиенте
Вы не можете комментировать, т.к. вы не зарегистрированы.