]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/weapons/w_hlac.qc
Rename weapon_action to WEP_ACTION
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / weapons / w_hlac.qc
1 #ifdef REGISTER_WEAPON
2 REGISTER_WEAPON(
3 /* WEP_##id  */ HLAC,
4 /* function  */ w_hlac,
5 /* ammotype  */ IT_CELLS,
6 /* impulse   */ 6,
7 /* flags     */ WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH,
8 /* rating    */ BOT_PICKUP_RATING_MID,
9 /* model     */ "hlac",
10 /* shortname */ "hlac",
11 /* fullname  */ _("Heavy Laser Assault Cannon")
12 );
13 #else
14 #ifdef SVQC
15 void spawnfunc_weapon_hlac() { weapon_defaultspawnfunc(WEP_HLAC); }
16
17 void W_HLAC_Touch (void)
18 {
19         PROJECTILE_TOUCH;
20
21         self.event_damage = func_null;
22         
23         if(self.projectiledeathtype & HITTYPE_SECONDARY)
24                 RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
25         else
26                 RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
27
28         remove (self);
29 }
30
31 void W_HLAC_Attack (void)
32 {
33         entity missile;
34     float spread;
35
36         W_DecreaseAmmo(ammo_cells, autocvar_g_balance_hlac_primary_ammo, autocvar_g_balance_hlac_reload_ammo);
37
38     spread = autocvar_g_balance_hlac_primary_spread_min + (autocvar_g_balance_hlac_primary_spread_add * self.misc_bulletcounter);
39     spread = min(spread,autocvar_g_balance_hlac_primary_spread_max);
40     if(self.crouch)
41         spread = spread * autocvar_g_balance_hlac_primary_spread_crouchmod;
42
43         W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, autocvar_g_balance_hlac_primary_damage);
44         pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
45         if (!g_norecoil)
46         {
47                 self.punchangle_x = random () - 0.5;
48                 self.punchangle_y = random () - 0.5;
49         }
50
51         missile = spawn ();
52         missile.owner = missile.realowner = self;
53         missile.classname = "hlacbolt";
54         missile.bot_dodge = TRUE;
55
56     missile.bot_dodgerating = autocvar_g_balance_hlac_primary_damage;
57
58         missile.movetype = MOVETYPE_FLY;
59         PROJECTILE_MAKETRIGGER(missile);
60
61         setorigin (missile, w_shotorg);
62         setsize(missile, '0 0 0', '0 0 0');
63
64         W_SetupProjectileVelocity(missile, autocvar_g_balance_hlac_primary_speed, spread);
65         //missile.angles = vectoangles (missile.velocity); // csqc
66
67         missile.touch = W_HLAC_Touch;
68         missile.think = SUB_Remove;
69
70     missile.nextthink = time + autocvar_g_balance_hlac_primary_lifetime;
71
72         missile.flags = FL_PROJECTILE;
73         missile.projectiledeathtype = WEP_HLAC;
74
75         CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
76
77         other = missile; MUTATOR_CALLHOOK(EditProjectile);
78 }
79
80 void W_HLAC_Attack2f (void)
81 {
82         entity missile;
83     float spread;
84
85     spread = autocvar_g_balance_hlac_secondary_spread;
86
87
88     if(self.crouch)
89         spread = spread * autocvar_g_balance_hlac_secondary_spread_crouchmod;
90
91         W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, autocvar_g_balance_hlac_secondary_damage);
92         pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
93
94         missile = spawn ();
95         missile.owner = missile.realowner = self;
96         missile.classname = "hlacbolt";
97         missile.bot_dodge = TRUE;
98
99     missile.bot_dodgerating = autocvar_g_balance_hlac_secondary_damage;
100
101         missile.movetype = MOVETYPE_FLY;
102         PROJECTILE_MAKETRIGGER(missile);
103
104         setorigin (missile, w_shotorg);
105         setsize(missile, '0 0 0', '0 0 0');
106
107         W_SetupProjectileVelocity(missile, autocvar_g_balance_hlac_secondary_speed, spread);
108         //missile.angles = vectoangles (missile.velocity); // csqc
109
110         missile.touch = W_HLAC_Touch;
111         missile.think = SUB_Remove;
112
113     missile.nextthink = time + autocvar_g_balance_hlac_secondary_lifetime;
114
115         missile.flags = FL_PROJECTILE;
116         missile.missile_flags = MIF_SPLASH; 
117         missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;
118
119         CSQCProjectile(missile, TRUE, PROJECTILE_HLAC, TRUE);
120
121         other = missile; MUTATOR_CALLHOOK(EditProjectile);
122 }
123
124 void W_HLAC_Attack2 (void)
125 {
126     float i;
127
128         W_DecreaseAmmo(ammo_cells, autocvar_g_balance_hlac_secondary_ammo, autocvar_g_balance_hlac_reload_ammo);
129
130     for(i=autocvar_g_balance_hlac_secondary_shots;i>0;--i)
131         W_HLAC_Attack2f();
132
133         if (!g_norecoil)
134         {
135                 self.punchangle_x = random () - 0.5;
136                 self.punchangle_y = random () - 0.5;
137         }
138 }
139
140 // weapon frames
141 void HLAC_fire1_02()
142 {
143         if(self.weapon != self.switchweapon) // abort immediately if switching
144         {
145                 w_ready();
146                 return;
147         }
148
149         if (self.BUTTON_ATCK)
150         {
151                 if (!WEP_ACTION(self.weapon, WR_CHECKAMMO1))
152                 if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
153                 {
154                         W_SwitchWeapon_Force(self, w_getbestweapon(self));
155                         w_ready();
156                         return;
157                 }
158
159                 ATTACK_FINISHED(self) = time + autocvar_g_balance_hlac_primary_refire * W_WeaponRateFactor();
160                 W_HLAC_Attack();
161                 self.misc_bulletcounter = self.misc_bulletcounter + 1;
162         weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hlac_primary_refire, HLAC_fire1_02);
163         }
164         else
165         {
166                 weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hlac_primary_animtime, w_ready);
167         }
168 }
169
170 float w_hlac(float req)
171 {
172         float ammo_amount;
173         switch(req)
174         {
175                 case WR_AIM:
176                 {
177                         self.BUTTON_ATCK = bot_aim(autocvar_g_balance_hlac_primary_speed, 0, autocvar_g_balance_hlac_primary_lifetime, FALSE);
178                         return TRUE;
179                 }
180                 case WR_THINK:
181                 {
182                         if(autocvar_g_balance_hlac_reload_ammo && self.clip_load < min(autocvar_g_balance_hlac_primary_ammo, autocvar_g_balance_hlac_secondary_ammo)) // forced reload
183                                 WEP_ACTION(self.weapon, WR_RELOAD);
184                         else if (self.BUTTON_ATCK)
185                         {
186                                 if (weapon_prepareattack(0, autocvar_g_balance_hlac_primary_refire))
187                                 {
188                                         self.misc_bulletcounter = 0;
189                                         W_HLAC_Attack();
190                                         weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_hlac_primary_refire, HLAC_fire1_02);
191                                 }
192                         }
193
194                         else if (self.BUTTON_ATCK2 && autocvar_g_balance_hlac_secondary)
195                         {
196                                 if (weapon_prepareattack(1, autocvar_g_balance_hlac_secondary_refire))
197                                 {
198                                         W_HLAC_Attack2();
199                                         weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_hlac_secondary_animtime, w_ready);
200                                 }
201                         }
202                         
203                         return TRUE;
204                 }
205                 case WR_PRECACHE:
206                 {
207                         precache_model ("models/weapons/g_hlac.md3");
208                         precache_model ("models/weapons/v_hlac.md3");
209                         precache_model ("models/weapons/h_hlac.iqm");
210                         precache_sound ("weapons/lasergun_fire.wav");
211                         return TRUE;
212                 }
213                 case WR_SETUP:
214                 {
215                         weapon_setup(WEP_HLAC);
216                         self.current_ammo = ammo_cells;
217                         return TRUE;
218                 }
219                 case WR_CHECKAMMO1:
220                 {
221                         ammo_amount = self.ammo_cells >= autocvar_g_balance_hlac_primary_ammo;
222                         ammo_amount += self.(weapon_load[WEP_HLAC]) >= autocvar_g_balance_hlac_primary_ammo;
223                         return ammo_amount;
224                 }
225                 case WR_CHECKAMMO2:
226                 {
227                         ammo_amount = self.ammo_cells >= autocvar_g_balance_hlac_secondary_ammo;
228                         ammo_amount += self.(weapon_load[WEP_HLAC]) >= autocvar_g_balance_hlac_secondary_ammo;
229                         return ammo_amount;
230                 }
231                 case WR_RELOAD:
232                 {
233                         W_Reload(min(autocvar_g_balance_hlac_primary_ammo, autocvar_g_balance_hlac_secondary_ammo), autocvar_g_balance_hlac_reload_ammo, autocvar_g_balance_hlac_reload_time, "weapons/reload.wav");
234                         return TRUE;
235                 }
236                 case WR_SUICIDEMESSAGE:
237                 {
238                         return WEAPON_HLAC_SUICIDE;
239                 }
240                 case WR_KILLMESSAGE:
241                 {
242                         return WEAPON_HLAC_MURDER;
243                 }
244         }
245         return TRUE;
246 }
247 #endif
248 #ifdef CSQC
249 float w_hlac(float req)
250 {
251         switch(req)
252         {
253                 case WR_IMPACTEFFECT:
254                 {
255                         vector org2;
256                         org2 = w_org + w_backoff * 6;
257                         pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1);
258                         if(!w_issilent)
259                                 sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
260                                 
261                         return TRUE;
262                 }
263                 case WR_PRECACHE:
264                 {
265                         precache_sound("weapons/laserimpact.wav");
266                         return TRUE;
267                 }
268         }
269         return TRUE;
270 }
271 #endif
272 #endif