예제 #1
0
void Plane_Fire_Lead( gentity_t *self ) {
	vec3_t dir, right;
	vec3_t pos1, pos2;
	vec3_t position;

	AngleVectors( self->r.currentAngles, dir, right, NULL );
	VectorCopy( self->r.currentOrigin, position );
	VectorMA( position, 64, right, pos1 );
	VectorMA( position, -64, right, pos2 );

	fire_lead( self, pos1, dir, 12 );
	fire_lead( self, pos2, dir, 12 );
}
예제 #2
0
/*
=================
fire_shotgun

Shoots shotgun pellets.  Used by shotgun and super shotgun.
=================
*/
void fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int mod)
{
	int		i;

	for (i = 0; i < count; i++)
		fire_lead (self, start, aimdir, damage, kick, TE_SHOTGUN, hspread, vspread, mod);
}
예제 #3
0
/*
-----------------------------------------------------------------------------
 Function: 
 
 Parameters:
 
 Returns:
 
 Notes: 

-----------------------------------------------------------------------------
*/
PRIVATE void PL_PlayerAttack( player_t *self, _boolean re_attack )
{
	struct atkinf *cur;

	self->attackcount -= tics;
	while( self->attackcount <= 0 )
	{
		cur = &attackinfo[ self->weapon ][ self->attackframe ];
		switch( cur->attack )
		{
			case -1:
				self->flags &= ~PL_FLAG_ATTCK;
				if( ! self->ammo[ AMMO_BULLETS ] )
				{
					self->weapon = WEAPON_KNIFE;
				}
				else if( self->weapon != self->pendingweapon )
				{
					self->weapon = self->pendingweapon;
				}
				self->attackframe = self->weaponframe = 0;
				return;

			case 4:
				if( ! self->ammo[ AMMO_BULLETS ] )
				{
					break;
				}

				if( re_attack ) 
				{
					self->attackframe -= 2;
				}

			case 1:
				if( ! self->ammo[ AMMO_BULLETS ] ) // can only happen with chain gun
				{
					self->attackframe++;
					break;
				}
				fire_lead( self );
				self->ammo[ AMMO_BULLETS ]--;
				break;

			case 2:
				fire_hit( self );
				break;

			case 3:
				if(self->ammo[AMMO_BULLETS] && re_attack)
					self->attackframe-=2;
				break;
		}

		self->attackcount += cur->tics;
		self->attackframe++;
		self->weaponframe = attackinfo[ self->weapon ][ self->attackframe ].frame;
	}

}
예제 #4
0
파일: g_weapon.c 프로젝트: basecq/q2dos
/*
=================
fire_bullet

Fires a single round.  Used for machinegun and chaingun.  Would be fine for
pistols, rifles, etc....
=================
*/
void fire_bullet (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int mod)
{
	if (!self)
	{
		return;
	}

	fire_lead(self, start, aimdir, damage, kick, TE_GUNSHOT,
			hspread, vspread, mod);
}
예제 #5
0
파일: g_weapon.c 프로젝트: axltxl/hecatomb
 /*
  * Shoots shotgun pellets. Used
  * by shotgun and super shotgun.
  */
 void
 fire_shotgun ( edict_t *self, vec3_t start, vec3_t aimdir, q_int32_t damage,
                q_int32_t kick, q_int32_t hspread, q_int32_t vspread, q_int32_t count, q_int32_t mod )
 {
   q_int32_t i;

   if ( !self ) {
     return;
   }

   for ( i = 0; i < count; i++ ) {
     fire_lead ( self, start, aimdir, damage, kick, TE_SHOTGUN,
                 hspread, vspread, mod );
   }
 }
예제 #6
0
void Blaster_Fire (edict_t *ent, vec3_t g_offset, int damage, int speed, qboolean hyper, int effect) {
	vec3_t	forward, right;
	vec3_t	start;
	vec3_t	offset;

	damage = applyWeaponBonuses(ent, damage, 1);
	AngleVectors (ent->client->v_angle, forward, right, NULL);
	VectorSet(offset, 24, 8, ent->viewheight-8);
	VectorAdd (offset, g_offset, offset);
	P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start);

	VectorScale (forward, -2, ent->client->kick_origin);
	ent->client->kick_angles[0] = -1;

	if (speed > 0) { // No flight speed => Hitscan
		if (hyper) {
			fire_blaster (ent, start, forward, damage, speed, 0, hyper);
			ent->client->silencer_shots-=1;
		} else {
			fire_blaster (ent, start, forward, damage, speed, effect, hyper);
			ent->client->silencer_shots-=3;
		}
	} else {
		fire_lead(ent, start, forward, damage, 0, TE_BLASTER, 0, 0, MOD_BLASTER);
	}

	// send muzzle flash
	if ((ent->client->silencer_shots > 0) && (ent->client->pers.skill[58]> 5)) {
		ent->client->silencer_shots -= 1;
	} else {
		gi.WriteByte (svc_muzzleflash);
		gi.WriteShort (ent-g_edicts);
		if (hyper)
			gi.WriteByte (MZ_HYPERBLASTER | is_silenced);
		else
			gi.WriteByte (MZ_BLASTER | is_silenced);
		gi.multicast (ent->s.origin, MULTICAST_PVS);
	}

	PlayerNoise(ent, start, PNOISE_WEAPON);
}