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