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