Registrierung - oder - Hineingehen
KorsakoviaKorsakovia

Мод рассказывает нам историю человека по имени Кристофер, страдающего редким синдромом Корсакова. Похоже, что Кристофер ...

20/09/2009

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


  • Beschreibung
  • WIE INSTALLIERT MAN

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

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


Der Autor der Lektion : Тренсфер
Der Durchsichten : 521 ( +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. Создание нового ствола - Создание нового ствола с новыми патронами
2. Исходный код снайперки - weapon_sniperrifle с оптическим прицелом
3. Новые типы патронов - Каждый хоть раз добавлял в Хл новое оружие но ему не нравилось, что оно или слишком мощно стреляет или слишком слабо.
4. Удалённый контроль зарядника - Всегда хотелось, чтобы зарядник в хл был управляемым.
5. Динамическое освещение - этой статье будет описан способ добавления динамических вспышек света, которые можно использовать для еффекта молнии
6. Как пофиксить моргание монстров - Как пофиксить моргание монстров на движущихся платформах
7. Изменение цвета HUD'а(полное)! - Изменение цвета HUD'а(полное)! Но прицелы придётся переделывать вам самим! Сдесь я перевевёл туториал с twhl.info на русский язык!
8. Water Splash - Добавляем брызги при выстреле по воде
Sie können nicht kommentieren, da Sie sind nicht registriert.
    Bubblegum Crisis 2032 Anime Character Pack Beta 2
    Unreal Tournament 3Bubblegum Crisis 2032 Anime Character Pack Beta 2
    Quake 4 Railgun V1.2
    Unreal Tournament 3Quake 4 Railgun V1.2
    Desert Falcon Unit
    Unreal Tournament 2004Desert Falcon Unit
    Hyperdimension Character + Voices Pack
    Unreal Tournament 2004Hyperdimension Character + Voices Pack

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