2 REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", "Machine Gun");
7 // leilei's fancy muzzleflash stuff
10 self.frame = self.frame + 2;
11 self.scale = self.scale * 0.5;
12 self.alpha = self.alpha - 0.25;
13 self.nextthink = time + 0.05;
17 self.think = SUB_Remove;
18 self.nextthink = time;
19 self.owner.muzzle_flash = world;
27 if (self.muzzle_flash == world)
28 self.muzzle_flash = spawn();
30 // muzzle flash for 1st person view
31 setmodel(self.muzzle_flash, "models/uziflash.md3"); // precision set below
33 self.muzzle_flash.scale = 0.75;
34 self.muzzle_flash.think = Uzi_Flash_Go;
35 self.muzzle_flash.nextthink = time + 0.02;
36 self.muzzle_flash.frame = 2;
37 self.muzzle_flash.alpha = 0.75;
38 self.muzzle_flash.angles_z = random() * 180;
39 self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
40 self.muzzle_flash.owner = self;
45 .float uzi_bulletcounter;
46 void W_Uzi_Attack (float deathtype)
48 if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
50 if (self.uzi_bulletcounter == 1)
51 self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo");
53 self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
55 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"));
58 self.punchangle_x = random () - 0.5;
59 self.punchangle_y = random () - 0.5;
62 // this attack_finished just enforces a cooldown at the end of a burst
63 ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_first_refire") * W_WeaponRateFactor();
65 if (self.uzi_bulletcounter == 1)
66 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"));
68 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"));
69 endFireBallisticBullet();
71 pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
74 W_AttachToShotorg(self.muzzle_flash, '5 0 0');
77 if (cvar("g_casings") >= 2)
78 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);
84 if(self.weapon != self.switchweapon) // abort immediately if switching
91 if (!weapon_action(self.weapon, WR_CHECKAMMO2))
93 W_SwitchWeapon_Force(self, w_getbestweapon(self));
97 self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
98 W_Uzi_Attack(WEP_UZI);
99 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
102 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready);
105 void spawnfunc_weapon_machinegun(); // defined in t_items.qc
107 float w_uzi(float req)
110 if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
111 self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
114 self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
116 else if (req == WR_THINK)
118 if (self.BUTTON_ATCK)
119 if (weapon_prepareattack(0, 0))
121 self.uzi_bulletcounter = 1;
122 W_Uzi_Attack(WEP_UZI); // sets attack_finished
123 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
125 if (self.BUTTON_ATCK2 && cvar("g_balance_uzi_first"))
126 if (weapon_prepareattack(1, 0))
128 self.uzi_bulletcounter = 1;
129 W_Uzi_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
130 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_uzi_first_refire"), w_ready);
133 else if (req == WR_PRECACHE)
135 precache_model ("models/uziflash.md3");
136 precache_model ("models/weapons/g_uzi.md3");
137 precache_model ("models/weapons/v_uzi.md3");
138 precache_model ("models/weapons/h_uzi.iqm");
139 precache_sound ("weapons/uzi_fire.wav");
141 else if (req == WR_SETUP)
142 weapon_setup(WEP_UZI);
143 else if (req == WR_CHECKAMMO1)
144 return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
145 else if (req == WR_CHECKAMMO2)
146 return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
151 float w_uzi(float req)
153 if(req == WR_IMPACTEFFECT)
156 org2 = w_org + w_backoff * 2;
157 pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
160 sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
161 else if(w_random < 0.1)
162 sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
163 else if(w_random < 0.2)
164 sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
166 else if(req == WR_PRECACHE)
168 precache_sound("weapons/ric1.wav");
169 precache_sound("weapons/ric2.wav");
170 precache_sound("weapons/ric3.wav");
172 else if (req == WR_SUICIDEMESSAGE)
173 w_deathtypestring = "%s did the impossible";
174 else if (req == WR_KILLMESSAGE)
176 if(w_deathtype & HITTYPE_SECONDARY)
177 w_deathtypestring = "%s was sniped by %s";
179 w_deathtypestring = "%s was riddled full of holes by %s";