Quake Style - Quake 3 Tutorials Weapon Mods - Homing Rockets!! Makes your rocket launcher shoot homing missiles! (UPDATED) |
VectorCopy (dir, bolt->r.currentAngles); // this is new line. return bolt; }
bolt->nextthink = level.time + 10000; bolt->think = G_ExplodeMissile;
bolt->think = G_HomingMissile; bolt->nextthink = level.time + 60;
void G_HomingMissile( gentity_t *ent ) { gentity_t *target = NULL; gentity_t *blip = NULL; vec3_t dir, blipdir, temp_dir; while ((blip = findradius(blip, ent->r.currentOrigin, 2000)) != NULL) { if (blip->client==NULL) continue; if (blip==ent->parent) continue; if (blip->health<=0) continue; if (blip->client->sess.sessionTeam == TEAM_SPECTATOR) continue; if ((g_gametype.integer == GT_TEAM || g_gametype.integer == GT_CTF) && blip->client->sess.sessionTeam == ent->parent->client->sess.sessionTeam) continue; //in old code,this ent->parent->cliend-> was blip->parent->client->, //so didn't work in CTF and team deathmatch.Now it will work. if (!visible (ent, blip)) continue; VectorSubtract(blip->r.currentOrigin, ent->r.currentOrigin, blipdir); blipdir[2] += 16; if ((target == NULL) || (VectorLength(blipdir) < VectorLength(dir))) { //if new target is the nearest VectorCopy(blipdir,temp_dir); VectorNormalize(temp_dir); VectorAdd(temp_dir,ent->r.currentAngles,temp_dir); //now the longer temp_dir length is the more straight path for the rocket. if(VectorLength(temp_dir)>1.6) { //if this 1.6 were smaller,the rocket also get to target the enemy on his back. target = blip; VectorCopy(blipdir, dir); } } } if (target == NULL) { ent->nextthink = level.time + 10000; // if once the rocket lose target,it will not search new enemy any more,and go away. } else { ent->s.pos.trTime=level.time; VectorCopy(ent->r.currentOrigin, ent->s.pos.trBase ); //for exact trajectory calculation,set current point to base. VectorNormalize(dir); VectorScale(dir, 0.3,dir); VectorAdd(dir,ent->r.currentAngles,dir); // this 0.3 is swing rate.this value is cheap,I think.try 0.8 or 1.5. // if you want fastest swing,comment out these 3 lines. VectorNormalize(dir); VectorCopy(dir,ent->r.currentAngles); //locate nozzle to target VectorScale (dir,VectorLength(ent->s.pos.trDelta)*1.1,ent->s.pos.trDelta); //trDelta is actual vector for movement.Because the rockets slow down // when swing large angle,so accelalate them. SnapVector (ent->s.pos.trDelta); // save net bandwidth ent->nextthink = level.time + 100; //decrease this value also makes fast swing. } }