static void Grenade_Touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf) { if (other == ent->owner) return; if (surf && (surf->flags & SURF_SKY)) { Grenade_Remove_From_Chain (ent); // Lazarus 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); } return; } ent->enemy = other; Grenade_Explode (ent); }
void fire_grenade2(edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held) { edict_t *grenade; vec3_t dir; vec3_t forward, right, up; if (!self) { return; } vectoangles(aimdir, dir); AngleVectors(dir, forward, right, up); grenade = G_Spawn(); VectorCopy(start, grenade->s.origin); VectorScale(aimdir, speed, grenade->velocity); VectorMA(grenade->velocity, 200 + crandom() * 10.0, up, grenade->velocity); VectorMA(grenade->velocity, crandom() * 10.0, right, grenade->velocity); VectorSet(grenade->avelocity, 300, 300, 300); grenade->movetype = MOVETYPE_BOUNCE; grenade->clipmask = MASK_SHOT; grenade->solid = SOLID_BBOX; grenade->s.effects |= EF_GRENADE; VectorClear(grenade->mins); VectorClear(grenade->maxs); grenade->s.modelindex = gi.modelindex("models/objects/grenade2/tris.md2"); grenade->owner = self; grenade->touch = Grenade_Touch; grenade->nextthink = level.time + timer; grenade->think = Grenade_Explode; grenade->dmg = damage; grenade->dmg_radius = damage_radius; grenade->classname = "hgrenade"; if (held) { grenade->spawnflags = 3; } else { grenade->spawnflags = 1; } grenade->s.sound = gi.soundindex("weapons/hgrenc1b.wav"); if (timer <= 0.0) { Grenade_Explode(grenade); } else { gi.sound(self, CHAN_WEAPON, gi.soundindex( "weapons/hgrent1a.wav"), 1, ATTN_NORM, 0); gi.linkentity(grenade); } }
void fire_trap(edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, qboolean held) { edict_t *trap; vec3_t dir; vec3_t forward, right, up; if (!self) { return; } vectoangles(aimdir, dir); AngleVectors(dir, forward, right, up); trap = G_Spawn(); VectorCopy(start, trap->s.origin); VectorScale(aimdir, speed, trap->velocity); VectorMA(trap->velocity, 200 + crandom() * 10.0, up, trap->velocity); VectorMA(trap->velocity, crandom() * 10.0, right, trap->velocity); VectorSet(trap->avelocity, 0, 300, 0); trap->movetype = MOVETYPE_BOUNCE; trap->clipmask = MASK_SHOT; trap->solid = SOLID_BBOX; VectorSet(trap->mins, -4, -4, 0); VectorSet(trap->maxs, 4, 4, 8); trap->s.modelindex = gi.modelindex("models/weapons/z_trap/tris.md2"); trap->owner = self; trap->nextthink = level.time + 1.0; trap->think = Trap_Think; trap->dmg = damage; trap->dmg_radius = damage_radius; trap->classname = "htrap"; trap->s.sound = gi.soundindex("weapons/traploop.wav"); if (held) { trap->spawnflags = 3; } else { trap->spawnflags = 1; } if (timer <= 0.0) { Grenade_Explode(trap); } else { gi.linkentity(trap); } trap->timestamp = level.time + 30; }
void Grenade_Touch(edict_t *ent, edict_t *other, cplane_t *plane /* unused */, csurface_t *surf) { if (!ent || !other || !surf) { G_FreeEdict(ent); return; } if (other == ent->owner) { return; } if (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); } return; } ent->enemy = other; Grenade_Explode(ent); }
// Willi void Shrapnel_Explode (edict_t *ent) { vec3_t origin; vec3_t grenade1; vec3_t grenade2; vec3_t grenade3; vec3_t grenade4; vec3_t grenade5; vec3_t grenade6; vec3_t grenade7; vec3_t grenade8; int mod; int i; vec3_t offset; if (ent->owner->client) PlayerNoise(ent->owner, ent->s.origin, PNOISE_IMPACT); VectorSet(offset,0,0,32); VectorAdd(offset,ent->s.origin,offset); VectorCopy (offset, ent->s.origin); VectorSet(grenade1,20,20,5); VectorSet(grenade2,20,-20,5); VectorSet(grenade3,-20,20,5); VectorSet(grenade4,-20,-20,5); VectorSet(grenade5,0,20,5); VectorSet(grenade6,0,-20,5); VectorSet(grenade7,-20,0,5); VectorSet(grenade8,20,0,5); for (i = 0; i < 6; i++) { fire_bullet (ent, offset, grenade1, 2, 2, 4500, 4500, MOD_G_SPLASH); fire_bullet (ent, offset, grenade2, 2, 2, 4500, 4500, MOD_G_SPLASH); fire_bullet (ent, offset, grenade3, 2, 2, 4500, 4500, MOD_G_SPLASH); fire_bullet (ent, offset, grenade4, 2, 2, 4500, 4500, MOD_G_SPLASH); fire_bullet (ent, offset, grenade5, 2, 2, 4500, 4500, MOD_G_SPLASH); fire_bullet (ent, offset, grenade6, 2, 2, 4500, 4500, MOD_G_SPLASH); fire_bullet (ent, offset, grenade7, 2, 2, 4500, 4500, MOD_G_SPLASH); fire_bullet (ent, offset, grenade8, 2, 2, 4500, 4500, MOD_G_SPLASH); } Grenade_Explode (ent); }
void fire_grenade2 (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius, int held) { edict_t *grenade; vec3_t dir; vec3_t forward, right, up; vectoangles (aimdir, dir); AngleVectors (dir, forward, right, up); grenade = G_Spawn(); VectorCopy (start, grenade->s.origin); VectorScale (aimdir, speed, grenade->velocity); VectorMA (grenade->velocity, 200 + crandom() * 10.0, up, grenade->velocity); VectorMA (grenade->velocity, crandom() * 10.0, right, grenade->velocity); // Lazarus: Add owner velocity // VectorAdd (grenade->velocity, self->velocity, grenade->velocity); // NO. This is too unrealistic. Instead, if owner is riding a moving entity, // add velocity of the thing he's riding if(self->groundentity) VectorAdd (grenade->velocity, self->groundentity->velocity, grenade->velocity); VectorSet (grenade->avelocity, 300, 300, 300); grenade->movetype = MOVETYPE_BOUNCE; grenade->clipmask = MASK_SHOT; grenade->solid = SOLID_BBOX; grenade->s.effects |= EF_GRENADE; VectorClear (grenade->mins); VectorClear (grenade->maxs); grenade->s.modelindex = gi.modelindex ("models/objects/grenade2/tris.md2"); grenade->owner = self; //grenade->touch = Grenade_Touch; grenade->nextthink = level.time + timer; //grenade->think = Grenade_Explode; grenade->dmg = damage; grenade->dmg_radius = damage_radius; grenade->classname = "hgrenade"; if (held) grenade->spawnflags = 3; else grenade->spawnflags = 1; grenade->s.sound = gi.soundindex("weapons/hgrenc1b.wav"); // Willi/NeVo if (g_grenadeshrapnel->value) { // Do it the normal way grenade->touch = Shrapnel_Touch; grenade->think = Shrapnel_Explode; } else { // Do it the normal way grenade->touch = Grenade_Touch; grenade->think = Grenade_Explode; } // CCH: a few more attributes to let the grenade 'die' VectorSet(grenade->mins, -3, -3, 0); VectorSet(grenade->maxs, 3, 3, 6); grenade->mass = 2; grenade->health = 10; grenade->die = Grenade_Die; grenade->takedamage = DAMAGE_YES; grenade->monsterinfo.aiflags = AI_NOSTEP; if (timer <= 0.0) Grenade_Explode (grenade); else { gi.sound (self, CHAN_WEAPON, gi.soundindex ("weapons/hgrent1a.wav"), 1, ATTN_NORM, 0); Grenade_Add_To_Chain (grenade); gi.linkentity (grenade); } }