QuakeC:Взрывпакет

Написано: воскресенье, 24 марта 2013 г. автор st1x51
0

Сложность: Средняя
Шаг 1
Ок, в в этом уроке мы научимся создавать Взрывпакет. Звучит внушающе, не так ли? Нельзя не согласиться! Найдите функцию Impulse Commands в файле weapons.qc. Скопируйте код, который написан ниже и добавьте импульс-команду (impulse 20), которая будет активизировать DropDetpack:
/*
============
ImpulseCommands

============
*/
void() ImpulseCommands =
{
if (self.impulse >= 1 && self.impulse <= 8) w_changeweapon ();
if (self.impulse== 9) cheatcommand ();
if (self.impulse== 10) cycleweaponcommand ();
if (self.impulse== 11) serverflagscommand ();
if (self.impulse == 20) DropDetpack (); //активизировать функцию DropDetpack, когда мы введем в консоли "impulse 20".
if (self.impulse == 255) QuadCheat ();

self.impulse = 0;
};
Шаг 2
Так, теперь нам надо добавить функцию, которую мы назовем DropDetpack, в файле weapons.qc (давайте добавим ее чуть выше блока Player Weapon Use). Вот описание этой функции:
void() DropDetpack =
{
if (self.ammo_rockets >= 25)
//Смотрим, есть ли у игрока хотя бы 25 рокет. Если есть, то...
{
self.ammo_rockets = self.ammo_rockets - 25; //забираем у него 25 рокет,

local entity item; //создаем локальный объект (пусть будет "item"),

item = spawn(); //запускаем объект "item" в игру,
item.origin = self.origin - '0 0 24'; //кладем объект "item" ниже центра игрока на 24 еденицы (т.е. под ноги игрока),

item.velocity_z = 300; //подбрасываем объект "item" на 300 едениц вверх,
item.velocity_x = -100 + (random() * 200); //а по горизонтали объект "item" полетит
item.velocity_y = -100 + (random() * 200); //в каком-нибудь случайном направлении

item.flags = FL_ITEM;
item.solid = SOLID_TRIGGER; //SOLID_TRIGGER, означает, что если кто-то коснется объекта "item",
// то активизируется некоторый триггер(его мы пропишем чуть позже).
item.movetype = MOVETYPE_TOSS; //Тип движения... эээ... броском !!
setmodel (item, "progs/backpack.mdl"); //Присваеваем объекту "item" модель "backpack", находящуюся в директории "progs/",
setsize (item, '-16 -16 0', '16 16 56'); //Задаем габариты объекта "item" ('-x -y -z' , '+x +y +z' ),
item.owner = self; //говорим объекту "item", что его выпустили мы.
item.touch = DetpackTouch; //если наш взрывпакет упал на кого-нибудь, когда мы его выкинули,
// то активируем функцию DetpackTouch

item.nextthink = time + 120; //После 2 минут переходим к функции item.think
item.think = DetpackExplode; //которая "запускает" функцию DetpackExplode
}
else //Ну, а если нету 25 рокет, то...
{
sprint (self, "You haven't enough rockets, baby.\n"); //Выводим надпись "You haven't enough rockets, baby."
return; //и возвращаемся в игру
}
};
Шаг 3
О'кей. Теперь сделаем две функции : первая - DetpackTouch, которая прикажет Взрывпакету взорваться, если на нее наступит кто-нибудь (кроме нас самих, конечно) и вторая - DetpackExplode, которая... отлично сработает, если Взрывпакет попадает на кого нибудь во время его выброса. Т.е у нас есть две причины, чтобы взорвать Взрывпакета >:)

Сейчас я опишу как это происходит:
Когда наш Взрывпакет попадает на кого-нибудь, то мы сразу взрываем его функцией DetpackExplode. Если же на Взрывпакет наступит кто-то, то мы сначала функцией DetpackTouch определяем, кто наступил на него, "мы" или "не мы", и если "не мы", то взрываем Взрывпакет функцией DetpackExplode. Т.е. в функции DetpackExplode мы нуждаемся раньше функции DetpackTouch, следовательно функция DetpackTouch должна быть ниже функции DetpackExplode.

Вот код, что мы должны написать:

void () DetpackExplode =
{
T_RadiusDamage (self, self.owner, 1000, world); //Здесь мы задаем радиус поражения, у гранат он
//равен 120, но ведь мы хотим БОЛЬШОГО ВЗРЫВА,
//и поэтому ставим 1000 !!! ;-)

//Далее указываем, что :
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); //а) объект темповый(временный),
WriteByte (MSG_BROADCAST, TE_EXPLOSION); //б) объект взрывчатый(хе-хе, а как же иначе-то?>:о).
WriteCoord (MSG_BROADCAST, self.origin_x); //создает X-координату для Backpack
WriteCoord (MSG_BROADCAST, self.origin_y); //создает Y-координату для Backpack
WriteCoord (MSG_BROADCAST, self.origin_z); //создает Z-координату для Backpack

BecomeExplosion (); //Производим ВЗРЫВ (БОЛЬШОЙ) !!!
};

void() DetpackTouch =
{
if (other == self.owner) //делаем так, чтобы detpack игнорировал нас, если он упадет на нас
{
return; //то есть возвращаемся в игру.
}
if (other.takedamage == DAMAGE_AIM) //Если игрок (кроме нас) или монстр, на которого упал наш detpack может быть поврежден,то
{
DetpackExplode(); //Производим ВЗРЫВ (см.предыдущую функцию) !!!
return; //и возвращаемся в игру.
}
if (self.velocity == '0 0 0') //если detpack уже не падает, то:
{
self.avelocity = '0 0 0'; //препятствуем "угловому движению"
}
};

Отлично... эти функции нужно добавлять ниже нашей функции DropDetpack.
Шаг 4
Последний шаг! Так, как наше дополнение использует новую модель (backpack.mdl), то нам нужно ее "подготовить". Итак, под подготовкой звуков в самом верху файла weapons.qc добавте самую нижнюю строчку примера:

precache_sound ("weapons/grenade.wav"); // звук выстрела из гранатомета
precache_sound ("weapons/bounce.wav"); // звук отскока гранаты от стены
precache_sound ("weapons/shotgn2.wav"); // звук выстрела из двустволки
precache_model ("progs/backpack.mdl"); // модель рюкзачка для DetPack

И кто тут сказал, что это трудно ?! Теперь компилируйте и посмотрите, что получилось. Во время игры наберите в консоли impulse 20 и посмотрите что получилось!!

QuakeC:Больше крови

Написано: автор st1x51
0

Сложность: Легкая
Шаг 1
Это дополнение дает больше крови в сетевой и одиночной играх . Все это делается очень легко в файле weapons.qc. Откройте этот файл для редактирования и опускайтесь вниз до нижеприведенных строчек.
/*
================
SpawnBlood
================
*/

void(vector org, vector vel, float damage) SpawnBlood =
{
particle (org, vel*0.1, 73, damage*2);
};

Шаг 2
Вставте три строчки, которые указаны ниже.
/*
================
SpawnBlood
================
*/

void(vector org, vector vel, float damage) SpawnBlood =
{
particle (org, vel*0.1, 79, damage*1);
particle (org, vel*0.25, 74, damage*5);
particle (org, vel*0.15, 69, damage*2);
};

Шаг 3
Вот и все! Согласитесь, что это было очень легко. Теперь компилируйте и запускайте полученное. Возмите в игре SuperShotgun (он сделает наш мод более эффективным :) и идите охотится на Grunt'ов! (Примечание: использование этого дополнения совместно с дополнением Больше мяса(урок 2) дает потрясающей эффект >:)

QuakeC:Магнум

Написано: автор st1x51
0

Сложность: Легкая
Шаг 1
Все это дополнение делается в файле weapons.qc. Когда мы его сделаем, у вас получится зверский Магнум! На этом уроке вы встретите несколько маленьких установок для оружия (таких, как на сколько градусов вверх идет отдача, конус разлета, и т.д.).. Но они очень легкие. К тому же, я помогу вам :) Теперь, найдите в файле weapons.qc текст, который похож на текст указанный в шаге 2.
Шаг 2
Итак, все, что вы должны сделать, это поменять некоторые числа, например так, как это показанно ниже.
(Внимание: не делайте Магнум слишком мощным, если вы расчитываете играть с ним по сети!)
/*
================
W_FireShotgun
================
*/
void() W_FireShotgun =
{
local vector dir;

sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM);
// воспроизвести звук выстрела из Shotgun

self.punchangle_x = -2; //угол обзора отклониться вверх на 2 единицы

self.currentammo = self.ammo_shells = self.ammo_shells - 1;
//здесь мы указываем, сколько патрон отнимется за один выстрел

dir = aim (self, 1000); //расстояние 100%-го попадания.

FireBullets (20, dir, '0.04 0.04 0');
//20 осколков в конусе разлета.
//0.04 - это высота и ширина конуса разлета (для Магнума лучше сделать 0.001).
};
Шаг 3
Вот и все! Компилируйте и запускайте полученное. Теперь ваш Shotgun будет сеять смерть вокруг.

QuakeC:Больше мяса

Написано: автор st1x51
0

Автор: Timm 'Mr?' Stokke
eMail: hestokke@online.no
Сложность: Легкая

Наиболее простой путь для увеличения количества мяса в сетевой игре
Шаг 1
Весь этот мод делается в файле player.qc, который нужно открыть для изменения. Когда вы все это сделаете, то у вас должно быть в два раза больше мыса в Сетевой игре. Все, что вам нужно будет делать, это копировать и вставлять некоторые строчки. Итак, переходим к самому основному, к шагу 2.
Шаг 2
Итак, скопируйте какую-либо строчку ThrowGib в функции GibPlayer, и вставте ее чуть ниже на одну строчку! А теперь сделаем мяса в два раза больше( т.е. так, как мы задумали). Посмотрите, как должно выглядеть оригинальное начало функции GibPlayer.
ThrowHead ("progs/h_player.mdl", self.health);
ThrowGib ("progs/gib1.mdl", self.health);
ThrowGib ("progs/gib2.mdl", self.health);
ThrowGib ("progs/gib3.mdl", self.health);
И примерно так оно может выглядеть после изменения.
ThrowHead ("progs/h_player.mdl", self.health);
ThrowGib ("progs/gib1.mdl", self.health);
ThrowGib ("progs/gib1.mdl", self.health);
ThrowGib ("progs/gib2.mdl", self.health);
ThrowGib ("progs/gib2.mdl", self.health);
ThrowGib ("progs/gib3.mdl", self.health);
ThrowGib ("progs/gib3.mdl", self.health);
Шаг 3
И это все! Скомпилируйте полученное, и запустите дополнение. Но не жалуйтесь, если оно не работает в одиночном режиме игры, так как оно работает только в сетевой игре (deathmatch и cooperative). Если вы хотите еще больше мяса, то копируйте и вставляйте строчки с ThrowGib по-больше, но только не перестарайтесь...

QuakeC:Сообщения о смерти

Написано: автор st1x51
0

Автор: Timm 'Mr?' Stokke
eMail: hestokke@online.no
Сложность: Легкая

Это очень легкий урок для тех, кому надоели старые сообщения о смерти в Quake. После прочтения этого урока, вы сможете изменять сообщения в сетевой (DM) и одиночной (single) играх. Только для начинающих!
Шаг 1
Все эти изменения производятся в файле под именем client.qc, который нужно открыть для редактирования. Что мы будем делать, чтобы поменять сообщения о смерти, которые возникают все время после того, как вас убивает какой-нибудь монстр? Опуститесь в самый низ открытого файла, где описаны все сообщения о смерти от монстров, от самоубийства и от других игроков при сетевой игре. Мы будем изменять сообщения, появляющиеся при смерти от монстра. Итак, найдите текст, похожий на текст, приведенный в шаге 2.
Шаг 2
А сейчас перейдем непосредственно к редактированию собщений о смерти. Я думаю вы сделаете их немного по своему, потому я не буду приводить детали
if (attacker.flags & FL_MONSTER)
{
if (attacker.classname == "monster_army")
bprint (" was shot by a Grunt\n"); //вывести в верхнем левом углу " was shot by a Grunt".
if (attacker.classname == "monster_demon1")
bprint (" was eviscerated by a Fiend\n");
if (attacker.classname == "monster_dog")
bprint (" was mauled by a Rottweiler\n");
if (attacker.classname == "monster_dragon")
bprint (" was fried by a Dragon\n");
if (attacker.classname == "monster_enforcer")
bprint (" was blasted by an Enforcer\n");
if (attacker.classname == "monster_fish")
bprint (" was fed to the Rotfish\n");
if (attacker.classname == "monster_hell_knight")
bprint (" was slain by a Death Knight\n");
if (attacker.classname == "monster_knight")
bprint (" was slashed by a Knight\n");
if (attacker.classname == "monster_ogre")
bprint (" was destroyed by an Ogre\n");
if (attacker.classname == "monster_oldone")
bprint (" became one with Shub-Niggurath\n");
if (attacker.classname == "monster_shalrath")
bprint (" was exploded by a Vore\n");
if (attacker.classname == "monster_shambler")
bprint (" was smashed by a Shambler\n");
if (attacker.classname == "monster_tarbaby")
bprint (" was slimed by a Spawn\n");
if (attacker.classname == "monster_vomit")
bprint (" was vomited on by a Vomitus\n");
if (attacker.classname == "monster_wizard")
bprint (" was scragged by a Scrag\n");
if (attacker.classname == "monster_zombie")
bprint (" joins the Zombies\n");
return;
Шаг 3
И это все! Откомпилируйте это, и запустите полученное. Теперь идите и... хммм.. и дайте себя убить!