1 void (entity bld) CheckBelowBuilding;
\r
2 void (entity gunhead) CheckSentry;
\r
3 void () Sentry_Rotate;
\r
4 float () Sentry_FindTarget;
\r
5 void () Sentry_FoundTarget;
\r
6 void () Sentry_HuntTarget;
\r
9 float () Sentry_Fire;
\r
10 void () Sentry_MuzzleFlash;
\r
11 void () lvl1_sentry_atk3;
\r
13 float(entity targ) tfvisible =
\r
17 spot1 = self.origin + '0 0 20' + self.view_ofs + '0 0 20';
\r
18 spot2 = targ.origin + targ.view_ofs;
\r
19 traceline(spot1, spot2, TF_FLARE_OFF, self);
\r
20 if (trace_inopen && trace_inwater)
\r
22 return TF_FLARE_LIT;
\r
24 if (trace_fraction == TF_FLARE_OFF)
\r
26 return TF_FLARE_OFF;
\r
28 return TF_FLARE_LIT;
\r
32 void () lvl1_sentry_stand = [ 0, lvl1_sentry_stand ]
\r
37 void () lvl1_sentry_atk1 = [ 1, lvl1_sentry_atk3 ]
\r
42 temp = vectoangles(self.enemy.origin - self.origin);
\r
43 self.barrel_ent.angles_x = -temp_x;
\r
45 if (((((self.enemy == world) || (self.enemy.health <= 0)) || !tfvisible (self.enemy)) || (self.enemy.has_disconnected == 1)))
\r
47 lvl1_sentry_stand ();
\r
51 if ((self.ammo_shells <= 0))
\r
53 lvl1_sentry_stand ();
\r
57 if ((Sentry_Fire () == 0))
\r
59 lvl1_sentry_atk3 ();
\r
65 void () lvl1_sentry_atk2 = [ 2, lvl1_sentry_atk3 ]
\r
71 void () lvl1_sentry_atk3 = [ 0, lvl1_sentry_atk1 ]
\r
75 void () lvl2_sentry_atk3;
\r
77 void () lvl2_sentry_stand = [ 3, lvl2_sentry_stand ]
\r
82 void () lvl2_sentry_atk1 = [ 4, lvl2_sentry_atk2 ]
\r
85 if (((((self.enemy == world) || (self.enemy.health <= 0)) || !tfvisible (self.enemy)) || (self.enemy.has_disconnected == 1)))
\r
87 lvl2_sentry_stand ();
\r
91 if ((self.ammo_shells <= 0))
\r
93 lvl2_sentry_stand ();
\r
97 if ((Sentry_Fire () == 0))
\r
99 lvl2_sentry_atk3 ();
\r
105 void () lvl2_sentry_atk2 = [ 5, lvl2_sentry_atk3 ]
\r
111 void () lvl2_sentry_atk3 = [ 3, lvl2_sentry_atk1 ]
\r
116 void () lvl3_sentry_atk3;
\r
118 void () lvl3_sentry_stand = [ 6, lvl3_sentry_stand ]
\r
123 void () lvl3_sentry_atk1 = [ 7, lvl3_sentry_atk2 ]
\r
126 if (((((self.enemy == world) || (self.enemy.health <= 0)) || !tfvisible (self.enemy)) || (self.enemy.has_disconnected == 1)))
\r
128 lvl3_sentry_stand ();
\r
132 if (((self.ammo_shells <= 0) && (self.ammo_rockets <= 0)))
\r
134 lvl3_sentry_stand ();
\r
138 if ((Sentry_Fire () == 0))
\r
140 lvl3_sentry_atk3 ();
\r
146 void () lvl3_sentry_atk2 = [ 8, lvl3_sentry_atk3 ]
\r
152 void () lvl3_sentry_atk3 = [ 6, lvl3_sentry_atk1 ]
\r
158 void () Sentry_Rotate =
\r
161 local entity gunhead;
\r
163 CheckSentry (self);
\r
164 if (Sentry_FindTarget ())
\r
168 if ((self.heat == 0))
\r
170 self.ideal_yaw = self.waitmin;
\r
172 ay = anglemod (self.angles_y);
\r
174 if ((ay == rint (self.waitmin)))
\r
176 CheckBelowBuilding (self.trigger_field);
\r
178 if ((random () < 0.1))
\r
180 sound (self, 3, "weapons/turridle.wav", 1, 1);
\r
186 self.ideal_yaw = self.waitmax;
\r
188 ay = anglemod (self.angles_y);
\r
190 if ((ay == rint (self.waitmax)))
\r
192 CheckBelowBuilding (self.trigger_field);
\r
197 /* local entity oldself;
\r
199 // self.barrel_ent.ideal_yaw = self.ideal_yaw;
\r
200 self = self.barrel_ent;
\r
201 self.ideal_yaw = anglemod(newmis.angles_z + 50);
\r
207 float () Sentry_FindTarget =
\r
209 local entity client;
\r
211 local float gotone;
\r
217 client = findradius (self.origin + '20 0 0', 480);
\r
218 while (((client != world) && (gotone != 1)))
\r
225 if ((client == self))
\r
229 if ((client.has_disconnected == 1))
\r
233 if (!client.takedamage)
\r
239 if (((client.team_no == self.team_no) && (self.team_no != 0)))
\r
243 // replace this with undercover as cloaking code
\r
244 if (((client.undercover_team == self.team_no) && (self.team_no != 0)))
\r
249 /* if ((client == self.real_owner))
\r
253 /* if (client.is_feigning) // we gonna add feigning?
\r
257 if ((client.flags & 128))
\r
261 if ((client.items & 524288))
\r
265 if (!tfvisible (client))
\r
269 r = range (client);
\r
276 if (((r == 2) && !infront (client)))
\r
283 client = client.chain;
\r
290 self.enemy = client;
\r
291 Sentry_FoundTarget ();
\r
295 void () Sentry_FoundTarget =
\r
297 if (((self.ammo_shells > 0) || ((self.ammo_rockets > 0) && (self.weapon == 3))))
\r
299 sound (self, 2, "weapons/turrspot.wav", 1, 1);
\r
301 Sentry_HuntTarget ();
\r
302 if ((self.super_damage_finished < time))
\r
304 self.super_damage_finished = (time + 0.5);
\r
308 void () Sentry_HuntTarget =
\r
310 self.goalentity = self.enemy;
\r
311 if ((self.weapon == 1))
\r
313 self.think = lvl1_sentry_atk1;
\r
317 if ((self.weapon == 2))
\r
319 self.think = lvl2_sentry_atk1;
\r
323 self.think = lvl3_sentry_atk1;
\r
326 self.ideal_yaw = vectoyaw ((self.enemy.origin - self.origin));
\r
329 temp = vectoangles(self.enemy.origin - self.origin);
\r
330 self.barrel_ent.angles_x = -temp_x;
\r
332 /* if (temp_x > 30)
\r
337 /*zchange = ((self.enemy.origin - self.barrel_ent.origin) * .1);
\r
340 self.barrel_ent.angles_x = 30;
\r
342 else if (zchange < 30)
\r
344 self.barrel_ent.angles_x = -30;
\r
348 self.barrel_ent.angles_x = zchange;
\r
351 //self.barrel_ent.angles_z = self.barrel_ent.ideal_yaw_z;
\r
353 // self.ideal_yaw = vectoyaw(self.enemy.origin - self.origin);
\r
354 // self.ideal_yaw = anglemod(self.ideal_yaw);
\r
356 self.nextthink = (time + 0.1);
\r
357 SUB_AttackFinished (1);
\r
360 void () Sentry_Pain =
\r
362 self.real_owner.StatusRefreshTime = (time + 0.2);
\r
365 void () Sentry_Explode =
\r
367 /* ThrowGib ("progs/tgib1.mdl", -70); // reokace with throw metal chunks code.
\r
368 ThrowGib ("progs/tgib2.mdl", -70);
\r
369 ThrowGib ("progs/tgib3.mdl", -70);*/
\r
370 if ((self.real_owner.has_disconnected != 1))
\r
373 T_RadiusDamage (self, self.real_owner, (75 + (self.ammo_rockets * 8)), self);
\r
375 if ((self.classname == "building_sentrygun_base"))
\r
379 dremove (self.oldenemy);
\r
384 dremove (self.trigger_field);
\r
388 WriteCoord (0, self.origin_x);
\r
389 WriteCoord (0, self.origin_y);
\r
390 WriteCoord (0, self.origin_z);
\r
391 BecomeExplosion ();
\r
394 void () Sentry_Die =
\r
396 sprint (self.real_owner, "Your sentry gun was destroyed.\n");
\r
397 self.real_owner.has_sentry = 0;
\r
398 self.think = Sentry_Explode;
\r
399 self.nextthink = (time + 0.1);
\r
402 void W_Sentry_Fire(vector org, vector vel, float damage)
\r
406 spike.enemy = self.owner;
\r
407 spike.owner = self;
\r
408 spike.classname = "spike";
\r
410 spike.movetype = MOVETYPE_FLY;
\r
411 spike.solid = SOLID_BBOX;
\r
412 setmodel(spike, "models/plasmatrail.mdl");
\r
413 setsize(spike, '0 0 0', '0 0 0');
\r
414 setorigin(spike, org);
\r
416 spike.dmg = damage;
\r
418 spike.nextthink = time + 3 + random()*0.5;
\r
419 spike.think = SUB_Remove;
\r
420 spike.touch = W_NailGrenade_Spike_Poke;
\r
421 spike.velocity = vel * 6;
\r
422 spike.angles = vectoangles (spike.velocity);
\r
423 spike.scale = 0.75;
\r
425 // setattachment(spike, self.barrel_ent, "tag_body_barrel");
\r
428 float () Sentry_Fire =
\r
430 self.ammo_shells = 50; //temp
\r
434 dir = (self.enemy.origin - self.origin);
\r
435 if ((((self.ideal_yaw - anglemod (self.angles_y)) < -10) || ((self.ideal_yaw - anglemod (self.angles_y)) > 10)))
\r
439 if ((((self.weapon == 3) && (self.ammo_rockets > 0)) && (self.super_damage_finished < time)))
\r
441 Sentry_MuzzleFlash ();
\r
442 sound (self, 1, "weapons/rocket1i.wav", 1, 1);
\r
444 newmis.owner = self;
\r
445 newmis.movetype = 9;
\r
447 newmis.velocity = (normalize ((self.enemy.origin - self.origin)) * 800);
\r
448 newmis.angles = vectoangles (newmis.velocity);
\r
449 newmis.weapon = 34;
\r
450 // newmis.touch = T_MissileTouch;
\r
451 newmis.touch = W_Rocket_Touch;
\r
452 newmis.nextthink = (time + 5);
\r
453 newmis.think = SUB_Remove;
\r
454 setmodel (newmis, "progs/missile.mdl");
\r
455 setsize (newmis, '0 0 0', '0 0 0');
\r
456 setorigin (newmis, ((self.origin + (v_forward * 8)) + '0 0 16'));
\r
457 self.super_damage_finished = (time + 3);
\r
458 self.ammo_rockets = (self.ammo_rockets - 1);
\r
459 if ((self.ammo_rockets == 10))
\r
461 sprint (self.real_owner, "Sentry Gun is low on rockets.\n");
\r
464 self.ammo_shells = (self.ammo_shells - 1);
\r
465 if ((self.ammo_shells < 0))
\r
467 self.ammo_shells = 0;
\r
470 Sentry_MuzzleFlash ();
\r
471 sound (self, 1, "weapons/sniper.wav", 1, 1);
\r
474 local float barrel_tag;
\r
475 local vector fire_from;
\r
477 barrel_tag = gettagindex (self.barrel_ent, "tag_barrel_bullet1");
\r
478 fire_from = gettaginfo (self.barrel_ent, barrel_tag);
\r
480 /* bprint (ftos(barrel_tag));
\r
482 bprint (vtos(fire_from));
\r
485 //fire_from = fire_from + v_forward + v_up + v_right;
\r
486 //void fireBullet (vector start, vector dir, float spread, float damage, float dtype, float tracer);
\r
487 //(entity targ, entity inflictor, entity attacker, float damage) T_Damage
\r
488 // fireBullet (fire_from, dir, .1, 2, 666, 1);
\r
489 // T_Damage(self.enemy, self, self, 4);
\r
490 // dir = (self.enemy.origin - fire_from);
\r
491 fire_from = fire_from + v_forward + v_up;
\r
493 W_Sentry_Fire(fire_from, dir, 4);
\r
495 // FireBullets (4, dir, '0.1 0.1 0');
\r
496 if (((self.ammo_shells == 0) && (random () < 0.1)))
\r
498 sprint (self.real_owner, "Sentry Gun is out of shells.\n");
\r
502 if ((self.ammo_shells == 20))
\r
504 sprint (self.real_owner, "Sentry Gun is low on shells.\n");
\r
507 if ((((self.ammo_rockets == 0) && (self.weapon == 3)) && (random () < 0.1)))
\r
509 sprint (self.real_owner, "Sentry Gun is out of rockets.\n");
\r
514 void () Sentry_MuzzleFlash =
\r
516 self.effects = (self.effects | 2);
\r