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 ); }
/* ================= 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); }
/* ----------------------------------------------------------------------------- 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; } }
/* ================= 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); }
/* * 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 ); } }
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); }