
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.