Well I can help with the fire points. You need to modify Weapon_RocketLauncher_Fire. Here is an example you can use:
//modified for 5 rockets--HK
Weapon_RocketLauncher_Fire(gentity_t *ent) { 
gentity_t *m;
vec3_t angle, dir;

if (powerUpShit) {
angle[0] = random() / 2; //add random to x
angle[1] = random() / 2; //add random to y
angle[2] = random() / 2; //add random to z
//combine our direction with forward 
VectorAdd(angle, forward, dir);
}
m = fire_rocket(ent, muzzle, dir);
m->damage *= s_quadFactor;
m->splashDamage *= s_quadFactor;
}

You can modify the / 2 part to a larger # if the spread is too large or a smaller # if it is too small.
------------------
// Setup my sig.
if (!strcmp(name, "Hunter-Killer")) {
email = hunter-killer@gamepl.com;
icq = 65841897;
site = Quick Phrag Productions;
}


There is one way but you really shouldn't use it because it stops the entire game. 
for (int wait = 0; wait < 50; wait++);

Another, longer way I can think of is setting that he fired the RL and the time of fire in gclient_t. Like so:

//in gclient
...
unsigned short firedRL;
unsigned int RLwait;
...

//in weapon fire func
case ROCKET_LAUNCHER:
ent->client->firedRL = 4; //we fire 1 during init so only fire 4 more.
ent->client->RLwait = 50 + trap_Milliseconds();
Weapon_RocketLauncher_Fire (ent);
break;

//in clientthink_real
if (client->firedRL && (client->RLwait GREATER THAN trap_Milliseconds() ) {
Weapon_RocketLauncher_Fire(ent);
client->firedRL--;
} 

Try that and let me know if it works ok. (GREATER THAN == the greater than symbol symbol and 50 == time to delay) This would make a pretty good tut topic...

