]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_ewheel.qc
make verb owner a param of verbstack_push.
[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_roam(float eval)\r
65 {\r
66     switch (eval)\r
67     {\r
68     case VCM_EVAL:\r
69 \r
70         if (!self.enemy)\r
71             return verb.verb_static_value;\r
72 \r
73         return VS_CALL_NO;\r
74 \r
75     case VCM_DO:\r
76         self.angles_z = 0;\r
77         makevectors(self.angles);\r
78         self.moveto = v_forward * 128;\r
79         self.steerto = steerlib_beamsteer(v_forward,1024,32,36,128);\r
80         self.frame += 1;\r
81         movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);\r
82 \r
83         return VS_CALL_YES_DOING;\r
84 \r
85     case VCM_REMOVE:\r
86 \r
87     }\r
88 \r
89     return VS_CALL_YES_DONE;\r
90 }\r
91 \r
92 float ewheel_moveverb_path(float eval)\r
93 {\r
94     switch (eval)\r
95     {\r
96     case VCM_EVAL:\r
97 \r
98         if (self.pathcurrent)\r
99             return verb.verb_static_value;\r
100 \r
101         return VS_CALL_NO;\r
102 \r
103     case VCM_DO:\r
104         // Do we have a path?\r
105         if not(self.pathcurrent)\r
106             return VS_CALL_NO;\r
107         else\r
108         {\r
109             // Are we close enougth to a path node to switch to the next?\r
110             if (vlen(self.origin  - self.pathcurrent.origin) < 64)\r
111                 if (self.pathcurrent.path_next == world)\r
112                 {\r
113                     // Path endpoint reached\r
114                     pathlib_deletepath(self.pathcurrent.owner);\r
115                     self.pathcurrent = world;\r
116 \r
117                     if (self.pathgoal)\r
118                     {\r
119                         if (self.pathgoal.use)\r
120                             self.pathgoal.use();\r
121 \r
122                         if (self.pathgoal.enemy)\r
123                         {\r
124                             self.pathcurrent = pathlib_astar(self.pathgoal.origin,self.pathgoal.enemy.origin);\r
125                             self.pathgoal = self.pathgoal.enemy;\r
126                         }\r
127                     }\r
128                     else\r
129                         self.pathgoal = world;\r
130                 }\r
131                 else\r
132                     self.pathcurrent = self.pathcurrent.path_next;\r
133         }\r
134 \r
135 \r
136         if (self.pathcurrent)\r
137         {\r
138             switch (self.waterlevel)\r
139             {\r
140             case 0:\r
141             case 1:\r
142             case 2:\r
143             case 3:\r
144             }\r
145 \r
146             self.moveto = self.pathcurrent.origin;\r
147             self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);\r
148 \r
149             self.frame += 1;\r
150             movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);\r
151 \r
152             return VS_CALL_YES_DOING;\r
153         }\r
154         else\r
155             return VS_CALL_YES_DONE;\r
156 \r
157     case VCM_REMOVE:\r
158 \r
159         if (self.pathcurrent)\r
160             pathlib_deletepath(self.pathcurrent.owner);\r
161 \r
162         self.pathcurrent = world;\r
163 \r
164         return VS_CALL_YES_DONE;\r
165     }\r
166 \r
167     return VS_CALL_YES_DONE;\r
168 }\r
169 \r
170 float ewheel_moveverb_enemy(float eval)\r
171 {\r
172     switch (eval)\r
173     {\r
174     case VCM_EVAL:\r
175         if (self.enemy)\r
176         {\r
177             if (self.spawnflags & TSF_NO_PATHBREAK)\r
178                 if (self.pathcurrent)\r
179                     return VS_CALL_NO;\r
180 \r
181             return verb.verb_static_value;\r
182         }\r
183 \r
184         return VS_CALL_NO;\r
185 \r
186     case VCM_DO:\r
187 \r
188         self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);\r
189         self.steerto = steerlib_beamsteer(self.steerto,1024,64,68,256);\r
190         self.moveto  = self.origin + self.steerto * 128;\r
191 \r
192         makevectors(self.angles);\r
193 \r
194         if (self.tur_dist_enemy > self.target_range_optimal)\r
195         {\r
196             if ( self.tur_head.spawnshieldtime < 1 )\r
197             {\r
198                 self.frame += 2;\r
199                 movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);\r
200             }\r
201             else if (self.tur_head.spawnshieldtime < 2)\r
202             {\r
203 \r
204                 self.frame += 1;\r
205                 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);\r
206            }\r
207             else\r
208             {\r
209                 self.frame += 1;\r
210                 movelib_move_simple(v_forward,cvar("g_turrets_unit_ewheel_speed_slower"),0.4);\r
211             }\r
212         }\r
213         else if (self.tur_dist_enemy < self.target_range_min)\r
214         {\r
215             self.frame -= 1;\r
216             movelib_move_simple(v_forward * -1,cvar("g_turrets_unit_ewheel_speed_slow"),0.4);\r
217         }\r
218         else\r
219         {\r
220             movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));\r
221         }\r
222 \r
223         return VS_CALL_YES_DOING;\r
224     }\r
225 \r
226 \r
227     return VS_CALL_YES_DONE;\r
228 }\r
229 \r
230 float ewheel_moveverb_runaway(float eval)\r
231 {\r
232     switch (eval)\r
233     {\r
234     case VCM_EVAL:\r
235         if (self.spawnflags & TSF_NO_PATHBREAK)\r
236             if (self.pathcurrent)\r
237                 return VS_CALL_NO;\r
238 \r
239         if (self.enemy)\r
240             if (self.health < 50)\r
241                 return verb.verb_static_value;\r
242 \r
243         return VS_CALL_NO;\r
244 \r
245     case VCM_DO:\r
246         self.steerto = (steerlib_push(self.enemy.origin) * 0.7) + (steerlib_traceavoid_flat(0.3, 500, '0 0 128') * 0.3);\r
247         self.moveto  = self.origin + self.steerto * 1000;\r
248 \r
249         self.frame += 2;\r
250         movelib_move_simple(v_forward ,cvar("g_turrets_unit_ewheel_speed_fast"),0.4);\r
251 \r
252         return VS_CALL_YES_DOING;\r
253 \r
254     }\r
255 \r
256     return VS_CALL_YES_DONE;\r
257 }\r
258 \r
259 float ewheel_moveverb_idle(float eval)\r
260 {\r
261     switch (eval)\r
262     {\r
263     case VCM_EVAL:\r
264         if (self.enemy)\r
265             return VS_CALL_NO;\r
266 \r
267         return verb.verb_static_value;\r
268 \r
269     case VCM_DO:\r
270         self.moveto = self.origin;\r
271 \r
272         if (vlen(self.velocity))\r
273             movelib_beak_simple(cvar("g_turrets_unit_ewheel_speed_stop"));\r
274 \r
275         return VS_CALL_YES_DOING;\r
276     }\r
277 \r
278     return VS_CALL_YES_DONE;\r
279 }\r
280 \r
281 void ewheel_postthink()\r
282 {\r
283     float vz;\r
284     vector wish_angle,real_angle;\r
285 \r
286     vz = self.velocity_z;\r
287 \r
288     self.angles_x = anglemods(self.angles_x);\r
289     self.angles_y = anglemods(self.angles_y);\r
290 \r
291     self.angles_x *= -1;\r
292     makevectors(self.angles);\r
293     self.angles_x *= -1;\r
294 \r
295     wish_angle = normalize(self.steerto);\r
296     wish_angle = vectoangles(wish_angle);\r
297     real_angle = wish_angle - self.angles;\r
298     real_angle = shortangle_vxy(real_angle,self.tur_head.angles);\r
299 \r
300     self.tur_head.spawnshieldtime = fabs(real_angle_y);\r
301     real_angle_y  = bound(-self.tur_head.aim_speed,real_angle_y,self.tur_head.aim_speed);\r
302     self.angles_y = (self.angles_y + real_angle_y);\r
303 \r
304     // Simulate banking\r
305     self.angles_z = bound(-45,real_angle_y * -2.5,45);\r
306 \r
307     verbstack_pop(self.verbs_move);\r
308 \r
309     if (self.frame > 40)\r
310         self.frame = 1;\r
311 \r
312     if (self.frame < 1)\r
313         self.frame = 40;\r
314 \r
315 \r
316     self.velocity_z = vz;\r
317 }\r
318 \r
319 void ewheel_respawnhook()\r
320 {\r
321     entity e;\r
322 \r
323     setorigin(self,self.pos1);\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             dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\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         {\r
338             self.pathcurrent = WALKER_PATH(self.origin,e.origin);\r
339             self.pathgoal = e;\r
340         }\r
341     }\r
342 }\r
343 \r
344 void ewheel_diehook()\r
345 {\r
346     turret_trowgib2(self.origin,self.velocity + v_up * 400,'-0.6 -0.2 -02',self,time + random() * 2 +3);\r
347 \r
348     if (self.pathcurrent)\r
349         pathlib_deletepath(self.pathcurrent.owner);\r
350 \r
351     self.pathcurrent = world;\r
352 \r
353     if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)\r
354     {\r
355         verbstack_flush(self.verbs_move);\r
356         remove(self.verbs_move);\r
357     }\r
358 \r
359 }\r
360 \r
361 /*\r
362 float test_stack_1(float eval)\r
363 {\r
364     switch (eval)\r
365     {\r
366     case VCM_EVAL:\r
367         return verb.verb_static_value;\r
368 \r
369     case VCM_DO:\r
370         dprint("test_stack_1\n");\r
371         return VS_CALL_REMOVE;\r
372     }\r
373 \r
374     return VS_CALL_REMOVE;\r
375 }\r
376 \r
377 float test_stack_2(float eval)\r
378 {\r
379     switch (eval)\r
380     {\r
381     case VCM_EVAL:\r
382         return verb.verb_static_value;\r
383 \r
384     case VCM_DO:\r
385         dprint("test_stack_2\n");\r
386         return VS_CALL_REMOVE;\r
387     }\r
388 \r
389     return VS_CALL_REMOVE;\r
390 }\r
391 \r
392 float ccnntt;\r
393 float test_stack_3(float eval)\r
394 {\r
395     switch (eval)\r
396     {\r
397     case VCM_EVAL:\r
398         return verb.verb_static_value;\r
399 \r
400     case VCM_DO:\r
401         dprint("test_stack_3\n");\r
402         ++ccnntt;\r
403         if(ccnntt > 3)\r
404             return VS_CALL_REMOVE;\r
405         else\r
406             return VS_CALL_YES_DONE;\r
407     }\r
408 \r
409     return VS_CALL_YES_DONE;\r
410 }\r
411 \r
412 .entity test_stack;\r
413 */\r
414 void turret_ewheel_dinit()\r
415 {\r
416     entity e;\r
417 \r
418     if (self.netname == "")      self.netname     = "eWheel Turret";\r
419 \r
420     if (self.target != "")\r
421     {\r
422         e = find(world,targetname,self.target);\r
423         if (!e)\r
424         {\r
425             bprint("Warning! initital waypoint for ewheel does NOT exsist!\n");\r
426             self.target = "";\r
427         }\r
428 \r
429         if (e.classname != "turret_checkpoint")\r
430             dprint("Warning: not a turrret path\n");\r
431         else\r
432             self.goalcurrent = e;\r
433     }\r
434 \r
435     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;\r
436     self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_HEADATTACHED;\r
437     //self.aim_flags = TFL_AIM_SIMPLE;// TFL_AIM_LEAD | TFL_AIM_ZEASE;\r
438 \r
439     self.turret_respawnhook = ewheel_respawnhook;\r
440     self.turret_diehook = ewheel_diehook;\r
441 \r
442     if (turret_stdproc_init("ewheel_std") == 0)\r
443     {\r
444         remove(self);\r
445         return;\r
446     }\r
447 \r
448     self.target_select_flags   = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;\r
449     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;\r
450     self.damage_flags          |= TFL_DMG_DEATH_NOGIBS;\r
451 \r
452     self.iscreature = TRUE;\r
453     self.movetype   = MOVETYPE_WALK;\r
454     self.solid      = SOLID_SLIDEBOX;\r
455     self.takedamage = DAMAGE_AIM;\r
456 \r
457     setmodel(self,"models/turrets/ewheel-base.md3");\r
458     setmodel(self.tur_head,"models/turrets/ewheel-gun1.md3");\r
459     setattachment(self.tur_head,self,"tag_head");\r
460 \r
461     self.pos1 = self.origin;\r
462 \r
463     self.idle_aim = '0 0 0';\r
464 \r
465     // Our fire routine\r
466     self.turret_firefunc  = ewheel_attack;\r
467     self.turret_postthink = ewheel_postthink;\r
468     self.tur_head.frame = 1;\r
469 \r
470     self.verbs_move = spawn();\r
471 \r
472     //verbstack_push(self.verbs_move, ewheel_moveverb_roam,   WVM_IDLE,  0, self);\r
473     verbstack_push(self.verbs_move, ewheel_moveverb_idle,   WVM_IDLE,  0, self);\r
474     verbstack_push(self.verbs_move, ewheel_moveverb_enemy,  WVM_ENEMY, 0, self);\r
475     verbstack_push(self.verbs_move, ewheel_moveverb_path,   WVM_PATH,  0, self);\r
476     //verbstack_push(self.verbs_move, ewheel_moveverb_runaway,WVM_PANIC,  0, self);\r
477 \r
478     /*\r
479     self.test_stack = spawn();\r
480     verbstack_push(self.test_stack, test_stack_1,1,  0, self);\r
481     verbstack_push(self.test_stack, test_stack_2,2,  0, self);\r
482     verbstack_push(self.test_stack, test_stack_3,100,0, self);\r
483     while(verbstack_popfifo(self.test_stack) != 0)\r
484     */\r
485 \r
486 \r
487 \r
488     // Convert from dgr / sec to dgr / tic\r
489     self.tur_head.aim_speed = cvar("g_turrets_unit_ewheel_turnrate");\r
490     self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);\r
491 \r
492     if (self.target != "")\r
493     {\r
494         e = find(world,targetname,self.target);\r
495         if (!e)\r
496         {\r
497             dprint("Initital waypoint for ewheel does NOT exsist, fix your map!\n");\r
498             self.target = "";\r
499         }\r
500 \r
501         if (e.classname != "turret_checkpoint")\r
502             dprint("Warning: not a turrret path\n");\r
503         else\r
504         {\r
505             self.pathcurrent = WALKER_PATH(self.origin,e.origin);\r
506             self.pathgoal = e;\r
507         }\r
508     }\r
509 }\r
510 \r
511 void spawnfunc_turret_ewheel()\r
512 {\r
513     g_turrets_common_precash();\r
514 \r
515     precache_model ("models/turrets/ewheel-base.md3");\r
516     precache_model ("models/turrets/ewheel-gun1.md3");\r
517 \r
518     self.think = turret_ewheel_dinit;\r
519     self.nextthink = time + 0.5;\r
520 }\r