Quake DeveLS - An antimissile system

Author: Cryect
Difficulty:
Medium

Here is a tutorial that protects you against missile. You need to do Chris Hilton's tutorial on Vulnerable Rockets. Without it this tutorial won't work.

Create a new file called "antimissile.c". Put into it this code.

 
 
#include "g_local.h"
/*
=======================
The antimissile device
=======================
*/
void toggle_antimissile(edict_t *ent)//This toggles it on and off
{
        if (ent->anti)
        {
               ent->anti = 0;
               gi.cprintf (ent, PRINT_HIGH, "Anti-Missile Device deactivated!\n");
        }
        else
        {
               ent->anti = 1;
               gi.cprintf (ent, PRINT_HIGH, "Anti-Missile Device activated!\n");
        }
}
 

Put this into the edict_t structure. This is the variable for toggling

 
 
        //antimissile toggle
        int anti;      
 

Now we are going to insert this code below into "p_client.c". THis will go into ClientBeginServerFrame right after the declarations.

 
 
vec3_t start, target, dir;
edict_t *blip;
trace_t tr;
if (ent->anti)
{
        blip = NULL;
        //scans for a target
        while ((blip = findradius(blip, ent->s.origin, 500)) != NULL)
        {
 
               //This checks for rockets
               if ((strcmp(blip->classname, "rocket") != 0)/*&&(strcmp(blip->classname, "grenade") != 0)*/) //Uncomment the part I commented out if you wish it to work with grenades
                       continue;
               if(ent == blip->owner)
                       continue;
               tr = gi.trace (ent->s.origin, NULL, NULL, blip->s.origin, ent, MASK_SOLID);
               if (tr.fraction != 1.0)
                       continue;
               ent->enemy = blip;//Set the enemy the target
        }
        if(ent->enemy)
        {
        
               //checks for ammo
               if (ent->client->pers.inventory[ITEM_INDEX(FindItem("bullets"))]>0)
               {
                       ent->client->pers.inventory[ITEM_INDEX(FindItem("bullets"))]--;
                       
                       start[0] = ent->s.origin[0];
                       start[1] = ent->s.origin[1];
                       start[2] = ent->s.origin[2];
 
                       // calc direction to where we targetd
                       VectorMA (ent->enemy->s.origin, -0.05, ent->enemy->velocity, target);
                       
                       
                       VectorSubtract (target, start, dir);
                       VectorNormalize (dir);
                       
                       //fire bullet
                       fire_bullet (ent, start, dir, 8, 0, 425, 425, MOD_SENTRY);
 
                       // send muzzle flash
                       
                       gi.WriteByte (svc_muzzleflash);
                       gi.WriteShort (ent - g_edicts);
                       gi.WriteByte (MZ_SHOTGUN );
                       gi.multicast (start, MULTICAST_PVS);
                       //Play over the shotgun sound
                       gi.sound(ent, CHAN_VOICE, gi.soundindex("boss3\xfire.wav"), 1, ATTN_NORM, 0);
               }
               ent->enemy=NULL;
        }
}
 

This should interesting code for you to experiment with. I hope you enjoy this!

Tutorial by Cryect

 
 
 

This site, and all content and graphics displayed on it,
are ©opyrighted to the Quake DeveLS team. All rights received.
Got a suggestion? Comment? Question? Hate mail? Send it to us!
Oh yeah, this site is best viewed in 16 Bit or higher, with the resolution on 800*600.
Thanks to Planet Quake for there great help and support with hosting.
Best viewed with Netscape 4 or IE 3