Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
	}
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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);
}
Exemplo n.º 5
0
// 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);
}
Exemplo n.º 6
0
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);
	}
}