Данная страница оптимизирована под:
Internet Explorer 5.0
Разрешение 800×600
Кодировку Windows-1251


А это место под ваш баннер!



   На главную страницу
Для новичков:
   О Quake3 вообще
   О тактике
   О модах
    ·Quake 3 Arena Mods
    ·Создание Мода. Урок 1
    ·Создание Мода. Урок 2
    ·Создание Мода. Урок 3
    ·Создание Мода. Урок 4
   О скинах
   О терминалогии
Статьи:
   Changelog Quake 3 Arena v1.32
   Игроки с приставкой "HARDCORE"
   Пасхальные Яйца В Quake 3 Arena
   Насколько умны игроки в Quake?
Консоль:
   О консольных командах
   О скриптах
Файлы:
   О утилах
   О патчах
   О картах
   О модельках
   О демках
   О конфигах
Арт:
   О разделе Арт
Сайт:
   О гостевой книге
   О ссылках
   О нашем баннере
   О нас

Rambler's Top100 Игры

TopCTO Игры

Создание Мода. Урок 2

   Напишем еще один мод для Quake III Arena - RailArena. Идея его проста - все оружие на карты будет Railgun, а патроны - slugs.
   Установка начального вооружения.
   Первое что нам надо сделать, что бы игрок не начал игру с пулемета (machinegun). Иначе он будет с ним до тех пор, пока не подберет RailGun. Конечно можно сделать так что бы он начинал с Railgun, но мы поступим по другому. Пусть игрок начинает с gauntlet и будет должен подобрать Railgun.
   Откроем файл g_client.c и перейдем к строке 1008 и добавим следующий код.

// positively link the client, even if the command times are weird
if ( ent->client->sess.sessionTeam != TEAM_SPECTATOR ) {
  BG_PlayerStateToEntityState( &client->ps, &ent->s, qtrue );
  VectorCopy( ent->client->ps.origin, ent->r.currentOrigin );
  trap_LinkEntity( ent );
}

//==============
//start the client with only the gaunlet
client->ps.stats[STAT_WEAPONS] = (1 << WP_GAUNTLET);
client->ps.weapon = WP_GAUNTLET;
//==============

// run the presend to set anything else
ClientEndFrame( ent );


   Теперь игрок начнет с указанного оружия. Следующая задача состоит в том что бы на карте были только RailGun и патроны к нему.
   RailGun
   Нам необходимо поменять все оружие на Railgun. Для этого нам надо изменить код функции G_CallSpawn, которая находится в файле g_spawn.c (строка 248). В этой функции мы поменяем все оружие на Railgun.

if ( !ent->classname ) {
  G_Printf ("G_CallSpawn: NULL classname\n");
  return qfalse;
}

//==============
//always spawn rail
if(Q_stricmp(ent->classname, "weapon_rocketlauncher") == 0)
{
  strcpy(ent->classname, "weapon_railgun");
}
//==============

// check item spawn functions
for ( item=bg_itemlist+1 ; item->classname ; item++ ) {


   Если внимательно присмотреться к коду, то можно заметить, что скомпилировав такой код мы получили бы на карте Railgun только вместо Rockt Launcher. Конечно, мы можем по аналогии дописать код для остальных типов оружия, но при этом получим большой объем кода и работы ;) Однако есть способ сделать это гораздо красивее. Мы можем написать функцию которая возвращала бы всегда первые 7 символов строки, где для оружия содержалось бы фраза "weapon_". Добавим код этой функции перед функцией G_CallSpawn (строка 253).

void G_GetLeft(const char *pszSource, char *pszDest, int iLen)
{
  int iSize; //size of string we need to copy

  //see how much space we need
  iSize = strlen(pszSource);

  //is len less that size?
  if(iLen < iSize)
    iSize = iLen;
  //make a copy of the string
  strcpy(pszDest, pszSource);

  //end the string at iSize
  pszDest[iSize] = '\0';
}


   Теперь изменим код функции G_CallSpawn в соответствии с написанной функцией. Добавим так же код изменения патронов на slugs.

//==============
char szClassRoot[80]; //for holding the left part of the class name
//==============

if ( !ent->classname ) {
G_Printf ("G_CallSpawn: NULL classname\n");
return qfalse;
}

//==============
//get the left 7 of the string
G_GetLeft(ent->classname, szClassRoot, 7);
//is it weapon_?
if(Q_stricmp(szClassRoot, "weapon_") ==0)
{
strcpy(ent->classname, "weapon_railgun");
}
//get the left 5 of the string
G_GetLeft(ent->classname, szClassRoot, 5);
//is it ammo_?
if(Q_stricmp(szClassRoot, "ammo_") == 0)
{
strcpy(ent->classname, "ammo_slugs");
}
//==============


   Вот и все. Останется только скомпилировать этот мод. Кстати, этот мод можно развить, создав переменную которая отвечала бы за тип оружия на карте. Тогда из консоли можно будет управлять типом оружия на карте.
   Откомпилированный MOD можно скачать здесь

www.u3d.agava.ru

Hosted by uCoz