Quake DeveLS - Concussion Grenades

Author: John Rittenhouse
Difficulty: Easy

Let's Do It...

Alright here is those concussion grenades from Team Fortress with some things added in. This code is not taken from the Team Fortress source code at all and is total written new by me, John Rittenhouse. SO here we go. Also make notice I set my grenades up so they can be killed so make sure you do that tutorial I forget who did that one but thanx.

Okay open up "g_weapon.c" now add at the end this code.

/*
===========================
Concussion Grenades
===========================
*/
void Concussion_Explode (edict_t *ent)
   {
     vec3_t      offset,v;
     edict_t *target;
	float Distance, DrunkTimeAdd;	
    // Move it off the ground so people are sure to see it
    VectorSet(offset, 0, 0, 10);    
    VectorAdd(ent->s.origin, offset, ent->s.origin);

    if (ent->owner->client)
       PlayerNoise(ent->owner, ent->s.origin, PNOISE_IMPACT);

    target = NULL;
    while ((target = findradius(target, ent->s.origin, 520)) != NULL)
    {
        if (!target->client)
            continue;       // It's not a player
        if (!visible(ent, target))
            continue;       // The grenade can't see it
		// Find distance
		VectorSubtract(ent->s.origin, target->s.origin, v);
		Distance = VectorLength(v);
		// Calculate drunk factor
		if(Distance < 520/10)
			DrunkTimeAdd = 20; //completely drunk
        else
            DrunkTimeAdd = 1.5 * 20 * ( 1 / ( ( Distance - 520*2 ) / (520*2) - 2 ) + 1 ); //partially drunk
        if ( DrunkTimeAdd < 0 )
            DrunkTimeAdd = 0; // Do not make drunk at all.
    
              
        // Increment the drunk time
        if(target->DrunkTime < level.time)
			target->DrunkTime = DrunkTimeAdd+level.time;
		else
			target->DrunkTime += DrunkTimeAdd;               
	}

   // Blow up the grenade
   BecomeExplosion1(ent);
}

void fire_concussiongrenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, float timer, float damage_radius)
{
	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() * 30.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/grenade/tris.md2");
	grenade->owner = self;
	grenade->touch = Grenade_Touch; //Stuff for cluster grenades when they explode
	grenade->nextthink = level.time + timer;
	grenade->think = Concussion_Explode; //stuff for cluster grenades exploding
	grenade->dmg = damage;
	grenade->dmg_radius = damage_radius;
	grenade->classname = "concussion";
	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;

	gi.linkentity (grenade);
}
Alright now open up "p_view.c" and goto "void SV_CalcViewOffset (edict_t *ent)" add this at the top of it.
	edict_t *Bub;
	float		bob;
ALright now go below the code
	if (bobcycle & 1)
		delta = -delta;
	angles[ROLL] += delta;
and add this now.
		//add angles based on drunkness
		if (ent->DrunkTime > level.time)
		{
			bubble = bubble + 1;
			if (bubble == 10)
			{
				Bub = G_Spawn();
				Bub->movetype = MOVETYPE_NOCLIP;
				Bub->clipmask = MASK_SHOT;
				Bub->solid = SOLID_NOT;
				VectorClear (Bub->mins);
				VectorClear (Bub->maxs);
				VectorSet (Bub->velocity,0,0,10);
				Bub->s.modelindex = gi.modelindex ("sprites/s_bubble.sp2");
				Bub->nextthink = level.time + 2;
				Bub->think = G_FreeEdict;
				VectorCopy(ent->s.origin,Bub->s.origin);
				gi.linkentity(Bub);
				bubble = 0;
			}
			ent->client->ps.rdflags |= RDF_UNDERWATER;
			if(YDirection)
				ent->DizzyYaw += random()*6;
			else
				ent->DizzyYaw -= random()*6;
			if(PDirection)
				ent->DizzyPitch += random()*5;
			else
				ent->DizzyPitch -= random()*5;
			if(RDirection)
				ent->DizzyRoll += random()*3;
			else
				ent->DizzyRoll -= random()*3;
			if (ent->DizzyYaw < -35)
				YDirection = 1;
			if (ent->DizzyYaw > 35)
				YDirection = 0;
			if (ent->DizzyPitch < -25)
				PDirection = 1;
			if (ent->DizzyPitch > 25)
				PDirection = 0;
			if (ent->DizzyRoll < -25)
				RDirection = 1;
			if (ent->DizzyRoll > 25)
				RDirection = 0;
			angles[YAW] += ent->DizzyYaw;
			angles[PITCH] += ent->DizzyPitch;
			angles[ROLL] += ent->DizzyRoll;
			}
Now goto the end of the sub "void G_SetClientEffects (edict_t *ent)" and add this.
	if (ent->DrunkTime>level.time)
		ent->client->ps.rdflags |= RDF_UNDERWATER;
Okay this should work. I hope all the bugs are out of this.

John Rittenhouse .

This site, and all content and graphics displayed on it,
are Šopyrighted to the Quake DeveLS team. All rights received.
Got a suggestion? Comment? Question? Hate mail? Send it to us!
Oh yeah, this site is best viewed in 16 Bit or higher, with the resolution on 800*600.
Thanks to Planet Quake for their great help and support with hosting.
Best viewed with Netscape 4