]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_hlac.qc
unlimited ammo revisited: distinguish between superweapons and normal 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"), self.projectiledeathtype, 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"), self.projectiledeathtype, 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_WEAPON_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         missile.projectiledeathtype = WEP_HLAC;\r
111 }\r
112 \r
113 void W_HLAC_Attack2f (void)\r
114 {\r
115         local entity missile;\r
116     float spread;\r
117 \r
118     spread = cvar("g_balance_hlac_secondary_spread");\r
119 \r
120 \r
121     if(self.crouch)\r
122         spread = spread * cvar("g_balance_hlac_secondary_spread_crouchmod");\r
123 \r
124         W_SetupShot (self, '25 8 -8', FALSE, 3, "weapons/lasergun_fire.wav");\r
125         pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);\r
126 \r
127         missile = spawn ();\r
128         missile.owner = self;\r
129         missile.classname = "hlacbolt";\r
130         // missile.dmg = issecondary;\r
131         missile.bot_dodge = TRUE;\r
132 \r
133     missile.bot_dodgerating = cvar("g_balance_hlac_secondary_damage");\r
134 \r
135         missile.movetype = MOVETYPE_FLY;\r
136         missile.solid = SOLID_BBOX;\r
137 \r
138         setmodel (missile, "models/laser.mdl"); // precision set below\r
139         setsize (missile, '0 0 0', '0 0 0');\r
140         setorigin (missile, w_shotorg);\r
141 \r
142     missile.velocity = (w_shotdir + randomvec() * spread) * cvar("g_balance_hlac_secondary_speed");\r
143 \r
144         W_SetupProjectileVelocity(missile);\r
145         missile.angles = vectoangles (missile.velocity);\r
146 \r
147         missile.touch = W_HLAC_Touch2;\r
148         missile.think = SUB_Remove;\r
149 \r
150     missile.nextthink = time + cvar("g_balance_hlac_secondary_lifetime");\r
151 \r
152         missile.effects = EF_LOWPRECISION;\r
153         missile.flags = FL_PROJECTILE;\r
154         missile.projectiledeathtype = WEP_HLAC | HITTYPE_SECONDARY;\r
155 }\r
156 \r
157 void W_HLAC_Attack2 (void)\r
158 {\r
159     float i;\r
160 \r
161     if not(self.items & IT_UNLIMITED_WEAPON_AMMO)\r
162     {\r
163         self.ammo_cells = self.ammo_cells - cvar("g_balance_hlac_secondary_ammo");\r
164     }\r
165 \r
166     for(i=0;i<6;++i)\r
167         W_HLAC_Attack2f();\r
168 \r
169         if (!g_norecoil)\r
170         {\r
171                 self.punchangle_x = random () - 0.5;\r
172                 self.punchangle_y = random () - 0.5;\r
173         }\r
174 \r
175         // ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_secondary_refire");\r
176 }\r
177 \r
178 \r
179 // weapon frames\r
180 void HLAC_fire1_02()\r
181 {\r
182         if(self.weapon != self.switchweapon) // abort immediately if switching\r
183         {\r
184                 w_ready();\r
185                 return;\r
186         }\r
187 \r
188         if (self.BUTTON_ATCK)\r
189         {\r
190                 if (!weapon_action(self.weapon, WR_CHECKAMMO1))\r
191                 {\r
192                         W_SwitchWeapon_Force(self, w_getbestweapon(self));\r
193                         w_ready();\r
194                         return;\r
195                 }\r
196 \r
197                 ATTACK_FINISHED(self) = time + cvar("g_balance_hlac_primary_refire");\r
198                 W_HLAC_Attack();\r
199                 self.HLAC_bulletcounter = self.HLAC_bulletcounter + 1;\r
200         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);\r
201         }\r
202         else\r
203         {\r
204                 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_animtime"), w_ready);\r
205         }\r
206 };\r
207 \r
208 void spawnfunc_weapon_hlac (void)\r
209 {\r
210         weapon_defaultspawnfunc(WEP_HLAC);\r
211 }\r
212 \r
213 float w_hlac(float req)\r
214 {\r
215         if (req == WR_AIM)\r
216         self.BUTTON_ATCK = bot_aim(cvar("g_balance_hlac_primary_speed"), 0, cvar("g_balance_hlac_primary_lifetime"), FALSE);\r
217         else if (req == WR_THINK)\r
218         {\r
219                 if (self.BUTTON_ATCK)\r
220                 if (weapon_prepareattack(0, cvar("g_balance_hlac_primary_refire")))\r
221                 {\r
222                         self.HLAC_bulletcounter = 0;\r
223                         W_HLAC_Attack();\r
224                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_hlac_primary_refire"), HLAC_fire1_02);\r
225                 }\r
226 \r
227                 if (self.BUTTON_ATCK2)\r
228                 if (weapon_prepareattack(1, cvar("g_balance_hlac_secondary_refire")))\r
229                 {\r
230                         W_HLAC_Attack2();\r
231                         weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_hlac_secondary_animtime"), w_ready);\r
232                 }\r
233 \r
234         }\r
235         else if (req == WR_PRECACHE)\r
236         {\r
237             precache_sound ("weapons/laserimpact.wav");\r
238         precache_sound ("weapons/lasergun_fire.wav");\r
239 \r
240         precache_model ("models/weapons/g_hlac.md3");\r
241                 precache_model ("models/weapons/v_hlac.md3");\r
242                 precache_model ("models/weapons/w_hlac.zym");\r
243                 precache_sound ("weapons/lasergun_fire.wav");\r
244 \r
245         }\r
246         else if (req == WR_SETUP)\r
247                 weapon_setup(WEP_HLAC);\r
248         else if (req == WR_CHECKAMMO1)\r
249                 return self.ammo_cells >= cvar("g_balance_hlac_primary_ammo");\r
250         else if (req == WR_CHECKAMMO2)\r
251                 return self.ammo_cells >= cvar("g_balance_hlac_secondary_ammo");\r
252         else if (req == WR_SUICIDEMESSAGE)\r
253                 w_deathtypestring = "should have used a smaller gun";\r
254         else if (req == WR_KILLMESSAGE)\r
255                 w_deathtypestring = "was cut down by";\r
256         return TRUE;\r
257 };\r