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