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)  //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.