]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/w_uzi.qc
Merge remote branch 'origin/fruitiex/fruitbalance'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_uzi.qc
1 #ifdef REGISTER_WEAPON
2 REGISTER_WEAPON(UZI, w_uzi, IT_NAILS, 3, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "uzi", "uzi", "Machine Gun");
3 #else
4 #ifdef SVQC
5 // leilei's fancy muzzleflash stuff
6 void W_Uzi_Flash_Go() {
7         if (self.alpha >= 0)
8         {
9                 setmodel(self, "");
10                 return;
11         }
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;
17 };
18
19 .float uzi_bulletcounter;
20 .entity muzzleflash;
21 void W_Uzi_Attack (float deathtype)
22 {
23         local entity flash;
24
25         if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
26         {
27                 if (self.uzi_bulletcounter == 1)
28                         self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo");
29                 else
30                         self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
31         }
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"));
33         if (!g_norecoil)
34         {
35                 self.punchangle_x = random () - 0.5;
36                 self.punchangle_y = random () - 0.5;
37         }
38
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();
41
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"));
44         else
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();
47
48         pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
49
50         if ((self.muzzleflash == world) || wasfreed(self.muzzleflash))
51                 self.muzzleflash = spawn();
52         
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');
64
65         // casing code
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);
68 }
69
70 // weapon frames
71 void uzi_fire1_02()
72 {
73         if(self.weapon != self.switchweapon) // abort immediately if switching
74         {
75                 w_ready();
76                 return;
77         }
78         if (self.BUTTON_ATCK)
79         {
80                 if (!weapon_action(self.weapon, WR_CHECKAMMO2))
81                 {
82                         W_SwitchWeapon_Force(self, w_getbestweapon(self));
83                         w_ready();
84                         return;
85                 }
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);
89         }
90         else
91                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready);
92 };
93
94 void spawnfunc_weapon_machinegun(); // defined in t_items.qc
95
96 float w_uzi(float req)
97 {
98         if (req == WR_AIM)
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);
101                 else
102                 {
103                         self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
104                 }
105         else if (req == WR_THINK)
106         {
107                 if (self.BUTTON_ATCK)
108                 if (weapon_prepareattack(0, 0))
109                 {
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);
113                 }
114                 if (self.BUTTON_ATCK2 && cvar("g_balance_uzi_first"))
115                 if (weapon_prepareattack(1, 0))
116                 {
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);
120                 }
121         }
122         else if (req == WR_PRECACHE)
123         {
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");
129         }
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");
136         return TRUE;
137 };
138 #endif
139 #ifdef CSQC
140 float w_uzi(float req)
141 {
142         if(req == WR_IMPACTEFFECT)
143         {
144                 vector org2;
145                 org2 = w_org + w_backoff * 2;
146                 pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
147                 if(!w_issilent)
148                         if(w_random < 0.05)
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);
154         }
155         else if(req == WR_PRECACHE)
156         {
157                 precache_sound("weapons/ric1.wav");
158                 precache_sound("weapons/ric2.wav");
159                 precache_sound("weapons/ric3.wav");
160         }
161         else if (req == WR_SUICIDEMESSAGE)
162                 w_deathtypestring = "%s did the impossible";
163         else if (req == WR_KILLMESSAGE)
164         {
165                 if(w_deathtype & HITTYPE_SECONDARY)
166                         w_deathtypestring = "%s was sniped by %s";
167                 else
168                         w_deathtypestring = "%s was riddled full of holes by %s";
169         }
170         return TRUE;
171 }
172 #endif
173 #endif