2 #define ANIM_REVERSE 1
\r
5 #define ANIM_STRAFE_L 4
\r
6 #define ANIM_STRAFE_R 5
\r
11 #define ANIM_MEELE 10
\r
12 #define ANIM_SWIM 11
\r
13 #define ANIM_ROAM 12
\r
15 #define WVM_IDLE_UP 25
\r
18 #define WVM_PATH 1000
\r
19 #define WVM_ENEMY 2000
\r
20 #define WVM_STOP 3000
\r
21 #define WVM_DODGE 4000
\r
22 #define WVM_PANIC 10000
\r
23 #define walker_verbs_move verbs_move
\r
25 #define WVA_MINIGUN 100
\r
26 #define WVA_ROCKET 500
\r
27 #define WVA_MEELE 1000
\r
28 #define walker_verbs_attack verbs_attack
\r
32 #define walker_verbs_idle verbs_idle
\r
37 #define WALKER_MIN '-70 -70 5'
\r
38 #define WALKER_MAX '70 70 70'
\r
40 #define WALKER_PATH(s,e) pathlib_astar(s,e)
\r
42 float walker_firecheck()
\r
44 if (self.animflag == ANIM_MEELE)
\r
47 return turret_stdproc_firecheck();
\r
50 void walker_meele_do_dmg()
\r
54 makevectors(self.angles);
\r
55 where = self.origin + v_forward * 128;
\r
57 //w_deathtypestring = "tried to hug the cute spider thingy.";
\r
58 e = findradius(where,64);
\r
61 if (turret_validate_target(self,e,self.target_validate_flags))
\r
62 if (e != self && e.owner != self)
\r
63 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
69 void walker_animate()
\r
74 real_angle = vectoangles(self.steerto) - self.angles;
\r
75 vz = self.velocity_z;
\r
77 if (self.tur_head.frame != 0)
\r
78 self.tur_head.frame = self.tur_head.frame +1;
\r
80 if (self.tur_head.frame > 12)
\r
81 self.tur_head.frame = 0;
\r
83 switch (self.animflag)
\r
87 if (self.frame != 0)
\r
90 movelib_beak_simple(cvar("g_turrets_unit_walker_speed_stop"));
\r
95 if ((self.frame < 5) || (self.frame > 25))
\r
98 self.frame = self.frame -1;
\r
99 movelib_move_simple(v_forward * -1 ,cvar("g_turrets_unit_walker_speed_walk"),0.6);
\r
101 if (self.frame < 5)
\r
108 if ((self.frame < 30) || (self.frame > 55))
\r
111 self.frame = self.frame + 1;
\r
113 self.angles_y += bound(-15,shortangle_f(real_angle_y,self.angles_y),15);
\r
115 movelib_beak_simple(cvar("g_turrets_unit_walker_speed_stop"));
\r
117 if (self.frame > 55)
\r
123 if ((self.frame < 5) || (self.frame > 25))
\r
126 self.frame = self.frame +1;
\r
127 self.angles_y += bound(-10,shortangle_f(real_angle_y,self.angles_y),10);
\r
128 movelib_move_simple(v_forward ,cvar("g_turrets_unit_walker_speed_walk"),0.6);
\r
130 if (self.frame > 25)
\r
136 if ((self.frame < 5) || (self.frame > 25))
\r
139 self.frame = self.frame +1;
\r
141 self.angles_y += bound(-5,shortangle_f(real_angle_y,self.angles_y),5);
\r
143 movelib_move_simple(v_forward ,cvar("g_turrets_unit_walker_speed_roam"),0.5);
\r
145 if (self.frame > 25)
\r
151 if ((self.frame < 142) || (self.frame > 151))
\r
154 self.frame = self.frame +1;
\r
156 self.angles_y += bound(-10,shortangle_f(real_angle_y,self.angles_y),10);
\r
157 self.angles_x += bound(-10,shortangle_f(real_angle_x,self.angles_x),10);
\r
159 movelib_move_simple(v_forward, cvar("g_turrets_unit_walker_speed_swim"),0.3);
\r
160 vz = self.velocity_z + sin(time * 4) * 8;
\r
162 if (self.frame > 151)
\r
169 if ((self.frame < 5) || (self.frame > 25))
\r
172 self.angles_y += bound(-5,shortangle_f(real_angle_y,self.angles_y),5);
\r
173 movelib_move_simple(v_forward, cvar("g_turrets_unit_walker_speed_run"),0.6);
\r
175 if (self.frame > 25)
\r
180 case ANIM_STRAFE_L:
\r
181 if ((self.frame < 30) || (self.frame > 55))
\r
184 self.frame = self.frame + 1;
\r
185 self.angles_y += bound(-2.5,shortangle_f(real_angle_y,self.angles_y),2.5);
\r
186 movelib_move_simple(v_right * -1, cvar("g_turrets_unit_walker_speed_walk"),0.8);
\r
188 if (self.frame > 55)
\r
192 case ANIM_STRAFE_R:
\r
193 if ((self.frame < 60) || (self.frame > 65))
\r
196 self.frame = self.frame + 1;
\r
197 self.angles_y += bound(-2.5,shortangle_f(real_angle_y,self.angles_y),2.5);
\r
198 movelib_move_simple(v_right, cvar("g_turrets_unit_walker_speed_walk"),0.8);
\r
200 if (self.frame > 85)
\r
206 if ((self.frame < 95) || (self.frame > 100))
\r
209 self.velocity += '0 0 1' * cvar("g_turrets_unit_walker_speed_jump");
\r
211 if (self.frame > 100)
\r
212 self.frame = self.frame + 1;
\r
217 if ((self.frame < 100) || (self.frame > 107))
\r
220 self.frame = self.frame + 1;
\r
222 if (self.frame > 107)
\r
223 self.animflag = ANIM_NO;
\r
228 if ((self.frame < 60) || (self.frame > 95))
\r
231 self.frame = self.frame + 1;
\r
233 if (self.frame > 95)
\r
234 self.animflag = ANIM_NO;
\r
239 if ((self.frame < 123) || (self.frame > 140))
\r
242 movelib_beak_simple(cvar("g_turrets_unit_walker_speed_stop"));
\r
244 self.frame = self.frame + 2;
\r
246 if (self.frame == 133)
\r
247 walker_meele_do_dmg();
\r
249 if (self.frame > 140)
\r
251 self.animflag = ANIM_NO;
\r
256 self.velocity_z = vz;
\r
258 if (self.flags & FL_ONGROUND)
\r
259 movelib_groundalign4point(300,100);
\r
264 void walker_rocket_explode()
\r
268 if (self.event_damage != SUB_Null)
\r
270 self.event_damage = SUB_Null;
\r
271 self.think = walker_rocket_explode;
\r
272 self.nextthink = time;
\r
276 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
\r
277 org2 = findbetterlocation (self.origin, 16);
\r
279 pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
\r
280 //w_deathtypestring = "got blasted to oblivion";
\r
281 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
286 void walker_rocket_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
\r
288 self.health = self.health - damage;
\r
289 self.velocity = self.velocity + vforce;
\r
290 if (self.health <= 0)
\r
291 walker_rocket_explode();
\r
294 #define WALKER_ROCKET_MOVE movelib_move_simple(newdir,cvar("g_turrets_unit_walker_std_rocket_speed"),cvar("g_turrets_unit_walker_std_rocket_tunrate")); UpdateCSQCProjectile(self)
\r
295 void walker_rocket_loop();
\r
296 void walker_rocket_think()
\r
303 self.nextthink = time;
\r
305 edist = vlen(self.enemy.origin - self.origin);
\r
307 // Simulate crude guidance
\r
308 if (self.cnt < time)
\r
311 self.tur_shotorg = randomvec() * min(edist,64);
\r
313 self.tur_shotorg = randomvec() * min(edist,256);
\r
315 self.cnt = time + 0.5;
\r
319 self.tur_shotorg = '0 0 0';
\r
322 if (self.tur_health < time)
\r
324 self.think = walker_rocket_explode;
\r
325 self.nextthink = time;
\r
329 if (self.shot_dmg != 1337)
\r
330 if (random() < 0.01)
\r
332 walker_rocket_loop();
\r
336 m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
\r
338 // Enemy dead? just keep on the current heading then.
\r
339 if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
\r
341 // Make sure we dont return to tracking a respawned player
\r
342 self.enemy = world;
\r
347 itime = max(edist / m_speed,1);
\r
348 newdir = steerlib_pull(self.enemy.origin + self.tur_shotorg);
\r
352 newdir = normalize(self.velocity);
\r
355 WALKER_ROCKET_MOVE;
\r
358 void walker_rocket_loop3()
\r
361 self.nextthink = time;
\r
363 if (self.tur_health < time)
\r
365 self.think = walker_rocket_explode;
\r
369 if (vlen(self.origin - self.tur_shotorg) < 128 )
\r
371 self.think = walker_rocket_think;
\r
375 newdir = steerlib_pull(self.tur_shotorg);
\r
376 WALKER_ROCKET_MOVE;
\r
378 self.angles = vectoangles(self.velocity);
\r
381 void walker_rocket_loop2()
\r
385 self.nextthink = time;
\r
387 if (self.tur_health < time)
\r
389 self.think = walker_rocket_explode;
\r
393 if (vlen(self.origin - self.tur_shotorg) < 128 )
\r
395 self.tur_shotorg = self.origin - '0 0 200';
\r
396 self.think = walker_rocket_loop3;
\r
400 newdir = steerlib_pull(self.tur_shotorg);
\r
401 WALKER_ROCKET_MOVE;
\r
404 void walker_rocket_loop()
\r
406 self.nextthink = time;
\r
407 self.tur_shotorg = self.origin + '0 0 400';
\r
408 self.think = walker_rocket_loop2;
\r
409 self.shot_dmg = 1337;
\r
412 void walker_fire_rocket(vector org)
\r
418 self.angles_x *= -1;
\r
419 makevectors(self.angles);
\r
420 self.angles_x *= -1;
\r
422 te_explosion (org);
\r
425 setorigin(rocket, org);
\r
427 sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
\r
428 setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
\r
430 rocket.classname = "walker_rocket";
\r
431 rocket.owner = self;
\r
433 rocket.bot_dodge = TRUE;
\r
434 rocket.bot_dodgerating = 50;
\r
436 rocket.takedamage = DAMAGE_YES;
\r
438 rocket.damageforcescale = 2;
\r
439 rocket.health = 25;
\r
440 rocket.tur_shotorg = randomvec() * 512;
\r
441 rocket.cnt = time + 1;
\r
442 rocket.enemy = self.enemy;
\r
444 if (random() < 0.01)
\r
445 rocket.think = walker_rocket_loop;
\r
447 rocket.think = walker_rocket_think;
\r
449 rocket.event_damage = walker_rocket_damage;
\r
451 rocket.nextthink = time;// + 0.25;
\r
452 rocket.movetype = MOVETYPE_FLY;
\r
453 rocket.velocity = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * cvar("g_turrets_unit_walker_std_rocket_speed");
\r
454 rocket.angles = vectoangles(rocket.velocity);
\r
455 rocket.touch = walker_rocket_explode;
\r
456 rocket.flags = FL_PROJECTILE;
\r
457 rocket.solid = SOLID_BBOX;
\r
458 rocket.tur_health = time + 9;
\r
460 CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
\r
469 if (self.owner.deadflag != DEAD_NO)
\r
475 self.cnt = self.cnt -1;
\r
484 f = gettagindex(self.owner,"tag_rocket01");
\r
486 f = gettagindex(self.owner,"tag_rocket02");
\r
488 org = gettaginfo(self.owner,f);
\r
490 self.nextthink = time + 0.2;
\r
493 walker_fire_rocket(org);
\r
497 float walker_moveverb_path(float eval)
\r
503 if (self.animflag == ANIM_MEELE)
\r
506 if (self.pathcurrent)
\r
507 return verb.verb_static_value;
\r
512 // Do we have a path?
\r
513 if not(self.pathcurrent)
\r
519 // Are we close enougth to a path node to switch to the next?
\r
520 if (vlen(self.origin - self.pathcurrent.origin) < 64)
\r
521 if (self.pathcurrent.path_next == world)
\r
523 // Path endpoint reached
\r
524 pathlib_deletepath(self.pathcurrent.owner);
\r
525 self.pathcurrent = world;
\r
529 if (self.pathgoal.use)
\r
530 self.pathgoal.use();
\r
532 if (self.pathgoal.enemy)
\r
534 self.pathcurrent = WALKER_PATH(self.pathgoal.origin,self.pathgoal.enemy.origin);
\r
535 self.pathgoal = self.pathgoal.enemy;
\r
539 self.pathgoal = world;
\r
542 self.pathcurrent = self.pathcurrent.path_next;
\r
546 if (self.pathcurrent)
\r
548 switch (self.waterlevel)
\r
551 self.animflag = ANIM_WALK;
\r
554 if (self.animflag == ANIM_WALK)
\r
555 self.animflag = ANIM_WALK;
\r
557 self.animflag = ANIM_SWIM;
\r
560 self.animflag = ANIM_SWIM;
\r
563 self.moveto = self.pathcurrent.origin;
\r
564 self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
\r
566 return VS_CALL_YES_DOING;
\r
569 return VS_CALL_YES_DONE;
\r
573 if (self.pathcurrent)
\r
574 pathlib_deletepath(self.pathcurrent.owner);
\r
576 self.pathcurrent = world;
\r
578 return VS_CALL_YES_DONE;
\r
581 return VS_CALL_YES_DONE;
\r
584 float walker_moveverb_enemy(float eval)
\r
591 if (self.spawnflags & TSF_NO_PATHBREAK)
\r
592 if (self.pathcurrent)
\r
595 if (self.animflag == ANIM_MEELE)
\r
598 if (self.enemy == world)
\r
601 if (tracewalk(self.enemy, self.origin, self.mins, self.maxs, self.enemy.origin, MOVE_NORMAL))
\r
602 return verb.verb_static_value;
\r
607 switch (self.waterlevel)
\r
610 if (self.tur_dist_enemy > 500)
\r
611 self.animflag = ANIM_RUN;
\r
613 self.animflag = ANIM_WALK;
\r
616 if (self.animflag != ANIM_SWIM)
\r
617 self.animflag = ANIM_WALK;
\r
619 self.animflag = ANIM_SWIM;
\r
622 self.animflag = ANIM_SWIM;
\r
625 self.moveto = self.enemy.origin;
\r
626 self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
\r
628 return VS_CALL_YES_DOING;
\r
631 return VS_CALL_YES_DONE;
\r
634 float walker_moveverb_idle_pause(float eval)
\r
640 if (self.animflag == ANIM_MEELE)
\r
643 return verb.verb_static_value;
\r
647 self.moveto = self.origin;
\r
648 self.steerto = v_forward;
\r
649 self.animflag = ANIM_NO;
\r
651 return VS_CALL_YES_DOING;
\r
654 return VS_CALL_YES_DONE;
\r
657 float walker_moveverb_idle_roam(float eval)
\r
663 if (self.animflag == ANIM_MEELE)
\r
666 return verb.verb_static_value;
\r
669 if(verb.wait < time)
\r
671 trace_fraction = 0;
\r
672 while(trace_fraction != 1.0)
\r
674 self.moveto = self.origin + (v_forward * 256);
\r
675 self.moveto += v_right * (random() * 256);
\r
676 self.moveto -= v_right * (random() * 256);
\r
678 tracebox(self.origin+'0 0 64',self.mins,self.maxs,self.moveto + '0 0 64',MOVE_NORMAL,self);
\r
680 verb.wait = time + 10;
\r
684 if(verb.wait - time < 9)
\r
685 if(vlen(self.moveto - self.origin) < 32)
\r
687 verbstack_push(self.walker_verbs_move, walker_moveverb_idle_pause, WVM_IDLE + WVM_IDLE_UP, random() * (verb.wait - time));
\r
688 self.animflag = ANIM_NO;
\r
689 return VS_CALL_REMOVE;
\r
693 self.steerto = steerlib_attract(self.moveto,256);
\r
694 te_lightning1(self,self.origin + '0 0 64',self.moveto + '0 0 64');
\r
698 switch (self.waterlevel)
\r
701 self.animflag = ANIM_ROAM;
\r
704 if (self.animflag != ANIM_SWIM)
\r
705 self.animflag = ANIM_ROAM;
\r
709 self.animflag = ANIM_SWIM;
\r
712 return VS_CALL_YES_DOING;
\r
715 return VS_CALL_YES_DONE;
\r
718 float walker_moveverb_idle(float eval)
\r
724 if (self.animflag == ANIM_MEELE)
\r
727 return verb.verb_static_value;
\r
731 //if (random() < 0.5)
\r
732 verbstack_push(self.walker_verbs_move, walker_moveverb_idle_pause, WVM_IDLE + WVM_IDLE_UP, random() * 5);
\r
734 // verbstack_push(self.walker_verbs_move, walker_moveverb_idle_roam, WVM_IDLE + WVM_IDLE_UP, random() * 15);
\r
736 return VS_CALL_YES_DOING;
\r
739 return VS_CALL_YES_DONE;
\r
742 float walker_attackverb_meele(float eval)
\r
750 if (cvar("g_turrets_nofire"))
\r
753 if (self.animflag == ANIM_SWIM || self.animflag == ANIM_MEELE)
\r
759 wish_angle = angleofs(self,self.enemy);
\r
761 if (self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_meele_range"))
\r
762 if (fabs(wish_angle_y) < 15)
\r
763 return verb.verb_static_value;
\r
769 self.moveto = self.enemy.origin;
\r
770 self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
\r
771 self.animflag = ANIM_MEELE;
\r
773 return VS_CALL_YES_DOING;
\r
776 return VS_CALL_YES_DONE;
\r
779 float walker_attackverb_rockets(float eval)
\r
784 if (self.tur_head.attack_finished_single > time)
\r
790 if (cvar("g_turrets_nofire"))
\r
793 if (self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_rockets_range_min"))
\r
796 if (self.tur_dist_enemy > cvar("g_turrets_unit_walker_std_rockets_range"))
\r
799 return verb.verb_static_value;
\r
806 rv.think = rv_think;
\r
807 rv.nextthink = time;
\r
811 self.tur_head.attack_finished_single = time + cvar("g_turrets_unit_walker_std_rocket_refire");
\r
813 return VS_CALL_YES_DONE;
\r
816 return VS_CALL_YES_DONE;
\r
819 void walker_postthink()
\r
822 self.angles_x *= -1;
\r
823 makevectors(self.angles);
\r
824 self.angles_x *= -1;
\r
826 verbstack_pop(self.walker_verbs_attack);
\r
827 verbstack_pop(self.walker_verbs_move);
\r
832 void walker_attack()
\r
836 //w_deathtypestring = "was miniguned";
\r
837 sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
\r
838 fireBallisticBullet (self.tur_shotorg, 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
839 if (self.uzi_bulletcounter == 2)
\r
844 setmodel(flash, "models/uziflash.md3");
\r
845 setattachment(flash, self.tur_head, "tag_fire");
\r
848 flash.think = W_Uzi_Flash_Go;
\r
849 flash.nextthink = time + 0.02;
\r
851 flash.angles_z = flash.v_angle_z + random() * 180;
\r
853 flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
\r
855 self.uzi_bulletcounter = self.uzi_bulletcounter = 0;
\r
858 self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
\r
859 self.tur_head.frame = self.tur_head.frame + 1;
\r
863 void walker_respawnhook()
\r
868 self.origin = self.wkr_spawn.origin;
\r
869 //self.wkr_props.solid = SOLID_BBOX;
\r
870 //self.wkr_props.alpha = 1;
\r
872 self.angles = self.wkr_spawn.angles;
\r
873 vtmp = self.wkr_spawn.origin;
\r
874 vtmp_z += self.wkr_spawn.maxs_z;
\r
875 setorigin(self,vtmp);
\r
877 if (self.target != "")
\r
879 e = find(world,targetname,self.target);
\r
882 dprint("Warning! initital waypoint for Walker does NOT exsist!\n");
\r
886 if (e.classname != "turret_checkpoint")
\r
887 dprint("Warning: not a turrret path\n");
\r
890 self.pathcurrent = WALKER_PATH(self.origin,e.origin);
\r
895 void walker_diehook()
\r
897 turret_trowgib2(self.origin,self.velocity + v_up * 200,'-0.6 -0.2 -02',self,time + random() * 1);
\r
898 turret_trowgib2(self.origin + '0 0 64',self.velocity + v_forward * 150 + v_up * 150,'-0.2 -0.2 -02',self.tur_head,time + random() * 2 + 3);
\r
900 if (self.pathcurrent)
\r
901 pathlib_deletepath(self.pathcurrent.owner);
\r
903 self.pathcurrent = world;
\r
905 if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
\r
907 remove(self.wkr_spawn);
\r
909 verbstack_flush(self.walker_verbs_move);
\r
910 verbstack_flush(self.walker_verbs_attack);
\r
911 verbstack_flush(self.walker_verbs_idle);
\r
913 remove(self.walker_verbs_move);
\r
914 remove(self.walker_verbs_attack);
\r
915 remove(self.walker_verbs_idle);
\r
920 void turret_walker_dinit()
\r
925 if (self.netname == "") self.netname = "Walker Turret";
\r
926 self.wkr_spawn = spawn();
\r
928 self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
\r
929 self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_HEADATTACHED;
\r
930 self.aim_flags = TFL_AIM_LEAD;
\r
932 if (cvar("g_antilag_bullets"))
\r
933 self.turrcaps_flags |= TFL_TURRCAPS_HITSCAN;
\r
935 self.aim_flags |= TFL_AIM_SHOTTIMECOMPENSATE;
\r
938 self.turret_respawnhook = walker_respawnhook;
\r
939 self.turret_diehook = walker_diehook;
\r
941 self.ticrate = 0.05;
\r
942 if (turret_stdproc_init("walker_std") == 0)
\r
948 self.walker_verbs_move = spawn();
\r
949 self.walker_verbs_attack = spawn();
\r
950 self.walker_verbs_idle = spawn();
\r
952 verbstack_push(self.walker_verbs_move, walker_moveverb_idle, WVM_IDLE, 0);
\r
953 verbstack_push(self.walker_verbs_move, walker_moveverb_enemy, WVM_ENEMY, 0);
\r
954 verbstack_push(self.walker_verbs_move, walker_moveverb_path, WVM_PATH, 0);
\r
956 verbstack_push(self.walker_verbs_attack, walker_attackverb_meele, WVA_MEELE, 0);
\r
957 verbstack_push(self.walker_verbs_attack, walker_attackverb_rockets, WVA_ROCKET, 0);
\r
959 self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
\r
961 self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
962 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
964 self.iscreature = TRUE;
\r
965 self.movetype = MOVETYPE_WALK;
\r
966 self.solid = SOLID_SLIDEBOX;
\r
967 self.takedamage = DAMAGE_AIM;
\r
969 setmodel(self,"models/turrets/walker_body.md3");
\r
970 setmodel(self.tur_head,"models/turrets/walker_head_minigun.md3");
\r
971 setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3");
\r
973 setattachment(self.tur_head,self,"tag_head");
\r
975 self.wkr_spawn.angles = self.angles;
\r
976 self.wkr_spawn.solid = SOLID_NOT;
\r
978 traceline(self.origin + '0 0 16', self.origin - '0 0 10000', MOVE_WORLDONLY, self);
\r
979 setorigin(self.wkr_spawn,trace_endpos + '0 0 4');
\r
980 setorigin(self,self.wkr_spawn.origin);
\r
982 setsize(self,WALKER_MIN,WALKER_MAX);
\r
984 self.idle_aim = '0 0 0';
\r
985 self.turret_firecheckfunc = walker_firecheck;
\r
986 self.turret_firefunc = walker_attack;
\r
987 self.turret_postthink = walker_postthink;
\r
989 if (self.target != "")
\r
991 e = find(world,targetname,self.target);
\r
994 dprint("Initital waypoint for walker does NOT exsist, fix your map!\n");
\r
998 if (e.classname != "turret_checkpoint")
\r
999 dprint("Warning: not a turrret path\n");
\r
1002 self.pathcurrent = WALKER_PATH(self.origin,e.origin);
\r
1003 self.pathgoal = e;
\r
1009 void spawnfunc_turret_walker()
\r
1011 g_turrets_common_precash();
\r
1013 precache_model ("models/turrets/walker_head_minigun.md3");
\r
1014 precache_model ("models/turrets/walker_body.md3");
\r
1015 precache_model ("models/turrets/walker_props.md3");
\r
1016 precache_model ("models/turrets/walker_spawn.md3");
\r
1017 precache_model ( "models/turrets/rocket.md3");
\r
1018 precache_sound ( "weapons/rocket_impact.wav" );
\r
1020 self.think = turret_walker_dinit;
\r
1021 self.nextthink = time + 0.5;
\r