Регистрация - или - Войти

Восстановить пароль
×

Для восстановления пароля необходимо ввести логин или почту, которую Вы вводили при регистрации. После это, на Ваш почтовый ящик будет отпрвлено письмо с кодом.

Логин или почта :

Operation: NovaOperation: Nova

История уборщика в Чёрной Мезе...

4/09/2008
Статистика по очкам ( Общая )

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


  • Описание
  • КАК УСТАНОВИТЬ

Изменяем классы монстров злой барн

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


Автор / ы урока : Тренсфер
Просмотров : 1849 ( +1 )
Скачиваний : 0
Прислал / (а) : Streit
Дата создания : 07.04.2011 20:51:41
Источник : http://www.trensfer.narod.ru...
Рейтинг :
 ( 0 ) 
Поделиться :


Имеются следующие переводы : | русский |

Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров. Прежде всего хочется не писать новых монстров, а изменить старых, например сделать злого барни и поменять ему модель (разумеется на подобную и с такой же последовательностью анимаций. Мне на настоящий момент известно 3 способа, как это сделать:

1: Скопировать весь код старого монстра и на его коде сделать нового заменяя его модель, отношение и название. Подробнее смотрите в туторе Новый монстр

Такой способ хорош тем, что можно отказаться от использования кода исходного монстра т.е. создать злого барни а доброго удалить. Но если вы хотите оставить обычного барни в вашем моде, то это способ окажется лишь пустым копированием всего одинакового кода, да и ошибиться в таком способе очень легко: забыть поменять всего лишь одну строчку. Тем кто хоть немного знает С++ не составит особого труда найти и справить эту ошибку, а вот на первых порах программирования это может составить "серьёзную проблему"

2: Наследование классов. Этот способ основан на стандартной возможности С++ -наследовании классов. Этот способ заключается в создании нового монстра, создав его на основе класса старого. Подробнее в Наследование классов. Этот способ в 4 раза короче предыдущего, но зависит от класса самого барни т.е если мы изменим код старого барни то изменения затронут и код нового. (к отношениям и моделям это не относиться). Приведу пример кода злого барни. Для этого в конец barney.cpp добавьте.

Code:

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 он находится где-то в папке с Хаммером. И в конце файла добавим :

Code:

@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 замените

Code:

int CHGrunt :: Classify ( void )
{
   return CLASS_HUMAN_MILITARY;
}

на

Code:

int CHGrunt :: Classify ( void )
{
   return m_iClass?m_iClass:CLASS_HUMAN_MILITARY;
}

В basemonster.h объявим переменную для хранения класса нашего монстра, а так же виртуальную функцию классификации.

Code:

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 добавим в сейв нашу переменную, это нужно для того что бы значение класса монстра сохранялось при смене уровня.

Code:

DEFINE_FIELD( CBaseMonster, m_hEnemy, FIELD_EHANDLE ),
DEFINE_FIELD( CBaseMonster, m_iClass, FIELD_INTEGER ),//наш сейв
Спустимся ниже там в void CBaseMonster

KeyValue( KeyValueData *pkvd ) добавим новые строки, именно здесь мы будем считывать значение параметра m_iClass в хаммере и присваивать его одноимённой переменной.

Code:

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 добавив в его описание:

Code:

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. И снова наследование классов :) - Казалось бы тема наследования классов давно избита, ан нет всё ещё существуют вопросы, правда про чуть боле сложное наследование.
2. Спрыгивающий Headcrab - Наверняка каждый, кто поиграл в Half-Life2 хотел, чтобы хедкрабы спрыгивали с зомбяков и в первом Half-Life
3. Trigger_PlayerFreeez - Trigger_PlayerFreeez (остановка игрока)
4. Фикс: func_healthcharger - Фикс: func_healthcharger и func_recharger
5. Удалённый контроль зарядника - Всегда хотелось, чтобы зарядник в хл был управляемым.
6. субтитры из паранойи - субтитры из паранойи.
7. Как сделать старый 640 худ из 2560/1280 нового худа - сидел, думал как вернуть старые времена, додумал
Вы не можете комментировать, т.к. вы не зарегистрированы.
    METLKR (версия 1.0.0.11082026)
    Mass Effect 2METLKR (версия 1.0.0.11082026)
    PawnHighLight v. 1.1
    Unreal Tournament 99PawnHighLight v. 1.1
    сейв с обновлением
    Half-Life 2сейв с обновлением
    сейв "турель 19 "отомщение""
    Half-Life 2сейв