]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_hlac.qc
HLAC and Tag Seeker weapons.
[divverent/nexuiz.git] / data / qcsrc / server / w_hlac.qc
1 .float HLAC_bulletcounter;\r
2 void W_HLAC_Touch (void)\r
3 {\r
4         vector  dir;\r
5         vector org2;\r
6         vector normal;\r
7 \r
8         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)\r
9         {\r
10                 remove(self);\r
11                 return;\r
12         }\r
13 \r
14         if (other == self.owner)\r
15                 return;\r
16 \r
17         normal = trace_plane_normal;\r
18         dir = normalize (self.owner.origin - self.origin);\r
19         org2 = findbetterlocation (self.origin, 8);\r
20 \r
21         pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1);\r
22 \r
23         self.event_damage = SUB_Null;\r
24 \r
25     RadiusDamage (self, self.owner, cvar("g_balance_hlac_primary_damage"), cvar("g_balance_hlac_primary_edgedamage"), cvar("g_balance_hlac_primary_radius"), world, cvar("g_balance_hlac_primary_force"), WEP_HLAC, other);\r
26         sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);\r
27 \r
28         remove (self);\r
29 }\r
30 \r
31 void W_HLAC_Touch2 (void)\r
32 {\r
33         vector  dir;\r
34         vector org2;\r
35         vector normal;\r
36 \r
37         if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)\r
38         {\r
39                 remove(self);\r
40                 return;\r
41         }\r
42 \r
43         if (other == self.owner)\r
44                 return;\r
45 \r
46         normal = trace_plane_normal;\r
47         dir = normalize (self.owner.origin - self.origin);\r
48         org2 = findbetterlocation (self.origin, 8);\r
49 \r
50         pointparticles(particleeffectnum("laser_impact"), org2, normal * 1000, 1);\r
51 \r
52         //self.event_damage = SUB_Null;\r
53 \r
54     RadiusDamage (self, self.owner, cvar("g_balance_hlac_secondary_damage"), cvar("g_balance_hlac_secondary_edgedamage"), cvar("g_balance_hlac_secondary_radius"), world, cvar("g_balance_hlac_secondary_force"), WEP_HLAC, other);\r
55         sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);\r
56 \r
57         remove (self);\r
58 }\r
59 \r
60 void W_HLAC_Attack (void)\r
61 {\r
62         local entity missile;\r
63     float spread;\r
64 \r
65     if not(self.items & IT_UNLIMITED_AMMO)\r
66     {\r
67         self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_primary_ammo");\r
68     }\r
69 \r
70     spread = cvar("g_balance_hlac_primary_spread_min") + (cvar("g_balance_hlac_primary_spread_add") * self.HLAC_bulletcounter);\r
71     spread = min(spread,cvar("g_balance_hlac_primary_spread_max"));\r
72     if(self.crouch)\r
73         spread = spread * cvar("g_balance_hlac_primary_spread_crouchmod");\r
74 \r
75         W_SetupShot (self, '25 8 -8', FALSE, 3, "weapons/lasergun_fire.wav");\r
76         pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);\r
77         if (!g_norecoil)\r
78         {\r
79                 self.punchangle_x = random () - 0.5;\r
80                 self.punchangle_y = random () - 0.5;\r
81         }\r
82 \r
83         missile = spawn ();\r
84         missile.owner = self;\r
85         missile.classname = "hlacbolt";\r
86         // missile.dmg = issecondary;\r
87         missile.bot_dodge = TRUE;\r
88 \r
89     missile.bot_dodgerating = cvar("g_balance_hlac_primary_damage");\r
90 \r
91         missile.movetype = MOVETYPE_FLY;\r
92         missile.solid = SOLID_BBOX;\r
93 \r
94         setmodel (missile, "models/laser.mdl"); // precision set below\r
95         setsize (missile, '0 0 0', '0 0 0');\r
96         setorigin (missile, w_shotorg);\r
97 \r
98     missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_primary_speed");\r
99 \r
100         W_SetupProjectileVelocity(missile);\r
101         missile.angles = vectoangles (missile.velocity);\r
102 \r
103         missile.touch = W_HLAC_Touch;\r
104         missile.think = SUB_Remove;\r
105 \r
106     missile.nextthink = time + cvar("g_balance_hlac_primary_lifetime");\r
107 \r
108         missile.effects = EF_LOWPRECISION;\r
109         missile.flags = FL_PROJECTILE;\r
110 }\r
111 \r
112 void W_HLAC_Attack2f (void)\r
113 {\r
114         local entity missile;\r
115     float spread;\r
116 \r
117     spread = cvar("g_balance_hlac_secondary_spread");\r
118 \r
119 \r
120     if(self.crouch)\r
121         spread = spread * cvar("g_balance_hlac_secondary_spread_crouchmod");\r
122 \r
123         W_SetupShot (self, '25 8 -8', FALSE, 3, "weapons/lasergun_fire.wav");\r
124         pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);\r
125 \r
126         missile = spawn ();\r
127         missile.owner = self;\r
128         missile.classname = "hlacbolt";\r
129         // missile.dmg = issecondary;\r
130         missile.bot_dodge = TRUE;\r
131 \r
132     missile.bot_dodgerating = cvar("g_balance_hlac_secondary_damage");\r
133 \r
134         missile.movetype = MOVETYPE_FLY;\r
135         missile.solid = SOLID_BBOX;\r
136 \r
137         setmodel (missile, "models/laser.mdl"); // precision set below\r
138         setsize (missile, '0 0 0', '0 0 0');\r
139         setorigin (missile, w_shotorg);\r
140 \r
141     missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_secondary_speed");\r
142 \r
143         W_SetupProjectileVelocity(missile);\r
144         missile.angles = vectoangles (missile.velocity);\r
145 \r
146         missile.touch = W_HLAC_Touch2;\r
147         missile.think = SUB_Remove;\r
148 \r
149     missile.nextthink = time + cvar("g_balance_hlac_secondary_lifetime");\r
150 \r
151         missile.effects = EF_LOWPRECISION;\r
152         missile.flags = FL_PROJECTILE;\r
153 }\r
154 \r
155 void W_HLAC_Attack2 (void)\r
156 {\r
157     float i;\r
158 \r
159     if not(self.items & IT_UNLIMITED_AMMO)\r
160     {\r
161         self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_secondary_ammo");\r
162     }\r
163 \r
164     for(i=0;i<6;++i)\r
165         W_HLAC_Attack2f();\r
166 \r
167         if (!g_norecoil)\r
168         {\r
169                 self.punchangle_x = random () - 0.5;\r
170                 self.punchangle_y = random () - 0.5;\r
171         }\r
172 \r
173         // ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_secondary_refire");\r
174 }\r
175 \r
176 \r
177 // weapon frames\r
178 void HLAC_fire1_02()\r
179 {\r
180         if(self.weapon != self.switchweapon) // abort immediately if switching\r
181         {\r
182                 w_ready();\r
183                 return;\r
184         }\r
185 \r
186         if (self.BUTTON_ATCK)\r
187         {\r
188                 if (!weapon_action(self.weapon, WR_CHECKAMMO1))\r
189                 {\r
190                         W_SwitchWeapon_Force(self, w_getbestweapon(self));\r
191                         w_ready();\r
192                         return;\r
193                 }\r
194 \r
195                 ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_primary_refire");\r
196                 W_HLAC_Attack();\r
197                 self.HLAC_bulletcounter = self.HLAC_bulletcounter + 1;\r
198         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);\r
199         }\r
200         else\r
201         {\r
202                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_animtime"), w_ready);\r
203         }\r
204 };\r
205 \r
206 void spawnfunc_weapon_hlac(); // defined in t_items.qc\r
207 \r
208 float w_hlac(float req)\r
209 {\r
210         if (req == WR_AIM)\r
211         self.BUTTON_ATCK = bot_aim(cvar("g_balance_hlac_primary_speed"), 0, cvar("g_balance_hlac_primary_lifetime"), FALSE);\r
212         else if (req == WR_THINK)\r
213         {\r
214                 if (self.BUTTON_ATCK)\r
215                 if (weapon_prepareattack(0, cvar("g_balance_hlac_primary_refire")))\r
216                 {\r
217                         self.HLAC_bulletcounter = 0;\r
218                         W_HLAC_Attack();\r
219                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);\r
220                 }\r
221 \r
222                 if (self.BUTTON_ATCK2)\r
223                 if (weapon_prepareattack(1, cvar("g_balance_hlac_secondary_refire")))\r
224                 {\r
225                         W_HLAC_Attack2();\r
226                         weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hlac_secondary_animtime"), w_ready);\r
227                 }\r
228 \r
229         }\r
230         else if (req == WR_PRECACHE)\r
231         {\r
232             precache_sound ("weapons/laserimpact.wav");\r
233         precache_sound ("weapons/lasergun_fire.wav");\r
234 \r
235         precache_model ("models/weapons/g_hlac.md3");\r
236                 precache_model ("models/weapons/v_hlac.md3");\r
237                 precache_model ("models/weapons/w_hlac.zym");\r
238                 precache_sound ("weapons/lasergun_fire.wav");\r
239 \r
240         }\r
241         else if (req == WR_SETUP)\r
242                 weapon_setup(WEP_HLAC);\r
243         else if (req == WR_CHECKAMMO1)\r
244                 return self.ammo_cells >= cvar("g_balance_hlac_primary_ammo");\r
245         else if (req == WR_CHECKAMMO2)\r
246                 return self.ammo_cells >= cvar("g_balance_hlac_secondary_ammo");\r
247         else if (req == WR_SUICIDEMESSAGE)\r
248                 w_deathtypestring = "should have used a smaller gun";\r
249         else if (req == WR_KILLMESSAGE)\r
250                 w_deathtypestring = "was cut down by";\r
251         return TRUE;\r
252 };\r