]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/engineer.c
- Spring cleaning! Cleaned up a lot of FTE warnings regarding unused locals
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / engineer.c
1 .float option;\r
2 .float has_mine;\r
3 void () MagnetMineTouch;\r
4 void () MagTimer;\r
5 void () RemoveMagnetMine;\r
6 //tesla\r
7 void () Tesla_Die;\r
8 void () Tesla_Pain;\r
9 void () Tesla_Idle;\r
10 void () Tesla_Touch;\r
11 \r
12 void() SUB_NULL = {};\r
13 \r
14 //temp\r
15 void (entity bld) CheckBelowBuilding;\r
16 void (entity gunhead) CheckSentry;\r
17 void () Sentry_Rotate;\r
18 float () Sentry_FindTarget;\r
19 void () Sentry_FoundTarget;\r
20 void () Sentry_HuntTarget;\r
21 void () Sentry_Pain;\r
22 void () Sentry_Die;\r
23 \r
24 void EngineerSpecial()\r
25 {\r
26         //      sprint(self, "Not done yet\n"); \r
27         // this is gonna contain build menu eventually\r
28 };\r
29 \r
30 /*==========================\r
31  TF Engineer Build Function\r
32  =========================*/\r
33 void(entity gunhead) CheckSentry = \r
34 {\r
35         local vector dist;\r
36         local entity gunbase;\r
37         gunbase = gunhead.trigger_field;\r
38         dist = gunbase.origin - gunhead.origin;\r
39         if (vlen(dist) > 15)\r
40         {\r
41                 bprint(self.real_owner.netname);\r
42                 bprint("'s sentry gun malfunctioned\n");\r
43                 Sentry_Die();\r
44         }\r
45 };\r
46 \r
47 void () TeamFortress_EngineerBuild =\r
48 {\r
49         local entity te;\r
50 \r
51         if ((self.is_building == 0))\r
52         {\r
53 //              if ((((self.ammo_cells < 100) && (self.has_dispenser == 0)) && (self.has_sentry == 0)))\r
54 //              {\r
55 //                      CenterPrint (self, "You don't have enough metal to \nbuild anything.\n\n");\r
56 //                      return;\r
57 //              }\r
58                 self.current_menu = 15;\r
59                 self.menu_count = 25;\r
60         }\r
61         else\r
62         {\r
63                 if ((self.is_building == 1))\r
64                 {\r
65                         sprint (self, "You stop building.\n");\r
66 \r
67                         if (self.weaponentity.pos1 != '0 0 0')\r
68                         {\r
69                                 self.reload_time = time;\r
70                                 self.weaponentity.pos1 = '0 0 0';\r
71                                 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
72                         }\r
73 \r
74                         self.pausetime = 0;\r
75                         self.tfstate = (self.tfstate - (self.tfstate & 65536));\r
76                         TeamFortress_SetSpeed (self);\r
77                         te = find (world, netname, "build_timer");\r
78                         while (te)\r
79                         {\r
80                                 if ((te.owner == self))\r
81                                 {\r
82                                         dremove (te);\r
83                                         te = world;\r
84                                 }\r
85                                 else\r
86                                 {\r
87                                         te = find (te, netname, "build_timer");\r
88                                 }\r
89                         }\r
90                         self.is_building = 0;\r
91 //                      self.current_weapon = self.weapon;              // add function to make weapon disappear?\r
92                         W_SetCurrentAmmo ();\r
93                 }\r
94         }\r
95 };\r
96 \r
97 float(entity obj, entity builder) CheckArea = \r
98 {\r
99         local vector src;\r
100         local vector end;\r
101         local float pos;\r
102         pos = pointcontents(obj.origin);\r
103         if (pos == -2 || pos == -6)\r
104         {\r
105                 return 0;\r
106         }\r
107         src_x = obj.origin_x + obj.maxs_x + 16;\r
108         src_y = obj.origin_y + obj.maxs_y + 16;\r
109         src_z = obj.origin_z + obj.maxs_z + 16;\r
110         pos = pointcontents(src);\r
111         if (pos == -2 || pos == -6)\r
112         {\r
113                 return 0;\r
114         }\r
115         end_x = obj.origin_x + obj.mins_x - 16;\r
116         end_y = obj.origin_y + obj.mins_y - 16;\r
117         end_z = obj.origin_z + obj.mins_z - 16;\r
118         traceline(src, end, 1, obj);\r
119         if (trace_fraction != 1)\r
120         {\r
121                 return 0;\r
122         }\r
123         pos = pointcontents(end);\r
124         if (pos == -2 || pos == -6)\r
125         {\r
126                 return 0;\r
127         }\r
128         src_x = obj.origin_x + obj.mins_x - 16;\r
129         src_y = obj.origin_y + obj.maxs_y + 16;\r
130         src_z = obj.origin_z + obj.maxs_z + 16;\r
131         pos = pointcontents(src);\r
132         if (pos == -2 || pos == -6)\r
133         {\r
134                 return 0;\r
135         }\r
136         end_x = obj.origin_x + obj.maxs_x + 16;\r
137         end_y = obj.origin_y + obj.mins_y - 16;\r
138         end_z = obj.origin_z + obj.mins_z - 16;\r
139         traceline(src, end, 1, obj);\r
140         if (trace_fraction != 1)\r
141         {\r
142                 return 0;\r
143         }\r
144         pos = pointcontents(end);\r
145         if (pos == -2 || pos == -6)\r
146         {\r
147                 return 0;\r
148         }\r
149         traceline(builder.origin, obj.origin, 1, builder);\r
150         if (trace_fraction != 1)\r
151         {\r
152                 return 0;\r
153         }\r
154         return 1;\r
155 };\r
156 \r
157 void(float objtobuild) TeamFortress_Build = \r
158 {\r
159         if (self.is_building == 1) {    // double-checks incase someone uses code with TeamFortress_EngineerBuild(number)\r
160                 TeamFortress_EngineerBuild();\r
161                 return;\r
162         }\r
163         if ((self.reload_time + .25) > time) { \r
164                 sprint(self, "You cant build while reloading.\n");\r
165                 return; \r
166         }\r
167 \r
168         local float btime;\r
169         local vector tmp1;\r
170         local vector tmp2;\r
171         newmis = spawn();\r
172         makevectors(self.v_angle);\r
173         v_forward_z = 0;\r
174         v_forward = normalize(v_forward) * 64;\r
175         newmis.origin = self.origin + v_forward;\r
176         if (objtobuild == 1)\r
177         {\r
178                 if (self.has_dispenser)\r
179                 {\r
180                         sprint(self, "You can only have one dispenser.\nTry dismantling your old one.\n");\r
181                         return;\r
182                 }\r
183                 tmp1 = '-16 -16 0';\r
184                 tmp2 = '16 16 24';\r
185                 newmis.mdl = "progs/dispencr.mdl";\r
186                 newmis.netname = "dispenser";\r
187                 btime = time + 2;\r
188         }\r
189         else\r
190         {\r
191                 if (objtobuild == 2)\r
192                 {\r
193                         if (self.has_sentry)\r
194                         {\r
195                                 sprint(self, "You can only have one sentry gun.\nTry dismantling your old one.\n");\r
196                                 return;\r
197                         }\r
198                         tmp1 = '-16 -16 0';\r
199                         tmp2 = '16 16 48';\r
200 //                      newmis.mdl = "progs/turrbase.mdl";\r
201                         newmis.mdl = "models/sentry/turr1_base.md3";\r
202 //                      newmis.scale = .75;\r
203                         newmis.netname = "sentrygun";\r
204 //                      btime = time + 5;\r
205                         btime = .1;\r
206                 }\r
207                 if ((objtobuild == 3))\r
208                 {\r
209                         if (self.has_tesla)\r
210                         {\r
211                                 sprint (self, "You can only have one tesla gun\n");\r
212                                 return;\r
213                         }\r
214                         tmp1 = '-16 -16 0';\r
215                         tmp2 = '16 16 48';\r
216                         newmis.mdl = "models/engineer/tesla/tesla.md3";\r
217                         newmis.scale = .70;                     //temp -- morphed's models too freaking huge :x\r
218 \r
219                         newmis.netname = "tesla";\r
220                         btime = (time + 6);\r
221                 }\r
222 // Begin telepad 1\r
223                 if (objtobuild == 5)\r
224                 {\r
225                         if (self.has_teleporter >= 2)\r
226                         {\r
227                                 sprint(self, "You can only have 2 teleporters.\nTry dismantling an old one.\n");\r
228                  dremove(newmis);\r
229                                 return;\r
230                         }\r
231                         tmp1 = '-16 -16 0';\r
232                         tmp2 = '16 16 4';\r
233                         newmis.mdl = "progs/telepad.mdl";\r
234                         newmis.netname = "teleporter";\r
235         \r
236                         btime = time + 3;\r
237                 }\r
238 // End telepad 1\r
239         }\r
240         if (CheckArea(newmis, self) == 0)\r
241         {\r
242                 sprint(self, "Not enough room to build here\n");\r
243                 dremove(newmis);\r
244                 return;\r
245         }\r
246         self.is_building = 1;\r
247         self.immune_to_check = time + 10;\r
248 //      self.maxspeed = 0;                      // make sure player cant move\r
249         self.tfstate = self.tfstate | 65536;\r
250 /*      self.weapon = self.current_weapon;              // get rid of player's weapon model\r
251         self.current_weapon = 0;\r
252         self.weaponmodel = "";\r
253         self.weaponframe = 0;*/\r
254 //      TeamFortress_SetSpeed(self);                    // hmm? player cant move?\r
255         newmis.owner = self;\r
256         newmis.classname = "timer";\r
257         newmis.netname = "build_timer";\r
258         newmis.nextthink = btime;\r
259         newmis.think = TeamFortress_FinishedBuilding;\r
260         newmis.colormap = self.colormap;\r
261         newmis.weapon = objtobuild;\r
262         newmis.angles_y = anglemod(self.angles_y + 180);\r
263         newmis.velocity = '0 0 8';\r
264         newmis.movetype = 6;\r
265         newmis.solid = 2;\r
266         setmodel(newmis, newmis.mdl);\r
267         setsize(newmis, tmp1, tmp2);\r
268         setorigin(newmis, newmis.origin);\r
269         newmis.flags = newmis.flags - (newmis.flags & 512);\r
270 \r
271         self.velocity = '0 0 0';                // stop player movement\r
272         DoReload (5, (btime - time));           // Engineer build function shared with reload one\r
273                                                                                 // 5 is for building, btime minus time is for build time\r
274 };\r
275 \r
276 void(entity bld) CheckBelowBuilding = \r
277 {\r
278         local vector below;\r
279         below = bld.origin;\r
280         if (bld.classname == "detpack")\r
281         {\r
282                 below_z = below_z - 8;\r
283         }\r
284         else\r
285         {\r
286                 below_z = below_z - 24;\r
287         }\r
288         traceline(bld.origin, below, 1, bld);\r
289         if (trace_fraction == 1)\r
290         {\r
291                 bld.movetype = 6;\r
292                 bld.flags = bld.flags - (bld.flags & 512);\r
293         }\r
294 };\r
295 \r
296 void () Tesla_Animate;\r
297 void() TeamFortress_FinishedBuilding = \r
298 {\r
299         local entity oldself;\r
300 \r
301         if (self.owner.is_building != 1)\r
302         {\r
303                 return;\r
304         }\r
305         oldself = self;\r
306         self = self.owner;\r
307         oldself.owner = world;\r
308         oldself.real_owner = self;\r
309         self.is_building = 0;\r
310         self.tfstate = self.tfstate - (self.tfstate & 65536);\r
311         self.current_weapon = self.weapon;\r
312         self.StatusRefreshTime = time + 0.1;\r
313         TeamFortress_SetSpeed(self);\r
314 /*      if (oldself.weapon == 1)\r
315         {\r
316                 self.has_dispenser = 1;\r
317                 sprint(self, "You finish building the dispenser.\n");\r
318                 teamsprint(self.team_no, self, self.netname);\r
319                 teamsprint(self.team_no, self, " has built a Dispenser.\n");\r
320                 self.ammo_cells = self.ammo_cells - 100;\r
321                 oldself.classname = "building_dispenser";\r
322                 oldself.netname = "dispenser";\r
323                 oldself.blocked = T_Dispenser;\r
324                 oldself.touch = T_Dispenser;\r
325                 oldself.max_health = 150;\r
326                 oldself.health = 150;\r
327                 oldself.think = DispenserThink;\r
328                 oldself.nextthink = time + 5;\r
329                 oldself.th_die = Dispenser_Die;\r
330                 oldself.mdl = "progs/dispencr.mdl";\r
331                 oldself.team_no = self.team_no;\r
332                 oldself.real_owner = self;\r
333                 oldself.colormap = self.colormap;\r
334                 oldself.takedamage = 2;\r
335                 oldself.owner = world;\r
336                 oldself.movetype = 6;\r
337                 oldself.velocity = '0 0 8';\r
338                 oldself.flags = oldself.flags - (oldself.flags & 512);\r
339                 oldself.ammo_shells = ceil(self.ammo_shells * 0.25);\r
340                 oldself.ammo_nails = ceil(self.ammo_nails * 0.25);\r
341                 oldself.ammo_rockets = ceil(self.ammo_rockets * 0.25);\r
342                 oldself.ammo_cells = ceil(self.ammo_cells * 0.25);\r
343                 oldself.armorvalue = ceil(self.armorvalue * 0.25);\r
344                 self.ammo_shells = ceil(self.ammo_shells * 0.75);\r
345                 self.ammo_nails = ceil(self.ammo_nails * 0.75);\r
346                 self.ammo_rockets = ceil(self.ammo_rockets * 0.75);\r
347                 self.ammo_cells = ceil(self.ammo_cells * 0.75);\r
348                 self.armorvalue = ceil(self.armorvalue * 0.75);\r
349                 oldself.solid = 2;\r
350                 setmodel(oldself, oldself.mdl);\r
351                 //setsize(oldself, '-8 -8 0', '8 8 24');gold. commented out.. plexi's idea :j\r
352                 setorigin(oldself, oldself.origin);\r
353         }\r
354         else\r
355         {*/\r
356                 if (oldself.weapon == 2)\r
357                 {\r
358                         local entity barrel;\r
359                         barrel = spawn();\r
360 //                      barrel.mdl = "models/sentry/turr1_base.md3";\r
361 //                      barrel.mdl = "models/sentry/turr1_barrel.md3";\r
362 //                      barrel.scale = .75;\r
363                         //barrel.solid = 2;\r
364 \r
365 //                      barrel.angles_x = barrel.angles_x - 70;\r
366 \r
367 //                      barrel.angles_z = barrel.angles_z - 90;\r
368 /*                      barrel.angles_x = 0;\r
369                         barrel.angles_y = oldself.angles_y;\r
370                         barrel.angles_z = 0;*/\r
371 //                      barrel.movetype = 4;\r
372 //                      barrel.movetype = MOVETYPE_FOLL`OW;\r
373                         barrel.yaw_speed = 10;\r
374 //                      barrel.angles_z = barrel.angles_z - 45;\r
375                         setmodel(barrel, "models/sentry/turr1_barrel.md3");\r
376 //                      setsize(barrel, '-16 -16 0', '16 16 48');               // temp //'d\r
377 //                      setorigin(barrel, oldself.origin + '0 0 8');\r
378                         setorigin(barrel, '0 0 0');\r
379                         \r
380 \r
381                         self.has_sentry = 1;\r
382                         sprint(self, "You finish building the sentry gun.\n");\r
383                         teamsprint(self.team_no, self, self.netname);\r
384                         teamsprint(self.team_no, self, " has built a Sentry Gun.\n");\r
385                         oldself.classname = "building_sentrygun_base";\r
386                         oldself.netname = "sentry gun";\r
387                         oldself.takedamage = 0;\r
388                         oldself.th_die = Sentry_Die;\r
389                         self.ammo_cells = self.ammo_cells - 130;\r
390                         setsize(oldself, '-16 -16 0', '16 16 4');\r
391                         newmis = spawn();\r
392                         newmis.classname = "building_sentrygun";\r
393                         newmis.health = 150;\r
394                         newmis.max_health = newmis.health;\r
395                         newmis.weapon = 1;\r
396                         newmis.th_die = Sentry_Die;\r
397                         newmis.th_pain = Sentry_Pain;\r
398 //                      newmis.mdl = "progs/turrgun.mdl";\r
399                         newmis.mdl = "models/sentry/turr1_body.md3";\r
400 //                      newmis.scale = .75;\r
401                         sound(oldself, 3, "weapons/tnkatck4.wav", 1, 1);\r
402                         newmis.solid = 2;\r
403                         setmodel(newmis, newmis.mdl);\r
404                         setsize(newmis, '-16 -16 0', '16 16 48');\r
405                         setorigin(newmis, oldself.origin + '0 0 8');\r
406                         newmis.real_owner = oldself.real_owner;\r
407                         newmis.trigger_field = oldself;\r
408                         oldself.oldenemy = newmis;\r
409                         newmis.movetype = 4;\r
410                         oldself.colormap = self.colormap;\r
411                         newmis.colormap = self.colormap;\r
412                         newmis.takedamage = 2;\r
413                         newmis.velocity = '0 0 -8';\r
414                         newmis.flags = newmis.flags - (newmis.flags & 512);\r
415                         oldself.flags = oldself.flags - (oldself.flags & 512);\r
416                         newmis.team_no = self.team_no;\r
417                         newmis.think = lvl1_sentry_stand;\r
418                         newmis.nextthink = time + 0.5;\r
419                         newmis.yaw_speed = 10;\r
420                         newmis.heat = 0;\r
421                         newmis.angles_x = 0;\r
422 //                      newmis.angles_y = oldself.angles_y;\r
423                         newmis.angles_y = oldself.angles_y;\r
424                         newmis.angles_z = 0;\r
425                         newmis.waitmin = anglemod(newmis.angles_y - 50);\r
426                         newmis.waitmax = anglemod(newmis.angles_y + 50);\r
427                         if (newmis.waitmin > newmis.waitmax)\r
428                         {\r
429                                 newmis.waitmin = newmis.waitmax;\r
430                                 newmis.waitmax = anglemod(newmis.angles_y - 50);\r
431                         }\r
432                         newmis.ammo_shells = 25;\r
433                         newmis.maxammo_shells = 100;\r
434                         newmis.maxammo_rockets = 20;\r
435 \r
436                         newmis.barrel_ent = barrel;\r
437 \r
438 //                      setattachment(newmis, oldself, "tag_base_body");\r
439                         setattachment(barrel, newmis, "tag_body_barrel");\r
440 \r
441 \r
442                 }\r
443                 else\r
444                 {\r
445 //tesla\r
446                         if ((oldself.weapon == 3))\r
447                         {\r
448                                 self.has_tesla = 1;\r
449                                 sprint (self, "You finish building the tesla coil.\n");\r
450                                 oldself.real_owner = self;\r
451                                 teamsprint (self.team_no, self, self.netname);\r
452                                 teamsprint (self.team_no, self, " has built a tesla.\n");\r
453                                 sound (oldself, 3, "weapons/guerilla_set.wav", 1, 1);\r
454                                 oldself.classname = "building_tesla";\r
455                                 oldself.netname = "tesla";\r
456                                 oldself.takedamage = 2;\r
457                                 oldself.solid = 2;\r
458                                 oldself.th_die = Tesla_Die;\r
459                                 oldself.th_pain = Tesla_Pain;\r
460                                 self.ammo_cells = (self.ammo_cells - 150);\r
461                                 oldself.health = 200;\r
462                                 oldself.movetype = 6;\r
463                                 oldself.colormap = self.colormap;\r
464                                 oldself.velocity = '0 0 -8';\r
465                                 oldself.avelocity = '0 0 0';\r
466                                 oldself.flags = (oldself.flags - (oldself.flags & 512));\r
467                                 oldself.team_no = self.team_no;\r
468                                 oldself.think = Tesla_Idle;\r
469                                 oldself.nextthink = (time + 2);\r
470                                 oldself.touch = Tesla_Touch;\r
471                                 oldself.enemy = world;\r
472                                 oldself.maxammo_shells = 0;\r
473                                 oldself.maxammo_nails = 0;\r
474                                 oldself.maxammo_rockets = 0;\r
475                                 oldself.max_health = 100;\r
476                                 oldself.ammo_cells = 50;\r
477                                 oldself.tf_items = 0;\r
478                                 /*if (!(self.weapons_carried & 8))\r
479                                 {\r
480                                         oldself.ammo_shells = 2;\r
481                                         oldself.ammo_nails = 2;\r
482                                         oldself.ammo_rockets = 1;\r
483                                         oldself.currentammo = 5;\r
484                                         oldself.max_health = 200;\r
485                                         oldself.ammo_cells = 120;\r
486                                 }*/\r
487                                 oldself.currentammo = 0;                // 6 Upgrades. (6 minus this number is pgrade count)\r
488                                 oldself.health = oldself.max_health;\r
489                                 oldself.waitmin = ((oldself.ammo_shells + 2) * (oldself.ammo_nails + 2));\r
490                                 oldself.waitmax = 0;\r
491 \r
492                                 // The tesla animater -- till I learn to be a better coder ;)\r
493                                 local entity tesanim;\r
494                                 tesanim = spawn();\r
495                                 tesanim.owner = oldself;\r
496                                 tesanim.think = Tesla_Animate;\r
497                                 tesanim.nextthink = time;\r
498                         }\r
499 // TELEPAD 2 BEGIN*/ \r
500         /*if (oldself.weapon == 5)\r
501         {\r
502                 self.has_teleporter = (self.has_teleporter + 1);\r
503                 sprint (self, "You finish building the Teleporter Pad.\n");\r
504 \r
505 //        teamprefixsprint(self.team_no,self); //- OfN\r
506 \r
507         teamsprint(self.team_no, self, self.netname);\r
508                 teamsprint(self.team_no, self, " has built a Teleporter Pad.\n");\r
509                 sound (oldself, 3, "weapons/guerset.wav", 1, 1);\r
510 \r
511                 self.ammo_cells = self.ammo_cells - 90;\r
512 \r
513                 // Create the teleporter\r
514                 oldself.classname = "building_teleporter";\r
515                 oldself.netname = "teleporter";\r
516 //              oldself.blocked = Teleporter_touch;             // Actual touch function\r
517                 oldself.touch = Teleporter_touch;\r
518                 oldself.max_health = 300;\r
519                 oldself.health = 300;\r
520                 oldself.th_die = Teleporter_Die;                // Death function\r
521                 oldself.mdl = "progs/telepad.mdl";              // Actual mdl\r
522                 oldself.team_no = self.team_no;\r
523                 oldself.maxammo_cells = 200;    //CH Max of 20 teleports\r
524                 oldself.ammo_cells = 100;       //CH start not at full\r
525 \r
526                 oldself.real_owner = self;                      // The Engineer owns this item\r
527                 oldself.colormap = self.colormap;       // Set the Color\r
528                 oldself.takedamage = 2;\r
529                 oldself.owner = world;\r
530                 oldself.movetype = 6;\r
531                 oldself.velocity = '0 0 8';\r
532                 oldself.flags = oldself.flags - (oldself.flags & 512);\r
533 \r
534                 oldself.solid = 2;\r
535                 setmodel(oldself, oldself.mdl);\r
536                 setsize (oldself, '-16 -16 0', '16 16 4');\r
537                 setorigin(oldself, oldself.origin + '0 0 8'); //CH does jump\r
538 \r
539                 oldself.heat = 4; //dont come on for 4 seconds\r
540                 oldself.think = Teleporter_heat_think;\r
541                 oldself.nextthink = time + 1;\r
542                 oldself.spawnflags = 4; //CH cause extensive checks for height\r
543 \r
544                 oldself.is_malfunctioning = 0;\r
545                 oldself.all_active=0; // OfN - reset HACKER improvements\r
546                 }\r
547 // TELEPAD 2 END\r
548                 }*/\r
549         }\r
550         W_SetCurrentAmmo();\r
551 };\r
552 \r
553 \r
554 \r
555 \r
556 \r
557 void () Drop_Magnetic_Mine =\r
558 {\r
559         if (self.has_mine == 1)\r
560         {\r
561                 sprint (self, "Hey, one mine at a time!\n");\r
562                 return;\r
563         }\r
564 \r
565         local entity item;\r
566 \r
567         item = spawn ();\r
568         item.team_no = self.team_no;\r
569         item.owner = self;\r
570         item.classname = "drop1";\r
571         item.origin = (self.origin - '0 0 -10');\r
572 \r
573 //      item.angles_x = 360;\r
574 \r
575         item.angles_y = 45;\r
576         item.flags = 256;\r
577 //      item.solid = 2;\r
578         item.solid = SOLID_TRIGGER;\r
579         item.movetype = 6;\r
580 \r
581         item.velocity = '0 0 1';\r
582         setsize (item, '-1 -1 0', '1 1 6');\r
583 \r
584         item.nextthink = (time + 180);\r
585 \r
586         item.touch = MagnetMineTouch;\r
587         setmodel (item, "models/magmine/magnetmine.md3");\r
588         item.scale = .35;\r
589 \r
590         item.think = RemoveMagnetMine;\r
591 \r
592         item.pausetime = time + 2;\r
593         self.has_mine = 1;\r
594         sprint(self, "You set a Mag Mine!\n");\r
595 }\r
596 \r
597 void EngineerGrenade(float req)\r
598 {\r
599         if(req == WR_GRENADE1)\r
600         {\r
601                 if(W_ThrowGrenade(W_ArmorGrenade))\r
602                         self.grenade_time = time + cvar("g_balance_grenade_armor_refire");\r
603         }\r
604         else if(req == WR_GRENADE2)\r
605         {\r
606                 Drop_Magnetic_Mine();\r
607                 self.grenade_time = time + 2;\r
608         }\r
609 }\r
610 \r
611 void EngineerPreThink()\r
612 {\r
613 }\r
614 \r
615 void EngineerPostThink()\r
616 {\r
617 }\r
618 \r
619 void BecomeEngineer(float portion)\r
620 {\r
621         self.max_health = cvar("g_balance_class_engineer_health") * portion;\r
622 \r
623         self.max_armor = cvar("g_balance_class_engineer_armor") * portion;\r
624 \r
625         self.mass = cvar("g_balance_class_engineer_mass");\r
626 \r
627         SetPlayerSpeed(self);\r
628 \r
629         self.items = IT_WEP1 | IT_WEP2 | IT_WEP3 | IT_WEP4;\r
630         self.switchweapon = WEP2;\r
631         self.ammo_shells = floor(20 * portion);\r
632         self.ammo_nails = floor(20 * portion);\r
633         self.ammo_rockets = floor(1 * portion);\r
634         self.ammo_cells = floor(0 * portion);\r
635         self.playerclass = TF_CLASS_ENGINEER;           // TF P.C.\r
636         SetMaxAmmoFor (32);\r
637 }\r
638 \r
639 // Magnetic Mine\r
640 void () RemoveMagnetMine =\r
641 {\r
642         sprint (self.owner, "Your Mag Mine is gone...\n");\r
643         self.owner.has_mine = 0;\r
644         dremove (self);\r
645         return;\r
646 };\r
647 \r
648 void () MagTimer =\r
649 {\r
650         local entity theowner;\r
651         local string st;\r
652 \r
653         theowner = self.owner;\r
654         theowner.option5 = (theowner.option5 - .5);\r
655         st = ftos (theowner.option5);\r
656 //      sound (theowner, 0, "ambient/100hzhum.wav", 1, 1);              // find new wav! :o\r
657         theowner.origin = self.origin;\r
658         CenterPrint2 (theowner, "You are stuck on a mag mine!\n", st);\r
659         if ((theowner.option5 < 2))\r
660         {\r
661                 theowner.option5 = 0;\r
662                 sprint (theowner.enemy, "Your Mag Mine died...\n");\r
663                 theowner.enemy.has_mine = 0;\r
664                 remove (self);\r
665                 return;\r
666         }\r
667         self.nextthink = (time + .5);\r
668 };\r
669 \r
670 void () MagMineActivate =\r
671 {\r
672         if ((other.option == 0))\r
673         {\r
674                 self.owner.has_mine = 1;\r
675                 newmis = spawn ();\r
676                 newmis.classname = "timer";\r
677                 newmis.netname = " FlashTimer";\r
678                 newmis.team_no = self.owner.team_no;\r
679                 newmis.owner = other;\r
680                 other.enemy = self.owner;\r
681                 newmis.think = MagTimer;\r
682                 newmis.nextthink = (time + 1);\r
683                 newmis.origin = other.origin;\r
684         }\r
685         other.option5 = (floor ((other.armorvalue * .25)) + 3);\r
686         if ((other.option5 > 15))\r
687         {\r
688                 other.option5 = 15;\r
689         }\r
690 };\r
691 \r
692 void () RemoveDudMine =\r
693 {\r
694         dremove(self);\r
695 }\r
696 \r
697 void () MagnetMineTouch =\r
698 {\r
699         local float isgood;\r
700         local entity isnearplayer;\r
701         \r
702         isnearplayer = findradius (self.origin, 10);\r
703         while (isnearplayer)\r
704         {\r
705                 if ((isnearplayer.classname == "player"))\r
706                 {\r
707                         isgood = 1;\r
708 //                      bprint (isnearplayer.classname);\r
709 //                      bprint ("\n");\r
710 //                      return;\r
711                 }\r
712                 isnearplayer = isnearplayer.chain;\r
713         }\r
714         if (isgood != 1)\r
715                 return;\r
716 \r
717         if ((self.pausetime > time))\r
718         {\r
719                 return;\r
720         }\r
721         if ((other.classname != "player"))\r
722         {\r
723                 return;\r
724         }\r
725         if ((other.health <= 0))\r
726         {\r
727                 return;\r
728         }\r
729 //      if ((other.is_undercover == 1))         //temp  - add function!!\r
730 //      {\r
731 //              return;\r
732 //      }\r
733         if ((other.team_no == self.owner.team_no))\r
734         {\r
735                 return;\r
736         }\r
737         if ((other.classname == "player"))\r
738         {\r
739                 MagMineActivate ();\r
740                 sprint (other, "You stepped on a Magnetic Mine! :(\n");\r
741                 sprint (self.owner, "Your Magnet Mine worked!\n");\r
742                 self.pausetime = (time + 5);\r
743         }\r
744         self.touch = SUB_NULL;\r
745         self.effects = EF_BRIGHTFIELD | EF_ADDITIVE;\r
746         self.think = RemoveDudMine;\r
747         self.nextthink = (time + 15);\r
748 //      dremove (self);\r
749 };\r
750 \r
751 // Checks the distance between the player and the object\r
752 void () CheckDistance =\r
753 {\r
754         local vector dist;\r
755 \r
756         if (!(self.owner.building.classname == "building_tesla" && self.enemy.classname == "building_dispenser")) {\r
757         if (self.owner.building != self.enemy)\r
758         {\r
759                 dremove (self);\r
760                 return;\r
761         } }\r
762         dist = self.enemy.origin - self.owner.origin;\r
763 //      if (vlen (dist) > 64)\r
764         if (vlen (dist) > 84)\r
765         {\r
766                 CenterPrint (self.owner, "\n");\r
767                 self.owner.menu_count = 25;\r
768                 self.owner.current_menu = 1;\r
769                 self.owner.building = world;\r
770                 dremove (self);\r
771                 return;\r
772         }\r
773         self.nextthink = (time + 0.3);\r
774 };\r
775 \r
776 \r
777 void (entity gun) Engineer_UseTesla =\r
778 {\r
779         local entity dist_checker;\r
780         local string st;\r
781 \r
782                 if ((gun.ammo_rockets == TF_FLARE_LIT))\r
783                 {\r
784                         gun.maxammo_cells = 120;\r
785                 }\r
786                 else\r
787                 {\r
788                         if ((gun.ammo_rockets == TF_FLARE_OFF))\r
789                         {\r
790                                 gun.maxammo_cells = 120;\r
791                         }\r
792                         else\r
793                         {\r
794                                 if ((gun.ammo_rockets == 2))\r
795                                 {\r
796                                         gun.maxammo_cells = 200;\r
797                                 }\r
798                                 else\r
799                                 {\r
800                                         if ((gun.ammo_rockets == 3))\r
801                                         {\r
802                                                 gun.maxammo_cells = 300;\r
803                                         }\r
804                                 }\r
805                         }\r
806                 }\r
807 \r
808         sprint(self, "Èåáìôè:");\r
809         st = ftos(gun.health);\r
810         sprint(self, st);\r
811         sprint(self, "¯");\r
812         st = ftos(gun.max_health);\r
813         sprint(self, st);\r
814         sprint(self, " Ãåììó:");\r
815         st = ftos(gun.ammo_cells);\r
816         sprint(self, st);\r
817         sprint(self, "¯");\r
818         st = ftos(gun.maxammo_cells);\r
819         sprint(self, st);\r
820         st = ftos ((6 - gun.currentammo));\r
821         sprint(self, " Õðçòáäåó Ìåæô:");\r
822         sprint (self, st);\r
823         st = ftos ((6 - gun.currentammo));\r
824         sprint (self, "\n");\r
825         sprint(self, "Öïìôáçå:");\r
826         st = ftos(gun.ammo_shells);\r
827         sprint(self, st);\r
828         sprint(self, " Áíðåòáçå:");\r
829         st = ftos(gun.ammo_nails);\r
830         sprint(self, st);\r
831         sprint(self, " Ðï÷åò Óõððìù:");\r
832         st = ftos(gun.ammo_rockets);\r
833         sprint(self, st);\r
834         sprint(self, "\n");\r
835         if (gun.tf_items)\r
836         {\r
837                 if ((gun.tf_items & 2))\r
838                 {\r
839                         sprint (self, "TeslaTurret(tm) ");\r
840                 }\r
841                 if ((gun.tf_items & TF_FLARE_OFF))\r
842                 {\r
843                         sprint (self, "Improved Targeter ");\r
844                 }\r
845                 if ((gun.tf_items & 1024))\r
846                 {\r
847                         sprint (self, "Spy Detector");\r
848                 }\r
849                 sprint (self, "\n");\r
850         }\r
851         self.current_menu = 18;\r
852         self.menu_count = 25;\r
853         self.building = gun;\r
854         dist_checker = spawn ();\r
855         dist_checker.classname = "timer";\r
856         dist_checker.owner = self;\r
857         dist_checker.enemy = gun;\r
858         dist_checker.think = CheckDistance;\r
859         dist_checker.nextthink = (time + 0.3);\r
860 };\r
861 \r
862 void () button_fire;\r
863 // Engineer and Medic "USE" function -- called when user presses a key bound to +use\r
864 // replaces using wrench on sentry gun and buiaxe to heal.\r
865 void () Use_Function =\r
866 {\r
867         if (self.impulse_wait > time)   // So when the player holds down the use button it doesnt spam sprints\r
868                 return;\r
869         self.impulse_wait = time + .5;  // shared with gui menu .impulse_wait\r
870 \r
871         local vector source;\r
872         local vector org;\r
873         local entity te;\r
874 \r
875         makevectors (self.v_angle);\r
876         source = (self.origin + '0 0 16');\r
877         traceline (source, (source + (v_forward * 64)), 0, self);\r
878         if ((trace_fraction == 1))\r
879         {\r
880                 return;\r
881         }\r
882         org = (trace_endpos - (v_forward * 4));\r
883         if ((trace_ent.goal_activation & 8))\r
884         {\r
885                 if (Activated (trace_ent, self))\r
886                 {\r
887                         DoResults (trace_ent, self, 1);\r
888                         if ((trace_ent.classname == "func_button"))\r
889                         {\r
890                                 trace_ent.enemy = self;\r
891                                 other = self;\r
892                                 self = trace_ent;\r
893                                 self.dont_do_triggerwork = 1;\r
894                                 button_fire ();\r
895                                 self = other;\r
896                         }\r
897                 }\r
898                 else\r
899                 {\r
900                         if ((trace_ent.else_goal != 0))\r
901                         {\r
902                                 te = Findgoal (trace_ent.else_goal);\r
903                                 if (te)\r
904                                 {\r
905                                         DoResults (te, self, (trace_ent.goal_result & 2));\r
906                                 }\r
907                         }\r
908                         else\r
909                         {\r
910                                 sound (self, 1, "player/axhit2.wav", 1, 1);\r
911                                 WriteByte (4, 23);\r
912                                 WriteByte (4, 2);\r
913                                 WriteByte (4, 3);\r
914                                 WriteCoord (4, org_x);\r
915                                 WriteCoord (4, org_y);\r
916                                 WriteCoord (4, org_z);\r
917                         }\r
918                 }\r
919                 return;\r
920         }\r
921 //      if (trace_ent.takedamage)\r
922         if (trace_ent.classname != "player")\r
923         {\r
924                 if ((trace_ent.classname == "building_dispenser"))\r
925                 {\r
926                         //Engineer_UseDispenser (trace_ent);\r
927                         return;\r
928                 }\r
929                 else\r
930                 {\r
931                         if ((trace_ent.classname == "building_sentrygun"))\r
932                         {\r
933                                 //Engineer_UseSentryGun (trace_ent);\r
934                                 return;\r
935                         }\r
936                         else\r
937                         {\r
938                                 if ((trace_ent.classname == "building_sentrygun_base"))\r
939                                 {\r
940                                         if (trace_ent.oldenemy)\r
941                                         {\r
942                                                 //Engineer_UseSentryGun (trace_ent.oldenemy);\r
943                                         }\r
944                                         return;\r
945                                 }\r
946                                 else\r
947                                 {\r
948                                         if ((trace_ent.classname == "building_tesla"))\r
949                                         {\r
950                                                 Engineer_UseTesla (trace_ent);\r
951                                                 return;\r
952                                         }\r
953                                 }\r
954                         }\r
955                 }\r
956         }\r
957 };