]> icculus.org git repositories - divverent/nexuiz.git/blob - attic/TeamNexuiz/game/gamec/engineer.c
now menu qc respects g_campaign_name
[divverent/nexuiz.git] / attic / 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 () Extractor_Die;\r
15 void (entity enty) Engineer_UseExtractor;\r
16 \r
17 void() SUB_NULL = {};\r
18 \r
19 //temp\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
27 void () Sentry_Die;\r
28 \r
29 void EngineerSpecial()\r
30 {\r
31         if (self.current_menu == MENU_ENGINEER_BUILD)\r
32         {\r
33                 ResetMenu ();\r
34         }\r
35         else\r
36         {\r
37                 ResetMenu ();\r
38                 self.current_menu = MENU_ENGINEER_BUILD;\r
39         }\r
40 \r
41         //      sprint(self, "Not done yet\n"); \r
42         // this is gonna contain build menu eventually\r
43 };\r
44 \r
45 /*==========================\r
46  TF Engineer Build Function\r
47  =========================*/\r
48 void(entity gunhead) CheckSentry = \r
49 {\r
50         local vector dist;\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
55         {\r
56                 bprint(self.real_owner.netname);\r
57                 bprint("'s sentry gun malfunctioned\n");\r
58                 Sentry_Die();\r
59         }\r
60 };\r
61 \r
62 void () TeamFortress_EngineerBuild =\r
63 {\r
64         local entity te;\r
65 \r
66         if ((self.is_building == 0))\r
67         {\r
68 //              if ((((self.ammo_cells < 100) && (self.has_dispenser == 0)) && (self.has_sentry == 0)))\r
69 //              {\r
70 //                      CenterPrint (self, "You don't have enough metal to \nbuild anything.\n\n");\r
71 //                      return;\r
72 //              }\r
73                 self.current_menu = 15;\r
74                 self.menu_count = 25;\r
75         }\r
76         else\r
77         {\r
78                 if ((self.is_building == 1))\r
79                 {\r
80                         sprint (self, "You stop building.\n");\r
81 \r
82                         if (self.weaponentity.pos1 != '0 0 0')\r
83                         {\r
84                                 self.reload_time = time;\r
85                                 self.weaponentity.pos1 = '0 0 0';\r
86                                 self.weaponentity.lip = PLAYER_WEAPONSELECTION_SPEED;\r
87                         }\r
88 \r
89                         self.pausetime = 0;\r
90                         self.tfstate = (self.tfstate - (self.tfstate & 65536));\r
91                         TeamFortress_SetSpeed (self);\r
92                         te = find (world, netname, "build_timer");\r
93                         while (te)\r
94                         {\r
95                                 if ((te.owner == self))\r
96                                 {\r
97                                         dremove (te);\r
98                                         te = world;\r
99                                 }\r
100                                 else\r
101                                 {\r
102                                         te = find (te, netname, "build_timer");\r
103                                 }\r
104                         }\r
105                         self.is_building = 0;\r
106 //                      self.current_weapon = self.weapon;              // add function to make weapon disappear?\r
107                         W_SetCurrentAmmo ();\r
108                 }\r
109         }\r
110 };\r
111 \r
112 float(entity obj, entity builder) CheckArea = \r
113 {\r
114         local vector src;\r
115         local vector end;\r
116         local float pos;\r
117         pos = pointcontents(obj.origin);\r
118         if (pos == -2 || pos == -6)\r
119         {\r
120                 return 0;\r
121         }\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
127         {\r
128                 return 0;\r
129         }\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
135         {\r
136                 return 0;\r
137         }\r
138         pos = pointcontents(end);\r
139         if (pos == -2 || pos == -6)\r
140         {\r
141                 return 0;\r
142         }\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
148         {\r
149                 return 0;\r
150         }\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
156         {\r
157                 return 0;\r
158         }\r
159         pos = pointcontents(end);\r
160         if (pos == -2 || pos == -6)\r
161         {\r
162                 return 0;\r
163         }\r
164         traceline(builder.origin, obj.origin, 1, builder);\r
165         if (trace_fraction != 1)\r
166         {\r
167                 return 0;\r
168         }\r
169         return 1;\r
170 };\r
171 \r
172 void(float objtobuild) TeamFortress_Build = \r
173 {\r
174         if (self.is_building == 1) {    // double-checks incase someone uses code with TeamFortress_EngineerBuild(number)\r
175                 TeamFortress_EngineerBuild();\r
176                 return;\r
177         }\r
178         if ((self.reload_time + .25) > time) { \r
179                 sprint(self, "You cant build while reloading.\n");\r
180                 return; \r
181         }\r
182 \r
183         local float btime;\r
184         local vector tmp1;\r
185         local vector tmp2;\r
186         newmis = spawn();\r
187         makevectors(self.v_angle);\r
188         v_forward_z = 0;\r
189         v_forward = normalize(v_forward) * 64;\r
190         newmis.origin = self.origin + v_forward;\r
191         if (objtobuild == 1)\r
192         {\r
193                 if (self.has_dispenser)\r
194                 {\r
195                         sprint(self, "You can only have one dispenser.\nTry dismantling your old one.\n");\r
196                         return;\r
197                 }\r
198                 tmp1 = '-16 -16 0';\r
199                 tmp2 = '16 16 24';\r
200                 newmis.mdl = "progs/dispencr.mdl";\r
201                 newmis.netname = "dispenser";\r
202                 btime = time + 2;\r
203         }\r
204         else\r
205         {\r
206                 if (objtobuild == 2)\r
207                 {\r
208                         if (self.has_sentry)\r
209                         {\r
210                                 sprint(self, "You can only have one sentry gun.\nTry dismantling your old one.\n");\r
211                                 return;\r
212                         }\r
213                         tmp1 = '-16 -16 0';\r
214                         tmp2 = '16 16 48';\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
220                         btime = .1;\r
221                 }\r
222                 if ((objtobuild == 3))\r
223                 {\r
224                         if (self.has_tesla)\r
225                         {\r
226                                 sprint (self, "You can only have one tesla gun\n");\r
227                                 return;\r
228                         }\r
229                         tmp1 = '-16 -16 0';\r
230                         tmp2 = '16 16 48';\r
231                         newmis.mdl = "models/engineer/tesla/tesla.md3";\r
232                         newmis.scale = .70;                     //temp -- morphed's models too freaking huge :x\r
233 \r
234                         newmis.netname = "tesla";\r
235                         btime = (time + 6);\r
236                 }\r
237 // Begin telepad 1\r
238                 if (objtobuild == 5)\r
239                 {\r
240                         if (self.has_teleporter >= 2)\r
241                         {\r
242                                 sprint(self, "You can only have 2 teleporters.\nTry dismantling an old one.\n");\r
243                  dremove(newmis);\r
244                                 return;\r
245                         }\r
246                         tmp1 = '-16 -16 0';\r
247                         tmp2 = '16 16 4';\r
248                         newmis.mdl = "progs/telepad.mdl";\r
249                         newmis.netname = "teleporter";\r
250         \r
251                         btime = time + 3;\r
252                 }\r
253                 if (objtobuild == 6)\r
254                 {\r
255                         if (self.has_extractor >= 3)\r
256                         {\r
257                                 sprint(self, "You can only have 3 metal extractors.\nTry dismantling an old one.\n");\r
258                  dremove(newmis);\r
259                                 return;\r
260                         }\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
265                         {\r
266                         if (isnearextractor.classname == "building_extractor" && isnearextractor.team_no == self.team_no)\r
267                                 {\r
268                                         sprint (self, "You cannot build so close to another extractor.\n");\r
269                                         dremove(newmis);\r
270                                         return;\r
271                                 }\r
272                                 isnearextractor = isnearextractor.chain;\r
273                         }\r
274 \r
275                         tmp1 = '-16 -16 0';\r
276                         tmp2 = '16 16 48';\r
277                         newmis.mdl = "models/engineer/metal_extractor/power.md3";\r
278                         //newmis.mdl = "progs/extractor.md3";\r
279                         newmis.netname = "extractor";\r
280         \r
281                         btime = time + 5;\r
282                 }\r
283 // End telepad 1\r
284         }\r
285         if (CheckArea(newmis, self) == 0)\r
286         {\r
287                 sprint(self, "Not enough room to build here\n");\r
288                 dremove(newmis);\r
289                 return;\r
290         }\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
310         newmis.solid = 2;\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
317 \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
321 };\r
322 \r
323 void(entity bld) CheckBelowBuilding = \r
324 {\r
325         local vector below;\r
326         below = bld.origin;\r
327         if (bld.classname == "detpack")\r
328         {\r
329                 below_z = below_z - 8;\r
330         }\r
331         else\r
332         {\r
333                 below_z = below_z - 24;\r
334         }\r
335         traceline(bld.origin, below, 1, bld);\r
336         if (trace_fraction == 1)\r
337         {\r
338                 bld.movetype = 6;\r
339                 bld.flags = bld.flags - (bld.flags & 512);\r
340         }\r
341 };\r
342 \r
343 void () Tesla_Animate;\r
344 void() TeamFortress_FinishedBuilding = \r
345 {\r
346         local entity oldself;\r
347 \r
348         if (self.owner.is_building != 1)\r
349         {\r
350                 return;\r
351         }\r
352         oldself = self;\r
353         self = self.owner;\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
363         {\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
397                 oldself.solid = 2;\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
401         }\r
402         else\r
403         {*/\r
404                 if (oldself.weapon == 2)\r
405                 {\r
406                         local entity barrel;\r
407                         barrel = spawn();\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
412 \r
413 //                      barrel.angles_x = barrel.angles_x - 70;\r
414 \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
427                         \r
428 \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
439                         newmis = spawn();\r
440                         newmis.classname = "building_sentrygun";\r
441                         newmis.health = 150;\r
442                         newmis.max_health = newmis.health;\r
443                         newmis.weapon = 1;\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
450                         newmis.solid = 2;\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
468                         newmis.heat = 0;\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
476                         {\r
477                                 newmis.waitmin = newmis.waitmax;\r
478                                 newmis.waitmax = anglemod(newmis.angles_y - 50);\r
479                         }\r
480                         newmis.ammo_shells = 25;\r
481                         newmis.maxammo_shells = 100;\r
482                         newmis.maxammo_rockets = 20;\r
483 \r
484                         newmis.barrel_ent = barrel;\r
485 \r
486 //                      setattachment(newmis, oldself, "tag_base_body");\r
487                         setattachment(barrel, newmis, "tag_body_barrel");\r
488 \r
489 \r
490                 }\r
491                 else\r
492                 {\r
493 //tesla\r
494                         if ((oldself.weapon == 3))\r
495                         {\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
505                                 oldself.solid = 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
527                                 {\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
534                                 }*/\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
539 \r
540                                 // The tesla animator -- till I learn to be a better coder ;)\r
541                                 local entity tesanim;\r
542                                 tesanim = spawn();\r
543                                 tesanim.owner = oldself;\r
544                                 tesanim.think = Tesla_Animate;\r
545                                 tesanim.nextthink = time;\r
546                         }\r
547 // TELEPAD 2 BEGIN*/ \r
548         /*if (oldself.weapon == 5)\r
549         {\r
550                 self.has_teleporter = (self.has_teleporter + 1);\r
551                 sprint (self, "You finish building the Teleporter Pad.\n");\r
552 \r
553 //        teamprefixsprint(self.team_no,self); //- OfN\r
554 \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
558 \r
559                 self.ammo_cells = self.ammo_cells - 90;\r
560 \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
573 \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
581 \r
582                 oldself.solid = 2;\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
586 \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
591 \r
592                 oldself.is_malfunctioning = 0;\r
593                 oldself.all_active=0; // OfN - reset HACKER improvements\r
594                 }\r
595 // TELEPAD 2 END\r
596                 }*/\r
597                 if (oldself.weapon == 6)                        // metal extractor\r
598                 {\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
608                         oldself.solid = 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
626 \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
631 \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
638                 }\r
639         }\r
640         W_SetCurrentAmmo();\r
641 };\r
642 \r
643 \r
644 \r
645 \r
646 \r
647 void () Drop_Magnetic_Mine =\r
648 {\r
649         if (self.has_mine == 1)\r
650         {\r
651                 sprint (self, "Hey, one mine at a time!\n");\r
652                 return;\r
653         }\r
654 \r
655         local entity item;\r
656 \r
657         item = spawn ();\r
658         item.team_no = self.team_no;\r
659         item.owner = self;\r
660         item.classname = "drop1";\r
661         item.origin = (self.origin - '0 0 -10');\r
662 \r
663 //      item.angles_x = 360;\r
664 \r
665         item.angles_y = 45;\r
666         item.flags = 256;\r
667 //      item.solid = 2;\r
668         item.solid = SOLID_TRIGGER;\r
669         item.movetype = 6;\r
670 \r
671         item.velocity = '0 0 1';\r
672         setsize (item, '-1 -1 0', '1 1 6');\r
673 \r
674         item.nextthink = (time + 180);\r
675 \r
676         item.touch = MagnetMineTouch;\r
677         setmodel (item, "models/magmine/magnetmine.md3");\r
678         item.scale = .35;\r
679 \r
680         item.think = RemoveMagnetMine;\r
681 \r
682         item.pausetime = time + 2;\r
683         self.has_mine = 1;\r
684         sprint(self, "You set a Mag Mine!\n");\r
685 }\r
686 \r
687 void EngineerGrenade(float req)\r
688 {\r
689         if(req == WR_GRENADE1)\r
690         {\r
691                 if(W_ThrowGrenade(W_ArmorGrenade))\r
692                         self.grenade_time = time + cvar("g_balance_grenade_armor_refire");\r
693         }\r
694         else if(req == WR_GRENADE2)\r
695         {\r
696                 Drop_Magnetic_Mine();\r
697                 self.grenade_time = time + 2;\r
698         }\r
699 }\r
700 \r
701 void EngineerPreThink()\r
702 {\r
703 }\r
704 \r
705 void EngineerPostThink()\r
706 {\r
707 }\r
708 \r
709 void BecomeEngineer(float portion)\r
710 {\r
711         self.max_health = cvar("g_balance_class_engineer_health") * portion;\r
712 \r
713         self.max_armor = cvar("g_balance_class_engineer_armor") * portion;\r
714 \r
715         self.mass = cvar("g_balance_class_engineer_mass");\r
716 \r
717         SetPlayerSpeed(self);\r
718 \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
727 }\r
728 \r
729 // Magnetic Mine\r
730 void () RemoveMagnetMine =\r
731 {\r
732         sprint (self.owner, "Your Mag Mine is gone...\n");\r
733         self.owner.has_mine = 0;\r
734         dremove (self);\r
735         return;\r
736 };\r
737 \r
738 void () MagTimer =\r
739 {\r
740         local entity theowner;\r
741         local string st;\r
742 \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
750         {\r
751                 theowner.option5 = 0;\r
752                 sprint (theowner.enemy, "Your Mag Mine died...\n");\r
753                 theowner.enemy.has_mine = 0;\r
754                 remove (self);\r
755                 return;\r
756         }\r
757         self.nextthink = (time + .5);\r
758 };\r
759 \r
760 void () MagMineActivate =\r
761 {\r
762         if ((other.option == 0))\r
763         {\r
764                 self.owner.has_mine = 1;\r
765                 newmis = spawn ();\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
774         }\r
775         other.option5 = (floor ((other.armorvalue * .25)) + 3);\r
776         if ((other.option5 > 15))\r
777         {\r
778                 other.option5 = 15;\r
779         }\r
780 };\r
781 \r
782 void () RemoveDudMine =\r
783 {\r
784         dremove(self);\r
785 }\r
786 \r
787 void () MagnetMineTouch =\r
788 {\r
789         local float isgood;\r
790         local entity isnearplayer;\r
791         \r
792         isnearplayer = findradius (self.origin, 10);\r
793         while (isnearplayer)\r
794         {\r
795                 if ((isnearplayer.classname == "player"))\r
796                 {\r
797                         isgood = 1;\r
798 //                      bprint (isnearplayer.classname);\r
799 //                      bprint ("\n");\r
800 //                      return;\r
801                 }\r
802                 isnearplayer = isnearplayer.chain;\r
803         }\r
804         if (isgood != 1)\r
805                 return;\r
806 \r
807         if ((self.pausetime > time))\r
808         {\r
809                 return;\r
810         }\r
811         if ((other.classname != "player"))\r
812         {\r
813                 return;\r
814         }\r
815         if ((other.health <= 0))\r
816         {\r
817                 return;\r
818         }\r
819 //      if ((other.is_undercover == 1))         //temp  - add function!!\r
820 //      {\r
821 //              return;\r
822 //      }\r
823         if ((other.team_no == self.owner.team_no))\r
824         {\r
825                 return;\r
826         }\r
827         if ((other.classname == "player"))\r
828         {\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
833         }\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
838 //      dremove (self);\r
839 };\r
840 \r
841 // Checks the distance between the player and the object\r
842 void () CheckDistance =\r
843 {\r
844         local vector dist;\r
845 \r
846         if (!(self.owner.building.classname == "building_tesla" && self.enemy.classname == "building_dispenser")) {\r
847         if (self.owner.building != self.enemy)\r
848         {\r
849                 dremove (self);\r
850                 return;\r
851         } }\r
852         dist = self.enemy.origin - self.owner.origin;\r
853 //      if (vlen (dist) > 64)\r
854         if (vlen (dist) > 84)\r
855         {\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
860                 dremove (self);\r
861                 return;\r
862         }\r
863         self.nextthink = (time + 0.3);\r
864 };\r
865 \r
866 \r
867 void (entity gun) Engineer_UseTesla =\r
868 {\r
869         local entity dist_checker;\r
870         local string st;\r
871 \r
872                 if ((gun.ammo_rockets == TF_FLARE_LIT))\r
873                 {\r
874                         gun.maxammo_cells = 120;\r
875                 }\r
876                 else\r
877                 {\r
878                         if ((gun.ammo_rockets == TF_FLARE_OFF))\r
879                         {\r
880                                 gun.maxammo_cells = 120;\r
881                         }\r
882                         else\r
883                         {\r
884                                 if ((gun.ammo_rockets == 2))\r
885                                 {\r
886                                         gun.maxammo_cells = 200;\r
887                                 }\r
888                                 else\r
889                                 {\r
890                                         if ((gun.ammo_rockets == 3))\r
891                                         {\r
892                                                 gun.maxammo_cells = 300;\r
893                                         }\r
894                                 }\r
895                         }\r
896                 }\r
897 \r
898         sprint(self, "Èåáìôè:");\r
899         st = ftos(gun.health);\r
900         sprint(self, st);\r
901         sprint(self, "¯");\r
902         st = ftos(gun.max_health);\r
903         sprint(self, st);\r
904         sprint(self, " Ãåììó:");\r
905         st = ftos(gun.ammo_cells);\r
906         sprint(self, st);\r
907         sprint(self, "¯");\r
908         st = ftos(gun.maxammo_cells);\r
909         sprint(self, st);\r
910         st = ftos ((6 - gun.currentammo));\r
911         sprint(self, " Õðçòáäåó Ìåæô:");\r
912         sprint (self, st);\r
913         st = ftos ((6 - gun.currentammo));\r
914         sprint (self, "\n");\r
915         sprint(self, "Öïìôáçå:");\r
916         st = ftos(gun.ammo_shells);\r
917         sprint(self, st);\r
918         sprint(self, " Áíðåòáçå:");\r
919         st = ftos(gun.ammo_nails);\r
920         sprint(self, st);\r
921         sprint(self, " Ðï÷åò Óõððìù:");\r
922         st = ftos(gun.ammo_rockets);\r
923         sprint(self, st);\r
924         sprint(self, "\n");\r
925         if (gun.tf_items)\r
926         {\r
927                 if ((gun.tf_items & 2))\r
928                 {\r
929                         sprint (self, "TeslaTurret(tm) ");\r
930                 }\r
931                 if ((gun.tf_items & TF_FLARE_OFF))\r
932                 {\r
933                         sprint (self, "Improved Targeter ");\r
934                 }\r
935                 if ((gun.tf_items & 1024))\r
936                 {\r
937                         sprint (self, "Spy Detector");\r
938                 }\r
939                 sprint (self, "\n");\r
940         }\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
950 };\r
951 \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
956 {\r
957         if (self.impulse_wait > time)   // So when the player holds down the use button it doesnt spam sprints\r
958                 return;\r
959         self.impulse_wait = time + .5;  // shared with gui menu .impulse_wait\r
960 \r
961         local vector source;\r
962         local vector org;\r
963         local entity te;\r
964 \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
969         {\r
970                 return;\r
971         }\r
972         org = (trace_endpos - (v_forward * 4));\r
973         if ((trace_ent.goal_activation & 8))\r
974         {\r
975                 if (Activated (trace_ent, self))\r
976                 {\r
977                         DoResults (trace_ent, self, 1);\r
978                         if ((trace_ent.classname == "func_button"))\r
979                         {\r
980                                 trace_ent.enemy = self;\r
981                                 other = self;\r
982                                 self = trace_ent;\r
983                                 self.dont_do_triggerwork = 1;\r
984                                 button_fire ();\r
985                                 self = other;\r
986                         }\r
987                 }\r
988                 else\r
989                 {\r
990                         if ((trace_ent.else_goal != 0))\r
991                         {\r
992                                 te = Findgoal (trace_ent.else_goal);\r
993                                 if (te)\r
994                                 {\r
995                                         DoResults (te, self, (trace_ent.goal_result & 2));\r
996                                 }\r
997                         }\r
998                         else\r
999                         {\r
1000                                 sound (self, 1, "player/axhit2.wav", 1, 1);\r
1001                                 WriteByte (4, 23);\r
1002                                 WriteByte (4, 2);\r
1003                                 WriteByte (4, 3);\r
1004                                 WriteCoord (4, org_x);\r
1005                                 WriteCoord (4, org_y);\r
1006                                 WriteCoord (4, org_z);\r
1007                         }\r
1008                 }\r
1009                 return;\r
1010         }\r
1011 //      if (trace_ent.takedamage)\r
1012         if (trace_ent.th_use)\r
1013         {\r
1014                 trace_ent.th_use(trace_ent);\r
1015                 return;\r
1016         }\r
1017 \r
1018         if (trace_ent.classname != "player")\r
1019         {\r
1020                 if ((trace_ent.classname == "building_dispenser"))\r
1021                 {\r
1022                         //Engineer_UseDispenser (trace_ent);\r
1023                         return;\r
1024                 }\r
1025                 else\r
1026                 {\r
1027                         if ((trace_ent.classname == "building_sentrygun"))\r
1028                         {\r
1029                                 //Engineer_UseSentryGun (trace_ent);\r
1030                                 return;\r
1031                         }\r
1032                         else\r
1033                         {\r
1034                                 if ((trace_ent.classname == "building_sentrygun_base"))\r
1035                                 {\r
1036                                         if (trace_ent.oldenemy)\r
1037                                         {\r
1038                                                 //Engineer_UseSentryGun (trace_ent.oldenemy);\r
1039                                         }\r
1040                                         return;\r
1041                                 }\r
1042                                 else\r
1043                                 {\r
1044                                         if ((trace_ent.classname == "building_tesla"))\r
1045                                         {\r
1046                                                 Engineer_UseTesla (trace_ent);\r
1047                                                 return;\r
1048                                         }\r
1049                                 }\r
1050                         }\r
1051                 }\r
1052         }\r
1053 };