3 .void (entity enty) th_use;
\r
4 void () MagnetMineTouch;
\r
6 void () RemoveMagnetMine;
\r
11 void () Tesla_Touch;
\r
13 void () Extractor_Idle;
\r
14 void () Extractor_Die;
\r
15 void (entity enty) Engineer_UseExtractor;
\r
17 void() SUB_NULL = {};
\r
20 void (entity bld) CheckBelowBuilding;
\r
21 void (entity gunhead) CheckSentry;
\r
22 void () Sentry_Rotate;
\r
23 float () Sentry_FindTarget;
\r
24 void () Sentry_FoundTarget;
\r
25 void () Sentry_HuntTarget;
\r
26 void () Sentry_Pain;
\r
29 void EngineerSpecial()
\r
31 if (self.current_menu == MENU_ENGINEER_BUILD)
\r
38 self.current_menu = MENU_ENGINEER_BUILD;
\r
41 // sprint(self, "Not done yet\n");
\r
42 // this is gonna contain build menu eventually
\r
45 /*==========================
\r
46 TF Engineer Build Function
\r
47 =========================*/
\r
48 void(entity gunhead) CheckSentry =
\r
51 local entity gunbase;
\r
52 gunbase = gunhead.trigger_field;
\r
53 dist = gunbase.origin - gunhead.origin;
\r
54 if (vlen(dist) > 15)
\r
56 bprint(self.real_owner.netname);
\r
57 bprint("'s sentry gun malfunctioned\n");
\r
62 void () TeamFortress_EngineerBuild =
\r
66 if ((self.is_building == 0))
\r
68 // if ((((self.ammo_cells < 100) && (self.has_dispenser == 0)) && (self.has_sentry == 0)))
\r
70 // CenterPrint (self, "You don't have enough metal to \nbuild anything.\n\n");
\r
73 self.current_menu = 15;
\r
74 self.menu_count = 25;
\r
78 if ((self.is_building == 1))
\r
80 sprint (self, "You stop building.\n");
\r
82 if (self.weaponentity.pos1 != '0 0 0')
\r
84 self.reload_time = time;
\r
85 self.weaponentity.pos1 = '0 0 0';
\r
86 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;
\r
90 self.tfstate = (self.tfstate - (self.tfstate & 65536));
\r
91 TeamFortress_SetSpeed (self);
\r
92 te = find (world, netname, "build_timer");
\r
95 if ((te.owner == self))
\r
102 te = find (te, netname, "build_timer");
\r
105 self.is_building = 0;
\r
106 // self.current_weapon = self.weapon; // add function to make weapon disappear?
\r
107 W_SetCurrentAmmo ();
\r
112 float(entity obj, entity builder) CheckArea =
\r
117 pos = pointcontents(obj.origin);
\r
118 if (pos == -2 || pos == -6)
\r
122 src_x = obj.origin_x + obj.maxs_x + 16;
\r
123 src_y = obj.origin_y + obj.maxs_y + 16;
\r
124 src_z = obj.origin_z + obj.maxs_z + 16;
\r
125 pos = pointcontents(src);
\r
126 if (pos == -2 || pos == -6)
\r
130 end_x = obj.origin_x + obj.mins_x - 16;
\r
131 end_y = obj.origin_y + obj.mins_y - 16;
\r
132 end_z = obj.origin_z + obj.mins_z - 16;
\r
133 traceline(src, end, 1, obj);
\r
134 if (trace_fraction != 1)
\r
138 pos = pointcontents(end);
\r
139 if (pos == -2 || pos == -6)
\r
143 src_x = obj.origin_x + obj.mins_x - 16;
\r
144 src_y = obj.origin_y + obj.maxs_y + 16;
\r
145 src_z = obj.origin_z + obj.maxs_z + 16;
\r
146 pos = pointcontents(src);
\r
147 if (pos == -2 || pos == -6)
\r
151 end_x = obj.origin_x + obj.maxs_x + 16;
\r
152 end_y = obj.origin_y + obj.mins_y - 16;
\r
153 end_z = obj.origin_z + obj.mins_z - 16;
\r
154 traceline(src, end, 1, obj);
\r
155 if (trace_fraction != 1)
\r
159 pos = pointcontents(end);
\r
160 if (pos == -2 || pos == -6)
\r
164 traceline(builder.origin, obj.origin, 1, builder);
\r
165 if (trace_fraction != 1)
\r
172 void(float objtobuild) TeamFortress_Build =
\r
174 if (self.is_building == 1) { // double-checks incase someone uses code with TeamFortress_EngineerBuild(number)
\r
175 TeamFortress_EngineerBuild();
\r
178 if ((self.reload_time + .25) > time) {
\r
179 sprint(self, "You cant build while reloading.\n");
\r
187 makevectors(self.v_angle);
\r
189 v_forward = normalize(v_forward) * 64;
\r
190 newmis.origin = self.origin + v_forward;
\r
191 if (objtobuild == 1)
\r
193 if (self.has_dispenser)
\r
195 sprint(self, "You can only have one dispenser.\nTry dismantling your old one.\n");
\r
198 tmp1 = '-16 -16 0';
\r
200 newmis.mdl = "progs/dispencr.mdl";
\r
201 newmis.netname = "dispenser";
\r
206 if (objtobuild == 2)
\r
208 if (self.has_sentry)
\r
210 sprint(self, "You can only have one sentry gun.\nTry dismantling your old one.\n");
\r
213 tmp1 = '-16 -16 0';
\r
215 // newmis.mdl = "progs/turrbase.mdl";
\r
216 newmis.mdl = "models/sentry/turr1_base.md3";
\r
217 // newmis.scale = .75;
\r
218 newmis.netname = "sentrygun";
\r
219 // btime = time + 5;
\r
222 if ((objtobuild == 3))
\r
224 if (self.has_tesla)
\r
226 sprint (self, "You can only have one tesla gun\n");
\r
229 tmp1 = '-16 -16 0';
\r
231 newmis.mdl = "models/engineer/tesla/tesla.md3";
\r
232 newmis.scale = .70; //temp -- morphed's models too freaking huge :x
\r
234 newmis.netname = "tesla";
\r
235 btime = (time + 6);
\r
238 if (objtobuild == 5)
\r
240 if (self.has_teleporter >= 2)
\r
242 sprint(self, "You can only have 2 teleporters.\nTry dismantling an old one.\n");
\r
246 tmp1 = '-16 -16 0';
\r
248 newmis.mdl = "progs/telepad.mdl";
\r
249 newmis.netname = "teleporter";
\r
253 if (objtobuild == 6)
\r
255 if (self.has_extractor >= 3)
\r
257 sprint(self, "You can only have 3 metal extractors.\nTry dismantling an old one.\n");
\r
261 //check if it's near another allied extractor unit
\r
262 local entity isnearextractor;
\r
263 isnearextractor = findradius (newmis.origin, BUILDING_EXTRACTOR_CHECKRADIUS);
\r
264 while (isnearextractor)
\r
266 if (isnearextractor.classname == "building_extractor" && isnearextractor.team_no == self.team_no)
\r
268 sprint (self, "You cannot build so close to another extractor.\n");
\r
272 isnearextractor = isnearextractor.chain;
\r
275 tmp1 = '-16 -16 0';
\r
277 newmis.mdl = "models/engineer/metal_extractor/power.md3";
\r
278 //newmis.mdl = "progs/extractor.md3";
\r
279 newmis.netname = "extractor";
\r
285 if (CheckArea(newmis, self) == 0)
\r
287 sprint(self, "Not enough room to build here\n");
\r
291 self.is_building = 1;
\r
292 self.immune_to_check = time + 10;
\r
293 // self.maxspeed = 0; // make sure player cant move
\r
294 self.tfstate = self.tfstate | 65536;
\r
295 /* self.weapon = self.current_weapon; // get rid of player's weapon model
\r
296 self.current_weapon = 0;
\r
297 self.weaponmodel = "";
\r
298 self.weaponframe = 0;*/
\r
299 // TeamFortress_SetSpeed(self); // hmm? player cant move?
\r
300 newmis.owner = self;
\r
301 newmis.classname = "timer";
\r
302 newmis.netname = "build_timer";
\r
303 newmis.nextthink = btime;
\r
304 newmis.think = TeamFortress_FinishedBuilding;
\r
305 newmis.colormap = self.colormap;
\r
306 newmis.weapon = objtobuild;
\r
307 newmis.angles_y = anglemod(self.angles_y + 180);
\r
308 newmis.velocity = '0 0 8';
\r
309 newmis.movetype = 6;
\r
311 newmis.alpha = .1; // slightly invisible
\r
312 self.effects = self.effects | EF_ADDITIVE;
\r
313 setmodel(newmis, newmis.mdl);
\r
314 setsize(newmis, tmp1, tmp2);
\r
315 setorigin(newmis, newmis.origin);
\r
316 newmis.flags = newmis.flags - (newmis.flags & 512);
\r
318 self.velocity = '0 0 0'; // stop player movement
\r
319 DoReload (5, (btime - time)); // Engineer build function shared with reload one
\r
320 // 5 is for building, btime minus time is for build time
\r
323 void(entity bld) CheckBelowBuilding =
\r
325 local vector below;
\r
326 below = bld.origin;
\r
327 if (bld.classname == "detpack")
\r
329 below_z = below_z - 8;
\r
333 below_z = below_z - 24;
\r
335 traceline(bld.origin, below, 1, bld);
\r
336 if (trace_fraction == 1)
\r
339 bld.flags = bld.flags - (bld.flags & 512);
\r
343 void () Tesla_Animate;
\r
344 void() TeamFortress_FinishedBuilding =
\r
346 local entity oldself;
\r
348 if (self.owner.is_building != 1)
\r
354 oldself.owner = world;
\r
355 oldself.real_owner = self;
\r
356 self.is_building = 0;
\r
357 self.tfstate = self.tfstate - (self.tfstate & 65536);
\r
358 self.current_weapon = self.weapon;
\r
359 self.StatusRefreshTime = time + 0.1;
\r
360 TeamFortress_SetSpeed(self);
\r
361 oldself.alpha = 1; // un-do see-through effect
\r
362 /* if (oldself.weapon == 1)
\r
364 self.has_dispenser = 1;
\r
365 sprint(self, "You finish building the dispenser.\n");
\r
366 teamsprint(self.team_no, self, self.netname);
\r
367 teamsprint(self.team_no, self, " has built a Dispenser.\n");
\r
368 self.ammo_cells = self.ammo_cells - 100;
\r
369 oldself.classname = "building_dispenser";
\r
370 oldself.netname = "dispenser";
\r
371 oldself.blocked = T_Dispenser;
\r
372 oldself.touch = T_Dispenser;
\r
373 oldself.max_health = 150;
\r
374 oldself.health = 150;
\r
375 oldself.think = DispenserThink;
\r
376 oldself.nextthink = time + 5;
\r
377 oldself.th_die = Dispenser_Die;
\r
378 oldself.mdl = "progs/dispencr.mdl";
\r
379 oldself.team_no = self.team_no;
\r
380 oldself.real_owner = self;
\r
381 oldself.colormap = self.colormap;
\r
382 oldself.takedamage = 2;
\r
383 oldself.owner = world;
\r
384 oldself.movetype = 6;
\r
385 oldself.velocity = '0 0 8';
\r
386 oldself.flags = oldself.flags - (oldself.flags & 512);
\r
387 oldself.ammo_shells = ceil(self.ammo_shells * 0.25);
\r
388 oldself.ammo_nails = ceil(self.ammo_nails * 0.25);
\r
389 oldself.ammo_rockets = ceil(self.ammo_rockets * 0.25);
\r
390 oldself.ammo_cells = ceil(self.ammo_cells * 0.25);
\r
391 oldself.armorvalue = ceil(self.armorvalue * 0.25);
\r
392 self.ammo_shells = ceil(self.ammo_shells * 0.75);
\r
393 self.ammo_nails = ceil(self.ammo_nails * 0.75);
\r
394 self.ammo_rockets = ceil(self.ammo_rockets * 0.75);
\r
395 self.ammo_cells = ceil(self.ammo_cells * 0.75);
\r
396 self.armorvalue = ceil(self.armorvalue * 0.75);
\r
398 setmodel(oldself, oldself.mdl);
\r
399 //setsize(oldself, '-8 -8 0', '8 8 24');gold. commented out.. plexi's idea :j
\r
400 setorigin(oldself, oldself.origin);
\r
404 if (oldself.weapon == 2)
\r
406 local entity barrel;
\r
408 // barrel.mdl = "models/sentry/turr1_base.md3";
\r
409 // barrel.mdl = "models/sentry/turr1_barrel.md3";
\r
410 // barrel.scale = .75;
\r
411 //barrel.solid = 2;
\r
413 // barrel.angles_x = barrel.angles_x - 70;
\r
415 // barrel.angles_z = barrel.angles_z - 90;
\r
416 /* barrel.angles_x = 0;
\r
417 barrel.angles_y = oldself.angles_y;
\r
418 barrel.angles_z = 0;*/
\r
419 // barrel.movetype = 4;
\r
420 // barrel.movetype = MOVETYPE_FOLL`OW;
\r
421 barrel.yaw_speed = 10;
\r
422 // barrel.angles_z = barrel.angles_z - 45;
\r
423 setmodel(barrel, "models/sentry/turr1_barrel.md3");
\r
424 // setsize(barrel, '-16 -16 0', '16 16 48'); // temp //'d
\r
425 // setorigin(barrel, oldself.origin + '0 0 8');
\r
426 setorigin(barrel, '0 0 0');
\r
429 self.has_sentry = 1;
\r
430 sprint(self, "You finish building the sentry gun.\n");
\r
431 teamsprint(self.team_no, self, self.netname);
\r
432 teamsprint(self.team_no, self, " has built a Sentry Gun.\n");
\r
433 oldself.classname = "building_sentrygun_base";
\r
434 oldself.netname = "sentry gun";
\r
435 oldself.takedamage = 0;
\r
436 oldself.th_die = Sentry_Die;
\r
437 self.ammo_cells = self.ammo_cells - 130;
\r
438 setsize(oldself, '-16 -16 0', '16 16 4');
\r
440 newmis.classname = "building_sentrygun";
\r
441 newmis.health = 150;
\r
442 newmis.max_health = newmis.health;
\r
444 newmis.th_die = Sentry_Die;
\r
445 newmis.th_pain = Sentry_Pain;
\r
446 // newmis.mdl = "progs/turrgun.mdl";
\r
447 newmis.mdl = "models/sentry/turr1_body.md3";
\r
448 // newmis.scale = .75;
\r
449 sound(oldself, 3, "weapons/tnkatck4.wav", 1, 1);
\r
451 setmodel(newmis, newmis.mdl);
\r
452 setsize(newmis, '-16 -16 0', '16 16 48');
\r
453 setorigin(newmis, oldself.origin + '0 0 8');
\r
454 newmis.real_owner = oldself.real_owner;
\r
455 newmis.trigger_field = oldself;
\r
456 oldself.oldenemy = newmis;
\r
457 newmis.movetype = 4;
\r
458 oldself.colormap = self.colormap;
\r
459 newmis.colormap = self.colormap;
\r
460 newmis.takedamage = 2;
\r
461 newmis.velocity = '0 0 -8';
\r
462 newmis.flags = newmis.flags - (newmis.flags & 512);
\r
463 oldself.flags = oldself.flags - (oldself.flags & 512);
\r
464 newmis.team_no = self.team_no;
\r
465 newmis.think = lvl1_sentry_stand;
\r
466 newmis.nextthink = time + 0.5;
\r
467 newmis.yaw_speed = 10;
\r
469 newmis.angles_x = 0;
\r
470 // newmis.angles_y = oldself.angles_y;
\r
471 newmis.angles_y = oldself.angles_y;
\r
472 newmis.angles_z = 0;
\r
473 newmis.waitmin = anglemod(newmis.angles_y - 50);
\r
474 newmis.waitmax = anglemod(newmis.angles_y + 50);
\r
475 if (newmis.waitmin > newmis.waitmax)
\r
477 newmis.waitmin = newmis.waitmax;
\r
478 newmis.waitmax = anglemod(newmis.angles_y - 50);
\r
480 newmis.ammo_shells = 25;
\r
481 newmis.maxammo_shells = 100;
\r
482 newmis.maxammo_rockets = 20;
\r
484 newmis.barrel_ent = barrel;
\r
486 // setattachment(newmis, oldself, "tag_base_body");
\r
487 setattachment(barrel, newmis, "tag_body_barrel");
\r
494 if ((oldself.weapon == 3))
\r
496 self.has_tesla = 1;
\r
497 sprint (self, "You finish building the tesla coil.\n");
\r
498 oldself.real_owner = self;
\r
499 teamsprint (self.team_no, self, self.netname);
\r
500 teamsprint (self.team_no, self, " has built a tesla.\n");
\r
501 sound (oldself, 3, "weapons/guerilla_set.wav", 1, 1);
\r
502 oldself.classname = "building_tesla";
\r
503 oldself.netname = "tesla";
\r
504 oldself.takedamage = 2;
\r
506 oldself.th_die = Tesla_Die;
\r
507 oldself.th_pain = Tesla_Pain;
\r
508 self.ammo_cells = (self.ammo_cells - 150);
\r
509 oldself.health = 200;
\r
510 oldself.movetype = 6;
\r
511 oldself.colormap = self.colormap;
\r
512 oldself.velocity = '0 0 -8';
\r
513 oldself.avelocity = '0 0 0';
\r
514 oldself.flags = (oldself.flags - (oldself.flags & 512));
\r
515 oldself.team_no = self.team_no;
\r
516 oldself.think = Tesla_Idle;
\r
517 oldself.nextthink = (time + 2);
\r
518 oldself.touch = Tesla_Touch;
\r
519 oldself.enemy = world;
\r
520 oldself.maxammo_shells = 0;
\r
521 oldself.maxammo_nails = 0;
\r
522 oldself.maxammo_rockets = 0;
\r
523 oldself.max_health = 100;
\r
524 oldself.ammo_cells = 50;
\r
525 oldself.tf_items = 0;
\r
526 /*if (!(self.weapons_carried & 8))
\r
528 oldself.ammo_shells = 2;
\r
529 oldself.ammo_nails = 2;
\r
530 oldself.ammo_rockets = 1;
\r
531 oldself.currentammo = 5;
\r
532 oldself.max_health = 200;
\r
533 oldself.ammo_cells = 120;
\r
535 oldself.currentammo = 0; // 6 Upgrades. (6 minus this number is pgrade count)
\r
536 oldself.health = oldself.max_health;
\r
537 oldself.waitmin = ((oldself.ammo_shells + 2) * (oldself.ammo_nails + 2));
\r
538 oldself.waitmax = 0;
\r
540 // The tesla animator -- till I learn to be a better coder ;)
\r
541 local entity tesanim;
\r
543 tesanim.owner = oldself;
\r
544 tesanim.think = Tesla_Animate;
\r
545 tesanim.nextthink = time;
\r
547 // TELEPAD 2 BEGIN*/
\r
548 /*if (oldself.weapon == 5)
\r
550 self.has_teleporter = (self.has_teleporter + 1);
\r
551 sprint (self, "You finish building the Teleporter Pad.\n");
\r
553 // teamprefixsprint(self.team_no,self); //- OfN
\r
555 teamsprint(self.team_no, self, self.netname);
\r
556 teamsprint(self.team_no, self, " has built a Teleporter Pad.\n");
\r
557 sound (oldself, 3, "weapons/guerset.wav", 1, 1);
\r
559 self.ammo_cells = self.ammo_cells - 90;
\r
561 // Create the teleporter
\r
562 oldself.classname = "building_teleporter";
\r
563 oldself.netname = "teleporter";
\r
564 // oldself.blocked = Teleporter_touch; // Actual touch function
\r
565 oldself.touch = Teleporter_touch;
\r
566 oldself.max_health = 300;
\r
567 oldself.health = 300;
\r
568 oldself.th_die = Teleporter_Die; // Death function
\r
569 oldself.mdl = "progs/telepad.mdl"; // Actual mdl
\r
570 oldself.team_no = self.team_no;
\r
571 oldself.maxammo_cells = 200; //CH Max of 20 teleports
\r
572 oldself.ammo_cells = 100; //CH start not at full
\r
574 oldself.real_owner = self; // The Engineer owns this item
\r
575 oldself.colormap = self.colormap; // Set the Color
\r
576 oldself.takedamage = 2;
\r
577 oldself.owner = world;
\r
578 oldself.movetype = 6;
\r
579 oldself.velocity = '0 0 8';
\r
580 oldself.flags = oldself.flags - (oldself.flags & 512);
\r
583 setmodel(oldself, oldself.mdl);
\r
584 setsize (oldself, '-16 -16 0', '16 16 4');
\r
585 setorigin(oldself, oldself.origin + '0 0 8'); //CH does jump
\r
587 oldself.heat = 4; //dont come on for 4 seconds
\r
588 oldself.think = Teleporter_heat_think;
\r
589 oldself.nextthink = time + 1;
\r
590 oldself.spawnflags = 4; //CH cause extensive checks for height
\r
592 oldself.is_malfunctioning = 0;
\r
593 oldself.all_active=0; // OfN - reset HACKER improvements
\r
597 if (oldself.weapon == 6) // metal extractor
\r
599 self.has_extractor = self.has_extractor + 1;
\r
600 sprint (self, "You finish building the metal extractor.\n");
\r
601 oldself.real_owner = self;
\r
602 teamsprint (self.team_no, self, self.netname);
\r
603 teamsprint (self.team_no, self, " has built a metal extractor.\n");
\r
604 sound (oldself, 3, "weapons/guerilla_set.wav", 1, 1);
\r
605 oldself.classname = "building_extractor";
\r
606 oldself.netname = "extractor";
\r
607 oldself.takedamage = 2;
\r
609 oldself.th_die = Extractor_Die;
\r
610 // oldself.th_pain = Extractor_Pain;
\r
611 self.ammo_cells = (self.ammo_cells - BUILDING_EXTRACTOR_NEEDCELLS);
\r
612 oldself.health = 200;
\r
613 oldself.movetype = 6;
\r
614 oldself.colormap = self.colormap;
\r
615 oldself.velocity = '0 0 -8';
\r
616 oldself.avelocity = '0 0 0';
\r
617 oldself.flags = (oldself.flags - (oldself.flags & 512));
\r
618 oldself.team_no = self.team_no;
\r
619 oldself.think = Extractor_Idle;
\r
620 oldself.nextthink = (time + 1);
\r
621 // oldself.touch = Extractor_Touch;
\r
622 oldself.enemy = world;
\r
623 oldself.max_health = 100;
\r
624 oldself.ammo_metal = 10;
\r
625 oldself.th_use = Engineer_UseExtractor;
\r
627 oldself.currentammo = 0; // 6 Upgrades. (6 minus this number is pgrade count)
\r
628 oldself.health = oldself.max_health;
\r
629 oldself.waitmin = ((oldself.ammo_shells + 2) * (oldself.ammo_nails + 2));
\r
630 oldself.waitmax = 0;
\r
632 // The metal extractor animator(?)
\r
633 // local entity tesanim;
\r
634 // tesanim = spawn();
\r
635 // tesanim.owner = oldself;
\r
636 // tesanim.think = Extractor_Animate;
\r
637 // tesanim.nextthink = time;
\r
640 W_SetCurrentAmmo();
\r
647 void () Drop_Magnetic_Mine =
\r
649 if (self.has_mine == 1)
\r
651 sprint (self, "Hey, one mine at a time!\n");
\r
658 item.team_no = self.team_no;
\r
660 item.classname = "drop1";
\r
661 item.origin = (self.origin - '0 0 -10');
\r
663 // item.angles_x = 360;
\r
665 item.angles_y = 45;
\r
668 item.solid = SOLID_TRIGGER;
\r
671 item.velocity = '0 0 1';
\r
672 setsize (item, '-1 -1 0', '1 1 6');
\r
674 item.nextthink = (time + 180);
\r
676 item.touch = MagnetMineTouch;
\r
677 setmodel (item, "models/magmine/magnetmine.md3");
\r
680 item.think = RemoveMagnetMine;
\r
682 item.pausetime = time + 2;
\r
684 sprint(self, "You set a Mag Mine!\n");
\r
687 void EngineerGrenade(float req)
\r
689 if(req == WR_GRENADE1)
\r
691 if(W_ThrowGrenade(W_ArmorGrenade))
\r
692 self.grenade_time = time + cvar("g_balance_grenade_armor_refire");
\r
694 else if(req == WR_GRENADE2)
\r
696 Drop_Magnetic_Mine();
\r
697 self.grenade_time = time + 2;
\r
701 void EngineerPreThink()
\r
705 void EngineerPostThink()
\r
709 void BecomeEngineer(float portion)
\r
711 self.max_health = cvar("g_balance_class_engineer_health") * portion;
\r
713 self.max_armor = cvar("g_balance_class_engineer_armor") * portion;
\r
715 self.mass = cvar("g_balance_class_engineer_mass");
\r
717 SetPlayerSpeed(self);
\r
719 self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;
\r
720 self.switchweapon = WEP2;
\r
721 self.ammo_shells = floor(20 * portion);
\r
722 self.ammo_nails = floor(20 * portion);
\r
723 self.ammo_rockets = floor(1 * portion);
\r
724 self.ammo_cells = floor(0 * portion);
\r
725 self.playerclass = TF_CLASS_ENGINEER; // TF P.C.
\r
726 SetMaxAmmoFor (32);
\r
730 void () RemoveMagnetMine =
\r
732 sprint (self.owner, "Your Mag Mine is gone...\n");
\r
733 self.owner.has_mine = 0;
\r
740 local entity theowner;
\r
743 theowner = self.owner;
\r
744 theowner.option5 = (theowner.option5 - .5);
\r
745 st = ftos (theowner.option5);
\r
746 // sound (theowner, 0, "ambient/100hzhum.wav", 1, 1); // find new wav! :o
\r
747 theowner.origin = self.origin;
\r
748 CenterPrint2 (theowner, "You are stuck on a mag mine!\n", st);
\r
749 if ((theowner.option5 < 2))
\r
751 theowner.option5 = 0;
\r
752 sprint (theowner.enemy, "Your Mag Mine died...\n");
\r
753 theowner.enemy.has_mine = 0;
\r
757 self.nextthink = (time + .5);
\r
760 void () MagMineActivate =
\r
762 if ((other.option == 0))
\r
764 self.owner.has_mine = 1;
\r
766 newmis.classname = "timer";
\r
767 newmis.netname = " FlashTimer";
\r
768 newmis.team_no = self.owner.team_no;
\r
769 newmis.owner = other;
\r
770 other.enemy = self.owner;
\r
771 newmis.think = MagTimer;
\r
772 newmis.nextthink = (time + 1);
\r
773 newmis.origin = other.origin;
\r
775 other.option5 = (floor ((other.armorvalue * .25)) + 3);
\r
776 if ((other.option5 > 15))
\r
778 other.option5 = 15;
\r
782 void () RemoveDudMine =
\r
787 void () MagnetMineTouch =
\r
789 local float isgood;
\r
790 local entity isnearplayer;
\r
792 isnearplayer = findradius (self.origin, 10);
\r
793 while (isnearplayer)
\r
795 if ((isnearplayer.classname == "player"))
\r
798 // bprint (isnearplayer.classname);
\r
802 isnearplayer = isnearplayer.chain;
\r
807 if ((self.pausetime > time))
\r
811 if ((other.classname != "player"))
\r
815 if ((other.health <= 0))
\r
819 // if ((other.is_undercover == 1)) //temp - add function!!
\r
823 if ((other.team_no == self.owner.team_no))
\r
827 if ((other.classname == "player"))
\r
829 MagMineActivate ();
\r
830 sprint (other, "You stepped on a Magnetic Mine! :(\n");
\r
831 sprint (self.owner, "Your Magnet Mine worked!\n");
\r
832 self.pausetime = (time + 5);
\r
834 self.touch = SUB_NULL;
\r
835 self.effects = EF_BRIGHTFIELD | EF_ADDITIVE;
\r
836 self.think = RemoveDudMine;
\r
837 self.nextthink = (time + 15);
\r
841 // Checks the distance between the player and the object
\r
842 void () CheckDistance =
\r
846 if (!(self.owner.building.classname == "building_tesla" && self.enemy.classname == "building_dispenser")) {
\r
847 if (self.owner.building != self.enemy)
\r
852 dist = self.enemy.origin - self.owner.origin;
\r
853 // if (vlen (dist) > 64)
\r
854 if (vlen (dist) > 84)
\r
856 CenterPrint (self.owner, "\n");
\r
857 self.owner.menu_count = 25;
\r
858 self.owner.current_menu = 1;
\r
859 self.owner.building = world;
\r
863 self.nextthink = (time + 0.3);
\r
867 void (entity gun) Engineer_UseTesla =
\r
869 local entity dist_checker;
\r
872 if ((gun.ammo_rockets == TF_FLARE_LIT))
\r
874 gun.maxammo_cells = 120;
\r
878 if ((gun.ammo_rockets == TF_FLARE_OFF))
\r
880 gun.maxammo_cells = 120;
\r
884 if ((gun.ammo_rockets == 2))
\r
886 gun.maxammo_cells = 200;
\r
890 if ((gun.ammo_rockets == 3))
\r
892 gun.maxammo_cells = 300;
\r
898 sprint(self, "Èåáìôè:");
\r
899 st = ftos(gun.health);
\r
902 st = ftos(gun.max_health);
\r
904 sprint(self, " Ãåììó:");
\r
905 st = ftos(gun.ammo_cells);
\r
908 st = ftos(gun.maxammo_cells);
\r
910 st = ftos ((6 - gun.currentammo));
\r
911 sprint(self, " Õðçòáäåó Ìåæô:");
\r
913 st = ftos ((6 - gun.currentammo));
\r
914 sprint (self, "\n");
\r
915 sprint(self, "Öïìôáçå:");
\r
916 st = ftos(gun.ammo_shells);
\r
918 sprint(self, " Áíðåòáçå:");
\r
919 st = ftos(gun.ammo_nails);
\r
921 sprint(self, " Ðï÷åò Óõððìù:");
\r
922 st = ftos(gun.ammo_rockets);
\r
924 sprint(self, "\n");
\r
927 if ((gun.tf_items & 2))
\r
929 sprint (self, "TeslaTurret(tm) ");
\r
931 if ((gun.tf_items & TF_FLARE_OFF))
\r
933 sprint (self, "Improved Targeter ");
\r
935 if ((gun.tf_items & 1024))
\r
937 sprint (self, "Spy Detector");
\r
939 sprint (self, "\n");
\r
941 self.current_menu = 18;
\r
942 self.menu_count = 25;
\r
943 self.building = gun;
\r
944 dist_checker = spawn ();
\r
945 dist_checker.classname = "timer";
\r
946 dist_checker.owner = self;
\r
947 dist_checker.enemy = gun;
\r
948 dist_checker.think = CheckDistance;
\r
949 dist_checker.nextthink = (time + 0.3);
\r
952 void () button_fire;
\r
953 // Engineer and Medic "USE" function -- called when user presses a key bound to +use
\r
954 // replaces using wrench on sentry gun and buiaxe to heal.
\r
955 void () Use_Function =
\r
957 if (self.impulse_wait > time) // So when the player holds down the use button it doesnt spam sprints
\r
959 self.impulse_wait = time + .5; // shared with gui menu .impulse_wait
\r
961 local vector source;
\r
965 makevectors (self.v_angle);
\r
966 source = (self.origin + '0 0 16');
\r
967 traceline (source, (source + (v_forward * 64)), 0, self);
\r
968 if ((trace_fraction == 1))
\r
972 org = (trace_endpos - (v_forward * 4));
\r
973 if ((trace_ent.goal_activation & 8))
\r
975 if (Activated (trace_ent, self))
\r
977 DoResults (trace_ent, self, 1);
\r
978 if ((trace_ent.classname == "func_button"))
\r
980 trace_ent.enemy = self;
\r
983 self.dont_do_triggerwork = 1;
\r
990 if ((trace_ent.else_goal != 0))
\r
992 te = Findgoal (trace_ent.else_goal);
\r
995 DoResults (te, self, (trace_ent.goal_result & 2));
\r
1000 sound (self, 1, "player/axhit2.wav", 1, 1);
\r
1001 WriteByte (4, 23);
\r
1004 WriteCoord (4, org_x);
\r
1005 WriteCoord (4, org_y);
\r
1006 WriteCoord (4, org_z);
\r
1011 // if (trace_ent.takedamage)
\r
1012 if (trace_ent.th_use)
\r
1014 trace_ent.th_use(trace_ent);
\r
1018 if (trace_ent.classname != "player")
\r
1020 if ((trace_ent.classname == "building_dispenser"))
\r
1022 //Engineer_UseDispenser (trace_ent);
\r
1027 if ((trace_ent.classname == "building_sentrygun"))
\r
1029 //Engineer_UseSentryGun (trace_ent);
\r
1034 if ((trace_ent.classname == "building_sentrygun_base"))
\r
1036 if (trace_ent.oldenemy)
\r
1038 //Engineer_UseSentryGun (trace_ent.oldenemy);
\r
1044 if ((trace_ent.classname == "building_tesla"))
\r
1046 Engineer_UseTesla (trace_ent);
\r