Note:
YOU NEED TO DOWNLOAD THIS FILE FOR THE RIP TO WORK!
DO NOT MAIL THE INSIDE3D STAFF OR THE AUTOR OF THE RIP IF YOU ARE HAVING TROUBLE WITH THIS TUTORIAL AND YOU DONT
HAVE THE FILE!
Yipee the RIPs are back...
Legion (Roscoe Sincero) has buggered off to work on his ElimaReaper patch, so I'll be filling his shoes for a while.
He is still active in a consultancy capacity, so I can still draw on his wealth of knowledge for support.
So, my name is Pob the Impaler (Paul Johnstone), you can send me mail at:
A.W.Johnstone@btinternet.com (for home)
OR
itac025@lauder.ac.uk (for College)
I don't mind which address you use, so when I inevitably make a boo-boo you'll know how to send me hate-mail :)
My site is at: http://www.btinternet.com/~impaler please help my hit-counter and visit!
Roscoe Sincero's address is legion@keg.zymurgy.org
//------------//
//-Credits--//
//-----------//
Steve Polge - For the Reaper bots
Alan Kivlin - For the clever scoreboard stuff
Lee Smith - For ProQCC
Roscoe Sincero - For starting it all off and for giving me a shot of his ElimaReaper!
Iikka Keranen - For the Plasma Gun model
|=========================================================|
ALWAYS MAKE A BACKUP OF YOUR CODE BEFORE TRYING ONE OF MY LESSONS. IF THERE IS A MISTAKE IN IT WHICH
RUINS YOUR CODE OR BLOWS UP YOUR HOUSE, TOUGH SHIT, RESTORE THE BACKUP AND TELL ME WHERE I FUCKED UP.
Right 'ya buggers, today we are going to add a new weapon, to the bots. DooM's Plasma Rifle!
This requires two new models, two sounds, 1 sprite, 1 map and a LOT of hard work.
This is pretty complicated so you'll need to pay attention. :)
*******
A lot of the functions need changed so much, I've put the whole function in for you to cut & paste.
Each step will just deal with ONE function.
*******
First of all go into your reaper directory where your progs.dat goes.
Now make a directory called progs and copy plasma.mdl, v_plasma.mdl and s_plasma.spr into it.
Now make a directory in your reaper directory called sounds, now in sounds make another directory called weapons.
Into that directory copy Plasexpl.wav and plasma.wav.
No in your reaper directory make a directory called maps and copy the bsp file into there.
Ok, now go back to wherever your .qc files are...
Step 1
botfight.qc
(I hope you didn't skip the above stuff, or this ain't gonna work!)
Open up botfight.qc
Find the function W_BestBotWeapon float () W_BestBotWeapon = {
Cut & Paste this code over the WHOLE function:
//===========Begin Code==========//
float () W_BestBotWeapon = {
local float it;
local float rng;
local float wlevel;
it = self.items;
rng = botrange (self.enemy);
if ( (rng != RANGE_MELEE) ) {
if ( ((self.ammo_rockets >= TRUE) && (it & IT_ROCKET_LAUNCHER)) ) {
return ( IT_ROCKET_LAUNCHER );
}
}
if ( ((self.ammo_cells >= TRUE) && (it & IT_LIGHTNING)) ) {
if ( ((rng == RANGE_MELEE) || (rng == RANGE_NEAR)) ) {
wlevel = CheckWaterLevel ();
if ( (wlevel < FL_SWIM) ) {
return ( IT_LIGHTNING );
}
if ( (self.items & IT_INVULNERABILITY) ) {
return ( IT_LIGHTNING );
}
}
}
if ( ((self.ammo_cells >= 1) && (it & IT_PLASMA_GUN))){ // Notice this line!
return ( IT_PLASMA_GUN );
}
if ( ((self.ammo_nails >= FL_SWIM) && (it & IT_SUPER_NAILGUN)) ) {
return ( IT_SUPER_NAILGUN );
}
if ( (rng == RANGE_NEAR) ) {
if ( ((self.ammo_rockets >= TRUE) && (it & IT_GRENADE_LAUNCHER)) ) {
if ( (self.enemy.origin_z < (self.origin_z + 175.000)) ) {
return ( IT_GRENADE_LAUNCHER );
}
}
}
if ( ((rng == RANGE_NEAR) || (rng == RANGE_MELEE)) ) {
if ( ((self.ammo_shells >= FL_SWIM) && (it & IT_SUPER_SHOTGUN)) ) {
return ( IT_SUPER_SHOTGUN );
}
}
if ( ((self.ammo_nails >= TRUE) && (it & IT_NAILGUN)) ) {
return ( IT_NAILGUN );
}
if ( ((self.ammo_shells >= TRUE) && (it & IT_SHOTGUN)) ) {
return ( IT_SHOTGUN );
}
return ( IT_AXE );
};
//=================End Code==========//
Step 2
Find the function W_BestHeldWeapon float () W_BestHeldWeapon = {
Cut & Paste the following code over the WHOLE function.
//===========Begin Code==========//
float () W_BestHeldWeapon = {
local float it;
local float wlevel;
it = self.items;
if ( ((self.ammo_rockets >= TRUE) && (it & IT_ROCKET_LAUNCHER)) ) {
return ( IT_ROCKET_LAUNCHER );
}
if ( ((self.ammo_cells >= TRUE) && (it & IT_LIGHTNING)) ) {
wlevel = CheckWaterLevel ();
if ( (wlevel < FL_SWIM) ) {
return ( IT_LIGHTNING );
}
if ( (self.items & IT_INVULNERABILITY) ) {
return ( IT_LIGHTNING );
}
}
if ( ((self.ammo_cells >= 1) && (it & IT_PLASMA_GUN)) ) {
return ( IT_PLASMA_GUN );
}
if ( ((self.ammo_nails >= FL_SWIM) && (it & IT_SUPER_NAILGUN)) ) {
return ( IT_SUPER_NAILGUN );
}
if ( ((self.ammo_rockets >= TRUE) && (it & IT_GRENADE_LAUNCHER)) ) {
if ( (self.enemy.origin_z < (self.origin_z + 175.000)) ) {
return ( IT_GRENADE_LAUNCHER );
}
}
if ( ((self.ammo_shells >= FL_SWIM) && (it & IT_SUPER_SHOTGUN)) ) {
return ( IT_SUPER_SHOTGUN );
}
if ( ((self.ammo_nails >= TRUE) && (it & IT_NAILGUN)) ) {
return ( IT_NAILGUN );
}
if ( ((self.ammo_shells >= TRUE) && (it & IT_SHOTGUN)) ) {
return ( IT_SHOTGUN );
}
return ( IT_AXE );
};
//=================End Code==========//
Step 3
Find the lines of code which read:
void () bot_axe1;
void () bot_axeb1;
void () bot_axec1;
void () bot_axed1;
void () bot_shot1;
void () bot_nail1;
Under this add:
//===========Begin Code==========//
void () bot_plasma1; // plasma frames
//=================End Code==========//
Step 4
Find the function W_BotAttack() void () W_BotAttack = {
Replace the whole function with this:
//===========Begin Code==========//
void () W_BotAttack = {
local float r;
local float addt;
if ( !W_CheckNoAmmo () ) {
return ;
}
if ( (time < self.attack_finished) ) {
return ;
}
addt = FALSE;
if ( (self.skil < MOVETYPE_WALK) ) {
addt = (((MOVETYPE_WALK - self.skil) * random ()) * 0.350);
}
if ( (self.skil < TRUE) ) {
addt = (addt + (random () * 0.300));
}
makevectors (self.v_angle);
self.show_hostile = (time + TRUE);
if ( (self.weapon == IT_AXE) ) {
sound (self,CHAN_WEAPON,"weapons/ax1.wav",TRUE,ATTN_NORM);
r = random ();
if ( (r < 0.250) ) {
bot_axe1 ();
} else {
if ( (r < 0.500) ) {
bot_axeb1 ();
} else {
if ( (r < 0.750) ) {
bot_axec1 ();
} else {
bot_axed1 ();
}
}
}
self.attack_finished = ((time + 0.500) + addt);
} else {
if ( (self.weapon == IT_SHOTGUN) ) {
bot_shot1 ();
W_FireShotgun ();
self.attack_finished = ((time + 0.500) + addt);
} else {
if ( (self.weapon == IT_SUPER_SHOTGUN) ) {
bot_shot1 ();
W_FireSuperShotgun ();
self.attack_finished = ((time + 0.700) + addt);
} else {
if ( (self.weapon == IT_NAILGUN) ) {
self.think = bot_nail1;
} else {
if ( (self.weapon == IT_PLASMA_GUN)) {
self.think = bot_plasma1; // FIRE plasma gun
plasma_firebolt();
self.attack_finished = ((time + 0.001) + addt);
} else {
if ( (self.weapon == IT_SUPER_NAILGUN) ) {
self.think = bot_nail1;
} else {
if ( (self.weapon == IT_GRENADE_LAUNCHER) ) {
bot_rocket1 ();
W_FireGrenade ();
self.attack_finished = ((time + 0.600) + addt);
} else {
if ( (self.weapon == IT_ROCKET_LAUNCHER) ) {
bot_rocket1 ();
W_FireRocket ();
self.attack_finished = ((time + 0.800) + addt);
} else {
if ( (self.weapon == IT_LIGHTNING) ) {
self.think = bot_light1;
self.attack_finished = (time + 0.100);
sound (self,CHAN_AUTO,"weapons/lstart.wav",TRUE,ATTN_NORM);
}
}
}
}
} // added for plasma
}
}
}
}
};
//=================End Code==========//
Step 5
Botit_th.qc
Open Botit_th.qc
Find the function supernailweight float (entity e) supernailweight = {
BENEATH this function add:
//===========Begin Code==========//
float (entity e) plasmaweight = {
local float weight;
weight = (WANT + TRUE);
if ( !(self.items & IT_PLASMA_GUN) ) {
weight = (MUST_HAVE - TRUE);
}
return ( weight );
};
//=================End Code==========//
Save and close botit_th.qc
Step 6
client.qc
Open client.qc
Find the function ClientObituary() void (entity targ, entity attacker) ClientObituary = {
Find the lines:
if ( (rnum == IT_SUPER_NAILGUN) ) {
deathstring = " was punctured by ";
deathstring2 = "\n";
}
UNDER this add:
//===========Begin Code==========//
if ( (rnum == IT_PLASMA_GUN) ) {
deathstring = " sucks a load of ";
deathstring2 = "'s Plasma\n";
}
//=================End Code==========//
Save and close client.qc
Step 7
defs.qc
Open up Defs.qc
At the bottom of defs.qc add:
//===========Begin Code==========//
float IT_PLASMA_GUN = 128.000;
//=================End Code==========//
save and close defs.qc
Step 8
dmbot.qc
Open dmbot.qc
Find the function bot_rebound6() void () bot_rebound6 = [ 112.000, bot_chase ] {
Under this add:
//===========Begin Code==========//
void () bot_plasma1 = [ 103.000, bot_plasma2 ] {
self.effects = (self.effects | EF_MUZZLEFLASH);
ai_botnailcharge (BOTSPEED);
BotPostThink ();
};
void () bot_plasma2 = [ 104.000, bot_run ] {
self.effects = (self.effects | EF_MUZZLEFLASH);
SuperDamageSound ();
plasma_firebolt();
ai_botnailcharge (BOTSPEED);
BotPostThink ();
};
//=================End Code==========//
save and close dmbot.qc
Step 9
items.qc
Open items.qc
Find the function RankForWeapon float (float w) RankForWeapon = {
Copy & Paste the following code over the WHOLE function:
//===========Begin Code==========//
float (float w) RankForWeapon = {
if ( (w == IT_LIGHTNING) ) {
return ( TRUE );
}
if ( (w == IT_ROCKET_LAUNCHER) ) {
return ( FL_SWIM );
}
if ( (w == IT_PLASMA_GUN) ) {
return (3);
}
if ( (w == IT_SUPER_NAILGUN) ) {
return ( 4 );
}
if ( (w == IT_GRENADE_LAUNCHER) ) {
return ( 5 );
}
if ( (w == IT_SUPER_SHOTGUN) ) {
return ( 6 );
}
if ( (w == IT_NAILGUN) ) {
return ( 7 );
}
return ( MOVETYPE_PUSH );
};
//=================End Code==========//
Step 10
Find the function weapon_touch() void () weapon_touch = {
Replace the ENTIRE function with the following code:
//===========Begin Code==========//
void () weapon_touch = {
local float hadammo;
local float best;
local float new;
local float old;
local entity stemp;
local float leave;
if ( (other.classname == "peeper") ) {
return ; // remmed out for develpment
}
if ( !(other.flags & FL_CLIENT) ) {
if ( (other.classname != "dmbot") ) {
return ;
}
}
stemp = self;
self = other;
if ( (self.classname == "player") ) {
best = W_BestWeapon ();
}
self = stemp;
if ( ((deathmatch == FL_SWIM) || coop) ) {
leave = TRUE;
} else {
leave = FALSE;
}
if ( (self.classname == "weapon_nailgun") ) {
if ( (leave && (other.items & IT_NAILGUN)) ) {
return ;
}
hadammo = other.ammo_nails;
new = IT_NAILGUN;
other.ammo_nails = (other.ammo_nails + SVC_INTERMISSION);
if ( other.movetarget.movetarget ) {
cacheRoute (other.movetarget,other.movetarget.movetarget,FALSE,self);
}
} else {
if ( (self.classname == "weapon_supernailgun") ) {
if ( (leave && (other.items & IT_SUPER_NAILGUN)) ) {
return ;
}
hadammo = other.ammo_rockets;
new = IT_SUPER_NAILGUN;
other.ammo_nails = (other.ammo_nails + SVC_INTERMISSION);
if ( other.movetarget.movetarget ) {
cacheRoute (other.movetarget,other.movetarget.movetarget,FALSE,self);
}
} else {
if ( (self.classname == "weapon_supershotgun") ) {
if ( (leave && (other.items & IT_SUPER_SHOTGUN)) ) {
return ;
}
hadammo = other.ammo_rockets;
new = IT_SUPER_SHOTGUN;
other.ammo_shells = (other.ammo_shells + MOVETYPE_FLY);
} else {
if ( (self.classname == "weapon_rocketlauncher") ) {
if ( (leave && (other.items & IT_ROCKET_LAUNCHER)) ) {
return ;
}
hadammo = other.ammo_rockets;
new = IT_ROCKET_LAUNCHER;
other.ammo_rockets = (other.ammo_rockets + MOVETYPE_FLY);
if ( other.movetarget.movetarget ) {
cacheRoute (other.movetarget,other.movetarget.movetarget,FALSE,self);
}
} else {
if ( (self.classname == "weapon_grenadelauncher") ) {
if ( (leave && (other.items & IT_GRENADE_LAUNCHER)) ) {
return ;
}
hadammo = other.ammo_rockets;
new = IT_GRENADE_LAUNCHER;
other.ammo_rockets = (other.ammo_rockets + MOVETYPE_FLY);
if ( other.movetarget.movetarget ) {
cacheRoute (other.movetarget,other.movetarget.movetarget,FALSE,self);
}
} else {
if ( (self.classname == "weapon_lightning") ) {
if ( (leave && (other.items & IT_LIGHTNING)) ) {
return ;
}
hadammo = other.ammo_rockets;
new = IT_LIGHTNING;
other.ammo_cells = (other.ammo_cells + 15.000);
if ( other.movetarget.movetarget ) {
cacheRoute (other.movetarget,other.movetarget.movetarget,FALSE,self);
}
} else {
//////
if ( (self.classname == "weapon_plasma") ) {
if ( (leave && (other.items & IT_PLASMA_GUN)) ) {
return ;
}
hadammo = other.ammo_rockets;
new = IT_PLASMA_GUN;
other.ammo_cells = (other.ammo_cells + 25);
if ( other.movetarget.movetarget ) {
cacheRoute (other.movetarget,other.movetarget.movetarget,FALSE,self);
}
} else {
//////
objerror ("weapon_touch: unknown classname");
}
}
}
}
}// added for plasma gun
}
}
if ( (other.classname == "player") ) {
sprint (other,"ÙÏÕžÇÏÔžÔÈÅž"); // "You got the "
sprint (other,self.netname);
sprint (other,"\n");
}
sound (other,CHAN_ITEM,"weapons/pkup.wav",TRUE,ATTN_NORM);
if ( (other.classname == "player") ) {
stuffcmd (other,"bf\n");
}
bound_other_ammo ();
old = other.items;
other.items = (other.items | new);
// self.weapon = new;
stemp = self;
self = other;
if ( !deathmatch ) {
self.weapon = new;
} else {
Deathmatch_Weapon (old,new);
}
W_SetCurrentAmmo ();
self = stemp;
if ( leave ) {
return ;
}
self.model = string_null;
self.solid = SOLID_NOT;
if ( (deathmatch >= TRUE) ) {
self.nextthink = (time + SVC_INTERMISSION);
}
self.think = SUB_regen;
activator = other;
SUB_UseTargets ();
};
//=================End Code==========//
Step 11
Find the function weapon_nailgun() void () weapon_nailgun = {
BENEATH this function add:
//===========Begin Code==========//
void () weapon_plasma = {
precache_model ("progs/plasma.mdl");
setmodel (self,"progs/plasma.mdl");
self.classname == ("weapon_plasma");
self.weapon = MOVETYPE_WALK;
self.netname = "Plasma Gun";
self.touch = weapon_touch;
setsize (self,'-16.000 -16.000 0.000','16.000 16.000 56.000');
self.th_weight = plasmaweight;
self.th_cache = cachelightning;
self.th_update = updatelightning;
StartItem ();
};
//=================End Code==========//
save and close items.qc
Step 12
weapons.qc
Don't worry not too far to go now! :)
Open weapons.qc
Find the line:
void (vector org, vector vel, float damage) SpawnBlood;
under this add:
//===========Begin Code==========//
void() plasma_attack1;
//=================End Code==========//
|=========================================================|
Step 13
Step 13
Find the function W_Precache void () W_Precache = {
at the top of this function add:
//===========Begin Code==========//
precache_model ("progs/v_plasma.mdl"); // plasma gun
precache_model ("progs/s_plasma.spr"); // plasma
precache_sound ("weapons/plasma.wav"); // plasma gun sound
precache_sound ("weapons/plasexpl.wav"); // plasma sound
//=================End Code==========//
Step 14
Find the function W_FireRocket void () W_FireRocket = {
After this function add:
//===========Begin Code==========//
void() plasma_impact1 = [1, plasma_impact2] {};
void() plasma_impact2 = [2, plasma_impact3] {};
void() plasma_impact3 = [3, plasma_impact4] {};
void() plasma_impact4 = [4, plasma_impact5] {};
void() plasma_impact5 = [1, plasma_impact6] {};
void() plasma_impact6 = [5, SUB_Remove ] {};
/*
==================
plasma_touch
==================
*/
float () CheckWaterLevel;
void () plasma_touch =
{
local float rand;
local float wlevel;
// hit something that bleeds
if (other.takedamage)
{
// direct hit on an entity
spawn_touchblood (2);
T_Damage (other, self, self.owner, 20); // Do 20 points of damage
}
local float pc;
pc = pointcontents (self.origin);
if ((pc == CONTENT_WATER) || (pc == CONTENT_SLIME) || (pc == CONTENT_LAVA))
{
//sound (self, CHAN_WEAPON, "enforcer/enfstop.wav", 1, ATTN_NORM);
T_RadiusDamage (self, self.owner, 60, world); // If hit someone underwater do BIG damage :>
}
sound (self, CHAN_WEAPON, "weapons/plasexpl.wav", 1, ATTN_NORM);
self.nextthink = time + 0.1;
self.think = plasma_impact1;
self.touch = SUB_Null;
self.velocity = '0 0 0';
};
/*
============
New plasma_firebolt
============
*/
void () plasma_firebolt = {
local entity missile;
local entity mpuff;
local vector bfwd;
local vector dir;
dir = aim (self, 1000);
self.ammo_cells = (self.ammo_cells - TRUE);
self.currentammo = (self.ammo_cells - TRUE);
sound (self,CHAN_WEAPON,"weapons/plasma.wav",TRUE,ATTN_NORM);
self.punchangle_x = -2;
missile = spawn ();
missile.owner = self;
missile.movetype = MOVETYPE_FLYMISSILE;
missile.solid = SOLID_BBOX;
makevectors (self.v_angle);
if ( (self.classname == "dmbot") ) {
missile.velocity = botaim ();
bfwd = botaim ();
bfwd_z = FALSE;
} else {
missile.velocity = aim (self,1000.000);
}
missile.velocity = (missile.velocity * 1000.000);
missile.angles = vectoangles (missile.velocity);
missile.touch = plasma_touch;
missile.nextthink = (time + 3);
missile.think = SUB_Remove;
setmodel (missile,"progs/s_plasma.spr");
setsize (missile,VEC_ORIGIN,VEC_ORIGIN);
if ( (self.classname == "dmbot") ) {
setorigin (missile,((self.origin + (bfwd * FL_CLIENT)) + '0.000 0.000 16.000'));
} else {
setorigin (missile,((self.origin + (v_forward * FL_CLIENT)) + '0.000 0.000 16.000'));
}
};
/*
==================
plasma_attack
==================
*/
void () plasma_attack1 =[103.00, plasma_attack2 ]
{
if ( (self.ammo_cells < TRUE) ) {
self.weapon = W_BestWeapon ();
W_SetCurrentAmmo ();
if ( (self.classname == "dmbot") ) {
self.think = self.th_run;
}
return ;
}
self.effects = self.effects | EF_MUZZLEFLASH;
if (!self.button0)
{
player_run ();
return;
}
self.weaponframe = self.weaponframe + 1;
if (self.weaponframe == 9) self.weaponframe = 1;
SuperDamageSound();
plasma_firebolt ();
self.attack_finished = time + 0.1;
};
void() plasma_attack2 =[104.00, plasma_attack1 ]
{
self.effects = self.effects | EF_MUZZLEFLASH;
if (!self.button0)
{
player_run ();
return;
}
self.weaponframe = self.weaponframe + 1;
if (self.weaponframe == 9) self.weaponframe = 1;
SuperDamageSound();
plasma_firebolt ();
self.attack_finished = time + 0.1;
};
//=================End Code==========//
Step 15
Find W_SetCurrentAmmo void() W_SetCurrentAmmo =
replace the whole function with:
//===========Begin Code==========//
void() W_SetCurrentAmmo =
{
if ( (self.classname == "player") || (self.classname == "peeper") )
{// get out of any weapon firing states
player_run ();
}
self.items = self.items - ( self.items & (IT_SHELLS | IT_NAILS | IT_ROCKETS | IT_CELLS) );
if (self.weapon == IT_AXE)
{
self.currentammo = 0;
self.weaponmodel = "progs/v_axe.mdl";
self.weaponframe = 0;
}
else if (self.weapon == IT_SHOTGUN)
{
self.currentammo = self.ammo_shells;
self.weaponmodel = "progs/v_shot.mdl";
self.weaponframe = 0;
self.items = self.items | IT_SHELLS;
}
else if (self.weapon == IT_SUPER_SHOTGUN)
{
self.currentammo = self.ammo_shells;
self.weaponmodel = "progs/v_shot2.mdl";
self.weaponframe = 0;
self.items = self.items | IT_SHELLS;
}
else if (self.weapon == IT_NAILGUN)
{
self.currentammo = self.ammo_nails;
self.weaponmodel = "progs/v_nail.mdl";
self.weaponframe = 0;
self.items = self.items | IT_NAILS;
}
else if (self.weapon == IT_SUPER_NAILGUN)
{
self.currentammo = self.ammo_nails;
self.weaponmodel = "progs/v_nail2.mdl";
self.weaponframe = 0;
self.items = self.items | IT_NAILS;
}
else if (self.weapon == IT_GRENADE_LAUNCHER)
{
self.currentammo = self.ammo_rockets;
self.weaponmodel = "progs/v_rock.mdl";
self.weaponframe = 0;
self.items = self.items | IT_ROCKETS;
}
else if (self.weapon == IT_ROCKET_LAUNCHER)
{
self.currentammo = self.ammo_rockets;
self.weaponmodel = "progs/v_rock2.mdl";
self.weaponframe = 0;
self.items = self.items | IT_ROCKETS;
}
else if (self.weapon == IT_LIGHTNING)
{
self.currentammo = self.ammo_cells;
self.weaponmodel = "progs/v_light.mdl";
self.weaponframe = 0;
self.items = self.items | IT_CELLS;
}
else if ( (self.weapon == IT_PLASMA_GUN) ) {
self.currentammo = self.ammo_cells;
self.weaponmodel = "progs/v_plasma.mdl";
self.weaponframe = FALSE;
self.items = (self.items | IT_CELLS);
}
else
{
self.currentammo = 0;
self.weaponmodel = " ";
self.weaponframe = 0;
}
// ### chase cam mod ###
if ( (self.speed & CHSCAM_ON) )
{
self.weaponmodel = "";
self.weaponframe = 0;
}
};
//=================End Code==========//
Step 16
Find the function W_Attack void () W_Attack = {
Replace the whole function with:
//===========Begin Code==========//
void () W_Attack = {
local float r;
if ( !W_CheckNoAmmo () ) {
return ;
}
makevectors (self.v_angle);
self.show_hostile = (time + TRUE);
signalnoise (self,self);
if ( (self.weapon == IT_AXE) ) {
sound (self,CHAN_WEAPON,"weapons/ax1.wav",TRUE,ATTN_NORM);
r = random ();
if ( (r < 0.250) ) {
player_axe1 ();
} else {
if ( (r < 0.500) ) {
player_axeb1 ();
} else {
if ( (r < 0.750) ) {
player_axec1 ();
} else {
player_axed1 ();
}
}
}
self.attack_finished = (time + 0.500);
} else {
if ( (self.weapon == IT_SHOTGUN) ) {
player_shot1 ();
W_FireShotgun ();
self.attack_finished = (time + 0.500);
} else {
if ( (self.weapon == IT_SUPER_SHOTGUN) ) {
player_shot1 ();
W_FireSuperShotgun ();
self.attack_finished = (time + 0.700);
} else {
if ( (self.weapon == IT_NAILGUN) ) {
player_nail1 ();
} else {
if ( (self.weapon == IT_SUPER_NAILGUN) ) {
player_nail1 ();
} else {
if ( (self.weapon == IT_GRENADE_LAUNCHER) ) {
player_rocket1 ();
W_FireGrenade ();
self.attack_finished = (time + 0.600);
} else {
if ( (self.weapon == IT_ROCKET_LAUNCHER) ) {
player_rocket1 ();
W_FireRocket ();
self.attack_finished = (time + 0.800);
}
else if (self.weapon == IT_PLASMA_GUN)
{
plasma_attack1 ();
self.attack_finished = time + 0.1;
}
else if ( (self.weapon == IT_LIGHTNING) ) {
player_light1 ();
self.attack_finished = (time + 0.100);
sound (self,CHAN_AUTO,"weapons/lstart.wav",TRUE,ATTN_NORM);
}
}
}
}
}
}
}
};
//=================End Code==========//
Step 17
Find the function W_ChangeWeapon void () W_ChangeWeapon = {
Replace the whole function with:
//===========Begin Code==========//
void () W_ChangeWeapon = {
local float it;
local float am;
local float fl;
it = self.items;
am = FALSE;
if ( (self.impulse == TRUE) ) {
fl = IT_AXE;
} else {
if ( (self.impulse == FL_SWIM) ) {
fl = IT_SHOTGUN;
if ( (self.ammo_shells < TRUE) ) {
am = TRUE;
}
} else {
if ( (self.impulse == MOVETYPE_WALK) ) {
fl = IT_SUPER_SHOTGUN;
if ( (self.ammo_shells < FL_SWIM) ) {
am = TRUE;
}
} else {
if ( (self.impulse == MOVETYPE_STEP) ) {
fl = IT_NAILGUN;
if ( (self.ammo_nails < TRUE) ) {
am = TRUE;
}
} else {
if ( (self.impulse == MOVETYPE_FLY) ) {
fl = IT_SUPER_NAILGUN;
if ( (self.ammo_nails < FL_SWIM) ) {
am = TRUE;
}
} else {
if ( (self.impulse == MOVETYPE_TOSS) ) {
fl = IT_GRENADE_LAUNCHER;
if ( (self.ammo_rockets < TRUE) ) {
am = TRUE;
}
} else {
if ( (self.impulse == MOVETYPE_PUSH) ) {
fl = IT_ROCKET_LAUNCHER;
if ( (self.ammo_rockets < TRUE) ) {
am = TRUE;
}
} else {
if ( (self.impulse == FL_CLIENT) ) {
fl = IT_LIGHTNING;
if ( (self.ammo_cells < TRUE) ) {
am = TRUE;
}
}else {
if ( (self.impulse == 20) )
{
fl = IT_PLASMA_GUN;
if ( (self.ammo_cells < TRUE) ) {
am = TRUE;
}
}
}
}
}
}
}
}
}
}
self.impulse = FALSE;
if ( !(self.items & fl) ) {
sprint (self,"ÎÏž×ÅÁÐÏΟ\n"); // "No Weapon" in nice gold letters
return ;
}
if ( am ) {
sprint (self,"ÎÏÔžÅÎÏÕÇÈžÁÍÍÏŸ\n"); // "Not enough ammo" in nice gold letters
return ;
}
self.weapon = fl;
W_SetCurrentAmmo ();
};
//=================End Code==========//
Step 18
Now find the function void () CycleWeaponCommand = {
Replace the whole function with:
//===========Begin Code==========//
void () CycleWeaponCommand = {
local float it;
local float am;
it = self.items;
self.impulse = FALSE;
while ( TRUE ) {
am = FALSE;
if ( (self.weapon == IT_PLASMA_GUN) ) {
self.weapon = IT_AXE;
} else {
if ( (self.weapon == IT_AXE) ) {
self.weapon = IT_SHOTGUN;
if ( (self.ammo_shells < TRUE) ) {
am = TRUE;
}
} else {
if ( (self.weapon == IT_SHOTGUN) ) {
self.weapon = IT_SUPER_SHOTGUN;
if ( (self.ammo_shells < FL_SWIM) ) {
am = TRUE;
}
} else {
if ( (self.weapon == IT_SUPER_SHOTGUN) ) {
self.weapon = IT_NAILGUN;
if ( (self.ammo_nails < TRUE) ) {
am = TRUE;
}
} else {
if ( (self.weapon == IT_NAILGUN) ) {
self.weapon = IT_SUPER_NAILGUN;
if ( (self.ammo_nails < FL_SWIM) ) {
am = TRUE;
}
} else {
if ( (self.weapon == IT_SUPER_NAILGUN) ) {
self.weapon = IT_GRENADE_LAUNCHER;
if ( (self.ammo_rockets < TRUE) ) {
am = TRUE;
}} else {
if ( (self.weapon == IT_GRENADE_LAUNCHER) ) {
self.weapon = IT_ROCKET_LAUNCHER;
if ( (self.ammo_rockets < TRUE) ) {
am = TRUE;
}
} else {
if ( (self.weapon == IT_ROCKET_LAUNCHER) ) {
self.weapon = IT_LIGHTNING;
if ( (self.ammo_cells < TRUE) ) {
am = TRUE;
}
}else {
if ( (self.weapon == IT_LIGHTNING) ) {
self.weapon = IT_PLASMA_GUN;
if ( (self.ammo_cells < TRUE) ) {
am = TRUE;
}
}// added for plasma
}
}
}
}
}
}
}
}
if ( ((self.items & self.weapon) && (am == FALSE)) ) {
W_SetCurrentAmmo ();
return ;
}
}
};
//=================End Code==========//
Step 19
Find the function ImpulseCommands() void () ImpulseCommands = {
This bit is kind of hard to explain...
Find the bit that says:
if ( ((self.impulse >= TRUE) && (self.impulse <= 8)) ) {
W_ChangeWeapon ();
}
add this:
//===========Begin Code==========//
else if (self.impulse == 20)
{
W_ChangeWeapon ();
}
//=================End Code==========//
It should now read:
void () ImpulseCommands = {
local string tmp;
if ( ((self.impulse >= TRUE) && (self.impulse <= 8)) ) {
W_ChangeWeapon ();
} else if (self.impulse == 20)
{
W_ChangeWeapon ();
}
else if ( (self.impulse == MOVETYPE_BOUNCE) ) {
CycleWeaponCommand ();
}
etc etc.......
Step 20
Save and close everything.
Compile!
No go into Quake.
Bind 9 to "impulse 9"
type map dm3.
Wander about a bit until you find the plasma gun, then shoot!
To put a plasma gun into your levels insert a weapon_plasma.
I hope this works!
see 'ya next time.
|