InsideQC
 - Front Page

Tutorials are copyrighted by their author and the Inside3D staff. And may be used in any Quake modification provided that the author and the InsideQC staff are credited. Please direct any comments to the author.


Created By: Drywall
eMail: drywall@telefragged.com
Difficulty Scale: Easy


Step 1
This tutorial will teach you how to turn the nailgun into a gatling gun ala doom. First, you need to open weapons.qc and go until line "void() player_nail1; and write this:

void()      player_gat1;  // gatling gun firing (see later)

Step 2
Now, further in weapons.qc, find the line: .float hit_z; . Above it, add this:

void(float ox, float ox2) W_FireGatSpikes =  // this is a slightly modified version of firespikes
{
	local vector	dir;
	local entity	old;
	
	makevectors (self.v_angle);
	
	if (self.ammo_nails <1)
	{
		self.weapon = W_BestWeapon();
		W_SetCurrentAmmo ();
		return;
	}
	sound (self, chan_weapon, "weapons/rocket1i.html", 1, attn_norm);
	self.attack_finished = time + 0.2;
	self.currentammo = self.ammo_nails = self.ammo_nails - 1;
	dir = aim (self, 1000);
	launch_spike (self.origin + '0 0 16' + v_right*ox + v_up*ox2, dir); // sets spike direction

	self.punchangle_x = -2;
};


/*
===============
launch_gatling
===============
*/
void(vector org, vector dir) launch_gatling =  
{
	newmis = spawn ();
	newmis.owner = self;
	newmis.movetype = MOVETYPE_FLYMISSILE;
	newmis.solid = SOLID_BBOX;

	newmis.angles = vectoangles(dir);
	
	newmis.touch = spike_touch;
	newmis.classname = "spike";
	newmis.think = SUB_Remove;
	newmis.nextthink = time + 6;
	setmodel (newmis, "progs/spike.mdl");
	setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);		
	setorigin (newmis, org);

	newmis.velocity = dir * 1000;
};

void() W_FireGatling =
{
	local vector	dir;
	local entity	old;
	
	sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM);
	self.attack_finished = time + 0.2;
	self.currentammo = self.ammo_nails = self.ammo_nails - 2;
	dir = aim (self, 1000);
	launch_gatling (self.origin + '0 0 16', dir);
	newmis.touch = superspike_touch;
	setmodel (newmis, "progs/s_spike.mdl");
	setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);		
	self.punchangle_x = -2;
};


Step 3
Now open up player.qc . Above the line: void() player_light1 =[$light1, player_light2 ] insert these lines:


void() player_gat1   =[$nailatt1, player_gat2  ]  // runs gat2 next
{
	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();
        W_FireGatSpikes (-8, 0);  // fires a spike to the left 
	self.attack_finished = time + 0.2;
};
void() player_gat2   =[$nailatt2, player_gat3  ]  // runs gat3 next
{
	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();
        W_FireGatSpikes (0, 8);  // fires a spike up 
	self.attack_finished = time + 0.2;
};
void() player_gat3   =[$nailatt1, player_gat4  ]  // runs gat4 next
{
	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();
        W_FireGatSpikes (8, 0);  // fires a spike to the right
	self.attack_finished = time + 0.2;
};
void() player_gat4   =[$nailatt2, player_gat1  ]  // back to 1
{
	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();
        W_FireGatSpikes (0, -8);  // fires a spike down
	self.attack_finished = time + 0.2;
};



Step4
Now find the W_Attack function in weapons.qc . Change these lines:

	else if (self.weapon == IT_SUPER_NAILGUN)
	{
                player_nail1 ();
	}

Add in these lines:
	else if (self.weapon == IT_SUPER_NAILGUN)
	{
                player_gat1 ();
	}


Step 5
Woohoo! You're all ready to compile and run. Have fun...