Inside3D tutorials.
Created By: Mr. Pink
eMail: mrpink@hempseed.com
Difficulty Scale: Easy/Medium


Step 1
In this tutorial we are gonna make a Homing Rocket... cool right?.. well lets get started. First open Weapons.qc scroll down until the W_FireRocket section and write the code in blue:
/*
================
W_FireRocket
================
*/

void()   RockThink;
entity() RockFindTarget;
float(entity targ) visible;
float(entity targ) infront;


void() W_FireRocket =
Step 2
Next what you need its to add or remove the code in blue:
void() W_FireRocket =
{
	local	entity missile, mpuff;
	
	self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
	
	sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM);

	self.punchangle_x = -2;

	missile = spawn ();
	missile.owner = self;
	missile.movetype = MOVETYPE_FLYMISSILE;
	missile.solid = SOLID_BBOX;
        missile.classname = "missile";  //delete this line
		
// set missile speed	

	makevectors (self.v_angle);
	missile.velocity = aim(self, 1000);
	missile.velocity = missile.velocity * 300; //Change the velocity of the Rocket to 300 (slower)
	missile.angles = vectoangles(missile.velocity);
	
	missile.touch = T_MissileTouch;
	
// set missile duration
	missile.nextthink = time + 0.2; //Change the nexttime from 5 to 0.2
	missile.think = RockThink;  //Change the nextthink from SUB_remove to RockThink
	missile.enemy = world;

	setmodel (missile, "progs/missile.mdl");
	setsize (missile, '0 0 0', '0 0 0');		
	setorigin (missile, self.origin + v_forward*8 + '0 0 16');
};


Step 3
Third, write this code under the W_FireRocket function:


entity() RockFindTarget = 
{
	local entity head, selected;
	local float dist;
	dist = 100000;
	selected = world;
	head = findradius(self.origin, 100000);
	while(head)
	{
		if( (head.health > 1) && (head != self) && (head != self.owner) )
		{
			traceline(self.origin,head.origin,TRUE,self);
			if ( (trace_fraction >= 1) && (vlen(head.origin - self.origin) < dist) )
			{
				selected = head;
				dist= vlen(head.origin - self.origin);
			}
		}
		head= head.chain;
	}
	if (selected != world)
	{
		sprint (self.owner,homing); //prints that the rocket is homing somebody
		if (selected.classname == "player") //tells you the rocket its homing a player
		{
			sprint (self.owner,selected.netname);
			sprint (selected,self.owner.netname);
			sprint (selected," sended a rocket after you!\n"); //Change what it says.. it sucks
		else
			sprint (self.owner,selected.classname); //if not a player, tell what classname 
		sprint (self.owner,"\n");
	}
	return selected;
};


Step4
Now this is the final step... write this down of the W_RockFindTarget function:


void() RockThink =
{
	local vector dir, vtemp;

	if ( !(self.enemy) || (self.enemy == world) || (self.enemy.health < 1) )
		self.enemy="RockFindTarget();" //find a enemy to kill

	if (self.enemy != world) 
	{
		vtemp = self.enemy.origin + '0 0 10';
		dir = normalize(vtemp - self.origin);
		self.velocity = dir * 250;
		self.angles = vectoangles(self.velocity);
	}

	self.nextthink = time + 0.2;
	self.think=RockThink;
};


Step 5
Hey were done!! compile it ... and go kill something, hope you like this Tutorial... thanks Inside3D for letting me post this, and some feedback will be cool.