#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", "Machine Gun");
+REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", _("Machine Gun"))
#else
#ifdef SVQC
-.entity muzzle_flash;
+
+void W_UZI_SetAmmoCounter()
+{
+ // set clip_load to the weapon we have switched to, if the gun uses reloading
+ if(!autocvar_g_balance_uzi_reload_ammo)
+ self.clip_load = 0; // also keeps crosshair ammo from displaying
+ else
+ {
+ self.clip_load = self.weapon_load[WEP_UZI];
+ self.clip_size = autocvar_g_balance_uzi_reload_ammo; // for the crosshair ammo display
+ }
+}
+
+void W_UZI_Reload()
+{
+ self.reload_ammo_player = ammo_fuel;
+ self.reload_ammo_min = min(max(autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_first_ammo), autocvar_g_balance_uzi_burst_ammo);
+ self.reload_ammo_amount = autocvar_g_balance_uzi_reload_ammo;
+ self.reload_time = autocvar_g_balance_uzi_reload_time;
+ self.reload_sound = "weapons/reload.wav";
+
+ W_Reload();
+}
// leilei's fancy muzzleflash stuff
-void Uzi_Flash_Go()
+void UZI_Flash_Go()
{
self.frame = self.frame + 2;
self.scale = self.scale * 0.5;
setmodel(self.muzzle_flash, "models/uziflash.md3"); // precision set below
self.muzzle_flash.scale = 0.75;
- self.muzzle_flash.think = Uzi_Flash_Go;
+ self.muzzle_flash.think = UZI_Flash_Go;
self.muzzle_flash.nextthink = time + 0.02;
self.muzzle_flash.frame = 2;
self.muzzle_flash.alpha = 0.75;
self.muzzle_flash.owner = self;
}
-.float uzi_bulletcounter;
-void W_Uzi_Attack (float deathtype)
+void W_UZI_Attack (float deathtype)
{
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- {
- if (self.uzi_bulletcounter == 1)
- self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo");
- else
- self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
- }
- W_SetupShot (self, cvar("g_antilag_bullets") && cvar("g_balance_uzi_speed") >= cvar("g_antilag_bullets"), 0, "weapons/uzi_fire.wav", CHAN_WEAPON, ((self.uzi_bulletcounter == 1) ? cvar("g_balance_uzi_first_damage") : cvar("g_balance_uzi_sustained_damage")));
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_uzi_first_damage : autocvar_g_balance_uzi_sustained_damage));
if (!g_norecoil)
{
self.punchangle_x = random () - 0.5;
}
// this attack_finished just enforces a cooldown at the end of a burst
- ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_first_refire") * W_WeaponRateFactor();
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
- if (self.uzi_bulletcounter == 1)
- fireBallisticBullet(w_shotorg, w_shotdir, cvar("g_balance_uzi_first_spread"), cvar("g_balance_uzi_speed"), 5, cvar("g_balance_uzi_first_damage"), 0, cvar("g_balance_uzi_first_force"), deathtype, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ if (self.misc_bulletcounter == 1)
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_first_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_first_damage, 0, autocvar_g_balance_uzi_first_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
else
- fireBallisticBullet(w_shotorg, w_shotdir, cvar("g_balance_uzi_sustained_spread"), cvar("g_balance_uzi_speed"), 5, cvar("g_balance_uzi_sustained_damage"), 0, cvar("g_balance_uzi_sustained_force"), deathtype, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_sustained_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, deathtype, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
W_AttachToShotorg(self.muzzle_flash, '5 0 0');
// casing code
- if (cvar("g_casings") >= 2)
+ if (autocvar_g_casings >= 2)
SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
+
+ // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ {
+ if(autocvar_g_balance_uzi_reload_ammo)
+ {
+ if (self.misc_bulletcounter == 1)
+ self.clip_load -= autocvar_g_balance_uzi_first_ammo;
+ else
+ self.clip_load -= autocvar_g_balance_uzi_sustained_ammo;
+ self.weapon_load[WEP_UZI] = self.clip_load;
+ }
+ else
+ {
+ if (self.misc_bulletcounter == 1)
+ self.ammo_nails -= autocvar_g_balance_uzi_first_ammo;
+ else
+ self.ammo_nails -= autocvar_g_balance_uzi_sustained_ammo;
+ }
+ }
}
// weapon frames
w_ready();
return;
}
- self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
- W_Uzi_Attack(WEP_UZI);
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
+ self.misc_bulletcounter = self.misc_bulletcounter + 1;
+ W_UZI_Attack(WEP_UZI);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_fire1_02);
}
else
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, w_ready);
}
void uzi_mode1_fire_auto()
{
float uzi_spread;
+
+ // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ {
+ if(autocvar_g_balance_uzi_reload_ammo)
+ {
+ self.clip_load -= autocvar_g_balance_uzi_sustained_ammo;
+ self.weapon_load[WEP_UZI] = self.clip_load;
+ }
+ else
+ self.ammo_nails -= autocvar_g_balance_uzi_sustained_ammo;
+ }
if (self.BUTTON_ATCK)
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_mode1_fire_auto);
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_mode1_fire_auto);
else
{
- ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_first_refire") * W_WeaponRateFactor();
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready);
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_first_refire * W_WeaponRateFactor();
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, w_ready);
return;
}
return;
}
- W_SetupShot (self, cvar("g_antilag_bullets") && cvar("g_balance_uzi_speed") >= cvar("g_antilag_bullets"), 0, "weapons/uzi_fire.wav", CHAN_WEAPON, cvar("g_balance_uzi_sustained_damage"));
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
if (!g_norecoil)
{
self.punchangle_x = random () - 0.5;
self.punchangle_y = random () - 0.5;
}
- uzi_spread = bound(cvar("g_balance_uzi_spread_min"), cvar("g_balance_uzi_spread_min") + (cvar("g_balance_uzi_spread_add") * self.uzi_bulletcounter), cvar("g_balance_uzi_spread_max"));
- fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, cvar("g_balance_uzi_speed"), 5, cvar("g_balance_uzi_sustained_damage"), 0, cvar("g_balance_uzi_sustained_force"), WEP_UZI, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ uzi_spread = bound(autocvar_g_balance_uzi_spread_min, autocvar_g_balance_uzi_spread_min + (autocvar_g_balance_uzi_spread_add * self.misc_bulletcounter), autocvar_g_balance_uzi_spread_max);
+ fireBallisticBullet(w_shotorg, w_shotdir, uzi_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
- self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
+ self.misc_bulletcounter = self.misc_bulletcounter + 1;
pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
UziFlash();
W_AttachToShotorg(self.muzzle_flash, '5 0 0');
- if (cvar("g_casings") >= 2) // casing code
+ if (autocvar_g_casings >= 2) // casing code
SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
-
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
-
}
void uzi_mode1_fire_burst()
{
- W_SetupShot (self, cvar("g_antilag_bullets") && cvar("g_balance_uzi_speed") >= cvar("g_antilag_bullets"), 0, "weapons/uzi_fire.wav", CHAN_WEAPON, cvar("g_balance_uzi_sustained_damage"));
+ W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
if (!g_norecoil)
{
self.punchangle_x = random () - 0.5;
self.punchangle_y = random () - 0.5;
}
- fireBallisticBullet(w_shotorg, w_shotdir, cvar("g_balance_uzi_burst_spread"), cvar("g_balance_uzi_speed"), 5, cvar("g_balance_uzi_sustained_damage"), 0, cvar("g_balance_uzi_sustained_force"), WEP_UZI, 0, 1, cvar("g_balance_uzi_bulletconstant"));
+ fireBallisticBullet(w_shotorg, w_shotdir, autocvar_g_balance_uzi_burst_spread, autocvar_g_balance_uzi_speed, 5, autocvar_g_balance_uzi_sustained_damage, 0, autocvar_g_balance_uzi_sustained_force, WEP_UZI, 0, 1, autocvar_g_balance_uzi_bulletconstant);
endFireBallisticBullet();
UziFlash();
W_AttachToShotorg(self.muzzle_flash, '5 0 0');
- if (cvar("g_casings") >= 2) // casing code
+ if (autocvar_g_casings >= 2) // casing code
SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
- self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
- if (self.uzi_bulletcounter == 0)
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_uzi_burst_refire2"), w_ready);
+ self.misc_bulletcounter = self.misc_bulletcounter + 1;
+ if (self.misc_bulletcounter == 0)
+ {
+ ATTACK_FINISHED(self) = time + autocvar_g_balance_uzi_burst_refire2 * W_WeaponRateFactor();
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_uzi_burst_animtime, w_ready);
+ }
else
{
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_uzi_burst_refire"), uzi_mode1_fire_burst);
- dprint("bullets:", ftos(self.uzi_bulletcounter),"\n");
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_uzi_burst_refire, uzi_mode1_fire_burst);
}
}
float w_uzi(float req)
{
+ float ammo_amount;
if (req == WR_AIM)
if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
}
else if (req == WR_THINK)
{
- if(cvar("g_balance_uzi_mode") == 1)
+ if(autocvar_g_balance_uzi_reload_ammo && self.clip_load < min(max(autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_first_ammo), autocvar_g_balance_uzi_burst_ammo)) // forced reload
+ W_UZI_Reload();
+ else if(autocvar_g_balance_uzi_mode == 1)
{
if (self.BUTTON_ATCK)
if (weapon_prepareattack(0, 0))
{
- self.uzi_bulletcounter = 0;
+ self.misc_bulletcounter = 0;
uzi_mode1_fire_auto();
}
w_ready();
return FALSE;
}
-
- if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
- self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_burst_ammo");
- self.uzi_bulletcounter = cvar("g_balance_uzi_burst") * -1;
+ // if this weapon is reloadable, decrease its load. Else decrease the player's ammo
+ if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+ {
+ if(autocvar_g_balance_uzi_reload_ammo)
+ {
+ self.clip_load -= autocvar_g_balance_uzi_burst_ammo;
+ self.weapon_load[WEP_UZI] = self.clip_load;
+ }
+ else
+ self.ammo_nails -= autocvar_g_balance_uzi_burst_ammo;
+ }
+
+ self.misc_bulletcounter = autocvar_g_balance_uzi_burst * -1;
uzi_mode1_fire_burst();
}
}
if (self.BUTTON_ATCK)
if (weapon_prepareattack(0, 0))
{
- self.uzi_bulletcounter = 1;
- W_Uzi_Attack(WEP_UZI); // sets attack_finished
- weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
+ self.misc_bulletcounter = 1;
+ W_UZI_Attack(WEP_UZI); // sets attack_finished
+ weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_uzi_sustained_refire, uzi_fire1_02);
}
- if (self.BUTTON_ATCK2 && cvar("g_balance_uzi_first"))
+ if (self.BUTTON_ATCK2 && autocvar_g_balance_uzi_first)
if (weapon_prepareattack(1, 0))
{
- self.uzi_bulletcounter = 1;
- W_Uzi_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
- weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_uzi_first_refire"), w_ready);
+ self.misc_bulletcounter = 1;
+ W_UZI_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
+ weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_uzi_first_refire, w_ready);
}
}
}
precache_model ("models/weapons/v_uzi.md3");
precache_model ("models/weapons/h_uzi.iqm");
precache_sound ("weapons/uzi_fire.wav");
+ precache_sound ("weapons/reload.wav");
}
else if (req == WR_SETUP)
+ {
weapon_setup(WEP_UZI);
+ W_UZI_SetAmmoCounter();
+ }
else if (req == WR_CHECKAMMO1)
- if(cvar("g_balance_uzi_mode") == 1)
- return self.ammo_nails >= cvar("g_balance_uzi_sustained_ammo");
+ {
+ if(autocvar_g_balance_uzi_mode == 1)
+ ammo_amount = self.ammo_nails >= autocvar_g_balance_uzi_sustained_ammo;
else
- return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
+ ammo_amount = self.ammo_nails >= autocvar_g_balance_uzi_first_ammo;
+
+ if(autocvar_g_balance_uzi_reload_ammo)
+ {
+ if(autocvar_g_balance_uzi_mode == 1)
+ ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_sustained_ammo;
+ else
+ ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_first_ammo;
+ }
+ return ammo_amount;
+ }
else if (req == WR_CHECKAMMO2)
- if(cvar("g_balance_uzi_mode") == 1)
- return self.ammo_nails >= cvar("g_balance_uzi_burst_ammo");
+ {
+ if(autocvar_g_balance_uzi_mode == 1)
+ ammo_amount = self.ammo_nails >= autocvar_g_balance_uzi_burst_ammo;
else
- return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
+ ammo_amount = self.ammo_nails >= autocvar_g_balance_uzi_first_ammo;
+
+ if(autocvar_g_balance_uzi_reload_ammo)
+ {
+ if(autocvar_g_balance_uzi_mode == 1)
+ ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_burst_ammo;
+ else
+ ammo_amount += self.weapon_load[WEP_UZI] >= autocvar_g_balance_uzi_first_ammo;
+ }
+ return ammo_amount;
+ }
+ else if (req == WR_RESETPLAYER)
+ {
+ // all weapons must be fully loaded when we spawn
+ self.weapon_load[WEP_UZI] = autocvar_g_balance_uzi_reload_ammo;
+ }
+ else if (req == WR_RELOAD)
+ {
+ W_UZI_Reload();
+ }
return TRUE;
};
#endif
precache_sound("weapons/ric3.wav");
}
else if (req == WR_SUICIDEMESSAGE)
- w_deathtypestring = "%s did the impossible";
+ w_deathtypestring = _("%s did the impossible");
else if (req == WR_KILLMESSAGE)
{
if(w_deathtype & HITTYPE_SECONDARY)
- w_deathtypestring = "%s was sniped by %s";
+ w_deathtypestring = _("%s was sniped by %s");
else
- w_deathtypestring = "%s was riddled full of holes by %s";
+ w_deathtypestring = _("%s was riddled full of holes by %s");
}
return TRUE;
}