Registrierung - oder - Hineingehen
Adrenaline GameAdrenaline Game

Замена обычному DM...

28/01/2011
Half Life : ClimboxHalf Life : Climbox

First Person Shooter...

1/06/2014

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


  • Beschreibung
  • Einstellung

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

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


Der Autor der Lektion : Тренсфер
Der Durchsichten : 475 ( +1 )
Heruntergeladen : 0
Hochgeladen von : Streit
Erstellt : 04/07/2011 5:51:41 PM
Source : http://www.trensfer.narod.ru
Wertung :
 ( 0 ) 
Aktie :


Es gibt die folgenden Sprachen : | russisch |

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

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



Die Ähnlichen1. Добавление ножа из Op4 - Добавление ножа из Op4
2. Разбираемся в коде пушки МР5 - По просьбам трудящихся коментирую код МР5
3. Как адаптировать код к модели - Допустим, вы сделали новую модель для автомата MP5, но порядок и кол-во анимаций не сходятся.
4. Цвет HUD - Цвет HUD
5. Сохранение анимаций - как сделать так чтобы анимации на оружии(допустим) сохранялись, например все помнят КС вот там был Usp
6. Как пофиксить моргание монстров - Как пофиксить моргание монстров на движущихся платформах
Sie können nicht kommentieren, da Sie sind nicht registriert.
    Samantha Nishimura (Tomb Raider)
    Resident Evil 6Samantha Nishimura (Tomb Raider)
    Alex Wesker 1.0
    Resident Evil 6Alex Wesker 1.0
    Ashley Graham (RE4)
    Resident Evil 6Ashley Graham (RE4)
    Miscellaneous Pack #2
    Counter-Strike Global OffensiveMiscellaneous Pack #2

Время --------- ___ALL___ --------- : 0.19144 секунд