]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_ewheel.qc
Fix warnings
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / units / unit_ewheel.qc
1 void turret_ewheel_projectile_explode()\r
2 {\r
3     vector org2;\r
4 \r
5     org2 = findbetterlocation (self.origin, 8);\r
6     pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);\r
7     //w_deathtypestring = "saw the eweel. to late.";\r
8 #ifdef TURRET_DEBUG\r
9     float d;\r
10 \r
11     d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);\r
12     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;\r
13     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;\r
14 #else\r
15     RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);\r
16 #endif\r
17     sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);\r
18 \r
19     remove (self);\r
20 }\r
21 \r
22 \r
23 void ewheel_attack()\r
24 {\r
25     entity proj;\r
26     float i;\r
27 \r
28     for (i=0;i<1;++i)\r
29     {\r
30         turret_do_updates(self);\r
31 \r
32         sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);\r
33         pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);\r
34 \r
35         proj                    = spawn ();\r
36         setorigin(proj, self.tur_shotorg);\r
37         //setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');\r
38         //setmodel(proj, "models/laser.mdl"); // precision set above\r
39         proj.classname       = "ewheel bolt";\r
40         proj.owner           = self;\r
41         proj.bot_dodge       = FALSE;\r
42         proj.bot_dodgerating = self.shot_dmg;\r
43         proj.think           = turret_ewheel_projectile_explode;\r
44         proj.nextthink       = time + 9;\r
45         proj.solid           = SOLID_BBOX;\r
46         proj.movetype        = MOVETYPE_FLYMISSILE;\r
47         proj.velocity        = normalize(self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;\r
48         proj.angles          = vectoangles(proj.velocity);\r
49         proj.touch           = turret_ewheel_projectile_explode;\r
50         //proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;\r
51         proj.enemy           = self.enemy;\r
52         proj.flags           = FL_PROJECTILE | FL_NOTARGET;\r
53 \r
54         CSQCProjectile(proj, TRUE, PROJECTILE_LASER, TRUE);\r
55 \r
56         self.tur_head.frame += 2;\r
57 \r
58         if (self.tur_head.frame > 3)\r
59             self.tur_head.frame = 0;\r
60     }\r
61 \r
62 }\r
63 \r
64 float ewheel_moveverb_path(float eval)\r
65 {\r
66     switch (eval)\r
67     {\r
68     case VCM_EVAL:\r
69 \r
70         if (self.pathcurrent)\r
71             return verb.verb_static_value;\r
72 \r
73         return VS_CALL_NO;\r
74 \r
75     case VCM_DO:\r
76         // Do we have a path?\r
77         if not(self.pathcurrent)\r
78             return VS_CALL_NO;\r
79         else\r
80         {\r
81             // Are we close enougth to a path node to switch to the next?\r
82             if (vlen(self.origin  - self.pathcurrent.origin) < 32)\r
83                 if (self.pathcurrent.path_next == world)\r
84                 {\r
85                     // Path endpoint reached\r
86                     pathlib_deletepath(self.pathcurrent.owner);\r
87                     self.pathcurrent = world;\r
88 \r
89                     if (self.pathgoal)\r
90                     {\r
91                         if (self.pathgoal.use)\r
92                             self.pathgoal.use();\r
93 \r
94                         if (self.pathgoal.enemy)\r
95                         {\r
96                             self.pathcurrent = pathlib_astar(self.pathgoal.origin,self.pathgoal.enemy.origin);\r
97                             self.pathgoal = self.pathgoal.enemy;\r
98                         }\r
99                     }\r
100                     else\r
101                         self.pathgoal = world;\r
102                 }\r
103                 else\r
104                     self.pathcurrent = self.pathcurrent.path_next;\r
105         }\r
106 \r
107 \r
108         if (self.pathcurrent)\r
109         {\r
110             switch (self.waterlevel)\r
111             {\r
112             case 0:\r
113             case 1:\r
114             case 2:\r
115             case 3:\r
116             }\r
117 \r
118             self.moveto = self.pathcurrent.origin;\r
119             self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);\r
120 \r
121             self.frame += 1;\r
122             movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);\r
123 \r
124             return VS_CALL_YES_DOING;\r
125         }\r
126         else\r
127             return VS_CALL_YES_DONE;\r
128 \r
129     case VCM_REMOVE:\r
130 \r
131         if (self.pathcurrent)\r
132             pathlib_deletepath(self.pathcurrent.owner);\r
133 \r
134         self.pathcurrent = world;\r
135 \r
136         return VS_CALL_YES_DONE;\r
137     }\r
138 \r
139     return VS_CALL_YES_DONE;\r
140 }\r
141 \r
142 float ewheel_moveverb_enemy(float eval)\r
143 {\r
144     switch (eval)\r
145     {\r
146     case VCM_EVAL:\r
147         if (self.enemy)\r
148             return verb.verb_static_value;\r
149 \r
150         return VS_CALL_NO;\r
151 \r
152     case VCM_DO:\r
153 \r
154         self.moveto  = self.enemy.origin;\r
155         self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);\r
156 \r
157         if (self.tur_dist_enemy > self.target_range_optimal)\r
158         {\r
159             if ( self.tur_head.spawnshieldtime < 1 )\r
160             {\r
161                 self.frame += 2;\r
162                 movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);\r
163             }\r
164             else if (self.tur_head.spawnshieldtime < 2)\r
165             {\r
166                 self.frame += 1;\r
167                 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);\r
168             }\r
169             else\r
170             {\r
171                 self.frame += 1;\r
172                 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slower"),0.4);\r
173             }\r
174         }\r
175         else if (self.tur_dist_enemy < self.target_range_min)\r
176         {\r
177             self.frame -= 1;\r
178             movelib_move_simple(v_forward * -1,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);\r
179         }\r
180         else\r
181         {\r
182             movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));\r
183         }\r
184 \r
185         return VS_CALL_YES_DOING;\r
186     }\r
187 \r
188 \r
189     return VS_CALL_YES_DONE;\r
190 }\r
191 \r
192 float ewheel_moveverb_runaway(float eval)\r
193 {\r
194     switch (eval)\r
195     {\r
196     case VCM_EVAL:\r
197         if (self.enemy)\r
198             if (self.health < 50)\r
199                 return verb.verb_static_value;\r
200 \r
201         return VS_CALL_NO;\r
202 \r
203     case VCM_DO:\r
204         self.steerto = (steerlib_push(self.enemy.origin) * 0.7) + (steerlib_traceavoid_flat(0.3, 500, '0 0 128') * 0.3);\r
205         self.moveto  = self.origin + self.steerto * 1000;\r
206 \r
207         self.frame += 2;\r
208         movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);\r
209 \r
210         return VS_CALL_YES_DOING;\r
211 \r
212     }\r
213 \r
214     return VS_CALL_YES_DONE;\r
215 }\r
216 \r
217 float ewheel_moveverb_idle(float eval)\r
218 {\r
219     switch (eval)\r
220     {\r
221     case VCM_EVAL:\r
222         if (self.enemy)\r
223             return VS_CALL_NO;\r
224 \r
225         return verb.verb_static_value;\r
226 \r
227     case VCM_DO:\r
228         self.moveto = self.origin;\r
229 \r
230         if (vlen(self.velocity))\r
231             movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));\r
232 \r
233         return VS_CALL_YES_DOING;\r
234     }\r
235 \r
236     return VS_CALL_YES_DONE;\r
237 }\r
238 \r
239 void ewheel_postthink()\r
240 {\r
241     float vz;\r
242     vector wish_angle,real_angle;\r
243 \r
244     vz = self.velocity_z;\r
245 \r
246     self.angles_x = anglemods(self.angles_x);\r
247     self.angles_y = anglemods(self.angles_y);\r
248 \r
249     self.angles_x *= -1;\r
250     makevectors(self.angles);\r
251     self.angles_x *= -1;\r
252 \r
253     wish_angle = normalize(self.steerto);\r
254     wish_angle = vectoangles(wish_angle);\r
255     real_angle = wish_angle - self.angles;\r
256     real_angle = shortangle_vxy(real_angle,self.tur_head.angles);\r
257 \r
258     self.tur_head.spawnshieldtime = fabs(real_angle_y);\r
259     real_angle_y  = bound(self.tur_head.aim_speed * -1,real_angle_y,self.tur_head.aim_speed);\r
260     self.angles_y = (self.angles_y + real_angle_y);\r
261 \r
262     // Simulate banking\r
263     self.angles_z = bound(-45,real_angle_y * -2.5,45);\r
264 \r
265     verbstack_pop(self.verbs_move);\r
266 \r
267     if (self.frame > 40)\r
268         self.frame = 1;\r
269 \r
270     if (self.frame < 1)\r
271         self.frame = 40;\r
272 \r
273 \r
274     self.velocity_z = vz;\r
275 }\r
276 \r
277 void ewheel_respawnhook()\r
278 {\r
279     entity e;\r
280 \r
281     setorigin(self,self.pos1);\r
282 \r
283     if (self.target != "")\r
284     {\r
285         e = find(world,targetname,self.target);\r
286         if (!e)\r
287         {\r
288             dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");\r
289             self.target = "";\r
290         }\r
291 \r
292         if (e.classname != "turret_checkpoint")\r
293             dprint("Warning: not a turrret path\n");\r
294         else\r
295         {\r
296             self.pathcurrent = WALKER_PATH(self.origin,e.origin);\r
297             self.pathgoal = e;\r
298         }\r
299     }\r
300 }\r
301 \r
302 void ewheel_diehook()\r
303 {\r
304     turret_trowgib2(self.origin,self.velocity + v_up * 400,'-0.6 -0.2 -02',self,time + random() * 2 +3);\r
305 \r
306     if (self.pathcurrent)\r
307         pathlib_deletepath(self.pathcurrent.owner);\r
308 \r
309     self.pathcurrent = world;\r
310 \r
311     if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)\r
312     {\r
313         verbstack_flush(self.verbs_move);\r
314         remove(self.verbs_move);\r
315     }\r
316 \r
317 }\r
318 \r
319 void turret_ewheel_dinit()\r
320 {\r
321     entity e;\r
322 \r
323     if (self.netname == "")      self.netname     = "eWheel Turret";\r
324 \r
325     if (self.target != "")\r
326     {\r
327         e = find(world,targetname,self.target);\r
328         if (!e)\r
329         {\r
330             bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");\r
331             self.target = "";\r
332         }\r
333 \r
334         if (e.classname != "turret_checkpoint")\r
335             dprint("Warning: not a turrret path\n");\r
336         else\r
337             self.goalcurrent = e;\r
338     }\r
339 \r
340     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;\r
341     self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_HEADATTACHED;\r
342     //self.aim_flags = TFL_AIM_SIMPLE;// TFL_AIM_LEAD | TFL_AIM_ZEASE;\r
343 \r
344     self.turret_respawnhook = ewheel_respawnhook;\r
345     self.turret_diehook = ewheel_diehook;\r
346 \r
347     if (turret_stdproc_init("ewheel_std") == 0)\r
348     {\r
349         remove(self);\r
350         return;\r
351     }\r
352 \r
353     self.target_select_flags   = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;\r
354     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;\r
355     self.damage_flags          |= TFL_DMG_DEATH_NOGIBS;\r
356 \r
357     self.iscreature = TRUE;\r
358     self.movetype   = MOVETYPE_WALK;\r
359     self.solid      = SOLID_SLIDEBOX;\r
360     self.takedamage = DAMAGE_AIM;\r
361 \r
362     setmodel(self,"models/turrets/ewheel-base.md3");\r
363     setmodel(self.tur_head,"models/turrets/ewheel-gun1.md3");\r
364     setattachment(self.tur_head,self,"tag_head");\r
365 \r
366     self.pos1 = self.origin;\r
367 \r
368     self.idle_aim = '0 0 0';\r
369 \r
370     // Our fire routine\r
371     self.turret_firefunc  = ewheel_attack;\r
372     self.turret_postthink = ewheel_postthink;\r
373     self.tur_head.frame = 1;\r
374 \r
375     self.verbs_move = spawn();\r
376     verbstack_push(self.verbs_move, ewheel_moveverb_idle,   WVM_IDLE,  0);\r
377     verbstack_push(self.verbs_move, ewheel_moveverb_enemy,  WVM_ENEMY, 0);\r
378     verbstack_push(self.verbs_move, ewheel_moveverb_path,   WVM_PATH,  0);\r
379     verbstack_push(self.verbs_move, ewheel_moveverb_runaway,WVM_PANIC,  0);\r
380 \r
381     // Convert from dgr / sec to dgr / tic\r
382     self.tur_head.aim_speed = cvar("g_turrets_unit_ewheel_turnrate");\r
383     self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);\r
384 \r
385     if (self.target != "")\r
386     {\r
387         e = find(world,targetname,self.target);\r
388         if (!e)\r
389         {\r
390             dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");\r
391             self.target = "";\r
392         }\r
393 \r
394         if (e.classname != "turret_checkpoint")\r
395             dprint("Warning: not a turrret path\n");\r
396         else\r
397         {\r
398             self.pathcurrent = WALKER_PATH(self.origin,e.origin);\r
399             self.pathgoal = e;\r
400         }\r
401     }\r
402 }\r
403 \r
404 void spawnfunc_turret_ewheel()\r
405 {\r
406     precache_model ("models/turrets/ewheel-base.md3");\r
407     precache_model ("models/turrets/ewheel-gun1.md3");\r
408 \r
409     self.think = turret_ewheel_dinit;\r
410     self.nextthink = time + 0.5;\r
411 }\r