2 REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", "Machine Gun");
5 // leilei's fancy muzzleflash stuff
6 void W_Uzi_Flash_Go() {
12 self.frame = self.frame + 2;
13 self.scale = self.scale * 0.5;
14 self.alpha = self.alpha - 0.25;
15 self.think = W_Uzi_Flash_Go;
16 self.nextthink = time + 0.05;
19 .float uzi_bulletcounter;
21 void W_Uzi_Attack (float deathtype)
25 if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
27 if (self.uzi_bulletcounter == 1)
28 self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo");
30 self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
32 W_SetupShot (self, cvar("g_antilag_bullets") && cvar("g_balance_uzi_speed") >= cvar("g_antilag_bullets"), 0, "weapons/uzi_fire.wav", cvar("g_balance_uzi_first_damage"));
35 self.punchangle_x = random () - 0.5;
36 self.punchangle_y = random () - 0.5;
39 // this attack_finished just enforces a cooldown at the end of a burst
40 ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_first_refire") * W_WeaponRateFactor();
42 if (self.uzi_bulletcounter == 1)
43 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"));
45 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"));
46 endFireBallisticBullet();
48 pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
50 if ((self.muzzleflash == world) || wasfreed(self.muzzleflash))
51 self.muzzleflash = spawn();
53 // muzzle flash for 1st person view
54 setmodel(self.muzzleflash, "models/uziflash.md3"); // precision set below
55 //SUB_SetFade(flash, time + 0.06, 0);
56 self.muzzleflash.scale = 0.75;
57 self.muzzleflash.think = W_Uzi_Flash_Go;
58 self.muzzleflash.nextthink = time + 0.02;
59 self.muzzleflash.frame = 2;
60 self.muzzleflash.alpha = 0.75;
61 self.muzzleflash.angles_z = random() * 180;
62 self.muzzleflash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
63 W_AttachToShotorg(self.muzzleflash, '5 0 0');
66 if (cvar("g_casings") >= 2)
67 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);
73 if(self.weapon != self.switchweapon) // abort immediately if switching
80 if (!weapon_action(self.weapon, WR_CHECKAMMO2))
82 W_SwitchWeapon_Force(self, w_getbestweapon(self));
86 self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
87 W_Uzi_Attack(WEP_UZI);
88 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
91 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready);
94 void spawnfunc_weapon_machinegun(); // defined in t_items.qc
96 float w_uzi(float req)
99 if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
100 self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
103 self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
105 else if (req == WR_THINK)
107 if (self.BUTTON_ATCK)
108 if (weapon_prepareattack(0, 0))
110 self.uzi_bulletcounter = 1;
111 W_Uzi_Attack(WEP_UZI); // sets attack_finished
112 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
114 if (self.BUTTON_ATCK2 && cvar("g_balance_uzi_first"))
115 if (weapon_prepareattack(1, 0))
117 self.uzi_bulletcounter = 1;
118 W_Uzi_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
119 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_uzi_first_refire"), w_ready);
122 else if (req == WR_PRECACHE)
124 precache_model ("models/uziflash.md3");
125 precache_model ("models/weapons/g_uzi.md3");
126 precache_model ("models/weapons/v_uzi.md3");
127 precache_model ("models/weapons/h_uzi.iqm");
128 precache_sound ("weapons/uzi_fire.wav");
130 else if (req == WR_SETUP)
131 weapon_setup(WEP_UZI);
132 else if (req == WR_CHECKAMMO1)
133 return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
134 else if (req == WR_CHECKAMMO2)
135 return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
140 float w_uzi(float req)
142 if(req == WR_IMPACTEFFECT)
145 org2 = w_org + w_backoff * 2;
146 pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
149 sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
150 else if(w_random < 0.1)
151 sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
152 else if(w_random < 0.2)
153 sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
155 else if(req == WR_PRECACHE)
157 precache_sound("weapons/ric1.wav");
158 precache_sound("weapons/ric2.wav");
159 precache_sound("weapons/ric3.wav");
161 else if (req == WR_SUICIDEMESSAGE)
162 w_deathtypestring = "%s did the impossible";
163 else if (req == WR_KILLMESSAGE)
165 if(w_deathtype & HITTYPE_SECONDARY)
166 w_deathtypestring = "%s was sniped by %s";
168 w_deathtypestring = "%s was riddled full of holes by %s";