Registration - or - Enter
Snow War 1.0Snow War 1.0

Игра в снежки....

31/12/2004
No More Room in HellNo More Room in Hell

Нет больше места в аду...

30/10/2011

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


  • Description
  • Link and installation

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

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


Author/s of lesson : Тренсфер
Views : 406 ( +1 )
Downloads : 0
Uploaded by : Streit
Created : 04/07/2011 5:51:41 PM
Source : http://www.trensfer.narod.ru
Rating :
 ( 0 ) 
Share :


Available following translations : | russian |

Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров. Прежде всего хочется не писать новых монстров, а изменить старых, например сделать злого барни и поменять ему модель (разумеется на подобную и с такой же последовательностью анимаций. Мне на настоящий момент известно 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 "
]

Теперь можно изменять класс монстра прямо в редакторе уровней.



Similar1. Создание нового оружия - В этом туторе не будет объяснено КАК сделать новое оружие, ибо для каждого оружия нужен свой код. Здесь просто будет приведена информация о тех нюансах без которых ваше оружие не будет работать
2. Новые типы патронов - Каждый хоть раз добавлял в Хл новое оружие но ему не нравилось, что оно или слишком мощно стреляет или слишком слабо.
3. Как адаптировать код к модели - Допустим, вы сделали новую модель для автомата MP5, но порядок и кол-во анимаций не сходятся.
4. Добавление новых классов для монстр - Мы будем добавлять новый класс Блэк Опс из Оппосинг Форс
5. Фикс: func_healthcharger - Фикс: func_healthcharger и func_recharger
6. Удалённый контроль зарядника - Всегда хотелось, чтобы зарядник в хл был управляемым.
7. Тряска игрока от наносимого урона - Вы хотите cделать чтобы игроков трясло от урона?
8. Переключение оружия a la HL2 - Мне не нравится, как переключается оружие в ХЛ. Может, кому-то и интересно тыкать по менюшкам худа, но мне больше нравится реализация переключения в Unreal RTN, Quake Mission Packs и HL2
9. Создание сценариев - Для создания сценариев (aka скриптов) в Half-Life существуют две энтити: scripted_sequence и scripted_sentence. Первая отвечает за движения, выполняемые монстром/персонажем, будь то ходьба, бег, нажатие кнопки, тряска автомата с газировкой или почёсывание подбородка. Вторая служит для того, чтобы персонаж произнес какую-то фразу. При этом его голова повернётся в сторону слушателя, и рот будет открываться в соответствии с амплитудой звука.
Ссылки на объект
Полная ссылка на текущем языке :
Короткая ссылка :
Ссылка на превью-картинку :
Ссылка на картинку в полном размере :
Ссылка для вашего форума или сайта
BB код ссылка:
BB код ссылка с картинкой :
BB код картинки :
HTML код ссылка:
HTML код ссылка с картинкой :
HTML код картинки :
You cannot comment, because you are not registered.
    Leon Scott Kennedy in T-shirt (v.2.2) RE4
    Leon Scott Kennedy in T-shirt (v.2.2) RE4
    Juliet Starling Ultimate (Lollipop Chainsaw)
    Resident Evil 6Juliet Starling Ultimate (Lollipop Chainsaw)
    Natalie (Santa Girl)
    Counter-Strike Global OffensiveNatalie (Santa Girl)
    Juliet Starling Pack
    Juliet Starling Pack