/* =============== FireWeapon =============== */ void FireWeapon( gentity_t *ent ) { if (ent->client->ps.powerups[PW_QUAD] ) { s_quadFactor = g_quadfactor.value; } else { s_quadFactor = 1; } #if 1 if( ent->client->persistantPowerup && ent->client->persistantPowerup->item && ent->client->persistantPowerup->item->giTag == PW_DOUBLER ) { s_quadFactor *= 2; } #endif // track shots taken for accuracy tracking. Grapple is not a weapon and gauntet is just not tracked if( ent->s.weapon != WP_GRAPPLING_HOOK && ent->s.weapon != WP_GAUNTLET ) { #if 1 if( ent->s.weapon == WP_NAILGUN ) { ent->client->accuracy_shots += NUM_NAILSHOTS; } else { ent->client->accuracy_shots++; } #else ent->client->accuracy_shots++; #endif } // set aiming directions AngleVectors (ent->client->ps.viewangles, forward, right, up); CalcMuzzlePointOrigin ( ent, ent->client->oldOrigin, forward, right, up, muzzle ); // fire the specific weapon switch( ent->s.weapon ) { case WP_GAUNTLET: Weapon_Gauntlet( ent ); break; case WP_LIGHTNING: Weapon_LightningFire( ent ); break; case WP_SHOTGUN: weapon_supershotgun_fire( ent ); break; case WP_MACHINEGUN: if ( g_gametype.integer != GT_TEAM ) { Bullet_Fire( ent, MACHINEGUN_SPREAD, MACHINEGUN_DAMAGE ); } else { Bullet_Fire( ent, MACHINEGUN_SPREAD, MACHINEGUN_TEAM_DAMAGE ); } break; case WP_GRENADE_LAUNCHER: weapon_grenadelauncher_fire( ent ); break; case WP_ROCKET_LAUNCHER: Weapon_RocketLauncher_Fire( ent ); break; case WP_PLASMAGUN: Weapon_Plasmagun_Fire( ent ); break; case WP_RAILGUN: weapon_railgun_fire( ent ); break; case WP_BFG: BFG_Fire( ent ); break; case WP_GRAPPLING_HOOK: Weapon_GrapplingHook_Fire( ent ); break; #if 1 case WP_NAILGUN: Weapon_Nailgun_Fire( ent ); break; case WP_PROX_LAUNCHER: weapon_proxlauncher_fire( ent ); break; case WP_CHAINGUN: Bullet_Fire( ent, CHAINGUN_SPREAD, MACHINEGUN_DAMAGE ); break; #endif default: // FIXME G_Error( "Bad ent->s.weapon" ); break; } }
void FireWeapon(Gentity *ent, Weapslot slot) { Weapon w; if(slot >= WSnumslots){ G_Printf("bad weapslot %u\n", slot); return; } w = ent->s.weap[slot]; if(ent->client->ps.powerups[PW_QUAD]) s_quadFactor = g_quadfactor.value; else s_quadFactor = 1; #ifdef MISSIONPACK if(ent->client->persistantPowerup && ent->client->persistantPowerup->item && ent->client->persistantPowerup->item->tag == PW_DOUBLER) s_quadFactor *= 2; #endif /* track shots taken for accuracy tracking. Grapple is not a weapon and gauntet is just not tracked */ if(w != Whook && w != Wmelee && w != Whominglauncher){ if(w == Wnanoidcannon) ent->client->accuracy_shots += Nnanoshots; else ent->client->accuracy_shots++; } /* set aiming directions */ anglev3s(ent->client->ps.viewangles, forward, right, up); CalcMuzzlePointOrigin(ent, ent->client->oldOrigin, forward, right, up, muzzle); /* fire the specific weapon */ switch(w){ case Wmelee: Weapon_Gauntlet(ent); break; case Wlightning: Weapon_LightningFire(ent); break; case Wshotgun: weapon_supershotgun_fire(ent); break; case Wnanoidcannon: firenanoidcannon(ent); break; case Wmachinegun: if(g_gametype.integer != GT_TEAM) Bullet_Fire(ent, MACHINEGUN_SPREAD, MACHINEGUN_DAMAGE); else Bullet_Fire(ent, MACHINEGUN_SPREAD, MACHINEGUN_TEAM_DAMAGE); break; case Wplasmagun: Weapon_Plasmagun_Fire(ent); break; case Wrailgun: weapon_railgun_fire(ent); break; case Wchaingun: Bullet_Fire(ent, CHAINGUN_SPREAD, MACHINEGUN_DAMAGE); break; case Wgrenadelauncher: weapon_grenadelauncher_fire(ent); break; case Wrocketlauncher: Weapon_RocketLauncher_Fire(ent); break; case Whominglauncher: firehominglauncher(ent); break; case Wproxlauncher: weapon_proxlauncher_fire(ent); break; case Whook: Weapon_GrapplingHook_Fire(ent); break; default: G_Printf("bad weap %u (slot %u)\n", w, slot); break; } }