4 #define ANIM_STRAFE_L 2
\r
5 #define ANIM_STRAFE_R 3
\r
10 #define ANIM_MEELE 7
\r
15 //.vector movepoint;
\r
16 //.entity wkr_waypoint;
\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
33 void checkpoint_think()
\r
35 if(self.goalcurrent != world)
\r
36 te_lightning1(self,self.origin,self.goalcurrent.origin);
\r
39 self.nextthink = time + 0.5;
\r
42 void turret_checkpoint_dinit()
\r
47 if(self.target != "")
\r
49 e = find(world,targetname,self.target);
\r
52 bprint("turret_checkpoint without valid target! (",vtos(self.origin),")\n");
\r
57 // TODO:: ADD WORLD-INTERACTIVE PATH SUBDEVISION IF PATH NOT CLEAR
\r
58 self.goalcurrent = e;
\r
62 if(self.goalcurrent == world)
\r
64 bprint("turret_checkpoint without valid target (",vtos(self.origin),")\n");
\r
70 //self.think = checkpoint_think;
\r
71 //self.nextthink = 1;
\r
78 void spawnfunc_walker_checkpoint()
\r
83 self.think = turret_checkpoint_dinit;
\r
84 self.nextthink = time + 0.25;
\r
89 float walker_firecheck()
\r
91 if (!turret_stdproc_firecheck()) return 0;
\r
92 //if(self.tur_cannon.frame != 0) return 0;
\r
94 //if(self.walking == 1) self.walking = 2;
\r
95 //if(self.walking != 0)
\r
101 void walker_meele_dmg()
\r
106 makevectors(self.angles);
\r
107 where = self.origin + v_forward * 128;
\r
109 e = findradius(where,80);
\r
112 if(turret_validate_target(self,e,self.target_validate_flags))
\r
114 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
120 void walker_animate()
\r
123 if(self.tur_head.frame != 0)
\r
124 self.tur_head.frame = self.tur_head.frame +1;
\r
126 if(self.tur_head.frame > 12)
\r
127 self.tur_head.frame = 0;
\r
130 switch(self.animflag)
\r
133 //if(self.frame != 0)
\r
138 self.frame = self.frame + 1;
\r
139 if(self.frame > 25)
\r
144 self.frame = self.frame + 2;
\r
145 if(self.frame > 25)
\r
149 case ANIM_STRAFE_L:
\r
150 if(self.frame < 35) self.frame = 35;
\r
151 self.frame = self.frame + 1;
\r
152 if(self.frame > 55) self.frame = 35;
\r
155 case ANIM_STRAFE_R:
\r
156 if(self.frame < 65) self.frame = 65;
\r
157 self.frame = self.frame + 1;
\r
158 if(self.frame > 85) self.frame = 65;
\r
162 if(self.frame < 95) self.frame = 95;
\r
163 if(self.frame > 100)
\r
164 self.frame = self.frame + 1;
\r
169 if(self.frame < 100) self.frame = 100;
\r
170 self.frame = self.frame + 1;
\r
171 if(self.frame > 107)
\r
172 self.animflag = ANIM_NO;
\r
176 if(self.frame < 90) self.frame = 90;
\r
177 self.frame = self.frame + 1;
\r
178 if(self.frame > 95)
\r
179 self.animflag = ANIM_NO;
\r
183 if(self.frame < 123) self.frame = 123;
\r
184 self.frame = self.frame + 1;
\r
186 if(self.frame == 133)
\r
187 walker_meele_dmg();
\r
189 if(self.frame > 140)
\r
190 self.animflag = ANIM_NO;
\r
199 void walker_rocket_explode()
\r
203 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", 1, ATTN_NORM);
\r
204 org2 = findbetterlocation (self.origin, 16);
\r
206 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
\r
207 WriteByte (MSG_BROADCAST, 78);
\r
208 WriteCoord (MSG_BROADCAST, org2_x);
\r
209 WriteCoord (MSG_BROADCAST, org2_y);
\r
210 WriteCoord (MSG_BROADCAST, org2_z);
\r
212 self.event_damage = SUB_Null;
\r
214 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
219 void walker_rocket_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
\r
221 self.health = self.health - damage;
\r
222 self.velocity = self.velocity + vforce;
\r
223 if (self.health <= 0) walker_rocket_explode();
\r
228 g_turrets_unit_walker_std_rocket_refire
\r
229 g_turrets_unit_walker_std_rocket_dmg
\r
230 g_turrets_unit_walker_std_rocket_radius
\r
231 g_turrets_unit_walker_std_rocket_force
\r
232 g_turrets_unit_walker_std_rocket_tunrate
\r
233 g_turrets_unit_walker_std_rocket_speed
\r
234 g_turrets_unit_walker_std_rocket_speed_add
\r
237 void walker_rocket_loop();
\r
238 void walker_rocket_think()
\r
240 vector olddir,newdir;
\r
245 self.nextthink = time + 0.1;
\r
247 olddir = normalize(self.velocity);
\r
248 edist = vlen(self.enemy.origin - self.origin);
\r
250 // Simulate crudely guidance
\r
251 if(self.cnt < time)
\r
254 self.tur_shotorg = randomvec() * min(edist,64);
\r
256 self.tur_shotorg = randomvec() * min(edist,256);
\r
257 self.cnt = time + 0.5;
\r
260 self.tur_shotorg = '0 0 0';
\r
263 if (self.tur_health < time)
\r
265 self.think = walker_rocket_explode;
\r
266 self.nextthink = time;
\r
270 if((random() < 0.01) && (self.shot_dmg != 1337))
\r
272 walker_rocket_loop();
\r
276 olddir = normalize(self.velocity);
\r
279 m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
\r
281 // Enemy dead? just keep on the current heading then.
\r
282 if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
\r
285 // Make sure we dont return to tracking a respawned player
\r
286 self.enemy = world;
\r
289 self.angles = vectoangles(self.velocity);
\r
294 // Predict enemy position
\r
295 itime = max(edist / m_speed,1);
\r
296 newdir = normalize((self.enemy.origin + self.tur_shotorg) - self.origin);
\r
300 //pre_pos = self.origin + olddir;
\r
305 newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
\r
307 self.velocity = newdir * m_speed;
\r
310 self.angles = vectoangles(self.velocity);
\r
312 if (time+itime < time+0.1)
\r
314 self.think = turret_hellion_missile_explode;
\r
315 self.nextthink = time + itime;
\r
319 void walker_rocket_loop3()
\r
321 self.nextthink = time + 0.1;
\r
322 if(vlen(self.origin - self.tur_shotorg) < 128 )
\r
324 self.think = walker_rocket_think;
\r
332 m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
\r
334 olddir = normalize(self.velocity);
\r
337 newdir = normalize(self.tur_shotorg - self.origin);
\r
339 newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
\r
342 self.velocity = newdir * m_speed;
\r
343 self.angles = vectoangles(self.velocity);
\r
346 void walker_rocket_loop2()
\r
348 self.nextthink = time + 0;
\r
350 if(vlen(self.origin - self.tur_shotorg) < 128 )
\r
352 self.tur_shotorg = self.origin - '0 0 200';
\r
353 self.think = walker_rocket_loop3;
\r
361 m_speed = vlen(self.velocity) + cvar("g_turrets_unit_walker_std_rocket_speed_add");
\r
363 olddir = normalize(self.velocity);
\r
365 newdir = normalize(self.tur_shotorg - self.origin);
\r
367 newdir = normalize(olddir + newdir * cvar("g_turrets_unit_walker_std_rocket_tunrate"));
\r
369 self.velocity = newdir * m_speed;
\r
371 self.angles = vectoangles(self.velocity);
\r
375 void walker_rocket_loop()
\r
378 self.nextthink= time + 0;
\r
380 self.tur_shotorg = self.origin + '0 0 400';
\r
382 self.think = walker_rocket_loop2;
\r
384 self.shot_dmg = 1337;
\r
389 void walker_fire_rocket(vector org)
\r
395 //self.angles_x *= -1;
\r
396 makevectors(self.angles);
\r
397 //self.angles_x *= -1;
\r
400 setorigin(rocket, org);
\r
402 sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", 1, ATTN_NORM);
\r
403 sound (rocket, CHAN_PROJECTILE, "weapons/rocket_fly.wav", 0.4, ATTN_NORM);
\r
404 setmodel (rocket, "models/turrets/rocket.md3"); // precision set below
\r
405 setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
\r
407 rocket.classname = "walker_rocket";
\r
408 rocket.owner = self;
\r
409 rocket.bot_dodge = TRUE;
\r
410 rocket.bot_dodgerating = 50;
\r
411 rocket.takedamage = DAMAGE_YES;
\r
413 rocket.damageforcescale = 2;
\r
414 rocket.health = 10;
\r
415 rocket.tur_shotorg = randomvec() * 512;
\r
416 rocket.cnt = time + 1;
\r
417 rocket.enemy = self.enemy;
\r
419 if(random() < 0.01)
\r
420 rocket.think = walker_rocket_loop;
\r
422 rocket.think = walker_rocket_think;
\r
424 rocket.nextthink = time + 0.2;
\r
425 rocket.solid = SOLID_BBOX;
\r
426 rocket.movetype = MOVETYPE_FLYMISSILE;
\r
427 rocket.effects = EF_LOWPRECISION;
\r
428 rocket.velocity = ((v_forward + v_up * 0.5) +(randomvec() * 0.15))* cvar("g_turrets_unit_walker_std_rocket_speed");
\r
429 rocket.angles = vectoangles(rocket.velocity);
\r
430 rocket.touch = walker_rocket_explode;
\r
431 rocket.flags = FL_PROJECTILE;
\r
432 rocket.solid = SOLID_BBOX;
\r
433 rocket.tur_health = time + 9;
\r
435 te_explosion (rocket.origin);
\r
443 #define s_accel2 16
\r
451 self.cnt = self.cnt -1;
\r
459 f = gettagindex(self.owner,"tag_rocket01");
\r
461 f = gettagindex(self.owner,"tag_rocket02");
\r
463 org = self.owner.origin + gettaginfo(self.owner,f);
\r
466 self.nextthink = time + 0.2;
\r
469 walker_fire_rocket(org);
\r
472 void walker_postthink()
\r
480 if(self.flags & FL_ONGROUND)
\r
482 self.animflag = ANIM_NO;
\r
487 if(self.tur_head.attack_finished_single < time)
\r
491 rv.think = rv_think;
\r
492 rv.nextthink = time;
\r
496 self.tur_head.attack_finished_single = time + cvar("g_turrets_unit_walker_std_rocket_refire");
\r
501 if(self.goalcurrent)
\r
503 //if(self.enemy && (self.tur_dist_enemy < self.target_range_fire))
\r
504 // self.animflag = ANIM_TURN;
\r
507 if(vlen(self.origin - self.goalcurrent.origin) < 32)
\r
508 if(self.goalcurrent.goalcurrent == world)
\r
509 self.goalcurrent = world; // Path endpoint reached, go roaming.
\r
511 self.goalcurrent = self.goalcurrent.goalcurrent;
\r
513 self.animflag = ANIM_WALK;
\r
518 else // Roaming mode
\r
523 wish_angle = angleofs(self,self.enemy); //normalize(self.origin-self.enemy.origin);
\r
525 if(self.tur_dist_enemy < cvar("g_turrets_unit_walker_std_meele_range"))
\r
528 if(fabs(wish_angle_y) < 15)
\r
529 self.animflag = ANIM_MEELE;
\r
533 if(fabs(wish_angle_y) < 15)
\r
534 self.animflag = ANIM_RUN;
\r
535 else if(fabs(wish_angle_y) < 30)
\r
536 self.animflag = ANIM_WALK;
\r
538 self.animflag = ANIM_TURN;
\r
541 if(self.tur_dist_enemy > self.target_range_fire)
\r
542 self.animflag = ANIM_RUN;
\r
543 else if(vlen(self.origin - self.enemy.origin) > self.target_range_min)
\r
544 self.animflag = ANIM_WALK;
\r
546 self.animflag = ANIM_TURN;
\r
552 self.animflag = ANIM_NO;
\r
558 s_speed = vlen(self.velocity);
\r
560 // Turn on the spot
\r
561 if (self.animflag == ANIM_TURN) {
\r
563 wish_angle = normalize(self.enemy.origin - self.origin);
\r
565 wish_angle = normalize(self.goalcurrent.origin - self.origin); wish_angle = vectoangles(wish_angle); // And make a angle
\r
567 real_angle = wish_angle - self.angles;
\r
569 if (real_angle_x < 0) real_angle_x += 360;
\r
570 if (real_angle_x > 180) real_angle_x -= 360;
\r
572 if (real_angle_y < 0) real_angle_y += 360;
\r
573 if (real_angle_y > 180) real_angle_y -= 360;
\r
575 turn_limit = cvar("g_turrets_unit_walker_turn_turnrate");
\r
576 // Convert from dgr/sec to dgr/tic
\r
577 turn_limit = turn_limit / (1 / self.ticrate);
\r
579 //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
\r
580 real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
\r
582 self.angles_y = self.angles_y + real_angle_y;
\r
585 v_forward = normalize(self.enemy.origin - self.origin);
\r
587 v_forward = normalize(self.goalcurrent.origin - self.origin);
\r
589 if(s_speed > s_turn)
\r
590 self.velocity = (v_forward * max((s_speed - s_decel),s_turn));
\r
591 if(s_speed < s_turn)
\r
592 self.velocity = (v_forward * min((s_speed + s_accel1),s_turn));
\r
594 else if (self.animflag == ANIM_WALK) // Gg walking
\r
596 if(self.goalcurrent)
\r
597 wish_angle = normalize(self.goalcurrent.origin - self.origin);
\r
600 wish_angle = normalize(self.enemy.origin - self.origin);
\r
602 wish_angle = self.angles;
\r
605 wish_angle = vectoangles(wish_angle); // And make a angle
\r
606 real_angle = wish_angle - self.angles;
\r
608 if (real_angle_x < 0) real_angle_x += 360;
\r
609 if (real_angle_x > 180) real_angle_x -= 360;
\r
611 if (real_angle_y < 0) real_angle_y += 360;
\r
612 if (real_angle_y > 180) real_angle_y -= 360;
\r
614 turn_limit = cvar("g_turrets_unit_walker_walk_turnrate");
\r
615 // Convert from dgr/sec to dgr/tic
\r
616 turn_limit = turn_limit / (1 / self.ticrate);
\r
618 //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
\r
619 real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
\r
621 self.angles_y = self.angles_y + real_angle_y;
\r
624 if(self.goalcurrent)
\r
625 v_forward = normalize(self.goalcurrent.origin - self.origin);
\r
628 v_forward = normalize(self.enemy.origin - self.origin);
\r
630 //self.velocity = v_forward * s_walk;
\r
632 if(self.flags & FL_ONGROUND)
\r
634 if(s_speed > s_walk)
\r
635 self.velocity = (v_forward * max((s_speed - s_decel),s_walk));
\r
636 if(s_speed <= s_walk)
\r
637 self.velocity = (v_forward * min((s_speed + s_accel1),s_walk));
\r
642 else if (self.animflag == ANIM_RUN) // Move fast, turn slow
\r
644 if(self.goalcurrent)
\r
645 wish_angle = normalize(self.goalcurrent.origin - self.origin);
\r
648 wish_angle = normalize(self.enemy.origin - self.origin);
\r
650 wish_angle = self.angles;
\r
652 wish_angle = vectoangles(wish_angle); // And make a angle
\r
653 real_angle = wish_angle - self.angles;
\r
655 if (real_angle_x < 0) real_angle_x += 360;
\r
656 if (real_angle_x > 180) real_angle_x -= 360;
\r
658 if (real_angle_y < 0) real_angle_y += 360;
\r
659 if (real_angle_y > 180) real_angle_y -= 360;
\r
661 turn_limit = cvar("g_turrets_unit_walker_run_turnrate");
\r
662 // Convert from dgr/sec to dgr/tic
\r
663 turn_limit = turn_limit / (1 / self.ticrate);
\r
665 //real_angle_x = bound((-1 * turn_limit),real_angle_x, turn_limit);
\r
666 real_angle_y = bound((-1 * turn_limit),real_angle_y, turn_limit);
\r
668 self.angles_y = self.angles_y + real_angle_y;
\r
672 v_forward = normalize(self.enemy.origin - self.origin);
\r
674 v_forward = normalize(self.goalcurrent.origin - self.origin);
\r
676 if(self.flags & FL_ONGROUND)
\r
678 if(s_speed > s_run)
\r
679 self.velocity = (v_forward * max((s_speed - s_decel),s_run));
\r
680 if(s_speed <= s_run)
\r
681 self.velocity = (v_forward * min((s_speed + s_accel2),s_run));
\r
685 if(self.flags & FL_ONGROUND)
\r
687 makevectors(self.angles);
\r
689 self.velocity = min(s_speed - s_decel,0) * v_forward;
\r
700 void walker_attack()
\r
704 //turret_do_updates(self);
\r
706 self.tur_head.frame = self.tur_head.frame + 1;
\r
708 sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", 1, ATTN_NORM);
\r
711 fireBullet (self.tur_shotorg_updated, self.tur_shotdir_updated,self.shot_spread, self.shot_dmg, self.shot_force, DEATH_TURRET, FALSE);
\r
713 te_smallflash(self.tur_shotorg_updated);
\r
715 if(!(self.uzi_bulletcounter & 3))
\r
718 trailparticles(self,particleeffectnum("EF_MGTURRETTRAIL"),self.tur_shotorg_updated,trace_endpos);
\r
719 // te_lightning1(self,self.tur_shotorg_updated,trace_endpos);
\r
721 setmodel(flash, "models/uziflash.md3"); // precision set below
\r
722 setattachment(flash, self.tur_head, "tag_fire");
\r
724 flash.think = W_Uzi_Flash_Go;
\r
725 flash.nextthink = time + 0.02;
\r
727 flash.angles_z = flash.v_angle_z + random() * 180;
\r
729 flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
\r
732 self.uzi_bulletcounter = self.uzi_bulletcounter + 1;
\r
735 void walker_respawnhook()
\r
738 self.origin = self.wkr_spawn.origin;
\r
739 self.wkr_props.solid = SOLID_BBOX;
\r
740 self.wkr_props.alpha = 1;
\r
742 self.angles = self.wkr_spawn.angles;
\r
743 vtmp = self.origin;
\r
744 vtmp_z +=self.wkr_spawn.origin_z + self.wkr_spawn.maxs_z;
\r
745 setorigin(self,vtmp);
\r
748 void walker_diehook()
\r
750 self.wkr_props.solid = SOLID_NOT;
\r
751 self.wkr_props.alpha = -1;
\r
754 //.string target_start;
\r
755 void turret_walker_dinit()
\r
759 if (self.netname == "") self.netname = "Walker Turret";
\r
761 if(self.target != "")
\r
763 e = find(world,targetname,self.target);
\r
766 bprint("Warning! initital waypoint for Walker does NOT exsist!\n");
\r
773 if(e.classname != "walker_checkpoint")
\r
774 dprint("Warning: not a walker path\n");
\r
776 self.goalcurrent = e;
\r
782 self.wkr_props = spawn();
\r
783 self.wkr_spawn = spawn();
\r
785 self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
\r
786 self.turrcaps_flags = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE | TFL_TURRCAPS_ROAM | TFL_TURRCAPS_LINKED;
\r
787 self.aim_flags = TFL_AIM_LEAD | TFL_AIM_ZEASE;
\r
789 self.turret_respawnhook = walker_respawnhook;
\r
790 self.turret_diehook = walker_diehook;
\r
792 self.ticrate = 0.05;
\r
793 if (turret_stdproc_init("walker_std") == 0)
\r
798 // self.scale = 1.5;
\r
799 //setsize(self,'38 38 55','-38 -38 1');
\r
801 self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
802 self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
\r
804 //self.flags = FL_CLIENT;
\r
805 self.iscreature = TRUE;
\r
806 self.movetype = MOVETYPE_WALK;
\r
807 self.solid = SOLID_SLIDEBOX;
\r
808 self.takedamage = DAMAGE_AIM;
\r
810 setmodel(self.wkr_props,"models/turrets/walker_props.md3");
\r
811 setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3");
\r
812 setorigin(self.wkr_spawn,self.origin);
\r
814 self.wkr_spawn.angles = self.angles;
\r
815 self.wkr_spawn.solid = SOLID_NOT;
\r
817 traceline(self.wkr_spawn.origin + '0 0 10', self.wkr_spawn.origin - '0 0 10000', MOVE_NOMONSTERS, self);
\r
818 setorigin(self.wkr_spawn,trace_endpos + '0 0 4');
\r
820 setmodel(self,"models/turrets/walker_body.md3");
\r
821 setmodel(self.tur_head,"models/turrets/walker_head_minigun.md3");
\r
823 setattachment(self.tur_head,self,"tag_head");
\r
824 setattachment(self.wkr_props,self,"tag_head");
\r
828 f = gettagindex(self.tur_head,"tag_fire");
\r
829 v = gettaginfo(self.tur_head,f);
\r
833 //setsize(self,self.maxs,self.mins);
\r
836 self.tur_shotorg = v;
\r
837 self.tur_aimorg = v;
\r
839 self.idle_aim = '0 0 0';
\r
841 // self.v_home = self.origin;
\r
843 self.turret_firecheckfunc = walker_firecheck;
\r
845 // Our fire routine
\r
846 self.turret_firefunc = walker_attack;
\r
848 self.turret_postthink = walker_postthink;
\r
853 void spawnfunc_turret_walker()
\r
855 precache_model ("models/turrets/walker_head_minigun.md3");
\r
856 precache_model ("models/turrets/walker_body.md3");
\r
857 precache_model ("models/turrets/walker_props.md3");
\r
858 precache_model ("models/turrets/walker_spawn.md3");
\r
859 precache_model ( "models/turrets/rocket.md3");
\r
861 self.think = turret_walker_dinit;
\r
862 self.nextthink = time + 0.5;
\r