Registrierung - oder - Hineingehen
AwakeningAwakening

First Person Shooter...

21/09/2007
Silent Hill: AlchemillaSilent Hill: Alchemilla

Adventure, Horror...

18/01/2015

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


  • Beschreibung
  • Einstellung

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

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


Der Autor der Lektion : Тренсфер
Der Durchsichten : 404 ( +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. Летающие бочки и trigger_push - Все, кто хотя бы один раз прошел Hl1 наверняка знает, что на карте c2a5 (там где плотина) есть такие прикольные бочки, которые подскакивают вверх и там взрываются.
2. Тряска игрока от наносимого урона - Вы хотите cделать чтобы игроков трясло от урона?
3. Мазлфлэш на брашах - Мазлфлэш на брашах
Ссылки на объект
Полная ссылка на текущем языке :
Короткая ссылка :
Ссылка на превью-картинку :
Ссылка на картинку в полном размере :
Ссылка для вашего форума или сайта
BB код ссылка:
BB код ссылка с картинкой :
BB код картинки :
HTML код ссылка:
HTML код ссылка с картинкой :
HTML код картинки :
Sie können nicht kommentieren, da Sie sind nicht registriert.
    Leon Scott Kennedy R.P.D. For BIlly Normal
    Leon Scott Kennedy R.P.D. For BIlly Normal
    Chris Redfield (RECVX Costume)
    Chris Redfield (RECVX Costume)
    PlayStation Button Mod
    PlayStation Button Mod
    Русификатор (звук) от Team Raccoon
    Русификатор (звук) от Team Raccoon