]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_walker.qc
Make all turrets use csqc projectiles
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / units / unit_walker.qc
1 //#define rocket_rack tur_head.enemy\r
2 \r
3 #define ANIM_NO 0\r
4 #define ANIM_WALK 1\r
5 #define ANIM_RUN 1.1\r
6 #define ANIM_STRAFE_L 2\r
7 #define ANIM_STRAFE_R 3\r
8 #define ANIM_TURN 2\r
9 #define ANIM_JUMP 4\r
10 #define ANIM_LAND 5\r
11 #define ANIM_PAIN 6\r
12 #define ANIM_MEELE 7\r
13 \r
14 .float animflag;\r
15 \r
16 .entity wkr_props;\r
17 .entity wkr_spawn;\r
18 \r
19 #define WALKER_MIN '-70 -70 5'\r
20 #define WALKER_MAX '70 70 70'\r
21 \r
22 /*\r
23 .entity goalcurrent, goalstack01, goalstack02, goalstack03;\r
24 .entity goalstack04, goalstack05, goalstack06, goalstack07;\r
25 .entity goalstack08, goalstack09, goalstack10, goalstack11;\r
26 .entity goalstack12, goalstack13, goalstack14, goalstack15;\r
27 .entity goalstack16, goalstack17, goalstack18, goalstack19;\r
28 .entity goalstack20, goalstack21, goalstack22, goalstack23;\r
29 .entity goalstack24, goalstack25, goalstack26, goalstack27;\r
30 .entity goalstack28, goalstack29, goalstack30, goalstack31;\r
31 */\r
32 \r
33 \r
34 float walker_firecheck()\r
35 {\r
36     return turret_stdproc_firecheck();\r
37 }\r
38 \r
39 void walker_meele_do_dmg()\r
40 {\r
41     vector where;\r
42     entity e;\r
43     makevectors(self.angles);\r
44     where = self.origin + v_forward * 128;\r
45 \r
46     e = findradius(where,128);\r
47     while (e)\r
48     {\r
49         if (turret_validate_target(self,e,self.target_validate_flags))\r
50             if (e != self)\r
51                 Damage(e,self,self,cvar("g_turrets_unit_walker_std_meele_dmg"),DEATH_TURRET,'0 0 0', v_forward * cvar("g_turrets_unit_walker_std_meele_force") );\r
52 \r
53         e = e.chain;\r
54     }\r
55 }\r
56 \r
57 void walker_animate()\r
58 {\r
59 \r
60     switch (self.animflag)\r
61     {\r
62     case ANIM_NO:\r
63         if(self.frame != 0)\r
64             self.frame = 0;\r
65         break;\r
66 \r
67     case ANIM_WALK:\r
68         self.frame = self.frame + 1;\r
69         if (self.frame > 25)\r
70             self.frame = 5;\r
71         break;\r
72 \r
73     case ANIM_RUN:\r
74 \r
75         self.frame = self.frame + 2;\r
76         if (self.frame > 25)\r
77             self.frame = 5;\r
78         break;\r
79 \r
80     case ANIM_STRAFE_L:\r
81         if (self.frame < 35) self.frame = 35;\r
82         self.frame = self.frame + 1;\r
83         if (self.frame > 55) self.frame = 35;\r
84         break;\r
85 \r
86     case ANIM_STRAFE_R:\r
87         if (self.frame < 65) self.frame = 65;\r
88         self.frame = self.frame + 1;\r
89         if (self.frame > 85) self.frame = 65;\r
90         break;\r
91 \r
92     case ANIM_JUMP:\r
93         if (self.frame < 95) self.frame = 95;\r
94         if (self.frame > 100)\r
95             self.frame = self.frame + 1;\r
96 \r
97         break;\r
98 \r
99     case ANIM_LAND:\r
100         if (self.frame < 100) self.frame = 100;\r
101         self.frame = self.frame + 1;\r
102         if (self.frame > 107)\r
103             self.animflag = ANIM_NO;\r
104         break;\r
105 \r
106     case ANIM_PAIN:\r
107         if (self.frame < 60) self.frame = 90;\r
108         self.frame = self.frame + 1;\r
109         if (self.frame > 95)\r
110             self.animflag = ANIM_NO;\r
111         break;\r
112 \r
113     case ANIM_MEELE:\r
114         if (self.frame < 123) self.frame = 123;\r
115         self.frame = self.frame + 1;\r
116 \r
117         if (self.frame == 133)\r
118             walker_meele_do_dmg();\r
119 \r
120         if (self.frame > 140)\r
121             self.animflag = ANIM_NO;\r
122 \r
123     }\r
124 }\r
125 \r
126 \r
127 void walker_rocket_explode()\r
128 {\r
129     vector org2;\r
130 \r
131     if(self.event_damage != SUB_Null)\r
132     {\r
133         self.event_damage = SUB_Null;\r
134         self.think = walker_rocket_explode;\r
135         self.nextthink = time;\r
136         return;\r
137     }\r
138 \r
139     sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);\r
140     org2 = findbetterlocation (self.origin, 16);\r
141 \r
142     pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);\r
143 \r
144     RadiusDamage (self, self.owner, cvar("g_turrets_unit_walker_std_rocket_dmg"), 0, cvar("g_turrets_unit_walker_std_rocket_radius"), world, cvar("g_turrets_unit_walker_std_rocket_force"), DEATH_TURRET, world);\r
145 \r
146     remove (self);\r
147 }\r
148 \r
149 void walker_rocket_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)\r
150 {\r
151     self.health = self.health - damage;\r
152     self.velocity = self.velocity + vforce;\r
153     if (self.health <= 0)\r
154         walker_rocket_explode();\r
155 }\r
156 \r
157 //#define WALKER_ROCKET_MOVE movelib_move(newdir * 275,900,0.1,10)\r
158 #define WALKER_ROCKET_MOVE movelib_move_simple(newdir,1000,cvar("g_turrets_unit_walker_std_rocket_tunrate")); UpdateCSQCProjectile(self)\r
159 void walker_rocket_loop();\r
160 void walker_rocket_think()\r
161 {\r
162     vector newdir;\r
163     float edist;\r
164     float itime;\r
165     float m_speed;\r
166 \r
167     self.nextthink = time;\r
168 \r
169     edist = vlen(self.enemy.origin - self.origin);\r
170 \r
171     // Simulate crude guidance\r
172     if (self.cnt < time)\r
173     {\r
174         if (edist < 1000)\r
175             self.tur_shotorg = randomvec() * min(edist,64);\r
176         else\r
177             self.tur_shotorg = randomvec() * min(edist,256);\r
178 \r
179         self.cnt = time + 0.5;\r
180     }\r
181 \r
182     if (edist < 256)\r
183         self.tur_shotorg = '0 0 0';\r
184 \r
185 \r
186     if (self.tur_health < time)\r
187     {\r
188         self.think = walker_rocket_explode;\r
189         self.nextthink = time;\r
190         return;\r
191     }\r
192 \r
193     if (self.shot_dmg != 1337)\r
194     if (random() < 0.01)\r
195     {\r
196         walker_rocket_loop();\r
197         return;\r
198     }\r
199 \r
200     m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");\r
201 \r
202     // Enemy dead? just keep on the current heading then.\r
203     if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))\r
204     {\r
205 \r
206         // Make sure we dont return to tracking a respawned player\r
207         self.enemy = world;\r
208 \r
209         // Turn model\r
210         self.angles = vectoangles(self.velocity);\r
211     }\r
212 \r
213     if (self.enemy)\r
214     {\r
215         itime = max(edist / m_speed,1);\r
216         newdir = steerlib_pull(self.enemy.origin + self.tur_shotorg);\r
217     }\r
218     else\r
219     {\r
220         newdir  = normalize(self.velocity);\r
221     }\r
222 \r
223     // Turn model\r
224     self.angles = vectoangles(self.velocity);\r
225 \r
226 \r
227     WALKER_ROCKET_MOVE;\r
228     //UpdateCSQCProjectile(self);\r
229 }\r
230 \r
231 void walker_rocket_loop3()\r
232 {\r
233     vector newdir;\r
234     self.nextthink = time;\r
235 \r
236     if (self.tur_health < time)\r
237     {\r
238         self.think = walker_rocket_explode;\r
239         return;\r
240     }\r
241 \r
242     if (vlen(self.origin - self.tur_shotorg) < 128 )\r
243     {\r
244         self.think = walker_rocket_think;\r
245         return;\r
246     }\r
247 \r
248 \r
249     newdir = steerlib_pull(self.tur_shotorg);\r
250     WALKER_ROCKET_MOVE;\r
251 \r
252     self.angles = vectoangles(self.velocity);\r
253 }\r
254 \r
255 void walker_rocket_loop2()\r
256 {\r
257     vector newdir;\r
258 \r
259     self.nextthink = time;\r
260 \r
261     if (self.tur_health < time)\r
262     {\r
263         self.think = walker_rocket_explode;\r
264         return;\r
265     }\r
266 \r
267     if (vlen(self.origin - self.tur_shotorg) < 128 )\r
268     {\r
269         self.tur_shotorg = self.origin - '0 0 200';\r
270         self.think = walker_rocket_loop3;\r
271         return;\r
272     }\r
273 \r
274     self.angles = vectoangles(self.velocity);\r
275     newdir = steerlib_pull(self.tur_shotorg);\r
276     WALKER_ROCKET_MOVE;\r
277 }\r
278 \r
279 void walker_rocket_loop()\r
280 {\r
281     self.nextthink = time;\r
282     self.tur_shotorg = self.origin + '0 0 400';\r
283     self.think = walker_rocket_loop2;\r
284     self.shot_dmg = 1337;\r
285 }\r
286 \r
287 void walker_fire_rocket(vector org)\r
288 {\r
289 \r
290     entity rocket;\r
291 \r
292 \r
293     //self.angles_x *= -1;\r
294     makevectors(self.angles);\r
295     //self.angles_x *= -1;\r
296 \r
297     te_explosion (org);\r
298 \r
299     rocket = spawn ();\r
300     setorigin(rocket, org);\r
301 \r
302     sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);\r
303     setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot\r
304 \r
305     rocket.classname          = "walker_rocket";\r
306     rocket.owner              = self;\r
307 \r
308     rocket.bot_dodge          = TRUE;\r
309     rocket.bot_dodgerating    = 50;\r
310 \r
311     rocket.takedamage         = DAMAGE_YES;\r
312 \r
313     rocket.damageforcescale   = 2;\r
314     rocket.health             = 25;\r
315     rocket.tur_shotorg        = randomvec() * 512;\r
316     rocket.cnt                = time + 1;\r
317     rocket.enemy              = self.enemy;\r
318 \r
319     if (random() < 0.01)\r
320         rocket.think          = walker_rocket_loop;\r
321     else\r
322         rocket.think          = walker_rocket_think;\r
323 \r
324     rocket.event_damage       = walker_rocket_damage;\r
325 \r
326     rocket.nextthink          = time;// + 0.25;\r
327     rocket.movetype           = MOVETYPE_FLY;\r
328     rocket.velocity           = normalize((v_forward + v_up * 0.25) + (randomvec() * 0.1)) * cvar("g_turrets_unit_walker_std_rocket_speed");\r
329     rocket.angles             = vectoangles(rocket.velocity);\r
330     rocket.touch              = walker_rocket_explode;\r
331     rocket.flags              = FL_PROJECTILE;\r
332     rocket.solid              = SOLID_BBOX;\r
333     rocket.tur_health         = time + 9;\r
334 \r
335         CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound\r
336 }\r
337 \r
338 /*\r
339 #define s_turn 10\r
340 #define s_walk 100\r
341 #define s_run 300\r
342 #define s_accel1 8\r
343 #define s_accel2 16\r
344 #define s_decel 8\r
345 */\r
346 \r
347 void rv_think()\r
348 {\r
349     float f;\r
350     vector org;\r
351     entity oldself;\r
352 \r
353     if(self.owner.deadflag != DEAD_NO)\r
354     {\r
355         remove(self);\r
356         return;\r
357     }\r
358 \r
359     self.cnt = self.cnt -1;\r
360 \r
361     if (self.cnt < 0)\r
362     {\r
363         remove(self);\r
364         return;\r
365     }\r
366 \r
367     if (self.cnt > 1)\r
368         f = gettagindex(self.owner,"tag_rocket01");\r
369     else\r
370         f = gettagindex(self.owner,"tag_rocket02");\r
371 \r
372     org = self.owner.origin + gettaginfo(self.owner,f);\r
373 \r
374     self.nextthink = time + 0.2;\r
375     oldself = self;\r
376     self = self.owner;\r
377     walker_fire_rocket(org);\r
378     self = oldself;\r
379 }\r
380 \r
381 /*\r
382 void acb_run()\r
383 {\r
384     //bprint("run\n");\r
385     animation_set(self,5,25,40,AF_ENDCALLBACK,5);\r
386 }\r
387 void acb_walk()\r
388 {\r
389     bprint("walk\n");\r
390     animation_set(self,5,25,20,AF_ENDCALLBACK,5);\r
391 }\r
392 void acb_meele()\r
393 {\r
394     walker_do_meele();\r
395 }\r
396 \r
397 void set_acb(void() acb_func)\r
398 {\r
399     self.animator_callback = acb_func;\r
400     if(animation_query(self) != AS_RUNNING)\r
401     {\r
402         bprint("Not running\n");\r
403         acb_func();\r
404     }\r
405     else\r
406     {\r
407         if not(self.animator.anim_flags & AF_ENDCALLBACK)\r
408             self.animator.anim_flags = self.animator.anim_flags | AF_ENDCALLBACK;\r
409     }\r
410 }\r
411 */\r
412 \r
413 void walker_postthink()\r
414 {\r
415     vector wish_angle;\r
416     vector real_angle;\r
417     vector steer;\r
418     float vel;\r
419 \r
420     //if (self.flags & FL_ONGROUND)\r
421     //if (self.animflag != ANIM_MEELE)\r
422     //    self.animflag = ANIM_NO;\r
423 \r
424     if (self.tur_head.attack_finished_single < time)\r
425     if (self.enemy)\r
426     {\r
427         entity rv;\r
428 \r
429         rv = spawn();\r
430         rv.think = rv_think;\r
431         rv.nextthink = time;\r
432         rv.cnt = 4;\r
433         rv.owner = self;\r
434 \r
435         self.tur_head.attack_finished_single = time + cvar("g_turrets_unit_walker_std_rocket_refire");\r
436     }\r
437 \r
438     // Do we have a path?\r
439     if (self.pathcurrent)\r
440     {\r
441         //set_acb(acb_walk);\r
442         self.animflag = ANIM_WALK;\r
443 \r
444         // Are we close enougth to a path node to switch to the next?\r
445         if (vlen(self.origin  - self.pathcurrent.origin) < 64)\r
446             if (self.pathcurrent.path_next == world)\r
447             {\r
448                 // Path endpoint reached\r
449                 pathlib_deletepath(self.pathcurrent.owner);\r
450                 self.pathcurrent = world;\r
451 \r
452                 if(self.pathgoal)\r
453                 {\r
454                     if(self.pathgoal.use)\r
455                         self.pathgoal.use();\r
456 \r
457                     if(self.pathgoal.enemy)\r
458                     {\r
459                         self.pathcurrent = pathlib_makepath(self.pathgoal.origin,self.pathgoal.enemy.origin,PFL_GROUNDSNAP,1500,2,PT_QUICKBOX);\r
460                         self.pathgoal = self.pathgoal.enemy;\r
461                     }\r
462                 }\r
463                 else\r
464                     self.pathgoal = world;\r
465             }\r
466             else\r
467                 self.pathcurrent = self.pathcurrent.path_next;\r
468 \r
469         steer = steerlib_attract2(self.pathcurrent.origin,0.5,2000,0.95);\r
470         vel = 150;\r
471     }\r
472     else // Roaming mode\r
473     {\r
474         if (self.enemy)\r
475         {\r
476             wish_angle = angleofs(self,self.enemy);\r
477             steer = steerlib_pull(self.enemy.origin);\r
478 \r
479             if (self.tur_dist_aimpos < cvar("g_turrets_unit_walker_std_meele_range"))\r
480             {\r
481                 if (fabs(wish_angle_y) < 15)\r
482                 {\r
483                     vel = 0;\r
484                     //set_acb(acb_meele);\r
485                     //walker_do_meele();\r
486                     self.animflag = ANIM_MEELE;\r
487                     return;\r
488                 }\r
489             }\r
490             else\r
491             {\r
492                 if (fabs(wish_angle_y) < 15)\r
493                 {\r
494                     //set_acb(acb_run);\r
495                     self.animflag = ANIM_RUN;\r
496                     vel = 300;\r
497                 }\r
498                 else if (fabs(wish_angle_y) < 30)\r
499                 {\r
500                     //set_acb(acb_walk);\r
501                     self.animflag = ANIM_WALK;\r
502                     vel = 150;\r
503                 }\r
504                 else\r
505                 {\r
506                     //set_acb(acb_walk);\r
507                     self.animflag = ANIM_WALK;\r
508                     vel = 50;\r
509                 }\r
510             }\r
511         }\r
512         else\r
513         {\r
514             vel = 0;\r
515 \r
516             if(self.animflag != ANIM_MEELE)\r
517                 self.animflag = ANIM_NO;\r
518         }\r
519     }\r
520 \r
521     // Align the walker to the ground\r
522 \r
523     self.angles_x = self.angles_x  * -1;\r
524     makevectors(self.angles);\r
525     self.angles_x = self.angles_x  * -1;\r
526 \r
527     traceline(self.origin + '0 0 15', self.origin - '0 0 150' ,MOVE_WORLDONLY,self);\r
528     wish_angle = (trace_endpos);\r
529     traceline(self.origin  + v_forward * 10 + '0 0 15', self.origin + v_forward * 10 - '0 0 150' ,MOVE_WORLDONLY,self);\r
530     real_angle = vectoangles(normalize( trace_endpos - wish_angle));\r
531 \r
532     self.angles_x = real_angle_x;\r
533     self.angles_z = real_angle_z;\r
534 \r
535     if(vel == 0)\r
536     {\r
537         self.velocity = '0 0 0';\r
538         //animator_remove(self);\r
539     }\r
540     else\r
541     {\r
542         steer  = steer * 0.5  + steerlib_traceavoid(0.3,256);\r
543         float vz;\r
544         vz = self.velocity_z;\r
545         movelib_move_simple(steer * 200,vel,0.5);\r
546         self.velocity_z = vz;\r
547 \r
548         wish_angle = vectoangles(self.velocity);\r
549 \r
550         real_angle = wish_angle - self.angles;\r
551 \r
552         real_angle_y = shortangle_f(real_angle_y,self.angles_y);\r
553 \r
554         self.angles_y = self.angles_y + bound(-5,real_angle_y,5);\r
555     }\r
556     walker_animate();\r
557 \r
558     if (self.tur_head.frame != 0)\r
559         self.tur_head.frame = self.tur_head.frame +1;\r
560 \r
561     if (self.tur_head.frame > 12)\r
562         self.tur_head.frame = 0;\r
563 \r
564 \r
565 }\r
566 \r
567 void walker_attack()\r
568 {\r
569     entity flash;\r
570 \r
571     //turret_do_updates(self);\r
572 \r
573     self.tur_head.frame = self.tur_head.frame + 1;\r
574 \r
575     sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);\r
576 \r
577     fireBallisticBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, cvar("g_balance_uzi_bulletconstant"));\r
578     te_smallflash(self.tur_shotorg_updated);\r
579 \r
580     if (!(self.uzi_bulletcounter & 3))\r
581     {\r
582 \r
583         trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);\r
584         // te_lightning1(self,self.tur_shotorg_updated,trace_endpos);\r
585         flash = spawn();\r
586         setmodel(flash, "models/uziflash.md3"); // precision set below\r
587         setattachment(flash, self.tur_head, "tag_fire");\r
588         flash.scale = 3;\r
589         flash.think = W_Uzi_Flash_Go;\r
590         flash.nextthink = time + 0.02;\r
591         flash.frame = 2;\r
592         flash.angles_z = flash.v_angle_z + random() * 180;\r
593         flash.alpha = 1;\r
594         flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;\r
595     }\r
596 \r
597     self.uzi_bulletcounter = self.uzi_bulletcounter + 1;\r
598 }\r
599 \r
600 \r
601 void walker_respawnhook()\r
602 {\r
603     vector vtmp;\r
604     entity e;\r
605 \r
606     //load_unit_settings(self.rocket_rack,"walker_std_rocket",1);\r
607 \r
608     self.origin = self.wkr_spawn.origin;\r
609     self.wkr_props.solid = SOLID_BBOX;\r
610     self.wkr_props.alpha = 1;\r
611 \r
612     self.angles = self.wkr_spawn.angles;\r
613     vtmp = self.origin;\r
614     vtmp_z +=self.wkr_spawn.origin_z + self.wkr_spawn.maxs_z;\r
615     setorigin(self,vtmp);\r
616 \r
617     if (self.target != "")\r
618     {\r
619         e = find(world,targetname,self.target);\r
620         if (!e)\r
621         {\r
622             bprint("Warning! initital waypoint for Walker does NOT exsist!\n");\r
623             self.target = "";\r
624         }\r
625 \r
626         if (e.classname != "turret_checkpoint")\r
627             dprint("Warning: not a turrret path\n");\r
628         else\r
629         {\r
630             self.pathcurrent = pathlib_makepath(self.origin,e.origin,PFL_GROUNDSNAP,500,2,PT_QUICKBOX);\r
631             self.pathgoal = e;\r
632         }\r
633     }\r
634 }\r
635 void walker_diehook()\r
636 {\r
637     //animator_remove(self);\r
638 \r
639     if(self.pathcurrent)\r
640         pathlib_deletepath(self.pathcurrent.owner);\r
641 \r
642     self.pathcurrent = world;\r
643 \r
644     self.wkr_props.solid = SOLID_NOT;\r
645     self.wkr_props.alpha = -1;\r
646 \r
647     if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN)\r
648     {\r
649 \r
650         remove(self.wkr_props);\r
651         //remove(self.rocket_rack);\r
652         remove(self.wkr_spawn);\r
653     }\r
654 \r
655 }\r
656 \r
657 //.string target_start;\r
658 void turret_walker_dinit()\r
659 {\r
660 \r
661     entity e;\r
662 \r
663     if (self.netname == "")      self.netname     = "Walker Turret";\r
664 \r
665 \r
666     self.wkr_props = spawn();\r
667     self.wkr_spawn = spawn();\r
668 \r
669     self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;\r
670     self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;\r
671     self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE | TFL_AIM_SHOTTIMECOMPENSATE;\r
672 \r
673     self.turret_respawnhook = walker_respawnhook;\r
674     self.turret_diehook = walker_diehook;\r
675 \r
676     self.ticrate = 0.05;\r
677     if (turret_stdproc_init("walker_std") == 0)\r
678     {\r
679         remove(self);\r
680         return;\r
681     }\r
682     self.damage_flags |= RFL_DMG_DEATH_NOGIBS;\r
683 \r
684     self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;\r
685     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;\r
686 \r
687     //self.flags      = FL_CLIENT;\r
688     self.iscreature = TRUE;\r
689     self.movetype   = MOVETYPE_WALK;\r
690     self.solid      = SOLID_SLIDEBOX;\r
691     self.takedamage = DAMAGE_AIM;\r
692 \r
693     setmodel(self.wkr_props,"models/turrets/walker_props.md3");\r
694     setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3");\r
695     setorigin(self.wkr_spawn,self.origin);\r
696 \r
697     self.wkr_spawn.angles   = self.angles;\r
698     self.wkr_spawn.solid    = SOLID_NOT;\r
699 \r
700 \r
701     traceline(self.wkr_spawn.origin + '0 0 16', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);\r
702     setorigin(self.wkr_spawn,trace_endpos + '0 0 4');\r
703     setorigin(self,self.wkr_spawn.origin);\r
704 \r
705     setmodel(self,"models/turrets/walker_body.md3");\r
706     setmodel(self.tur_head,"models/turrets/walker_head_minigun.md3");\r
707 \r
708     setattachment(self.tur_head,self,"tag_head");\r
709     setattachment(self.wkr_props,self,"tag_head");\r
710 \r
711     vector v;\r
712     float f;\r
713     f = gettagindex(self.tur_head,"tag_fire");\r
714     v = gettaginfo(self.tur_head,f);\r
715     v_y = v_y * -1;\r
716 \r
717     setsize(self,WALKER_MIN,WALKER_MAX);\r
718     //setsize(self,'-70 -70 0','70 70 55');\r
719 \r
720     self.tur_shotorg = v;\r
721     self.tur_aimorg  = v;// + '0 0 10';\r
722 \r
723     self.idle_aim = '0 0 0';\r
724 \r
725 //    self.v_home = self.origin;\r
726 \r
727     self.turret_firecheckfunc   = walker_firecheck;\r
728 \r
729     // Our fire routine\r
730     self.turret_firefunc  = walker_attack;\r
731 \r
732     self.turret_postthink = walker_postthink;\r
733 \r
734     if (self.target != "")\r
735     {\r
736         e = find(world,targetname,self.target);\r
737         if (!e)\r
738         {\r
739             dprint("Initital waypoint for walker does NOT exsist, fix your map!\n");\r
740             self.target = "";\r
741         }\r
742 \r
743         if (e.classname != "turret_checkpoint")\r
744             dprint("Warning: not a turrret path\n");\r
745         else\r
746         {\r
747             self.pathcurrent = pathlib_makepath(self.origin,e.origin,PFL_GROUNDSNAP,500,2,PT_QUICKBOX);\r
748             self.pathgoal = e;\r
749         }\r
750     }\r
751 \r
752     //self.solid    = SOLID_NOT;\r
753 \r
754 }\r
755 \r
756 \r
757 void spawnfunc_turret_walker()\r
758 {\r
759     precache_model ("models/turrets/walker_head_minigun.md3");\r
760     precache_model ("models/turrets/walker_body.md3");\r
761     precache_model ("models/turrets/walker_props.md3");\r
762     precache_model ("models/turrets/walker_spawn.md3");\r
763     precache_model ( "models/turrets/rocket.md3");\r
764 \r
765     self.think = turret_walker_dinit;\r
766     self.nextthink = time + 0.5;\r
767 }\r