]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/w_uzi.qc
remove muzzleflash when player leaves
[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 void W_Uzi_Attack (float deathtype)
21 {
22         local entity flash;
23
24         if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
25         {
26                 if (self.uzi_bulletcounter == 1)
27                         self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_first_ammo");
28                 else
29                         self.ammo_nails = self.ammo_nails - cvar("g_balance_uzi_sustained_ammo");
30         }
31         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"));
32         if (!g_norecoil)
33         {
34                 self.punchangle_x = random () - 0.5;
35                 self.punchangle_y = random () - 0.5;
36         }
37
38         // this attack_finished just enforces a cooldown at the end of a burst
39         ATTACK_FINISHED(self) = time + cvar("g_balance_uzi_first_refire") * W_WeaponRateFactor();
40
41         if (self.uzi_bulletcounter == 1)
42                 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"));
43         else
44                 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"));
45         endFireBallisticBullet();
46
47         pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
48
49         if ((self.muzzleflash == world) || wasfreed(self.muzzleflash))
50                 self.muzzleflash = spawn();
51         
52         // muzzle flash for 1st person view
53         setmodel(self.muzzleflash, "models/uziflash.md3"); // precision set below
54         //SUB_SetFade(flash, time + 0.06, 0);
55         self.muzzleflash.scale = 0.75;
56         self.muzzleflash.think = W_Uzi_Flash_Go;
57         self.muzzleflash.nextthink = time + 0.02;
58         self.muzzleflash.frame = 2;
59         self.muzzleflash.alpha = 0.75;
60         self.muzzleflash.angles_z = random() * 180;
61         self.muzzleflash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
62         W_AttachToShotorg(self.muzzleflash, '5 0 0');
63
64         // casing code
65         if (cvar("g_casings") >= 2)
66                 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);
67 }
68
69 // weapon frames
70 void uzi_fire1_02()
71 {
72         if(self.weapon != self.switchweapon) // abort immediately if switching
73         {
74                 w_ready();
75                 return;
76         }
77         if (self.BUTTON_ATCK)
78         {
79                 if (!weapon_action(self.weapon, WR_CHECKAMMO2))
80                 {
81                         W_SwitchWeapon_Force(self, w_getbestweapon(self));
82                         w_ready();
83                         return;
84                 }
85                 self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
86                 W_Uzi_Attack(WEP_UZI);
87                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
88         }
89         else
90                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), w_ready);
91 };
92
93 void spawnfunc_weapon_machinegun(); // defined in t_items.qc
94
95 float w_uzi(float req)
96 {
97         if (req == WR_AIM)
98                 if(vlen(self.origin-self.enemy.origin) < 3000 - bound(0, skill, 10) * 200)
99                         self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
100                 else
101                 {
102                         self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
103                 }
104         else if (req == WR_THINK)
105         {
106                 if (self.BUTTON_ATCK)
107                 if (weapon_prepareattack(0, 0))
108                 {
109                         self.uzi_bulletcounter = 1;
110                         W_Uzi_Attack(WEP_UZI); // sets attack_finished
111                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_uzi_sustained_refire"), uzi_fire1_02);
112                 }
113                 if (self.BUTTON_ATCK2 && cvar("g_balance_uzi_first"))
114                 if (weapon_prepareattack(1, 0))
115                 {
116                         self.uzi_bulletcounter = 1;
117                         W_Uzi_Attack(WEP_UZI | HITTYPE_SECONDARY); // sets attack_finished
118                         weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_uzi_first_refire"), w_ready);
119                 }
120         }
121         else if (req == WR_PRECACHE)
122         {
123                 precache_model ("models/uziflash.md3");
124                 precache_model ("models/weapons/g_uzi.md3");
125                 precache_model ("models/weapons/v_uzi.md3");
126                 precache_model ("models/weapons/h_uzi.iqm");
127                 precache_sound ("weapons/uzi_fire.wav");
128         }
129         else if (req == WR_SETUP)
130                 weapon_setup(WEP_UZI);
131         else if (req == WR_CHECKAMMO1)
132                 return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
133         else if (req == WR_CHECKAMMO2)
134                 return self.ammo_nails >= cvar("g_balance_uzi_first_ammo");
135         return TRUE;
136 };
137 #endif
138 #ifdef CSQC
139 float w_uzi(float req)
140 {
141         if(req == WR_IMPACTEFFECT)
142         {
143                 vector org2;
144                 org2 = w_org + w_backoff * 2;
145                 pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
146                 if(!w_issilent)
147                         if(w_random < 0.05)
148                                 sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
149                         else if(w_random < 0.1)
150                                 sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
151                         else if(w_random < 0.2)
152                                 sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
153         }
154         else if(req == WR_PRECACHE)
155         {
156                 precache_sound("weapons/ric1.wav");
157                 precache_sound("weapons/ric2.wav");
158                 precache_sound("weapons/ric3.wav");
159         }
160         else if (req == WR_SUICIDEMESSAGE)
161                 w_deathtypestring = "%s did the impossible";
162         else if (req == WR_KILLMESSAGE)
163         {
164                 if(w_deathtype & HITTYPE_SECONDARY)
165                         w_deathtypestring = "%s was sniped by %s";
166                 else
167                         w_deathtypestring = "%s was riddled full of holes by %s";
168         }
169         return TRUE;
170 }
171 #endif
172 #endif