Flares and darkness grenades


 

Posted by SteveMiester (195.92.194.*) on March 22, 1999 at 17:15:45:

based on the sticky bomb and flare tutorials on qdevels.
I suppose this isn't a tutorial rather just some cut and paste code.

add this code in at the bottom of p_weapon.c. I suppose you could have it in a separate file, but when I coded it, I didn't.

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 header file containing

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);


add a reference to the header file at the top of g_cmds.c (#include "headerfile")


add
else if (Q_stricmp (cmd, "Flare") == 0)
Flare_Away (ent,false);

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

into the command checking code at the bottom of the file.

bind keys to the commands. (I used d and f)