static void FireLasgun( gentity_t *self ) { // TODO: Merge this with other *Fire functions trace_t tr; vec3_t end; gentity_t *target; VectorMA( muzzle, 8192 * 16, forward, end ); G_UnlaggedOn( self, muzzle, 8192 * 16 ); trap_Trace( &tr, muzzle, NULL, NULL, end, self->s.number, MASK_SHOT ); G_UnlaggedOff(); if ( tr.surfaceFlags & SURF_NOIMPACT ) { return; } target = &g_entities[ tr.entityNum ]; // snap the endpos to integers, but nudged towards the line G_SnapVectorTowards( tr.endpos, muzzle ); SendRangedHitEvent( self, target, &tr ); if ( target->takedamage ) { G_Damage( target, self, self, forward, tr.endpos, LASGUN_DAMAGE, 0, MOD_LASGUN ); } }
static void FireMassdriver( gentity_t *self ) { // TODO: Merge this with other *Fire functions trace_t tr; vec3_t end; gentity_t *target; VectorMA( muzzle, 8192.0f * 16.0f, forward, end ); G_UnlaggedOn( self, muzzle, 8192.0f * 16.0f ); trap_Trace( &tr, muzzle, nullptr, nullptr, end, self->s.number, MASK_SHOT, 0 ); G_UnlaggedOff(); if ( tr.surfaceFlags & SURF_NOIMPACT ) { return; } target = &g_entities[ tr.entityNum ]; // snap the endpos to integers, but nudged towards the line G_SnapVectorTowards( tr.endpos, muzzle ); SendRangedHitEvent( self, target, &tr ); if ( target->takedamage ) { G_Damage( target, self, self, forward, tr.endpos, MDRIVER_DMG, DAMAGE_KNOCKBACK, MOD_MDRIVER ); } }
static void FireLasgun( gentity_t *self ) { // TODO: Merge this with other *Fire functions trace_t tr; vec3_t end; gentity_t *target; VectorMA( muzzle, 8192 * 16, forward, end ); G_UnlaggedOn( self, muzzle, 8192 * 16 ); trap_Trace( &tr, muzzle, nullptr, nullptr, end, self->s.number, MASK_SHOT, 0 ); G_UnlaggedOff(); if ( tr.surfaceFlags & SURF_NOIMPACT ) { return; } target = &g_entities[ tr.entityNum ]; // snap the endpos to integers, but nudged towards the line G_SnapVectorTowards( tr.endpos, muzzle ); SendRangedHitEvent( self, target, &tr ); target->entity->Damage((float)LASGUN_DAMAGE, self, Vec3::Load(tr.endpos), Vec3::Load(forward), 0, (meansOfDeath_t)MOD_LASGUN); }
static void FirePainsaw( gentity_t *self ) { trace_t tr; gentity_t *target; G_WideTrace( &tr, self, PAINSAW_RANGE, PAINSAW_WIDTH, PAINSAW_HEIGHT, &target ); if ( !target || !target->takedamage ) { return; } // not really a "ranged" weapon, but this is still the right call SendRangedHitEvent( self, target, &tr ); G_Damage( target, self, self, forward, tr.endpos, PAINSAW_DAMAGE, DAMAGE_NO_KNOCKBACK, MOD_PAINSAW ); }
static void FirePainsaw( gentity_t *self ) { trace_t tr; gentity_t *target; G_WideTrace( &tr, self, PAINSAW_RANGE, PAINSAW_WIDTH, PAINSAW_HEIGHT, &target ); if ( !G_Alive( target ) ) { return; } // not really a "ranged" weapon, but this is still the right call SendRangedHitEvent( self, target, &tr ); target->entity->Damage((float)PAINSAW_DAMAGE, self, Vec3::Load(tr.endpos), Vec3::Load(forward), 0, (meansOfDeath_t)MOD_PAINSAW); }
static void FireBullet( gentity_t *self, float spread, int damage, int mod ) { // TODO: Merge this with other *Fire functions trace_t tr; vec3_t end; float r, u; gentity_t *target; r = random() * M_PI * 2.0f; u = sin( r ) * crandom() * spread * 16; r = cos( r ) * crandom() * spread * 16; VectorMA( muzzle, 8192 * 16, forward, end ); VectorMA( end, r, right, end ); VectorMA( end, u, up, end ); // don't use unlagged if this is not a client (e.g. turret) if ( self->client ) { G_UnlaggedOn( self, muzzle, 8192 * 16 ); trap_Trace( &tr, muzzle, NULL, NULL, end, self->s.number, MASK_SHOT ); G_UnlaggedOff(); } else { trap_Trace( &tr, muzzle, NULL, NULL, end, self->s.number, MASK_SHOT ); } if ( tr.surfaceFlags & SURF_NOIMPACT ) { return; } target = &g_entities[ tr.entityNum ]; SendRangedHitEvent( self, target, &tr ); if ( target->takedamage ) { G_Damage( target, self, self, forward, tr.endpos, damage, 0, mod ); } }