Flares/Anti-Flares

These are off hand grenades that don't have an ammo cost.(though one would be easy to add). they spread pools of light and darkness. The darkness grenade would need a new skin to work properly in software mode, it just needs to be pure black. All you need to do is bind a key to each type.

Paste this code into a new file. add that file to your project (makefile)

#include "g_local.h"
#include "outerweap.h"
 
 
static void Flare_Touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
{
        if (other == ent->owner)
               return;
        
        if (surf && (surf->flags & SURF_SKY))
        {
               G_FreeEdict (ent);
               return;
        }
        
        if (!other->takedamage)
        {
               if (ent->spawnflags & 1)
               {
                       if (random() > 0.5)
                               gi.sound (ent, CHAN_VOICE, gi.soundindex ("weapons/hgrenb1a.wav"), 1, ATTN_NORM, 0);
                       else
                               gi.sound (ent, CHAN_VOICE, gi.soundindex ("weapons/hgrenb2a.wav"), 1, ATTN_NORM, 0);
               }
               else
               {
                       gi.sound (ent, CHAN_VOICE, gi.soundindex ("weapons/grenlb1b.wav"), 1, ATTN_NORM, 0);
               }
               
               
               
               // At this point, the grenade has hit a surface
               
               VectorClear (ent->velocity) ;
               VectorClear (ent->avelocity) ;
               
               // We don't want the grenade to be affected by the big G.
               ent->movetype = MOVETYPE_NONE;
               
               return;
        }
        
        G_FreeEdict (ent);
}
 
 
 
 
void Flare_Think2(edict_t *ent)
{
        G_FreeEdict (ent);
}
 
 
 
 
 
 
void Flare_Think(edict_t *ent)
{
        
        //      ent->s.renderfx |= RF_FULLBRIGHT;
        ent->nextthink=level.time+10;
        ent->think=Flare_Think2;
        
}
void Flare_Die(edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point){
        self->takedamage=DAMAGE_NO;
        self->nextthink=level.time+.1;
        self->think=Flare_Think2;
}       
 
 
 
 
 
 
void fire_flare (edict_t *self, vec3_t start, vec3_t aimdir, int speed,qboolean darkness)
{
        
        
        edict_t *flare;
        vec3_t  dir;
        vec3_t  forward, right, up;
        
        vectoangles (aimdir, dir);
        AngleVectors (dir, forward, right, up);
        
        flare = G_Spawn();
        VectorCopy (start, flare->s.origin);
        VectorScale (aimdir, speed, flare->velocity);
        VectorMA (flare->velocity, 200 + crandom() * 10.0, up, flare->velocity);
        VectorMA (flare->velocity, crandom() * 10.0, right, flare->velocity);
        VectorSet (flare->avelocity, 300, 300, 300);
        flare->movetype = MOVETYPE_BOUNCE;
        flare->clipmask = MASK_SHOT;
        flare->solid = SOLID_BBOX;
        if (!darkness)
        {
               flare->s.effects |= EF_BLASTER;
               flare->s.renderfx |= RF_GLOW;
        }
        else
               flare->s.effects |= EF_TRACKER;       
        VectorClear (flare->mins);
        VectorClear (flare->maxs);
        flare->s.modelindex = gi.modelindex ("models/objects/grenade/tris.md2");  
        flare->owner = self;
        flare->touch = Flare_Touch;
        if (darkness)
               flare->nextthink = level.time + 30;
        else
               flare->nextthink = level.time + 5;
        flare->think = Flare_Think;
        if  (darkness)
        flare->classname = "darkflare";
        else
        flare->classname = "flare";
        VectorSet(flare->mins, -3, -3, 0);
        VectorSet(flare->maxs, 3, 3, 6);
        flare->mass = 2;
        flare->health = 10;
        flare->monsterinfo.aiflags = AI_NOSTEP;
        flare->die=Flare_Die;
        flare->takedamage=DAMAGE_YES;  
        
        gi.linkentity (flare);
}
 
 
void Flare_Away (edict_t *ent,qboolean darkness)
{
        vec3_t  offset;
        vec3_t  forward, right;
        vec3_t  start;
        
        
        
        VectorSet(offset, 8, 8, ent->viewheight-8);
        AngleVectors (ent->client->v_angle, forward, right, NULL);
        P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start);
        
        
        fire_flare (ent, start, forward,700,darkness);
        
        
}

create a new file called flare.h paste the code below into it.

static void Flare_Touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf);
void flare_think2(edict_t *ent);
void fire_flare (edict_t *self, vec3_t start, vec3_t aimdir, int speed,qboolean darkness);
void Flare_Away (edict_t *ent,qboolean darkness);

put #include "flare.h" in just after #include "g_local.h" in g_cmds.c . Then add theses commands to the command checking code at the bottom.

               else if (Q_stricmp (cmd, "darkflare") == 0)
                       Flare_Away (ent,true);
               else if (Q_stricmp (cmd, "flare") == 0)
                       Flare_Away (ent,false);
 

just above the line // anything else is a chat Compile it, try it out. It looks better in opengl.


Resources

 


Skunkworks Tutorials